From c9ccac8a88e3a91ac14e2a9b2c99a0a2c1a8a02e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20L=C3=A9one?= Date: Thu, 12 Jun 2014 20:31:50 +0200 Subject: [PATCH 01/80] Adding a .travis.yml file to use the travis-ci.org MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From wikipedia: Travis CI is a hosted, distributed continuous integration service used to build and test projects hosted at GitHub. Travis CI is configured by adding a file named .travis.yml, which is a YAML format text file, to the root directory of the GitHub repository. Travis CI automatically detects when a commit has been made and pushed to a GitHub repository that is using Travis CI, and each time this happens, it will try to build the project and run tests. This includes commits to all branches, not just to the master branch. When that process has completed, it will notify a developer in the way it has been configured to do so — for example, by sending an email containing the test results (showing success or failure), or by posting a message on an IRC channel. It can be configured to run the tests on a range of different machines, with different software installed (such as older versions of a programming language, to test for compatibility). --- .travis.yml | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000000..6fa600358f --- /dev/null +++ b/.travis.yml @@ -0,0 +1,28 @@ +language: c + +compiler: + - clang + - gcc + +notifications: + email: false + +before_script: + - sudo apt-get install nasm + - sudo apt-get install libmad0-dev + - sudo apt-get install libgtk2.0-dev + - sudo apt-get install binutils-dev + - sudo apt-get install libasound-dev + - sudo apt-get install libpulse-dev + - sudo apt-get install libjack-dev + - sudo apt-get install libc6-dev + - sudo apt-get install libogg-dev + - sudo apt-get install libvorbis-dev + - sudo apt-get install libbz2-dev + - sudo apt-get install zlib1g-dev + - sudo apt-get install libjpeg8-dev + - sudo apt-get install libpng12-dev + - sudo apt-get install libxtst-dev libxrandr-dev + - sudo apt-get install libglu1-mesa-dev + - sudo apt-get install mesa-common-dev + - ./autogen.sh From a7a98a690e25cd7c0e7914ebd52ffb1bc1a59107 Mon Sep 17 00:00:00 2001 From: Kyzentun Date: Sat, 5 Jul 2014 01:34:05 -0600 Subject: [PATCH 02/80] Replaced every use of lua_call with RunScriptOnStack. Modified RunScriptOnStack to report an error to log and system message using a passed in context string. Modified every use of RunScriptOnStack to avoid crashing so that the reported error can be seen. --- src/Actor.cpp | 5 +- src/ActorFrame.cpp | 13 ++- src/ActorUtil.cpp | 11 +-- src/DynamicActorScroller.cpp | 10 +- src/GameCommand.cpp | 10 +- src/LuaExpressionTransform.cpp | 3 +- src/LuaManager.cpp | 62 +++++++++--- src/LuaManager.h | 13 ++- src/MenuTimer.cpp | 6 +- src/NoteSkinManager.cpp | 5 +- src/OptionRowHandler.cpp | 15 ++- src/PercentageDisplay.cpp | 16 ++- src/Profile.cpp | 10 +- src/Screen.cpp | 7 +- src/ScreenTextEntry.cpp | 174 ++++++++++++++++----------------- src/ScreenWithMenuElements.cpp | 11 +-- src/ThemeMetric.h | 13 ++- src/UnlockManager.cpp | 3 +- 18 files changed, 219 insertions(+), 168 deletions(-) diff --git a/src/Actor.cpp b/src/Actor.cpp index 5ab0620f28..2883260c8d 100644 --- a/src/Actor.cpp +++ b/src/Actor.cpp @@ -1154,9 +1154,8 @@ void Actor::RunCommands( const LuaReference& cmds, const LuaReference *pParamTab pParamTable->PushSelf( L ); // call function with 2 arguments and 0 results - RString sError; - if( !LuaHelpers::RunScriptOnStack(L, sError, 2, 0) ) - LOG->Warn( "Error playing command: %s", sError.c_str() ); + RString Error= "Error playing command: "; + LuaHelpers::RunScriptOnStack(L, Error, 2, 0, true); LUA->Release(L); } diff --git a/src/ActorFrame.cpp b/src/ActorFrame.cpp index 3f17a94056..ac614d1fdd 100644 --- a/src/ActorFrame.cpp +++ b/src/ActorFrame.cpp @@ -242,9 +242,8 @@ void ActorFrame::DrawPrimitives() return; } this->PushSelf( L ); - RString sError; - if( !LuaHelpers::RunScriptOnStack(L, sError, 1, 0) ) // 1 arg, 0 results - LOG->Warn( "Error running DrawFunction: %s", sError.c_str() ); + RString Error= "Error running DrawFunction: "; + LuaHelpers::RunScriptOnStack(L, Error, 1, 0, true); // 1 arg, 0 results LUA->Release(L); return; } @@ -302,6 +301,8 @@ static int IdenticalChildrenSingleApplier(lua_State* L) lua_pushvalue(L, lua_upvalueindex(1)); // stack: table, obj, args, func lua_insert(L, 2); // stack: table, func, obj, args int args_count= lua_gettop(L) - 2; + // Not using RunScriptOnStack because we're inside a lua call already and + // we want an error to propagate up. lua_call(L, args_count, LUA_MULTRET); // stack: table, return_values return lua_gettop(L) - 1; } @@ -482,10 +483,8 @@ void ActorFrame::UpdateInternal( float fDeltaTime ) } this->PushSelf( L ); lua_pushnumber( L, fDeltaTime ); - RString sError; - - if( !LuaHelpers::RunScriptOnStack(L, sError, 2, 0) ) // 1 args, 0 results - LOG->Warn( "Error running m_UpdateFunction: %s", sError.c_str() ); + RString Error= "Error running UpdateFunction: "; + LuaHelpers::RunScriptOnStack(L, Error, 2, 0, true); // 1 args, 0 results LUA->Release(L); } } diff --git a/src/ActorUtil.cpp b/src/ActorUtil.cpp index 29046e9f19..fd98f53002 100644 --- a/src/ActorUtil.cpp +++ b/src/ActorUtil.cpp @@ -268,12 +268,11 @@ bool ActorUtil::LoadTableFromStackShowErrors( Lua *L ) lua_pushvalue( L, -1 ); func.SetFromStack( L ); - RString sError; - if( !LuaHelpers::RunScriptOnStack(L, sError, 0, 1) ) + RString Error= "Lua runtime error: "; + if( !LuaHelpers::RunScriptOnStack(L, Error, 0, 1, true) ) { lua_pop( L, 1 ); - sError = ssprintf( "Lua runtime error: %s", sError.c_str() ); - Dialog::OK( sError, "LUA_ERROR" ); + Dialog::OK( Error, "LUA_ERROR" ); return false; } @@ -285,9 +284,9 @@ bool ActorUtil::LoadTableFromStackShowErrors( Lua *L ) lua_Debug debug; lua_getinfo( L, ">nS", &debug ); - sError = ssprintf( "%s: must return a table", debug.short_src ); + Error = ssprintf( "%s: must return a table", debug.short_src ); - Dialog::OK( sError, "LUA_ERROR" ); + Dialog::OK( Error, "LUA_ERROR" ); return false; } return true; diff --git a/src/DynamicActorScroller.cpp b/src/DynamicActorScroller.cpp index ba877146de..2cf6ead5af 100644 --- a/src/DynamicActorScroller.cpp +++ b/src/DynamicActorScroller.cpp @@ -44,9 +44,8 @@ void DynamicActorScroller::LoadFromNode( const XNode *pNode ) lua_pushnil( L ); lua_pushnil( L ); - RString sError; - if( !LuaHelpers::RunScriptOnStack(L, sError, 2, 1) ) // 2 args, 1 result - LOG->Warn( "Error running LoadFunction: %s", sError.c_str() ); + RString Error= "Error running LoadFunction: "; + LuaHelpers::RunScriptOnStack(L, Error, 2, 1, true); // 2 args, 1 result m_iNumItems = (int) luaL_checknumber( L, -1 ); lua_pop( L, 1 ); @@ -119,9 +118,8 @@ void DynamicActorScroller::ConfigureActor( Actor *pActor, int iItem ) pActor->PushSelf( L ); LuaHelpers::Push( L, iItem ); - RString sError; - if( !LuaHelpers::RunScriptOnStack(L, sError, 2, 0) ) // 2 args, 0 results - LOG->Warn( "Error running LoadFunction: %s", sError.c_str() ); + RString Error= "Error running LoadFunction: "; + LuaHelpers::RunScriptOnStack(L, Error, 2, 0, true); // 2 args, 0 results LUA->Release(L); } diff --git a/src/GameCommand.cpp b/src/GameCommand.cpp index cf399ad2ef..43dde86c2d 100644 --- a/src/GameCommand.cpp +++ b/src/GameCommand.cpp @@ -235,7 +235,10 @@ void GameCommand::LoadOne( const Command& cmd ) else if( sName == "lua" ) { m_LuaFunction.SetFromExpression( sValue ); - ASSERT_M( !m_LuaFunction.IsNil(), ssprintf("\"%s\" evaluated to nil", sValue.c_str()) ); + if(m_LuaFunction.IsNil()) + { + LuaHelpers::ReportScriptError("Lua error in game command: \"" + sValue + "\" evaluated to nil"); + } } else if( sName == "screen" ) @@ -693,7 +696,7 @@ void GameCommand::ApplySelf( const vector &vpns ) const if( m_sStageModifiers != "" ) FOREACH_CONST( PlayerNumber, vpns, pn ) GAMESTATE->ApplyStageModifiers( *pn, m_sStageModifiers ); - if( m_LuaFunction.IsSet() ) + if( m_LuaFunction.IsSet() && !m_LuaFunction.IsNil() ) { Lua *L = LUA->Get(); FOREACH_CONST( PlayerNumber, vpns, pn ) @@ -702,7 +705,8 @@ void GameCommand::ApplySelf( const vector &vpns ) const ASSERT( !lua_isnil(L, -1) ); lua_pushnumber( L, *pn ); // 1st parameter - lua_call( L, 1, 0 ); // call function with 1 argument and 0 results + RString error= "Lua GameCommand error: "; + LuaHelpers::RunScriptOnStack(L, error, 1, 0, true); } LUA->Release(L); } diff --git a/src/LuaExpressionTransform.cpp b/src/LuaExpressionTransform.cpp index f8da8d936e..7ddeb91d56 100644 --- a/src/LuaExpressionTransform.cpp +++ b/src/LuaExpressionTransform.cpp @@ -26,7 +26,8 @@ void LuaExpressionTransform::TransformItemDirect( Actor &a, float fPositionOffse LuaHelpers::Push( L, fPositionOffsetFromCenter ); LuaHelpers::Push( L, iItemIndex ); LuaHelpers::Push( L, iNumItems ); - lua_call( L, 4, 0 ); // 4 args, 0 results + RString error= "Lua error in Transform function: "; + LuaHelpers::RunScriptOnStack(L, error, 4, 0, true); LUA->Release(L); } diff --git a/src/LuaManager.cpp b/src/LuaManager.cpp index 550109848f..ff8b9c0923 100644 --- a/src/LuaManager.cpp +++ b/src/LuaManager.cpp @@ -9,7 +9,9 @@ #include "arch/Dialog/Dialog.h" #include "XmlFile.h" #include "Command.h" +#include "RageLog.h" #include "RageTypes.h" +#include "ScreenManager.h" #include // conversion for lua functions. #include @@ -787,43 +789,75 @@ bool LuaHelpers::LoadScript( Lua *L, const RString &sScript, const RString &sNam return true; } -bool LuaHelpers::RunScriptOnStack( Lua *L, RString &sError, int iArgs, int iReturnValues ) +void LuaHelpers::ReportScriptError(RString const& Error) +{ + size_t line_break_pos= Error.find('\n'); + RString short_error; + if(line_break_pos == RString::npos) + { + short_error= Error; + } + else + { + short_error= Error.substr(0, line_break_pos); + } + SCREENMAN->SystemMessage(short_error); + LOG->Warn(Error.c_str()); +} + +bool LuaHelpers::RunScriptOnStack( Lua *L, RString &Error, int Args, int ReturnValues, bool ReportError ) { lua_pushcfunction( L, GetLuaStack ); // move the error function above the function and params - int iErrFunc = lua_gettop(L) - iArgs - 1; - lua_insert( L, iErrFunc ); + int ErrFunc = lua_gettop(L) - Args - 1; + lua_insert( L, ErrFunc ); // evaluate - int ret = lua_pcall( L, iArgs, iReturnValues, iErrFunc ); + int ret = lua_pcall( L, Args, ReturnValues, ErrFunc ); if( ret ) { - LuaHelpers::Pop( L, sError ); - lua_remove( L, iErrFunc ); - for( int i = 0; i < iReturnValues; ++i ) + if(ReportError) + { + RString lerror; + LuaHelpers::Pop( L, lerror ); + Error+= lerror; + ReportScriptError(Error); + } + else + { + LuaHelpers::Pop( L, Error ); + } + lua_remove( L, ErrFunc ); + for( int i = 0; i < ReturnValues; ++i ) lua_pushnil( L ); return false; } - lua_remove( L, iErrFunc ); + lua_remove( L, ErrFunc ); return true; } -bool LuaHelpers::RunScript( Lua *L, const RString &sScript, const RString &sName, RString &sError, int iArgs, int iReturnValues ) +bool LuaHelpers::RunScript( Lua *L, const RString &Script, const RString &Name, RString &Error, int Args, int ReturnValues, bool ReportError ) { - if( !LoadScript(L, sScript, sName, sError) ) + RString lerror; + if( !LoadScript(L, Script, Name, lerror) ) { - lua_pop( L, iArgs ); - for( int i = 0; i < iReturnValues; ++i ) + Error+= lerror; + if(ReportError) + { + ReportScriptError(Error); + } + lua_pop( L, Args ); + for( int i = 0; i < ReturnValues; ++i ) lua_pushnil( L ); return false; } // move the function above the params - lua_insert( L, lua_gettop(L) - iArgs ); + lua_insert( L, lua_gettop(L) - Args ); - return LuaHelpers::RunScriptOnStack( L, sError, iArgs, iReturnValues ); + return LuaHelpers::RunScriptOnStack( L, Error, Args, ReturnValues, ReportError ); } bool LuaHelpers::RunExpression( Lua *L, const RString &sExpression, const RString &sName ) diff --git a/src/LuaManager.h b/src/LuaManager.h index 1dce0a906b..19ce04a377 100644 --- a/src/LuaManager.h +++ b/src/LuaManager.h @@ -58,15 +58,22 @@ namespace LuaHelpers * and the stack is unchanged. */ bool LoadScript( Lua *L, const RString &sScript, const RString &sName, RString &sError ); + /* Report the error through the log and on the screen. */ + void ReportScriptError(RString const& Error); + /* Run the function with arguments at the top of the stack, with the given * number of arguments. The specified number of return values are left on * the Lua stack. On error, nils are left on the stack, sError is set and - * false is returned. */ - bool RunScriptOnStack( Lua *L, RString &sError, int iArgs = 0, int iReturnValues = 0 ); + * false is returned. + * If ReportError is true, Error should contain the string to prepend + * when reporting. The error is reported through LOG->Warn and + * SCREENMAN->SystemMessage. + */ + bool RunScriptOnStack( Lua *L, RString &Error, int Args = 0, int ReturnValues = 0, bool ReportError = false ); /* LoadScript the given script, and RunScriptOnStack it. * iArgs arguments are at the top of the stack. */ - bool RunScript( Lua *L, const RString &sScript, const RString &sName, RString &sError, int iArgs = 0, int iReturnValues = 0 ); + bool RunScript( Lua *L, const RString &Script, const RString &Name, RString &Error, int Args = 0, int ReturnValues = 0, bool ReportError = false ); /* Run the given expression, returning a single value, and leave the return * value on the stack. On error, push nil. */ diff --git a/src/MenuTimer.cpp b/src/MenuTimer.cpp index 066b593e29..5115544399 100644 --- a/src/MenuTimer.cpp +++ b/src/MenuTimer.cpp @@ -183,9 +183,9 @@ void MenuTimer::SetText( float fSeconds ) LuaHelpers::Push( L, fSeconds ); // call function with 1 argument and 1 result - RString sError; - if( !LuaHelpers::RunScriptOnStack(L, sError, 1, 1) ) - LOG->Warn( "Error running Text%iFormatFunction: %s", i+1, sError.c_str() ); + RString Error= "Error running Text" + (i+1); + Error+= "FormatFunction: "; + LuaHelpers::RunScriptOnStack(L, Error, 1, 1, true); RString sText; LuaHelpers::Pop( L, sText ); diff --git a/src/NoteSkinManager.cpp b/src/NoteSkinManager.cpp index a810dc6708..9194574f50 100644 --- a/src/NoteSkinManager.cpp +++ b/src/NoteSkinManager.cpp @@ -169,11 +169,10 @@ void NoteSkinManager::LoadNoteSkinDataRecursive( const RString &sNoteSkinName_, LOG->Trace( "Load script \"%s\"", sFile.c_str() ); Lua *L = LUA->Get(); - RString sError; + RString Error= "Error running " + sFile + ": "; refScript.PushSelf( L ); - if( !LuaHelpers::RunScript(L, sScript, "@" + sFile, sError, 1, 1) ) + if( !LuaHelpers::RunScript(L, sScript, "@" + sFile, Error, 1, 1, true) ) { - LOG->Trace( "Error running %s: %s", sFile.c_str(), sError.c_str() ); lua_pop( L, 1 ); } else diff --git a/src/OptionRowHandler.cpp b/src/OptionRowHandler.cpp index dcab098562..e24665cddc 100644 --- a/src/OptionRowHandler.cpp +++ b/src/OptionRowHandler.cpp @@ -877,7 +877,8 @@ public: return false; } m_pLuaTable->PushSelf( L ); - lua_call( L, 1, 1 ); // call function with 1 argument and 1 result + RString error= RowName + " \"EnabledForPlayers\": "; + LuaHelpers::RunScriptOnStack(L, error, 1, 1, true); if(!lua_istable(L, -1)) { LOG->Warn("LUA_ERROR: \"%s\" \"EnabledForPlayers\" did not return a table.", RowName.c_str()); @@ -960,7 +961,8 @@ public: // Argument 1 (self): m_pLuaTable->PushSelf( L ); - lua_call( L, 1, 1 ); // call function with 1 argument and 1 result + RString error= "EnabledForPlayers: "; + LuaHelpers::RunScriptOnStack( L, error, 1, 1, true ); m_Def.m_vEnabledForPlayers.clear(); // and fill in with supplied PlayerNumbers below lua_pushnil( L ); @@ -1135,7 +1137,8 @@ public: ASSERT( lua_gettop(L) == 6 ); // vbSelectedOut, m_iLuaTable, function, self, arg, arg - lua_call( L, 3, 0 ); // call function with 3 arguments and 0 results + RString error= "LoadSelections: "; + LuaHelpers::RunScriptOnStack( L, error, 3, 0, true ); ASSERT( lua_gettop(L) == 2 ); lua_pop( L, 1 ); // pop option table @@ -1190,7 +1193,8 @@ public: ASSERT( lua_gettop(L) == 6 ); // vbSelectedOut, m_iLuaTable, function, self, arg, arg - lua_call( L, 3, 0 ); // call function with 3 arguments and 0 results + RString error= "SaveSelections: "; + LuaHelpers::RunScriptOnStack( L, error, 3, 0, true ); ASSERT( lua_gettop(L) == 2 ); lua_pop( L, 1 ); // pop option table @@ -1221,7 +1225,8 @@ public: LuaHelpers::Push(L, pn); // Convert choice to a lua index so it matches up with the Choices table. lua_pushinteger(L, choice+1); - lua_call(L, 3, 1); + RString error= "NotifyOfSelection: "; + LuaHelpers::RunScriptOnStack(L, error, 3, 1, true); if(lua_toboolean(L, -1)) { lua_pop(L, 1); diff --git a/src/PercentageDisplay.cpp b/src/PercentageDisplay.cpp index e932844e3f..28eec2fa7e 100644 --- a/src/PercentageDisplay.cpp +++ b/src/PercentageDisplay.cpp @@ -42,8 +42,15 @@ void PercentageDisplay::LoadFromNode( const XNode* pNode ) const XNode *pChild = pNode->GetChild( "Percent" ); if( pChild == NULL ) - RageException::Throw( "%s: PercentageDisplay: missing the node \"Percent\"", ActorUtil::GetWhere(pNode).c_str() ); - m_textPercent.LoadFromNode( pChild ); + { + LuaHelpers::ReportScriptError(ActorUtil::GetWhere(pNode) + ": PercentageDisplay: missing the node \"Percent\""); + // Make a BitmapText just so we don't crash. + m_textPercent.LoadFromFont(THEME->GetPathF("", "Common Normal")); + } + else + { + m_textPercent.LoadFromNode( pChild ); + } this->AddChild( &m_textPercent ); pChild = pNode->GetChild( "PercentRemainder" ); @@ -154,9 +161,8 @@ void PercentageDisplay::Refresh() m_FormatPercentScore.PushSelf( L ); ASSERT( !lua_isnil(L, -1) ); LuaHelpers::Push( L, fPercentDancePoints ); - RString sError; - if( !LuaHelpers::RunScriptOnStack(L, sError, 1, 1) ) // 1 arg, 1 result - LOG->Warn( "Error running FormatPercentScore: %s", sError.c_str() ); + RString Error= "Error running FormatPercentScore: "; + LuaHelpers::RunScriptOnStack(L, Error, 1, 1, true); // 1 arg, 1 result LuaHelpers::Pop( L, sNumToDisplay ); LUA->Release(L); diff --git a/src/Profile.cpp b/src/Profile.cpp index c6f72606a2..c8b17cd1af 100644 --- a/src/Profile.cpp +++ b/src/Profile.cpp @@ -846,9 +846,8 @@ void Profile::LoadCustomFunction( RString sDir ) LuaHelpers::Push(L, sDir); // Run it - RString sError; - if (!LuaHelpers::RunScriptOnStack(L, sError, 2, 0)) - LOG->Warn("Error running CustomLoadFunction: %s", sError.c_str()); + RString Error= "Error running CustomLoadFunction: "; + LuaHelpers::RunScriptOnStack(L, Error, 2, 0, true); LUA->Release(L); } @@ -1029,9 +1028,8 @@ bool Profile::SaveAllToDir( RString sDir, bool bSignData ) const LuaHelpers::Push(L, sDir); // Run it - RString sError; - if (!LuaHelpers::RunScriptOnStack(L, sError, 2, 0)) - LOG->Warn("Error running CustomSaveFunction: %s", sError.c_str()); + RString Error= "Error running CustomSaveFunction: "; + LuaHelpers::RunScriptOnStack(L, Error, 2, 0, true); LUA->Release(L); diff --git a/src/Screen.cpp b/src/Screen.cpp index 758c163732..7e4c0b4f84 100644 --- a/src/Screen.cpp +++ b/src/Screen.cpp @@ -337,11 +337,8 @@ bool Screen::PassInputToLua(const InputEventPlus& input) { callback->second.PushSelf(L); lua_pushvalue(L, -2); - RString error; - if(!LuaHelpers::RunScriptOnStack(L, error, 1, 1)) - { - LOG->Warn("Error running input callback: %s", error.c_str()); - } + RString error= "Error running input callback: "; + LuaHelpers::RunScriptOnStack(L, error, 1, 1, true); handled= lua_toboolean(L, -1); lua_pop(L, 1); } diff --git a/src/ScreenTextEntry.cpp b/src/ScreenTextEntry.cpp index 9cfd7e5233..79c37c8b37 100644 --- a/src/ScreenTextEntry.cpp +++ b/src/ScreenTextEntry.cpp @@ -376,7 +376,10 @@ void ScreenTextEntry::TextEntrySettings::FromStack( lua_State *L ) lua_getfield( L, iTab, "Question" ); pStr = lua_tostring( L, -1 ); if( pStr == NULL ) - RageException::Throw( "\"Question\" entry is not a string." ); + { + LuaHelpers::ReportScriptError("ScreenTextEntry \"Question\" entry is not a string."); + pStr= ""; + } sQuestion = pStr; lua_settop( L, iTab ); @@ -398,53 +401,34 @@ void ScreenTextEntry::TextEntrySettings::FromStack( lua_State *L ) bPassword = !!lua_toboolean( L, -1 ); lua_settop( L, iTab ); - // and now the hard part, the functions. - // Validate - lua_getfield( L, iTab, "Validate" ); - if( !lua_isfunction( L, -1 ) && !lua_isnil( L, -1 ) ) - RageException::Throw( "\"Validate\" is not a function." ); - Validate.SetFromStack( L ); - lua_settop( L, iTab ); +#define SET_FUNCTION_MEMBER(memname) \ + lua_getfield(L, iTab, #memname); \ + if(lua_isfunction(L, -1)) \ + { \ + memname.SetFromStack(L); \ + } \ + else if(!lua_isnil(L, -1)) \ + { \ + LuaHelpers::ReportScriptError("ScreenTextEntry \"" #memname "\" is not a function."); \ + } \ + lua_settop(L, iTab); - // OnOK - lua_getfield( L, iTab, "OnOK" ); - if( !lua_isfunction( L, -1 ) && !lua_isnil( L, -1 ) ) - RageException::Throw( "\"OnOK\" is not a function." ); - OnOK.SetFromStack( L ); - lua_settop( L, iTab ); - - // OnCancel - lua_getfield( L, iTab, "OnCancel" ); - if( !lua_isfunction( L, -1 ) && !lua_isnil( L, -1 ) ) - RageException::Throw( "\"OnCancel\" is not a function." ); - OnCancel.SetFromStack( L ); - lua_settop( L, iTab ); - - // ValidateAppend - lua_getfield( L, iTab, "ValidateAppend" ); - if( !lua_isfunction( L, -1 ) && !lua_isnil( L, -1 ) ) - RageException::Throw( "\"ValidateAppend\" is not a function." ); - ValidateAppend.SetFromStack( L ); - lua_settop( L, iTab ); - - // FormatAnswerForDisplay - lua_getfield( L, iTab, "FormatAnswerForDisplay" ); - if( !lua_isfunction( L, -1 ) && !lua_isnil( L, -1 ) ) - RageException::Throw( "\"FormatAnswerForDisplay\" is not a function." ); - FormatAnswerForDisplay.SetFromStack( L ); - lua_settop( L, iTab ); + SET_FUNCTION_MEMBER(Validate); + SET_FUNCTION_MEMBER(OnOK); + SET_FUNCTION_MEMBER(OnCancel); + SET_FUNCTION_MEMBER(ValidateAppend); + SET_FUNCTION_MEMBER(FormatAnswerForDisplay); +#undef SET_FUNCTION_MEMBER } // Lua bridges static bool ValidateFromLua( const RString &sAnswer, RString &sErrorOut ) { - Lua *L = LUA->Get(); - - if( g_ValidateFunc.IsNil() ) + if(g_ValidateFunc.IsNil() || !g_ValidateFunc.IsSet()) { - LUA->Release(L); return true; } + Lua *L = LUA->Get(); g_ValidateFunc.PushSelf( L ); @@ -454,69 +438,70 @@ static bool ValidateFromLua( const RString &sAnswer, RString &sErrorOut ) // Argument 2 (error out): lua_pushstring( L, sErrorOut ); - lua_call( L, 2, 2 ); // call function with 2 arguments and 2 results - - if( !lua_isstring(L, -1) ) - RageException::Throw( "\"Validate\" did not return a string." ); - - if( !lua_isboolean(L, -2) ) - RageException::Throw( "\"Validate\" did not return a boolean." ); - - RString sErrorFromLua; - LuaHelpers::Pop( L, sErrorFromLua ); - if( !sErrorFromLua.empty() ) - sErrorOut = sErrorFromLua; - - bool bValidate; - LuaHelpers::Pop( L, bValidate ); + bool valid= false; + RString error= "Lua error in ScreenTextEntry Validate: "; + if(LuaHelpers::RunScriptOnStack(L, error, 2, 2, true)) + { + if(!lua_isstring(L, -1) || !lua_isboolean(L, -2)) + { + LuaHelpers::ReportScriptError("Lua error: ScreenTextEntry Validate did not return 'bool, string'."); + } + else + { + RString ErrorFromLua; + LuaHelpers::Pop( L, ErrorFromLua ); + if( !ErrorFromLua.empty() ) + { + sErrorOut = ErrorFromLua; + } + LuaHelpers::Pop( L, valid ); + } + } + lua_settop(L, 0); LUA->Release(L); - return bValidate; + return valid; } static void OnOKFromLua( const RString &sAnswer ) { - Lua *L = LUA->Get(); - - if( g_OnOKFunc.IsNil() ) + if(g_OnOKFunc.IsNil() || !g_OnOKFunc.IsSet()) { - LUA->Release(L); return; } + Lua *L = LUA->Get(); g_OnOKFunc.PushSelf( L ); // Argument 1 (answer): lua_pushstring( L, sAnswer ); - lua_call( L, 1, 0 ); // call function with 1 argument and 0 results + RString error= "Lua error in ScreenTextEntry OnOK: "; + LuaHelpers::RunScriptOnStack(L, error, 1, 0, true); LUA->Release(L); } static void OnCancelFromLua() { - Lua *L = LUA->Get(); - - if( g_OnCancelFunc.IsNil() ) + if(g_OnCancelFunc.IsNil() || !g_OnCancelFunc.IsSet()) { - LUA->Release(L); return; } + Lua *L = LUA->Get(); g_OnCancelFunc.PushSelf( L ); - lua_call( L, 0, 0 ); // call function with 0 arguments and 0 results + RString error= "Lua error in ScreenTextEntry OnCancel: "; + LuaHelpers::RunScriptOnStack(L, error, 0, 0, true); LUA->Release(L); } static bool ValidateAppendFromLua( const RString &sAnswerBeforeChar, RString &sAppend ) { - Lua *L = LUA->Get(); - - if( g_ValidateAppendFunc.IsNil() ) + if(g_ValidateAppendFunc.IsNil() || !g_ValidateAppendFunc.IsSet()) { - LUA->Release(L); return true; } + Lua *L = LUA->Get(); g_ValidateAppendFunc.PushSelf( L ); @@ -525,41 +510,54 @@ static bool ValidateAppendFromLua( const RString &sAnswerBeforeChar, RString &sA // Argument 2 (Append): lua_pushstring( L, sAppend ); - lua_call( L, 2, 1 ); // call function with 2 arguments and 1 result - if( !lua_isboolean(L, -1) ) - RageException::Throw( "\"ValidateAppend\" did not return a boolean." ); - - bool bAppend; - LuaHelpers::Pop( L, bAppend ); + bool append= false; + RString error= "Lua error in ScreenTextEntry ValidateAppend: "; + if(LuaHelpers::RunScriptOnStack(L, error, 2, 1, true)) + { + if( !lua_isboolean(L, -1) ) + { + LuaHelpers::ReportScriptError("\"ValidateAppend\" did not return a boolean."); + } + else + { + LuaHelpers::Pop( L, append ); + } + } + lua_settop(L, 0); LUA->Release(L); - return bAppend; + return append; } static RString FormatAnswerForDisplayFromLua( const RString &sAnswer ) { - Lua *L = LUA->Get(); - - if( g_FormatAnswerForDisplayFunc.IsNil() ) + if(g_FormatAnswerForDisplayFunc.IsNil() || !g_FormatAnswerForDisplayFunc.IsSet()) { - LUA->Release(L); return sAnswer; } + Lua *L = LUA->Get(); g_FormatAnswerForDisplayFunc.PushSelf( L ); // Argument 1 (Answer): lua_pushstring( L, sAnswer ); - lua_call( L, 1, 1 ); // call function with 1 argument and 1 result - - if( !lua_isstring(L, -1) ) - RageException::Throw( "\"FormatAnswerForDisplay\" did not return a string." ); - - RString sAnswerFromLua; - LuaHelpers::Pop( L, sAnswerFromLua ); + RString answer; + RString error= "Lua error in ScreenTextEntry FormatAnswerForDisplay: "; + if(LuaHelpers::RunScriptOnStack(L, error, 1, 1, true)) + { + if( !lua_isstring(L, -1) ) + { + LuaHelpers::ReportScriptError("\"FormatAnswerForDisplay\" did not return a string."); + } + else + { + LuaHelpers::Pop(L, answer); + } + } + lua_settop(L, 0); LUA->Release(L); - return sAnswerFromLua; + return answer; } void ScreenTextEntry::LoadFromTextEntrySettings( const TextEntrySettings &settings ) diff --git a/src/ScreenWithMenuElements.cpp b/src/ScreenWithMenuElements.cpp index 78f99d77c1..e9304ac070 100644 --- a/src/ScreenWithMenuElements.cpp +++ b/src/ScreenWithMenuElements.cpp @@ -194,17 +194,16 @@ void ScreenWithMenuElements::StartPlayingMusic() */ if( ft == FT_Lua ) { - RString sScript; - RString sError; - if( GetFileContents(m_sPathToMusic, sScript) ) + RString Script; + RString Error= "Lua runtime error: "; + if( GetFileContents(m_sPathToMusic, Script) ) { Lua *L = LUA->Get(); - if( !LuaHelpers::RunScript(L, sScript, "@"+m_sPathToMusic, sError, 0, 1) ) + if( !LuaHelpers::RunScript(L, Script, "@"+m_sPathToMusic, Error, 0, 1, true) ) { LUA->Release( L ); - sError = ssprintf( "Lua runtime error: %s", sError.c_str() ); - Dialog::OK( sError, "LUA_ERROR" ); + Dialog::OK( Error, "LUA_ERROR" ); return; } else diff --git a/src/ThemeMetric.h b/src/ThemeMetric.h index a4073ffa1a..41ac59667e 100644 --- a/src/ThemeMetric.h +++ b/src/ThemeMetric.h @@ -146,9 +146,16 @@ public: // call function with 0 arguments and 1 result m_Value.PushSelf( L ); - lua_call(L, 0, 1); - ASSERT( !lua_isnil(L, -1) ); - LuaHelpers::Pop( L, m_currentValue ); + RString error= m_sGroup + ": " + m_sName + ": "; + LuaHelpers::RunScriptOnStack(L, error, 0, 1, true); + if(!lua_isnil(L, -1)) + { + LuaHelpers::Pop( L, m_currentValue ); + } + else + { + lua_pop(L, 1); + } LUA->Release(L); } diff --git a/src/UnlockManager.cpp b/src/UnlockManager.cpp index cba162190d..ae77104499 100644 --- a/src/UnlockManager.cpp +++ b/src/UnlockManager.cpp @@ -502,7 +502,8 @@ void UnlockManager::Load() current.PushSelf( L ); // call function with 1 argument and 0 results - lua_call( L, 1, 0 ); + RString error= "Lua error in command: "; + LuaHelpers::RunScriptOnStack(L, error, 1, 0, true); if( current.m_bRoulette ) m_RouletteCodes.insert( current.m_sEntryID ); From ff1392cdba21737c1b01a4e86cc1cd72c3d7e2e1 Mon Sep 17 00:00:00 2001 From: Kyzentun Date: Sat, 5 Jul 2014 14:14:23 -0600 Subject: [PATCH 03/80] Made Screen not go to next screen if the screen name is empty. --- src/Screen.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/Screen.cpp b/src/Screen.cpp index 7e4c0b4f84..3568fa0f9d 100644 --- a/src/Screen.cpp +++ b/src/Screen.cpp @@ -234,7 +234,17 @@ void Screen::HandleScreenMessage( const ScreenMessage SM ) if( SCREENMAN->IsStackedScreen(this) ) SCREENMAN->PopTopScreen( m_smSendOnPop ); else - SCREENMAN->SetNewScreen( SM == SM_GoToNextScreen? GetNextScreenName():GetPrevScreen() ); + { + RString ToScreen= (SM == SM_GoToNextScreen? GetNextScreenName():GetPrevScreen()); + if(ToScreen == "") + { + LuaHelpers::ReportScriptError("Error: Tried to go to empty screen."); + } + else + { + SCREENMAN->SetNewScreen(ToScreen); + } + } } else if( SM == SM_GainFocus ) { From 026f968fa44d72fafc05212d622307a0ef6cd589 Mon Sep 17 00:00:00 2001 From: Kyzentun Date: Mon, 7 Jul 2014 00:39:27 -0600 Subject: [PATCH 04/80] Changed many uses of Dialog::OK and LOG->Warn to use ReportScriptError. --- src/Actor.cpp | 30 +++++++++++++----------------- src/ActorFrame.cpp | 6 +++--- src/ActorMultiVertex.cpp | 20 ++++++++++---------- src/ActorUtil.cpp | 5 ++--- src/Background.cpp | 8 ++++---- src/BitmapText.cpp | 2 +- src/ComboGraph.cpp | 2 +- src/CommonMetrics.cpp | 2 +- src/DifficultyIcon.cpp | 3 +-- src/EnumHelper.cpp | 2 +- src/GameCommand.cpp | 4 +--- src/GameState.cpp | 6 +++--- src/LuaManager.cpp | 19 ++++++++++++++----- src/LuaManager.h | 4 +++- src/LyricsLoader.cpp | 4 ++-- src/MusicWheel.cpp | 2 +- src/NoteSkinManager.cpp | 2 +- src/OptionRowHandler.cpp | 30 +++++++++++++++--------------- src/PrefsManager.cpp | 6 +++--- src/Profile.cpp | 10 +++++----- src/ScreenOptions.cpp | 2 +- src/ScreenOptionsMaster.cpp | 12 +++++++----- src/ScreenSMOnlineLogin.cpp | 2 +- src/ScreenSelectMaster.cpp | 2 +- src/ScreenWithMenuElements.cpp | 2 -- src/SongManager.cpp | 12 ++++++------ src/Sprite.cpp | 3 +-- src/Style.cpp | 4 ++-- src/TitleSubstitution.cpp | 3 ++- src/UnlockManager.cpp | 16 ++++++++-------- src/XmlFileUtil.cpp | 12 +++++------- 31 files changed, 119 insertions(+), 118 deletions(-) diff --git a/src/Actor.cpp b/src/Actor.cpp index 2883260c8d..f3e580dce1 100644 --- a/src/Actor.cpp +++ b/src/Actor.cpp @@ -4,7 +4,6 @@ #include "RageUtil.h" #include "RageMath.h" #include "RageLog.h" -#include "arch/Dialog/Dialog.h" #include "Foreach.h" #include "XmlFile.h" #include "LuaBinding.h" @@ -793,10 +792,7 @@ void Actor::BeginTweening( float time, ITween *pTween ) // recursing ActorCommand. if( m_Tweens.size() > 50 ) { - RString sError = ssprintf( "Tween overflow: \"%s\"; infinitely recursing ActorCommand?", GetLineage().c_str() ); - - LOG->Warn( "%s", sError.c_str() ); - Dialog::OK( sError ); + LuaHelpers::ReportScriptErrorFmt("Tween overflow: \"%s\"; infinitely recursing ActorCommand?", GetLineage().c_str()); this->FinishTweening(); } @@ -1129,7 +1125,7 @@ void Actor::RunCommands( const LuaReference& cmds, const LuaReference *pParamTab { if( !cmds.IsSet() || cmds.IsNil() ) { - LOG->Warn( "RunCommands: command is unset or nil" ); + LuaHelpers::ReportScriptError("RunCommands: command is unset or nil"); return; } @@ -1139,7 +1135,7 @@ void Actor::RunCommands( const LuaReference& cmds, const LuaReference *pParamTab cmds.PushSelf( L ); if( lua_isnil(L, -1) ) { - LOG->Warn("Error compiling commands"); + LuaHelpers::ReportScriptError("Error compiling commands"); LUA->Release(L); return; } @@ -1300,7 +1296,7 @@ void Actor::AddCommand( const RString &sCmdName, apActorCommands apac ) if( HasCommand(sCmdName) ) { RString sWarning = GetLineage()+"'s command '"+sCmdName+"' defined twice"; - Dialog::OK( sWarning, "COMMAND_DEFINED_TWICE" ); + LuaHelpers::ReportScriptError(sWarning, "COMMAND_DEFINED_TWICE"); } RString sMessage; @@ -1403,7 +1399,7 @@ public: float fTime = FArg(1); if (fTime < 0) { - LOG->Warn("Lua: sleep(%f): time must not be negative", fTime); + LuaHelpers::ReportScriptErrorFmt("Lua: sleep(%f): time must not be negative", fTime); return 0; } p->Sleep(fTime); @@ -1414,7 +1410,7 @@ public: float fTime = FArg(1); if (fTime < 0) { - LOG->Warn("Lua: linear(%f): tween time must not be negative", fTime); + LuaHelpers::ReportScriptErrorFmt("Lua: linear(%f): tween time must not be negative", fTime); return 0; } p->BeginTweening(fTime, TWEEN_LINEAR); @@ -1425,7 +1421,7 @@ public: float fTime = FArg(1); if (fTime < 0) { - LOG->Warn("Lua: accelerate(%f): tween time must not be negative", fTime); + LuaHelpers::ReportScriptErrorFmt("Lua: accelerate(%f): tween time must not be negative", fTime); return 0; } p->BeginTweening(fTime, TWEEN_ACCELERATE); @@ -1436,7 +1432,7 @@ public: float fTime = FArg(1); if (fTime < 0) { - LOG->Warn("Lua: decelerate(%f): tween time must not be negative", fTime); + LuaHelpers::ReportScriptErrorFmt("Lua: decelerate(%f): tween time must not be negative", fTime); return 0; } p->BeginTweening(fTime, TWEEN_DECELERATE); @@ -1447,7 +1443,7 @@ public: float fTime = FArg(1); if (fTime < 0) { - LOG->Warn("Lua: spring(%f): tween time must not be negative", fTime); + LuaHelpers::ReportScriptErrorFmt("Lua: spring(%f): tween time must not be negative", fTime); return 0; } p->BeginTweening(fTime, TWEEN_SPRING); @@ -1458,7 +1454,7 @@ public: float fTime = FArg(1); if (fTime < 0) { - LOG->Warn("Lua: tween(%f): tween time must not be negative", fTime); + LuaHelpers::ReportScriptErrorFmt("Lua: tween(%f): tween time must not be negative", fTime); return 0; } ITween *pTween = ITween::CreateFromStack( L, 2 ); @@ -1558,7 +1554,7 @@ public: float fPeriod = FArg(1); if (fPeriod <= 0) { - LOG->Warn("Effect period (%f) must be positive; ignoring", fPeriod); + LuaHelpers::ReportScriptErrorFmt("Effect period (%f) must be positive; ignoring", fPeriod); return 0; } p->SetEffectPeriod(FArg(1)); @@ -1569,13 +1565,13 @@ public: float f1 = FArg(1), f2 = FArg(2), f3 = FArg(3), f4 = FArg(4); if (f1 < 0 || f2 < 0 || f3 < 0 || f4 < 0) { - LOG->Warn("Effect timings (%f,%f,%f,%f) must not be negative; ignoring", + LuaHelpers::ReportScriptErrorFmt("Effect timings (%f,%f,%f,%f) must not be negative; ignoring", f1, f2, f3, f4); return 0; } if (f1 == 0 && f2 == 0 && f3 == 0 && f4 == 0) { - LOG->Warn("Effect timings (0,0,0,0) must not all be zero; ignoring"); + LuaHelpers::ReportScriptErrorFmt("Effect timings (0,0,0,0) must not all be zero; ignoring"); return 0; } p->SetEffectTiming(FArg(1), FArg(2), FArg(3), FArg(4)); diff --git a/src/ActorFrame.cpp b/src/ActorFrame.cpp index ac614d1fdd..845acd41eb 100644 --- a/src/ActorFrame.cpp +++ b/src/ActorFrame.cpp @@ -224,7 +224,7 @@ void ActorFrame::DrawPrimitives() { if( m_bClearZBuffer ) { - LOG->Warn( "ClearZBuffer not supported on ActorFrames" ); + LuaHelpers::ReportScriptErrorFmt( "ClearZBuffer not supported on ActorFrames" ); m_bClearZBuffer = false; } @@ -238,7 +238,7 @@ void ActorFrame::DrawPrimitives() m_DrawFunction.PushSelf( L ); if( lua_isnil(L, -1) ) { - LOG->Warn( "Error compiling DrawFunction" ); + LuaHelpers::ReportScriptErrorFmt( "Error compiling DrawFunction" ); return; } this->PushSelf( L ); @@ -478,7 +478,7 @@ void ActorFrame::UpdateInternal( float fDeltaTime ) m_UpdateFunction.PushSelf( L ); if( lua_isnil(L, -1) ) { - LOG->Warn( "Error compiling UpdateFunction" ); + LuaHelpers::ReportScriptErrorFmt( "Error compiling UpdateFunction" ); return; } this->PushSelf( L ); diff --git a/src/ActorMultiVertex.cpp b/src/ActorMultiVertex.cpp index 879b5f7a2a..4d1f932b45 100644 --- a/src/ActorMultiVertex.cpp +++ b/src/ActorMultiVertex.cpp @@ -358,13 +358,13 @@ void ActorMultiVertex::AMV_TweenState::SetDrawState( DrawMode dm, int first, int { if(first >= (int)vertices.size() && vertices.size() > 0) { - LOG->Warn("ActorMultiVertex:SetDrawState: FirstToDraw > vertices.size(), %d > %u", FirstToDraw + 1, (unsigned int)vertices.size() ); + LuaHelpers::ReportScriptErrorFmt("ActorMultiVertex:SetDrawState: FirstToDraw > vertices.size(), %d > %u", FirstToDraw + 1, (unsigned int)vertices.size() ); return; } int safe_num= GetSafeNumToDraw( dm, num ); if( num != safe_num && num != -1 ) { - LOG->Warn("ActorMultiVertex:SetDrawState: NumToDraw %d is not valid for %u vertices with DrawMode %s", num, (unsigned int)vertices.size(), DrawModeNames[dm] ); + LuaHelpers::ReportScriptErrorFmt("ActorMultiVertex:SetDrawState: NumToDraw %d is not valid for %u vertices with DrawMode %s", num, (unsigned int)vertices.size(), DrawModeNames[dm] ); return; } _DrawMode= dm; @@ -416,7 +416,7 @@ public: // Use the number of arguments to determine which property a table is for if(lua_type(L, DataStackIndex) != LUA_TTABLE) { - LOG->Warn("ActorMultiVertex::SetVertex: non-table parameter supplied. Table of tables of vertex data expected."); + LuaHelpers::ReportScriptErrorFmt("ActorMultiVertex::SetVertex: non-table parameter supplied. Table of tables of vertex data expected."); return; } size_t NumDataParts = lua_objlen(L, DataStackIndex); @@ -428,7 +428,7 @@ public: size_t DataPieceElements = lua_objlen(L, DataPieceIndex); if(lua_type(L, DataPieceIndex) != LUA_TTABLE) { - LOG->Warn( "ActorMultiVertex::SetVertex: non-table parameter %u supplied inside table of parameters, table expected.", (unsigned int)i ); + LuaHelpers::ReportScriptErrorFmt( "ActorMultiVertex::SetVertex: non-table parameter %u supplied inside table of parameters, table expected.", (unsigned int)i ); return; } int pushes = 1; @@ -462,7 +462,7 @@ public: } else { - LOG->Warn( "ActorMultiVertex::SetVertex: Parameter %u has %u elements supplied. 2, 3, or 4 expected.", (unsigned int)i, (unsigned int)DataPieceElements ); + LuaHelpers::ReportScriptErrorFmt( "ActorMultiVertex::SetVertex: Parameter %u has %u elements supplied. 2, 3, or 4 expected.", (unsigned int)i, (unsigned int)DataPieceElements ); } // Avoid a stack underflow by only popping the amount we pushed. @@ -477,7 +477,7 @@ public: int Index = IArg(1)-1; if( Index < 0 ) { - LOG->Warn( "ActorMultiVertex::SetVertex: index %d provided, cannot set Index < 1", Index+1 ); + LuaHelpers::ReportScriptErrorFmt( "ActorMultiVertex::SetVertex: index %d provided, cannot set Index < 1", Index+1 ); return 0; } else if( Index == (int) p->GetNumVertices() ) @@ -486,7 +486,7 @@ public: } else if( Index > (int) p->GetNumVertices() ) { - LOG->Warn( "ActorMultiVertex::SetVertex: Cannot set vertex %d if there is no vertex %d, only %u vertices.", Index+1 , Index, (unsigned int)p->GetNumVertices() ); + LuaHelpers::ReportScriptErrorFmt( "ActorMultiVertex::SetVertex: Cannot set vertex %d if there is no vertex %d, only %u vertices.", Index+1 , Index, (unsigned int)p->GetNumVertices() ); return 0; } SetVertexFromStack(p, L, Index, lua_gettop(L)); @@ -504,7 +504,7 @@ public: First = IArg(1)-1; if( First < 0 ) { - LOG->Warn( "ActorMultiVertex::SetVertices: index %d provided, cannot set Index < 1", First+1 ); + LuaHelpers::ReportScriptErrorFmt( "ActorMultiVertex::SetVertices: index %d provided, cannot set Index < 1", First+1 ); return 0; } } @@ -542,7 +542,7 @@ public: float Width = FArg(1); if( Width < 0 ) { - LOG->Warn( "ActorMultiVertex::SetLineWidth: cannot set negative width." ); + LuaHelpers::ReportScriptErrorFmt( "ActorMultiVertex::SetLineWidth: cannot set negative width." ); return 0; } p->SetLineWidth(Width); @@ -557,7 +557,7 @@ public: int ArgsIndex= 1; if( !lua_istable(L, ArgsIndex) ) { - LOG->Warn( "ActorMultiVertex:SetDrawState: Table expected, something else recieved. Doing nothing."); + LuaHelpers::ReportScriptErrorFmt( "ActorMultiVertex:SetDrawState: Table expected, something else recieved. Doing nothing."); return 0; } // Fetch the draw mode, if provided. diff --git a/src/ActorUtil.cpp b/src/ActorUtil.cpp index fd98f53002..a8a50dd550 100644 --- a/src/ActorUtil.cpp +++ b/src/ActorUtil.cpp @@ -246,7 +246,7 @@ namespace { LUA->Release( L ); sError = ssprintf( "Lua runtime error: %s", sError.c_str() ); - Dialog::OK( sError, "LUA_ERROR" ); + LuaHelpers::ReportScriptError(sError); return NULL; } @@ -272,7 +272,6 @@ bool ActorUtil::LoadTableFromStackShowErrors( Lua *L ) if( !LuaHelpers::RunScriptOnStack(L, Error, 0, 1, true) ) { lua_pop( L, 1 ); - Dialog::OK( Error, "LUA_ERROR" ); return false; } @@ -286,7 +285,7 @@ bool ActorUtil::LoadTableFromStackShowErrors( Lua *L ) Error = ssprintf( "%s: must return a table", debug.short_src ); - Dialog::OK( Error, "LUA_ERROR" ); + LuaHelpers::ReportScriptError(Error, "LUA_ERROR"); return false; } return true; diff --git a/src/Background.cpp b/src/Background.cpp index deddf700f9..910d5b4284 100644 --- a/src/Background.cpp +++ b/src/Background.cpp @@ -328,7 +328,7 @@ bool BackgroundImpl::Layer::CreateBackground( const Song *pSong, const Backgroun switch( ft ) { default: - LOG->Warn( "CreateBackground() Unknown file type '%s'", vsResolved[0].c_str() ); + LuaHelpers::ReportScriptErrorFmt( "CreateBackground() Unknown file type '%s'", vsResolved[0].c_str() ); // fall through case FT_Bitmap: case FT_Sprite: @@ -364,12 +364,12 @@ bool BackgroundImpl::Layer::CreateBackground( const Song *pSong, const Backgroun BackgroundUtil::GetBackgroundEffects( sEffect, vsPaths, vsThrowAway ); if( vsPaths.empty() ) { - LOG->Warn( "BackgroundEffect '%s' is missing.",sEffect.c_str() ); + LuaHelpers::ReportScriptErrorFmt( "BackgroundEffect '%s' is missing.",sEffect.c_str() ); sEffect = SBE_Centered; } else if( vsPaths.size() > 1 ) { - LOG->Warn( "BackgroundEffect '%s' has more than one match.",sEffect.c_str() ); + LuaHelpers::ReportScriptErrorFmt( "BackgroundEffect '%s' has more than one match.",sEffect.c_str() ); sEffect = SBE_Centered; } else @@ -744,7 +744,7 @@ void BackgroundImpl::Layer::UpdateCurBGChange( const Song *pSong, float fLastMus XNode *pNode = change.m_def.CreateNode(); RString xml = XmlFileUtil::GetXML( pNode ); Trim( xml ); - LOG->Warn( "Tried to switch to a background that was never loaded:\n%s", xml.c_str() ); + LuaHelpers::ReportScriptErrorFmt( "Tried to switch to a background that was never loaded:\n%s", xml.c_str() ); SAFE_DELETE( pNode ); return; } diff --git a/src/BitmapText.cpp b/src/BitmapText.cpp index c15cf2b57a..95ca19f83a 100644 --- a/src/BitmapText.cpp +++ b/src/BitmapText.cpp @@ -132,7 +132,7 @@ void BitmapText::LoadFromNode( const XNode* pNode ) if( !pNode->GetAttrValue("Font", sFont) && !pNode->GetAttrValue("File", sFont) ) // accept "File" for backward compatibility { - LOG->Warn( "%s: BitmapText: Font or File attribute not found", + LuaHelpers::ReportScriptErrorFmt( "%s: BitmapText: Font or File attribute not found", ActorUtil::GetWhere(pNode).c_str() ); sFont = "Common Normal"; } diff --git a/src/ComboGraph.cpp b/src/ComboGraph.cpp index e582f2a9fb..e562d269b0 100644 --- a/src/ComboGraph.cpp +++ b/src/ComboGraph.cpp @@ -61,7 +61,7 @@ void ComboGraph::Load( RString sMetricsGroup ) if( m_pComboNumber != NULL ) this->AddChild( m_pComboNumber ); else - LOG->Warn( "ComboGraph: \"sMetricsGroup\" \"ComboNumber\" must be a BitmapText" ); + LuaHelpers::ReportScriptErrorFmt( "ComboGraph: \"sMetricsGroup\" \"ComboNumber\" must be a BitmapText" ); } } diff --git a/src/CommonMetrics.cpp b/src/CommonMetrics.cpp index b699738e03..3635dd72a1 100644 --- a/src/CommonMetrics.cpp +++ b/src/CommonMetrics.cpp @@ -92,7 +92,7 @@ static void RemoveStepsTypes( vector& inout, RString sStepsTypesToRem StepsType st = GAMEMAN->StringToStepsType(*i); if( st == StepsType_Invalid ) { - LOG->Warn( "Invalid StepsType value '%s' in '%s'", i->c_str(), sStepsTypesToRemove.c_str() ); + LuaHelpers::ReportScriptErrorFmt( "Invalid StepsType value '%s' in '%s'", i->c_str(), sStepsTypesToRemove.c_str() ); continue; } diff --git a/src/DifficultyIcon.cpp b/src/DifficultyIcon.cpp index 26f30287d7..744f49e591 100644 --- a/src/DifficultyIcon.cpp +++ b/src/DifficultyIcon.cpp @@ -6,7 +6,6 @@ #include "Steps.h" #include "GameState.h" #include "RageDisplay.h" -#include "arch/Dialog/Dialog.h" #include "Trail.h" #include "ActorUtil.h" #include "XmlFile.h" @@ -35,7 +34,7 @@ bool DifficultyIcon::Load( RString sPath ) NUM_Difficulty, NUM_Difficulty*2, iStates ); - Dialog::OK( sError ); + LuaHelpers::ReportScriptError(sError); } StopAnimating(); return true; diff --git a/src/EnumHelper.cpp b/src/EnumHelper.cpp index cc9d274f82..921a92a935 100644 --- a/src/EnumHelper.cpp +++ b/src/EnumHelper.cpp @@ -70,7 +70,7 @@ int CheckEnum( lua_State *L, LuaReference &table, int iPos, int iInvalid, const { RString errmsg; LuaHelpers::Pop(L, errmsg); - LOG->Warn(errmsg.c_str()); + LuaHelpers::ReportScriptError(errmsg); lua_pop(L, 2); return iInvalid; } diff --git a/src/GameCommand.cpp b/src/GameCommand.cpp index 43dde86c2d..dbda6baa2b 100644 --- a/src/GameCommand.cpp +++ b/src/GameCommand.cpp @@ -14,7 +14,6 @@ #include "Game.h" #include "Style.h" #include "Foreach.h" -#include "arch/Dialog/Dialog.h" #include "GameSoundManager.h" #include "PlayerState.h" #include "SongManager.h" @@ -426,8 +425,7 @@ void GameCommand::LoadOne( const Command& cmd ) else { RString sWarning = ssprintf( "Command '%s' is not valid.", cmd.GetOriginalCommandString().c_str() ); - LOG->Warn( "%s", sWarning.c_str() ); - Dialog::OK( sWarning, "INVALID_GAME_COMMAND" ); + LuaHelpers::ReportScriptError(sWarning, "INVALID_GAME_COMMAND"); } } diff --git a/src/GameState.cpp b/src/GameState.cpp index 57a58f8377..ba4da3ce06 100644 --- a/src/GameState.cpp +++ b/src/GameState.cpp @@ -1879,7 +1879,7 @@ void GameState::StoreRankingName( PlayerNumber pn, RString sName ) { if( file.GetLine(sLine) == -1 ) { - LOG->Warn( "Error reading \"%s\": %s", NAME_BLACKLIST_FILE, file.GetError().c_str() ); + LuaHelpers::ReportScriptErrorFmt( "Error reading \"%s\": %s", NAME_BLACKLIST_FILE, file.GetError().c_str() ); break; } @@ -2085,7 +2085,7 @@ Difficulty GameState::GetEasiestStepsDifficulty() const { if( m_pCurSteps[p] == NULL ) { - LOG->Warn( "GetEasiestStepsDifficulty called but p%i hasn't chosen notes", p+1 ); + LuaHelpers::ReportScriptErrorFmt( "GetEasiestStepsDifficulty called but p%i hasn't chosen notes", p+1 ); continue; } dc = min( dc, m_pCurSteps[p]->GetDifficulty() ); @@ -2100,7 +2100,7 @@ Difficulty GameState::GetHardestStepsDifficulty() const { if( m_pCurSteps[p] == NULL ) { - LOG->Warn( "GetHardestStepsDifficulty called but p%i hasn't chosen notes", p+1 ); + LuaHelpers::ReportScriptErrorFmt( "GetHardestStepsDifficulty called but p%i hasn't chosen notes", p+1 ); continue; } dc = max( dc, m_pCurSteps[p]->GetDifficulty() ); diff --git a/src/LuaManager.cpp b/src/LuaManager.cpp index ff8b9c0923..840eaf4f2d 100644 --- a/src/LuaManager.cpp +++ b/src/LuaManager.cpp @@ -789,7 +789,7 @@ bool LuaHelpers::LoadScript( Lua *L, const RString &sScript, const RString &sNam return true; } -void LuaHelpers::ReportScriptError(RString const& Error) +void LuaHelpers::ReportScriptError(RString const& Error, RString ErrorType) { size_t line_break_pos= Error.find('\n'); RString short_error; @@ -803,6 +803,17 @@ void LuaHelpers::ReportScriptError(RString const& Error) } SCREENMAN->SystemMessage(short_error); LOG->Warn(Error.c_str()); + Dialog::OK(Error, ErrorType); +} + +// For convenience when replacing uses of LOG->Warn. +void LuaHelpers::ReportScriptErrorFmt(const char *fmt, ...) +{ + va_list va; + va_start( va, fmt ); + RString Buff = vssprintf( fmt, va ); + va_end( va ); + ReportScriptError(Buff); } bool LuaHelpers::RunScriptOnStack( Lua *L, RString &Error, int Args, int ReturnValues, bool ReportError ) @@ -862,11 +873,9 @@ bool LuaHelpers::RunScript( Lua *L, const RString &Script, const RString &Name, bool LuaHelpers::RunExpression( Lua *L, const RString &sExpression, const RString &sName ) { - RString sError; - if( !LuaHelpers::RunScript(L, "return " + sExpression, sName.empty()? RString("in"):sName, sError, 0, 1) ) + RString sError= ssprintf("Lua runtime error parsing \"%s\": ", sName.size()? sName.c_str():sExpression.c_str()); + if(!LuaHelpers::RunScript(L, "return " + sExpression, sName.empty()? RString("in"):sName, sError, 0, 1, true)) { - sError = ssprintf( "Lua runtime error parsing \"%s\": %s", sName.size()? sName.c_str():sExpression.c_str(), sError.c_str() ); - Dialog::OK( sError, "LUA_ERROR" ); return false; } return true; diff --git a/src/LuaManager.h b/src/LuaManager.h index 19ce04a377..8fc8d820aa 100644 --- a/src/LuaManager.h +++ b/src/LuaManager.h @@ -59,7 +59,9 @@ namespace LuaHelpers bool LoadScript( Lua *L, const RString &sScript, const RString &sName, RString &sError ); /* Report the error through the log and on the screen. */ - void ReportScriptError(RString const& Error); + void ReportScriptError(RString const& Error, RString ErrorType= "LUA_ERROR"); + // For convenience when replacing uses of LOG->Warn. + void ReportScriptErrorFmt(const char *fmt, ...); /* Run the function with arguments at the top of the stack, with the given * number of arguments. The specified number of return values are left on diff --git a/src/LyricsLoader.cpp b/src/LyricsLoader.cpp index 9909416cd8..d617df2144 100644 --- a/src/LyricsLoader.cpp +++ b/src/LyricsLoader.cpp @@ -24,7 +24,7 @@ bool LyricsLoader::LoadFromLRCFile(const RString& sPath, Song& out) RageFile input; if( !input.Open(sPath) ) { - LOG->Warn("Error opening file '%s' for reading: %s", sPath.c_str(), input.GetError().c_str() ); + LuaHelpers::ReportScriptErrorFmt("Error opening file '%s' for reading: %s", sPath.c_str(), input.GetError().c_str() ); return false; } @@ -40,7 +40,7 @@ bool LyricsLoader::LoadFromLRCFile(const RString& sPath, Song& out) break; if( ret == -1 ) { - LOG->Warn("Error reading %s: %s", input.GetPath().c_str(), input.GetError().c_str() ); + LuaHelpers::ReportScriptErrorFmt("Error reading %s: %s", input.GetPath().c_str(), input.GetError().c_str() ); break; } diff --git a/src/MusicWheel.cpp b/src/MusicWheel.cpp index 9eb5d728a1..f635cb45a5 100644 --- a/src/MusicWheel.cpp +++ b/src/MusicWheel.cpp @@ -1613,7 +1613,7 @@ Song *MusicWheel::GetPreferredSelectionForRandomOrPortal() return wid[iSelection]->m_pSong; } } - LOG->Warn( "Couldn't find any songs" ); + LuaHelpers::ReportScriptError( "Couldn't find any songs" ); return wid[0]->m_pSong; } diff --git a/src/NoteSkinManager.cpp b/src/NoteSkinManager.cpp index 9194574f50..fa4b5415bc 100644 --- a/src/NoteSkinManager.cpp +++ b/src/NoteSkinManager.cpp @@ -419,7 +419,7 @@ Actor *NoteSkinManager::LoadActor( const RString &sButton, const RString &sEleme // Make sure pActor is a Sprite (or something derived from Sprite). Sprite *pSprite = dynamic_cast( pRet ); if( pSprite == NULL ) - LOG->Warn( "%s: %s %s must be a Sprite", m_sCurrentNoteSkin.c_str(), sButton.c_str(), sElement.c_str() ); + LuaHelpers::ReportScriptErrorFmt( "%s: %s %s must be a Sprite", m_sCurrentNoteSkin.c_str(), sButton.c_str(), sElement.c_str() ); } return pRet; diff --git a/src/OptionRowHandler.cpp b/src/OptionRowHandler.cpp index e24665cddc..03294998b0 100644 --- a/src/OptionRowHandler.cpp +++ b/src/OptionRowHandler.cpp @@ -824,7 +824,7 @@ public: { if(m_pLuaTable->GetLuaType() != LUA_TTABLE) { - LOG->Warn("LUA_ERROR: Result of \"%s\" is not a table.", RowName.c_str()); + LuaHelpers::ReportScriptErrorFmt("LUA_ERROR: Result of \"%s\" is not a table.", RowName.c_str()); return false; } m_pLuaTable->PushSelf(L); @@ -832,7 +832,7 @@ public: const char *pStr = lua_tostring(L, -1); if( pStr == NULL ) { - LOG->Warn("LUA_ERROR: \"%s\" \"Name\" entry is not a string.", RowName.c_str()); + LuaHelpers::ReportScriptErrorFmt("LUA_ERROR: \"%s\" \"Name\" entry is not a string.", RowName.c_str()); return false; } lua_pop(L, 1); @@ -841,7 +841,7 @@ public: pStr = lua_tostring(L, -1); if(pStr == NULL || StringToLayoutType(pStr) == LayoutType_Invalid) { - LOG->Warn("LUA_ERROR: \"%s\" \"LayoutType\" entry is not a string.", RowName.c_str()); + LuaHelpers::ReportScriptErrorFmt("LUA_ERROR: \"%s\" \"LayoutType\" entry is not a string.", RowName.c_str()); return false; } lua_pop(L, 1); @@ -850,7 +850,7 @@ public: pStr = lua_tostring(L, -1); if(pStr == NULL || StringToSelectType(pStr) == SelectType_Invalid) { - LOG->Warn("LUA_ERROR: \"%s\" \"SelectType\" entry is not a string.", RowName.c_str()); + LuaHelpers::ReportScriptErrorFmt("LUA_ERROR: \"%s\" \"SelectType\" entry is not a string.", RowName.c_str()); return false; } lua_pop(L, 1); @@ -858,12 +858,12 @@ public: lua_getfield(L, -1, "Choices"); if(!lua_istable(L, -1)) { - LOG->Warn("LUA_ERROR: \"%s\" \"Choices\" is not a table.", RowName.c_str()); + LuaHelpers::ReportScriptErrorFmt("LUA_ERROR: \"%s\" \"Choices\" is not a table.", RowName.c_str()); return false; } if(!TableContainsOnlyStrings(L, lua_gettop(L))) { - LOG->Warn("LUA_ERROR: \"%s\" \"Choices\" table contains a non-string.", RowName.c_str()); + LuaHelpers::ReportScriptErrorFmt("LUA_ERROR: \"%s\" \"Choices\" table contains a non-string.", RowName.c_str()); return false; } lua_pop(L, 1); @@ -873,7 +873,7 @@ public: { if(!lua_isfunction(L, -1)) { - LOG->Warn("LUA_ERROR: \"%s\" \"EnabledForPlayers\" is not a function.", RowName.c_str()); + LuaHelpers::ReportScriptErrorFmt("LUA_ERROR: \"%s\" \"EnabledForPlayers\" is not a function.", RowName.c_str()); return false; } m_pLuaTable->PushSelf( L ); @@ -881,7 +881,7 @@ public: LuaHelpers::RunScriptOnStack(L, error, 1, 1, true); if(!lua_istable(L, -1)) { - LOG->Warn("LUA_ERROR: \"%s\" \"EnabledForPlayers\" did not return a table.", RowName.c_str()); + LuaHelpers::ReportScriptErrorFmt("LUA_ERROR: \"%s\" \"EnabledForPlayers\" did not return a table.", RowName.c_str()); return false; } lua_pushnil(L); @@ -890,7 +890,7 @@ public: PlayerNumber pn= Enum::Check(L, -1, true, true); if(pn == PlayerNumber_Invalid) { - LOG->Warn("LUA_ERROR: \"%s\" \"EnabledForPlayers\" contains a non-PlayerNumber.", RowName.c_str()); + LuaHelpers::ReportScriptErrorFmt("LUA_ERROR: \"%s\" \"EnabledForPlayers\" contains a non-PlayerNumber.", RowName.c_str()); return false; } lua_pop(L, 1); @@ -903,12 +903,12 @@ public: { if(!lua_istable(L, -1)) { - LOG->Warn("LUA_ERROR: \"%s\" \"ReloadRowMessages\" is not a table.", RowName.c_str()); + LuaHelpers::ReportScriptErrorFmt("LUA_ERROR: \"%s\" \"ReloadRowMessages\" is not a table.", RowName.c_str()); return false; } if(!TableContainsOnlyStrings(L, lua_gettop(L))) { - LOG->Warn("LUA_ERROR: \"%s\" \"ReloadRowMessages\" table contains a non-string.", RowName.c_str()); + LuaHelpers::ReportScriptErrorFmt("LUA_ERROR: \"%s\" \"ReloadRowMessages\" table contains a non-string.", RowName.c_str()); return false; } } @@ -917,7 +917,7 @@ public: lua_getfield(L, -1, "LoadSelections"); if(!lua_isfunction(L, -1)) { - LOG->Warn("LUA_ERROR: \"%s\" \"LoadSelections\" entry is not a function.", RowName.c_str()); + LuaHelpers::ReportScriptErrorFmt("LUA_ERROR: \"%s\" \"LoadSelections\" entry is not a function.", RowName.c_str()); return false; } lua_pop(L, 1); @@ -925,7 +925,7 @@ public: lua_getfield(L, -1, "SaveSelections"); if(!lua_isfunction(L, -1)) { - LOG->Warn("LUA_ERROR: \"%s\" \"SaveSelections\" entry is not a function.", RowName.c_str()); + LuaHelpers::ReportScriptErrorFmt("LUA_ERROR: \"%s\" \"SaveSelections\" entry is not a function.", RowName.c_str()); return false; } lua_pop(L, 1); @@ -933,7 +933,7 @@ public: lua_getfield(L, -1, "NotifyOfSelection"); if(!lua_isnil(L, -1) && !lua_isfunction(L, -1)) { - LOG->Warn("LUA_ERROR: \"%s\" \"NotifyOfSelection\" entry is not a function.", RowName.c_str()); + LuaHelpers::ReportScriptErrorFmt("LUA_ERROR: \"%s\" \"NotifyOfSelection\" entry is not a function.", RowName.c_str()); return false; } lua_pop(L, 1); @@ -1278,7 +1278,7 @@ public: ConfOption *pConfOption = ConfOption::Find( sParam ); if( pConfOption == NULL ) { - LOG->Warn( "Invalid Conf type \"%s\"", sParam.c_str() ); + LuaHelpers::ReportScriptErrorFmt( "Invalid Conf type \"%s\"", sParam.c_str() ); pConfOption = ConfOption::Find( "Invalid" ); ASSERT_M( pConfOption != NULL, "ConfOption::Find(Invalid)" ); } diff --git a/src/PrefsManager.cpp b/src/PrefsManager.cpp index 2521b50054..cb17ace911 100644 --- a/src/PrefsManager.cpp +++ b/src/PrefsManager.cpp @@ -535,7 +535,7 @@ public: IPreference *pPref = IPreference::GetPreferenceByName( sName ); if( pPref == NULL ) { - LOG->Warn( "GetPreference: unknown preference \"%s\"", sName.c_str() ); + LuaHelpers::ReportScriptErrorFmt( "GetPreference: unknown preference \"%s\"", sName.c_str() ); lua_pushnil( L ); return 1; } @@ -550,7 +550,7 @@ public: IPreference *pPref = IPreference::GetPreferenceByName( sName ); if( pPref == NULL ) { - LOG->Warn( "SetPreference: unknown preference \"%s\"", sName.c_str() ); + LuaHelpers::ReportScriptErrorFmt( "SetPreference: unknown preference \"%s\"", sName.c_str() ); return 0; } @@ -565,7 +565,7 @@ public: IPreference *pPref = IPreference::GetPreferenceByName( sName ); if( pPref == NULL ) { - LOG->Warn( "SetPreferenceToDefault: unknown preference \"%s\"", sName.c_str() ); + LuaHelpers::ReportScriptErrorFmt( "SetPreferenceToDefault: unknown preference \"%s\"", sName.c_str() ); return 0; } diff --git a/src/Profile.cpp b/src/Profile.cpp index c8b17cd1af..764bd59f8e 100644 --- a/src/Profile.cpp +++ b/src/Profile.cpp @@ -905,7 +905,7 @@ ProfileLoadResult Profile::LoadAllFromDir( RString sDir, bool bRequireSignature int iBytes = pFile->GetFileSize(); if( iBytes > MAX_PLAYER_STATS_XML_SIZE_BYTES ) { - LOG->Warn( "The file '%s' is unreasonably large. It won't be loaded.", fn.c_str() ); + LuaHelpers::ReportScriptErrorFmt( "The file '%s' is unreasonably large. It won't be loaded.", fn.c_str() ); return ProfileLoadResult_FailedTampered; } } @@ -919,7 +919,7 @@ ProfileLoadResult Profile::LoadAllFromDir( RString sDir, bool bRequireSignature // verify the stats.xml signature with the "don't share" file if( !CryptManager::VerifyFileWithFile(sStatsXmlSigFile, sDontShareFile) ) { - LOG->Warn( "The don't share check for '%s' failed. Data will be ignored.", sStatsXmlSigFile.c_str() ); + LuaHelpers::ReportScriptErrorFmt( "The don't share check for '%s' failed. Data will be ignored.", sStatsXmlSigFile.c_str() ); return ProfileLoadResult_FailedTampered; } LOG->Trace( "Done." ); @@ -928,7 +928,7 @@ ProfileLoadResult Profile::LoadAllFromDir( RString sDir, bool bRequireSignature LOG->Trace( "Verifying stats.xml signature" ); if( !CryptManager::VerifyFileWithFile(fn, sStatsXmlSigFile) ) { - LOG->Warn( "The signature check for '%s' failed. Data will be ignored.", fn.c_str() ); + LuaHelpers::ReportScriptErrorFmt( "The signature check for '%s' failed. Data will be ignored.", fn.c_str() ); return ProfileLoadResult_FailedTampered; } LOG->Trace( "Done." ); @@ -1065,7 +1065,7 @@ bool Profile::SaveStatsXmlToDir( RString sDir, bool bSignData ) const RageFile f; if( !f.Open(fn, RageFile::WRITE) ) { - LOG->Warn( "Couldn't open %s for writing: %s", fn.c_str(), f.GetError().c_str() ); + LuaHelpers::ReportScriptErrorFmt( "Couldn't open %s for writing: %s", fn.c_str(), f.GetError().c_str() ); return false; } @@ -1288,7 +1288,7 @@ ProfileLoadResult Profile::LoadEditableDataFromDir( RString sDir ) int iBytes = FILEMAN->GetFileSizeInBytes( fn ); if( iBytes > MAX_EDITABLE_INI_SIZE_BYTES ) { - LOG->Warn( "The file '%s' is unreasonably large. It won't be loaded.", fn.c_str() ); + LuaHelpers::ReportScriptErrorFmt( "The file '%s' is unreasonably large. It won't be loaded.", fn.c_str() ); return ProfileLoadResult_FailedTampered; } diff --git a/src/ScreenOptions.cpp b/src/ScreenOptions.cpp index a368adb77e..ecb23a5d5a 100644 --- a/src/ScreenOptions.cpp +++ b/src/ScreenOptions.cpp @@ -554,7 +554,7 @@ void ScreenOptions::HandleScreenMessage( const ScreenMessage SM ) // If options set a NextScreen or one is specified in metrics, then fade out if( GetNextScreenName() == "" ) { - LOG->Warn( "%s::HandleScreenMessage: Tried to fade out, but we have no next screen", m_sName.c_str() ); + LuaHelpers::ReportScriptErrorFmt( "%s::HandleScreenMessage: Tried to fade out, but we have no next screen", m_sName.c_str() ); return; } diff --git a/src/ScreenOptionsMaster.cpp b/src/ScreenOptionsMaster.cpp index 9ce88793fb..662885dbd5 100644 --- a/src/ScreenOptionsMaster.cpp +++ b/src/ScreenOptionsMaster.cpp @@ -58,12 +58,14 @@ void ScreenOptionsMaster::Init() OptionRowHandler *pHand = OptionRowHandlerUtil::Make( cmds ); if( pHand == NULL ) - RageException::Throw( "Invalid OptionRowHandler \"%s\" in \"%s::Line%i\".", cmds.GetOriginalCommandString().c_str(), m_sName.c_str(), i ); - OptionRowHandlers.push_back( pHand ); + { + LuaHelpers::ReportScriptErrorFmt("Invalid OptionRowHandler \"%s\" in \"%s::Line%i\".", cmds.GetOriginalCommandString().c_str(), m_sName.c_str(), i); + } + else + { + OptionRowHandlers.push_back( pHand ); + } } - - ASSERT( OptionRowHandlers.size() == asLineNames.size() ); - InitMenu( OptionRowHandlers ); } diff --git a/src/ScreenSMOnlineLogin.cpp b/src/ScreenSMOnlineLogin.cpp index 2a59449954..248b9f4066 100644 --- a/src/ScreenSMOnlineLogin.cpp +++ b/src/ScreenSMOnlineLogin.cpp @@ -118,7 +118,7 @@ void ScreenSMOnlineLogin::HandleScreenMessage(const ScreenMessage SM) LOG->Trace("[ScreenSMOnlineLogin::HandleScreenMessage] SMOnlinePack"); if(!GAMESTATE->IsPlayerEnabled((PlayerNumber) m_iPlayer)) { - LOG->Warn("Invalid player number: %i", m_iPlayer); + LuaHelpers::ReportScriptErrorFmt("Invalid player number: %i", m_iPlayer); return; } diff --git a/src/ScreenSelectMaster.cpp b/src/ScreenSelectMaster.cpp index 24118fa488..0d3b8fd6c6 100644 --- a/src/ScreenSelectMaster.cpp +++ b/src/ScreenSelectMaster.cpp @@ -195,7 +195,7 @@ void ScreenSelectMaster::Init() int from, to; if( sscanf( parts[part], "%d:%d", &from, &to ) != 2 ) { - LOG->Warn( "%s::OptionOrder%s parse error", m_sName.c_str(), MenuDirToString(dir).c_str() ); + LuaHelpers::ReportScriptErrorFmt( "%s::OptionOrder%s parse error", m_sName.c_str(), MenuDirToString(dir).c_str() ); continue; } diff --git a/src/ScreenWithMenuElements.cpp b/src/ScreenWithMenuElements.cpp index e9304ac070..c54f6adef5 100644 --- a/src/ScreenWithMenuElements.cpp +++ b/src/ScreenWithMenuElements.cpp @@ -9,7 +9,6 @@ #include "GameSoundManager.h" #include "MemoryCardDisplay.h" #include "InputEventPlus.h" -#include "arch/Dialog/Dialog.h" // wow I import this for JUST ONE THING. -aj #define TIMER_STEALTH THEME->GetMetricB(m_sName,"TimerStealth") #define SHOW_STAGE_DISPLAY THEME->GetMetricB(m_sName,"ShowStageDisplay") @@ -203,7 +202,6 @@ void ScreenWithMenuElements::StartPlayingMusic() if( !LuaHelpers::RunScript(L, Script, "@"+m_sPathToMusic, Error, 0, 1, true) ) { LUA->Release( L ); - Dialog::OK( Error, "LUA_ERROR" ); return; } else diff --git a/src/SongManager.cpp b/src/SongManager.cpp index 6a0eebfe9a..7a9840ad28 100644 --- a/src/SongManager.cpp +++ b/src/SongManager.cpp @@ -935,7 +935,7 @@ void SongManager::InitRandomAttacks() MsdFile msd; if( !msd.ReadFile( ATTACK_FILE, true ) ) - LOG->Warn( "Error opening file '%s' for reading: %s.", ATTACK_FILE.c_str(), msd.GetError().c_str() ); + LuaHelpers::ReportScriptErrorFmt( "Error opening file '%s' for reading: %s.", ATTACK_FILE.c_str(), msd.GetError().c_str() ); else { for( unsigned i=0; i 2 ) { - LOG->Warn( "Got \"%s:%s\" tag with too many parameters", sType.c_str(), sAttack.c_str() ); + LuaHelpers::ReportScriptErrorFmt( "Got \"%s:%s\" tag with too many parameters", sType.c_str(), sAttack.c_str() ); continue; } if( !sType.EqualsNoCase("ATTACK") ) { - LOG->Warn( "Got \"%s:%s\" tag with wrong declaration", sType.c_str(), sAttack.c_str() ); + LuaHelpers::ReportScriptErrorFmt( "Got \"%s:%s\" tag with wrong declaration", sType.c_str(), sAttack.c_str() ); continue; } @@ -1219,7 +1219,7 @@ void SongManager::GetExtraStageInfo( bool bExtra2, const Style *sd, Song*& pSong if( GAMESTATE->m_pCurSong == NULL ) { // This normally shouldn't happen, but it's helpful to permit it for testing. - LOG->Warn( "GetExtraStageInfo() called in GROUP_ALL, but GAMESTATE->m_pCurSong == NULL" ); + LuaHelpers::ReportScriptErrorFmt( "GetExtraStageInfo() called in GROUP_ALL, but GAMESTATE->m_pCurSong == NULL" ); GAMESTATE->m_pCurSong.Set( GetRandomSong() ); } sGroup = GAMESTATE->m_pCurSong->m_sGroupName; @@ -1737,7 +1737,7 @@ void SongManager::LoadStepEditsFromProfileDir( const RString &sProfileDir, Profi if( (int) vsFiles.size() > MAX_EDIT_STEPS_PER_PROFILE - iNumEditsLoaded ) { - LOG->Warn("Profile %s has too many edits; some have been skipped.", ProfileSlotToString( slot ).c_str() ); + LuaHelpers::ReportScriptErrorFmt("Profile %s has too many edits; some have been skipped.", ProfileSlotToString( slot ).c_str() ); return; } @@ -1779,7 +1779,7 @@ void SongManager::LoadStepEditsFromProfileDir( const RString &sProfileDir, Profi if( (int) vsEdits.size() > MAX_EDIT_STEPS_PER_PROFILE - iNumEditsLoaded ) { - LOG->Warn("Profile %s has too many edits; some have been skipped.", ProfileSlotToString( slot ).c_str() ); + LuaHelpers::ReportScriptErrorFmt("Profile %s has too many edits; some have been skipped.", ProfileSlotToString( slot ).c_str() ); return; } diff --git a/src/Sprite.cpp b/src/Sprite.cpp index c3af0d668e..a2e6959f8b 100644 --- a/src/Sprite.cpp +++ b/src/Sprite.cpp @@ -10,7 +10,6 @@ #include "RageTexture.h" #include "RageUtil.h" #include "ActorUtil.h" -#include "arch/Dialog/Dialog.h" #include "Foreach.h" #include "LuaBinding.h" #include "LuaManager.h" @@ -743,7 +742,7 @@ void Sprite::SetState( int iNewState ) else sError = ssprintf("A Sprite (\"%s\") tried to set state index %d, but no texture is loaded.", this->m_sName.c_str(), iNewState ); - Dialog::OK( sError, "SPRITE_INVALID_FRAME" ); + LuaHelpers::ReportScriptError(sError, "SPRITE_INVALID_FRAME"); } } diff --git a/src/Style.cpp b/src/Style.cpp index b550311a74..13273c8102 100644 --- a/src/Style.cpp +++ b/src/Style.cpp @@ -132,7 +132,7 @@ public: int iCol = IArg(2) - 1; if( iCol < 0 || iCol >= p->m_iColsPerPlayer ) { - LOG->Warn( "Style:GetColumnDrawOrder(): column %i out of range( 1 to %i )", iCol+1, p->m_iColsPerPlayer ); + LuaHelpers::ReportScriptErrorFmt( "Style:GetColumnDrawOrder(): column %i out of range( 1 to %i )", iCol+1, p->m_iColsPerPlayer ); return 0; } @@ -153,7 +153,7 @@ public: int iCol = IArg(1) - 1; if( iCol < 0 || iCol >= p->m_iColsPerPlayer*NUM_PLAYERS ) { - LOG->Warn( "Style:GetColumnDrawOrder(): column %i out of range( 1 to %i )", iCol+1, p->m_iColsPerPlayer*NUM_PLAYERS ); + LuaHelpers::ReportScriptErrorFmt( "Style:GetColumnDrawOrder(): column %i out of range( 1 to %i )", iCol+1, p->m_iColsPerPlayer*NUM_PLAYERS ); return 0; } lua_pushnumber( L, p->m_iColumnDrawOrder[iCol]+1 ); diff --git a/src/TitleSubstitution.cpp b/src/TitleSubstitution.cpp index 5f3f698770..b06380fbd6 100644 --- a/src/TitleSubstitution.cpp +++ b/src/TitleSubstitution.cpp @@ -6,6 +6,7 @@ #include "FontCharAliases.h" #include "RageFile.h" #include "Foreach.h" +#include "LuaManager.h" #include "XmlFile.h" #include "XmlFileUtil.h" @@ -62,7 +63,7 @@ void TitleTrans::LoadFromNode( const XNode* pNode ) else if( sKeyName == "ArtistTransTo") Replacement.ArtistTranslit = sValue; else if( sKeyName == "SubtitleTransTo") Replacement.SubtitleTranslit = sValue; else - LOG->Warn( "Unknown TitleSubst tag: \"%s\"", sKeyName.c_str() ); + LuaHelpers::ReportScriptErrorFmt( "Unknown TitleSubst tag: \"%s\"", sKeyName.c_str() ); } } diff --git a/src/UnlockManager.cpp b/src/UnlockManager.cpp index ae77104499..3d88380775 100644 --- a/src/UnlockManager.cpp +++ b/src/UnlockManager.cpp @@ -106,7 +106,7 @@ RString UnlockManager::FindEntryID( const RString &sName ) const if( pEntry == NULL ) { - LOG->Warn( "Couldn't find locked entry \"%s\"", sName.c_str() ); + LuaHelpers::ReportScriptErrorFmt( "Couldn't find locked entry \"%s\"", sName.c_str() ); return ""; } @@ -578,20 +578,20 @@ void UnlockManager::Load() case UnlockRewardType_Song: e->m_Song.FromSong( SONGMAN->FindSong( e->m_cmd.GetArg(0).s ) ); if( !e->m_Song.IsValid() ) - LOG->Warn( "Unlock: Cannot find song matching \"%s\"", e->m_cmd.GetArg(0).s.c_str() ); + LuaHelpers::ReportScriptErrorFmt( "Unlock: Cannot find song matching \"%s\"", e->m_cmd.GetArg(0).s.c_str() ); break; case UnlockRewardType_Steps: e->m_Song.FromSong( SONGMAN->FindSong( e->m_cmd.GetArg(0).s ) ); if( !e->m_Song.IsValid() ) { - LOG->Warn( "Unlock: Cannot find song matching \"%s\"", e->m_cmd.GetArg(0).s.c_str() ); + LuaHelpers::ReportScriptErrorFmt( "Unlock: Cannot find song matching \"%s\"", e->m_cmd.GetArg(0).s.c_str() ); break; } e->m_dc = StringToDifficulty( e->m_cmd.GetArg(1).s ); if( e->m_dc == Difficulty_Invalid ) { - LOG->Warn( "Unlock: Invalid difficulty \"%s\"", e->m_cmd.GetArg(1).s.c_str() ); + LuaHelpers::ReportScriptErrorFmt( "Unlock: Invalid difficulty \"%s\"", e->m_cmd.GetArg(1).s.c_str() ); break; } @@ -601,21 +601,21 @@ void UnlockManager::Load() e->m_Song.FromSong( SONGMAN->FindSong( e->m_cmd.GetArg(0).s ) ); if( !e->m_Song.IsValid() ) { - LOG->Warn( "Unlock: Cannot find song matching \"%s\"", e->m_cmd.GetArg(0).s.c_str() ); + LuaHelpers::ReportScriptErrorFmt( "Unlock: Cannot find song matching \"%s\"", e->m_cmd.GetArg(0).s.c_str() ); break; } e->m_dc = StringToDifficulty( e->m_cmd.GetArg(1).s ); if( e->m_dc == Difficulty_Invalid ) { - LOG->Warn( "Unlock: Invalid difficulty \"%s\"", e->m_cmd.GetArg(1).s.c_str() ); + LuaHelpers::ReportScriptErrorFmt( "Unlock: Invalid difficulty \"%s\"", e->m_cmd.GetArg(1).s.c_str() ); break; } e->m_StepsType = GAMEMAN->StringToStepsType(e->m_cmd.GetArg(2).s); if (e->m_StepsType == StepsType_Invalid) { - LOG->Warn( "Unlock: Invalid steps type \"%s\"", e->m_cmd.GetArg(2).s.c_str() ); + LuaHelpers::ReportScriptErrorFmt( "Unlock: Invalid steps type \"%s\"", e->m_cmd.GetArg(2).s.c_str() ); break; } break; @@ -623,7 +623,7 @@ void UnlockManager::Load() case UnlockRewardType_Course: e->m_Course.FromCourse( SONGMAN->FindCourse(e->m_cmd.GetArg(0).s) ); if( !e->m_Course.IsValid() ) - LOG->Warn( "Unlock: Cannot find course matching \"%s\"", e->m_cmd.GetArg(0).s.c_str() ); + LuaHelpers::ReportScriptErrorFmt( "Unlock: Cannot find course matching \"%s\"", e->m_cmd.GetArg(0).s.c_str() ); break; case UnlockRewardType_Modifier: // nothing to cache diff --git a/src/XmlFileUtil.cpp b/src/XmlFileUtil.cpp index 81b787d122..f7d5f1664e 100644 --- a/src/XmlFileUtil.cpp +++ b/src/XmlFileUtil.cpp @@ -7,6 +7,7 @@ #include "RageLog.h" #include "arch/Dialog/Dialog.h" #include "Foreach.h" +#include "LuaManager.h" bool XmlFileUtil::LoadFromFileShowErrors( XNode &xml, RageFileBasic &f ) { @@ -20,8 +21,7 @@ bool XmlFileUtil::LoadFromFileShowErrors( XNode &xml, RageFileBasic &f ) return true; RString sWarning = ssprintf( "XML: LoadFromFile failed: %s", sError.c_str() ); - LOG->Warn( "%s", sWarning.c_str() ); - Dialog::OK( sWarning, "XML_PARSE_ERROR" ); + LuaHelpers::ReportScriptError(sWarning, "XML_PARSE_ERROR"); return false; } @@ -30,7 +30,7 @@ bool XmlFileUtil::LoadFromFileShowErrors( XNode &xml, const RString &sFile ) RageFile f; if( !f.Open(sFile, RageFile::READ) ) { - LOG->Warn("Couldn't open %s for reading: %s", sFile.c_str(), f.GetError().c_str() ); + LuaHelpers::ReportScriptErrorFmt("Couldn't open %s for reading: %s", sFile.c_str(), f.GetError().c_str() ); return false; } @@ -38,8 +38,7 @@ bool XmlFileUtil::LoadFromFileShowErrors( XNode &xml, const RString &sFile ) if( !bSuccess ) { RString sWarning = ssprintf( "XML: LoadFromFile failed for file: %s", sFile.c_str() ); - LOG->Warn( "%s", sWarning.c_str() ); - Dialog::OK( sWarning, "XML_PARSE_ERROR" ); + LuaHelpers::ReportScriptError(sWarning, "XML_PARSE_ERROR"); } return bSuccess; } @@ -518,14 +517,13 @@ bool XmlFileUtil::SaveToFile( const XNode *pNode, const RString &sFile, const RS RageFile f; if( !f.Open(sFile, RageFile::WRITE) ) { - LOG->Warn( "Couldn't open %s for writing: %s", sFile.c_str(), f.GetError().c_str() ); + LuaHelpers::ReportScriptErrorFmt( "Couldn't open %s for writing: %s", sFile.c_str(), f.GetError().c_str() ); return false; } return SaveToFile( pNode, f, sStylesheet, bWriteTabs ); } -#include "LuaManager.h" #include "LuaReference.h" class XNodeLuaValue: public XNodeValue { From bee284d0c764d5ea4aed320958e4fc6d10a7d5e5 Mon Sep 17 00:00:00 2001 From: Kyzentun Date: Tue, 8 Jul 2014 01:02:36 -0600 Subject: [PATCH 05/80] Rewrote ScreenSystemOverlay overlay/default.lua to be able to display multiple messages. Added Reload Overlay Screens option to debug menu. --- .../ScreenSystemLayer errorbg.lua | 14 ++ .../ScreenSystemLayer overlay/default.lua | 166 +++++++++++++++--- Themes/_fallback/Languages/en.ini | 1 + src/ScreenDebugOverlay.cpp | 15 ++ src/ScreenManager.cpp | 13 ++ src/ScreenManager.h | 5 + 6 files changed, 191 insertions(+), 23 deletions(-) create mode 100644 Themes/_fallback/BGAnimations/ScreenSystemLayer errorbg.lua diff --git a/Themes/_fallback/BGAnimations/ScreenSystemLayer errorbg.lua b/Themes/_fallback/BGAnimations/ScreenSystemLayer errorbg.lua new file mode 100644 index 0000000000..94615c7876 --- /dev/null +++ b/Themes/_fallback/BGAnimations/ScreenSystemLayer errorbg.lua @@ -0,0 +1,14 @@ +return Def.ActorFrame{ + Def.Quad { + Name= "erp", + InitCommand= function(self) + self:setsize(SCREEN_WIDTH, SCREEN_HEIGHT) + self:horizalign(left) + self:vertalign(top) + self:diffuse(color("0,0,0,0")) + self:diffusealpha(.85) + end, + SetCoveredHeightCommand= function(self, param) + end + } +} diff --git a/Themes/_fallback/BGAnimations/ScreenSystemLayer overlay/default.lua b/Themes/_fallback/BGAnimations/ScreenSystemLayer overlay/default.lua index 0e638d6afe..f2c09ff8a4 100644 --- a/Themes/_fallback/BGAnimations/ScreenSystemLayer overlay/default.lua +++ b/Themes/_fallback/BGAnimations/ScreenSystemLayer overlay/default.lua @@ -64,27 +64,147 @@ t[#t+1] = Def.ActorFrame { CreditsText( PLAYER_2 ); }; -- Text -t[#t+1] = Def.ActorFrame { - Def.Quad { - InitCommand=cmd(zoomtowidth,SCREEN_WIDTH;zoomtoheight,30;horizalign,left;vertalign,top;y,SCREEN_TOP;diffuse,color("0,0,0,0")); - OnCommand=cmd(finishtweening;diffusealpha,0.85;); - OffCommand=cmd(sleep,3;linear,0.5;diffusealpha,0;); - }; - LoadFont("Common","Normal") .. { - Name="Text"; - InitCommand=cmd(maxwidth,750;horizalign,left;vertalign,top;y,SCREEN_TOP+10;x,SCREEN_LEFT+10;shadowlength,1;diffusealpha,0;); - OnCommand=cmd(finishtweening;diffusealpha,1;zoom,0.5); - OffCommand=cmd(sleep,3;linear,0.5;diffusealpha,0;); - }; - SystemMessageMessageCommand = function(self, params) - self:GetChild("Text"):settext( params.Message ); - self:playcommand( "On" ); - if params.NoAnimate then - self:finishtweening(); - end - self:playcommand( "Off" ); - end; - HideSystemMessageMessageCommand = cmd(finishtweening); -}; -return t; +-- Minor text formatting functions from Kyzentun. +-- TODO: Figure out why BitmapText:maxwidth doesn't do what I want. +local function width_limit_text(text, limit, natural_zoom) + natural_zoom= natural_zoom or 1 + if text:GetWidth() * natural_zoom > limit then + text:zoomx(limit / text:GetWidth()) + else + text:zoomx(natural_zoom) + end +end + +local function width_clip_text(text, limit) + local full_text= text:GetText() + local fits= text:GetZoomedWidth() <= limit + local prev_max= #full_text - 1 + local prev_min= 0 + if not fits then + while prev_max - prev_min > 1 do + local new_max= math.round((prev_max + prev_min) / 2) + text:settext(full_text:sub(1, 1+new_max)) + if text:GetZoomedWidth() <= limit then + prev_min= new_max + else + prev_max= new_max + end + end + text:settext(full_text:sub(1, 1+prev_min)) + end +end + +local function width_clip_limit_text(text, limit, natural_zoom) + natural_zoom= natural_zoom or text:GetZoomY() + local text_width= text:GetWidth() * natural_zoom + if text_width > limit * 2 then + text:zoomx(natural_zoom * .5) + width_clip_text(text, limit) + else + width_limit_text(text, limit, natural_zoom) + end +end + +local errorbg +local err_frame +local text_actors= {} +local line_height= 12 -- A good line height for Common Normal at .5 zoom. +local line_width= SCREEN_WIDTH - 20 + +local next_message_actor= 1 + +local min_message_time= { show= 4, hide= .125} +local message_time= { + show= min_message_time.show, hide= min_message_time.hide} + +function SetOverlayMessageTime(t, which) + if not min_message_time[which] then + SCREENMAN:SystemMessage("Attempted to set invalid overlay message time field: " .. tostring(which)) + return + end + if t < min_message_time[which] then + SCREENMAN:SystemMessage( + "Attempted to set overlay message " .. which .. + " time to below minimum of " .. min_message_time[which] .. ".") + return + end + message_time[which]= t +end + +local errbg_actor= LoadActor(THEME:GetPathB("ScreenSystemLayer", "errorbg")) +-- Force the name of the returned actor so that we can easily use playcommand on it later. +errbg_actor.Name= "errorbg" + +local frame_args= { + Name="Error frame", + InitCommand= function(self) + err_frame= self + errorbg= self:GetChild("errorbg") + self:y(-SCREEN_HEIGHT) + end, + SystemMessageMessageCommand = function(self, params) + err_frame:stoptweening() + err_frame:visible(true) + local covered_height= line_height * (next_message_actor-1) + err_frame:y(-SCREEN_HEIGHT + covered_height) + if errorbg then + errorbg:playcommand("SetCoveredHeight", {height= covered_height}) + end + err_frame:sleep(message_time.show) + err_frame:queuecommand("DecNextActor") + -- Shift the text on all the actors being shown up by one. + for i= next_message_actor, 1, -1 do + if text_actors[i] then + text_actors[i]:visible(true) + if i > 1 and text_actors[i-1] then + text_actors[i]:settext(text_actors[i-1]:GetText()) + else + text_actors[i]:settext(params.Message) + end + width_clip_limit_text(text_actors[i], line_width) + end + end + if next_message_actor <= #text_actors and not params.NoAnimate then + next_message_actor= next_message_actor + 1 + end + end, + DecNextActorCommand= function(self) + self:linear(message_time.hide) + self:y(self:GetY()-line_height) + if text_actors[next_message_actor] then + text_actors[next_message_actor]:visible(false) + end + next_message_actor= next_message_actor - 1 + if next_message_actor > 1 then + self:queuecommand("DecNextActor") + else + self:queuecommand("Off") + end + end, + OffCommand= cmd(visible,false), + HideSystemMessageMessageCommand = cmd(finishtweening), + errbg_actor, +} +-- Create enough text actors that we can fill the screen. +local num_text= SCREEN_HEIGHT / line_height +for i= 1, num_text do + frame_args[#frame_args+1]= LoadFont("Common","Normal") .. { + Name="Text" .. i, + InitCommand= function(self) + -- Put them in the list in reverse order so the ones at the bottom of the screen are used first. + text_actors[num_text-i+1]= self + self:horizalign(left) + self:vertalign(top) + self:x(SCREEN_LEFT + 10) + self:y(SCREEN_TOP + (line_height * (i-1)) + 2) + self:shadowlength(1) + self:zoom(.5) + self:visible(false) + end, + OffCommand= cmd(visible,false), + } +end +t[#t+1] = Def.ActorFrame(frame_args) + +return t diff --git a/Themes/_fallback/Languages/en.ini b/Themes/_fallback/Languages/en.ini index 237922b3cd..448a35b2e7 100644 --- a/Themes/_fallback/Languages/en.ini +++ b/Themes/_fallback/Languages/en.ini @@ -1317,6 +1317,7 @@ Profile=Profile Pull Back Camera=Pull Back Camera Restart=Restart Reload=Reload +Reload Overlay Screens=Reload Overlay Screens Reload Theme and Textures=Reload Theme and Textures Rendering Stats=Rendering Stats Screen Test Mode=Screen Test Mode diff --git a/src/ScreenDebugOverlay.cpp b/src/ScreenDebugOverlay.cpp index 3cdfe08a9f..e931f38e42 100644 --- a/src/ScreenDebugOverlay.cpp +++ b/src/ScreenDebugOverlay.cpp @@ -548,6 +548,7 @@ static LocalizedString RELOAD ( "ScreenDebugOverlay", "Reload" ); static LocalizedString RESTART ( "ScreenDebugOverlay", "Restart" ); static LocalizedString SCREEN_ON ( "ScreenDebugOverlay", "Send On To Screen" ); static LocalizedString SCREEN_OFF ( "ScreenDebugOverlay", "Send Off To Screen" ); +static LocalizedString RELOAD_OVERLAY_SCREENS( "ScreenDebugOverlay", "Reload Overlay Screens" ); static LocalizedString RELOAD_THEME_AND_TEXTURES( "ScreenDebugOverlay", "Reload Theme and Textures" ); static LocalizedString WRITE_PROFILES ( "ScreenDebugOverlay", "Write Profiles" ); static LocalizedString WRITE_PREFERENCES ( "ScreenDebugOverlay", "Write Preferences" ); @@ -1030,6 +1031,19 @@ class DebugLineReloadTheme : public IDebugLine } }; +class DebugLineReloadOverlayScreens : public IDebugLine +{ + virtual RString GetDisplayTitle() { return RELOAD_OVERLAY_SCREENS.GetValue(); } + virtual RString GetDisplayValue() { return RString(); } + virtual bool IsEnabled() { return true; } + virtual RString GetPageName() const { return "Theme"; } + virtual void DoAndLog( RString &sMessageOut ) + { + IDebugLine::DoAndLog(sMessageOut); + SCREENMAN->ReloadOverlayScreensAfterInputFinishes(); + } +}; + class DebugLineWriteProfiles : public IDebugLine { virtual RString GetDisplayTitle() { return WRITE_PROFILES.GetValue(); } @@ -1212,6 +1226,7 @@ DECLARE_ONE( DebugLineRestartCurrentScreen ); DECLARE_ONE( DebugLineCurrentScreenOn ); DECLARE_ONE( DebugLineCurrentScreenOff ); DECLARE_ONE( DebugLineReloadTheme ); +DECLARE_ONE( DebugLineReloadOverlayScreens ); DECLARE_ONE( DebugLineWriteProfiles ); DECLARE_ONE( DebugLineWritePreferences ); DECLARE_ONE( DebugLineMenuTimer ); diff --git a/src/ScreenManager.cpp b/src/ScreenManager.cpp index bd24d9d2cc..e9079c43e1 100644 --- a/src/ScreenManager.cpp +++ b/src/ScreenManager.cpp @@ -242,6 +242,7 @@ ScreenManager::ScreenManager() g_pSharedBGA = new Actor; + m_bReloadOverlayScreensAfterInput= false; m_bZeroNextUpdate = false; m_PopTopScreen = SM_Invalid; m_OnDonePreparingScreen = SM_Invalid; @@ -330,6 +331,11 @@ void ScreenManager::ReloadOverlayScreens() this->RefreshCreditsMessages(); } +void ScreenManager::ReloadOverlayScreensAfterInputFinishes() +{ + m_bReloadOverlayScreensAfterInput= true; +} + Screen *ScreenManager::GetTopScreen() { if( g_ScreenStack.empty() ) @@ -514,7 +520,14 @@ void ScreenManager::Input( const InputEventPlus &input ) // because anybody setting an input callback is probably doing it to // do something in addition to whatever the screen does. if(pScreen->PassInputToLua(input) || handled) + { + if(m_bReloadOverlayScreensAfterInput) + { + ReloadOverlayScreens(); + m_bReloadOverlayScreensAfterInput= false; + } return; + } } // Pass input to the topmost screen. If we have a new top screen pending, don't diff --git a/src/ScreenManager.h b/src/ScreenManager.h index d9b98649e6..304cb77d5b 100644 --- a/src/ScreenManager.h +++ b/src/ScreenManager.h @@ -51,6 +51,7 @@ public: void RefreshCreditsMessages(); void ThemeChanged(); void ReloadOverlayScreens(); + void ReloadOverlayScreensAfterInputFinishes(); /** * @brief Is this Screen in the main Screen stack, but not the bottommost Screen? @@ -79,6 +80,10 @@ private: // operations take a long time, and will cause a skip on the next update. bool m_bZeroNextUpdate; + // This exists so the debug overlay can reload the overlay screens without seg faulting. + // It's "AfterInput" because the debug overlay carries out actions in Input. + bool m_bReloadOverlayScreensAfterInput; + Screen *MakeNewScreen( const RString &sName ); void LoadDelayedScreen(); bool ActivatePreparedScreenAndBackground( const RString &sScreenName ); From 995a9c6d37bf0295be14ac1423288f0c0d4c57b6 Mon Sep 17 00:00:00 2001 From: freem Date: Tue, 8 Jul 2014 16:51:11 -0500 Subject: [PATCH 06/80] add pkgingo's (Win32) Minimaid driver. * new makefile config option "HAVE_MINIMAID" * update all Visual Studio projects --- src/Makefile.am | 4 + src/StepMania-net2008.vcproj | 8 ++ src/StepMania-net2010.vcxproj | 2 + src/StepMania-net2010.vcxproj.filters | 6 ++ src/StepMania-net2011.vcxproj | 2 + src/StepMania-net2011.vcxproj.filters | 6 ++ src/StepMania-net2013.vcxproj | 2 + src/StepMania-net2013.vcxproj.filters | 6 ++ .../Lights/LightsDriver_Win32Minimaid.cpp | 100 ++++++++++++++++++ src/arch/Lights/LightsDriver_Win32Minimaid.h | 99 +++++++++++++++++ 10 files changed, 235 insertions(+) create mode 100644 src/arch/Lights/LightsDriver_Win32Minimaid.cpp create mode 100644 src/arch/Lights/LightsDriver_Win32Minimaid.h diff --git a/src/Makefile.am b/src/Makefile.am index c43f4c8d38..b1c3be4934 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -400,6 +400,10 @@ if WINDOWS if HAVE_PARALLEL_PORT Lights += arch/Lights/LightsDriver_Win32Parallel.cpp arch/Lights/LightsDriver_Win32Parallel.h endif + +if HAVE_MINIMAID + Lights += arch/Lights/LightsDriver_Win32Minimaid.cpp arch/Lights/LightsDriver_Win32Minimaid.h +endif if !HAVE_PTHREAD Threads += arch/Threads/Threads_Win32.cpp arch/Threads/Threads_Win32.h diff --git a/src/StepMania-net2008.vcproj b/src/StepMania-net2008.vcproj index b7993c0bf3..6f0bd4bf78 100644 --- a/src/StepMania-net2008.vcproj +++ b/src/StepMania-net2008.vcproj @@ -2430,6 +2430,14 @@ RelativePath="arch\Lights\LightsDriver_SystemMessage.h" > + + + + diff --git a/src/StepMania-net2010.vcxproj b/src/StepMania-net2010.vcxproj index 14303661dc..a296a39375 100644 --- a/src/StepMania-net2010.vcxproj +++ b/src/StepMania-net2010.vcxproj @@ -580,6 +580,7 @@ cl /Zl /nologo /c verstub.cpp /Fo$(IntDir) + @@ -1898,6 +1899,7 @@ cl /Zl /nologo /c verstub.cpp /Fo$(IntDir) + diff --git a/src/StepMania-net2010.vcxproj.filters b/src/StepMania-net2010.vcxproj.filters index 718d8b3c93..94642bc4c2 100644 --- a/src/StepMania-net2010.vcxproj.filters +++ b/src/StepMania-net2010.vcxproj.filters @@ -747,6 +747,9 @@ StepMania\arch\Lights + + StepMania\arch\Lights + StepMania\arch\Lights @@ -2270,6 +2273,9 @@ StepMania\arch\Lights + + StepMania\arch\Lights + StepMania\arch\Lights diff --git a/src/StepMania-net2011.vcxproj b/src/StepMania-net2011.vcxproj index 901f8608db..1424c89ba2 100644 --- a/src/StepMania-net2011.vcxproj +++ b/src/StepMania-net2011.vcxproj @@ -606,6 +606,7 @@ cl /Zl /nologo /c verstub.cpp /Fo"$(IntDir)" + @@ -1484,6 +1485,7 @@ cl /Zl /nologo /c verstub.cpp /Fo"$(IntDir)" + diff --git a/src/StepMania-net2011.vcxproj.filters b/src/StepMania-net2011.vcxproj.filters index 22f3d05525..b230a7d580 100644 --- a/src/StepMania-net2011.vcxproj.filters +++ b/src/StepMania-net2011.vcxproj.filters @@ -735,6 +735,9 @@ StepMania\arch\Lights + + StepMania\arch\Lights + StepMania\arch\Lights @@ -2108,6 +2111,9 @@ StepMania\arch\Lights + + StepMania\arch\Lights + StepMania\arch\Lights diff --git a/src/StepMania-net2013.vcxproj b/src/StepMania-net2013.vcxproj index 8121d7e9cb..48656c83cd 100644 --- a/src/StepMania-net2013.vcxproj +++ b/src/StepMania-net2013.vcxproj @@ -605,6 +605,7 @@ cl /Zl /nologo /c verstub.cpp /Fo"$(IntDir)" + @@ -1923,6 +1924,7 @@ cl /Zl /nologo /c verstub.cpp /Fo"$(IntDir)" + diff --git a/src/StepMania-net2013.vcxproj.filters b/src/StepMania-net2013.vcxproj.filters index 4254fdd875..561138996c 100644 --- a/src/StepMania-net2013.vcxproj.filters +++ b/src/StepMania-net2013.vcxproj.filters @@ -747,6 +747,9 @@ StepMania\arch\Lights + + StepMania\arch\Lights + StepMania\arch\Lights @@ -2270,6 +2273,9 @@ StepMania\arch\Lights + + StepMania\arch\Lights + StepMania\arch\Lights diff --git a/src/arch/Lights/LightsDriver_Win32Minimaid.cpp b/src/arch/Lights/LightsDriver_Win32Minimaid.cpp new file mode 100644 index 0000000000..96326de09f --- /dev/null +++ b/src/arch/Lights/LightsDriver_Win32Minimaid.cpp @@ -0,0 +1,100 @@ +// LightsDriver_Win32Minimaid - driver for lights on the Minimaid with libmmmagic +/* To use, StepMania must be run with root permissions, or udev rule for the + * device must be made something like this (but it's not quite right): + * echo SUBSYSTEM==\"usb\", ATTR{idVendor}==\"beef\", ATTR{idProduct}==\"5730\", MODE=\"0666\" > /etc/udev/rules.d/50-minimaid + */ + +#include "global.h" +#include "LightsDriver_Win32Minimaid.h" +#include "windows.h" + +REGISTER_SOUND_DRIVER_CLASS( Win32Minimaid ); + +HINSTANCE hMMMAGICDLL = NULL; + +LightsDriver_Win32Minimaid::LightsDriver_Win32Minimaid() +{ + _mmmagic_loaded=false; + hMMMAGICDLL = LoadLibraryW(L"mmmagic.dll"); + if(hMMMAGICDLL == NULL) + { + MessageBox(NULL, "Could not LoadLibrary( mmmagic.dll ).", "ERROR", MB_OK ); + return; + } + _mmmagic_loaded=true; + + // Get the function pointers + mm_connect_minimaid = (MM_CONNECT_MINIMAID) GetProcAddress(hMMMAGICDLL, "mm_connect_minimaid"); + mm_setKB = (MM_SETKB) GetProcAddress(hMMMAGICDLL, "mm_setKB"); + mm_setDDRPad1Light = (MM_SETDDRPAD1LIGHT) GetProcAddress(hMMMAGICDLL, "mm_setDDRPad1Light"); + mm_setDDRPad2Light = (MM_SETDDRPAD2LIGHT) GetProcAddress(hMMMAGICDLL, "mm_setDDRPad2Light"); + mm_setDDRCabinetLight = (MM_SETCABINETLIGHT) GetProcAddress(hMMMAGICDLL, "mm_setDDRCabinetLight"); + mm_setDDRBassLight = (MM_SETDDRBASSLIGHT) GetProcAddress(hMMMAGICDLL, "mm_setDDRBassLight"); + mm_setDDRAllOn = (MM_SETDDRALLON) GetProcAddress(hMMMAGICDLL, "mm_setDDRAllOn"); + mm_setDDRAllOff = (MM_SETDDRALLOFF) GetProcAddress(hMMMAGICDLL, "mm_setDDRAllOff"); + mm_setBlueLED = (MM_SETBLUELED) GetProcAddress(hMMMAGICDLL, "mm_setBlueLED"); + mm_setMMOutputReports = (MM_SETMMOUTPUTREPORTS) GetProcAddress(hMMMAGICDLL, "mm_setMMOutputReports"); + mm_sendDDRMiniMaidUpdate= (MM_SENDDDRMINIMAIDUPDATE) GetProcAddress(hMMMAGICDLL, "mm_sendDDRMiniMaidUpdate"); + mm_connect_minimaid(); + mm_setKB(true); +} + +LightsDriver_Win32Minimaid::~LightsDriver_Win32Minimaid() +{ + if(_mmmagic_loaded) + FreeLibrary( hMMMAGICDLL ); +} + +void LightsDriver_Win32Minimaid::Set( const LightsState *ls ) +{ + if(_mmmagic_loaded) + { + mm_setDDRAllOff(); + + // Set the cabinet light values + if (ls->m_bCabinetLights[LIGHT_MARQUEE_UP_LEFT]) mm_setDDRCabinetLight(DDR_DOUBLE_MARQUEE_UPPER_LEFT, 1); + if (ls->m_bCabinetLights[LIGHT_MARQUEE_UP_RIGHT]) mm_setDDRCabinetLight(DDR_DOUBLE_MARQUEE_UPPER_RIGHT, 1); + if (ls->m_bCabinetLights[LIGHT_MARQUEE_LR_LEFT]) mm_setDDRCabinetLight(DDR_DOUBLE_MARQUEE_LOWER_LEFT, 1); + if (ls->m_bCabinetLights[LIGHT_MARQUEE_LR_RIGHT]) mm_setDDRCabinetLight(DDR_DOUBLE_MARQUEE_LOWER_RIGHT, 1); + if (ls->m_bCabinetLights[LIGHT_BASS_LEFT] || ls->m_bCabinetLights[LIGHT_BASS_RIGHT]) mm_setDDRBassLight(DDR_DOUBLE_BASS_LIGHTS, 1); + + if (ls->m_bGameButtonLights[GameController_1][DANCE_BUTTON_LEFT]) mm_setDDRPad1Light(DDR_DOUBLE_PAD_LEFT, 1); + if (ls->m_bGameButtonLights[GameController_1][DANCE_BUTTON_RIGHT]) mm_setDDRPad1Light(DDR_DOUBLE_PAD_RIGHT, 1); + if (ls->m_bGameButtonLights[GameController_1][DANCE_BUTTON_UP]) mm_setDDRPad1Light(DDR_DOUBLE_PAD_UP, 1); + if (ls->m_bGameButtonLights[GameController_1][DANCE_BUTTON_DOWN]) mm_setDDRPad1Light(DDR_DOUBLE_PAD_DOWN, 1); + if (ls->m_bGameButtonLights[GameController_1][GAME_BUTTON_START]) mm_setDDRCabinetLight(DDR_DOUBLE_PLAYER1_PANEL, 1); + if (ls->m_bGameButtonLights[GameController_2][DANCE_BUTTON_LEFT]) mm_setDDRPad2Light(DDR_DOUBLE_PAD_LEFT, 1); + if (ls->m_bGameButtonLights[GameController_2][DANCE_BUTTON_RIGHT]) mm_setDDRPad2Light(DDR_DOUBLE_PAD_RIGHT, 1); + if (ls->m_bGameButtonLights[GameController_2][DANCE_BUTTON_UP]) mm_setDDRPad2Light(DDR_DOUBLE_PAD_UP, 1); + if (ls->m_bGameButtonLights[GameController_2][DANCE_BUTTON_DOWN]) mm_setDDRPad2Light(DDR_DOUBLE_PAD_DOWN, 1); + if (ls->m_bGameButtonLights[GameController_2][GAME_BUTTON_START]) mm_setDDRCabinetLight(DDR_DOUBLE_PLAYER2_PANEL, 1); + + // Output the information + mm_sendDDRMiniMaidUpdate(); + } +} + +/* + * (c) 2013 pkgingo + * 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. + */ diff --git a/src/arch/Lights/LightsDriver_Win32Minimaid.h b/src/arch/Lights/LightsDriver_Win32Minimaid.h new file mode 100644 index 0000000000..6bdaa59615 --- /dev/null +++ b/src/arch/Lights/LightsDriver_Win32Minimaid.h @@ -0,0 +1,99 @@ +/* LightsDriver_Win32Minimaid - Minimaid based lights with libmmmagic */ + +#ifndef LightsDriver_Win32Minimaid_H +#define LightsDriver_Win32Minimaid_H + +#include "LightsDriver.h" + +#define DDR_DOUBLE_BASS_LIGHTS 0 //unknown but guessed +#define DDR_DOUBLE_PLAYER1_PANEL 2 +#define DDR_DOUBLE_PLAYER2_PANEL 3 +#define DDR_DOUBLE_MARQUEE_LOWER_RIGHT 4 +#define DDR_DOUBLE_MARQUEE_UPPER_RIGHT 5 +#define DDR_DOUBLE_MARQUEE_LOWER_LEFT 6 +#define DDR_DOUBLE_MARQUEE_UPPER_LEFT 7 + +//PADX_LIGHTS +#define DDR_DOUBLE_PAD_UP 0 +#define DDR_DOUBLE_PAD_DOWN 1 +#define DDR_DOUBLE_PAD_LEFT 2 +#define DDR_DOUBLE_PAD_RIGHT 3 +#define DDR_DOUBLE_PAD_RESET 4 + +#define BIT(i) (1<<(i)) +#define BIT_IS_SET(v,i) ((v&BIT(i))!=0) + +static bool _mmmagic_loaded=false; + +typedef bool (*__BITVALID)(int); +static __BITVALID __bitValid; + +// minimaid prototypes +typedef void (*MM_SETDDRPAD1LIGHT)(int, int); +typedef void (*MM_SETDDRPAD2LIGHT)(int, int); +typedef void (*MM_SETCABINETLIGHT)(int, int); +typedef void (*MM_SETDDRBASSLIGHT)(int, int); +static MM_SETDDRPAD1LIGHT mm_setDDRPad1Light; +static MM_SETDDRPAD2LIGHT mm_setDDRPad2Light; +static MM_SETCABINETLIGHT mm_setDDRCabinetLight; +static MM_SETDDRBASSLIGHT mm_setDDRBassLight; + +typedef bool (*MM_CONNECT_MINIMAID)(); +typedef bool (*MM_SETKB)(bool val); +static MM_CONNECT_MINIMAID mm_connect_minimaid; +static MM_SETKB mm_setKB; + +typedef void (*MM_SETDDRALLON)(); +typedef void (*MM_SETDDRALLOFF)(); +static MM_SETDDRALLON mm_setDDRAllOn; +static MM_SETDDRALLOFF mm_setDDRAllOff; + +typedef void (*MM_SETBLUELED)(unsigned char); +typedef void (*MM_SETMMOUTPUTREPORTS)(unsigned char, unsigned char, unsigned char, unsigned char); +typedef bool (*MM_SENDDDRMINIMAIDUPDATE)(); +static MM_SETBLUELED mm_setBlueLED; +static MM_SETMMOUTPUTREPORTS mm_setMMOutputReports; +static MM_SENDDDRMINIMAIDUPDATE mm_sendDDRMiniMaidUpdate; + +typedef void (*MM_INIT)(); +typedef void (*MM_TURNON)(unsigned char, int); +typedef bool (*MM_TURNOFF)(unsigned char, int); +static MM_INIT mm_init; +static MM_TURNON mm_turnON; +static MM_TURNOFF mm_turnOFF; + +class LightsDriver_Win32Minimaid : public LightsDriver +{ +public: + LightsDriver_Win32Minimaid(); + + virtual ~LightsDriver_Win32Minimaid(); + virtual void Set( const LightsState *ls ); +}; + +#endif + +/* + * (c) 2013 pkgingo + * 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. + */ From aa564628c58712f493ff8f0e205239608bcea0fb Mon Sep 17 00:00:00 2001 From: Kyzentun Date: Tue, 8 Jul 2014 17:24:09 -0600 Subject: [PATCH 07/80] Changed InputFilter to not assert on unrecognized input devices or buttons. --- src/InputFilter.cpp | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/InputFilter.cpp b/src/InputFilter.cpp index 82bbe14e64..00d8228f9c 100644 --- a/src/InputFilter.cpp +++ b/src/InputFilter.cpp @@ -170,8 +170,17 @@ void InputFilter::ButtonPressed( const DeviceInput &di ) if( di.ts.IsZero() ) LOG->Warn( "InputFilter::ButtonPressed: zero timestamp is invalid" ); - ASSERT_M( di.device < NUM_InputDevice, ssprintf("Invalid device %i", di.device) ); - ASSERT_M( di.button < NUM_DeviceButton, ssprintf("Invalid button %i", di.button) ); + // Filter out input that is beyond the range of the current system. + if(di.device >= NUM_InputDevice) + { + LOG->Trace("InputFilter::ButtonPressed: Invalid device %i", di.device); + return; + } + if(di.button >= NUM_DeviceButton) + { + LOG->Trace("InputFilter::ButtonPressed: Invalid button %i", di.button); + return; + } ButtonState &bs = GetButtonState( di ); From 63311ab62f98f24d3ab637735b0973bcc6ded4f4 Mon Sep 17 00:00:00 2001 From: Kyzentun Date: Tue, 8 Jul 2014 20:01:33 -0600 Subject: [PATCH 08/80] Moved error reporting to ScreenSystemLayer error.lua. ScreenSystemLayer overlay/default.lua restored to previous. Error messages are now broadcast with the ScriptError message instead of SystemMessage. Added show/hide error messages toggle and clear error messages to debug menu. Nuked ScreenConsoleOverlay for being unfinished and duplicating ScreenSystemLayer. Changed Actor:tween and Tween::CreateFromStack to use ReportScriptError on invalid tween params. Changed some OptionRowList things to use ReportScriptError on invalid metrics. --- .../BGAnimations/ScreenSystemLayer error.lua | 218 ++++++++++++++++++ .../ScreenSystemLayer errorbg.lua | 14 -- .../ScreenSystemLayer overlay/default.lua | 162 ++----------- Themes/_fallback/Languages/en.ini | 2 + Themes/_fallback/metrics.ini | 12 +- src/Actor.cpp | 5 +- src/DynamicActorScroller.cpp | 10 +- src/LuaManager.cpp | 6 +- src/OptionRowHandler.cpp | 27 ++- src/ScreenDebugOverlay.cpp | 34 ++- src/ScreenSystemLayer.cpp | 4 +- src/ScreenSystemLayer.h | 1 + src/Tween.cpp | 5 +- 13 files changed, 321 insertions(+), 179 deletions(-) create mode 100644 Themes/_fallback/BGAnimations/ScreenSystemLayer error.lua delete mode 100644 Themes/_fallback/BGAnimations/ScreenSystemLayer errorbg.lua diff --git a/Themes/_fallback/BGAnimations/ScreenSystemLayer error.lua b/Themes/_fallback/BGAnimations/ScreenSystemLayer error.lua new file mode 100644 index 0000000000..4a675d2875 --- /dev/null +++ b/Themes/_fallback/BGAnimations/ScreenSystemLayer error.lua @@ -0,0 +1,218 @@ +-- If you are a common themer, DO NOT INCLUDE THIS FILE IN YOUR THEME. +-- This layer is purely for error reporting, so that you can see errors on screen easily while running stepmania. +-- If you include this file in your theme, you will not benefit from any improvements in error reporting. +-- If you want a different background behind the errors, then include "ScreenSystemLayer errorbg.lua" in your theme. +-- If you want to adjust how long errors stay on screen for, call the "SetErrorMessageTime" function. (see usage notes in comments above that function) + +-- Minor text formatting functions from Kyzentun. +-- TODO: Figure out why BitmapText:maxwidth doesn't do what I want. +local function width_limit_text(text, limit, natural_zoom) + natural_zoom= natural_zoom or 1 + if text:GetWidth() * natural_zoom > limit then + text:zoomx(limit / text:GetWidth()) + else + text:zoomx(natural_zoom) + end +end + +local function width_clip_text(text, limit) + local full_text= text:GetText() + local fits= text:GetZoomedWidth() <= limit + local prev_max= #full_text - 1 + local prev_min= 0 + if not fits then + while prev_max - prev_min > 1 do + local new_max= math.round((prev_max + prev_min) / 2) + text:settext(full_text:sub(1, 1+new_max)) + if text:GetZoomedWidth() <= limit then + prev_min= new_max + else + prev_max= new_max + end + end + text:settext(full_text:sub(1, 1+prev_min)) + end +end + +local function width_clip_limit_text(text, limit, natural_zoom) + natural_zoom= natural_zoom or text:GetZoomY() + local text_width= text:GetWidth() * natural_zoom + if text_width > limit * 2 then + text:zoomx(natural_zoom * .5) + width_clip_text(text, limit) + else + width_limit_text(text, limit, natural_zoom) + end +end + +local text_actors= {} +local line_height= 12 -- A good line height for Common Normal at .5 zoom. +local line_width= SCREEN_WIDTH - 20 + +local next_message_actor= 1 +local show_requested= false + +local min_message_time= {show= 1, hide= .03125} +local default_message_time= {show= 4, hide= .125} +local message_time= {} +for k, v in pairs(default_message_time) do + message_time[k]= v +end + +-- Example usage: +-- "SetErrorMessageTime('show' 5)" sets errors to show for 5 seconds before beginning to hide. +-- "SetErrorMessageTime('hide' .5)" sets errors to hide one error every .5 seconds after the show time has passed. +function SetErrorMessageTime(which, t) + if not min_message_time[which] then + MESSAGEMAN:Broadcast( + "ScriptError", { + Message= "Attempted to set invalid overlay message time field: " .. + tostring(which)}) + return + end + if t < min_message_time[which] then + MESSAGEMAN:Broadcast( + "ScriptError", { + Message= "Attempted to set overlay message " .. which .. + " time to below minimum of " .. min_message_time[which] .. "."}) + return + end + Trace("Setting error message " .. which .. " time to " .. t) + message_time[which]= t +end + +function GetErrorMessageTime(which) + return message_time[which] +end + +function GetErrorMessageTimeMin(which) + return min_message_time[which] +end + +function GetErrorMessageTimeDefault(which) + return default_message_time[which] +end + +local frame_args= { + Name="Error frame", + InitCommand= function(self) + self:y(-SCREEN_HEIGHT) + end, + ScriptErrorMessageCommand = function(self, params) + show_requested= false + self:stoptweening() + self:visible(true) + local covered_height= math.min(line_height * next_message_actor, SCREEN_HEIGHT) + self:y(-SCREEN_HEIGHT + covered_height) + self:sleep(message_time.show) + self:queuecommand("DecNextActor") + -- Shift the text on all the actors being shown up by one. + for i= next_message_actor, 1, -1 do + if text_actors[i] then + text_actors[i]:visible(true) + if i > 1 and text_actors[i-1] then + text_actors[i]:settext(text_actors[i-1]:GetText()) + else + text_actors[i]:settext(params.Message) + end + width_clip_limit_text(text_actors[i], line_width) + end + end + if next_message_actor <= #text_actors then + next_message_actor= next_message_actor + 1 + end + end, + ToggleErrorsMessageCommand= function(self, params) + if show_requested then + self:playcommand("HideErrors") + else + self:playcommand("ShowErrors") + end + end, + ShowErrorsMessageCommand= function(self, params) + show_requested= true + for i, mactor in ipairs(text_actors) do + if mactor:GetText() ~= "" then + mactor:visible(true) + next_message_actor= next_message_actor + 1 + end + end + next_message_actor= next_message_actor - 1 + local covered_height= math.min(line_height * next_message_actor, SCREEN_HEIGHT) + self:stoptweening() + self:visible(true) + self:linear(message_time.hide) + self:y(-SCREEN_HEIGHT + covered_height) + end, + HideErrorsMessageCommand= function(self, params) + if not show_requested then return end + show_requested= false + self:stoptweening() + next_message_actor= 1 + self:linear(message_time.hide) + self:y(-SCREEN_HEIGHT) + self:queuecommand("HideText") + end, + ClearErrorsMessageCommand= function(self, params) + -- This is so that someone using ShowErrorsMessageCommand can clear ones + -- they've dealt with. + -- Only allow clearing errors that we have scrolled off screen. + for i, mactor in ipairs(text_actors) do + if not mactor:GetVisible() then + mactor:settext("") + end + end + end, + DecNextActorCommand= function(self) + self:linear(message_time.hide) + self:y(self:GetY()-line_height) + if text_actors[next_message_actor] then + text_actors[next_message_actor]:visible(false) + end + next_message_actor= next_message_actor - 1 + if next_message_actor > 1 then + self:queuecommand("DecNextActor") + else + self:queuecommand("Off") + end + end, + HideTextCommand= function(self) + for i, mactor in ipairs(text_actors) do + mactor:visible(false) + end + end, + OffCommand= cmd(visible,false), + Def.Quad { + Name= "errorbg", + InitCommand= function(self) + self:setsize(SCREEN_WIDTH, SCREEN_HEIGHT) + self:horizalign(left) + self:vertalign(top) + self:diffuse(color("0,0,0,0")) + self:diffusealpha(.85) + end, + } +} +-- Create enough text actors that we can fill the screen. +local num_text= SCREEN_HEIGHT / line_height +for i= 1, num_text do + frame_args[#frame_args+1]= LoadFont("Common","Normal") .. { + Name="Text" .. i, + InitCommand= function(self) + -- Put them in the list in reverse order so the ones at the bottom of the screen are used first. + text_actors[num_text-i+1]= self + self:horizalign(left) + self:vertalign(top) + self:x(SCREEN_LEFT + 10) + self:y(SCREEN_TOP + (line_height * (i-1)) + 2) + self:shadowlength(1) + self:zoom(.5) + self:visible(false) + end, + OffCommand= cmd(visible,false), + } +end + +Trace("Loaded error layer.") + +return Def.ActorFrame(frame_args) diff --git a/Themes/_fallback/BGAnimations/ScreenSystemLayer errorbg.lua b/Themes/_fallback/BGAnimations/ScreenSystemLayer errorbg.lua deleted file mode 100644 index 94615c7876..0000000000 --- a/Themes/_fallback/BGAnimations/ScreenSystemLayer errorbg.lua +++ /dev/null @@ -1,14 +0,0 @@ -return Def.ActorFrame{ - Def.Quad { - Name= "erp", - InitCommand= function(self) - self:setsize(SCREEN_WIDTH, SCREEN_HEIGHT) - self:horizalign(left) - self:vertalign(top) - self:diffuse(color("0,0,0,0")) - self:diffusealpha(.85) - end, - SetCoveredHeightCommand= function(self, param) - end - } -} diff --git a/Themes/_fallback/BGAnimations/ScreenSystemLayer overlay/default.lua b/Themes/_fallback/BGAnimations/ScreenSystemLayer overlay/default.lua index f2c09ff8a4..0e638d6afe 100644 --- a/Themes/_fallback/BGAnimations/ScreenSystemLayer overlay/default.lua +++ b/Themes/_fallback/BGAnimations/ScreenSystemLayer overlay/default.lua @@ -64,147 +64,27 @@ t[#t+1] = Def.ActorFrame { CreditsText( PLAYER_2 ); }; -- Text - --- Minor text formatting functions from Kyzentun. --- TODO: Figure out why BitmapText:maxwidth doesn't do what I want. -local function width_limit_text(text, limit, natural_zoom) - natural_zoom= natural_zoom or 1 - if text:GetWidth() * natural_zoom > limit then - text:zoomx(limit / text:GetWidth()) - else - text:zoomx(natural_zoom) - end -end - -local function width_clip_text(text, limit) - local full_text= text:GetText() - local fits= text:GetZoomedWidth() <= limit - local prev_max= #full_text - 1 - local prev_min= 0 - if not fits then - while prev_max - prev_min > 1 do - local new_max= math.round((prev_max + prev_min) / 2) - text:settext(full_text:sub(1, 1+new_max)) - if text:GetZoomedWidth() <= limit then - prev_min= new_max - else - prev_max= new_max - end - end - text:settext(full_text:sub(1, 1+prev_min)) - end -end - -local function width_clip_limit_text(text, limit, natural_zoom) - natural_zoom= natural_zoom or text:GetZoomY() - local text_width= text:GetWidth() * natural_zoom - if text_width > limit * 2 then - text:zoomx(natural_zoom * .5) - width_clip_text(text, limit) - else - width_limit_text(text, limit, natural_zoom) - end -end - -local errorbg -local err_frame -local text_actors= {} -local line_height= 12 -- A good line height for Common Normal at .5 zoom. -local line_width= SCREEN_WIDTH - 20 - -local next_message_actor= 1 - -local min_message_time= { show= 4, hide= .125} -local message_time= { - show= min_message_time.show, hide= min_message_time.hide} - -function SetOverlayMessageTime(t, which) - if not min_message_time[which] then - SCREENMAN:SystemMessage("Attempted to set invalid overlay message time field: " .. tostring(which)) - return - end - if t < min_message_time[which] then - SCREENMAN:SystemMessage( - "Attempted to set overlay message " .. which .. - " time to below minimum of " .. min_message_time[which] .. ".") - return - end - message_time[which]= t -end - -local errbg_actor= LoadActor(THEME:GetPathB("ScreenSystemLayer", "errorbg")) --- Force the name of the returned actor so that we can easily use playcommand on it later. -errbg_actor.Name= "errorbg" - -local frame_args= { - Name="Error frame", - InitCommand= function(self) - err_frame= self - errorbg= self:GetChild("errorbg") - self:y(-SCREEN_HEIGHT) - end, +t[#t+1] = Def.ActorFrame { + Def.Quad { + InitCommand=cmd(zoomtowidth,SCREEN_WIDTH;zoomtoheight,30;horizalign,left;vertalign,top;y,SCREEN_TOP;diffuse,color("0,0,0,0")); + OnCommand=cmd(finishtweening;diffusealpha,0.85;); + OffCommand=cmd(sleep,3;linear,0.5;diffusealpha,0;); + }; + LoadFont("Common","Normal") .. { + Name="Text"; + InitCommand=cmd(maxwidth,750;horizalign,left;vertalign,top;y,SCREEN_TOP+10;x,SCREEN_LEFT+10;shadowlength,1;diffusealpha,0;); + OnCommand=cmd(finishtweening;diffusealpha,1;zoom,0.5); + OffCommand=cmd(sleep,3;linear,0.5;diffusealpha,0;); + }; SystemMessageMessageCommand = function(self, params) - err_frame:stoptweening() - err_frame:visible(true) - local covered_height= line_height * (next_message_actor-1) - err_frame:y(-SCREEN_HEIGHT + covered_height) - if errorbg then - errorbg:playcommand("SetCoveredHeight", {height= covered_height}) + self:GetChild("Text"):settext( params.Message ); + self:playcommand( "On" ); + if params.NoAnimate then + self:finishtweening(); end - err_frame:sleep(message_time.show) - err_frame:queuecommand("DecNextActor") - -- Shift the text on all the actors being shown up by one. - for i= next_message_actor, 1, -1 do - if text_actors[i] then - text_actors[i]:visible(true) - if i > 1 and text_actors[i-1] then - text_actors[i]:settext(text_actors[i-1]:GetText()) - else - text_actors[i]:settext(params.Message) - end - width_clip_limit_text(text_actors[i], line_width) - end - end - if next_message_actor <= #text_actors and not params.NoAnimate then - next_message_actor= next_message_actor + 1 - end - end, - DecNextActorCommand= function(self) - self:linear(message_time.hide) - self:y(self:GetY()-line_height) - if text_actors[next_message_actor] then - text_actors[next_message_actor]:visible(false) - end - next_message_actor= next_message_actor - 1 - if next_message_actor > 1 then - self:queuecommand("DecNextActor") - else - self:queuecommand("Off") - end - end, - OffCommand= cmd(visible,false), - HideSystemMessageMessageCommand = cmd(finishtweening), - errbg_actor, -} --- Create enough text actors that we can fill the screen. -local num_text= SCREEN_HEIGHT / line_height -for i= 1, num_text do - frame_args[#frame_args+1]= LoadFont("Common","Normal") .. { - Name="Text" .. i, - InitCommand= function(self) - -- Put them in the list in reverse order so the ones at the bottom of the screen are used first. - text_actors[num_text-i+1]= self - self:horizalign(left) - self:vertalign(top) - self:x(SCREEN_LEFT + 10) - self:y(SCREEN_TOP + (line_height * (i-1)) + 2) - self:shadowlength(1) - self:zoom(.5) - self:visible(false) - end, - OffCommand= cmd(visible,false), - } -end -t[#t+1] = Def.ActorFrame(frame_args) + self:playcommand( "Off" ); + end; + HideSystemMessageMessageCommand = cmd(finishtweening); +}; -return t +return t; diff --git a/Themes/_fallback/Languages/en.ini b/Themes/_fallback/Languages/en.ini index 448a35b2e7..0eb3886c49 100644 --- a/Themes/_fallback/Languages/en.ini +++ b/Themes/_fallback/Languages/en.ini @@ -1301,6 +1301,7 @@ Assist=Assist AutoPlay=AutoPlay Autosync=Autosync CPU=CPU +Clear Errors=Clear Errors Clear Profile Stats=Clear Profile Scores CoinMode=CoinMode Debug Menu=Debug Menu @@ -1328,6 +1329,7 @@ Show Masks=Show Masks Slow=Slow Song=Song Tempo=Tempo +Toggle Errors=Toggle Show Errors Uptime=Uptime Visual Delay Down=Visual Delay Down Visual Delay Up=Visual Delay Up diff --git a/Themes/_fallback/metrics.ini b/Themes/_fallback/metrics.ini index 8fe8fda8da..66c3de676d 100644 --- a/Themes/_fallback/metrics.ini +++ b/Themes/_fallback/metrics.ini @@ -57,7 +57,7 @@ SelectMusicScreen="ScreenSelectMusic" # Screens that show over everything else. # Only mess with this if you know what you're doing. -OverlayScreens="ScreenSystemLayer,ScreenSyncOverlay,ScreenStatsOverlay,ScreenDebugOverlay,ScreenConsoleOverlay,ScreenInstallOverlay" +OverlayScreens="ScreenSystemLayer,ScreenSyncOverlay,ScreenStatsOverlay,ScreenDebugOverlay,ScreenInstallOverlay" # Used in PlayerStageStats for formatting scores. PercentScoreDecimalPlaces=2 @@ -1580,16 +1580,6 @@ CreditsP2ScreenChangedMessageCommand=queuecommand,"UpdateVisible";queuecommand," CreditsP2OnCommand=horizalign,right;vertalign,bottom;zoom,0.675;shadowlength,1; CreditsP2OffCommand= -[ScreenConsoleOverlay] -Class="ScreenSystemLayer" -Fallback="ScreenSystemLayer" -# -CreditsInitCommand=visible,false;zoom,0 -CreditsP1X=-9999 -CreditsP2X=-9999 -CreditsP1Y=-9999 -CreditsP2Y=-9999 - [ScreenInstallOverlay] Class="ScreenInstallOverlay" Fallback="Screen" diff --git a/src/Actor.cpp b/src/Actor.cpp index f3e580dce1..5d96198cf1 100644 --- a/src/Actor.cpp +++ b/src/Actor.cpp @@ -1458,7 +1458,10 @@ public: return 0; } ITween *pTween = ITween::CreateFromStack( L, 2 ); - p->BeginTweening(fTime, pTween); + if(pTween != NULL) + { + p->BeginTweening(fTime, pTween); + } return 0; } static int stoptweening( T* p, lua_State * ) { p->StopTweening(); return 0; } diff --git a/src/DynamicActorScroller.cpp b/src/DynamicActorScroller.cpp index 2cf6ead5af..b8f4cc7d86 100644 --- a/src/DynamicActorScroller.cpp +++ b/src/DynamicActorScroller.cpp @@ -18,7 +18,15 @@ void DynamicActorScroller::LoadFromNode( const XNode *pNode ) * * Make one extra copy if masking is enabled. */ if( m_SubActors.size() != 1 ) - RageException::Throw( "%s: DynamicActorScroller: loaded %i nodes; require exactly one", ActorUtil::GetWhere(pNode).c_str(), (int)m_SubActors.size() ); + { + LuaHelpers::ReportScriptErrorFmt("%s: DynamicActorScroller: loaded %i nodes; require exactly one", ActorUtil::GetWhere(pNode).c_str(), (int)m_SubActors.size()); + // Remove all but one. + for( size_t i=1; i // conversion for lua functions. #include @@ -801,7 +801,9 @@ void LuaHelpers::ReportScriptError(RString const& Error, RString ErrorType) { short_error= Error.substr(0, line_break_pos); } - SCREENMAN->SystemMessage(short_error); + Message msg("ScriptError"); + msg.SetParam("Message", short_error); + MESSAGEMAN->Broadcast(msg); LOG->Warn(Error.c_str()); Dialog::OK(Error, ErrorType); } diff --git a/src/OptionRowHandler.cpp b/src/OptionRowHandler.cpp index 03294998b0..1c442976cb 100644 --- a/src/OptionRowHandler.cpp +++ b/src/OptionRowHandler.cpp @@ -153,7 +153,10 @@ public: // Parse the basic configuration metric. Commands lCmds = ParseCommands( ENTRY(sParam) ); if( lCmds.v.size() < 1 ) - RageException::Throw( "Parse error in \"ScreenOptionsMaster::%s\".", sParam.c_str() ); + { + LuaHelpers::ReportScriptErrorFmt("Parse error in \"ScreenOptionsMaster::%s\".", sParam.c_str()); + lCmds= ParseCommands("0"); + } m_Def.m_bOneChoiceForAllPlayers = false; const int NumCols = StringToInt( lCmds.v[0].m_vsArgs[0] ); @@ -195,10 +198,20 @@ public: } else { - RageException::Throw( "Unkown row flag \"%s\".", sName.c_str() ); + LuaHelpers::ReportScriptErrorFmt( "Unkown row flag \"%s\".", sName.c_str() ); } } + if(NumCols < 1) + { + LuaHelpers::ReportScriptErrorFmt(sParam + " has %d choices.", NumCols); + GameCommand mc; + mc.ApplyCommitsScreens( false ); + mc.Load( 0, ParseCommands("name,Error") ); + m_aListEntries.push_back(mc); + RString sChoice = mc.m_sName; + m_Def.m_vsChoices.push_back( sChoice ); + } for( int col = 0; col < NumCols; ++col ) { GameCommand mc; @@ -209,17 +222,19 @@ public: if( mc.m_sName == "" && NumCols == 1 ) mc.m_sName = sParam; if( mc.m_sName == "" ) - RageException::Throw( "List \"%s\", col %i has no name.", sParam.c_str(), col ); + { + LuaHelpers::ReportScriptErrorFmt("List \"%s\", col %i has no name.", sParam.c_str(), col); + mc.m_sName= ""; + } if( !mc.IsPlayable() ) { - LOG->Trace( "\"%s\" is not playable.", sParam.c_str() ); + LuaHelpers::ReportScriptErrorFmt("\"%s\" is not playable.", sParam.c_str()); continue; } m_aListEntries.push_back( mc ); - RString sName = mc.m_sName; RString sChoice = mc.m_sName; m_Def.m_vsChoices.push_back( sChoice ); } @@ -543,7 +558,7 @@ public: } else { - RageException::Throw( "Invalid StepsType param \"%s\".", sParam.c_str() ); + LuaHelpers::ReportScriptErrorFmt("Invalid StepsType param \"%s\".", sParam.c_str()); } m_Def.m_sName = sParam; diff --git a/src/ScreenDebugOverlay.cpp b/src/ScreenDebugOverlay.cpp index e931f38e42..bb323496d7 100644 --- a/src/ScreenDebugOverlay.cpp +++ b/src/ScreenDebugOverlay.cpp @@ -549,6 +549,8 @@ static LocalizedString RESTART ( "ScreenDebugOverlay", "Restart" ); static LocalizedString SCREEN_ON ( "ScreenDebugOverlay", "Send On To Screen" ); static LocalizedString SCREEN_OFF ( "ScreenDebugOverlay", "Send Off To Screen" ); static LocalizedString RELOAD_OVERLAY_SCREENS( "ScreenDebugOverlay", "Reload Overlay Screens" ); +static LocalizedString TOGGLE_ERRORS( "ScreenDebugOverlay", "Toggle Errors" ); +static LocalizedString CLEAR_ERRORS( "ScreenDebugOverlay", "Clear Errors" ); static LocalizedString RELOAD_THEME_AND_TEXTURES( "ScreenDebugOverlay", "Reload Theme and Textures" ); static LocalizedString WRITE_PROFILES ( "ScreenDebugOverlay", "Write Profiles" ); static LocalizedString WRITE_PREFERENCES ( "ScreenDebugOverlay", "Write Preferences" ); @@ -1039,8 +1041,36 @@ class DebugLineReloadOverlayScreens : public IDebugLine virtual RString GetPageName() const { return "Theme"; } virtual void DoAndLog( RString &sMessageOut ) { - IDebugLine::DoAndLog(sMessageOut); SCREENMAN->ReloadOverlayScreensAfterInputFinishes(); + IDebugLine::DoAndLog(sMessageOut); + } +}; + +class DebugLineToggleErrors : public IDebugLine +{ + virtual RString GetDisplayTitle() { return TOGGLE_ERRORS.GetValue(); } + virtual RString GetDisplayValue() { return RString(); } + virtual bool IsEnabled() { return true; } + virtual RString GetPageName() const { return "Theme"; } + virtual void DoAndLog( RString &sMessageOut ) + { + Message msg("ToggleErrors"); + MESSAGEMAN->Broadcast(msg); + IDebugLine::DoAndLog(sMessageOut); + } +}; + +class DebugLineClearErrors : public IDebugLine +{ + virtual RString GetDisplayTitle() { return CLEAR_ERRORS.GetValue(); } + virtual RString GetDisplayValue() { return RString(); } + virtual bool IsEnabled() { return true; } + virtual RString GetPageName() const { return "Theme"; } + virtual void DoAndLog( RString &sMessageOut ) + { + Message msg("ClearErrors"); + MESSAGEMAN->Broadcast(msg); + IDebugLine::DoAndLog(sMessageOut); } }; @@ -1227,6 +1257,8 @@ DECLARE_ONE( DebugLineCurrentScreenOn ); DECLARE_ONE( DebugLineCurrentScreenOff ); DECLARE_ONE( DebugLineReloadTheme ); DECLARE_ONE( DebugLineReloadOverlayScreens ); +DECLARE_ONE( DebugLineToggleErrors ); +DECLARE_ONE( DebugLineClearErrors ); DECLARE_ONE( DebugLineWriteProfiles ); DECLARE_ONE( DebugLineWritePreferences ); DECLARE_ONE( DebugLineMenuTimer ); diff --git a/src/ScreenSystemLayer.cpp b/src/ScreenSystemLayer.cpp index a705cb68df..49ba1637bc 100644 --- a/src/ScreenSystemLayer.cpp +++ b/src/ScreenSystemLayer.cpp @@ -155,8 +155,10 @@ void ScreenSystemLayer::Init() { Screen::Init(); - m_sprOverlay.Load( THEME->GetPathB("ScreenSystemLayer", "overlay") ); + m_sprOverlay.Load( THEME->GetPathB(m_sName, "overlay") ); this->AddChild( m_sprOverlay ); + m_errLayer.Load( THEME->GetPathB(m_sName, "error") ); + this->AddChild( m_errLayer ); } /* diff --git a/src/ScreenSystemLayer.h b/src/ScreenSystemLayer.h index b5a28e931a..08d4295fd2 100644 --- a/src/ScreenSystemLayer.h +++ b/src/ScreenSystemLayer.h @@ -13,6 +13,7 @@ public: private: AutoActor m_sprOverlay; + AutoActor m_errLayer; }; diff --git a/src/Tween.cpp b/src/Tween.cpp index 69021d0e14..99828d29f6 100644 --- a/src/Tween.cpp +++ b/src/Tween.cpp @@ -97,7 +97,10 @@ ITween *ITween::CreateFromStack( Lua *L, int iStackPos ) luaL_checktype( L, iStackPos+1, LUA_TTABLE ); int iArgs = lua_objlen( L, iStackPos+1 ); if( iArgs != 4 && iArgs != 8 ) - RageException::Throw( "CreateFromStack: table argument must have 4 or 8 entries" ); + { + LuaHelpers::ReportScriptErrorFmt("Tween::CreateFromStack: table argument must have 4 or 8 entries"); + return NULL; + } float fC[8]; for( int i = 0; i < iArgs; ++i ) From 3b1270b9097c3ecf49c23c218ae91fa0b1e3e14a Mon Sep 17 00:00:00 2001 From: freem Date: Wed, 9 Jul 2014 22:25:34 -0500 Subject: [PATCH 09/80] fix autogen freaking out after the Minimaid commit thanks to @spigwitmer for the fix --- configure.ac | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/configure.ac b/configure.ac index 283497289b..230986785f 100644 --- a/configure.ac +++ b/configure.ac @@ -175,6 +175,10 @@ powerpc*) esac AM_CONDITIONAL(HAVE_PARALLEL_PORT, test "${have_parallel_port-yes}" = "yes") +# Minimaid support flag +AC_ARG_WITH(minimaid, AS_HELP_STRING([--with-minimaid],[Enable Minimaid support]), with_minimaid=$withval, with_minimaid=no) +AM_CONDITIONAL(HAVE_MINIMAID, test "$with_minimaid" = "yes") + AC_C_BIGENDIAN( AC_DEFINE(ENDIAN_BIG, 1, [Big endian]), AC_DEFINE(ENDIAN_LITTLE, 1, [Little endian]), From 35052f29b4b996d6a173404048b5ce83e655b2d5 Mon Sep 17 00:00:00 2001 From: Pat Mac Date: Thu, 10 Jul 2014 04:00:43 +0000 Subject: [PATCH 10/80] Fixes issue #216 : Cannot build with --without-ffmpeg --- autoconf/m4/video.m4 | 1 + bundle/Makefile.am | 2 ++ 2 files changed, 3 insertions(+) diff --git a/autoconf/m4/video.m4 b/autoconf/m4/video.m4 index 8b7d94f924..a2788263dc 100644 --- a/autoconf/m4/video.m4 +++ b/autoconf/m4/video.m4 @@ -7,6 +7,7 @@ AC_ARG_WITH(static-ffmpeg, AS_HELP_STRING([--with-static-ffmpeg],[Statically lin AM_CONDITIONAL(STATIC_FFMPEG, test "$with_static_ffmpeg" = "yes") AC_ARG_WITH(system-ffmpeg, AS_HELP_STRING([--with-system-ffmpeg], [Use system instead of bundled ffmpeg (UNSUPPORTED)]), system_ffmpeg=yes, system_ffmpeg=no) AM_CONDITIONAL(SYSTEM_FFMPEG, test "$system_ffmpeg" = "yes") +AM_CONDITIONAL(WITHOUT_FFMPEG, test "$with_ffmpeg" != "yes") VIDEO_CFLAGS= VIDEO_LIBS= diff --git a/bundle/Makefile.am b/bundle/Makefile.am index f6a07544e2..896c503518 100644 --- a/bundle/Makefile.am +++ b/bundle/Makefile.am @@ -1,9 +1,11 @@ +if !WITHOUT_FFMPEG if !SYSTEM_FFMPEG all-local: cd ffmpeg && $(MAKE) if WINDOWS cp ffmpeg/*/*.dll .. endif +endif del-dlls: if WINDOWS From 08f3864191c6404841f92e39350be5e7f1e65974 Mon Sep 17 00:00:00 2001 From: sigatrev Date: Sat, 12 Jul 2014 09:30:32 -0500 Subject: [PATCH 11/80] SetGame method Added SetGame method to GameManager. Altered Stepmania::ChangeCurrentGame() to allow a second input, selecting which theme will be loaded after game is changed. --- src/GameManager.cpp | 40 ++++++++++++++++++++++++++++++++++++++++ src/StepMania.cpp | 6 ++++-- src/StepMania.h | 2 +- 3 files changed, 45 insertions(+), 3 deletions(-) diff --git a/src/GameManager.cpp b/src/GameManager.cpp index a6c9656c4f..6999da2a21 100644 --- a/src/GameManager.cpp +++ b/src/GameManager.cpp @@ -1,4 +1,6 @@ #include "global.h" +#include "Stepmania.h" +#include "arch/Dialog/Dialog.h" #include "GameManager.h" #include "GameConstantsAndTypes.h" #include "GameInput.h" // for GameButton constants @@ -3157,11 +3159,49 @@ public: return 1; } + static int GetEnabledGames( T* p, lua_State *L ) + { + vector aGames; + GAMEMAN->GetEnabledGames( aGames ); + + vector vsGames; + FOREACH( const Game*, aGames, g ) + { + RString sGameName = (*g)->m_szName; + vsGames.push_back( sGameName ); + } + LuaHelpers::CreateTableFromArray( vsGames, L ); + return 1; + } + + static int SetGame( T* p, lua_State *L ) + { + const Game *pGame = p->StringToGame(SArg(1)); + RString sTheme; + if( lua_gettop(L) >= 2 && !lua_isnil(L, 2) ) + { + sTheme = SArg(2); + } + if( pGame ) + { + StepMania::ChangeCurrentGame( pGame, sTheme ); + THEME->ReloadMetrics(); + } + else + { + LOG->Warn( "SetGame: Invalid Game, %s", pGame->m_szName ); + Dialog::OK( "SetGame: Invalid Game, %s", pGame->m_szName ); + } + return 0; + } + LunaGameManager() { ADD_METHOD( StepsTypeToLocalizedString ); ADD_METHOD( GetFirstStepsTypeForGame ); ADD_METHOD( IsGameEnabled ); + ADD_METHOD( GetEnabledGames ); + ADD_METHOD( SetGame ); }; }; diff --git a/src/StepMania.cpp b/src/StepMania.cpp index e6de401827..be90ff990e 100644 --- a/src/StepMania.cpp +++ b/src/StepMania.cpp @@ -808,7 +808,7 @@ static void SwitchToLastPlayedGame() StepMania::ChangeCurrentGame( pGame ); } -void StepMania::ChangeCurrentGame( const Game* g ) +void StepMania::ChangeCurrentGame( const Game* g, RString Theme ) { ASSERT( g != NULL ); ASSERT( GAMESTATE != NULL ); @@ -825,7 +825,9 @@ void StepMania::ChangeCurrentGame( const Game* g ) sAnnouncer = GAMESTATE->GetCurrentGame()->m_szName; if( sTheme.empty() ) sTheme = GAMESTATE->GetCurrentGame()->m_szName; - + if( Theme.size() ) + sTheme = Theme; + // process theme and language command line arguments; // these change the preferences in order for transparent loading -aj RString argTheme; diff --git a/src/StepMania.h b/src/StepMania.h index 00da5d0048..82baed076b 100644 --- a/src/StepMania.h +++ b/src/StepMania.h @@ -15,7 +15,7 @@ namespace StepMania void ResetGame(); RString GetInitialScreen(); RString GetSelectMusicScreen(); - void ChangeCurrentGame( const Game* g ); + void ChangeCurrentGame( const Game* g, RString Theme = "" ); // If successful, return filename of screenshot in sDir, else return "" RString SaveScreenshot( RString Dir, bool SaveCompressed, bool MakeSignature, RString NamePrefix, RString NameSuffix ); From bc1cb0c0ae3d776a00cf871c0bfc3526d37b79eb Mon Sep 17 00:00:00 2001 From: sigatrev Date: Sat, 12 Jul 2014 10:32:48 -0500 Subject: [PATCH 12/80] SetGame lua docs --- Docs/Luadoc/Lua.xml | 2 ++ Docs/Luadoc/LuaDocumentation.xml | 6 ++++++ 2 files changed, 8 insertions(+) diff --git a/Docs/Luadoc/Lua.xml b/Docs/Luadoc/Lua.xml index 27c291591a..f5033fc01f 100644 --- a/Docs/Luadoc/Lua.xml +++ b/Docs/Luadoc/Lua.xml @@ -723,6 +723,8 @@ + + diff --git a/Docs/Luadoc/LuaDocumentation.xml b/Docs/Luadoc/LuaDocumentation.xml index 77370ffcf2..c586d9894b 100644 --- a/Docs/Luadoc/LuaDocumentation.xml +++ b/Docs/Luadoc/LuaDocumentation.xml @@ -2173,6 +2173,12 @@ save yourself some time, copy this for undocumented things: Return the localized string representation of st. + + Returns a table of all selectable games. + + + Sets the current game to Game. The second argument is optional, and if provided will determine which theme is loaded when the game changes. If Stepmania was run with a commandline argument setting the theme, that will override the second argument of this function. + From fb1a251b7a1f5f27094e9d47bb7b21468b2314af Mon Sep 17 00:00:00 2001 From: Kyzentun Date: Sat, 12 Jul 2014 14:59:10 -0600 Subject: [PATCH 13/80] Changed many places that used RageException to use ReportScriptError instead. Wrote ScreenOptionsExample.ini as documentation example for the OptionRow system. Rewrote gamecommands.txt to include all GameCommands. Fixed Commands::GetOriginalCommandString to insert the semicolons that separated the original commands. Changed nonsensical boolean |= true statements in GameCommand.cpp to just use =. Added protection to ReportScriptError to keep it from recursing through itself when an error occurs in error reporting. Added UseAbort option to ReportScriptError for places that want to use an AbortRetryIgnore dialog to query the user. Added ScriptErrorMessage for places that need to handle the warning/dialog part separately. Added logging flag to MESSAGEMAN so that all messages broadcast can be logged when desired. Changed OptionRowHandler::LoadInternal to return a boolean success value as part of error handling. --- Docs/Luadoc/Lua.xml | 1 + Docs/Luadoc/LuaDocumentation.xml | 3 + .../Example_Screens/ScreenOptionsExample.ini | 128 +++++++++++++ Docs/Themerdocs/gamecommands.txt | 137 ++++++++++---- .../BGAnimations/ScreenSystemLayer error.lua | 7 +- src/Command.cpp | 6 + src/CommonMetrics.cpp | 18 +- src/CourseContentsList.cpp | 4 +- src/DifficultyIcon.cpp | 4 +- src/DifficultyList.cpp | 22 ++- src/GameCommand.cpp | 58 +++--- src/GameState.cpp | 5 +- src/HoldJudgment.cpp | 4 +- src/LuaManager.cpp | 27 ++- src/LuaManager.h | 13 +- src/MessageManager.cpp | 13 ++ src/MessageManager.h | 3 + src/MeterDisplay.cpp | 9 +- src/OptionRowHandler.cpp | 176 +++++++++--------- src/OptionRowHandler.h | 6 +- src/OptionsList.cpp | 5 +- src/PlayerAI.cpp | 50 +++-- src/ScreenManager.cpp | 27 ++- src/ScreenOptionsMaster.cpp | 6 +- src/ScreenSelect.cpp | 32 ++-- src/ScreenSelectMaster.cpp | 20 +- src/ScreenSelectMusic.cpp | 9 +- src/Sprite.cpp | 4 +- src/ThemeManager.cpp | 42 +++-- 29 files changed, 593 insertions(+), 246 deletions(-) create mode 100644 Docs/Themerdocs/Examples/Example_Screens/ScreenOptionsExample.ini diff --git a/Docs/Luadoc/Lua.xml b/Docs/Luadoc/Lua.xml index 27c291591a..c2297a38d2 100644 --- a/Docs/Luadoc/Lua.xml +++ b/Docs/Luadoc/Lua.xml @@ -925,6 +925,7 @@ + diff --git a/Docs/Luadoc/LuaDocumentation.xml b/Docs/Luadoc/LuaDocumentation.xml index 77370ffcf2..bee1948b6f 100644 --- a/Docs/Luadoc/LuaDocumentation.xml +++ b/Docs/Luadoc/LuaDocumentation.xml @@ -2769,6 +2769,9 @@ save yourself some time, copy this for undocumented things: second argument is an optional table of parameters. It may be omitted or explicitly set to nil. + + Sets whether logging of messages is enabled. If log is true, all messages that pass through Broadcast (from the engine for from the theme or from anywhere else), will be logged with Trace. + diff --git a/Docs/Themerdocs/Examples/Example_Screens/ScreenOptionsExample.ini b/Docs/Themerdocs/Examples/Example_Screens/ScreenOptionsExample.ini new file mode 100644 index 0000000000..b373987f2c --- /dev/null +++ b/Docs/Themerdocs/Examples/Example_Screens/ScreenOptionsExample.ini @@ -0,0 +1,128 @@ +# Try out this examply by copying these metrics into your metrics.ini. + +# Some elements will require entries to be added to the language file. Read Examples/LanguageFile.ini for instructions on adding entries to a language file. + +# Setting InitialScreen in the Common section just makes the theme start up in this screen. +# This is only done for ease of seeing this example in action, and is not part of making an options screen. +[Common] +InitialScreen="ScreenOptionsExample" + +# The screen must have a metrics section with its name. +[ScreenOptionsExample] +# The Fallback metric for the screen should be "ScreenOptionsMaster", to pull in necessary fallback metrics from that section. +Fallback="ScreenOptionsMaster" + +# The ForceAllPlayers metric will force join all players if set. +# This example sets it because the example runs when players would not otherwise be joined. +# An options screen that is meant to set song options between song select and gameplay should not set ForceAllPlayers to true. +ForceAllPlayers=true + +# NavigationMode controls how the cursor is used to navigate the screen. +# If it's not set by the theme, it defaults to the setting in Preferences.ini. +# "toggle" sets navigation to the preferred toggle style mode. In toggle mode, all options on all rows are treated as on/off toggled options. +# "menu" sets navigation to the menu style mode. In menu mode, each should have only a single option which sets a new screen when chosen. +# This example does not set NavigationMode because the default is what it wants. +# NavigationMode= + +# InputMode sets the input mode. This controls whether the players have separate cursors. +# "individual" means the players' cursors can be separated and move to different options. +# "together" means both players control the same cursor. +InputMode="individual" + +# LineNames sets the names of the rows on the screen. +# Names are separated by commas and can be anything that doesn't contain a comma. +# Each name will be appended to "Line" to find the metric that defines that line. So a line name of "a" will be defined by the metric "Linea". +LineNames="a,b,c,d,e,f,g,h,i,j,k,l,m,n" + +# Each line is defined by a metric that sets its type and arguments for that type. +# This example is going to include a simple example of each type. +# The types of option rows are: "list", "lua", "conf", "stepstype", "steps", "gamecommand". + +# The "list" row type takes a single argument: The subtype, or the metric that defines the elements of the list. +# The subtypes of list are: "NoteSkins", "Steps", "StepsLocked", "Characters", "Styles", "Groups", "Difficulties", "SongsInCurrentSongGroup". +# If the subtype is not one of the above, it is the name of the metric that defines the list. + +# This list example will create a list defined by a metric. +# A list that is defined by a metric requires entries in the language file for the option title and the option explanation. +# "list,Examples" requires an "Examples" entry in the "OptionTitles" and "OptionExplanations" sections of the language file. +# When looking for the metric that defines the list, the ScreenOptionsMaster section is searched. See the ScreenOptionsMaster section of this file for an explanation of the body of the list. +Linea="list,Examples" + +# The other list subtypes construct lists of GameCommands that execute specific actions. + +# The "NoteSkins" subtype constructs a list out of all noteskins available. +Lineb="list,NoteSkins" + +# The "Steps" subtype constructs a list out of the playable steps for the current song or course. Because this is an example screen and there is no current song set, no steps are in the list when this screen is used. +Linec="list,Steps" +# The "StepsLocked" subtype is identical to the "Steps" subtype, but forces all players to make the same choice. +Lined="list,StepsLocked" + +# The "Characters" subtype constructs a list out of the selectable dancers. +Linee="list,Characters" + +# The "Styles" subtype constructs a list ouf of all styles for the current game type. +Linef="list,Styles" + +# The "Groups" subtype constructs a list out of all the song groups. +Lineg="list,Groups" + +# The "Difficulties" subtype constructs a list of the difficulties in the "DifficultiesToShow" metric from the "Common" section. +Lineh="list,Difficulties" + +# The "SongsInCurrentSongGroup" subtype +Linei="list,SongsInCurrentSongGroup" + +# This is the end of the list subtype examples. + +# The "lua" row type takes a single argument, a chunk of lua to run which must return a table defining the row. Full explanation of the lua option row type can be found in Examples/OptionRowHandlerLua.lua. +# This example uses the "ArbitrarySpeedMods()" function just because I like it. +Linej="lua,ArbitrarySpeedMods()" + +# The "steps" row type creates choices for the different charts for the current song. It takes a single argument, "EditSteps" or "EditSourceSteps". Its purpose is currently unknown. +Linek="steps,EditSteps" + +# The "stepstype" row type is related to the "steps" row type and takes the same argument. Its purpose is also unknown. +Linel="stepstype,EditSteps" + +# The "conf" row type constructs a row for changing a conf option. conf options are the options in Preferences.ini and the argument is the name of the option to edit. +Linem="conf,AllowW1" + +# The "gamecommand" row type constructs a row with a single choice from a GameCommand and applies that GameCommand when the choice is chosen. +# Everything after the "gamecommand;" part of the row command is used to construct the GameCommand. +# Full documention on GameCommands can be found in gamecommands.txt. +# This example just makes a GameCommand that does nothing, but has a name. +Linen="gamecommand;name,ExampleCommand" + + +[ScreenOptionsMaster] +# The main metric defining the list is a command that sets the number of elements and some flags. All flags are optional, and most commonly will not be used. +# The number of elements must come first. +# Flags are separated by semicolons. +# Arguments to flags are separated by commas. +# Flags are: +# "together": Any choice chosen is applied to both players. +# "selectmultiple": Multiple choices on the row can be chosen. +# "selectone": One choice on the row can be chosen. +# "selectnone": No choice on the row can be chosen. +# selectmultiple, selectone, and selectnone are mutually exclusive. If more than one is set, only the last one applies. +# "showoneinrow": Only show one choice in the row. +# "default": Sets the default choice. Takes one argument, the number of the choice. "default,2" makes the second choice the default. +# "reloadrowmessages": Sets the messages that will cause the row to be reloaded. Arguments are the messages. +# "enabledforplayers": Sets which players are allowed to use the row. Arguments are numbers. +# "exportonchange": Sets whether the option is exported every time it changes. +# "broadcastonexport": Sets the messages that are broadcast when the row is exported. Arguments are the messages. +# Example line using all flags: +#Examples="4;together;selectmultiple;showoneinrow;default,3;reloadrowmessages,ExampleReload;enabledforplayers,1,2;exportonchange;broadcastonexport,ExampleExport" +Examples="4" + +# Each choice in the list is defined by a metric. The name of the metric is the name of the list with a comma and the id of the choice. +# So the first choice in our "Examples" list is defined by the metric "Examples,1". +# The metric defining a choice is a GameCommand. Full explanation of GameCommands is beyond the scope of this example. This example will only use the "name" part of a GameCommand. See gamecommands.txt for full documentation on GameCommands. +# The "name" part of a GameCommand sets the name for that GameCommand. There must be an entry for this name in the "OptionNames" section of the language file. +# A list also needs a Default entry, a command to apply if the none of the choices are selected. It can be empty, and it does not need a name. +ExamplesDefault="" +Examples,1="name,Ex1" +Examples,2="name,Ex2" +Examples,3="name,Ex3" +Examples,4="name,Ex4" diff --git a/Docs/Themerdocs/gamecommands.txt b/Docs/Themerdocs/gamecommands.txt index 8b2f11a277..bed2c60725 100644 --- a/Docs/Themerdocs/gamecommands.txt +++ b/Docs/Themerdocs/gamecommands.txt @@ -1,62 +1,123 @@ -all the known gamecommands (pre-sm-ssc) +GameCommands are constructed from subcommands separated by semicolons. +Subcommands are constructed from a command name and its arguments, separated by commas. +Each command takes its arguments and interprets them to set a property of the GameCommand. + +Most of the things that can be done through GameCommands can be done better through other means. GameCommand is kept around for compatibility with older versions and because ScreenOptionsMaster based screens often don't have the ability to use the better ways of doing things for their choices. + +Example command: +"name,Example;screen,ScreenInit" +This example creates a GameCommand with the name "Example" and its screen property set to "ScreenInit". + +When a GameCommand is applied, its properties are used to change things about the game. + +The various properties that can be set for a GameCommand are listed below, with their effects when applied. + +"announcer" +Sets the name of the announcer. The argument must be the name of the directoory of the announcer. + +"applydefaultoptions" +Applies the default options to the player. No argument. + +"clearcredits" +Clears any credits that have been inserted. No argument. + +"course" +Sets the current course to the argument. -"style" -"playmode" "difficulty" +Sets the difficulty property of this GameCommand. +Acceptable args are: +Beginner, Easy, Medium, Hard, Challenge, Edit -"announcer" {m_sAnnouncer = sValue;} +"fademusic" +Must have 2 args: The volume to fade out to and the seconds to spread the fade over. -"name" {m_sName = sValue;} +"goalcalories" +Sets the calorie goal of the player. -"text" {m_sText = sValue;} +"goaltype" +Sets the goal type of the player. Types are: Calories, Time, None. -"mod" {m_sPreferredModifiers += sValue;} - -"stagemod" {m_sStageModifiers += sValue;} +"insertcredit" +Inserts a credit. No arguments. "lua" +Sets a lua function to be run when this GameCommand is applied. -"screen" {m_sScreen = sValue;} +"mod" +Sets a modifier to be applied to the player(s). + +"name" +Sets the name of this GameCommand. For GameCommands used in option rows as choices, this is used to set the text that is shown on screen for the choice. + +"playmode" +The "playmode" game command controls what mode of play the game is in. This is a choice between the normal play mode and the various course or battle modes. The noral effects of the different playmodes are described in playmods.txt, though a theme can check the current playmode and do anything it pleases with that information. +Acceptable args are: +Regular, Nonstop, Oni, Endless, Battle, Rave + +"preparescreen" +Prepares the screen named by the argument when the command is applied. PrepareScreen takes time and blocks graphics, so this should not be used for screens that load a lot of data. + +"profileid" +Sets the default local profile ID of the player. + +"screen" +Sets the screen that will be transitioned to when this GameCommand is applied. + +"setenv" +Arguments are "key,value" pairs of environment variables to be set. Only capable of setting string values. + +"setpref" +Must have 2 args: The preference and the value to set it to. Preferences are listed in Preferences.ini. "song" -"steps" -"course" -"trail" +Sets the current song. The argument should be of the form "Group/SongName". -"setenv" { - if( cmd.m_vsArgs.size() == 3 ) - m_SetEnv[ cmd.m_vsArgs[1] ] = cmd.m_vsArgs[2]; } - -"songgroup" {m_sSongGroup = sValue;} +"songgroup" +Sets the preferred song group. Does not immediately change the group on the music wheel, but the preferred group is the group that will be open when ScreenSelectMusic starts. "sort" -{ - m_SortOrder = StringToSortOrder( sValue ); - if( m_SortOrder == SortOrder_Invalid ) - { - m_sInvalidReason = ssprintf( "SortOrder \"%s\" is not valid.", sValue.c_str() ); - m_bInvalid |= true; - } -} +Sets the sort order. Does not immediately change the sort on the music wheel, but the sort is the sort that will be used when ScreenSelectMusic starts. +Sort names are: +Preferred, Group, Title, BPM, Popularity, TopGrades, Artist, Genre, BeginnerMeter, EasyMeter, MediumMeter, HardMeter, ChallengeMeter, DoubleBeginnerMeter, DoubleEasyMeter, DoubleMediumMeter, DoubleHardMeter, DoubleChallengeMeter, ModeMenu, AllCourses, Nonstop, Oni, Endless, Length, Roulette, Recent. -"weight" {m_iWeightPounds = atoi( sValue );} +"sound" +Plays the sound at the path once. -"goalcalories" {m_iGoalCalories = atoi( sValue );} +"stagemod" +Sets a modifier to be applied to the stagemods. -"goaltype" {m_GoalType = StringToGoalType( sValue );} +"steps" +Sets the current steps to the steps at the specified difficulty for the current song. Emits an error if the song or the style is not already set when the GameCommand is parsed. -"profileid" {m_sProfileID = sValue;} +"stopmusic" +Stops the music that is currently playing. No argument. -"url" {m_sUrl = sValue;} +"style" +The "style" command is used to set the style of the game. The style of the game controls how many pads/players are used. Acceptable args depend on the game type. +For dance: single, versus, double, couple, solo, couple-edit, threepanel, routine +For pump: single, versus, halfdouble, double, couple, couple-edit, routine +For kb7: single, versus +For ez2: single, real, versus, versusReal, double +For para: single, versus +For ds3ddx: single +For beat: single5, versus5, double5, single7, versus7, double7 +For maniax: single, versus, double +For techno: single4, single5, single8, versus4, versus5, versus8, double4, double5, double8 +For popn: popn-five, popn-nine +For lights: cabinet -"sound" {m_sSoundPath = sValue;} +"text" +Sets the text property of the GameCommand. This is an alternative to the name field used by some screens. -"preparescreen" {m_vsScreensToPrepare.push_back( sValue );} +"trail" +Sets the current trail to the trail at the specified difficulty for the current course. Emits an error if the course or the style is not already set when the GameCommand is parsed. -"insertcredit" {m_bInsertCredit = true;} +"url" +Exits the game and launches a browser to visit the url. -"clearcredits" {m_bClearCredits = true;} +"urlnoexit" +Launches a browser to visit the url. -"stopmusic" {m_bStopMusic = true;} - -"applydefaultoptions" {m_bApplyDefaultOptions = true;} \ No newline at end of file +"weight" +Sets the weight of the player. diff --git a/Themes/_fallback/BGAnimations/ScreenSystemLayer error.lua b/Themes/_fallback/BGAnimations/ScreenSystemLayer error.lua index 4a675d2875..fed9f3808b 100644 --- a/Themes/_fallback/BGAnimations/ScreenSystemLayer error.lua +++ b/Themes/_fallback/BGAnimations/ScreenSystemLayer error.lua @@ -77,7 +77,6 @@ function SetErrorMessageTime(which, t) " time to below minimum of " .. min_message_time[which] .. "."}) return end - Trace("Setting error message " .. which .. " time to " .. t) message_time[which]= t end @@ -113,7 +112,11 @@ local frame_args= { if i > 1 and text_actors[i-1] then text_actors[i]:settext(text_actors[i-1]:GetText()) else - text_actors[i]:settext(params.Message) + -- Someone long ago decided that it was a good idea for "::" to be + -- a synonym for "\n", so that strings in metrics could have line + -- breaks. + -- So replace "::" with ":" so we don't have unwanted line breaks. + text_actors[i]:settext(params.Message:gsub("::", ":")) end width_clip_limit_text(text_actors[i], line_width) end diff --git a/src/Command.cpp b/src/Command.cpp index a0332f037b..cb004a53f2 100644 --- a/src/Command.cpp +++ b/src/Command.cpp @@ -83,7 +83,13 @@ RString Commands::GetOriginalCommandString() const { RString s; FOREACH_CONST( Command, v, c ) + { + if(s != "") + { + s += ";"; + } s += c->GetOriginalCommandString(); + } return s; } diff --git a/src/CommonMetrics.cpp b/src/CommonMetrics.cpp index 3635dd72a1..c8752192d8 100644 --- a/src/CommonMetrics.cpp +++ b/src/CommonMetrics.cpp @@ -44,8 +44,13 @@ void ThemeMetricDifficultiesToShow::Read() { Difficulty d = StringToDifficulty( *i ); if( d == Difficulty_Invalid ) - RageException::Throw( "Unknown difficulty \"%s\" in CourseDifficultiesToShow.", i->c_str() ); - m_v.push_back( d ); + { + LuaHelpers::ReportScriptErrorFmt("Unknown difficulty \"%s\" in CourseDifficultiesToShow.", i->c_str()); + } + else + { + m_v.push_back( d ); + } } } const vector& ThemeMetricDifficultiesToShow::GetValue() const { return m_v; } @@ -74,8 +79,13 @@ void ThemeMetricCourseDifficultiesToShow::Read() { CourseDifficulty d = StringToDifficulty( *i ); if( d == Difficulty_Invalid ) - RageException::Throw( "Unknown CourseDifficulty \"%s\" in CourseDifficultiesToShow.", i->c_str() ); - m_v.push_back( d ); + { + LuaHelpers::ReportScriptErrorFmt("Unknown CourseDifficulty \"%s\" in CourseDifficultiesToShow.", i->c_str()); + } + else + { + m_v.push_back( d ); + } } } const vector& ThemeMetricCourseDifficultiesToShow::GetValue() const { return m_v; } diff --git a/src/CourseContentsList.cpp b/src/CourseContentsList.cpp index 2566465c15..8475b05547 100644 --- a/src/CourseContentsList.cpp +++ b/src/CourseContentsList.cpp @@ -26,7 +26,9 @@ void CourseContentsList::LoadFromNode( const XNode* pNode ) const XNode *pDisplayNode = pNode->GetChild( "Display" ); if( pDisplayNode == NULL ) - RageException::Throw( "%s: CourseContentsList: missing the Display child", ActorUtil::GetWhere(pNode).c_str() ); + { + LuaHelpers::ReportScriptErrorFmt("%s: CourseContentsList: missing the Display child", ActorUtil::GetWhere(pNode).c_str()); + } for( int i=0; iGetChild( ssprintf("CursorP%i",pn+1) ); if( pChild == NULL ) - RageException::Throw( "%s: StepsDisplayList: missing the node \"CursorP%d\"", ActorUtil::GetWhere(pNode).c_str(), pn+1 ); - m_Cursors[pn].LoadActorFromNode( pChild, this ); + { + LuaHelpers::ReportScriptErrorFmt("%s: StepsDisplayList: missing the node \"CursorP%d\"", ActorUtil::GetWhere(pNode).c_str(), pn+1); + } + else + { + m_Cursors[pn].LoadActorFromNode( pChild, this ); + } /* Hack: we need to tween cursors both up to down (cursor motion) and visible to * invisible (fading). Cursor motion needs to stoptweening, so multiple motions @@ -62,10 +67,15 @@ void StepsDisplayList::LoadFromNode( const XNode* pNode ) * colors; I think we do need a diffuse color stack ... */ pChild = pNode->GetChild( ssprintf("CursorP%iFrame",pn+1) ); if( pChild == NULL ) - RageException::Throw( "%s: StepsDisplayList: missing the node \"CursorP%dFrame\"", ActorUtil::GetWhere(pNode).c_str(), pn+1 ); - m_CursorFrames[pn].LoadFromNode( pChild ); - m_CursorFrames[pn].AddChild( m_Cursors[pn] ); - this->AddChild( &m_CursorFrames[pn] ); + { + LuaHelpers::ReportScriptErrorFmt("%s: StepsDisplayList: missing the node \"CursorP%dFrame\"", ActorUtil::GetWhere(pNode).c_str(), pn+1); + } + else + { + m_CursorFrames[pn].LoadFromNode( pChild ); + m_CursorFrames[pn].AddChild( m_Cursors[pn] ); + this->AddChild( &m_CursorFrames[pn] ); + } } for( unsigned m = 0; m < m_Lines.size(); ++m ) diff --git a/src/GameCommand.cpp b/src/GameCommand.cpp index dbda6baa2b..02be6d13d0 100644 --- a/src/GameCommand.cpp +++ b/src/GameCommand.cpp @@ -251,7 +251,7 @@ void GameCommand::LoadOne( const Command& cmd ) if( m_pSong == NULL ) { m_sInvalidReason = ssprintf( "Song \"%s\" not found", sValue.c_str() ); - m_bInvalid |= true; + m_bInvalid = true; } } @@ -265,17 +265,23 @@ void GameCommand::LoadOne( const Command& cmd ) Song *pSong = (m_pSong != NULL)? m_pSong:GAMESTATE->m_pCurSong; const Style *pStyle = m_pStyle ? m_pStyle : GAMESTATE->GetCurrentStyle(); if( pSong == NULL || pStyle == NULL ) - RageException::Throw( "Must set Song and Style to set Steps." ); - - Difficulty dc = StringToDifficulty( sSteps ); - if( dc != Difficulty_Edit ) - m_pSteps = SongUtil::GetStepsByDifficulty( pSong, pStyle->m_StepsType, dc ); - else - m_pSteps = SongUtil::GetStepsByDescription( pSong, pStyle->m_StepsType, sSteps ); - if( m_pSteps == NULL ) { - m_sInvalidReason = "steps not found"; - m_bInvalid |= true; + LuaHelpers::ReportScriptError("Must set Song and Style to set Steps."); + m_sInvalidReason = "Song or Style not set"; + m_bInvalid = true; + } + else + { + Difficulty dc = StringToDifficulty( sSteps ); + if( dc != Difficulty_Edit ) + m_pSteps = SongUtil::GetStepsByDifficulty( pSong, pStyle->m_StepsType, dc ); + else + m_pSteps = SongUtil::GetStepsByDescription( pSong, pStyle->m_StepsType, sSteps ); + if( m_pSteps == NULL ) + { + m_sInvalidReason = "steps not found"; + m_bInvalid = true; + } } } } @@ -286,7 +292,7 @@ void GameCommand::LoadOne( const Command& cmd ) if( m_pCourse == NULL ) { m_sInvalidReason = ssprintf( "Course \"%s\" not found", sValue.c_str() ); - m_bInvalid |= true; + m_bInvalid = true; } } @@ -300,16 +306,22 @@ void GameCommand::LoadOne( const Command& cmd ) Course *pCourse = (m_pCourse != NULL)? m_pCourse:GAMESTATE->m_pCurCourse; const Style *pStyle = m_pStyle ? m_pStyle : GAMESTATE->GetCurrentStyle(); if( pCourse == NULL || pStyle == NULL ) - RageException::Throw( "Must set Course and Style to set Steps." ); - - const CourseDifficulty cd = StringToDifficulty( sTrail ); - ASSERT_M( cd != Difficulty_Invalid, ssprintf("Invalid difficulty '%s'", sTrail.c_str()) ); - - m_pTrail = pCourse->GetTrail( pStyle->m_StepsType, cd ); - if( m_pTrail == NULL ) { - m_sInvalidReason = "trail not found"; - m_bInvalid |= true; + LuaHelpers::ReportScriptError("Must set Course and Style to set Trail."); + m_sInvalidReason = "Course or Style not set"; + m_bInvalid = true; + } + else + { + const CourseDifficulty cd = StringToDifficulty( sTrail ); + ASSERT_M( cd != Difficulty_Invalid, ssprintf("Invalid difficulty '%s'", sTrail.c_str()) ); + + m_pTrail = pCourse->GetTrail( pStyle->m_StepsType, cd ); + if( m_pTrail == NULL ) + { + m_sInvalidReason = "trail not found"; + m_bInvalid = true; + } } } } @@ -331,7 +343,7 @@ void GameCommand::LoadOne( const Command& cmd ) if( m_SortOrder == SortOrder_Invalid ) { m_sInvalidReason = ssprintf( "SortOrder \"%s\" is not valid.", sValue.c_str() ); - m_bInvalid |= true; + m_bInvalid = true; } } @@ -406,7 +418,7 @@ void GameCommand::LoadOne( const Command& cmd ) if( pPref == NULL ) { m_sInvalidReason = ssprintf("unknown preference \"%s\"", cmd.m_vsArgs[1].c_str() ); - m_bInvalid |= true; + m_bInvalid = true; } pPref->FromString(cmd.m_vsArgs[2]); } diff --git a/src/GameState.cpp b/src/GameState.cpp index ba4da3ce06..0436e65a43 100644 --- a/src/GameState.cpp +++ b/src/GameState.cpp @@ -222,7 +222,10 @@ void GameState::ApplyGameCommand( const RString &sCommand, PlayerNumber pn ) RString sWhy; if( !m.IsPlayable(&sWhy) ) - RageException::Throw( "Can't apply mode \"%s\": %s", sCommand.c_str(), sWhy.c_str() ); + { + LuaHelpers::ReportScriptErrorFmt("Can't apply mode \"%s\": %s", sCommand.c_str(), sWhy.c_str()); + return; + } if( pn == PLAYER_INVALID ) m.ApplyToAllPlayers(); diff --git a/src/HoldJudgment.cpp b/src/HoldJudgment.cpp index bfd0f04a1f..eefa50632f 100644 --- a/src/HoldJudgment.cpp +++ b/src/HoldJudgment.cpp @@ -28,7 +28,9 @@ void HoldJudgment::LoadFromNode( const XNode* pNode ) { RString sFile; if( ActorUtil::GetAttrPath(pNode, "File", sFile) ) - RageException::Throw( "%s: HoldJudgment: missing the attribute \"File\"", ActorUtil::GetWhere(pNode).c_str() ); + { + LuaHelpers::ReportScriptErrorFmt("%s: HoldJudgment: missing the attribute \"File\"", ActorUtil::GetWhere(pNode).c_str()); + } CollapsePath( sFile ); diff --git a/src/LuaManager.cpp b/src/LuaManager.cpp index 19827f0223..e76a7d8321 100644 --- a/src/LuaManager.cpp +++ b/src/LuaManager.cpp @@ -47,6 +47,8 @@ namespace LuaHelpers template<> bool FromStack( Lua *L, float &Object, int iOffset ); template<> bool FromStack( Lua *L, int &Object, int iOffset ); template<> bool FromStack( Lua *L, RString &Object, int iOffset ); + + bool InReportScriptError= false; } void LuaManager::SetGlobal( const RString &sName, int val ) @@ -789,7 +791,14 @@ bool LuaHelpers::LoadScript( Lua *L, const RString &sScript, const RString &sNam return true; } -void LuaHelpers::ReportScriptError(RString const& Error, RString ErrorType) +void LuaHelpers::ScriptErrorMessage(RString const& Error) +{ + Message msg("ScriptError"); + msg.SetParam("Message", Error); + MESSAGEMAN->Broadcast(msg); +} + +Dialog::Result LuaHelpers::ReportScriptError(RString const& Error, RString ErrorType, bool UseAbort) { size_t line_break_pos= Error.find('\n'); RString short_error; @@ -801,11 +810,21 @@ void LuaHelpers::ReportScriptError(RString const& Error, RString ErrorType) { short_error= Error.substr(0, line_break_pos); } - Message msg("ScriptError"); - msg.SetParam("Message", short_error); - MESSAGEMAN->Broadcast(msg); + // Protect from a recursion loop resulting from a mistake in the error reporting lua. + if(!InReportScriptError) + { + InReportScriptError= true; + ScriptErrorMessage(short_error); + InReportScriptError= false; + } LOG->Warn(Error.c_str()); + if(UseAbort) + { + RString with_correct= Error + " Correct this and click Retry, or Cancel to break."; + return Dialog::AbortRetryIgnore(with_correct, ErrorType); + } Dialog::OK(Error, ErrorType); + return Dialog::ok; } // For convenience when replacing uses of LOG->Warn. diff --git a/src/LuaManager.h b/src/LuaManager.h index 8fc8d820aa..644780eb67 100644 --- a/src/LuaManager.h +++ b/src/LuaManager.h @@ -15,6 +15,9 @@ extern "C" #include "../extern/lua-5.1/src/lauxlib.h" } +// For Dialog::Result +#include "arch/Dialog/Dialog.h" + class LuaManager { public: @@ -58,8 +61,14 @@ namespace LuaHelpers * and the stack is unchanged. */ bool LoadScript( Lua *L, const RString &sScript, const RString &sName, RString &sError ); - /* Report the error through the log and on the screen. */ - void ReportScriptError(RString const& Error, RString ErrorType= "LUA_ERROR"); + /* Report the error three ways: Broadcast message, Warn, and Dialog. */ + /* If UseAbort is true, reports the error through Dialog::AbortRetryIgnore + and returns the result. */ + /* If UseAbort is false, reports the error through Dialog::OK and returns + Dialog::ok. */ + Dialog::Result ReportScriptError(RString const& Error, RString ErrorType= "LUA_ERROR", bool UseAbort= false); + // Just the broadcast message part, for things that need to do the rest differently. + void ScriptErrorMessage(RString const& Error); // For convenience when replacing uses of LOG->Warn. void ReportScriptErrorFmt(const char *fmt, ...); diff --git a/src/MessageManager.cpp b/src/MessageManager.cpp index 6f4ffcda29..021b3100cb 100644 --- a/src/MessageManager.cpp +++ b/src/MessageManager.cpp @@ -5,6 +5,7 @@ #include "RageThreads.h" #include "EnumHelper.h" #include "LuaManager.h" +#include "RageLog.h" #include #include @@ -148,6 +149,7 @@ void Message::SetParamFromStack( lua_State *L, const RString &sName ) MessageManager::MessageManager() { + m_Logging= false; // Register with Lua. { Lua *L = LUA->Get(); @@ -198,6 +200,11 @@ void MessageManager::Unsubscribe( IMessageSubscriber* pSubscriber, MessageID m ) void MessageManager::Broadcast( Message &msg ) const { + // GAMESTATE is created before MESSAGEMAN, and has several BroadcastOnChangePtr members, so they all broadcast when they're initialized. + if(this != NULL && m_Logging) + { + LOG->Trace("MESSAGEMAN:Broadcast: %s", msg.GetName().c_str()); + } msg.SetBroadcast(true); LockMut(g_Mutex); @@ -295,10 +302,16 @@ public: p->Broadcast( msg ); return 0; } + static int SetLogging(T* p, lua_State *L) + { + p->SetLogging(lua_toboolean(L, -1)); + return 0; + } LunaMessageManager() { ADD_METHOD( Broadcast ); + ADD_METHOD( SetLogging ); } }; diff --git a/src/MessageManager.h b/src/MessageManager.h index 5a63204a77..9e6c2a19a4 100644 --- a/src/MessageManager.h +++ b/src/MessageManager.h @@ -198,6 +198,9 @@ public: bool IsSubscribedToMessage( IMessageSubscriber* pSubscriber, const RString &sMessage ) const; inline bool IsSubscribedToMessage( IMessageSubscriber* pSubscriber, MessageID message ) const { return IsSubscribedToMessage( pSubscriber, MessageIDToString(message) ); } + void SetLogging(bool set) { m_Logging= set; } + bool m_Logging; + // Lua void PushSelf( lua_State *L ); }; diff --git a/src/MeterDisplay.cpp b/src/MeterDisplay.cpp index d58c8aab2e..389b5311ce 100644 --- a/src/MeterDisplay.cpp +++ b/src/MeterDisplay.cpp @@ -33,8 +33,13 @@ void MeterDisplay::LoadFromNode( const XNode* pNode ) const XNode *pStream = pNode->GetChild( "Stream" ); if( pStream == NULL ) - RageException::Throw( "%s: MeterDisplay: missing the \"Stream\" attribute", ActorUtil::GetWhere(pNode).c_str() ); - m_sprStream.LoadActorFromNode( pStream, this ); + { + LuaHelpers::ReportScriptErrorFmt("%s: MeterDisplay: missing the \"Stream\" attribute", ActorUtil::GetWhere(pNode).c_str()); + } + else + { + m_sprStream.LoadActorFromNode( pStream, this ); + } m_sprStream->SetName( "Stream" ); //LOAD_ALL_COMMANDS( m_sprStream ); this->AddChild( m_sprStream ); diff --git a/src/OptionRowHandler.cpp b/src/OptionRowHandler.cpp index 1c442976cb..cefa228f94 100644 --- a/src/OptionRowHandler.cpp +++ b/src/OptionRowHandler.cpp @@ -117,6 +117,18 @@ int OptionRowHandlerUtil::GetOneSelection( const vector &vbSelected ) static LocalizedString OFF ( "OptionRowHandler", "Off" ); +#define ROW_INVALID_IF(condition, message, retval) \ + if(condition) \ + { \ + LuaHelpers::ReportScriptError("Parse error in option row: " message); \ + return retval; \ + } + +#define CHECK_WRONG_NUM_ARGS(num) \ + ROW_INVALID_IF(command.m_vsArgs.size() != num, "Wrong number of args to option row.", false); +#define CHECK_BLANK_ARG \ + ROW_INVALID_IF(sParam.size() == 0, "Blank arg to Steps row.", false); + // begin OptionRow handlers class OptionRowHandlerList : public OptionRowHandler { @@ -135,31 +147,24 @@ public: m_bUseModNameForIcon = false; m_vsBroadcastOnExport.clear(); } - virtual void LoadInternal( const Commands &cmds ) + virtual bool LoadInternal( const Commands &cmds ) { - ASSERT( cmds.v.size() == 1 ); const Command &command = cmds.v[0]; RString sParam = command.GetArg(1).s; - ASSERT( command.m_vsArgs.size() == 2 ); - ASSERT( sParam.size() != 0 ); m_bUseModNameForIcon = true; - m_Def.m_sName = sParam; - m_Default.Load( -1, ParseCommands(ENTRY_DEFAULT(sParam)) ); { // Parse the basic configuration metric. Commands lCmds = ParseCommands( ENTRY(sParam) ); - if( lCmds.v.size() < 1 ) - { - LuaHelpers::ReportScriptErrorFmt("Parse error in \"ScreenOptionsMaster::%s\".", sParam.c_str()); - lCmds= ParseCommands("0"); - } + ROW_INVALID_IF(lCmds.v.size() < 1, "Row command is empty.", false); m_Def.m_bOneChoiceForAllPlayers = false; + ROW_INVALID_IF(lCmds.v[0].m_vsArgs.size() != 1, "Row command has invalid args to number of entries.", false); const int NumCols = StringToInt( lCmds.v[0].m_vsArgs[0] ); + ROW_INVALID_IF(NumCols < 1, "Not enough entries in list.", false); for( unsigned i=1; i &vpns, vector vbSelectedOut[NUM_PLAYERS] ) const { @@ -388,7 +384,7 @@ static void SortNoteSkins( vector &asSkinNames ) class OptionRowHandlerListNoteSkins : public OptionRowHandlerList { - virtual void LoadInternal( const Commands & ) + virtual bool LoadInternal( const Commands & ) { m_Def.m_sName = "NoteSkins"; m_Def.m_bOneChoiceForAllPlayers = false; @@ -408,13 +404,14 @@ class OptionRowHandlerListNoteSkins : public OptionRowHandlerList m_aListEntries.push_back( mc ); m_Def.m_vsChoices.push_back( arraySkinNames[skin] ); } + return true; } }; // XXX: very similar to OptionRowHandlerSteps class OptionRowHandlerListSteps : public OptionRowHandlerList { - virtual void LoadInternal( const Commands & ) + virtual bool LoadInternal( const Commands & ) { m_Def.m_sName = "Steps"; m_Def.m_bAllowThemeItems = false; // we theme the text ourself @@ -423,6 +420,7 @@ class OptionRowHandlerListSteps : public OptionRowHandlerList // don't call default // OptionRowHandlerList::LoadInternal( cmds ); + return true; } virtual ReloadChanged Reload() @@ -533,13 +531,12 @@ public: m_vDifficulties.clear(); } - virtual void LoadInternal( const Commands &cmds ) + virtual bool LoadInternal( const Commands &cmds ) { - ASSERT( cmds.v.size() == 1 ); const Command &command = cmds.v[0]; RString sParam = command.GetArg(1).s; - ASSERT( command.m_vsArgs.size() == 2 ); - ASSERT( sParam.size() != 0 ); + CHECK_WRONG_NUM_ARGS(2); + CHECK_BLANK_ARG; if( sParam == "EditSteps" ) { @@ -558,7 +555,7 @@ public: } else { - LuaHelpers::ReportScriptErrorFmt("Invalid StepsType param \"%s\".", sParam.c_str()); + ROW_INVALID_IF(true, "Invalid StepsType param \"" + sParam + "\".", false); } m_Def.m_sName = sParam; @@ -620,6 +617,7 @@ public: if( m_pDifficultyToFill ) m_pDifficultyToFill->Set( m_vDifficulties[0] ); m_ppStepsToFill->Set( m_vSteps[0] ); + return true; } virtual void ImportOption( OptionRow *pRow, const vector &vpns, vector vbSelectedOut[NUM_PLAYERS] ) const { @@ -679,7 +677,7 @@ public: class OptionRowHandlerListCharacters: public OptionRowHandlerList { - virtual void LoadInternal( const Commands & ) + virtual bool LoadInternal( const Commands & ) { m_Def.m_bOneChoiceForAllPlayers = false; m_Def.m_bAllowThemeItems = false; @@ -707,12 +705,13 @@ class OptionRowHandlerListCharacters: public OptionRowHandlerList mc.m_pCharacter = pCharacter; m_aListEntries.push_back( mc ); } + return true; } }; class OptionRowHandlerListStyles: public OptionRowHandlerList { - virtual void LoadInternal( const Commands & ) + virtual bool LoadInternal( const Commands & ) { m_Def.m_bOneChoiceForAllPlayers = true; m_Def.m_sName = "Style"; @@ -730,12 +729,13 @@ class OptionRowHandlerListStyles: public OptionRowHandlerList } m_Default.m_pStyle = vStyles[0]; + return true; } }; class OptionRowHandlerListGroups: public OptionRowHandlerList { - virtual void LoadInternal( const Commands & ) + virtual bool LoadInternal( const Commands & ) { m_Def.m_bOneChoiceForAllPlayers = true; m_Def.m_bAllowThemeItems = false; // we theme the text ourself @@ -760,12 +760,13 @@ class OptionRowHandlerListGroups: public OptionRowHandlerList mc.m_sSongGroup = *g; m_aListEntries.push_back( mc ); } + return true; } }; class OptionRowHandlerListDifficulties: public OptionRowHandlerList { - virtual void LoadInternal( const Commands & ) + virtual bool LoadInternal( const Commands & ) { m_Def.m_bOneChoiceForAllPlayers = true; m_Def.m_sName = "Difficulty"; @@ -790,13 +791,14 @@ class OptionRowHandlerListDifficulties: public OptionRowHandlerList mc.m_dc = *d; m_aListEntries.push_back( mc ); } + return true; } }; // XXX: very similar to OptionRowHandlerSongChoices class OptionRowHandlerListSongsInCurrentSongGroup: public OptionRowHandlerList { - virtual void LoadInternal( const Commands & ) + virtual bool LoadInternal( const Commands & ) { const vector &vpSongs = SONGMAN->GetSongs( GAMESTATE->m_sPreferredSongGroup ); @@ -815,6 +817,7 @@ class OptionRowHandlerListSongsInCurrentSongGroup: public OptionRowHandlerList mc.m_pSong = *p; m_aListEntries.push_back( mc ); } + return true; } }; @@ -995,45 +998,25 @@ public: LUA->Release(L); } - virtual void LoadInternal( const Commands &cmds ) + virtual bool LoadInternal( const Commands &cmds ) { - ASSERT( cmds.v.size() == 1 ); const Command &command = cmds.v[0]; - ASSERT( command.m_vsArgs.size() == 2 ); - RString sLuaFunction = command.m_vsArgs[1]; - ASSERT( sLuaFunction.size() != 0 ); + RString sParam = command.GetArg(1).s; + CHECK_WRONG_NUM_ARGS(2); + CHECK_BLANK_ARG; m_Def.m_bAllowThemeItems = false; // Lua options are always dynamic and can theme themselves. Lua *L = LUA->Get(); // Run the Lua expression. It should return a table. - m_pLuaTable->SetFromExpression( sLuaFunction ); - m_TableIsSane= SanityCheckTable(L, sLuaFunction); + m_pLuaTable->SetFromExpression( sParam ); + m_TableIsSane= SanityCheckTable(L, sParam); if(!m_TableIsSane) { - m_pLuaTable->PushSelf(L); - lua_getfield(L, -1, "Name"); - const char *pStr = lua_tostring( L, -1 ); - if(pStr == NULL) - { - m_Def.m_sName = "Invalid"; - } - else - { - m_Def.m_sName = pStr; - } - lua_pop( L, 1 ); - // Add a fake choice so that there won't be a crash. - // This is so that a themer that makes a mistake doesn't have to - // completely restart and can just reload scripts. - m_Def.m_vsChoices.push_back("Error in row."); - // Set m_selectType to SELECT_MULTIPLE so we won't hit the assert in - // VerifySelected. - m_Def.m_selectType= SELECT_MULTIPLE; lua_settop(L, 0); // Release has an assert that forces a clear stack. LUA->Release(L); - return; + return false; } m_pLuaTable->PushSelf(L); @@ -1101,6 +1084,7 @@ public: ASSERT( lua_gettop(L) == 0 ); LUA->Release(L); + return m_TableIsSane; } virtual ReloadChanged Reload() @@ -1277,13 +1261,12 @@ public: OptionRowHandler::Init(); m_pOpt = NULL; } - virtual void LoadInternal( const Commands &cmds ) + virtual bool LoadInternal( const Commands &cmds ) { - ASSERT( cmds.v.size() == 1 ); const Command &command = cmds.v[0]; RString sParam = command.GetArg(1).s; - ASSERT( command.m_vsArgs.size() == 2 ); - ASSERT( sParam.size() != 0 ); + CHECK_WRONG_NUM_ARGS(2); + CHECK_BLANK_ARG; Init(); @@ -1291,12 +1274,7 @@ public: m_Def.m_bOneChoiceForAllPlayers = true; ConfOption *pConfOption = ConfOption::Find( sParam ); - if( pConfOption == NULL ) - { - LuaHelpers::ReportScriptErrorFmt( "Invalid Conf type \"%s\"", sParam.c_str() ); - pConfOption = ConfOption::Find( "Invalid" ); - ASSERT_M( pConfOption != NULL, "ConfOption::Find(Invalid)" ); - } + ROW_INVALID_IF(pConfOption == NULL, "Invalid Conf type \"" + sParam + "\".", false); pConfOption->UpdateAvailableOptions(); @@ -1306,6 +1284,7 @@ public: m_Def.m_bAllowThemeItems = m_pOpt->m_bAllowThemeItems; m_Def.m_sName = m_pOpt->name; + return true; } virtual void ImportOption( OptionRow *, const vector &vpns, vector vbSelectedOut[NUM_PLAYERS] ) const { @@ -1361,13 +1340,12 @@ public: m_vStepsTypesToShow.clear(); } - virtual void LoadInternal( const Commands &cmds ) + virtual bool LoadInternal( const Commands &cmds ) { - ASSERT( cmds.v.size() == 1 ); const Command &command = cmds.v[0]; RString sParam = command.GetArg(1).s; - ASSERT( command.m_vsArgs.size() == 2 ); - ASSERT( sParam.size() != 0 ); + CHECK_WRONG_NUM_ARGS(2); + CHECK_BLANK_ARG; if( sParam == "EditStepsType" ) { @@ -1383,7 +1361,7 @@ public: } else { - RageException::Throw( "Invalid StepsType param \"%s\".", sParam.c_str() ); + ROW_INVALID_IF(true, "Invalid StepsType param \"" + sParam + "\".", false); } m_Def.m_sName = sParam; @@ -1404,6 +1382,7 @@ public: if( *m_pstToFill == StepsType_Invalid ) m_pstToFill->Set( m_vStepsTypesToShow[0] ); + return true; } virtual void ImportOption( OptionRow *pRow, const vector &vpns, vector vbSelectedOut[NUM_PLAYERS] ) const @@ -1455,19 +1434,20 @@ public: m_gc.Init(); m_gc.ApplyCommitsScreens( false ); } - virtual void LoadInternal( const Commands &cmds ) + virtual bool LoadInternal( const Commands &cmds ) { - ASSERT( cmds.v.size() > 1 ); + ROW_INVALID_IF(cmds.v.size() <= 1, "No args to construct GameCommand.", false); Commands temp = cmds; temp.v.erase( temp.v.begin() ); m_gc.Load( 0, temp ); - ASSERT( !m_gc.m_sName.empty() ); + ROW_INVALID_IF(m_gc.m_sName.empty(), "GameCommand row has no name.", false); m_Def.m_sName = m_gc.m_sName; m_Def.m_bOneChoiceForAllPlayers = true; m_Def.m_layoutType = LAYOUT_SHOW_ONE_IN_ROW; m_Def.m_selectType = SELECT_NONE; m_Def.m_vsChoices.push_back( "" ); + return true; } virtual void ImportOption( OptionRow *pRow, const vector &vpns, vector vbSelectedOut[NUM_PLAYERS] ) const { @@ -1501,20 +1481,21 @@ OptionRowHandler* OptionRowHandlerUtil::Make( const Commands &cmds ) { OptionRowHandler* pHand = NULL; - if( cmds.v.size() == 0 ) - return NULL; - + ROW_INVALID_IF(cmds.v.size() == 0, "No commands for constructing row.", NULL); const RString &name = cmds.v[0].GetName(); + ROW_INVALID_IF(name != "gamecommand" && cmds.v.size() != 1, + "Row must be constructed from single command.", NULL); -#define MAKE( type ) { type *p = new type; p->Load( cmds ); pHand = p; } + bool load_succeeded= false; +#define MAKE( type ) { type *p = new type; load_succeeded= p->Load( cmds ); pHand = p; } // XXX: merge these, and merge "Steps" and "list,Steps" if( name == "list" ) { const Command &command = cmds.v[0]; RString sParam = command.GetArg(1).s; - if( command.m_vsArgs.size() != 2 || !sParam.size() ) - return NULL; + ROW_INVALID_IF(command.m_vsArgs.size() != 2 || !sParam.size(), + "list row command must be 'list,name' or 'list,type'.", NULL); if( sParam.CompareNoCase("NoteSkins")==0 ) MAKE( OptionRowHandlerListNoteSkins ) else if( sParam.CompareNoCase("Steps")==0 ) MAKE( OptionRowHandlerListSteps ) @@ -1535,16 +1516,29 @@ OptionRowHandler* OptionRowHandlerUtil::Make( const Commands &cmds ) else if( name == "stepstype" ) MAKE( OptionRowHandlerStepsType ) else if( name == "steps" ) MAKE( OptionRowHandlerSteps ) else if( name == "gamecommand" ) MAKE( OptionRowHandlerGameCommand ) + else + { + ROW_INVALID_IF(true, "Invalid row type.", NULL); + } - return pHand; + if(load_succeeded) + { + return pHand; + } + return NULL; } OptionRowHandler* OptionRowHandlerUtil::MakeNull() { OptionRowHandler* pHand = NULL; + bool load_succeeded= false; // Part of the MAKE macro, but unused. Commands cmds; MAKE( OptionRowHandlerNull ) - return pHand; + if(load_succeeded) // Just to get rid of the warning for not using it. + { + return pHand; + } + return NULL; } OptionRowHandler* OptionRowHandlerUtil::MakeSimple( const MenuRowDef &mr ) diff --git a/src/OptionRowHandler.h b/src/OptionRowHandler.h index 4f438fc699..f041e8768d 100644 --- a/src/OptionRowHandler.h +++ b/src/OptionRowHandler.h @@ -150,15 +150,15 @@ public: m_Def.Init(); m_vsReloadRowMessages.clear(); } - void Load( const Commands &cmds ) + bool Load( const Commands &cmds ) { Init(); - this->LoadInternal( cmds ); + return this->LoadInternal( cmds ); } RString OptionTitle() const; RString GetThemedItemText( int iChoice ) const; - virtual void LoadInternal( const Commands & ) { } + virtual bool LoadInternal( const Commands & ) { return true; } /* We may re-use OptionRowHandlers. This is called before each use. If the * contents of the row are dependent on external state (for example, the diff --git a/src/OptionsList.cpp b/src/OptionsList.cpp index e7c5c66d56..101b48a0f0 100644 --- a/src/OptionsList.cpp +++ b/src/OptionsList.cpp @@ -218,7 +218,10 @@ void OptionsList::Load( RString sType, PlayerNumber pn ) OptionRowHandler *pHand = OptionRowHandlerUtil::Make( cmds ); if( pHand == NULL ) - RageException::Throw( "Invalid OptionRowHandler '%s' in %s::Line%s", cmds.GetOriginalCommandString().c_str(), m_sName.c_str(), sLineName.c_str() ); + { + LuaHelpers::ReportScriptErrorFmt("Invalid OptionRowHandler '%s' in %s::Line%s", cmds.GetOriginalCommandString().c_str(), m_sName.c_str(), sLineName.c_str()); + continue; + } m_Rows[sLineName] = pHand; m_asLoadedRows.push_back( sLineName ); diff --git a/src/PlayerAI.cpp b/src/PlayerAI.cpp index 658aa11c5e..b7bf80905e 100644 --- a/src/PlayerAI.cpp +++ b/src/PlayerAI.cpp @@ -41,23 +41,41 @@ void PlayerAI::InitFromDisk() { RString sKey = ssprintf("Skill%d", i); XNode* pNode = ini.GetChild(sKey); - if( pNode == NULL ) - RageException::Throw( "AI.ini: \"%s\" doesn't exist.", sKey.c_str() ); - TapScoreDistribution& dist = g_Distributions[i]; - dist.fPercent[TNS_None] = 0; - bSuccess = pNode->GetAttrValue( "WeightMiss", dist.fPercent[TNS_Miss] ); - ASSERT( bSuccess ); - bSuccess = pNode->GetAttrValue( "WeightW5", dist.fPercent[TNS_W5] ); - ASSERT( bSuccess ); - bSuccess = pNode->GetAttrValue( "WeightW4", dist.fPercent[TNS_W4] ); - ASSERT( bSuccess ); - bSuccess = pNode->GetAttrValue( "WeightW3", dist.fPercent[TNS_W3] ); - ASSERT( bSuccess ); - bSuccess = pNode->GetAttrValue( "WeightW2", dist.fPercent[TNS_W2] ); - ASSERT( bSuccess ); - bSuccess = pNode->GetAttrValue( "WeightW1", dist.fPercent[TNS_W1] ); - ASSERT( bSuccess ); + if( pNode == NULL ) + { + LuaHelpers::ReportScriptErrorFmt("AI.ini: \"%s\" doesn't exist.", sKey.c_str()); + dist.fPercent[TNS_None] = 0; + dist.fPercent[TNS_Miss] = 1; + dist.fPercent[TNS_W5] = 0; + dist.fPercent[TNS_W4] = 0; + dist.fPercent[TNS_W3] = 0; + dist.fPercent[TNS_W2] = 0; + dist.fPercent[TNS_W1] = 0; + } + else + { +#define SET_MALF_IF(condition, tns) \ + if(condition) \ + { \ + LuaHelpers::ReportScriptError("AI weight for " #tns " not set."); \ + dist.fPercent[tns]= 0; \ + } + dist.fPercent[TNS_None] = 0; + bSuccess = pNode->GetAttrValue( "WeightMiss", dist.fPercent[TNS_Miss] ); + SET_MALF_IF(!bSuccess, TNS_Miss); + bSuccess = pNode->GetAttrValue( "WeightW5", dist.fPercent[TNS_W5] ); + SET_MALF_IF(!bSuccess, TNS_W5); + bSuccess = pNode->GetAttrValue( "WeightW4", dist.fPercent[TNS_W4] ); + SET_MALF_IF(!bSuccess, TNS_W4); + bSuccess = pNode->GetAttrValue( "WeightW3", dist.fPercent[TNS_W3] ); + SET_MALF_IF(!bSuccess, TNS_W3); + bSuccess = pNode->GetAttrValue( "WeightW2", dist.fPercent[TNS_W2] ); + SET_MALF_IF(!bSuccess, TNS_W2); + bSuccess = pNode->GetAttrValue( "WeightW1", dist.fPercent[TNS_W1] ); + SET_MALF_IF(!bSuccess, TNS_W1); +#undef SET_MALF_IF + } float fSum = 0; for( int j=0; jGetName() ); - pScreen->BeginScreen(); - g_OverlayScreens.push_back( pScreen ); + if(pScreen) + { + LuaThreadVariable var2( "LoadingScreen", pScreen->GetName() ); + pScreen->BeginScreen(); + g_OverlayScreens.push_back( pScreen ); + } } // reload song manager colors (to avoid crashes) -aj @@ -323,9 +326,12 @@ void ScreenManager::ReloadOverlayScreens() for( unsigned i=0; iGetName() ); - pScreen->BeginScreen(); - g_OverlayScreens.push_back( pScreen ); + if(pScreen) + { + LuaThreadVariable var2( "LoadingScreen", pScreen->GetName() ); + pScreen->BeginScreen(); + g_OverlayScreens.push_back( pScreen ); + } } this->RefreshCreditsMessages(); @@ -552,7 +558,10 @@ Screen* ScreenManager::MakeNewScreen( const RString &sScreenName ) map::iterator iter = g_pmapRegistrees->find( sClassName ); if( iter == g_pmapRegistrees->end() ) - RageException::Throw( "Screen \"%s\" has an invalid class \"%s\".", sScreenName.c_str(), sClassName.c_str() ); + { + LuaHelpers::ReportScriptErrorFmt("Screen \"%s\" has an invalid class \"%s\".", sScreenName.c_str(), sClassName.c_str()); + return NULL; + } this->ZeroNextUpdate(); @@ -571,6 +580,10 @@ void ScreenManager::PrepareScreen( const RString &sScreenName ) return; Screen* pNewScreen = MakeNewScreen(sScreenName); + if(pNewScreen == NULL) + { + return; + } { LoadedScreen ls; diff --git a/src/ScreenOptionsMaster.cpp b/src/ScreenOptionsMaster.cpp index 662885dbd5..ea2aee1428 100644 --- a/src/ScreenOptionsMaster.cpp +++ b/src/ScreenOptionsMaster.cpp @@ -29,7 +29,9 @@ void ScreenOptionsMaster::Init() vector asLineNames; split( LINE_NAMES, ",", asLineNames ); if( asLineNames.empty() ) - RageException::Throw( "\"%s::LineNames\" is empty.", m_sName.c_str() ); + { + LuaHelpers::ReportScriptErrorFmt("\"%s:LineNames\" is empty.", m_sName.c_str()); + } if( FORCE_ALL_PLAYERS ) { @@ -59,7 +61,7 @@ void ScreenOptionsMaster::Init() OptionRowHandler *pHand = OptionRowHandlerUtil::Make( cmds ); if( pHand == NULL ) { - LuaHelpers::ReportScriptErrorFmt("Invalid OptionRowHandler \"%s\" in \"%s::Line%i\".", cmds.GetOriginalCommandString().c_str(), m_sName.c_str(), i); + LuaHelpers::ReportScriptErrorFmt("Invalid OptionRowHandler \"%s\" in \"%s:Line:%s\".", cmds.GetOriginalCommandString().c_str(), m_sName.c_str(), sLineName.c_str()); } else { diff --git a/src/ScreenSelect.cpp b/src/ScreenSelect.cpp index bed9829df2..58c046bf27 100644 --- a/src/ScreenSelect.cpp +++ b/src/ScreenSelect.cpp @@ -52,8 +52,10 @@ void ScreenSelect::Init() } } - if( !m_aGameCommands.size() ) - RageException::Throw( "Screen \"%s\" does not set any choices.", m_sName.c_str() ); + if(m_aGameCommands.empty()) + { + LuaHelpers::ReportScriptErrorFmt("Screen \"%s\" does not set any choices.", m_sName.c_str()); + } } void ScreenSelect::BeginScreen() @@ -157,25 +159,27 @@ void ScreenSelect::HandleScreenMessage( const ScreenMessage SM ) } } - if( bAllPlayersChoseTheSame ) + if(!m_aGameCommands.empty()) { - const GameCommand &gc = m_aGameCommands[iMastersIndex]; - m_sNextScreen = gc.m_sScreen; - if( !gc.m_bInvalid ) - gc.ApplyToAllPlayers(); - } - else - { - FOREACH_HumanPlayer( p ) + if( bAllPlayersChoseTheSame ) { - int iIndex = this->GetSelectionIndex(p); - const GameCommand &gc = m_aGameCommands[iIndex]; + const GameCommand &gc = m_aGameCommands[iMastersIndex]; m_sNextScreen = gc.m_sScreen; if( !gc.m_bInvalid ) + gc.ApplyToAllPlayers(); + } + else + { + FOREACH_HumanPlayer( p ) + { + int iIndex = this->GetSelectionIndex(p); + const GameCommand &gc = m_aGameCommands[iIndex]; + m_sNextScreen = gc.m_sScreen; + if( !gc.m_bInvalid ) gc.Apply( p ); + } } } - StopTimer(); SCREENMAN->RefreshCreditsMessages(); diff --git a/src/ScreenSelectMaster.cpp b/src/ScreenSelectMaster.cpp index 0d3b8fd6c6..5aa4c15423 100644 --- a/src/ScreenSelectMaster.cpp +++ b/src/ScreenSelectMaster.cpp @@ -369,7 +369,7 @@ void ScreenSelectMaster::UpdateSelectableChoices() * If any options are playable, make sure one is selected. */ FOREACH_HumanPlayer( p ) { - if( !m_aGameCommands[m_iChoice[p]].IsPlayable() ) + if(!m_aGameCommands.empty() && !m_aGameCommands[m_iChoice[p]].IsPlayable()) Move( p, MenuDir_Auto ); } } @@ -402,7 +402,7 @@ bool ScreenSelectMaster::Move( PlayerNumber pn, MenuDir dir ) if( seen.find(iSwitchToIndex) != seen.end() ) return false; // went full circle and none found seen.insert( iSwitchToIndex ); - } while( !m_aGameCommands[iSwitchToIndex].IsPlayable() && !DO_SWITCH_ANYWAYS ); + } while(!m_aGameCommands.empty() && !m_aGameCommands[iSwitchToIndex].IsPlayable() && !DO_SWITCH_ANYWAYS); return ChangeSelection( pn, dir, iSwitchToIndex ); } @@ -821,22 +821,28 @@ bool ScreenSelectMaster::MenuStart( const InputEventPlus &input ) return true; } - const GameCommand &mc = m_aGameCommands[m_iChoice[pn]]; + GameCommand empty_mc; + // This is so we can avoid having problems when the GameCommands in the choices were all invalid or didn't load or similar. -Kyz + GameCommand *mc= &empty_mc; + if(!m_aGameCommands.empty()) + { + mc = &(m_aGameCommands[m_iChoice[pn]]); + } /* If no options are playable, then we're just waiting for one to become available. * If any options are playable, then the selection must be playable. */ if( !AnyOptionsArePlayable() ) return false; - SOUND->PlayOnceFromDir( ANNOUNCER->GetPathTo(ssprintf("%s comment %s",m_sName.c_str(), mc.m_sName.c_str())) ); + SOUND->PlayOnceFromDir( ANNOUNCER->GetPathTo(ssprintf("%s comment %s",m_sName.c_str(), mc->m_sName.c_str())) ); // Play a copy of the sound, so it'll finish playing even if we leave the screen immediately. - if( mc.m_sSoundPath.empty() && !m_bDoubleChoiceNoSound ) + if( mc->m_sSoundPath.empty() && !m_bDoubleChoiceNoSound ) m_soundStart.PlayCopy(); - if( mc.m_sScreen.empty() ) + if( mc->m_sScreen.empty() ) { - mc.ApplyToAllPlayers(); + mc->ApplyToAllPlayers(); // We want to be able to broadcast a Start message to the theme, in // case a themer wants to handle something. -aj Message msg( MessageIDToString((MessageID)(Message_MenuStartP1+pn)) ); diff --git a/src/ScreenSelectMusic.cpp b/src/ScreenSelectMusic.cpp index c8c7644f44..fa3e5d870f 100644 --- a/src/ScreenSelectMusic.cpp +++ b/src/ScreenSelectMusic.cpp @@ -239,7 +239,14 @@ void ScreenSelectMusic::BeginScreen() } if( GAMESTATE->GetCurrentStyle() == NULL ) - RageException::Throw( "The Style has not been set. A theme must set the Style before loading ScreenSelectMusic." ); + { + LuaHelpers::ReportScriptError("The Style has not been set. A theme must set the Style before loading ScreenSelectMusic."); + // Instead of crashing, set the first compatible style. + vector vst; + GAMEMAN->GetStepsTypesForGame( GAMESTATE->m_pCurGame, vst ); + const Style *pStyle = GAMEMAN->GetFirstCompatibleStyle( GAMESTATE->m_pCurGame, GAMESTATE->GetNumSidesJoined(), vst[0] ); + GAMESTATE->SetCurrentStyle( pStyle ); + } if( GAMESTATE->m_PlayMode == PlayMode_Invalid ) { diff --git a/src/Sprite.cpp b/src/Sprite.cpp index a2e6959f8b..0e67cde16e 100644 --- a/src/Sprite.cpp +++ b/src/Sprite.cpp @@ -175,7 +175,7 @@ void Sprite::LoadFromNode( const XNode* pNode ) pFrame->GetAttrValue( "Frame", iFrameIndex ); if( iFrameIndex >= m_pTexture->GetNumFrames() ) - RageException::Throw( "%s: State #%i is frame %d, but the texture \"%s\" only has %d frames", + LuaHelpers::ReportScriptErrorFmt( "%s: State #%i is frame %d, but the texture \"%s\" only has %d frames", ActorUtil::GetWhere(pNode).c_str(), i, iFrameIndex, sPath.c_str(), m_pTexture->GetNumFrames() ); newState.rect = *m_pTexture->GetTextureCoordRect( iFrameIndex ); @@ -210,7 +210,7 @@ void Sprite::LoadFromNode( const XNode* pNode ) if( !pNode->GetAttrValue(sFrameKey, iFrameIndex) ) break; if( iFrameIndex >= m_pTexture->GetNumFrames() ) - RageException::Throw( "%s: %s is %d, but the texture \"%s\" only has %d frames", + LuaHelpers::ReportScriptErrorFmt( "%s: %s is %d, but the texture \"%s\" only has %d frames", ActorUtil::GetWhere(pNode).c_str(), sFrameKey.c_str(), iFrameIndex, sPath.c_str(), m_pTexture->GetNumFrames() ); newState.rect = *m_pTexture->GetTextureCoordRect( iFrameIndex ); diff --git a/src/ThemeManager.cpp b/src/ThemeManager.cpp index 69ba477d56..b8adc806b5 100644 --- a/src/ThemeManager.cpp +++ b/src/ThemeManager.cpp @@ -669,10 +669,15 @@ bool ThemeManager::GetPathInfoToRaw( PathInfo &out, const RString &sThemeName_, RString message = ssprintf( "ThemeManager: There is more than one theme element that matches " - "'%s/%s/%s'. Please remove all but one of these matches.", + "'%s/%s/%s'. Please remove all but one of these matches: ", sThemeName.c_str(), sCategory.c_str(), MetricsGroupAndElementToFileName(sMetricsGroup,sElement).c_str() ); + message+= asElementPaths[1]; + for(size_t i= 1; i < asElementPaths.size(); ++i) + { + message+= ", " + asElementPaths[i]; + } - switch( Dialog::AbortRetryIgnore(message) ) + switch( LuaHelpers::ReportScriptError(message, "", true) ) { case Dialog::abort: RageException::Throw( "%s", message.c_str() ); @@ -717,7 +722,7 @@ bool ThemeManager::GetPathInfoToRaw( PathInfo &out, const RString &sThemeName_, "Verify that this redirect is correct.", sPath.c_str(), sNewFileName.c_str()); - switch( Dialog::AbortRetryIgnore(sMessage) ) + switch( LuaHelpers::ReportScriptError(sMessage) ) { case Dialog::retry: ReloadMetrics(); @@ -753,11 +758,9 @@ bool ThemeManager::GetPathInfoToAndFallback( PathInfo &out, ElementCategory cate return false; } - RageException::Throw( "Infinite recursion looking up theme element \"%s\"", - MetricsGroupAndElementToFileName(sMetricsGroup, sElement).c_str() ); - /* Not really reached, but Appple's gcc 4 can't figure that out without - * optimization even though RE:Throw() is correctly annotated. */ - while( true ) {} + LuaHelpers::ReportScriptErrorFmt("Infinite recursion looking up theme element \"%s\"", + MetricsGroupAndElementToFileName(sMetricsGroup, sElement).c_str()); + return false; } bool ThemeManager::GetPathInfo( PathInfo &out, ElementCategory category, const RString &sMetricsGroup_, const RString &sElement_, bool bOptional ) @@ -811,10 +814,14 @@ try_element_again: ReloadMetrics(); goto try_element_again; case Dialog::ignore: - LOG->UserLog( "Theme element", sCategory + '/' + sFileName, - "could not be found in \"%s\" or \"%s\".", - GetThemeDirFromName(m_sCurThemeName).c_str(), - GetThemeDirFromName(SpecialFiles::BASE_THEME_NAME).c_str() ); + { + RString error= ssprintf(sCategory + '/' + sFileName, + "could not be found in \"%s\" or \"%s\".", + GetThemeDirFromName(m_sCurThemeName).c_str(), + GetThemeDirFromName(SpecialFiles::BASE_THEME_NAME).c_str() ); + LOG->UserLog("Theme element", "%s", error.c_str()); + LuaHelpers::ScriptErrorMessage(error); + } // Err? if( sFileName == "_missing" ) @@ -918,7 +925,8 @@ bool ThemeManager::GetMetricRawRecursive( const IniFile &ini, const RString &sMe return false; } - RageException::Throw( "Infinite recursion looking up theme metric \"%s::%s\".", sMetricsGroup.c_str(), sValueName.c_str() ); + LuaHelpers::ReportScriptErrorFmt("Infinite recursion looking up theme metric \"%s::%s\".", sMetricsGroup.c_str(), sValueName.c_str()); + return false; } RString ThemeManager::GetMetricRaw( const IniFile &ini, const RString &sMetricsGroup_, const RString &sValueName_ ) @@ -945,12 +953,12 @@ RString ThemeManager::GetMetricRaw( const IniFile &ini, const RString &sMetricsG else FAIL_M(""); - RString sMessage = ssprintf( "%s \"%s::%s\" is missing. Correct this and click Retry, or Cancel to break.", - sType.c_str(), - sMetricsGroup.c_str(), + RString sMessage = ssprintf( "%s \"%s::%s\" is missing.", + sType.c_str(), + sMetricsGroup.c_str(), sValueName.c_str() ); - switch( Dialog::AbortRetryIgnore(sMessage) ) + switch( LuaHelpers::ReportScriptError(sMessage, "", true) ) { case Dialog::abort: { From 6cf23c4dc3be463d602f77159d25ecbb317329b3 Mon Sep 17 00:00:00 2001 From: Kyzentun Date: Mon, 14 Jul 2014 15:41:04 -0600 Subject: [PATCH 14/80] Changed many parts of GameCommand to improve error reporting. Fixed GameCommand setpref to not set when loading the command. Minor fix to ScreenOptionsExample.ini to explain that SongInCurrentSongGroup is unusable. CommonMetrics, CourseContentsList, HoldJudgent, OptionRowHandler all have minor changes to fix crashes on malformed theme data. --- .../Example_Screens/ScreenOptionsExample.ini | 9 +- src/BitmapText.cpp | 19 +- src/CommonMetrics.cpp | 12 +- src/CourseContentsList.cpp | 1 + src/GameCommand.cpp | 163 +++++++++++------- src/GameCommand.h | 3 +- src/HoldJudgment.cpp | 2 +- src/OptionRowHandler.cpp | 19 +- src/ScreenManager.cpp | 6 + src/ScreenManager.h | 2 + 10 files changed, 147 insertions(+), 89 deletions(-) diff --git a/Docs/Themerdocs/Examples/Example_Screens/ScreenOptionsExample.ini b/Docs/Themerdocs/Examples/Example_Screens/ScreenOptionsExample.ini index b373987f2c..39e4a0032e 100644 --- a/Docs/Themerdocs/Examples/Example_Screens/ScreenOptionsExample.ini +++ b/Docs/Themerdocs/Examples/Example_Screens/ScreenOptionsExample.ini @@ -32,7 +32,7 @@ InputMode="individual" # LineNames sets the names of the rows on the screen. # Names are separated by commas and can be anything that doesn't contain a comma. # Each name will be appended to "Line" to find the metric that defines that line. So a line name of "a" will be defined by the metric "Linea". -LineNames="a,b,c,d,e,f,g,h,i,j,k,l,m,n" +LineNames="a,b,c,d,e,f,g,h,j,k,l,m,n" # Each line is defined by a metric that sets its type and arguments for that type. # This example is going to include a simple example of each type. @@ -71,7 +71,8 @@ Lineg="list,Groups" Lineh="list,Difficulties" # The "SongsInCurrentSongGroup" subtype -Linei="list,SongsInCurrentSongGroup" +# This option row type is not actually usable because it requires language file entries for every song, which is impractical. +#Linei="list,SongsInCurrentSongGroup" # This is the end of the list subtype examples. @@ -82,8 +83,8 @@ Linej="lua,ArbitrarySpeedMods()" # The "steps" row type creates choices for the different charts for the current song. It takes a single argument, "EditSteps" or "EditSourceSteps". Its purpose is currently unknown. Linek="steps,EditSteps" -# The "stepstype" row type is related to the "steps" row type and takes the same argument. Its purpose is also unknown. -Linel="stepstype,EditSteps" +# The "stepstype" row type is related to the "steps" row type. It takes a single argument, "EditStepsType" or "EditSourceStepsType". Its purpose is also unknown. +Linel="stepstype,EditStepsType" # The "conf" row type constructs a row for changing a conf option. conf options are the options in Preferences.ini and the argument is the name of the option to edit. Linem="conf,AllowW1" diff --git a/src/BitmapText.cpp b/src/BitmapText.cpp index 95ca19f83a..3fc7525637 100644 --- a/src/BitmapText.cpp +++ b/src/BitmapText.cpp @@ -126,18 +126,21 @@ void BitmapText::LoadFromNode( const XNode* pNode ) ThemeManager::EvaluateString( sAltText ); RString sFont; - if( !ActorUtil::GetAttrPath(pNode, "Font", sFont) && - !ActorUtil::GetAttrPath(pNode, "File", sFont) ) + // The short circuiting loading condition that was here before wasn't short circuiting correctly on all platforms. + if(!ActorUtil::GetAttrPath(pNode, "Font", sFont)) { - if( !pNode->GetAttrValue("Font", sFont) && - !pNode->GetAttrValue("File", sFont) ) // accept "File" for backward compatibility + if(!ActorUtil::GetAttrPath(pNode, "File", sFont)) { - LuaHelpers::ReportScriptErrorFmt( "%s: BitmapText: Font or File attribute not found", - ActorUtil::GetWhere(pNode).c_str() ); - sFont = "Common Normal"; + if( !pNode->GetAttrValue("Font", sFont) && + !pNode->GetAttrValue("File", sFont) ) // accept "File" for backward compatibility + { + LuaHelpers::ReportScriptErrorFmt( "%s: BitmapText: Font or File attribute not found", + ActorUtil::GetWhere(pNode).c_str() ); + sFont = "Common Normal"; + } } - sFont = THEME->GetPathF( "", sFont ); } + sFont = THEME->GetPathF( "", sFont ); LoadFromFont( sFont ); diff --git a/src/CommonMetrics.cpp b/src/CommonMetrics.cpp index c8752192d8..7ca1fa2569 100644 --- a/src/CommonMetrics.cpp +++ b/src/CommonMetrics.cpp @@ -38,7 +38,11 @@ void ThemeMetricDifficultiesToShow::Read() vector v; split( ThemeMetric::GetValue(), ",", v ); - ASSERT( v.size() > 0 ); + if(v.empty()) + { + LuaHelpers::ReportScriptError("DifficultiesToShow must have at least one entry."); + return; + } FOREACH_CONST( RString, v, i ) { @@ -73,7 +77,11 @@ void ThemeMetricCourseDifficultiesToShow::Read() vector v; split( ThemeMetric::GetValue(), ",", v ); - ASSERT( v.size() > 0 ); + if(v.empty()) + { + LuaHelpers::ReportScriptError("CourseDifficultiesToShow must have at least one entry."); + return; + } FOREACH_CONST( RString, v, i ) { diff --git a/src/CourseContentsList.cpp b/src/CourseContentsList.cpp index 8475b05547..43e76e1526 100644 --- a/src/CourseContentsList.cpp +++ b/src/CourseContentsList.cpp @@ -28,6 +28,7 @@ void CourseContentsList::LoadFromNode( const XNode* pNode ) if( pDisplayNode == NULL ) { LuaHelpers::ReportScriptErrorFmt("%s: CourseContentsList: missing the Display child", ActorUtil::GetWhere(pNode).c_str()); + return; } for( int i=0; iGameAndStringToStyle( GAMESTATE->m_pCurGame, sValue ); - if( style ) - m_pStyle = style; - else - m_bInvalid = true; + CHECK_INVALID_VALUE(m_pStyle, style, NULL, style); } else if( sName == "playmode" ) { PlayMode pm = StringToPlayMode( sValue ); - if( pm != PlayMode_Invalid ) - m_pm = pm; - else - m_bInvalid = true; + CHECK_INVALID_VALUE(m_pm, pm, PlayMode_Invalid, playmode); } else if( sName == "difficulty" ) { Difficulty dc = StringToDifficulty( sValue ); - if( dc != Difficulty_Invalid ) - m_dc = dc; - else - m_bInvalid = true; + CHECK_INVALID_VALUE(m_dc, dc, Difficulty_Invalid, difficulty); } else if( sName == "announcer" ) @@ -236,23 +245,20 @@ void GameCommand::LoadOne( const Command& cmd ) m_LuaFunction.SetFromExpression( sValue ); if(m_LuaFunction.IsNil()) { - LuaHelpers::ReportScriptError("Lua error in game command: \"" + sValue + "\" evaluated to nil"); + MAKE_INVALID("Lua error in game command: \"" + sValue + "\" evaluated to nil"); } } else if( sName == "screen" ) { - m_sScreen = sValue; + CHECK_INVALID_COND(m_sScreen, sValue, (!SCREENMAN->IsScreenNameValid(sValue)), ("Screen \"" + sValue + "\" has invalid class.")); } else if( sName == "song" ) { - m_pSong = SONGMAN->FindSong( sValue ); - if( m_pSong == NULL ) - { - m_sInvalidReason = ssprintf( "Song \"%s\" not found", sValue.c_str() ); - m_bInvalid = true; - } + CHECK_INVALID_COND(m_pSong, SONGMAN->FindSong(sValue), + (SONGMAN->FindSong(sValue) == NULL), + (ssprintf("Song \"%s\" not found", sValue.c_str()))); } else if( sName == "steps" ) @@ -266,34 +272,31 @@ void GameCommand::LoadOne( const Command& cmd ) const Style *pStyle = m_pStyle ? m_pStyle : GAMESTATE->GetCurrentStyle(); if( pSong == NULL || pStyle == NULL ) { - LuaHelpers::ReportScriptError("Must set Song and Style to set Steps."); - m_sInvalidReason = "Song or Style not set"; - m_bInvalid = true; + MAKE_INVALID("Must set Song and Style to set Steps."); } else { Difficulty dc = StringToDifficulty( sSteps ); - if( dc != Difficulty_Edit ) - m_pSteps = SongUtil::GetStepsByDifficulty( pSong, pStyle->m_StepsType, dc ); - else - m_pSteps = SongUtil::GetStepsByDescription( pSong, pStyle->m_StepsType, sSteps ); - if( m_pSteps == NULL ) + Steps* st; + if( dc < Difficulty_Edit ) { - m_sInvalidReason = "steps not found"; - m_bInvalid = true; + st = SongUtil::GetStepsByDifficulty( pSong, pStyle->m_StepsType, dc ); } + else + { + st = SongUtil::GetStepsByDescription( pSong, pStyle->m_StepsType, sSteps ); + } + CHECK_INVALID_COND(m_pSteps, st, (st == NULL), + (ssprintf("Steps \"%s\" not found", sSteps.c_str()))); } } } else if( sName == "course" ) { - m_pCourse = SONGMAN->FindCourse( "", sValue ); - if( m_pCourse == NULL ) - { - m_sInvalidReason = ssprintf( "Course \"%s\" not found", sValue.c_str() ); - m_bInvalid = true; - } + CHECK_INVALID_COND(m_pCourse, SONGMAN->FindCourse("", sValue), + (SONGMAN->FindCourse("", sValue) == NULL), + (ssprintf( "Course \"%s\" not found", sValue.c_str()))); } else if( sName == "trail" ) @@ -307,20 +310,20 @@ void GameCommand::LoadOne( const Command& cmd ) const Style *pStyle = m_pStyle ? m_pStyle : GAMESTATE->GetCurrentStyle(); if( pCourse == NULL || pStyle == NULL ) { - LuaHelpers::ReportScriptError("Must set Course and Style to set Trail."); - m_sInvalidReason = "Course or Style not set"; - m_bInvalid = true; + MAKE_INVALID("Must set Course and Style to set Trail."); } else { const CourseDifficulty cd = StringToDifficulty( sTrail ); - ASSERT_M( cd != Difficulty_Invalid, ssprintf("Invalid difficulty '%s'", sTrail.c_str()) ); - - m_pTrail = pCourse->GetTrail( pStyle->m_StepsType, cd ); - if( m_pTrail == NULL ) + if(cd == Difficulty_Invalid) { - m_sInvalidReason = "trail not found"; - m_bInvalid = true; + MAKE_INVALID(ssprintf("Invalid difficulty '%s'", sTrail.c_str())); + } + else + { + Trail* tr = pCourse->GetTrail(pStyle->m_StepsType, cd); + CHECK_INVALID_COND(m_pTrail, tr, (tr == NULL), + ("Trail \"" + sTrail + "\" not found.")); } } } @@ -328,23 +331,28 @@ void GameCommand::LoadOne( const Command& cmd ) else if( sName == "setenv" ) { - if( cmd.m_vsArgs.size() == 3 ) - m_SetEnv[ cmd.m_vsArgs[1] ] = cmd.m_vsArgs[2]; + if((cmd.m_vsArgs.size() - 1) % 2 != 0) + { + MAKE_INVALID("Arguments to setenv game command must be key,value pairs."); + } + else + { + for(size_t i= 1; i < cmd.m_vsArgs.size(); i+= 2) + { + m_SetEnv[cmd.m_vsArgs[i]]= cmd.m_vsArgs[i+1]; + } + } } else if( sName == "songgroup" ) { - m_sSongGroup = sValue; + CHECK_INVALID_COND(m_sSongGroup, sValue, (!SONGMAN->DoesSongGroupExist(sValue)), ("Song group \"" + sValue + "\" does not exist.")); } else if( sName == "sort" ) { - m_SortOrder = StringToSortOrder( sValue ); - if( m_SortOrder == SortOrder_Invalid ) - { - m_sInvalidReason = ssprintf( "SortOrder \"%s\" is not valid.", sValue.c_str() ); - m_bInvalid = true; - } + SortOrder so= StringToSortOrder(sValue); + CHECK_INVALID_VALUE(m_SortOrder, so, SortOrder_Invalid, sortorder); } else if( sName == "weight" ) @@ -359,7 +367,8 @@ void GameCommand::LoadOne( const Command& cmd ) else if( sName == "goaltype" ) { - m_GoalType = StringToGoalType( sValue ); + GoalType go= StringToGoalType(sValue); + CHECK_INVALID_VALUE(m_GoalType, go, GoalType_Invalid, goaltype); } else if( sName == "profileid" ) @@ -412,15 +421,23 @@ void GameCommand::LoadOne( const Command& cmd ) else if( sName == "setpref" ) { - if( cmd.m_vsArgs.size() == 3 ) + if((cmd.m_vsArgs.size() - 1) % 2 != 0) { - IPreference *pPref = IPreference::GetPreferenceByName( cmd.m_vsArgs[1] ); - if( pPref == NULL ) + MAKE_INVALID("Arguments to setpref game command must be key,value pairs."); + } + else + { + for(size_t i= 1; i < cmd.m_vsArgs.size(); i+= 2) { - m_sInvalidReason = ssprintf("unknown preference \"%s\"", cmd.m_vsArgs[1].c_str() ); - m_bInvalid = true; + if(IPreference::GetPreferenceByName(cmd.m_vsArgs[i]) == NULL) + { + MAKE_INVALID("Unknown preference \"" + cmd.m_vsArgs[i] + "\"."); + } + else + { + m_SetPref[cmd.m_vsArgs[i]]= cmd.m_vsArgs[i+1]; + } } - pPref->FromString(cmd.m_vsArgs[2]); } } @@ -432,13 +449,19 @@ void GameCommand::LoadOne( const Command& cmd ) m_fMusicFadeOutVolume = static_cast(atof( cmd.m_vsArgs[1] )); m_fMusicFadeOutSeconds = static_cast(atof( cmd.m_vsArgs[2] )); } + else + { + MAKE_INVALID("Wrong number of args to fademusic."); + } } else { - RString sWarning = ssprintf( "Command '%s' is not valid.", cmd.GetOriginalCommandString().c_str() ); - LuaHelpers::ReportScriptError(sWarning, "INVALID_GAME_COMMAND"); + MAKE_INVALID(ssprintf( "Command '%s' is not valid.", cmd.GetOriginalCommandString().c_str())); } +#undef CHECK_INVALID_VALUE +#undef CHECK_INVALID_COND +#undef MAKE_INVALID } int GetNumCreditsPaid() @@ -457,8 +480,8 @@ int GetCreditsRequiredToPlayStyle( const Style *style ) { // GameState::GetCoinsNeededToJoin returns 0 if the coin mode isn't // CoinMode_Pay, which means the theme can't make sure that there are - // enough credits available. GameCommand::IsPlayable will cause a crash - // if there aren't enough credits. So we have to check the coin mode here + // enough credits available. + // So we have to check the coin mode here // and return 0 if the player doesn't have to pay. if( GAMESTATE->GetCoinMode() != CoinMode_Pay ) { @@ -692,7 +715,7 @@ void GameCommand::ApplySelf( const vector &vpns ) const } break; default: - FAIL_M(ssprintf("Invalid StyleType: %i", m_pStyle->m_StyleType)); + LuaHelpers::ReportScriptError("Invalid StyleType: " + m_pStyle->m_StyleType); } } if( m_dc != Difficulty_Invalid ) @@ -754,6 +777,14 @@ void GameCommand::ApplySelf( const vector &vpns ) const lua_pop( L, 1 ); LUA->Release(L); } + for(map::const_iterator setting= m_SetPref.begin(); setting != m_SetPref.end(); ++setting) + { + IPreference* pref= IPreference::GetPreferenceByName(setting->first); + if(pref != NULL) + { + pref->FromString(setting->second); + } + } if( !m_sSongGroup.empty() ) GAMESTATE->m_sPreferredSongGroup.Set( m_sSongGroup ); if( m_SortOrder != SortOrder_Invalid ) diff --git a/src/GameCommand.h b/src/GameCommand.h index d0641292ba..cad1ae9c62 100644 --- a/src/GameCommand.h +++ b/src/GameCommand.h @@ -34,7 +34,7 @@ public: m_sAnnouncer(""), m_sPreferredModifiers(""), m_sStageModifiers(""), m_sScreen(""), m_LuaFunction(), m_pSong(NULL), m_pSteps(NULL), m_pCourse(NULL), - m_pTrail(NULL), m_pCharacter(NULL), m_SetEnv(), + m_pTrail(NULL), m_pCharacter(NULL), m_SetEnv(), m_SetPref(), m_sSongGroup(""), m_SortOrder(SortOrder_Invalid), m_sSoundPath(""), m_vsScreensToPrepare(), m_iWeightPounds(-1), m_iGoalCalories(-1), m_GoalType(GoalType_Invalid), @@ -92,6 +92,7 @@ public: Trail* m_pTrail; Character* m_pCharacter; std::map m_SetEnv; + std::map m_SetPref; RString m_sSongGroup; SortOrder m_SortOrder; RString m_sSoundPath; // "" for no sound diff --git a/src/HoldJudgment.cpp b/src/HoldJudgment.cpp index eefa50632f..26656d8120 100644 --- a/src/HoldJudgment.cpp +++ b/src/HoldJudgment.cpp @@ -27,7 +27,7 @@ void HoldJudgment::Load( const RString &sPath ) void HoldJudgment::LoadFromNode( const XNode* pNode ) { RString sFile; - if( ActorUtil::GetAttrPath(pNode, "File", sFile) ) + if(!ActorUtil::GetAttrPath(pNode, "File", sFile)) { LuaHelpers::ReportScriptErrorFmt("%s: HoldJudgment: missing the attribute \"File\"", ActorUtil::GetWhere(pNode).c_str()); } diff --git a/src/OptionRowHandler.cpp b/src/OptionRowHandler.cpp index cefa228f94..9d2893e2b4 100644 --- a/src/OptionRowHandler.cpp +++ b/src/OptionRowHandler.cpp @@ -434,7 +434,7 @@ class OptionRowHandlerListSteps : public OptionRowHandlerList m_Def.m_vsChoices.push_back( "" ); m_aListEntries.push_back( GameCommand() ); } - else if( GAMESTATE->IsCourseMode() && GAMESTATE->m_pCurCourse ) // playing a course + else if(GAMESTATE->GetCurrentStyle() && GAMESTATE->IsCourseMode() && GAMESTATE->m_pCurCourse) // playing a course { m_Def.m_bOneChoiceForAllPlayers = (bool)PREFSMAN->m_bLockCourseDifficulties; m_Def.m_layoutType = StringToLayoutType( STEPS_ROW_LAYOUT_TYPE ); @@ -453,7 +453,7 @@ class OptionRowHandlerListSteps : public OptionRowHandlerList m_aListEntries.push_back( mc ); } } - else if( GAMESTATE->m_pCurSong ) // playing a song + else if(GAMESTATE->GetCurrentStyle() && GAMESTATE->m_pCurSong) // playing a song { m_Def.m_layoutType = StringToLayoutType( STEPS_ROW_LAYOUT_TYPE ); @@ -634,26 +634,31 @@ public: { unsigned i = iter - m_vSteps.begin(); vbSelOut[i] = true; - return; + continue; } // look for matching difficulty + bool matched= false; if( m_pDifficultyToFill ) { FOREACH_CONST( Difficulty, m_vDifficulties, d ) { unsigned i = d - m_vDifficulties.begin(); - if( *d == GAMESTATE->m_PreferredDifficulty[0] ) + if( *d == GAMESTATE->m_PreferredDifficulty[p] ) { vbSelOut[i] = true; + matched= true; vector v; v.push_back( p ); ExportOption( v, vbSelectedOut ); // current steps changed - continue; + break; } } } - // default to 1st - vbSelOut[0] = true; + if(!matched) + { + // default to 1st + vbSelOut[0] = true; + } } } virtual int ExportOption( const vector &vpns, const vector vbSelected[NUM_PLAYERS] ) const diff --git a/src/ScreenManager.cpp b/src/ScreenManager.cpp index 6df06f2a71..eacb2a207c 100644 --- a/src/ScreenManager.cpp +++ b/src/ScreenManager.cpp @@ -367,6 +367,12 @@ bool ScreenManager::AllowOperatorMenuButton() const return true; } +bool ScreenManager::IsScreenNameValid(RString const& name) const +{ + RString ClassName = THEME->GetMetric(name,"Class"); + return g_pmapRegistrees->find(ClassName) != g_pmapRegistrees->end(); +} + bool ScreenManager::IsStackedScreen( const Screen *pScreen ) const { // True if the screen is in the screen stack, but not the first. diff --git a/src/ScreenManager.h b/src/ScreenManager.h index 304cb77d5b..f43b000b66 100644 --- a/src/ScreenManager.h +++ b/src/ScreenManager.h @@ -39,6 +39,8 @@ public: Screen *GetScreen( int iPosition ); bool AllowOperatorMenuButton() const; + bool IsScreenNameValid(RString const& name) const; + // System messages void SystemMessage( const RString &sMessage ); void SystemMessageNoAnimate( const RString &sMessage ); From 273b76d3c7e626d1e43b5da37b800c383cfc3f4f Mon Sep 17 00:00:00 2001 From: Kyzentun Date: Mon, 14 Jul 2014 18:02:28 -0600 Subject: [PATCH 15/80] ActorUtil::ResolvePath updated for error reporting. Changed BitmapText to work with either a font name or a path. ThemeManager::GetPathInfoRaw fixed to use correct error dialog. ThemeManager::GetPathInfo fixed to report correct error for missing theme elements. --- src/ActorUtil.cpp | 4 ++-- src/BitmapText.cpp | 28 +++++++++++++++------------- src/ThemeManager.cpp | 11 ++++++----- 3 files changed, 23 insertions(+), 20 deletions(-) diff --git a/src/ActorUtil.cpp b/src/ActorUtil.cpp index a8a50dd550..3d48573c6c 100644 --- a/src/ActorUtil.cpp +++ b/src/ActorUtil.cpp @@ -55,7 +55,7 @@ bool ActorUtil::ResolvePath( RString &sPath, const RString &sName ) if( asPaths.empty() ) { RString sError = ssprintf( "%s: references a file \"%s\" which doesn't exist", sName.c_str(), sPath.c_str() ); - switch( Dialog::AbortRetryIgnore( sError, "BROKEN_FILE_REFERENCE" ) ) + switch(LuaHelpers::ReportScriptError(sError, "BROKEN_FILE_REFERENCE", true)) { case Dialog::abort: RageException::Throw( "%s", sError.c_str() ); @@ -76,7 +76,7 @@ bool ActorUtil::ResolvePath( RString &sPath, const RString &sName ) { RString sError = ssprintf( "%s: references a file \"%s\" which has multiple matches", sName.c_str(), sPath.c_str() ); sError += "\n" + join( "\n", asPaths ); - switch( Dialog::AbortRetryIgnore( sError, "BROKEN_FILE_REFERENCE" ) ) + switch(LuaHelpers::ReportScriptError(sError, "BROKEN_FILE_REFERENCE", true)) { case Dialog::abort: RageException::Throw( "%s", sError.c_str() ); diff --git a/src/BitmapText.cpp b/src/BitmapText.cpp index 3fc7525637..fd55c067d2 100644 --- a/src/BitmapText.cpp +++ b/src/BitmapText.cpp @@ -126,21 +126,23 @@ void BitmapText::LoadFromNode( const XNode* pNode ) ThemeManager::EvaluateString( sAltText ); RString sFont; - // The short circuiting loading condition that was here before wasn't short circuiting correctly on all platforms. - if(!ActorUtil::GetAttrPath(pNode, "Font", sFont)) + // Allow the Font attribute to be either a path or simply the name of a font. + // If it's a path, it will have a slash in it. + // Also allow it to be set through either "Font" or through "File". + if(!pNode->GetAttrValue("Font", sFont) && !pNode->GetAttrValue("File", sFont)) { - if(!ActorUtil::GetAttrPath(pNode, "File", sFont)) - { - if( !pNode->GetAttrValue("Font", sFont) && - !pNode->GetAttrValue("File", sFont) ) // accept "File" for backward compatibility - { - LuaHelpers::ReportScriptErrorFmt( "%s: BitmapText: Font or File attribute not found", - ActorUtil::GetWhere(pNode).c_str() ); - sFont = "Common Normal"; - } - } + LuaHelpers::ReportScriptErrorFmt("%s: BitmapText: Font or File attribute not found", + ActorUtil::GetWhere(pNode).c_str()); + sFont = "Common Normal"; + } + if(sFont.find("/") == RString::npos) + { + sFont= THEME->GetPathF("", sFont); + } + else if(!ActorUtil::ResolvePath(sFont, ActorUtil::GetWhere(pNode))) + { + sFont= THEME->GetPathF("", "Common Normal"); } - sFont = THEME->GetPathF( "", sFont ); LoadFromFont( sFont ); diff --git a/src/ThemeManager.cpp b/src/ThemeManager.cpp index b8adc806b5..fbf70293a6 100644 --- a/src/ThemeManager.cpp +++ b/src/ThemeManager.cpp @@ -722,7 +722,7 @@ bool ThemeManager::GetPathInfoToRaw( PathInfo &out, const RString &sThemeName_, "Verify that this redirect is correct.", sPath.c_str(), sNewFileName.c_str()); - switch( LuaHelpers::ReportScriptError(sMessage) ) + switch(LuaHelpers::ReportScriptError(sMessage, "", true)) { case Dialog::retry: ReloadMetrics(); @@ -815,11 +815,12 @@ try_element_again: goto try_element_again; case Dialog::ignore: { - RString error= ssprintf(sCategory + '/' + sFileName, - "could not be found in \"%s\" or \"%s\".", - GetThemeDirFromName(m_sCurThemeName).c_str(), - GetThemeDirFromName(SpecialFiles::BASE_THEME_NAME).c_str() ); + RString error= sCategory + '/' + sFileName + + " could not be found in \"" + + GetThemeDirFromName(m_sCurThemeName).c_str() + "\" or \"" + + GetThemeDirFromName(SpecialFiles::BASE_THEME_NAME).c_str() + "\"."; LOG->UserLog("Theme element", "%s", error.c_str()); + LOG->Warn(error.c_str()); LuaHelpers::ScriptErrorMessage(error); } From 0f72d7cc6b6a695c2777378f10404c65ebbc67bd Mon Sep 17 00:00:00 2001 From: Kyzentun Date: Tue, 15 Jul 2014 13:28:06 -0600 Subject: [PATCH 16/80] Changed NoteSkinManager to use new error reporting and avoid crashing. Fixed DoChangeTheme to switch to the InitialScreen if the screen doesn't exist in the theme being changed to. Fixed error reporting in MeterDisplay. --- src/DifficultyList.cpp | 6 +++- src/GameLoop.cpp | 7 ++++ src/GameState.cpp | 2 +- src/MeterDisplay.cpp | 6 ++-- src/NoteSkinManager.cpp | 80 ++++++++++++++++++++++++++++------------- src/ScreenManager.cpp | 5 +++ 6 files changed, 76 insertions(+), 30 deletions(-) diff --git a/src/DifficultyList.cpp b/src/DifficultyList.cpp index d24d44ad5e..d24fadd9f4 100644 --- a/src/DifficultyList.cpp +++ b/src/DifficultyList.cpp @@ -37,7 +37,11 @@ void StepsDisplayList::LoadFromNode( const XNode* pNode ) { ActorFrame::LoadFromNode( pNode ); - ASSERT_M( !m_sName.empty(), "StepsDisplayList must have a Name" ); + if(m_sName.empty()) + { + LuaHelpers::ReportScriptError("StepsDisplayList must have a Name"); + return; + } ITEMS_SPACING_Y.Load( m_sName, "ItemsSpacingY" ); NUM_SHOWN_ITEMS.Load( m_sName, "NumShownItems" ); diff --git a/src/GameLoop.cpp b/src/GameLoop.cpp index d30cba98da..74ccdb0d6a 100644 --- a/src/GameLoop.cpp +++ b/src/GameLoop.cpp @@ -145,6 +145,13 @@ namespace StepMania::ResetGame(); SCREENMAN->ThemeChanged(); + // Not all themes use the same screen names! Check whether the new + // screen is valid in the new theme before setting it. Use the + // InitialScreen metric if it's not. + if(!SCREENMAN->IsScreenNameValid(g_sNewScreen)) + { + g_sNewScreen= THEME->GetMetric("Common", "InitialScreen"); + } SCREENMAN->SetNewScreen( g_sNewScreen ); g_sNewTheme = RString(); diff --git a/src/GameState.cpp b/src/GameState.cpp index 0436e65a43..67a3135d87 100644 --- a/src/GameState.cpp +++ b/src/GameState.cpp @@ -223,7 +223,7 @@ void GameState::ApplyGameCommand( const RString &sCommand, PlayerNumber pn ) RString sWhy; if( !m.IsPlayable(&sWhy) ) { - LuaHelpers::ReportScriptErrorFmt("Can't apply mode \"%s\": %s", sCommand.c_str(), sWhy.c_str()); + LuaHelpers::ReportScriptErrorFmt("Can't apply GameCommand \"%s\": %s", sCommand.c_str(), sWhy.c_str()); return; } diff --git a/src/MeterDisplay.cpp b/src/MeterDisplay.cpp index 389b5311ce..9fa6e19c4c 100644 --- a/src/MeterDisplay.cpp +++ b/src/MeterDisplay.cpp @@ -35,11 +35,9 @@ void MeterDisplay::LoadFromNode( const XNode* pNode ) if( pStream == NULL ) { LuaHelpers::ReportScriptErrorFmt("%s: MeterDisplay: missing the \"Stream\" attribute", ActorUtil::GetWhere(pNode).c_str()); + return; } - else - { - m_sprStream.LoadActorFromNode( pStream, this ); - } + m_sprStream.LoadActorFromNode( pStream, this ); m_sprStream->SetName( "Stream" ); //LOAD_ALL_COMMANDS( m_sprStream ); this->AddChild( m_sprStream ); diff --git a/src/NoteSkinManager.cpp b/src/NoteSkinManager.cpp index fa4b5415bc..0ca23377a6 100644 --- a/src/NoteSkinManager.cpp +++ b/src/NoteSkinManager.cpp @@ -112,7 +112,11 @@ void NoteSkinManager::LoadNoteSkinDataRecursive( const RString &sNoteSkinName_, while(1) { ++iDepth; - ASSERT_M( iDepth < 20, "Circular NoteSkin fallback references detected." ); + if(iDepth >= 20) + { + LuaHelpers::ReportScriptError("Circular NoteSkin fallback references detected.", "NOTESKIN_ERROR"); + return; + } RString sDir = SpecialFiles::NOTESKINS_DIR + m_pCurGame->m_szName + "/" + sNoteSkinName + "/"; if( !FILEMAN->IsADirectory(sDir) ) @@ -120,8 +124,9 @@ void NoteSkinManager::LoadNoteSkinDataRecursive( const RString &sNoteSkinName_, sDir = GLOBAL_BASE_DIR + sNoteSkinName + "/"; if( !FILEMAN->IsADirectory(sDir) ) { - LOG->Trace( "NoteSkin \"%s\" references skin \"%s\" that is not present", - data_out.sName.c_str(), sNoteSkinName.c_str() ); + LuaHelpers::ReportScriptError("NoteSkin \"" + data_out.sName + + "\" references skin \"" + sNoteSkinName + "\" that is not present", + "NOTESKIN_ERROR"); return; } } @@ -234,7 +239,11 @@ void NoteSkinManager::GetAllNoteSkinNamesForGame( const Game *pGame, vector::const_iterator it = g_mapNameToData.find(sNoteSkinName); @@ -245,8 +254,12 @@ RString NoteSkinManager::GetMetric( const RString &sButtonName, const RString &s if( data.metrics.GetValue( sButtonName, sValue, sReturn ) ) return sReturn; if( !data.metrics.GetValue( "NoteDisplay", sValue, sReturn ) ) - RageException::Throw( "Could not read metric \"%s::%s\" or \"NoteDisplay::%s\" in \"%s\".", - sButtonName.c_str(), sValue.c_str(), sValue.c_str(), sNoteSkinName.c_str() ); + { + LuaHelpers::ReportScriptError("Could not read metric \"" + sButtonName + + "::" + sValue + "\" or \"NoteDisplay::" + sValue + "\" in \"" + + sNoteSkinName + "\".", "NOTESKIN_ERROR"); + return ""; + } return sReturn; } @@ -320,15 +333,18 @@ RString NoteSkinManager::GetPath( const RString &sButtonName, const RString &sEl sButtonName.c_str(), sElement.c_str(), sPaths.c_str() ); - if( Dialog::AbortRetryIgnore(message) == Dialog::retry ) + switch(LuaHelpers::ReportScriptError(message, "NOTESKIN_ERROR", true)) { - FOREACH_CONST( RString, data.vsDirSearchOrder, dir ) - FILEMAN->FlushDirCache( *dir ); - g_PathCache.clear(); - return GetPath( sButtonName, sElement ); + case Dialog::retry: + FOREACH_CONST(RString, data.vsDirSearchOrder, dir) + FILEMAN->FlushDirCache(*dir); + g_PathCache.clear(); + return GetPath(sButtonName, sElement); + case Dialog::abort: + RageException::Throw("%s", message.c_str()); + case Dialog::ignore: + return ""; } - - RageException::Throw( "%s", message.c_str() ); } int iLevel = 0; @@ -355,15 +371,18 @@ RString NoteSkinManager::GetPath( const RString &sButtonName, const RString &sEl "Verify that this redirect is correct.", sPath.c_str(), sNewFileName.c_str()); - if( Dialog::AbortRetryIgnore(message) == Dialog::retry ) + switch(LuaHelpers::ReportScriptError(message, "NOTESKIN_ERROR", true)) { - FOREACH_CONST( RString, data.vsDirSearchOrder, dir ) - FILEMAN->FlushDirCache( *dir ); - g_PathCache.clear(); - return GetPath( sButtonName, sElement ); + case Dialog::retry: + FOREACH_CONST(RString, data.vsDirSearchOrder, dir) + FILEMAN->FlushDirCache(*dir); + g_PathCache.clear(); + return GetPath(sButtonName, sElement); + case Dialog::abort: + RageException::Throw("%s", message.c_str()); + case Dialog::ignore: + return ""; } - - RageException::Throw( "%s", message.c_str() ); } sPath = sRealPath; @@ -376,7 +395,11 @@ RString NoteSkinManager::GetPath( const RString &sButtonName, const RString &sEl bool NoteSkinManager::PushActorTemplate( Lua *L, const RString &sButton, const RString &sElement, bool bSpriteOnly ) { map::const_iterator iter = g_mapNameToData.find( m_sCurrentNoteSkin ); - ASSERT( iter != g_mapNameToData.end() ); + if(iter == g_mapNameToData.end()) + { + LuaHelpers::ReportScriptError("No current noteskin set!", "NOTESKIN_ERROR"); + return false; + } const NoteSkinData &data = iter->second; LuaThreadVariable varPlayer( "Player", LuaReference::Create(m_PlayerNumber) ); @@ -385,7 +408,11 @@ bool NoteSkinManager::PushActorTemplate( Lua *L, const RString &sButton, const R LuaThreadVariable varElement( "Element", sElement ); LuaThreadVariable varSpriteOnly( "SpriteOnly", LuaReference::Create(bSpriteOnly) ); - ASSERT( !data.m_Loader.IsNil() ); + if(data.m_Loader.IsNil()) + { + LuaHelpers::ReportScriptError("No loader for noteskin!", "NOTESKIN_ERROR"); + return false; + } data.m_Loader.PushSelf( L ); lua_remove( L, -2 ); lua_getfield( L, -1, "Load" ); @@ -437,7 +464,7 @@ RString NoteSkinManager::GetPathFromDirAndFile( const RString &sDir, const RStri if( matches.size() > 1 ) { RString sError = "Multiple files match '"+sDir+sFileName+"'. Please remove all but one of these files."; - Dialog::OK( sError ); + LuaHelpers::ReportScriptError(sError, "NOTESKIN_ERROR"); } return matches[0]; @@ -469,7 +496,12 @@ public: static int x ## ForNoteSkin( T* p, lua_State *L ) \ { \ const RString sOldNoteSkin = p->GetCurrentNoteSkin(); \ - p->SetCurrentNoteSkin( SArg(n+1) ); \ + RString nsname= SArg(n+1); \ + if(!p->DoesNoteSkinExist(nsname)) \ + { \ + luaL_error(L, "Noteskin \"%s\" does not exist.", nsname.c_str()); \ + } \ + p->SetCurrentNoteSkin( nsname ); \ x( p, L ); \ p->SetCurrentNoteSkin( sOldNoteSkin ); \ return 1; \ diff --git a/src/ScreenManager.cpp b/src/ScreenManager.cpp index eacb2a207c..b8b75aa85d 100644 --- a/src/ScreenManager.cpp +++ b/src/ScreenManager.cpp @@ -722,6 +722,11 @@ void ScreenManager::LoadDelayedScreen() { RString sScreenName = m_sDelayedScreen; m_sDelayedScreen = ""; + if(!IsScreenNameValid(sScreenName)) + { + LuaHelpers::ReportScriptError("Tried to go to invalid screen: " + sScreenName, "INVALID_SCREEN"); + return; + } // Pop the top screen, if any. ScreenMessage SM = PopTopScreenInternal(); From dfd7b1141296bc5da277114de7fe211be8be7877 Mon Sep 17 00:00:00 2001 From: freem Date: Tue, 15 Jul 2014 20:39:01 -0500 Subject: [PATCH 17/80] [ScreenSystemLayer] restore "Not Present" text in CoinMode_Home (also gave a possible answer to the comment added during the removal of pay mode) --- src/ScreenSystemLayer.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/ScreenSystemLayer.cpp b/src/ScreenSystemLayer.cpp index a705cb68df..74f3642573 100644 --- a/src/ScreenSystemLayer.cpp +++ b/src/ScreenSystemLayer.cpp @@ -100,7 +100,11 @@ namespace switch( GAMESTATE->GetCoinMode() ) { case CoinMode_Home: - return CREDITS_PRESS_START.GetValue(); + if( GAMESTATE->PlayersCanJoin() ) + return CREDITS_PRESS_START.GetValue(); + else + return CREDITS_NOT_PRESENT.GetValue(); + case CoinMode_Pay: // GCC is picky and needs this to be bracketed { @@ -119,8 +123,8 @@ namespace default: // CoinMode_Free if( GAMESTATE->PlayersCanJoin() ) return CREDITS_FREE_PLAY.GetValue(); - // TODO: What should be displayed if players - // can't join in free mode? + // TODO: What should be displayed if players can't join in free mode? + // Probably something like "Please Wait" or "Cannot Join"? -freem } } return RString(); From 8a65dfaefa6c5e159ce5491be82bc3454f398d3f Mon Sep 17 00:00:00 2001 From: Kyzentun Date: Wed, 16 Jul 2014 02:03:06 -0600 Subject: [PATCH 18/80] Tested and fixed error reporting for NoteSkinManager. Changed Sprite::Sprite() to load the default texture. --- src/NoteSkinManager.cpp | 34 +++++++++++++++++++++++++++++----- src/Sprite.cpp | 3 +++ 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/src/NoteSkinManager.cpp b/src/NoteSkinManager.cpp index 0ca23377a6..198c9812db 100644 --- a/src/NoteSkinManager.cpp +++ b/src/NoteSkinManager.cpp @@ -291,7 +291,14 @@ RString NoteSkinManager::GetPath( const RString &sButtonName, const RString &sEl if( it != g_PathCache.end() ) return it->second; - map::const_iterator iter = g_mapNameToData.find( m_sCurrentNoteSkin ); + if(m_sCurrentNoteSkin.empty()) + { + LuaHelpers::ReportScriptError("NOTESKIN:GetPath: No noteskin currently set.", "NOTESKIN_ERROR"); + return ""; + } + RString sNoteSkinName = m_sCurrentNoteSkin; + sNoteSkinName.MakeLower(); + map::const_iterator iter = g_mapNameToData.find( sNoteSkinName ); ASSERT( iter != g_mapNameToData.end() ); const NoteSkinData &data = iter->second; @@ -351,8 +358,12 @@ RString NoteSkinManager::GetPath( const RString &sButtonName, const RString &sEl while( GetExtension(sPath) == "redir" ) { iLevel++; - ASSERT_M( iLevel < 100, ssprintf("Infinite recursion while looking up %s - %s", sButtonName.c_str(), sElement.c_str()) ); - + if(iLevel >= 100) + { + LuaHelpers::ReportScriptError("Infinite recursion while looking up " + + sButtonName + " - " + sElement, "NOTESKIN_ERROR"); + return ""; + } RString sNewFileName; GetFileContents( sPath, sNewFileName, true ); RString sRealPath; @@ -434,6 +445,10 @@ Actor *NoteSkinManager::LoadActor( const RString &sButton, const RString &sEleme if( pNode.get() == NULL ) { // XNode will warn about the error + if(bSpriteOnly) + { + return new Sprite; + } return new Actor; } @@ -446,7 +461,11 @@ Actor *NoteSkinManager::LoadActor( const RString &sButton, const RString &sEleme // Make sure pActor is a Sprite (or something derived from Sprite). Sprite *pSprite = dynamic_cast( pRet ); if( pSprite == NULL ) - LuaHelpers::ReportScriptErrorFmt( "%s: %s %s must be a Sprite", m_sCurrentNoteSkin.c_str(), sButton.c_str(), sElement.c_str() ); + { + LuaHelpers::ReportScriptErrorFmt("%s: %s %s must be a Sprite", m_sCurrentNoteSkin.c_str(), sButton.c_str(), sElement.c_str()); + delete pRet; + return new Sprite; + } } return pRet; @@ -463,7 +482,12 @@ RString NoteSkinManager::GetPathFromDirAndFile( const RString &sDir, const RStri if( matches.size() > 1 ) { - RString sError = "Multiple files match '"+sDir+sFileName+"'. Please remove all but one of these files."; + RString sError = "Multiple files match '"+sDir+sFileName+"'. Please remove all but one of these files: "; + sError+= matches[1]; + for(size_t n= 1; n < matches.size(); ++n) + { + sError+= ", " + matches[n]; + } LuaHelpers::ReportScriptError(sError, "NOTESKIN_ERROR"); } diff --git a/src/Sprite.cpp b/src/Sprite.cpp index 0e67cde16e..3a82cf343b 100644 --- a/src/Sprite.cpp +++ b/src/Sprite.cpp @@ -32,6 +32,9 @@ Sprite::Sprite() m_fTexCoordVelocityX = 0; m_fTexCoordVelocityY = 0; + + // An uninitialized sprite should be valid to display. -Kyz + Load(TEXTUREMAN->GetDefaultTextureID()); } From bf4599421f3bb00702de281a30cc20b53f5e39cf Mon Sep 17 00:00:00 2001 From: Dan Guzek Date: Wed, 16 Jul 2014 05:04:53 -0400 Subject: [PATCH 19/80] new mkrelease script for OS X This commit does a few things: 1. includes a new mkrelease script for OS X devs to bundle releases with 2. removes the old Perl scripts that sort of accomplished the same task 3. includes a README documenting how to use the new script The old scripts were brittle and inefficient. The new script is written in Ruby because it is what I'm familiar with and because OS X has shipped with Ruby since version 10.5.0. --- Xcode/scripts/README.md | 15 ++++ Xcode/scripts/increment_version.pl | 19 ----- Xcode/scripts/mkrelease.pl | 112 ----------------------------- Xcode/scripts/mkrelease.rb | 58 +++++++++++++++ 4 files changed, 73 insertions(+), 131 deletions(-) create mode 100644 Xcode/scripts/README.md delete mode 100644 Xcode/scripts/increment_version.pl delete mode 100644 Xcode/scripts/mkrelease.pl create mode 100644 Xcode/scripts/mkrelease.rb diff --git a/Xcode/scripts/README.md b/Xcode/scripts/README.md new file mode 100644 index 0000000000..282dad2ca1 --- /dev/null +++ b/Xcode/scripts/README.md @@ -0,0 +1,15 @@ +StepMania Scripts For OS X +========= + +This script can be used to bundle a .dmg installer of StepMania. +It assumes you have already built a StepMania.app using Xcode and +that your stepmania directory structure is intact as you cloned it. + +To use this script, open a terminal and cd to your stepmania directory, +then run the following commands: + +cd Xcode/scripts +ruby mkrelease.rb + +You'll see output as each stepmania sub-directory is copied into a tmp directory. +If all goes well, you'll be notified that the dmg was created in your stepmania directory. \ No newline at end of file diff --git a/Xcode/scripts/increment_version.pl b/Xcode/scripts/increment_version.pl deleted file mode 100644 index d0a8956f17..0000000000 --- a/Xcode/scripts/increment_version.pl +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/perl -w -use File::Copy; - -$ver = 0; -if( open FH, ' =~ /version_num = (\d+);/ and $ver = $1 + 1; - close FH; -} -chop( $date = `date` ); -chop( $time = `time` ); -open FH, '>.ver.tmp' or die $!; -print FH <<"EOF"; -extern const unsigned long version_num = $ver; -extern const char *const version_date = "$date"; -extern const char *const version_time = "$time"; -EOF -close FH; -move '.ver.tmp', 'ver.cpp'; diff --git a/Xcode/scripts/mkrelease.pl b/Xcode/scripts/mkrelease.pl deleted file mode 100644 index ef966c4212..0000000000 --- a/Xcode/scripts/mkrelease.pl +++ /dev/null @@ -1,112 +0,0 @@ -#!/usr/bin/perl -w - -use strict; -use File::Copy; -use File::Path; -use File::Basename; -use File::Temp qw/tempfile tempdir/; -use Cwd; - -my @docs = ( - "Licenses.txt", - "Changelog_sm5.txt", - "Changelog_sm-ssc.txt", - "Changelog_SSCformat.txt", - "CommandLineArgs.txt", - "credits.txt" -); - -my @themerdocs = ( - "actordef.txt", - "conditional_music.txt", - "fontini.txt", - "gamecommands.txt", - "included_scripts.txt", - "moremsg.txt", - "Noteskin elements Reference.txt", - "recommended_practices.txt", - "ScreenMessages.txt", - "ScreenTextEntry.txt", - "sm-ssc_themeguide.txt", - "ThemePrefs.txt", - "ThemePrefsRows.txt" -); - -# XXX -my @songs = ( "Instructions.txt" ); -my @song_mechatribe = ( - "Mecha-Tribe Assault.ssc", - "Mecha-Tribe Assault.ogg", - "mechatribeassaultbg.png", - "mechatribeassaultbn.png", - "wyde cd-tital.png" -); - -my @song_springtime = ( - "Springtime.ssc", - "Kommisar - Springtime.mp3", - "spring.png", - "springbn.png" -); - -# Passing a date for a CVS release gives StepMania-CVS-date. -# Otherwise you get StepMania-ver. -die "usage: $0 [date]\n" if @ARGV > 1; -my $root = getcwd; -my $scripts = dirname $0; -my $srcdir = ( $scripts =~ m{^/} ? "$scripts/../.." : - "$root/$scripts/../.." ); -my $family; -my $id; -my $ver; - -open FH, "$srcdir/src/ProductInfo.h" or die "Where am I?\n"; -while( ) -{ - if( /^#define\s+PRODUCT_FAMILY_BARE\s+(.*?)\s*$/ ) { - $family = $1; - } elsif( /^#define\s+PRODUCT_ID_BARE\s+(.*?)\s*$/ ) { - $id = $1; - } elsif( /^#define\s+PRODUCT_VER_BARE\s+(.*?)\s*$/ ) { - $ver = $1; - } -} -close FH; - -my $destname = @ARGV ? "$id-$ARGV[0]" : "$family-$ver"; - -$destname =~ s/\s+/-/g; - -my $tmp = tempdir; - -# Copy StepMania and make smzip -system 'cp', '-r', "$srcdir/StepMania.app", $tmp and die "cp -r failed: $!\n"; -system 'strip', '-x', "$tmp/StepMania.app/Contents/MacOS/StepMania"; - -mkdir "$tmp/Packages"; -system "$srcdir/Utils/CreatePackage.pl", $srcdir, "$tmp/Packages" and die "mksmdata.pl failed: $!\n"; - -# Copy docs -mkdir "$tmp/Docs"; -copy "$srcdir/Docs/$_", "$tmp/Docs/$_" for @docs; - -# Copy themer docs -mkdir "$tmp/Docs/Themerdocs"; -copy "$srcdir/Docs/Themerdocs/$_", "$tmp/Docs/Themerdocs/$_" for @themerdocs; - -# Copy songs -mkdir "$tmp/Songs"; -copy "$srcdir/Songs/$_", "$tmp/Songs/$_" for @songs; - -# oh man, is this ugly or what -mkdir "$tmp/Songs/StepMania 5"; - -mkdir "$tmp/Songs/StepMania 5/MechaTribe Assault"; -copy "$srcdir/Songs/StepMania 5/MechaTribe Assault/$_", "$tmp/Songs/StepMania 5/MechaTribe Assault/$_" for @song_mechatribe; - -mkdir "$tmp/Songs/StepMania 5/Springtime"; -copy "$srcdir/Songs/StepMania 5/Springtime/$_", "$tmp/Songs/StepMania 5/Springtime/$_" for @song_springtime; - -# Make a dmg -system qw/hdiutil create -ov -format UDZO -imagekey zlib-level=9 -srcfolder/, $tmp, '-volname', $destname, "$root/$destname-mac.dmg"; -rmtree $tmp; diff --git a/Xcode/scripts/mkrelease.rb b/Xcode/scripts/mkrelease.rb new file mode 100644 index 0000000000..20b3156ee9 --- /dev/null +++ b/Xcode/scripts/mkrelease.rb @@ -0,0 +1,58 @@ +# 'fileutils' is used to recursively copy directories +# 'tmpdir' is used to create and work with temporary directories +require 'fileutils' +require 'tmpdir' + +# cd to the StepMania 5 src directory +Dir.chdir "../../src" + +# initialize empty strings +family, version = "" + +# open ProductInfo.h in read-only mode +File.open("#{Dir.pwd}/ProductInfo.h", "r") do |f| + # read each line, matching for product family and version + f.each do |line| + if line.match( /^#define\s+PRODUCT_FAMILY_BARE\s+(.*?)\s*$/ ) + family = $1; + + elsif line.match( /^#define\s+PRODUCT_VER_BARE\s+(.*?)\s*$/ ) + version = $1; + end + end +end + +# replace whitespace with hyphens in version string +version.gsub!(/\s+/,"-") + +# the name of the .dmg file +name = "#{family}-#{version}-mac.dmg" + +# a list of directories we want to include in our .dmg +directories = [ "Announcers", "BackgroundEffects", "BackgroundTransitions", + "BGAnimations", "Characters", "Courses", "Data", "Docs", "Manual", + "NoteSkins", "Scripts", "Songs", "StepMania.app", "Themes" ] + +# cd back to the root of the StepMania 5 directory +Dir.chdir ".." + +# create a temp directory; this will be automatically deleted when the block completes +Dir.mktmpdir {|temp| + + # nest two directories named by family and version within the temp directory + # the outer will become the root of the dmg + # the inner will neatly tidy all the contents together so users can easily drag/drop everything at once + FileUtils.mkdir_p("#{temp}/#{family}-#{version}/#{family}-#{version}/") + + # loop through the directories array + directories.each do |directory| + # recursively copy each directory into our temp directory + FileUtils.cp_r directory, "#{temp}/#{family}-#{version}/#{family}-#{version}/", :verbose => true + end + + #construct the shell command that will create the dmg + cmd = "hdiutil create #{Dir.pwd}/#{name} -srcfolder #{temp}/#{family}-#{version} -ov" + + #execute the command in a subshell + system( cmd ) +} \ No newline at end of file From ddf4ba3a2214398a1be21494bf2a6bda0999088b Mon Sep 17 00:00:00 2001 From: Kyzentun Date: Thu, 17 Jul 2014 03:05:50 -0600 Subject: [PATCH 20/80] Readded increment_version.pl because it's actually needed for building on OSX. --- Xcode/scripts/increment_version.pl | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 Xcode/scripts/increment_version.pl diff --git a/Xcode/scripts/increment_version.pl b/Xcode/scripts/increment_version.pl new file mode 100644 index 0000000000..d0a8956f17 --- /dev/null +++ b/Xcode/scripts/increment_version.pl @@ -0,0 +1,19 @@ +#!/usr/bin/perl -w +use File::Copy; + +$ver = 0; +if( open FH, ' =~ /version_num = (\d+);/ and $ver = $1 + 1; + close FH; +} +chop( $date = `date` ); +chop( $time = `time` ); +open FH, '>.ver.tmp' or die $!; +print FH <<"EOF"; +extern const unsigned long version_num = $ver; +extern const char *const version_date = "$date"; +extern const char *const version_time = "$time"; +EOF +close FH; +move '.ver.tmp', 'ver.cpp'; From a2e6d186e306c7f785f4e7fe99d52e164c10a9e0 Mon Sep 17 00:00:00 2001 From: Kyzentun Date: Fri, 18 Jul 2014 16:29:46 -0600 Subject: [PATCH 21/80] Created Def.LogDisplay for displaying messages in a log. Changed error reporting layer to use Def.LogDisplay. Changed engine error reporting to not clip errors to a single line. --- Docs/Luadoc/Lua.xml | 1 + Docs/Luadoc/LuaDocumentation.xml | 4 + Docs/Themerdocs/actordef.txt | 3 +- .../BGAnimations/ScreenSystemLayer error.lua | 175 +--------- Themes/_fallback/Scripts/02 Utilities.lua | 72 ++++ Themes/_fallback/Scripts/04 LogDisplay.lua | 313 ++++++++++++++++++ src/LuaManager.cpp | 31 +- src/ScreenDebugOverlay.cpp | 4 +- 8 files changed, 418 insertions(+), 185 deletions(-) create mode 100644 Themes/_fallback/Scripts/04 LogDisplay.lua diff --git a/Docs/Luadoc/Lua.xml b/Docs/Luadoc/Lua.xml index c2297a38d2..bc4e99d244 100644 --- a/Docs/Luadoc/Lua.xml +++ b/Docs/Luadoc/Lua.xml @@ -1822,6 +1822,7 @@ + diff --git a/Docs/Luadoc/LuaDocumentation.xml b/Docs/Luadoc/LuaDocumentation.xml index bee1948b6f..61886525d3 100644 --- a/Docs/Luadoc/LuaDocumentation.xml +++ b/Docs/Luadoc/LuaDocumentation.xml @@ -749,6 +749,10 @@ save yourself some time, copy this for undocumented things: Tries to read the file at sPath. If successful, it returns the file's contents. If unsuccessful, it returns two values: nil and "error". + + Reports the error through the error reporting system. error_type is the type used for the dialog that is presented, a dialog will not appear for a type the user has chosen to ignore.
+ error is optional an defaults to "Script error occurred.". error_type is optional and defaults to "LUA_ERROR". +
Calls func(...) with two LuaThreadVariables set, and returns the return values of func(). diff --git a/Docs/Themerdocs/actordef.txt b/Docs/Themerdocs/actordef.txt index 3257511314..551600a5cd 100644 --- a/Docs/Themerdocs/actordef.txt +++ b/Docs/Themerdocs/actordef.txt @@ -26,6 +26,7 @@ GrooveRadar HelpDisplay HoldJudgment InputList +LogDisplay MemoryCardDisplay MeterDisplay Model @@ -43,4 +44,4 @@ Sprite StepsDisplay StepsDisplayList TextBanner -WorkoutGraph \ No newline at end of file +WorkoutGraph diff --git a/Themes/_fallback/BGAnimations/ScreenSystemLayer error.lua b/Themes/_fallback/BGAnimations/ScreenSystemLayer error.lua index fed9f3808b..830360a71f 100644 --- a/Themes/_fallback/BGAnimations/ScreenSystemLayer error.lua +++ b/Themes/_fallback/BGAnimations/ScreenSystemLayer error.lua @@ -1,56 +1,9 @@ -- If you are a common themer, DO NOT INCLUDE THIS FILE IN YOUR THEME. -- This layer is purely for error reporting, so that you can see errors on screen easily while running stepmania. -- If you include this file in your theme, you will not benefit from any improvements in error reporting. --- If you want a different background behind the errors, then include "ScreenSystemLayer errorbg.lua" in your theme. -- If you want to adjust how long errors stay on screen for, call the "SetErrorMessageTime" function. (see usage notes in comments above that function) --- Minor text formatting functions from Kyzentun. --- TODO: Figure out why BitmapText:maxwidth doesn't do what I want. -local function width_limit_text(text, limit, natural_zoom) - natural_zoom= natural_zoom or 1 - if text:GetWidth() * natural_zoom > limit then - text:zoomx(limit / text:GetWidth()) - else - text:zoomx(natural_zoom) - end -end - -local function width_clip_text(text, limit) - local full_text= text:GetText() - local fits= text:GetZoomedWidth() <= limit - local prev_max= #full_text - 1 - local prev_min= 0 - if not fits then - while prev_max - prev_min > 1 do - local new_max= math.round((prev_max + prev_min) / 2) - text:settext(full_text:sub(1, 1+new_max)) - if text:GetZoomedWidth() <= limit then - prev_min= new_max - else - prev_max= new_max - end - end - text:settext(full_text:sub(1, 1+prev_min)) - end -end - -local function width_clip_limit_text(text, limit, natural_zoom) - natural_zoom= natural_zoom or text:GetZoomY() - local text_width= text:GetWidth() * natural_zoom - if text_width > limit * 2 then - text:zoomx(natural_zoom * .5) - width_clip_text(text, limit) - else - width_limit_text(text, limit, natural_zoom) - end -end - -local text_actors= {} local line_height= 12 -- A good line height for Common Normal at .5 zoom. -local line_width= SCREEN_WIDTH - 20 - -local next_message_actor= 1 -local show_requested= false local min_message_time= {show= 1, hide= .03125} local default_message_time= {show= 4, hide= .125} @@ -92,130 +45,12 @@ function GetErrorMessageTimeDefault(which) return default_message_time[which] end -local frame_args= { - Name="Error frame", - InitCommand= function(self) - self:y(-SCREEN_HEIGHT) - end, - ScriptErrorMessageCommand = function(self, params) - show_requested= false - self:stoptweening() - self:visible(true) - local covered_height= math.min(line_height * next_message_actor, SCREEN_HEIGHT) - self:y(-SCREEN_HEIGHT + covered_height) - self:sleep(message_time.show) - self:queuecommand("DecNextActor") - -- Shift the text on all the actors being shown up by one. - for i= next_message_actor, 1, -1 do - if text_actors[i] then - text_actors[i]:visible(true) - if i > 1 and text_actors[i-1] then - text_actors[i]:settext(text_actors[i-1]:GetText()) - else - -- Someone long ago decided that it was a good idea for "::" to be - -- a synonym for "\n", so that strings in metrics could have line - -- breaks. - -- So replace "::" with ":" so we don't have unwanted line breaks. - text_actors[i]:settext(params.Message:gsub("::", ":")) - end - width_clip_limit_text(text_actors[i], line_width) - end - end - if next_message_actor <= #text_actors then - next_message_actor= next_message_actor + 1 - end - end, - ToggleErrorsMessageCommand= function(self, params) - if show_requested then - self:playcommand("HideErrors") - else - self:playcommand("ShowErrors") - end - end, - ShowErrorsMessageCommand= function(self, params) - show_requested= true - for i, mactor in ipairs(text_actors) do - if mactor:GetText() ~= "" then - mactor:visible(true) - next_message_actor= next_message_actor + 1 - end - end - next_message_actor= next_message_actor - 1 - local covered_height= math.min(line_height * next_message_actor, SCREEN_HEIGHT) - self:stoptweening() - self:visible(true) - self:linear(message_time.hide) - self:y(-SCREEN_HEIGHT + covered_height) - end, - HideErrorsMessageCommand= function(self, params) - if not show_requested then return end - show_requested= false - self:stoptweening() - next_message_actor= 1 - self:linear(message_time.hide) - self:y(-SCREEN_HEIGHT) - self:queuecommand("HideText") - end, - ClearErrorsMessageCommand= function(self, params) - -- This is so that someone using ShowErrorsMessageCommand can clear ones - -- they've dealt with. - -- Only allow clearing errors that we have scrolled off screen. - for i, mactor in ipairs(text_actors) do - if not mactor:GetVisible() then - mactor:settext("") - end - end - end, - DecNextActorCommand= function(self) - self:linear(message_time.hide) - self:y(self:GetY()-line_height) - if text_actors[next_message_actor] then - text_actors[next_message_actor]:visible(false) - end - next_message_actor= next_message_actor - 1 - if next_message_actor > 1 then - self:queuecommand("DecNextActor") - else - self:queuecommand("Off") - end - end, - HideTextCommand= function(self) - for i, mactor in ipairs(text_actors) do - mactor:visible(false) - end - end, - OffCommand= cmd(visible,false), - Def.Quad { - Name= "errorbg", - InitCommand= function(self) - self:setsize(SCREEN_WIDTH, SCREEN_HEIGHT) - self:horizalign(left) - self:vertalign(top) - self:diffuse(color("0,0,0,0")) - self:diffusealpha(.85) - end, - } +local log_args= { + Name= "ScriptError", + ReplaceLinesWhenHidden= true, + Times= message_time, } --- Create enough text actors that we can fill the screen. -local num_text= SCREEN_HEIGHT / line_height -for i= 1, num_text do - frame_args[#frame_args+1]= LoadFont("Common","Normal") .. { - Name="Text" .. i, - InitCommand= function(self) - -- Put them in the list in reverse order so the ones at the bottom of the screen are used first. - text_actors[num_text-i+1]= self - self:horizalign(left) - self:vertalign(top) - self:x(SCREEN_LEFT + 10) - self:y(SCREEN_TOP + (line_height * (i-1)) + 2) - self:shadowlength(1) - self:zoom(.5) - self:visible(false) - end, - OffCommand= cmd(visible,false), - } -end Trace("Loaded error layer.") -return Def.ActorFrame(frame_args) +return Def.LogDisplay(log_args) diff --git a/Themes/_fallback/Scripts/02 Utilities.lua b/Themes/_fallback/Scripts/02 Utilities.lua index aa99ec0767..2d456e770b 100644 --- a/Themes/_fallback/Scripts/02 Utilities.lua +++ b/Themes/_fallback/Scripts/02 Utilities.lua @@ -371,6 +371,78 @@ function IsUsingWideScreen() end; end; +-- Minor text formatting functions from Kyzentun. +-- TODO: Figure out why BitmapText:maxwidth doesn't do what I want. +-- Intentionally undocumented because they should be moved to BitmapText ASAP +function width_limit_text(text, limit, natural_zoom) + natural_zoom= natural_zoom or 1 + if text:GetWidth() * natural_zoom > limit then + text:zoomx(limit / text:GetWidth()) + else + text:zoomx(natural_zoom) + end +end + +function width_clip_text(text, limit) + local full_text= text:GetText() + local fits= text:GetZoomedWidth() <= limit + local prev_max= #full_text - 1 + local prev_min= 0 + if not fits then + while prev_max - prev_min > 1 do + local new_max= math.round((prev_max + prev_min) / 2) + text:settext(full_text:sub(1, 1+new_max)) + if text:GetZoomedWidth() <= limit then + prev_min= new_max + else + prev_max= new_max + end + end + text:settext(full_text:sub(1, 1+prev_min)) + end +end + +function width_clip_limit_text(text, limit, natural_zoom) + natural_zoom= natural_zoom or text:GetZoomY() + local text_width= text:GetWidth() * natural_zoom + if text_width > limit * 2 then + text:zoomx(natural_zoom * .5) + width_clip_text(text, limit) + else + width_limit_text(text, limit, natural_zoom) + end +end + +function convert_text_to_indented_lines(text, indent, width, text_zoom) + local text_as_lines= split("\n", text:GetText()) + local indented_lines= {} + for i, line in ipairs(text_as_lines) do + local remain= line + local sub_lines= 0 + repeat + text:settext(remain) + local clipped= false + local indent_mult= 0 + if i > 1 then + indent_mult= indent_mult + 1 + end + if sub_lines > 0 then + indent_mult= 2 + end + local usable_width= width - (indent * indent_mult) + if text:GetWidth() * text_zoom > usable_width * 2 then + clipped= true + width_clip_text(text, usable_width * 2) + end + indented_lines[#indented_lines+1]= { + indent_mult, text:GetText()} + remain= remain:sub(#text:GetText()+1) + sub_lines= sub_lines + 1 + until not clipped + end + return indented_lines +end + -- (c) 2005-2011 Glenn Maynard, Chris Danford, SSC -- All rights reserved. -- diff --git a/Themes/_fallback/Scripts/04 LogDisplay.lua b/Themes/_fallback/Scripts/04 LogDisplay.lua new file mode 100644 index 0000000000..4bfb50564b --- /dev/null +++ b/Themes/_fallback/Scripts/04 LogDisplay.lua @@ -0,0 +1,313 @@ +-- This is a little fake actor class meant for displaying lines of a log. +-- It's placed inside Def, but it's actually just an ActorFrame with some +-- children and special commands. + +-- LogDisplay listens for several messages that control its behavior. +-- The name given to the LogDisplay is added to the name of the message to +-- make the messages unique to this LogDisplay. So to issue a command to +-- the LogDisplay, broadcast the message "". +-- For a LogDisplay named "Foo", you would broadcase "Foo" to add to the +-- log, "ToggleFoo" to toggle whether it's shown or hidden, and so on. + +-- Some of the control messages take tables of args. +-- Arg elements of the form "name= type" are named, and must be a value of +-- the given type. +-- Arg elements of the form "name" are unnamed. + +-- The messages are: +-- : params= {message= string, dont_show= bool} +-- Adds message to the log to be shown when revealing. +-- If dont_show is false, then Show will be automatically executed with +-- auto_hide= true. +-- Messages with line breaks will take up multiple lines. +-- The newest message in the log has index 1. +-- Toggle: No params +-- Executes either Show or Hide, depending on the current state. +-- Show: params= {range= {last_message, lines}, auto_hide= bool} +-- Shows the messages currently in the log. +-- range[1] is the index of the last message to show. +-- range[2] is the max number of lines to show. +-- range[1] defaults to a cleavage shot. +-- range[2] defaults to MaxDisplayLines. +-- If auto_hide is non-nil, Hide will be execuated after a short time. +-- If auto_hide is a number, it will be used as the time to wait before +-- hiding. Otherwise, the Times.show will be used. +-- Query: No params +-- Broadcasts "Response" message with a table containing: +-- {log_len= number, hidden= bool} +-- log_len is the number of messages currently in the log. +-- hidden is whether the LogDisplay is currently hidden. +-- Hide: No params +-- Hides the LogDisplay. +-- Clear: params= {messages} +-- Clears the messages in the log. If messages is a number, only clears +-- that many messages, oldest first. + +-- params to Def.LogDisplay(): +-- { +-- Name= string +-- The name will be used as the name of the main ActorFrame and to +-- control what messages the LogDisplay listens for. +-- MaxLogLen= number +-- The maximum number of messages to store in the log. +-- MaxDisplayLines= number +-- The maximum number of lines that can be displayed at a time. +-- ReplaceLinesWhenHidden= bool +-- If this is true, any messages recieved while the LogDisplay is hidden +-- will replace the message currently at the front of the log. +-- If this is false, messages recieved while the LogDisplay is hidden +-- will push other messages back. Messages pushed past MaxLines will be +-- removed. +-- Font= font name +-- The name of the font to use. This will be passed to THEME:GetPathF, +-- so it should not be a path. +-- LineHeight= number +-- The height in pixels to use between lines. +-- LineWidth= number +-- The width that lines should be limited to. +-- TextZoom= number +-- The zoom factor to apply to the text. +-- TextColor= color +-- The color to use for the text. +-- Times= {show= number, hide= number} +-- show is the amount of time to wait before automatically hiding when +-- Show is executed with AutoHide == true. It's passed as a table, so +-- if you keep a copy of the table, you should be able to modify it to +-- change the time. +-- hide is used as the time for the default hide command to hide. +-- Indent= number +-- The amount in pixels to indent lines that were part of a multi-line +-- message. +-- Hide= function(self) +-- This command will be executed when the LogDisplay needs to be hidden. +-- Hide will also be executed during the InitCommand, so the +-- LogDisplay will start in the hidden state. +-- Show= function(self, Lines) +-- This command will be executed when the LogDisplay needs to be shown. +-- Lines is the number of lines to show. +-- } +-- Any actors placed in params will be used and drawn behind the text. +-- If there are no actors in params, a quad filling the area will be used. +-- Reasonable defaults are provided for everything except Name. If Name is +-- blank, you get nothing. Defaults assume the LogDisplay should fill the +-- screen when in use. + +-- Below is the implementation of the above features. + +local log_display_mt= { + __index= { + create_actors= function(self, params) + self.name= params.Name + self.font= params.Font or "Common Normal" + self.line_height= params.LineHeight or 12 + self.line_width= params.LineWidth or SCREEN_WIDTH + self.text_zoom= params.TextZoom or .5 + self.text_color= params.TextColor or color("#93a1a1") + self.max_lines= params.MaxLines or SCREEN_HEIGHT / self.line_height + self.max_log= params.MaxLogLen or self.max_lines + self.indent= params.Indent or 8 + self.times= params.Times + self.param_hide= params.Hide or + function(subself) + subself:linear(params.Times.hide) + subself:y(-SCREEN_HEIGHT) + end + self.param_show= params.Show or + function(subself, lines) + subself:visible(true) + subself:linear(params.Times.hide) + local cover= math.min(self.line_height * (lines+.5), SCREEN_HEIGHT) + subself:y(-SCREEN_HEIGHT + cover) + end + + self.text_actors= {} + self.message_log= {} + self.messes_since_update= 0 + + local name_mess= self.name .. "MessageCommand" + local args= { + Name= self.name, + InitCommand= function(subself) + self.container= subself; -- This semicolon ends this statement. + -- Without it, the next would be ambiguous syntax. + -- Let the InitCommand passed in params do something. + (params.InitCommand or function() end)(subself) + self:hide() + end, + OffCommand= function(subself) + subself:visible(false) + for i, actor in ipairs(self.text_actors) do + actor:visible(false) + end + end, + [name_mess]= function(subself, mess) + if not mess.message then return end + if self.messes_since_update > self.max_log then return end + -- Long ago, someone decided that "::" should be an alias for "\n" + -- and hardcoded it into BitmapText. + local message= tostring(mess.message):gsub("::", ":") + if params.ReplaceLinesWhenHidden and self.hidden then + self:clear() + self.message_log[1]= message + else + table.insert(self.message_log, 1, message) + if #self.message_log > self.max_log then + table.remove(self.message_log) + end + end + if not mess.dont_show or not self.hidden then + self.messes_since_update= self.messes_since_update + 1 + self.hidden= false + subself:stoptweening() + subself:queuecommand("Update") + end + end, + ["Toggle" .. name_mess]= function(subself) + if self.hidden then + self:show() + else + self:hide() + end + end, + ["Hide" .. name_mess]= function(subself) + self:hide() + end, + ["Show" .. name_mess]= function(subself, mess) + self:show(mess.range, mess.auto_hide) + end, + ["Clear" .. name_mess]= function(subself, mess) + self:clear(mess[1]) + end, + UpdateCommand= function(subself) + self:show(nil, true) + self.messes_since_update= 0 + end, + LoadFont(self.font) .. + { + Name="WidthTester", + InitCommand= function(subself) + self.width_tester= subself + subself:zoom(self.text_zoom) + subself:visible(false) + end + } + } + if #params == 0 then + args[#args+1]= Def.Quad { + Name= "Logbg", + InitCommand= function(subself) + subself:setsize(self.line_width, self.line_height*self.max_lines) + subself:horizalign(left) + subself:vertalign(top) + subself:diffuse(color("#002b36")) + subself:diffusealpha(.85) + end, + } + else + -- Add bg actors passed through params. + for i, actor in ipairs(params) do + args[#args+1]= actor + end + end + -- Add commands passed through params. + for name, command in pairs(params) do + if type(name) == "string" and name:find("Command") and not args[name] then + args[name]= command + end + end + for i= 1, self.max_lines do + args[#args+1]= LoadFont(self.font) .. + { + Name="Text" .. i, + InitCommand= function(subself) + -- Put them in the list in reverse order so the ones at the + -- bottom of the screen are used first. + self.text_actors[self.max_lines-i+1]= subself + subself:horizalign(left) + subself:vertalign(top) + subself:y(self.line_height * (i-1)) + subself:zoom(self.text_zoom) + subself:diffuse(self.text_color) + subself:visible(false) + end, + OffCommand= cmd(visible,false), + } + end + return Def.ActorFrame(args) + end, + hide= function(self) + self.container:stoptweening() + self.param_hide(self.container) + self.container:queuecommand("Off") + self.hidden= true + end, + show= function(self, range, auto_hide) + if not range then range= {} end + local start= range[1] or 1 + local lmax= range[2] or self.max_lines + local indented_lines= {} + local next_message= start + local num_lines= 0 + while num_lines < lmax and self.message_log[next_message] do + self.width_tester:settext(self.message_log[next_message]) + local lines_to_add= convert_text_to_indented_lines( + self.width_tester, self.indent, self.line_width, self.text_zoom) + indented_lines[#indented_lines+1]= lines_to_add + num_lines= num_lines + #lines_to_add + next_message= next_message + 1 + end + local use_next= 1 + local used= 0 + for i, mess in ipairs(indented_lines) do + for l, line in ipairs(mess) do + -- Start at the end of the mess because the text actors are in + -- reverse order. + local ind= use_next + (#mess - l) + local actor= self.text_actors[ind] + if actor and used <= lmax then + actor:settext(line[2]) + local indent= 8 + self.indent * line[1] + local lw= self.line_width - (indent + 8) + width_limit_text(actor, lw, self.text_zoom) + actor:x(indent) + actor:visible(true) + used= used + 1 + end + end + use_next= use_next + #mess + end + self.container:stoptweening() + self.param_show(self.container, used) + self.hidden= false + if auto_hide then + self.container:sleep(self.times.show) + self.container:queuecommand("Hide" .. self.name) + end + end, + clear= function(self, messes) + if #self.message_log < 1 then return end + if not messes then + self.message_log= {} + else + for i= 1, messes do + table.remove(self.message_log) + if #self.message_log < 1 then break end + end + end + end +}} + +function Def.LogDisplay(params) + if type(params.Name) ~= "string" or params.Name == "" then + ReportScriptError("Cannot create a LogDisplay without a name.") + return nil + end + + if not params.Times then params.Times= {show= 4, hide= .125} end + if not params.Times.show then params.Times.show= 4 end + if not params.Times.hide then params.Times.hide= .125 end + + local new_log_display= setmetatable({}, log_display_mt) + _G[params.Name .. "LogDisplay"]= new_log_display + return new_log_display:create_actors(params) +end diff --git a/src/LuaManager.cpp b/src/LuaManager.cpp index e76a7d8321..39eb6b452d 100644 --- a/src/LuaManager.cpp +++ b/src/LuaManager.cpp @@ -794,27 +794,17 @@ bool LuaHelpers::LoadScript( Lua *L, const RString &sScript, const RString &sNam void LuaHelpers::ScriptErrorMessage(RString const& Error) { Message msg("ScriptError"); - msg.SetParam("Message", Error); + msg.SetParam("message", Error); MESSAGEMAN->Broadcast(msg); } Dialog::Result LuaHelpers::ReportScriptError(RString const& Error, RString ErrorType, bool UseAbort) { - size_t line_break_pos= Error.find('\n'); - RString short_error; - if(line_break_pos == RString::npos) - { - short_error= Error; - } - else - { - short_error= Error.substr(0, line_break_pos); - } // Protect from a recursion loop resulting from a mistake in the error reporting lua. if(!InReportScriptError) { InReportScriptError= true; - ScriptErrorMessage(short_error); + ScriptErrorMessage(Error); InReportScriptError= false; } LOG->Warn(Error.c_str()); @@ -1154,6 +1144,22 @@ namespace return 1; } + static int ReportScriptError(lua_State* L) + { + RString error= "Script error occurred."; + RString error_type= "LUA_ERROR"; + if(lua_isstring(L, 1)) + { + error= SArg(1); + } + if(lua_isstring(L, 2)) + { + error_type= SArg(2); + } + LuaHelpers::ReportScriptError(error, error_type); + return 0; + } + const luaL_Reg luaTable[] = { LIST_METHOD( Trace ), @@ -1163,6 +1169,7 @@ namespace LIST_METHOD( ReadFile ), LIST_METHOD( RunWithThreadVariables ), LIST_METHOD( GetThreadVariable ), + LIST_METHOD( ReportScriptError ), { NULL, NULL } }; } diff --git a/src/ScreenDebugOverlay.cpp b/src/ScreenDebugOverlay.cpp index bb323496d7..d36355f6a2 100644 --- a/src/ScreenDebugOverlay.cpp +++ b/src/ScreenDebugOverlay.cpp @@ -1054,7 +1054,7 @@ class DebugLineToggleErrors : public IDebugLine virtual RString GetPageName() const { return "Theme"; } virtual void DoAndLog( RString &sMessageOut ) { - Message msg("ToggleErrors"); + Message msg("ToggleScriptError"); MESSAGEMAN->Broadcast(msg); IDebugLine::DoAndLog(sMessageOut); } @@ -1068,7 +1068,7 @@ class DebugLineClearErrors : public IDebugLine virtual RString GetPageName() const { return "Theme"; } virtual void DoAndLog( RString &sMessageOut ) { - Message msg("ClearErrors"); + Message msg("ClearScriptError"); MESSAGEMAN->Broadcast(msg); IDebugLine::DoAndLog(sMessageOut); } From cb168e29aab955bc5da728d7913db69f8140c148 Mon Sep 17 00:00:00 2001 From: Kyzentun Date: Fri, 18 Jul 2014 18:04:51 -0600 Subject: [PATCH 22/80] Added Common Error font for use by error reporting so that themes that replace Common Normal won't have a problem. --- Themes/_fallback/BGAnimations/ScreenSystemLayer error.lua | 1 + Themes/_fallback/Fonts/Common Error.redir | 1 + 2 files changed, 2 insertions(+) create mode 100644 Themes/_fallback/Fonts/Common Error.redir diff --git a/Themes/_fallback/BGAnimations/ScreenSystemLayer error.lua b/Themes/_fallback/BGAnimations/ScreenSystemLayer error.lua index 830360a71f..b7b932cb04 100644 --- a/Themes/_fallback/BGAnimations/ScreenSystemLayer error.lua +++ b/Themes/_fallback/BGAnimations/ScreenSystemLayer error.lua @@ -49,6 +49,7 @@ local log_args= { Name= "ScriptError", ReplaceLinesWhenHidden= true, Times= message_time, + Font= "Common Error", } Trace("Loaded error layer.") diff --git a/Themes/_fallback/Fonts/Common Error.redir b/Themes/_fallback/Fonts/Common Error.redir new file mode 100644 index 0000000000..dde05763a4 --- /dev/null +++ b/Themes/_fallback/Fonts/Common Error.redir @@ -0,0 +1 @@ +_open sans book 24px From 22662a3b04946bb6cfe3114857c069cdf9a4e6e1 Mon Sep 17 00:00:00 2001 From: Kyzentun Date: Fri, 18 Jul 2014 23:54:25 -0600 Subject: [PATCH 23/80] Changed ArbitrarySpeedMods to use a large increment that is not forced to be a multiple of the smaller increment. --- Themes/_fallback/Languages/en.ini | 4 +- .../_fallback/Scripts/03 CustomSpeedMods.lua | 37 +++++++++---------- Themes/_fallback/metrics.ini | 2 +- 3 files changed, 21 insertions(+), 22 deletions(-) diff --git a/Themes/_fallback/Languages/en.ini b/Themes/_fallback/Languages/en.ini index 0eb3886c49..0369decce2 100644 --- a/Themes/_fallback/Languages/en.ini +++ b/Themes/_fallback/Languages/en.ini @@ -480,7 +480,7 @@ SoundVolume=Adjust the volume level during gameplay. SoundVolumeAttract=Adjust the volume level during attract mode. Speed=Speed Speed Increment=Size of the smaller increments used to adjust the speed mod. -Speed Multiple=Multiplied by Speed Increment to calculate the size of the large increments used to adjust the speed mod. +Speed Increment Large=Size of the larger increments used to adjust the speed mod. StepMania Credits=The StepMania Development Team. Steps=Steps StretchBackgrounds=Toggle the stretching of backgrounds. @@ -1104,7 +1104,7 @@ SoundVolume=Sound Volume SoundVolumeAttract=Attract Volume Speed=Speed Speed Increment=Speed Increment -Speed Multiple=Speed Multiple +Speed Increment Large=Speed Increment Large Step Author=Step Author Steps=Steps Stream=Stream diff --git a/Themes/_fallback/Scripts/03 CustomSpeedMods.lua b/Themes/_fallback/Scripts/03 CustomSpeedMods.lua index 43824914c3..ffa7ee2eb2 100644 --- a/Themes/_fallback/Scripts/03 CustomSpeedMods.lua +++ b/Themes/_fallback/Scripts/03 CustomSpeedMods.lua @@ -247,7 +247,7 @@ function SpeedMods() end local default_speed_increment= 25 -local default_speed_inc_multiple= 4 +local default_speed_inc_large= 100 local function get_speed_increment() local increment= default_speed_increment @@ -259,14 +259,14 @@ local function get_speed_increment() return increment end -local function get_speed_multiple() - local multiple= default_speed_inc_multiple - if ReadGamePrefFromFile("SpeedMultiple") then - multiple= tonumber(GetGamePref("SpeedMultiple")) or default_speed_inc_multiple +local function get_speed_inc_large() + local inc_large= default_speed_inc_large + if ReadGamePrefFromFile("SpeedIncLarge") then + inc_large= tonumber(GetGamePref("SpeedIncLarge")) or default_speed_inc_large else - WriteGamePrefToFile("SpeedMultiple", multiple) + WriteGamePrefToFile("SpeedIncLarge", inc_large) end - return multiple + return inc_large end function SpeedModIncSize() @@ -305,12 +305,12 @@ function SpeedModIncSize() return ret end -function SpeedModIncMultiple() +function SpeedModIncLarge() -- An option row for controlling the size of the increment used by -- ArbitrarySpeedMods. - local multiple= get_speed_multiple() + local inc_large= get_speed_inc_large() local ret= { - Name= "Speed Multiple", + Name= "Speed Increment Large", LayoutType= "ShowAllInRow", SelectType= "SelectMultiple", OneChoiceForAllPlayers= true, @@ -319,22 +319,22 @@ function SpeedModIncMultiple() list[1]= true end, SaveSelections= function(self, list, pn) - WriteGamePrefToFile("SpeedMultiple", multiple) + WriteGamePrefToFile("SpeedIncLarge", inc_large) end, NotifyOfSelection= function(self, pn, choice) -- return true even though we didn't actually change anything so that -- the underlines will stay correct. if choice == 1 then return true end - local incs= {5, 1, -1, -5} - local new_val= multiple + incs[choice-1] + local incs= {10, 1, -1, -10} + local new_val= inc_large + incs[choice-1] if new_val > 0 then - multiple= new_val + inc_large= new_val end self:GenChoices() return true end, GenChoices= function(self) - self.Choices= {tostring(multiple), "+5", "+1", "-1", "-5"} + self.Choices= {tostring(inc_large), "+10", "+1", "-1", "-10"} end } ret:GenChoices() @@ -344,7 +344,7 @@ end function ArbitrarySpeedMods() -- If players are allowed to join while this option row is active, problems will probably occur. local increment= get_speed_increment() - local multiple= get_speed_multiple() + local inc_large= get_speed_inc_large() local ret= { Name= "Speed", LayoutType= "ShowAllInRow", @@ -391,8 +391,7 @@ function ArbitrarySpeedMods() if real_choice < 1 then return true end local val= self.CurValues[pn] if real_choice < 5 then - local big_inc= increment * multiple - local incs= {big_inc, increment, -increment, -big_inc} + local incs= {inc_large, increment, -increment, -inc_large} local new_val= val.speed + incs[real_choice] if new_val > 0 then val.speed= math.round(new_val) @@ -412,7 +411,7 @@ function ArbitrarySpeedMods() show_x_incs= true end end - local big_inc= increment * multiple + local big_inc= inc_large local small_inc= increment if show_x_incs then big_inc= tostring(big_inc / 100) diff --git a/Themes/_fallback/metrics.ini b/Themes/_fallback/metrics.ini index 66c3de676d..24d1b6bf5d 100644 --- a/Themes/_fallback/metrics.ini +++ b/Themes/_fallback/metrics.ini @@ -2938,7 +2938,7 @@ Line3="conf,TimingWindowScale" Line4="conf,LifeDifficulty" Line8="lua,GamePrefDefaultFail()" LineSI="lua,SpeedModIncSize()" -LineSM="lua,SpeedModIncMultiple()" +LineSM="lua,SpeedModIncLarge()" Line11="conf,AllowW1" Line13="conf,HiddenSongs" Line14="conf,EasterEggs" From 0f607df55e6d4a1936e26edfc8c0d100e3851b8d Mon Sep 17 00:00:00 2001 From: Kyzentun Date: Sat, 19 Jul 2014 10:11:14 -0600 Subject: [PATCH 24/80] Changed NoteSkinManager::LoadActor to always return a Sprite on failure because some elements must be a sprite. --- src/NoteSkinManager.cpp | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/NoteSkinManager.cpp b/src/NoteSkinManager.cpp index 198c9812db..1c226daa55 100644 --- a/src/NoteSkinManager.cpp +++ b/src/NoteSkinManager.cpp @@ -438,18 +438,14 @@ Actor *NoteSkinManager::LoadActor( const RString &sButton, const RString &sEleme if( !PushActorTemplate(L, sButton, sElement, bSpriteOnly) ) { // ActorUtil will warn about the error - return new Actor; + return new Sprite; } auto_ptr pNode( XmlFileUtil::XNodeFromTable(L) ); if( pNode.get() == NULL ) { // XNode will warn about the error - if(bSpriteOnly) - { - return new Sprite; - } - return new Actor; + return new Sprite; } LUA->Release( L ); From f87c9f83b400e55ef8a11d2bd3bae47215ab6923 Mon Sep 17 00:00:00 2001 From: sigatrev Date: Sat, 19 Jul 2014 15:03:54 -0500 Subject: [PATCH 25/80] add SOUND:IsTimingDelayed method and fixed SOUND:PlayMusicPart PlayMusicPart does not immediately start the new music. IsTimingDelayed will return true until the new music has started. The "applyRate" argument of PlayMusicPart was being applied to the "align_beat" property. Added an additional argument to for "align_beat" and made "applyRate" work properly. --- Docs/Luadoc/Lua.xml | 1 + Docs/Luadoc/LuaDocumentation.xml | 8 ++++++-- src/GameSoundManager.cpp | 11 +++++++++-- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/Docs/Luadoc/Lua.xml b/Docs/Luadoc/Lua.xml index bc4e99d244..6009181605 100644 --- a/Docs/Luadoc/Lua.xml +++ b/Docs/Luadoc/Lua.xml @@ -731,6 +731,7 @@ +
diff --git a/Docs/Luadoc/LuaDocumentation.xml b/Docs/Luadoc/LuaDocumentation.xml index 61886525d3..cad9107811 100644 --- a/Docs/Luadoc/LuaDocumentation.xml +++ b/Docs/Luadoc/LuaDocumentation.xml @@ -2190,12 +2190,13 @@ save yourself some time, copy this for undocumented things: Plays a sound from the current announcer. - + Play the sound at musicPath starting from musicStart for musicLength seconds one time. Both fadeIn and fadeOut can be customized as required. loop tells the sound manager to loop the music part. applyRate - tells the sound manager to apply the current music rate. + tells the sound manager to apply the current music rate. If alignBeat + is true or nil, the length is automatically adjusted to cover an integer number of beats. Play the sound at sPath one time. @@ -2203,6 +2204,9 @@ save yourself some time, copy this for undocumented things: Stops the music. + + When music is requested to change, the new music does not start immediately due to latency and buffering. This will return true if the newest music has not yet actually begun. + diff --git a/src/GameSoundManager.cpp b/src/GameSoundManager.cpp index 18b95670cb..c9c1f33ab9 100644 --- a/src/GameSoundManager.cpp +++ b/src/GameSoundManager.cpp @@ -834,6 +834,7 @@ public: float fadeOut = 0; bool loop= false; bool applyRate= false; + bool alignBeat= true; if (lua_gettop(L) >= 4 && !lua_isnil(L,4)) { fadeIn = FArg(4); @@ -846,16 +847,21 @@ public: if (lua_gettop(L) >= 7 && !lua_isnil(L,7)) { applyRate = BArg(7); + if (lua_gettop(L) >= 8 && !lua_isnil(L,8)) + { + alignBeat = BArg(8); + } } } } } p->PlayMusic(musicPath, NULL, loop, musicStart, musicLength, - fadeIn, fadeOut, applyRate); + fadeIn, fadeOut, alignBeat, applyRate); return 0; } - static int StopMusic( T* p, lua_State *L ) { p->StopMusic(); return 0; } + static int StopMusic( T* p, lua_State *L ) { p->StopMusic(); return 0; } + static int IsTimingDelayed( T* p, lua_State *L ) { lua_pushboolean( L, g_Playing->m_bTimingDelayed ); return 1; } LunaGameSoundManager() { @@ -865,6 +871,7 @@ public: ADD_METHOD( GetPlayerBalance ); ADD_METHOD( PlayMusicPart ); ADD_METHOD( StopMusic ); + ADD_METHOD( IsTimingDelayed ); } }; From 4c97ff64a067269b651d20b35b311bb3f30c76c0 Mon Sep 17 00:00:00 2001 From: Kyzentun Date: Sat, 19 Jul 2014 15:20:02 -0600 Subject: [PATCH 26/80] Changed CheckEnum to use lua_isnoneornil so that enum args can be made properly optional. Changed PlayMusicPart to allow nil for optional args so optional args would be independent. --- src/EnumHelper.cpp | 4 +--- src/GameSoundManager.cpp | 36 ++++++++++++++++++------------------ 2 files changed, 19 insertions(+), 21 deletions(-) diff --git a/src/EnumHelper.cpp b/src/EnumHelper.cpp index 921a92a935..3391002ce4 100644 --- a/src/EnumHelper.cpp +++ b/src/EnumHelper.cpp @@ -6,9 +6,7 @@ int CheckEnum( lua_State *L, LuaReference &table, int iPos, int iInvalid, const char *szType, bool bAllowInvalid, bool bAllowAnything ) { - luaL_checkany( L, iPos ); - - if( lua_isnil(L, iPos) ) + if( lua_isnoneornil(L, iPos) ) { if( bAllowInvalid ) return iInvalid; diff --git a/src/GameSoundManager.cpp b/src/GameSoundManager.cpp index c9c1f33ab9..d577b8884d 100644 --- a/src/GameSoundManager.cpp +++ b/src/GameSoundManager.cpp @@ -728,7 +728,7 @@ void GameSoundManager::PlayMusic( PlayMusicParams params, PlayMusicParams Fallba ToPlay.fFadeInLengthSeconds = params.fFadeInLengthSeconds; ToPlay.fFadeOutLengthSeconds = params.fFadeOutLengthSeconds; ToPlay.bAlignBeat = params.bAlignBeat; - ToPlay.bApplyMusicRate = params.bApplyMusicRate; +x ToPlay.bApplyMusicRate = params.bApplyMusicRate; /* Add the MusicToPlay to the g_MusicsToPlay queue. */ g_Mutex->Lock(); @@ -835,25 +835,25 @@ public: bool loop= false; bool applyRate= false; bool alignBeat= true; - if (lua_gettop(L) >= 4 && !lua_isnil(L,4)) + if(!lua_isnoneornil(L, 4)) { fadeIn = FArg(4); - if (lua_gettop(L) >= 5 && !lua_isnil(L,5)) - { - fadeOut = FArg(5); - if (lua_gettop(L) >= 6 && !lua_isnil(L,6)) - { - loop = BArg(6); - if (lua_gettop(L) >= 7 && !lua_isnil(L,7)) - { - applyRate = BArg(7); - if (lua_gettop(L) >= 8 && !lua_isnil(L,8)) - { - alignBeat = BArg(8); - } - } - } - } + } + if(!lua_isnoneornil(L, 5)) + { + fadeOut = FArg(5); + } + if(!lua_isnoneornil(L, 6)) + { + loop = BArg(6); + } + if(!lua_isnoneornil(L, 7)) + { + applyRate = BArg(7); + } + if(!lua_isnoneornil(L, 8)) + { + alignBeat = BArg(8); } p->PlayMusic(musicPath, NULL, loop, musicStart, musicLength, fadeIn, fadeOut, alignBeat, applyRate); From 69b5f1ae61753866dd22a4e5f85aa98659f790b9 Mon Sep 17 00:00:00 2001 From: Kyzentun Date: Sat, 19 Jul 2014 16:05:16 -0600 Subject: [PATCH 27/80] Fixed two typos. --- .../Examples/Example_Screens/ScreenOptionsExample.ini | 2 +- src/GameSoundManager.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Docs/Themerdocs/Examples/Example_Screens/ScreenOptionsExample.ini b/Docs/Themerdocs/Examples/Example_Screens/ScreenOptionsExample.ini index 39e4a0032e..b29f2ac45c 100644 --- a/Docs/Themerdocs/Examples/Example_Screens/ScreenOptionsExample.ini +++ b/Docs/Themerdocs/Examples/Example_Screens/ScreenOptionsExample.ini @@ -1,4 +1,4 @@ -# Try out this examply by copying these metrics into your metrics.ini. +# Try out this example by copying these metrics into your metrics.ini. # Some elements will require entries to be added to the language file. Read Examples/LanguageFile.ini for instructions on adding entries to a language file. diff --git a/src/GameSoundManager.cpp b/src/GameSoundManager.cpp index d577b8884d..ba41c56da2 100644 --- a/src/GameSoundManager.cpp +++ b/src/GameSoundManager.cpp @@ -728,7 +728,7 @@ void GameSoundManager::PlayMusic( PlayMusicParams params, PlayMusicParams Fallba ToPlay.fFadeInLengthSeconds = params.fFadeInLengthSeconds; ToPlay.fFadeOutLengthSeconds = params.fFadeOutLengthSeconds; ToPlay.bAlignBeat = params.bAlignBeat; -x ToPlay.bApplyMusicRate = params.bApplyMusicRate; + ToPlay.bApplyMusicRate = params.bApplyMusicRate; /* Add the MusicToPlay to the g_MusicsToPlay queue. */ g_Mutex->Lock(); From c3fb210291c8d3ab53663dfccf086105426fc800 Mon Sep 17 00:00:00 2001 From: Kyzentun Date: Sun, 20 Jul 2014 20:59:12 -0600 Subject: [PATCH 28/80] Created GameLoop::ChangeGame analogous to GameLoop::ChangeTheme. Changed ChangeTheme to use the AfterThemeChangeScreen metric instead of a passed in screen name from the theme being changed away from. ChangeGame uses the AfterGameChangeScreen and AfterGameAndThemeChangeScreen metrics to pick the screen to load after the change. New metrics are optional and default to InitialScreen. Changed ScreenManager::ThemeChanged to not duplicate the code in ReloadOverlayScreens. Fixed ScreenManager::IsScreenNameValid to check with HasMetric before using GetMetric. Changed game ConfOption logic to set the preference and work in a similar way to the theme ConfOption. Added THEME:SetTheme lua function. --- Docs/Luadoc/Lua.xml | 1 + Docs/Luadoc/LuaDocumentation.xml | 10 ++- src/GameLoop.cpp | 123 +++++++++++++++++++++++++++---- src/GameLoop.h | 3 +- src/GameManager.cpp | 29 ++++---- src/ScreenManager.cpp | 30 ++------ src/ScreenOptionsMaster.cpp | 9 +-- src/ScreenOptionsMasterPrefs.cpp | 12 +-- src/ScreenOptionsMasterPrefs.h | 2 +- src/ScreenTitleMenu.cpp | 4 +- src/StepMania.cpp | 15 ++-- src/StepMania.h | 2 +- src/ThemeManager.cpp | 13 ++++ 13 files changed, 173 insertions(+), 80 deletions(-) diff --git a/Docs/Luadoc/Lua.xml b/Docs/Luadoc/Lua.xml index 6b2d77b790..113836cd63 100644 --- a/Docs/Luadoc/Lua.xml +++ b/Docs/Luadoc/Lua.xml @@ -1661,6 +1661,7 @@ + diff --git a/Docs/Luadoc/LuaDocumentation.xml b/Docs/Luadoc/LuaDocumentation.xml index 5d4ab8bf66..3c38b158fd 100644 --- a/Docs/Luadoc/LuaDocumentation.xml +++ b/Docs/Luadoc/LuaDocumentation.xml @@ -2181,7 +2181,10 @@ save yourself some time, copy this for undocumented things: Returns a table of all selectable games. - Sets the current game to Game. The second argument is optional, and if provided will determine which theme is loaded when the game changes. If Stepmania was run with a commandline argument setting the theme, that will override the second argument of this function. + Sets the current game to Game. The second argument is optional, and if provided will determine which theme is loaded when the game changes. If the second argument is not provided, the default theme from the preferences for the new game type will be loaded.
+ If only the game changes, the screen specified by the Common::AfterGameChangeScreen metric will be loaded.
+ If the game and the theme both change, the screen specified by the Common::AfterGameAndThemeChangeScreen metric will be loaded.
+ The Common::InitialScreen metric will be used if the appropriate metric for the change is blank or invalid.
@@ -4678,6 +4681,11 @@ save yourself some time, copy this for undocumented things: + + Changes the current theme.
+ After the theme changes, the screen specified by the Common::AfterThemeChangeScreen metric will be loaded.
+ The Common::InitialScreen metric will be used if Common::AfterThemeChangeScreen is blank or invalid. +
diff --git a/src/GameLoop.cpp b/src/GameLoop.cpp index 74ccdb0d6a..4fbe074a5d 100644 --- a/src/GameLoop.cpp +++ b/src/GameLoop.cpp @@ -114,17 +114,24 @@ static void CheckFocus() } // On the next update, change themes, and load sNewScreen. -static RString g_sNewTheme; -static RString g_sNewScreen; +static RString g_NewTheme; static bool g_bForceThemeReload; -void GameLoop::ChangeTheme( const RString &sNewTheme, const RString &sNewScreen, bool bForced ) +static RString g_NewGame; +void GameLoop::ChangeTheme( const RString &sNewTheme, bool bForced ) { - g_sNewTheme = sNewTheme; - g_sNewScreen = sNewScreen; + g_NewTheme = sNewTheme; g_bForceThemeReload = bForced; } +void GameLoop::ChangeGame(const RString& new_game, const RString& new_theme) +{ + g_NewGame= new_game; + g_NewTheme= new_theme; +} + #include "StepMania.h" // XXX +#include "GameManager.h" +#include "Game.h" namespace { void DoChangeTheme() @@ -135,8 +142,8 @@ namespace // In case the previous theme overloaded class bindings, reinitialize them. LUA->RegisterTypes(); - THEME->SwitchThemeAndLanguage( g_sNewTheme, THEME->GetCurLanguage(), PREFSMAN->m_bPseudoLocalize, g_bForceThemeReload ); - PREFSMAN->m_sTheme.Set( g_sNewTheme ); + THEME->SwitchThemeAndLanguage( g_NewTheme, THEME->GetCurLanguage(), PREFSMAN->m_bPseudoLocalize, g_bForceThemeReload ); + PREFSMAN->m_sTheme.Set( g_NewTheme ); // Apply the new window title, icon and aspect ratio. StepMania::ApplyGraphicOptions(); @@ -145,19 +152,97 @@ namespace StepMania::ResetGame(); SCREENMAN->ThemeChanged(); - // Not all themes use the same screen names! Check whether the new - // screen is valid in the new theme before setting it. Use the - // InitialScreen metric if it's not. - if(!SCREENMAN->IsScreenNameValid(g_sNewScreen)) + // The previous system for changing the theme fetched the "NextScreen" + // metric from the current theme, then changed the theme, then tried to + // set the new screen to the name that had been fetched. + // If the new screen didn't exist in the new theme, there would be a + // crash. + // So now the correct thing to do is for a theme to specify its entry + // point after a theme change, ensuring that we are going to a valid + // screen and not crashing. -Kyz + RString new_screen= THEME->GetMetric("Common", "InitialScreen"); + if(THEME->HasMetric("Common", "AfterThemeChangeScreen")) { - g_sNewScreen= THEME->GetMetric("Common", "InitialScreen"); + RString after_screen= THEME->GetMetric("Common", "AfterThemeChangeScreen"); + if(SCREENMAN->IsScreenNameValid(after_screen)) + { + new_screen= after_screen; + } } - SCREENMAN->SetNewScreen( g_sNewScreen ); + SCREENMAN->SetNewScreen(new_screen); - g_sNewTheme = RString(); - g_sNewScreen = RString(); + g_NewTheme = RString(); } + void DoChangeGame() + { + const Game* g= GAMEMAN->StringToGame(g_NewGame); + ASSERT(g != NULL); + GAMESTATE->SetCurGame(g); + + bool theme_changing= false; + // The prefs allow specifying a different default theme to use for each + // game type. So if a theme name isn't passed in, fetch from the prefs. + if(g_NewTheme.empty()) + { + g_NewTheme= PREFSMAN->m_sTheme; + } + if(g_NewTheme != THEME->GetCurThemeName() && THEME->IsThemeSelectable(g_NewTheme)) + { + theme_changing= true; + } + + if(theme_changing) + { + SAFE_DELETE(SCREENMAN); + TEXTUREMAN->DoDelayedDelete(); + LUA->RegisterTypes(); + THEME->SwitchThemeAndLanguage(g_NewTheme, THEME->GetCurLanguage(), + PREFSMAN->m_bPseudoLocalize); + PREFSMAN->m_sTheme.Set(g_NewTheme); + StepMania::ApplyGraphicOptions(); + SCREENMAN= new ScreenManager(); + } + StepMania::ResetGame(); + RString new_screen= THEME->GetMetric("Common", "InitialScreen"); + RString after_screen; + if(theme_changing) + { + SCREENMAN->ThemeChanged(); + if(THEME->HasMetric("Common", "AfterGameAndThemeChangeScreen")) + { + after_screen= THEME->GetMetric("Common", "AfterGameAndThemeChangeScreen"); + } + } + else + { + if(THEME->HasMetric("Common", "AfterGameChangeScreen")) + { + after_screen= THEME->GetMetric("Common", "AfterGameChangeScreen"); + } + } + if(SCREENMAN->IsScreenNameValid(after_screen)) + { + new_screen= after_screen; + } + SCREENMAN->SetNewScreen(new_screen); + + // Set the input scheme for the new game, and load keymaps. + if( INPUTMAPPER ) + { + INPUTMAPPER->SetInputScheme(&g->m_InputScheme); + INPUTMAPPER->ReadMappingsFromDisk(); + } + // aj's comment transplanted from ScreenOptionsMasterPrefs.cpp:GameSel. -Kyz + /* Reload metrics to force a refresh of CommonMetrics::DIFFICULTIES_TO_SHOW, + * mainly if we're not switching themes. I'm not sure if this was the + * case going from theme to theme, but if it was, it should be fixed + * now. There's probably be a better way to do it, but I'm not sure + * what it'd be. -aj */ + THEME->ReloadMetrics(); + g_NewGame= RString(); + g_NewTheme= RString(); + } } void GameLoop::RunGameLoop() @@ -169,8 +254,14 @@ void GameLoop::RunGameLoop() while( !ArchHooks::UserQuit() ) { - if( !g_sNewTheme.empty() ) + if(!g_NewGame.empty()) + { + DoChangeGame(); + } + if(!g_NewTheme.empty()) + { DoChangeTheme(); + } // Update float fDeltaTime = g_GameplayTimer.GetDeltaTime(); diff --git a/src/GameLoop.h b/src/GameLoop.h index 3bbc990acc..df59a0146e 100644 --- a/src/GameLoop.h +++ b/src/GameLoop.h @@ -5,7 +5,8 @@ namespace GameLoop { void RunGameLoop(); void SetUpdateRate( float fUpdateRate ); - void ChangeTheme( const RString &sNewTheme, const RString &sNewScreen, bool bForced = false ); + void ChangeTheme( const RString &sNewTheme, bool bForced = false ); + void ChangeGame(const RString& new_game, const RString& new_theme= ""); void StartConcurrentRendering(); void FinishConcurrentRendering(); }; diff --git a/src/GameManager.cpp b/src/GameManager.cpp index 6999da2a21..9006119391 100644 --- a/src/GameManager.cpp +++ b/src/GameManager.cpp @@ -1,9 +1,10 @@ #include "global.h" -#include "Stepmania.h" +#include "StepMania.h" #include "arch/Dialog/Dialog.h" #include "GameManager.h" #include "GameConstantsAndTypes.h" #include "GameInput.h" // for GameButton constants +#include "GameLoop.h" // for ChangeGame #include "RageLog.h" #include "RageUtil.h" #include "NoteSkinManager.h" @@ -3176,22 +3177,22 @@ public: static int SetGame( T* p, lua_State *L ) { - const Game *pGame = p->StringToGame(SArg(1)); - RString sTheme; + RString game_name= SArg(1); + const Game *pGame = p->StringToGame(game_name); + if(!pGame) + { + luaL_error(L, "SetGame: Invalid Game: '%s'", game_name.c_str()); + } + RString theme; if( lua_gettop(L) >= 2 && !lua_isnil(L, 2) ) { - sTheme = SArg(2); - } - if( pGame ) - { - StepMania::ChangeCurrentGame( pGame, sTheme ); - THEME->ReloadMetrics(); - } - else - { - LOG->Warn( "SetGame: Invalid Game, %s", pGame->m_szName ); - Dialog::OK( "SetGame: Invalid Game, %s", pGame->m_szName ); + theme = SArg(2); + if(!THEME->IsThemeSelectable(theme)) + { + luaL_error(L, "SetGame: Invalid Theme: '%s'", theme.c_str()); + } } + GameLoop::ChangeGame(game_name, theme); return 0; } diff --git a/src/ScreenManager.cpp b/src/ScreenManager.cpp index b8b75aa85d..3421f9689b 100644 --- a/src/ScreenManager.cpp +++ b/src/ScreenManager.cpp @@ -282,34 +282,14 @@ void ScreenManager::ThemeChanged() m_soundInvalid.Load( THEME->GetPathS("Common","invalid") ); m_soundScreenshot.Load( THEME->GetPathS("Common","screenshot") ); - // unload overlay screens - for( unsigned i=0; iGetMetric( "Common","OverlayScreens" ); - vector asOverlays; - split( sOverlays, ",", asOverlays ); - for( unsigned i=0; iGetName() ); - pScreen->BeginScreen(); - g_OverlayScreens.push_back( pScreen ); - } - } - // reload song manager colors (to avoid crashes) -aj SONGMAN->ResetGroupColors(); + ReloadOverlayScreens(); + // force recreate of new BGA SAFE_DELETE( g_pSharedBGA ); g_pSharedBGA = new Actor; - - this->RefreshCreditsMessages(); } void ScreenManager::ReloadOverlayScreens() @@ -369,7 +349,11 @@ bool ScreenManager::AllowOperatorMenuButton() const bool ScreenManager::IsScreenNameValid(RString const& name) const { - RString ClassName = THEME->GetMetric(name,"Class"); + if(name.empty() || !THEME->HasMetric(name, "Class")) + { + return false; + } + RString ClassName = THEME->GetMetric(name, "Class"); return g_pmapRegistrees->find(ClassName) != g_pmapRegistrees->end(); } diff --git a/src/ScreenOptionsMaster.cpp b/src/ScreenOptionsMaster.cpp index ea2aee1428..27b3b70c77 100644 --- a/src/ScreenOptionsMaster.cpp +++ b/src/ScreenOptionsMaster.cpp @@ -4,6 +4,7 @@ #include "RageUtil.h" #include "RageLog.h" #include "ThemeManager.h" +#include "GameManager.h" #include "GameState.h" #include "ScreenManager.h" #include "SongManager.h" @@ -127,8 +128,7 @@ void ScreenOptionsMaster::HandleScreenMessage( const ScreenMessage SM ) * Otherwise, only reload it if it changed. */ RString sNewTheme = PREFSMAN->m_sTheme.Get(); bool bForceThemeReload = !!(m_iChangeMask & OPT_APPLY_ASPECT_RATIO) || !!(m_iChangeMask & OPT_APPLY_GRAPHICS); - GameLoop::ChangeTheme( sNewTheme, this->GetNextScreenName(), bForceThemeReload ); - StepMania::ApplyGraphicOptions(); + GameLoop::ChangeTheme( sNewTheme, bForceThemeReload ); } if( m_iChangeMask & OPT_SAVE_PREFERENCES ) @@ -138,10 +138,9 @@ void ScreenOptionsMaster::HandleScreenMessage( const ScreenMessage SM ) PREFSMAN->SavePrefsToDisk(); } - if( m_iChangeMask & OPT_RESET_GAME ) + if( m_iChangeMask & OPT_CHANGE_GAME ) { - StepMania::ResetGame(); - m_sNextScreen = StepMania::GetInitialScreen(); + GameLoop::ChangeGame(PREFSMAN->GetCurrentGame()); } if( m_iChangeMask & OPT_APPLY_SOUND ) diff --git a/src/ScreenOptionsMasterPrefs.cpp b/src/ScreenOptionsMasterPrefs.cpp index e8c36de2d4..942540c69e 100644 --- a/src/ScreenOptionsMasterPrefs.cpp +++ b/src/ScreenOptionsMasterPrefs.cpp @@ -177,7 +177,7 @@ static void GameSel( int &sel, bool ToSel, const ConfOption *pConfOption ) if( ToSel ) { - const RString sCurGameName = GAMESTATE->m_pCurGame->m_szName; + const RString sCurGameName = PREFSMAN->GetCurrentGame(); sel = 0; for(unsigned i = 0; i < choices.size(); ++i) @@ -186,13 +186,7 @@ static void GameSel( int &sel, bool ToSel, const ConfOption *pConfOption ) } else { vector aGames; GAMEMAN->GetEnabledGames( aGames ); - StepMania::ChangeCurrentGame( aGames[sel] ); - /* Reload metrics to force a refresh of CommonMetrics::DIFFICULTIES_TO_SHOW, - * mainly if we're not switching themes. I'm not sure if this was the - * case going from theme to theme, but if it was, it should be fixed - * now. There's probably be a better way to do it, but I'm not sure - * what it'd be. -aj */ - THEME->ReloadMetrics(); + PREFSMAN->SetCurrentGame(aGames[sel]->m_szName); } } @@ -663,7 +657,7 @@ static void InitializeConfOptions() #define ADD(x) g_ConfOptions.push_back( x ) // Select game ADD( ConfOption( "Game", GameSel, GameChoices ) ); - g_ConfOptions.back().m_iEffects = OPT_RESET_GAME; + g_ConfOptions.back().m_iEffects = OPT_CHANGE_GAME; // Appearance options ADD( ConfOption( "Language", Language, LanguageChoices ) ); diff --git a/src/ScreenOptionsMasterPrefs.h b/src/ScreenOptionsMasterPrefs.h index a9758491e1..ef3eccabbf 100644 --- a/src/ScreenOptionsMasterPrefs.h +++ b/src/ScreenOptionsMasterPrefs.h @@ -5,7 +5,7 @@ static const int MAX_OPTIONS=16; #define OPT_SAVE_PREFERENCES (1<<0) #define OPT_APPLY_GRAPHICS (1<<1) #define OPT_APPLY_THEME (1<<2) -#define OPT_RESET_GAME (1<<3) +#define OPT_CHANGE_GAME (1<<3) #define OPT_APPLY_SOUND (1<<4) #define OPT_APPLY_SONG (1<<5) #define OPT_APPLY_ASPECT_RATIO (1<<6) diff --git a/src/ScreenTitleMenu.cpp b/src/ScreenTitleMenu.cpp index 54febb1625..404aae586f 100644 --- a/src/ScreenTitleMenu.cpp +++ b/src/ScreenTitleMenu.cpp @@ -54,10 +54,12 @@ bool ScreenTitleMenu::Input( const InputEventPlus &input ) if( input.type == IET_FIRST_PRESS ) { // detect codes + // Theme changing pad codes are marked as deprecated in _fallback's + // metrics.ini, remove them after SM5? -Kyz if( CodeDetector::EnteredCode(input.GameI.controller,CODE_NEXT_THEME) || CodeDetector::EnteredCode(input.GameI.controller,CODE_NEXT_THEME2) ) { - GameLoop::ChangeTheme( THEME->GetNextSelectableTheme(), m_sName ); + GameLoop::ChangeTheme(THEME->GetNextSelectableTheme()); bHandled = true; } if( CodeDetector::EnteredCode(input.GameI.controller,CODE_NEXT_ANNOUNCER) || diff --git a/src/StepMania.cpp b/src/StepMania.cpp index be90ff990e..a53766ea32 100644 --- a/src/StepMania.cpp +++ b/src/StepMania.cpp @@ -805,10 +805,11 @@ static void SwitchToLastPlayedGame() ASSERT( GAMEMAN->IsGameEnabled(pGame) ); - StepMania::ChangeCurrentGame( pGame ); + StepMania::InitializeCurrentGame( pGame ); } -void StepMania::ChangeCurrentGame( const Game* g, RString Theme ) +// This function is meant to only be called during start up. +void StepMania::InitializeCurrentGame( const Game* g ) { ASSERT( g != NULL ); ASSERT( GAMESTATE != NULL ); @@ -823,11 +824,9 @@ void StepMania::ChangeCurrentGame( const Game* g, RString Theme ) if( sAnnouncer.empty() ) sAnnouncer = GAMESTATE->GetCurrentGame()->m_szName; - if( sTheme.empty() ) - sTheme = GAMESTATE->GetCurrentGame()->m_szName; - if( Theme.size() ) - sTheme = Theme; - + // It doesn't matter if sTheme is blank or invalid, THEME->STAL will set + // a selectable theme for us. -Kyz + // process theme and language command line arguments; // these change the preferences in order for transparent loading -aj RString argTheme; @@ -1115,7 +1114,7 @@ int main(int argc, char* argv[]) INPUTFILTER = new InputFilter; INPUTMAPPER = new InputMapper; - StepMania::ChangeCurrentGame( GAMESTATE->GetCurrentGame() ); + StepMania::InitializeCurrentGame( GAMESTATE->GetCurrentGame() ); INPUTQUEUE = new InputQueue; SONGINDEX = new SongCacheIndex; diff --git a/src/StepMania.h b/src/StepMania.h index 82baed076b..3b0d284a6f 100644 --- a/src/StepMania.h +++ b/src/StepMania.h @@ -15,7 +15,7 @@ namespace StepMania void ResetGame(); RString GetInitialScreen(); RString GetSelectMusicScreen(); - void ChangeCurrentGame( const Game* g, RString Theme = "" ); + void InitializeCurrentGame(const Game* g); // If successful, return filename of screenshot in sDir, else return "" RString SaveScreenshot( RString Dir, bool SaveCompressed, bool MakeSignature, RString NamePrefix, RString NameSuffix ); diff --git a/src/ThemeManager.cpp b/src/ThemeManager.cpp index fbf70293a6..c80866f4da 100644 --- a/src/ThemeManager.cpp +++ b/src/ThemeManager.cpp @@ -17,6 +17,7 @@ #include "ActorUtil.h" #endif #include "Foreach.h" +#include "GameLoop.h" // For ChangeTheme #include "ThemeMetric.h" #include "SubscriptionManager.h" #include "LuaManager.h" @@ -1341,6 +1342,17 @@ public: return 1; } + static int SetTheme(T* p, lua_State* L) + { + RString theme_name= SArg(1); + if(!p->IsThemeSelectable(theme_name)) + { + luaL_error(L, "SetTheme: Invalid Theme: '%s'", theme_name.c_str()); + } + GameLoop::ChangeTheme(theme_name); + return 0; + } + LunaThemeManager() { ADD_METHOD( ReloadMetrics ); @@ -1367,6 +1379,7 @@ public: ADD_METHOD( HasString ); ADD_METHOD( GetMetricNamesInGroup ); ADD_METHOD( GetStringNamesInGroup ); + ADD_METHOD( SetTheme ); } }; From 49c8846cc0a8550d67d24cdec92bbbf067423fdc Mon Sep 17 00:00:00 2001 From: sigatrev Date: Tue, 22 Jul 2014 16:52:42 -0500 Subject: [PATCH 29/80] SavePreferences for custom option screens. --- Docs/Luadoc/Lua.xml | 1 + Docs/Luadoc/LuaDocumentation.xml | 3 +++ src/PrefsManager.cpp | 5 ++++- 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/Docs/Luadoc/Lua.xml b/Docs/Luadoc/Lua.xml index 6009181605..2037198e4d 100644 --- a/Docs/Luadoc/Lua.xml +++ b/Docs/Luadoc/Lua.xml @@ -1150,6 +1150,7 @@ + diff --git a/Docs/Luadoc/LuaDocumentation.xml b/Docs/Luadoc/LuaDocumentation.xml index cad9107811..8ea2324dbf 100644 --- a/Docs/Luadoc/LuaDocumentation.xml +++ b/Docs/Luadoc/LuaDocumentation.xml @@ -3302,6 +3302,9 @@ save yourself some time, copy this for undocumented things: Reset preference sPreference to the default value. + + Saves preferences to disk. + diff --git a/src/PrefsManager.cpp b/src/PrefsManager.cpp index cb17ace911..1a967e2745 100644 --- a/src/PrefsManager.cpp +++ b/src/PrefsManager.cpp @@ -586,13 +586,16 @@ public: lua_pushboolean( L, true ); return 1; } - + + static int SavePreferences( T* p, lua_State *L ) { p->SavePrefsToDisk(); return 0; } + LunaPrefsManager() { ADD_METHOD( GetPreference ); ADD_METHOD( SetPreference ); ADD_METHOD( SetPreferenceToDefault ); ADD_METHOD( PreferenceExists ); + ADD_METHOD( SavePreferences ); } }; From 7622c7d4230985346f36a4b2b2d2162a90304188 Mon Sep 17 00:00:00 2001 From: sigatrev Date: Tue, 22 Jul 2014 17:39:55 -0500 Subject: [PATCH 30/80] add OldStyleStringToDifficulty method because SM recognizes them in .sm files. --- Docs/Luadoc/Lua.xml | 1 + Docs/Luadoc/LuaDocumentation.xml | 3 +++ src/Difficulty.cpp | 2 ++ 3 files changed, 6 insertions(+) diff --git a/Docs/Luadoc/Lua.xml b/Docs/Luadoc/Lua.xml index 6009181605..819eadfc7a 100644 --- a/Docs/Luadoc/Lua.xml +++ b/Docs/Luadoc/Lua.xml @@ -115,6 +115,7 @@ + diff --git a/Docs/Luadoc/LuaDocumentation.xml b/Docs/Luadoc/LuaDocumentation.xml index cad9107811..4490ead745 100644 --- a/Docs/Luadoc/LuaDocumentation.xml +++ b/Docs/Luadoc/LuaDocumentation.xml @@ -372,6 +372,9 @@ save yourself some time, copy this for undocumented things: next returns the next index of the table and its associated value." See the Lua manual for more details. + + Converts a string such as 'oni' or 'expert' or 'trick' to the appropriate difficulty. + [03 ThemePrefs.lua] Returns a Lua option row for ProTiming. diff --git a/src/Difficulty.cpp b/src/Difficulty.cpp index 9f18ac5442..1d49ae4615 100644 --- a/src/Difficulty.cpp +++ b/src/Difficulty.cpp @@ -72,6 +72,8 @@ Difficulty OldStyleStringToDifficulty( const RString& sDC ) else return Difficulty_Invalid; } +LuaFunction( OldStyleStringToDifficulty, OldStyleStringToDifficulty(SArg(1)) ); + static ThemeMetric NAMES("CustomDifficulty","Names"); RString GetCustomDifficulty( StepsType st, Difficulty dc, CourseType ct ) From 3cef425d6330c34e91c7f5c4b05c56f55c78eaeb Mon Sep 17 00:00:00 2001 From: Kyzentun Date: Tue, 22 Jul 2014 17:51:40 -0600 Subject: [PATCH 31/80] Added IgnoreIdentical param to LogDisplay for use in ignoring identical error messages. --- .../BGAnimations/ScreenSystemLayer error.lua | 1 + Themes/_fallback/Scripts/04 LogDisplay.lua | 16 ++++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/Themes/_fallback/BGAnimations/ScreenSystemLayer error.lua b/Themes/_fallback/BGAnimations/ScreenSystemLayer error.lua index b7b932cb04..4193ed54eb 100644 --- a/Themes/_fallback/BGAnimations/ScreenSystemLayer error.lua +++ b/Themes/_fallback/BGAnimations/ScreenSystemLayer error.lua @@ -48,6 +48,7 @@ end local log_args= { Name= "ScriptError", ReplaceLinesWhenHidden= true, + IgnoreIdentical= true, Times= message_time, Font= "Common Error", } diff --git a/Themes/_fallback/Scripts/04 LogDisplay.lua b/Themes/_fallback/Scripts/04 LogDisplay.lua index 4bfb50564b..482a73eaa7 100644 --- a/Themes/_fallback/Scripts/04 LogDisplay.lua +++ b/Themes/_fallback/Scripts/04 LogDisplay.lua @@ -58,6 +58,9 @@ -- If this is false, messages recieved while the LogDisplay is hidden -- will push other messages back. Messages pushed past MaxLines will be -- removed. +-- IgnoreIdentical= bool +-- If true, then a message that is identical to one already in the log +-- will be ignored. -- Font= font name -- The name of the font to use. This will be passed to THEME:GetPathF, -- so it should not be a path. @@ -146,6 +149,19 @@ local log_display_mt= { -- Long ago, someone decided that "::" should be an alias for "\n" -- and hardcoded it into BitmapText. local message= tostring(mess.message):gsub("::", ":") + if params.IgnoreIdentical then + -- Use only the first line for comparison because the rest is + -- probably stack trace, with args that might vary uselessly. + self.width_tester:settext(message) + local lines= convert_text_to_indented_lines( + self.width_tester, self.indent, self.line_width, self.text_zoom) + for i, prevmess in ipairs(self.message_log) do + self.width_tester:settext(prevmess) + local prevlines= convert_text_to_indented_lines( + self.width_tester, self.indent, self.line_width, self.text_zoom) + if lines[1][2] == prevmess[1][2] then return end + end + end if params.ReplaceLinesWhenHidden and self.hidden then self:clear() self.message_log[1]= message From d4aa57e16175ca770f2799dee685ceefd4a9f15c Mon Sep 17 00:00:00 2001 From: freem Date: Tue, 22 Jul 2014 20:08:40 -0500 Subject: [PATCH 32/80] add missing Class attribute for ScreenOptionsEditProfile --- Themes/_fallback/metrics.ini | 1 + 1 file changed, 1 insertion(+) diff --git a/Themes/_fallback/metrics.ini b/Themes/_fallback/metrics.ini index 24d1b6bf5d..cbee4808d9 100644 --- a/Themes/_fallback/metrics.ini +++ b/Themes/_fallback/metrics.ini @@ -3050,6 +3050,7 @@ PersistScreens="ScreenMiniMenuContext" TimerSeconds=-1 [ScreenOptionsEditProfile] +Class="ScreenOptionsEditProfile" PageOnCommand=visible,false [ScreenReloadSongs] From 1d1c2925f148b1f55856d2851e22ade52e1c953c Mon Sep 17 00:00:00 2001 From: Thai Pangsakulyanont Date: Wed, 23 Jul 2014 12:47:56 +0900 Subject: [PATCH 33/80] Make StepMania compile in Xcode 5.1.1 project: - Mac OS X 10.6 SDK is used. - Architecture has been set to 32-bit. Otherwise, `MemoryCardDriverThreaded_MacOSX` and `HIDDevice` will not compile. - Replaced the outdated `README` file with a new `README.md`. libmad: - Use FPM_64BIT instead of FPM_INTEL. Otherwise, it will not compile. Also, latest Xcode seems not to support `$(...)` expansion in defining macros. Instead, they are hardcoded in the build settings. stepmania: - Removed compiler flags `-finline-limit` and `-falign-loops=16` --- Xcode/README | 22 ------------------ Xcode/README.md | 11 +++++++++ Xcode/stepmania.xcodeproj/project.pbxproj | 27 ++++++++--------------- 3 files changed, 20 insertions(+), 40 deletions(-) delete mode 100644 Xcode/README create mode 100644 Xcode/README.md diff --git a/Xcode/README b/Xcode/README deleted file mode 100644 index 4ec9d2cc87..0000000000 --- a/Xcode/README +++ /dev/null @@ -1,22 +0,0 @@ -REQUIREMENTS -Mac OS X 10.5 or higher is required. The Mac OS X 10.3.9 SDK needs to be -installed. - -Xcode 3.0 or higher is required to build. Even though the stepmania project -appears to be a ProjectBuilder project, it has been updated by XCode and -no longer works with ProjectBuilder. - -BUILD -1. Download StepMania from sourceforge. -2. Build StepMania by running: -$ xcodebuild -target stepmania -configuration Native -in the PBProject directory. -To build a universal binary instead, use "-configuration Universal" -instead of "-configuration Native" -3. (Optional) Run: -$ strip -x StepMania.app/Contents/MacOS/StepMania -to reduce the size of the binary. - -Steve Checkoway -stevecheckoway@users.sf.net - diff --git a/Xcode/README.md b/Xcode/README.md new file mode 100644 index 0000000000..d0ca46dcd1 --- /dev/null +++ b/Xcode/README.md @@ -0,0 +1,11 @@ + +StepMania Xcode Project +======================= + + +Mac OS X 10.6 SDK +----------------- + +StepMania requires Mac OS X 10.6 SDK to build. +See this [comment](https://github.com/stepmania/stepmania/issues/224#issuecomment-48857894) on how to install 10.6 SDK in Xcode. + diff --git a/Xcode/stepmania.xcodeproj/project.pbxproj b/Xcode/stepmania.xcodeproj/project.pbxproj index ae4340b24a..483c0775d6 100644 --- a/Xcode/stepmania.xcodeproj/project.pbxproj +++ b/Xcode/stepmania.xcodeproj/project.pbxproj @@ -8346,10 +8346,8 @@ LINKER_DISPLAYS_MANGLED_NAMES = NO; OBJROOT = "$(SRCROOT)/build"; OTHER_CPLUSPLUSFLAGS = ( - "-finline-limit=300", "-fconstant-cfstrings", "-fno-exceptions", - "-falign-loops=16", ); OTHER_LDFLAGS = "-lbz2"; PRODUCT_NAME = "StepMania (Debug)"; @@ -8360,6 +8358,7 @@ AA0AA9000963CF7700427F4D /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + ARCHS = "$(ARCHS_STANDARD_32_BIT)"; CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)"; COPY_PHASE_STRIP = NO; DEAD_CODE_STRIPPING = YES; @@ -8390,7 +8389,7 @@ LINKER_DISPLAYS_MANGLED_NAMES = YES; MACOSX_DEPLOYMENT_TARGET = 10.6; PRESERVE_DEAD_CODE_INITS_AND_TERMS = YES; - SDKROOT = ""; + SDKROOT = macosx10.6; SHARED_PRECOMPS_DIR = "/Library/Caches/com.apple.Xcode.$(UID)/SharedPrecompiledHeaders/$(PRODUCT_NAME)/$(CONFIGURATION)"; STRIP_INSTALLED_PRODUCT = NO; STRIP_STYLE = "non-global"; @@ -8651,8 +8650,6 @@ buildSettings = { COMBINE_HIDPI_IMAGES = YES; CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)"; - FPM = ""; - "FPM[arch=i386]" = FPM_INTEL; GCC_MODEL_TUNING = G5; GCC_PREPROCESSOR_DEFINITIONS = ( "HAVE_ASSERT_H=1", @@ -8664,7 +8661,7 @@ "HAVE_MEMORY_H=1", "HAVE_WAITPID=1", "SIZEOF_LONG=4", - "$(FPM)", + "FPM_INTEL=1", ); GCC_WARN_64_TO_32_BIT_CONVERSION = NO; GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = NO; @@ -8683,8 +8680,6 @@ buildSettings = { COMBINE_HIDPI_IMAGES = YES; CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)"; - FPM = ""; - "FPM[arch=i386]" = FPM_INTEL; GCC_MODEL_TUNING = G5; GCC_PREPROCESSOR_DEFINITIONS = ( "HAVE_ASSERT_H=1", @@ -8696,7 +8691,7 @@ "HAVE_MEMORY_H=1", "HAVE_WAITPID=1", "SIZEOF_LONG=4", - "$(FPM)", + "FPM_INTEL=1", ); GCC_WARN_64_TO_32_BIT_CONVERSION = NO; GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = NO; @@ -8715,8 +8710,6 @@ buildSettings = { COMBINE_HIDPI_IMAGES = YES; CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)"; - FPM = ""; - "FPM[arch=i386]" = FPM_INTEL; GCC_DYNAMIC_NO_PIC = NO; GCC_MODEL_TUNING = G5; GCC_PREPROCESSOR_DEFINITIONS = ( @@ -8729,7 +8722,7 @@ "HAVE_MEMORY_H=1", "HAVE_WAITPID=1", "SIZEOF_LONG=4", - "$(FPM)", + "FPM_INTEL=1", ); GCC_WARN_64_TO_32_BIT_CONVERSION = NO; GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = NO; @@ -8746,6 +8739,7 @@ AABF4DBA0CD37960005A3060 /* PerformanceDebug */ = { isa = XCBuildConfiguration; buildSettings = { + ARCHS = "$(ARCHS_STANDARD_32_BIT)"; CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)"; DEAD_CODE_STRIPPING = YES; EXCLUDED_RECURSIVE_SEARCH_PATH_SUBDIRECTORIES = "*.nib *.lproj *.framework *.gch *.xcode* (*) CVS .svn .hg .git"; @@ -8776,7 +8770,7 @@ LINKER_DISPLAYS_MANGLED_NAMES = YES; MACOSX_DEPLOYMENT_TARGET = 10.6; PRESERVE_DEAD_CODE_INITS_AND_TERMS = YES; - SDKROOT = ""; + SDKROOT = macosx10.6; SHARED_PRECOMPS_DIR = "/Library/Caches/com.apple.Xcode.$(UID)/SharedPrecompiledHeaders/$(PRODUCT_NAME)/$(CONFIGURATION)"; STRIP_STYLE = "non-global"; USER_HEADER_SEARCH_PATHS = "$(PROJECT_DIR)/../extern/glew-1.5.8/include $(PROJECT_DIR)/../extern/jsoncpp/include $(PROJECT_DIR)/../extern/vorbis"; @@ -8821,10 +8815,8 @@ LINKER_DISPLAYS_MANGLED_NAMES = NO; OBJROOT = "$(SRCROOT)/build"; OTHER_CPLUSPLUSFLAGS = ( - "-finline-limit=300", "-fconstant-cfstrings", "-fno-exceptions", - "-falign-loops=16", ); OTHER_LDFLAGS = "-lbz2"; PRODUCT_NAME = "StepMania (Performance-Debug)"; @@ -9040,10 +9032,8 @@ LINKER_DISPLAYS_MANGLED_NAMES = NO; OBJROOT = "$(SRCROOT)/build"; OTHER_CPLUSPLUSFLAGS = ( - "-finline-limit=300", "-fconstant-cfstrings", "-fno-exceptions", - "-falign-loops=16", ); OTHER_LDFLAGS = "-lbz2"; PRODUCT_NAME = StepMania; @@ -9054,6 +9044,7 @@ AAC845150856A19700A9FEAB /* Native */ = { isa = XCBuildConfiguration; buildSettings = { + ARCHS = "$(ARCHS_STANDARD_32_BIT)"; CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)"; DEAD_CODE_STRIPPING = YES; EXCLUDED_RECURSIVE_SEARCH_PATH_SUBDIRECTORIES = "*.nib *.lproj *.framework *.gch *.xcode* (*) CVS .svn .hg .git"; @@ -9084,7 +9075,7 @@ LINKER_DISPLAYS_MANGLED_NAMES = YES; MACOSX_DEPLOYMENT_TARGET = 10.6; PRESERVE_DEAD_CODE_INITS_AND_TERMS = YES; - SDKROOT = ""; + SDKROOT = macosx10.6; SHARED_PRECOMPS_DIR = "/Library/Caches/com.apple.Xcode.$(UID)/SharedPrecompiledHeaders/$(PRODUCT_NAME)/$(CONFIGURATION)"; STRIP_STYLE = "non-global"; USER_HEADER_SEARCH_PATHS = "$(PROJECT_DIR)/../extern/glew-1.5.8/include $(PROJECT_DIR)/../extern/jsoncpp/include $(PROJECT_DIR)/../extern/vorbis"; From 84766a7cff3a9eb8ece6aa36b522a537d57fda7a Mon Sep 17 00:00:00 2001 From: Kyzentun Date: Wed, 23 Jul 2014 00:09:04 -0600 Subject: [PATCH 34/80] Changed LogDisplay to use the full message for IgnoreIdentical. --- Themes/_fallback/Scripts/04 LogDisplay.lua | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/Themes/_fallback/Scripts/04 LogDisplay.lua b/Themes/_fallback/Scripts/04 LogDisplay.lua index 482a73eaa7..537022be86 100644 --- a/Themes/_fallback/Scripts/04 LogDisplay.lua +++ b/Themes/_fallback/Scripts/04 LogDisplay.lua @@ -150,16 +150,8 @@ local log_display_mt= { -- and hardcoded it into BitmapText. local message= tostring(mess.message):gsub("::", ":") if params.IgnoreIdentical then - -- Use only the first line for comparison because the rest is - -- probably stack trace, with args that might vary uselessly. - self.width_tester:settext(message) - local lines= convert_text_to_indented_lines( - self.width_tester, self.indent, self.line_width, self.text_zoom) for i, prevmess in ipairs(self.message_log) do - self.width_tester:settext(prevmess) - local prevlines= convert_text_to_indented_lines( - self.width_tester, self.indent, self.line_width, self.text_zoom) - if lines[1][2] == prevmess[1][2] then return end + if message == prevmess then return end end end if params.ReplaceLinesWhenHidden and self.hidden then From dc55f1391a7cbfb56d5a5a273412ceae2a7037b5 Mon Sep 17 00:00:00 2001 From: Kyzentun Date: Wed, 23 Jul 2014 05:34:23 -0600 Subject: [PATCH 35/80] Added revalidation scheme to NoteData's all_tracks_iterator so that it can be made valid again after the NoteData is transformed by something adding or removing steps. This fixes the crash on courses that use transform mods on the second song. ITG2's Getting Started is an example. --- src/NoteData.cpp | 131 ++++++++++++++++++++++++++++++++++++++++++- src/NoteData.h | 35 +++++++++++- src/NoteDataUtil.cpp | 33 ++++++++++- 3 files changed, 194 insertions(+), 5 deletions(-) diff --git a/src/NoteData.cpp b/src/NoteData.cpp index 24bb051fea..52a1daf4ac 100644 --- a/src/NoteData.cpp +++ b/src/NoteData.cpp @@ -1176,6 +1176,48 @@ void NoteData::LoadFromNode( const XNode* pNode ) FAIL_M("NoteData::LoadFromNode() not implemented"); } +void NoteData::AddATIToList(all_tracks_iterator* iter) const +{ + m_atis.insert(iter); +} + +void NoteData::AddATIToList(all_tracks_const_iterator* iter) const +{ + m_const_atis.insert(iter); +} + +void NoteData::RemoveATIFromList(all_tracks_iterator* iter) const +{ + set::iterator pos= m_atis.find(iter); + if(pos != m_atis.end()) + { + m_atis.erase(pos); + } +} + +void NoteData::RemoveATIFromList(all_tracks_const_iterator* iter) const +{ + set::iterator pos= m_const_atis.find(iter); + if(pos != m_const_atis.end()) + { + m_const_atis.erase(pos); + } +} + +void NoteData::RevalidateATIs(vector const& added_or_removed_tracks, bool added) +{ + for(set::iterator cur= m_atis.begin(); + cur != m_atis.end(); ++cur) + { + (*cur)->Revalidate(this, added_or_removed_tracks, added); + } + for(set::iterator cur= m_const_atis.begin(); + cur != m_const_atis.end(); ++cur) + { + (*cur)->Revalidate(this, added_or_removed_tracks, added); + } +} + template void NoteData::_all_tracks_iterator::Find( bool bReverse ) { @@ -1213,14 +1255,18 @@ void NoteData::_all_tracks_iterator::Find( bool bReverse ) } template -NoteData::_all_tracks_iterator::_all_tracks_iterator( ND &nd, int iStartRow, int iEndRow, bool bReverse, bool bInclusive ) : + NoteData::_all_tracks_iterator::_all_tracks_iterator( ND &nd, int iStartRow, int iEndRow, bool bReverse, bool bInclusive ) : m_pNoteData(&nd), m_iTrack(0), m_bReverse(bReverse) { ASSERT( m_pNoteData->GetNumTracks() > 0 ); + m_StartRow= iStartRow; + m_EndRow= iEndRow; + for( int iTrack = 0; iTrack < m_pNoteData->GetNumTracks(); ++iTrack ) { iter begin, end; + m_Inclusive= bInclusive; if( bInclusive ) m_pNoteData->GetTapNoteRangeInclusive( iTrack, iStartRow, iEndRow, begin, end ); else @@ -1228,6 +1274,7 @@ NoteData::_all_tracks_iterator::_all_tracks_iterator( ND &nd, int m_vBeginIters.push_back( begin ); m_vEndIters.push_back( end ); + m_PrevCurrentRows.push_back(0); iter cur; if( m_bReverse ) @@ -1242,6 +1289,7 @@ NoteData::_all_tracks_iterator::_all_tracks_iterator( ND &nd, int } m_vCurrentIters.push_back( cur ); } + m_pNoteData->AddATIToList(this); Find( bReverse ); } @@ -1254,14 +1302,28 @@ NoteData::_all_tracks_iterator::_all_tracks_iterator( const _all_t COPY_OTHER( m_vCurrentIters ), COPY_OTHER( m_vEndIters ), COPY_OTHER( m_iTrack ), - COPY_OTHER( m_bReverse ) + COPY_OTHER( m_bReverse ), + COPY_OTHER( m_PrevCurrentRows ), + COPY_OTHER( m_StartRow ), + COPY_OTHER( m_EndRow ) #undef COPY_OTHER { + m_pNoteData->AddATIToList(this); +} + +template + NoteData::_all_tracks_iterator::~_all_tracks_iterator() +{ + if(m_pNoteData != NULL) + { + m_pNoteData->RemoveATIFromList(this); + } } template NoteData::_all_tracks_iterator &NoteData::_all_tracks_iterator::operator++() // preincrement { + m_PrevCurrentRows[m_iTrack]= Row(); if( m_bReverse ) { if( m_vCurrentIters[m_iTrack] == m_vBeginIters[m_iTrack] ) @@ -1284,6 +1346,71 @@ NoteData::_all_tracks_iterator NoteData::_all_tracks_iterator + void NoteData::_all_tracks_iterator::Revalidate( + ND* notedata, vector const& added_or_removed_tracks, bool added) +{ + m_pNoteData= notedata; + ASSERT( m_pNoteData->GetNumTracks() > 0 ); + if(!added_or_removed_tracks.empty()) + { + if(added) + { + int avg_row= 0; + for(size_t p= 0; p < m_PrevCurrentRows.size(); ++p) + { + avg_row+= m_PrevCurrentRows[p]; + } + avg_row/= m_PrevCurrentRows.size(); + for(size_t a= 0; a < added_or_removed_tracks.size(); ++a) + { + int track_id= added_or_removed_tracks[a]; + m_PrevCurrentRows.insert(m_PrevCurrentRows.begin()+track_id, avg_row); + } + m_vBeginIters.resize(m_pNoteData->GetNumTracks()); + m_vCurrentIters.resize(m_pNoteData->GetNumTracks()); + m_vEndIters.resize(m_pNoteData->GetNumTracks()); + } + else + { + for(size_t a= 0; a < added_or_removed_tracks.size(); ++a) + { + int track_id= added_or_removed_tracks[a]; + m_PrevCurrentRows.erase(m_PrevCurrentRows.begin()+track_id); + } + m_vBeginIters.resize(m_pNoteData->GetNumTracks()); + m_vCurrentIters.resize(m_pNoteData->GetNumTracks()); + m_vEndIters.resize(m_pNoteData->GetNumTracks()); + } + } + for(int track= 0; track < m_pNoteData->GetNumTracks(); ++track) + { + iter begin, end; + if(m_Inclusive) + { + m_pNoteData->GetTapNoteRangeInclusive(track, m_StartRow, m_EndRow, begin, end); + } + else + { + m_pNoteData->GetTapNoteRange(track, m_StartRow, m_EndRow, begin, end); + } + m_vBeginIters[track]= begin; + m_vEndIters[track]= end; + iter cur; + if(m_bReverse) + { + cur= m_pNoteData->upper_bound(track, m_PrevCurrentRows[track]); + } + else + { + cur= m_pNoteData->lower_bound(track, m_PrevCurrentRows[track]); + } + m_vCurrentIters[track]= cur; + } + Find(m_bReverse); +} + /* XXX: This doesn't satisfy the requirements that ++iter; --iter; is a no-op so it cannot be bidirectional for now. */ #if 0 template diff --git a/src/NoteData.h b/src/NoteData.h index 6a7b4bf1d0..40033f1a2f 100644 --- a/src/NoteData.h +++ b/src/NoteData.h @@ -47,7 +47,12 @@ public: const_iterator lower_bound( int iTrack, int iRow ) const { return m_TapNotes[iTrack].lower_bound( iRow ); } iterator upper_bound( int iTrack, int iRow ) { return m_TapNotes[iTrack].upper_bound( iRow ); } const_iterator upper_bound( int iTrack, int iRow ) const { return m_TapNotes[iTrack].upper_bound( iRow ); } - void swap( NoteData &nd ) { m_TapNotes.swap( nd.m_TapNotes ); } + void swap( NoteData &nd ) + { + m_TapNotes.swap(nd.m_TapNotes); + m_atis.swap(nd.m_atis); + m_const_atis.swap(nd.m_const_atis); + } // This is ugly to make it templated but I don't want to have to write the same class twice. @@ -65,10 +70,18 @@ public: int m_iTrack; bool m_bReverse; + // These exist so that the iterator can be revalidated if the NoteData is + // transformed during this iterator's lifetime. + vector m_PrevCurrentRows; + bool m_Inclusive; + int m_StartRow; + int m_EndRow; + void Find( bool bReverse ); public: _all_tracks_iterator( ND &nd, int iStartRow, int iEndRow, bool bReverse, bool bInclusive ); _all_tracks_iterator( const _all_tracks_iterator &other ); + ~_all_tracks_iterator(); _all_tracks_iterator &operator++(); // preincrement _all_tracks_iterator operator++( int dummy ); // postincrement //_all_tracks_iterator &operator--(); // predecrement @@ -81,11 +94,15 @@ public: inline TN *operator->() { DEBUG_ASSERT( !IsAtEnd() ); return &m_vCurrentIters[m_iTrack]->second; } inline const TN &operator*() const { DEBUG_ASSERT( !IsAtEnd() ); return m_vCurrentIters[m_iTrack]->second; } inline const TN *operator->() const { DEBUG_ASSERT( !IsAtEnd() ); return &m_vCurrentIters[m_iTrack]->second; } + // Use when transforming the NoteData. + void Revalidate(ND* notedata, vector const& added_or_removed_tracks, bool added); }; typedef _all_tracks_iterator all_tracks_iterator; typedef _all_tracks_iterator all_tracks_const_iterator; typedef all_tracks_iterator all_tracks_reverse_iterator; typedef all_tracks_const_iterator all_tracks_const_reverse_iterator; + friend class _all_tracks_iterator; + friend class _all_tracks_iterator; private: // There's no point in inserting empty notes into the map. // Any blank space in the map is defined to be empty. @@ -129,7 +146,17 @@ private: pair GetNumRowsWithSimultaneousTapsTwoPlayer(int minTaps = 2, int startRow = 0, int endRow = MAX_NOTE_ROW) const; - + + // These exist so that they can be revalidated when something that transforms + // the NoteData occurs. -Kyz + mutable set m_atis; + mutable set m_const_atis; + + void AddATIToList(all_tracks_iterator* iter) const; + void AddATIToList(all_tracks_const_iterator* iter) const; + void RemoveATIFromList(all_tracks_iterator* iter) const; + void RemoveATIFromList(all_tracks_const_iterator* iter) const; + public: void Init(); @@ -196,6 +223,10 @@ public: return all_tracks_const_iterator(*this, iStartRow, iEndRow, true, bInclusive ); } + // Call this after using any transform that changes the NoteData. + void RevalidateATIs(vector const& added_or_removed_tracks, bool added); + void TransferATIs(NoteData& to); + /* Return an iterator range include iStartRow to iEndRow. Extend the range to include * hold notes overlapping the boundary. */ void GetTapNoteRangeInclusive(int iTrack, int iStartRow, int iEndRow, diff --git a/src/NoteDataUtil.cpp b/src/NoteDataUtil.cpp index 8ad1e123da..b521f84125 100644 --- a/src/NoteDataUtil.cpp +++ b/src/NoteDataUtil.cpp @@ -261,6 +261,7 @@ static void LoadFromSMNoteDataStringWithPlayer( NoteData& out, const RString &sS begin = next; } } + out.RevalidateATIs(vector(), false); } void NoteDataUtil::LoadFromSMNoteDataString( NoteData &out, const RString &sSMNoteData_, bool bComposite ) @@ -311,6 +312,7 @@ void NoteDataUtil::LoadFromSMNoteDataString( NoteData &out, const RString &sSMNo LoadFromSMNoteDataStringWithPlayer( nd, sSMNoteData, start, size, pn, iNumTracks ); } CombineCompositeNoteData( out, vParts ); + out.RevalidateATIs(vector(), false); } void NoteDataUtil::InsertHoldTails( NoteData &inout ) @@ -487,6 +489,7 @@ void NoteDataUtil::CombineCompositeNoteData( NoteData &out, const vector(), false); } @@ -557,6 +560,7 @@ void NoteDataUtil::LoadTransformedSlidingWindow( const NoteData &in, NoteData &o out.SetTapNote( iNewTrack, r, tn ); } } + out.RevalidateATIs(vector(), false); } void PlaceAutoKeysound( NoteData &out, int row, TapNote akTap ) @@ -672,6 +676,7 @@ void NoteDataUtil::LoadOverlapped( const NoteData &in, NoteData &out, int iNewNu PlaceAutoKeysound( out, row, tnFrom ); } } + out.RevalidateATIs(vector(), false); } int FindLongestOverlappingHoldNoteForAnyTrack( const NoteData &in, int iRow ) @@ -981,6 +986,7 @@ void NoteDataUtil::RemoveHoldNotes( NoteData &in, int iStartIndex, int iEndIndex begin->second.type = TapNote::tap; } } + in.RevalidateATIs(vector(), false); } void NoteDataUtil::ChangeRollsToHolds( NoteData &in, int iStartIndex, int iEndIndex ) @@ -997,6 +1003,7 @@ void NoteDataUtil::ChangeRollsToHolds( NoteData &in, int iStartIndex, int iEndIn begin->second.subType = TapNote::hold_head_hold; } } + in.RevalidateATIs(vector(), false); } void NoteDataUtil::ChangeHoldsToRolls( NoteData &in, int iStartIndex, int iEndIndex ) @@ -1013,6 +1020,7 @@ void NoteDataUtil::ChangeHoldsToRolls( NoteData &in, int iStartIndex, int iEndIn begin->second.subType = TapNote::hold_head_roll; } } + in.RevalidateATIs(vector(), false); } void NoteDataUtil::RemoveSimultaneousNotes( NoteData &in, int iMaxSimultaneous, int iStartIndex, int iEndIndex ) @@ -1051,6 +1059,7 @@ void NoteDataUtil::RemoveSimultaneousNotes( NoteData &in, int iMaxSimultaneous, } } } + in.RevalidateATIs(vector(), false); } void NoteDataUtil::RemoveJumps( NoteData &inout, int iStartIndex, int iEndIndex ) @@ -1074,6 +1083,7 @@ void NoteDataUtil::RemoveSpecificTapNotes( NoteData &inout, TapNote::Type tn, in FOREACH_NONEMPTY_ROW_IN_TRACK_RANGE( inout, t, r, iStartIndex, iEndIndex ) if( inout.GetTapNote(t,r).type == tn ) inout.SetTapNote( t, r, TAP_EMPTY ); + inout.RevalidateATIs(vector(), false); } void NoteDataUtil::RemoveMines( NoteData &inout, int iStartIndex, int iEndIndex ) @@ -1110,6 +1120,7 @@ void NoteDataUtil::RemoveAllButOneTap( NoteData &inout, int row ) if( iter != inout.end(track) && iter->second.type == TapNote::tap ) inout.RemoveTapNote( track, iter ); } + inout.RevalidateATIs(vector(), false); } void NoteDataUtil::RemoveAllButPlayer( NoteData &inout, PlayerNumber pn ) @@ -1126,6 +1137,7 @@ void NoteDataUtil::RemoveAllButPlayer( NoteData &inout, PlayerNumber pn ) ++i; } } + inout.RevalidateATIs(vector(), false); } // TODO: Perform appropriate matrix calculations for everything instead. @@ -1536,6 +1548,7 @@ void NoteDataUtil::Turn( NoteData &inout, StepsType st, TrackMapping tt, int iSt SuperShuffleTaps( tempNoteData, iStartIndex, iEndIndex ); inout.CopyAll( tempNoteData ); + inout.RevalidateATIs(vector(), false); } void NoteDataUtil::Backwards( NoteData &inout ) @@ -1560,6 +1573,7 @@ void NoteDataUtil::Backwards( NoteData &inout ) } inout.swap( out ); + inout.RevalidateATIs(vector(), false); } void NoteDataUtil::SwapSides( NoteData &inout ) @@ -1575,6 +1589,7 @@ void NoteDataUtil::SwapSides( NoteData &inout ) NoteData orig( inout ); inout.LoadTransformed( orig, orig.GetNumTracks(), iOriginalTrackToTakeFrom ); + inout.RevalidateATIs(vector(), false); } void NoteDataUtil::Little( NoteData &inout, int iStartIndex, int iEndIndex ) @@ -1589,6 +1604,7 @@ void NoteDataUtil::Little( NoteData &inout, int iStartIndex, int iEndIndex ) inout.SetTapNote( t, i, TAP_EMPTY ); } } + inout.RevalidateATIs(vector(), false); } // Make all quarter notes into jumps. @@ -1641,6 +1657,7 @@ void NoteDataUtil::Wide( NoteData &inout, int iStartIndex, int iEndIndex ) } inout.SetTapNote(iTrackToAdd, i, TAP_ADDITION_TAP); } + inout.RevalidateATIs(vector(), false); } void NoteDataUtil::Big( NoteData &inout, int iStartIndex, int iEndIndex ) @@ -1747,6 +1764,7 @@ void NoteDataUtil::InsertIntelligentTaps( inout.SetTapNote(iTrackOfNoteToAdd, iRowToAdd, TAP_ADDITION_TAP); } + inout.RevalidateATIs(vector(), false); } #if 0 class TrackIterator @@ -1873,6 +1891,7 @@ void NoteDataUtil::AddMines( NoteData &inout, int iStartIndex, int iEndIndex ) iRowCount = 0; } } + inout.RevalidateATIs(vector(), false); } void NoteDataUtil::Echo( NoteData &inout, int iStartIndex, int iEndIndex ) @@ -1927,6 +1946,7 @@ void NoteDataUtil::Echo( NoteData &inout, int iStartIndex, int iEndIndex ) inout.SetTapNote( iEchoTrack, iRowEcho, TAP_ADDITION_TAP ); } + inout.RevalidateATIs(vector(), false); } void NoteDataUtil::Planted( NoteData &inout, int iStartIndex, int iEndIndex ) @@ -1999,7 +2019,7 @@ void NoteDataUtil::ConvertTapsToHolds( NoteData &inout, int iSimultaneousHolds, } } } - + inout.RevalidateATIs(vector(), false); } void NoteDataUtil::Stomp( NoteData &inout, StepsType st, int iStartIndex, int iEndIndex ) @@ -2042,6 +2062,7 @@ void NoteDataUtil::Stomp( NoteData &inout, StepsType st, int iStartIndex, int iE } } } + inout.RevalidateATIs(vector(), false); } void NoteDataUtil::SnapToNearestNoteType( NoteData &inout, NoteType nt1, NoteType nt2, int iStartIndex, int iEndIndex ) @@ -2088,6 +2109,7 @@ void NoteDataUtil::SnapToNearestNoteType( NoteData &inout, NoteType nt1, NoteTyp inout.SetTapNote( c, iNewIndex, tnNew ); } } + inout.RevalidateATIs(vector(), false); } @@ -2254,6 +2276,7 @@ void NoteDataUtil::RemoveStretch( NoteData &inout, StepsType st, int iStartIndex if( !bPassedOneMask ) RemoveAllButOneTap( inout, r ); } + inout.RevalidateATIs(vector(), false); } bool NoteDataUtil::RowPassesValidMask( NoteData &inout, int row, const bool bValidMask[] ) @@ -2277,6 +2300,7 @@ void NoteDataUtil::ConvertAdditionsToRegular( NoteData &inout ) tn.source = TapNote::original; inout.SetTapNote( t, r, tn ); } + inout.RevalidateATIs(vector(), false); } void NoteDataUtil::TransformNoteData( NoteData &nd, const AttackArray &aa, StepsType st, Song* pSong ) @@ -2373,6 +2397,7 @@ void NoteDataUtil::AddTapAttacks( NoteData &nd, Song* pSong ) -1 ); nd.SetTapNote( iTrack, BeatToNoteRow(fBeat), tn ); } + nd.RevalidateATIs(vector(), false); } void NoteDataUtil::Scale( NoteData &nd, float fScale ) @@ -2395,6 +2420,7 @@ void NoteDataUtil::Scale( NoteData &nd, float fScale ) } nd.swap( ndOut ); + nd.RevalidateATIs(vector(), false); } /* XXX: move this to an appropriate place, same place as NoteRowToBeat perhaps? */ @@ -2430,6 +2456,7 @@ void NoteDataUtil::ScaleRegion( NoteData &nd, float fScale, int iStartIndex, int } nd.swap( ndOut ); + nd.RevalidateATIs(vector(), false); } void NoteDataUtil::InsertRows( NoteData &nd, int iStartIndex, int iRowsToAdd ) @@ -2441,6 +2468,7 @@ void NoteDataUtil::InsertRows( NoteData &nd, int iStartIndex, int iRowsToAdd ) temp.CopyRange( nd, iStartIndex, MAX_NOTE_ROW ); nd.ClearRange( iStartIndex, MAX_NOTE_ROW ); nd.CopyRange( temp, 0, MAX_NOTE_ROW, iStartIndex + iRowsToAdd ); + nd.RevalidateATIs(vector(), false); } void NoteDataUtil::DeleteRows( NoteData &nd, int iStartIndex, int iRowsToDelete ) @@ -2452,6 +2480,7 @@ void NoteDataUtil::DeleteRows( NoteData &nd, int iStartIndex, int iRowsToDelete temp.CopyRange( nd, iStartIndex + iRowsToDelete, MAX_NOTE_ROW ); nd.ClearRange( iStartIndex, MAX_NOTE_ROW ); nd.CopyRange( temp, 0, MAX_NOTE_ROW, iStartIndex ); + nd.RevalidateATIs(vector(), false); } void NoteDataUtil::RemoveAllTapsOfType( NoteData& ndInOut, TapNote::Type typeToRemove ) @@ -2470,6 +2499,7 @@ void NoteDataUtil::RemoveAllTapsOfType( NoteData& ndInOut, TapNote::Type typeToR ++iter; } } + ndInOut.RevalidateATIs(vector(), false); } void NoteDataUtil::RemoveAllTapsExceptForType( NoteData& ndInOut, TapNote::Type typeToKeep ) @@ -2485,6 +2515,7 @@ void NoteDataUtil::RemoveAllTapsExceptForType( NoteData& ndInOut, TapNote::Type ++iter; } } + ndInOut.RevalidateATIs(vector(), false); } int NoteDataUtil::GetMaxNonEmptyTrack( const NoteData& in ) From ba0a0c69d2ec83da18b81250d75cc4bce00a8495 Mon Sep 17 00:00:00 2001 From: Kyzentun Date: Wed, 23 Jul 2014 13:25:04 -0600 Subject: [PATCH 36/80] Fixed Course::GetTotalSeconds to work on courses that don't have a medium difficulty. A course with only double charts was probably the one that made the crash manifest. --- src/Course.cpp | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/Course.cpp b/src/Course.cpp index 3231dbed94..73528353e0 100644 --- a/src/Course.cpp +++ b/src/Course.cpp @@ -823,9 +823,24 @@ bool Course::GetTotalSeconds( StepsType st, float& fSecondsOut ) const if( !AllSongsAreFixed() ) return false; - Trail* pTrail = GetTrail( st, Difficulty_Medium ); + Trail* trail = GetTrail( st, Difficulty_Medium ); + if(!trail) + { + for(int cd= 0; cd < NUM_CourseDifficulty; ++cd) + { + trail= GetTrail(st, (CourseDifficulty)cd); + if(trail) + { + break; + } + } + if(!trail) + { + return false; + } + } - fSecondsOut = pTrail->GetLengthSeconds(); + fSecondsOut = trail->GetLengthSeconds(); return true; } From bc7217908dd2739226332ddb5739cd89e54cf50f Mon Sep 17 00:00:00 2001 From: Kyzentun Date: Thu, 24 Jul 2014 03:38:17 -0600 Subject: [PATCH 37/80] Added Sprite::NewBlankSprite for use by NoteSkinManager. Removed default texture loading from Sprite::Sprite. Should fix problems with white banners and garbage on videos. --- src/NoteSkinManager.cpp | 6 +++--- src/Sprite.cpp | 14 +++++++++++--- src/Sprite.h | 3 +++ 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/NoteSkinManager.cpp b/src/NoteSkinManager.cpp index 1c226daa55..2148154829 100644 --- a/src/NoteSkinManager.cpp +++ b/src/NoteSkinManager.cpp @@ -438,14 +438,14 @@ Actor *NoteSkinManager::LoadActor( const RString &sButton, const RString &sEleme if( !PushActorTemplate(L, sButton, sElement, bSpriteOnly) ) { // ActorUtil will warn about the error - return new Sprite; + return Sprite::NewBlankSprite(); } auto_ptr pNode( XmlFileUtil::XNodeFromTable(L) ); if( pNode.get() == NULL ) { // XNode will warn about the error - return new Sprite; + return Sprite::NewBlankSprite(); } LUA->Release( L ); @@ -460,7 +460,7 @@ Actor *NoteSkinManager::LoadActor( const RString &sButton, const RString &sEleme { LuaHelpers::ReportScriptErrorFmt("%s: %s %s must be a Sprite", m_sCurrentNoteSkin.c_str(), sButton.c_str(), sElement.c_str()); delete pRet; - return new Sprite; + return Sprite::NewBlankSprite(); } } diff --git a/src/Sprite.cpp b/src/Sprite.cpp index 3a82cf343b..f9350e7e4b 100644 --- a/src/Sprite.cpp +++ b/src/Sprite.cpp @@ -32,11 +32,19 @@ Sprite::Sprite() m_fTexCoordVelocityX = 0; m_fTexCoordVelocityY = 0; - - // An uninitialized sprite should be valid to display. -Kyz - Load(TEXTUREMAN->GetDefaultTextureID()); } +// NoteSkinManager needs a sprite with a texture set to return in cases where +// the noteskin doesn't return a valid actor. I would really prefer to make +// Sprite::Sprite load the default texture, but that causes problems for +// banners on ScreenSelectMusic and videos on ScreenGameplay. So rather than +// dig through either of those, NoteSkinManager uses this special function. +Sprite* Sprite::NewBlankSprite() +{ + Sprite* news= new Sprite; + news->Load(TEXTUREMAN->GetDefaultTextureID()); + return news; +} Sprite::~Sprite() { diff --git a/src/Sprite.h b/src/Sprite.h index 0697fc8aec..4e4ba791ac 100644 --- a/src/Sprite.h +++ b/src/Sprite.h @@ -15,6 +15,9 @@ public: Sprite( const Sprite &cpy ); virtual ~Sprite(); + // See explanation in source. + static Sprite* NewBlankSprite(); + virtual void InitState(); void LoadFromNode( const XNode* pNode ); From ba76310febbe3b5b1581ea65214a258837adff35 Mon Sep 17 00:00:00 2001 From: freem Date: Thu, 24 Jul 2014 14:08:37 -0500 Subject: [PATCH 38/80] add missing nextrow character for options rows --- Themes/_fallback/Fonts/_16px fonts.ini | 2 +- Themes/_fallback/Fonts/_20px fonts.ini | 2 +- .../Fonts/_ui chars 16px [main-stroke] 1x1.png | Bin 0 -> 456 bytes .../Fonts/_ui chars 16px [main] 1x1.png | Bin 0 -> 409 bytes Themes/_fallback/Fonts/_ui chars 16px.ini | 14 ++++++++++++++ _assets/fonts/_ui chars 16px 1x1.psd | Bin 0 -> 27689 bytes 6 files changed, 16 insertions(+), 2 deletions(-) create mode 100644 Themes/_fallback/Fonts/_ui chars 16px [main-stroke] 1x1.png create mode 100644 Themes/_fallback/Fonts/_ui chars 16px [main] 1x1.png create mode 100644 Themes/_fallback/Fonts/_ui chars 16px.ini create mode 100644 _assets/fonts/_ui chars 16px 1x1.psd diff --git a/Themes/_fallback/Fonts/_16px fonts.ini b/Themes/_fallback/Fonts/_16px fonts.ini index d56c851b17..23ad8678b0 100644 --- a/Themes/_fallback/Fonts/_16px fonts.ini +++ b/Themes/_fallback/Fonts/_16px fonts.ini @@ -5,4 +5,4 @@ # have them pulled in for every 16-pixel font. # xxx: we don't have 16px japanese or korean fonts [main] -import=_Thai 16px,_misc 16px,_game chars 16px +import=_Thai 16px,_misc 16px,_game chars 16px,_ui chars 16px diff --git a/Themes/_fallback/Fonts/_20px fonts.ini b/Themes/_fallback/Fonts/_20px fonts.ini index 915647249d..41104ffbc0 100644 --- a/Themes/_fallback/Fonts/_20px fonts.ini +++ b/Themes/_fallback/Fonts/_20px fonts.ini @@ -10,4 +10,4 @@ # The characters in _game chars 16px are actually very large; # they'll look fine here, too. -import=_japanese 24px,_korean 24px,_game chars 16px,_misc 16px +import=_japanese 24px,_korean 24px,_game chars 16px,_ui chars 16px,_misc 16px diff --git a/Themes/_fallback/Fonts/_ui chars 16px [main-stroke] 1x1.png b/Themes/_fallback/Fonts/_ui chars 16px [main-stroke] 1x1.png new file mode 100644 index 0000000000000000000000000000000000000000..5fcc04eb7331a3d0ba6ec9d48633d50874e7c456 GIT binary patch literal 456 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 Date: Thu, 24 Jul 2014 16:57:19 -0500 Subject: [PATCH 39/80] make a note about DirectX 9 in the NSIS installer script (I'm not sure how to fix it just yet) --- stepmania.nsi | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/stepmania.nsi b/stepmania.nsi index 114b6a97fb..3ee9a2ccf9 100644 --- a/stepmania.nsi +++ b/stepmania.nsi @@ -643,6 +643,10 @@ Function PreInstall old_nsis_not_installed: + ; todo: this needs to be updated for DirectX 9.0c + ; HKEY_LOCAL_MACHINE "Software\Microsoft\DirectX" "Version" + ; 9.0c is "4.09.00.0904" + ; Check for DirectX 8.0 (to be moved to the right section later) ; We only use this for sound. Actually, I could probably make the sound ; work with an earlier one; I'm not sure if that's needed or not. For one From c0a8528d6a7b95adab2a1e1c34582dab5d19ea79 Mon Sep 17 00:00:00 2001 From: freem Date: Thu, 24 Jul 2014 16:58:34 -0500 Subject: [PATCH 40/80] DX8->DX9 in the rarely updated Manual --- Manual/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Manual/index.html b/Manual/index.html index a05277aeab..56251f96ed 100644 --- a/Manual/index.html +++ b/Manual/index.html @@ -70,7 +70,7 @@ specialized controllers.

However, we highly recommend at least these settings for decent performance:

-

On Windows, DirectX 8.0 is required in order to install StepMania. If DirectX +

On Windows, DirectX 9.0 is required in order to install StepMania. If DirectX is not installed on your computer, the StepMania installer will abort the installation with a warning.

From 166ae6ea11223abb4671f56db398804662acb799 Mon Sep 17 00:00:00 2001 From: freem Date: Thu, 24 Jul 2014 17:51:02 -0500 Subject: [PATCH 41/80] fix really awkward positioning of this line (was using spaces instead of tabs) --- src/ScreenGameplay.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ScreenGameplay.cpp b/src/ScreenGameplay.cpp index 49adc799bf..92429df8dd 100644 --- a/src/ScreenGameplay.cpp +++ b/src/ScreenGameplay.cpp @@ -1958,7 +1958,7 @@ void ScreenGameplay::UpdateHasteRate() { if( !GAMESTATE->IsHumanPlayer(pi->m_pn) ) continue; - fMaxLife = max( fMaxLife, pi->m_pLifeMeter->GetLife() ); + fMaxLife = max( fMaxLife, pi->m_pLifeMeter->GetLife() ); } if( fMaxLife <= m_fHasteLifeSwitchPoint ) GAMESTATE->m_fHasteRate = SCALE( fMaxLife, 0.0f, m_fHasteLifeSwitchPoint, -1.0f, 0.0f ); From 0b8ee8475c2103eb19b6530580a863a2f14f3869 Mon Sep 17 00:00:00 2001 From: Thai Pangsakulyanont Date: Fri, 25 Jul 2014 08:45:24 +0900 Subject: [PATCH 42/80] add note --- Xcode/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Xcode/README.md b/Xcode/README.md index d0ca46dcd1..f83845dd93 100644 --- a/Xcode/README.md +++ b/Xcode/README.md @@ -9,3 +9,5 @@ Mac OS X 10.6 SDK StepMania requires Mac OS X 10.6 SDK to build. See this [comment](https://github.com/stepmania/stepmania/issues/224#issuecomment-48857894) on how to install 10.6 SDK in Xcode. +Please note that you must restart Xcode after installing the SDK, in case Xcode is running, for it to detect the new SDKs. + From acd3340c57fe0d7d1e117bfca87a1986b85d4839 Mon Sep 17 00:00:00 2001 From: sigatrev Date: Thu, 24 Jul 2014 19:45:17 -0500 Subject: [PATCH 43/80] UpdateSongPositions It is useful to have Player SongPositions update off of ScreenGameplay for use with things like ArrowEffects. ScreenGameplay, ScreenHowToPlay, and ScreenEdit stop GameSoundManager from running GameState:UpdateSongPosition and do it themselves, so this has no impact on the screen classes that cared about, and thus updated, player SongPositions. --- src/GameState.cpp | 13 +++++-------- src/GameState.h | 2 +- src/ScreenEdit.cpp | 4 ++-- src/ScreenGameplay.cpp | 2 +- src/ScreenHowToPlay.cpp | 2 +- 5 files changed, 10 insertions(+), 13 deletions(-) diff --git a/src/GameState.cpp b/src/GameState.cpp index 67a3135d87..3dbf40f8aa 100644 --- a/src/GameState.cpp +++ b/src/GameState.cpp @@ -998,7 +998,7 @@ void GameState::ResetStageStatistics() m_iStageSeed = rand(); } -void GameState::UpdateSongPosition( float fPositionSeconds, const TimingData &timing, const RageTimer ×tamp, bool bUpdatePlayers ) +void GameState::UpdateSongPosition( float fPositionSeconds, const TimingData &timing, const RageTimer ×tamp ) { /* It's not uncommon to get a lot of duplicated positions from the sound * driver, like so: 13.120953,13.130975,13.130975,13.130975,13.140998,... @@ -1017,15 +1017,12 @@ void GameState::UpdateSongPosition( float fPositionSeconds, const TimingData &ti m_Position.UpdateSongPosition( fPositionSeconds, timing, timestamp ); - if( bUpdatePlayers ) + FOREACH_EnabledPlayer( pn ) { - FOREACH_EnabledPlayer( pn ) + if( m_pCurSteps[pn] ) { - if( m_pCurSteps[pn] ) - { - m_pPlayerState[pn]->m_Position.UpdateSongPosition( fPositionSeconds, *m_pCurSteps[pn]->GetTimingData(), timestamp ); - Actor::SetPlayerBGMBeat( pn, m_pPlayerState[pn]->m_Position.m_fSongBeatVisible, m_pPlayerState[pn]->m_Position.m_fSongBeatNoOffset ); - } + m_pPlayerState[pn]->m_Position.UpdateSongPosition( fPositionSeconds, *m_pCurSteps[pn]->GetTimingData(), timestamp ); + Actor::SetPlayerBGMBeat( pn, m_pPlayerState[pn]->m_Position.m_fSongBeatVisible, m_pPlayerState[pn]->m_Position.m_fSongBeatNoOffset ); } } Actor::SetBGMTime( GAMESTATE->m_Position.m_fMusicSecondsVisible, GAMESTATE->m_Position.m_fSongBeatVisible, fPositionSeconds, GAMESTATE->m_Position.m_fSongBeatNoOffset ); diff --git a/src/GameState.h b/src/GameState.h index 824d658325..3b6bf60345 100644 --- a/src/GameState.h +++ b/src/GameState.h @@ -254,7 +254,7 @@ public: static const float MUSIC_SECONDS_INVALID; void ResetMusicStatistics(); // Call this when it's time to play a new song. Clears the values above. - void UpdateSongPosition( float fPositionSeconds, const TimingData &timing, const RageTimer ×tamp = RageZeroTimer, bool bUpdatePlayers = false ); + void UpdateSongPosition( float fPositionSeconds, const TimingData &timing, const RageTimer ×tamp = RageZeroTimer ); float GetSongPercent( float beat ) const; bool AllAreInDangerOrWorse() const; diff --git a/src/ScreenEdit.cpp b/src/ScreenEdit.cpp index 3c8df4ab38..6a05c933dc 100644 --- a/src/ScreenEdit.cpp +++ b/src/ScreenEdit.cpp @@ -1345,7 +1345,7 @@ void ScreenEdit::Update( float fDeltaTime ) { RageTimer tm; const float fSeconds = m_pSoundMusic->GetPositionSeconds( NULL, &tm ); - GAMESTATE->UpdateSongPosition( fSeconds, GAMESTATE->m_pCurSong->m_SongTiming, tm, true ); + GAMESTATE->UpdateSongPosition( fSeconds, GAMESTATE->m_pCurSong->m_SongTiming, tm ); } if( m_EditState == STATE_RECORDING ) @@ -3037,7 +3037,7 @@ void ScreenEdit::TransitionEditState( EditState em ) /* Give a 1 second lead-in. If we're loading Player, this must be done first. * Also be sure to get the right timing. */ float fSeconds = GetAppropriateTiming().GetElapsedTimeFromBeat( NoteRowToBeat(m_iStartPlayingAt) ) - 1; - GAMESTATE->UpdateSongPosition( fSeconds, GetAppropriateTiming(), RageZeroTimer, true ); + GAMESTATE->UpdateSongPosition( fSeconds, GetAppropriateTiming(), RageZeroTimer ); GAMESTATE->m_bGameplayLeadIn.Set( false ); diff --git a/src/ScreenGameplay.cpp b/src/ScreenGameplay.cpp index 49adc799bf..4c315860e2 100644 --- a/src/ScreenGameplay.cpp +++ b/src/ScreenGameplay.cpp @@ -1468,7 +1468,7 @@ void ScreenGameplay::UpdateSongPosition( float fDeltaTime ) RageTimer tm; const float fSeconds = m_pSoundMusic->GetPositionSeconds( NULL, &tm ); const float fAdjust = SOUND->GetFrameTimingAdjustment( fDeltaTime ); - GAMESTATE->UpdateSongPosition( fSeconds+fAdjust, GAMESTATE->m_pCurSong->m_SongTiming, tm+fAdjust, true ); + GAMESTATE->UpdateSongPosition( fSeconds+fAdjust, GAMESTATE->m_pCurSong->m_SongTiming, tm+fAdjust ); } void ScreenGameplay::BeginScreen() diff --git a/src/ScreenHowToPlay.cpp b/src/ScreenHowToPlay.cpp index 2daf79084e..b6b50790df 100644 --- a/src/ScreenHowToPlay.cpp +++ b/src/ScreenHowToPlay.cpp @@ -251,7 +251,7 @@ void ScreenHowToPlay::Update( float fDelta ) if( GAMESTATE->m_pCurSong != NULL ) { RageTimer tm; - GAMESTATE->UpdateSongPosition( m_fFakeSecondsIntoSong, GAMESTATE->m_pCurSong->m_SongTiming, tm, true ); + GAMESTATE->UpdateSongPosition( m_fFakeSecondsIntoSong, GAMESTATE->m_pCurSong->m_SongTiming, tm ); m_fFakeSecondsIntoSong += fDelta; static int iLastNoteRowCounted = 0; From c05a173d521934fc59066faf04f0bc2fdc22bd67 Mon Sep 17 00:00:00 2001 From: Kyzentun Date: Fri, 25 Jul 2014 00:20:38 -0600 Subject: [PATCH 44/80] Fixed UpdateHasteRate and PlayerInfo:GetLifeMeter to check whether the life meter is null before using it. --- src/ScreenGameplay.cpp | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/ScreenGameplay.cpp b/src/ScreenGameplay.cpp index 92429df8dd..4d8b1ab646 100644 --- a/src/ScreenGameplay.cpp +++ b/src/ScreenGameplay.cpp @@ -1958,7 +1958,15 @@ void ScreenGameplay::UpdateHasteRate() { if( !GAMESTATE->IsHumanPlayer(pi->m_pn) ) continue; - fMaxLife = max( fMaxLife, pi->m_pLifeMeter->GetLife() ); + // In Battle/Rave mode, the players don't have life meters. + if(pi->m_pLifeMeter) + { + fMaxLife= max(fMaxLife, pi->m_pLifeMeter->GetLife()); + } + else + { + fMaxLife= 1; + } } if( fMaxLife <= m_fHasteLifeSwitchPoint ) GAMESTATE->m_fHasteRate = SCALE( fMaxLife, 0.0f, m_fHasteLifeSwitchPoint, -1.0f, 0.0f ); @@ -3008,7 +3016,16 @@ LUA_REGISTER_DERIVED_CLASS( ScreenGameplay, ScreenWithMenuElements ) class LunaPlayerInfo: public Luna { public: - static int GetLifeMeter( T* p, lua_State *L ) { p->m_pLifeMeter->PushSelf(L); return 1; } + static int GetLifeMeter( T* p, lua_State *L ) + { + if(p->m_pLifeMeter) + { + p->m_pLifeMeter->PushSelf(L); + return 1; + } + return 0; + } + static int GetStepsQueueWrapped( T* p, lua_State *L ) { int iIndex = IArg(1); From 0756bfa5f4ea548a59c97bf187021a5027e5c074 Mon Sep 17 00:00:00 2001 From: freem Date: Fri, 25 Jul 2014 01:39:33 -0500 Subject: [PATCH 45/80] make [ScreenHowToPlay] CharacterName metric work again --- src/ScreenHowToPlay.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ScreenHowToPlay.cpp b/src/ScreenHowToPlay.cpp index 2daf79084e..f653dacd99 100644 --- a/src/ScreenHowToPlay.cpp +++ b/src/ScreenHowToPlay.cpp @@ -94,8 +94,8 @@ void ScreenHowToPlay::Init() if( (bool)USE_CHARACTER && vpCharacters.size() && HaveAllCharAnimations() ) { Character* displayChar; - if( !CHARACTER_NAME.GetValue().empty() && CHARMAN->GetCharacterFromID(CHARACTER_NAME) ) - displayChar = CHARMAN->GetCharacterFromID(CHARACTER_NAME); + if( !CHARACTER_NAME.GetValue().empty() && CHARMAN->GetCharacterFromID(CHARACTER_NAME.GetValue()) ) + displayChar = CHARMAN->GetCharacterFromID(CHARACTER_NAME.GetValue()); else displayChar = CHARMAN->GetRandomCharacter(); From 527e93c792c8ac6c1d6a12f3dcdf4d2df7134ff2 Mon Sep 17 00:00:00 2001 From: freem Date: Fri, 25 Jul 2014 12:59:47 -0500 Subject: [PATCH 46/80] [Themes/default] hack for SWME StageDisplay to show correct stage on Normal Mode Evaluation --- .../ScreenWithMenuElements StageDisplay.lua | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/Themes/default/Graphics/ScreenWithMenuElements StageDisplay.lua b/Themes/default/Graphics/ScreenWithMenuElements StageDisplay.lua index e0baff0761..5a66032c12 100644 --- a/Themes/default/Graphics/ScreenWithMenuElements StageDisplay.lua +++ b/Themes/default/Graphics/ScreenWithMenuElements StageDisplay.lua @@ -22,12 +22,19 @@ t[#t+1] = Def.ActorFrame { elseif GAMESTATE:IsEventMode() then self:settextf("Stage %s", curStageIndex); else + -- hack: ScreenEvaluation shows the current stage, but it needs to + -- show the last stage instead. PlayedStageStats has the right one. + if string.find(curScreen,"Evaluation") then + local stageStats = STATSMAN:GetPlayedStageStats(1) + curStage = stageStats:GetStage() + end + if THEME:GetMetric(curScreen,"StageDisplayUseShortString") then - self:settextf("%s", ToEnumShortString(curStage)); - self:zoom(0.75); + self:settextf("%s", ToEnumShortString(curStage)); + self:zoom(0.75); else - self:settextf("%s Stage", ToEnumShortString(curStage)); - self:zoom(1); + self:settextf("%s Stage", ToEnumShortString(curStage)); + self:zoom(1); end; end; -- StepMania is being stupid so we have to do this here; From 32e5d7e90c896563c190c34a8802b514eb584607 Mon Sep 17 00:00:00 2001 From: Kyzentun Date: Fri, 25 Jul 2014 14:33:15 -0600 Subject: [PATCH 47/80] Improved three-key support. Default theme should be completely usable with three-key cabinets if ThreeKeyNavigation pref is true. Added ThreeKeyNavigation pref. ScreenOptions:NavigationMode metric now uses that pref to decide between normal and toggle modes. Added GoToFirstOnStart to OptionRowHandlerLua so an option row can control that behavior. Rewrote input for default's ScreenSelectProfile to use an input callback to take advantage of menu button mapping. Fixed inconsistent indentation in ORHL documentation. --- .../Examples/OptionRowHandlerLua.lua | 39 ++++---- Themes/_fallback/Languages/en.ini | 5 + Themes/_fallback/Scripts/02 Other.lua | 8 ++ .../_fallback/Scripts/03 CustomSpeedMods.lua | 30 +++--- Themes/_fallback/metrics.ini | 7 +- .../ScreenSelectProfile overlay.lua | 98 +++++++++++-------- src/OptionRow.cpp | 7 +- src/OptionRow.h | 1 + src/OptionRowHandler.cpp | 11 ++- src/OptionRowHandler.h | 1 + src/PrefsManager.cpp | 1 + src/PrefsManager.h | 1 + src/RageTexture.cpp | 6 ++ src/ScreenOptions.cpp | 2 +- src/ScreenOptionsMasterPrefs.cpp | 1 + src/Sprite.h | 2 +- 16 files changed, 141 insertions(+), 79 deletions(-) diff --git a/Docs/Themerdocs/Examples/OptionRowHandlerLua.lua b/Docs/Themerdocs/Examples/OptionRowHandlerLua.lua index 4072233bdc..20eef74c10 100644 --- a/Docs/Themerdocs/Examples/OptionRowHandlerLua.lua +++ b/Docs/Themerdocs/Examples/OptionRowHandlerLua.lua @@ -18,13 +18,18 @@ -- The function "FooMods" returns a table containing all the information the -- option row handler needs to build the option row. function FooMods() - return { + return { -- A string with the name of the row. This name will be localized using -- the entry in the "OptionTitles" section of the language file. - Name= "Foo", + Name= "Foo", + + -- A boolean that controls whether this row goes to the "next row" + -- element when NavigationMode for the screen is "toggle" and the + -- ArcadeOptionsNavigation preference is 1. + GoToFirstOnStart= false, -- A boolean controlling whether the choice affects all players. - OneChoiceForAllPlayers= false, + OneChoiceForAllPlayers= false, -- A boolean controlling whether SaveSelections is called after every -- change. If this is true, SaveSelections will be called every time @@ -35,12 +40,12 @@ function FooMods() -- "ShowOneInRow" shows only the choice with focus is shown. -- "ShowOneInRow" is forced if there are enough choices that they would go -- off screen. - LayoutType= "ShowAllInRow", + LayoutType= "ShowAllInRow", -- A SelectType enum value. "SelectOne" allows only one choice to be -- selected. "SelectMultiple" allows multiple to be selected. -- "SelectNone" allows none to be selected. - SelectType= "SelectMultiple", + SelectType= "SelectMultiple", -- Optional function. If non-nil, this function must return a table of -- PlayerNumbers that are allowed to use the row. @@ -56,7 +61,7 @@ function FooMods() -- A table of strings that are the names of choices. Choice names are not -- localized. - Choices= {"a", "b", "c", "d"}, + Choices= {"a", "b", "c", "d"}, -- Optional table. If non-nil, this table must contain a list of messages -- this row should listen for. If one of the messages is recieved, the @@ -68,31 +73,31 @@ function FooMods() -- on the row the player has selected. -- self is the table returned by the original function used to create the -- option row. (the table being created right now). - -- list is a table of bools, all initially false. Set them to true to + -- list is a table of bools, all initially false. Set them to true to -- indicate which options are on. -- pn is the PlayerNumber of the player the selections are for. - LoadSelections= function(self, list, pn) + LoadSelections= function(self, list, pn) Trace("FooMods:LoadSelections(" .. pn .. ")") - for i, choice in ipairs(self.Choices) do + for i, choice in ipairs(self.Choices) do -- Randomly set some to true just for an example. if math.random(0, 1) == 1 then Trace(choice .. " (" .. i .. ")" .. " set to true.") list[i]= true end - end - end, + end + end, -- SaveSelections should examine the list of what the player has selected -- and apply the appropriate modifiers to the player. -- Same args as LoadSelections. - SaveSelections= function(self, list, pn) + SaveSelections= function(self, list, pn) Trace("FooMods:SaveSelections(" .. pn .. ")") - for i, choice in ipairs(self.Choices) do - if list[i] then + for i, choice in ipairs(self.Choices) do + if list[i] then Trace(choice .. " (" .. i .. ")" .. " set to true.") end - end - end, + end + end, -- Optional function. If non-nil, this function must take 3 parameters -- (self, pn, choice), and return a bool. It is called when a player @@ -137,5 +142,5 @@ function FooMods() end return change >= 2 end - } + } end diff --git a/Themes/_fallback/Languages/en.ini b/Themes/_fallback/Languages/en.ini index 0369decce2..c82211fe60 100644 --- a/Themes/_fallback/Languages/en.ini +++ b/Themes/_fallback/Languages/en.ini @@ -489,6 +489,7 @@ Test Input=Test the responsiveness of connected joysticks. Test Lights=Test the responsiveness of connected lights. TextureColorDepth=Choose the color depth of textures. 32 bit textures use more memory, but look nicer. Theme=Choose from this list of installed theme packs. +ThreeKeyNavigation=&oq;Five Key&oq;: L/R/D/U menu buttons and Start. &oq;Three Key&oq;: L/R menu buttons and Start. TimingWindowScale=Increase this value to cause your steps to be judged more strictly (i.e. shrink the timing window). Toggle Song=Toggle Song Turn=Turn @@ -663,6 +664,7 @@ Expand 2->3=Expand 2->3 Expand 2x=Expand 2x Expand 3->4=Expand 3->4 Fast=Fast +Five Key Menu=Five Key Flat=Flat Flip=Flip Floored=Floored @@ -702,6 +704,7 @@ Mirror=Mirror N/A=N/A Native Language=Native Language Never=Never +NextRow=&nextrow; New=New NewEdit=-New Edit- No=No @@ -784,6 +787,7 @@ Swap Sides=Swap Sides Sync Machine=Sync Machine Sync Song=Sync Song Sync Tempo=Sync Tempo +Three Key Menu=Three Key Tiny=Tiny Tipsy=Tipsy Title Only=Title Only @@ -1119,6 +1123,7 @@ Test Input=Test Input Test Lights=Test Lights TextureColorDepth=Texture Color Theme=Theme +ThreeKeyNavigation=Menu Navigation TimingWindowScale=Judge Difficulty Transform=Transform Transfer Edits to USB=Transfer Edits to USB diff --git a/Themes/_fallback/Scripts/02 Other.lua b/Themes/_fallback/Scripts/02 Other.lua index 21044760a0..16e263388c 100644 --- a/Themes/_fallback/Scripts/02 Other.lua +++ b/Themes/_fallback/Scripts/02 Other.lua @@ -133,6 +133,14 @@ function Song:GetStageCost() return self:IsMarathon() and 3 or self:IsLong() and 2 or 1 end +function OptionsNavigationMode() + if PREFSMAN:GetPreference("ThreeKeyNavigation") then + return "toggle" + else + return "normal" + end +end + -- (c) 2005 Chris Danford -- All rights reserved. -- diff --git a/Themes/_fallback/Scripts/03 CustomSpeedMods.lua b/Themes/_fallback/Scripts/03 CustomSpeedMods.lua index ffa7ee2eb2..707595f7aa 100644 --- a/Themes/_fallback/Scripts/03 CustomSpeedMods.lua +++ b/Themes/_fallback/Scripts/03 CustomSpeedMods.lua @@ -439,21 +439,23 @@ function ArbitrarySpeedMods() NumPlayers= 0 -- for ease when adjusting for the status elements. } for i, pn in ipairs(GAMESTATE:GetEnabledPlayers()) do - local poptions= GAMESTATE:GetPlayerState(pn):GetPlayerOptions("ModsLevel_Preferred") - local speed= nil - local mode= nil - if poptions:MaxScrollBPM() > 0 then - mode= "m" - speed= math.round(poptions:MaxScrollBPM()) - elseif poptions:TimeSpacing() > 0 then - mode= "C" - speed= math.round(poptions:ScrollBPM()) - else - mode= "x" - speed= math.round(poptions:ScrollSpeed() * 100) + if GAMESTATE:IsHumanPlayer(pn) then + local poptions= GAMESTATE:GetPlayerState(pn):GetPlayerOptions("ModsLevel_Preferred") + local speed= nil + local mode= nil + if poptions:MaxScrollBPM() > 0 then + mode= "m" + speed= math.round(poptions:MaxScrollBPM()) + elseif poptions:TimeSpacing() > 0 then + mode= "C" + speed= math.round(poptions:ScrollBPM()) + else + mode= "x" + speed= math.round(poptions:ScrollSpeed() * 100) + end + ret.CurValues[pn]= {mode= mode, speed= speed} + ret.NumPlayers= ret.NumPlayers + 1 end - ret.CurValues[pn]= {mode= mode, speed= speed} - ret.NumPlayers= ret.NumPlayers + 1 end ret:GenChoices() return ret diff --git a/Themes/_fallback/metrics.ini b/Themes/_fallback/metrics.ini index cbee4808d9..b99685446d 100644 --- a/Themes/_fallback/metrics.ini +++ b/Themes/_fallback/metrics.ini @@ -2218,7 +2218,7 @@ ScreenBeginCommand= [ScreenOptions] Fallback="ScreenWithMenuElements" -NavigationMode="normal" +NavigationMode=OptionsNavigationMode() InputMode="individual" ForceAllPlayers=false # @@ -3002,12 +3002,13 @@ Line14="conf,ShowSongOptions" Fallback="ScreenOptionsServiceChild" NextScreen="ScreenOptionsService" PrevScreen="ScreenOptionsService" -LineNames="1,2,3,4,5" +LineNames="1,2,3,4,5,6" Line1="conf,AutoMapOnJoyChange" Line2="conf,OnlyDedicatedMenuButtons" Line3="conf,DelayedBack" Line4="conf,ArcadeOptionsNavigation" -Line5="conf,MusicWheelSwitchSpeed" +Line5="conf,ThreeKeyNavigation" +Line6="conf,MusicWheelSwitchSpeed" [ScreenOptionsArcade] Fallback="ScreenOptionsServiceChild" diff --git a/Themes/default/BGAnimations/ScreenSelectProfile overlay.lua b/Themes/default/BGAnimations/ScreenSelectProfile overlay.lua index deb078f929..790c54b52e 100644 --- a/Themes/default/BGAnimations/ScreenSelectProfile overlay.lua +++ b/Themes/default/BGAnimations/ScreenSelectProfile overlay.lua @@ -193,53 +193,67 @@ function UpdateInternal3(self, Player) end; end; +-- Will be set to the main ActorFrame for the screen in its OnCommand. +local main_frame= false + +local function input(event) + if event.type == "InputEventType_Release" then return end + local pn= event.PlayerNumber + local code= event.GameButton + if not pn or not code then return end + local input_functions= { + Start= function() + MESSAGEMAN:Broadcast("StartButton") + if not GAMESTATE:IsHumanPlayer(pn) then + SCREENMAN:GetTopScreen():SetProfileIndex(pn, -1) + else + SCREENMAN:GetTopScreen():Finish() + end + end, + Back= function() + if GAMESTATE:GetNumPlayersEnabled()==0 then + SCREENMAN:GetTopScreen():Cancel() + else + MESSAGEMAN:Broadcast("BackButton") + SCREENMAN:GetTopScreen():SetProfileIndex(pn, -2) + end + end, + MenuUp= function() + if GAMESTATE:IsHumanPlayer(pn) then + local ind = SCREENMAN:GetTopScreen():GetProfileIndex(pn) + if ind > 1 then + if SCREENMAN:GetTopScreen():SetProfileIndex(pn, ind - 1) then + MESSAGEMAN:Broadcast("DirectionButton") + main_frame:queuecommand('UpdateInternal2') + end + end + end + end, + MenuDown= function() + if GAMESTATE:IsHumanPlayer(pn) then + local ind = SCREENMAN:GetTopScreen():GetProfileIndex(pn) + if ind > 0 then + if SCREENMAN:GetTopScreen():SetProfileIndex(pn, ind + 1) then + MESSAGEMAN:Broadcast("DirectionButton") + main_frame:queuecommand('UpdateInternal2') + end + end + end + end + } + input_functions.MenuLeft= input_functions.MenuUp + input_functions.MenuRight= input_functions.MenuDown + if input_functions[code] then + input_functions[code]() + end +end + local t = Def.ActorFrame { StorageDevicesChangedMessageCommand=function(self, params) self:queuecommand('UpdateInternal2'); end; - CodeMessageCommand = function(self, params) - if params.Name == 'Start' or params.Name == 'Center' then - MESSAGEMAN:Broadcast("StartButton"); - if not GAMESTATE:IsHumanPlayer(params.PlayerNumber) then - SCREENMAN:GetTopScreen():SetProfileIndex(params.PlayerNumber, -1); - else - SCREENMAN:GetTopScreen():Finish(); - end; - end; - if params.Name == 'Up' or params.Name == 'Up2' or params.Name == 'DownLeft' then - if GAMESTATE:IsHumanPlayer(params.PlayerNumber) then - local ind = SCREENMAN:GetTopScreen():GetProfileIndex(params.PlayerNumber); - if ind > 1 then - if SCREENMAN:GetTopScreen():SetProfileIndex(params.PlayerNumber, ind - 1 ) then - MESSAGEMAN:Broadcast("DirectionButton"); - self:queuecommand('UpdateInternal2'); - end; - end; - end; - end; - if params.Name == 'Down' or params.Name == 'Down2' or params.Name == 'DownRight' then - if GAMESTATE:IsHumanPlayer(params.PlayerNumber) then - local ind = SCREENMAN:GetTopScreen():GetProfileIndex(params.PlayerNumber); - if ind > 0 then - if SCREENMAN:GetTopScreen():SetProfileIndex(params.PlayerNumber, ind + 1 ) then - MESSAGEMAN:Broadcast("DirectionButton"); - self:queuecommand('UpdateInternal2'); - end; - end; - end; - end; - if params.Name == 'Back' then - if GAMESTATE:GetNumPlayersEnabled()==0 then - SCREENMAN:GetTopScreen():Cancel(); - else - MESSAGEMAN:Broadcast("BackButton"); - SCREENMAN:GetTopScreen():SetProfileIndex(params.PlayerNumber, -2); - end; - end; - end; - PlayerJoinedMessageCommand=function(self, params) self:queuecommand('UpdateInternal2'); end; @@ -249,6 +263,8 @@ local t = Def.ActorFrame { end; OnCommand=function(self, params) + main_frame= self:GetParent() + SCREENMAN:GetTopScreen():AddInputCallback(input) self:queuecommand('UpdateInternal2'); end; diff --git a/src/OptionRow.cpp b/src/OptionRow.cpp index 60f7fa1e66..e5b11340f1 100644 --- a/src/OptionRow.cpp +++ b/src/OptionRow.cpp @@ -803,7 +803,7 @@ bool OptionRow::SetSelected( PlayerNumber pn, int iChoice, bool b ) bool OptionRow::NotifyHandlerOfSelection(PlayerNumber pn, int choice) { - bool changed= m_pHand->NotifyOfSelection(pn, choice); + bool changed= m_pHand->NotifyOfSelection(pn, choice - m_bFirstItemGoesDown); if(changed) { ChoicesChanged(m_RowType, false); @@ -820,6 +820,11 @@ bool OptionRow::NotifyHandlerOfSelection(PlayerNumber pn, int choice) return changed; } +bool OptionRow::GoToFirstOnStart() +{ + return m_pHand->GoToFirstOnStart(); +} + void OptionRow::SetExitText( RString sExitText ) { BitmapText *bt = m_textItems.back(); diff --git a/src/OptionRow.h b/src/OptionRow.h index 7a2c825bca..2992d97f5b 100644 --- a/src/OptionRow.h +++ b/src/OptionRow.h @@ -112,6 +112,7 @@ public: // ScreenOptions calls positions m_FrameDestination, then m_Frame tween to that same TweenState. unsigned GetTextItemsSize() const { return m_textItems.size(); } bool GetFirstItemGoesDown() const { return m_bFirstItemGoesDown; } + bool GoToFirstOnStart(); RString GetThemedItemText( int iChoice ) const; diff --git a/src/OptionRowHandler.cpp b/src/OptionRowHandler.cpp index 9d2893e2b4..be167fbc2a 100644 --- a/src/OptionRowHandler.cpp +++ b/src/OptionRowHandler.cpp @@ -833,8 +833,9 @@ public: LuaReference m_EnabledForPlayersFunc; bool m_TableIsSane; + bool m_GoToFirstOnStart; - OptionRowHandlerLua(): m_TableIsSane(false) + OptionRowHandlerLua(): m_TableIsSane(false), m_GoToFirstOnStart(false) { m_pLuaTable = new LuaReference; Init(); } virtual ~OptionRowHandlerLua() { delete m_pLuaTable; } void Init() @@ -1030,6 +1031,10 @@ public: m_Def.m_sName = pStr; lua_pop( L, 1 ); + lua_getfield(L, -1, "GoToFirstOnStart"); + m_GoToFirstOnStart= lua_toboolean(L, -1); + lua_pop(L, 1); + lua_getfield(L, -1, "OneChoiceForAllPlayers"); m_Def.m_bOneChoiceForAllPlayers = lua_toboolean( L, -1 ); lua_pop( L, 1 ); @@ -1253,6 +1258,10 @@ public: LUA->Release(L); return changed; } + virtual bool GoToFirstOnStart() + { + return m_GoToFirstOnStart; + } }; class OptionRowHandlerConfig : public OptionRowHandler diff --git a/src/OptionRowHandler.h b/src/OptionRowHandler.h index f041e8768d..28cbc8b0dd 100644 --- a/src/OptionRowHandler.h +++ b/src/OptionRowHandler.h @@ -180,6 +180,7 @@ public: virtual RString GetScreen( int /* iChoice */ ) const { return RString(); } // Exists so that a lua function can act on the selection. Returns true if the choices should be reloaded. virtual bool NotifyOfSelection(PlayerNumber pn, int choice) { return false; } + virtual bool GoToFirstOnStart() { return true; } }; /** @brief Utilities for the OptionRowHandlers. */ diff --git a/src/PrefsManager.cpp b/src/PrefsManager.cpp index 1a967e2745..27522d3628 100644 --- a/src/PrefsManager.cpp +++ b/src/PrefsManager.cpp @@ -199,6 +199,7 @@ PrefsManager::PrefsManager() : m_bShowCaution ( "ShowCaution", true ), m_bShowNativeLanguage ( "ShowNativeLanguage", true ), m_iArcadeOptionsNavigation ( "ArcadeOptionsNavigation", 0 ), + m_ThreeKeyNavigation("ThreeKeyNavigation", false), m_MusicWheelUsesSections ( "MusicWheelUsesSections", MusicWheelUsesSections_ALWAYS ), m_iMusicWheelSwitchSpeed ( "MusicWheelSwitchSpeed", 15 ), m_AllowW1 ( "AllowW1", ALLOW_W1_EVERYWHERE ), diff --git a/src/PrefsManager.h b/src/PrefsManager.h index 6ce1acfd68..509acf8d8d 100644 --- a/src/PrefsManager.h +++ b/src/PrefsManager.h @@ -191,6 +191,7 @@ public: Preference m_bShowCaution; Preference m_bShowNativeLanguage; Preference m_iArcadeOptionsNavigation; + Preference m_ThreeKeyNavigation; Preference m_MusicWheelUsesSections; Preference m_iMusicWheelSwitchSpeed; Preference m_AllowW1; // this should almost always be on, given use cases. -aj diff --git a/src/RageTexture.cpp b/src/RageTexture.cpp index 0d9e17fd90..944f54c180 100644 --- a/src/RageTexture.cpp +++ b/src/RageTexture.cpp @@ -79,6 +79,11 @@ public: lua_pushnumber( L, pRect->bottom ); return 4; } + static int GetNumFrames(T* p, lua_State* L) + { + lua_pushnumber(L, p->GetNumFrames()); + return 1; + } LunaRageTexture() { @@ -86,6 +91,7 @@ public: ADD_METHOD( loop ); ADD_METHOD( rate ); ADD_METHOD( GetTextureCoordRect ); + ADD_METHOD( GetNumFrames ); } }; diff --git a/src/ScreenOptions.cpp b/src/ScreenOptions.cpp index ecb23a5d5a..c91c44d520 100644 --- a/src/ScreenOptions.cpp +++ b/src/ScreenOptions.cpp @@ -916,7 +916,7 @@ void ScreenOptions::ProcessMenuStart( const InputEventPlus &input ) msg.SetParam( "Selected", bSelected ); MESSAGEMAN->Broadcast( msg ); - if( row.GetFirstItemGoesDown() ) + if(row.GetFirstItemGoesDown() && row.GoToFirstOnStart()) { // move to the first choice in the row ChangeValueInRowRelative( m_iCurrentRow[pn], pn, -row.GetChoiceInRowWithFocus(pn), input.type != IET_FIRST_PRESS ); diff --git a/src/ScreenOptionsMasterPrefs.cpp b/src/ScreenOptionsMasterPrefs.cpp index e8c36de2d4..f8a5e29980 100644 --- a/src/ScreenOptionsMasterPrefs.cpp +++ b/src/ScreenOptionsMasterPrefs.cpp @@ -711,6 +711,7 @@ static void InitializeConfOptions() ADD( ConfOption( "AutoPlay", MovePref, "Off","On","CPU-Controlled" ) ); ADD( ConfOption( "DelayedBack", MovePref, "Instant","Hold" ) ); ADD( ConfOption( "ArcadeOptionsNavigation", MovePref, "StepMania Style","Arcade Style" ) ); + ADD( ConfOption( "ThreeKeyNavigation", MovePref, "Five Key Menu", "Three Key Menu" ) ); ADD( ConfOption( "MusicWheelSwitchSpeed", MusicWheelSwitchSpeed, "Slow","Normal","Fast","Really Fast" ) ); // Gameplay options diff --git a/src/Sprite.h b/src/Sprite.h index 4e4ba791ac..f6f95e5fba 100644 --- a/src/Sprite.h +++ b/src/Sprite.h @@ -14,7 +14,7 @@ public: Sprite(); Sprite( const Sprite &cpy ); virtual ~Sprite(); - + // See explanation in source. static Sprite* NewBlankSprite(); From e81af8c131e9ca30c21f97c2e278ea5a57613e61 Mon Sep 17 00:00:00 2001 From: sigatrev Date: Fri, 25 Jul 2014 18:45:02 -0500 Subject: [PATCH 48/80] Enums for TapNoteType, TapNoteSubType, and TapNoteSource I intend to make additional useful information available on judgments, such as TapNoteType and TapNoteSubType( for hold judgments ). I am submitting this part as a separate pull request because it is more generally applicable to anything TapNote related. --- Docs/Luadoc/Lua.xml | 19 +++ src/AutoKeysounds.cpp | 6 +- src/BeginnerHelper.cpp | 2 +- src/GameSoundManager.cpp | 2 +- src/GhostArrowRow.cpp | 18 +-- src/GhostArrowRow.h | 4 +- src/NoteData.cpp | 110 +++++++-------- src/NoteDataUtil.cpp | 184 +++++++++++++------------- src/NoteDataUtil.h | 6 +- src/NoteDataWithScoring.cpp | 50 +++---- src/NoteDisplay.cpp | 40 +++--- src/NoteField.cpp | 20 +-- src/NoteTypes.cpp | 57 ++++++-- src/NoteTypes.h | 135 +++++++++---------- src/NotesLoaderBMS.cpp | 8 +- src/NotesLoaderDWI.cpp | 6 +- src/NotesLoaderJson.cpp | 8 +- src/NotesWriterDWI.cpp | 6 +- src/NotesWriterJson.cpp | 4 +- src/Player.cpp | 140 ++++++++++---------- src/ScoreKeeper.cpp | 2 +- src/ScoreKeeperNormal.cpp | 4 +- src/ScreenEdit.cpp | 44 +++--- src/ScreenGameplay.cpp | 10 +- src/ScreenHowToPlay.cpp | 2 +- src/SoundEffectControl.cpp | 2 +- src/libtomcrypt/Debug/libtomcrypt.lib | Bin 0 -> 1310624 bytes src/libtommath/Debug/libtommath.lib | Bin 0 -> 680604 bytes 28 files changed, 462 insertions(+), 427 deletions(-) create mode 100644 src/libtomcrypt/Debug/libtomcrypt.lib create mode 100644 src/libtommath/Debug/libtommath.lib diff --git a/Docs/Luadoc/Lua.xml b/Docs/Luadoc/Lua.xml index f194740df3..a00688e98d 100644 --- a/Docs/Luadoc/Lua.xml +++ b/Docs/Luadoc/Lua.xml @@ -2401,6 +2401,25 @@ + + + + + + + + + + + + + + + + + + + diff --git a/src/AutoKeysounds.cpp b/src/AutoKeysounds.cpp index e7fcf31f2b..8c6c59f857 100644 --- a/src/AutoKeysounds.cpp +++ b/src/AutoKeysounds.cpp @@ -88,7 +88,7 @@ void AutoKeysounds::LoadAutoplaySoundsInto( RageSoundReader_Chain *pChain ) pn = GetNextEnabledPlayer(pn); while( pn != PLAYER_INVALID ) { - if( tn[pn].type != TapNote::autoKeysound || tn[pn].iKeysoundIndex != tap.iKeysoundIndex ) + if( tn[pn].type != TapNoteType_AutoKeysound || tn[pn].iKeysoundIndex != tap.iKeysoundIndex ) bSoundIsGlobal = false; pn = GetNextEnabledPlayer(pn); } @@ -99,7 +99,7 @@ void AutoKeysounds::LoadAutoplaySoundsInto( RageSoundReader_Chain *pChain ) if( tn[pn] == TAP_EMPTY ) continue; - ASSERT( tn[pn].type == TapNote::autoKeysound ); + ASSERT( tn[pn].type == TapNoteType_AutoKeysound ); if( tn[pn].iKeysoundIndex >= 0 ) { RString sKeysoundFilePath = sSongDir + pSong->m_vsKeysoundFile[tn[pn].iKeysoundIndex]; @@ -351,7 +351,7 @@ void AutoKeysounds::Update( float fDelta ) FOREACH_NONEMPTY_ROW_IN_TRACK_RANGE( nd, t, r, iRowLastCrossed+1, iRowNow ) { const TapNote &tn = nd.GetTapNote( t, r ); - ASSERT( tn.type == TapNote::autoKeysound ); + ASSERT( tn.type == TapNoteType_AutoKeysound ); if( tn.bKeysound ) m_vKeysounds[tn.iKeysoundIndex].Play(); } diff --git a/src/BeginnerHelper.cpp b/src/BeginnerHelper.cpp index 5fe57b0c64..5c6f2968ee 100644 --- a/src/BeginnerHelper.cpp +++ b/src/BeginnerHelper.cpp @@ -352,7 +352,7 @@ void BeginnerHelper::Update( float fDeltaTime ) int iStep = 0; const int iNumTracks = m_NoteData[pn].GetNumTracks(); for( int t=0; tBlinkCabinetLight( cl ); break; diff --git a/src/GhostArrowRow.cpp b/src/GhostArrowRow.cpp index 9693167e6d..fef07474e7 100644 --- a/src/GhostArrowRow.cpp +++ b/src/GhostArrowRow.cpp @@ -27,8 +27,8 @@ void GhostArrowRow::Load( const PlayerState* pPlayerState, float fYReverseOffset const GameInput GameI = GAMESTATE->GetCurrentStyle()->StyleInputToGameInput( c, pn ); NOTESKIN->SetGameController( GameI.controller ); - m_bHoldShowing.push_back( TapNote::SubType_Invalid ); - m_bLastHoldShowing.push_back( TapNote::SubType_Invalid ); + m_bHoldShowing.push_back( TapNoteSubType_Invalid ); + m_bLastHoldShowing.push_back( TapNoteSubType_Invalid ); m_Ghost.push_back( NOTESKIN->LoadActor(sButton, "Explosion", this) ); m_Ghost[c]->SetName( "GhostArrow" ); @@ -67,26 +67,26 @@ void GhostArrowRow::Update( float fDeltaTime ) { if( m_bLastHoldShowing[i] != m_bHoldShowing[i] ) { - if( m_bLastHoldShowing[i] == TapNote::hold_head_hold ) + if( m_bLastHoldShowing[i] == TapNoteSubType_Hold ) m_Ghost[i]->PlayCommand( "HoldingOff" ); - else if( m_bLastHoldShowing[i] == TapNote::hold_head_roll ) + else if( m_bLastHoldShowing[i] == TapNoteSubType_Roll ) m_Ghost[i]->PlayCommand( "RollOff" ); /* - else if( m_bLastHoldShowing[i] == TapNote::hold_head_mine ) + else if( m_bLastHoldShowing[i] == TapNoteSubType_Mine ) m_Ghost[i]->PlayCommand( "MinefieldOff" ); */ - if( m_bHoldShowing[i] == TapNote::hold_head_hold ) + if( m_bHoldShowing[i] == TapNoteSubType_Hold ) m_Ghost[i]->PlayCommand( "HoldingOn" ); - else if( m_bHoldShowing[i] == TapNote::hold_head_roll ) + else if( m_bHoldShowing[i] == TapNoteSubType_Roll ) m_Ghost[i]->PlayCommand( "RollOn" ); /* - else if( m_bHoldShowing[i] == TapNote::hold_head_mine ) + else if( m_bHoldShowing[i] == TapNoteSubType_Mine ) m_Ghost[i]->PlayCommand( "MinefieldOn" ); */ m_bLastHoldShowing[i] = m_bHoldShowing[i]; } - m_bHoldShowing[i] = TapNote::SubType_Invalid; + m_bHoldShowing[i] = TapNoteSubType_Invalid; } } diff --git a/src/GhostArrowRow.h b/src/GhostArrowRow.h index f93159eec9..b1647d3aa9 100644 --- a/src/GhostArrowRow.h +++ b/src/GhostArrowRow.h @@ -25,8 +25,8 @@ protected: const PlayerState* m_pPlayerState; vector m_Ghost; - vector m_bHoldShowing; - vector m_bLastHoldShowing; + vector m_bHoldShowing; + vector m_bLastHoldShowing; }; diff --git a/src/NoteData.cpp b/src/NoteData.cpp index 24bb051fea..fe2ab2bdc5 100644 --- a/src/NoteData.cpp +++ b/src/NoteData.cpp @@ -91,7 +91,7 @@ void NoteData::ClearRangeForTrack( int rowBegin, int rowEnd, int iTrack ) --prev; TapNote tn = lBegin->second; int iRow = prev->first; - if( tn.type == TapNote::hold_head && iRow + tn.iDuration > rowEnd ) + if( tn.type == TapNoteType_HoldHead && iRow + tn.iDuration > rowEnd ) { // A hold note overlaps the end of the range. Separate it. SetTapNote( iTrack, iRow, TAP_EMPTY ); @@ -144,10 +144,10 @@ void NoteData::CopyRange( const NoteData& from, int rowFromBegin, int rowFromEnd for( ; lBegin != lEnd; ++lBegin ) { TapNote head = lBegin->second; - if( head.type == TapNote::empty ) + if( head.type == TapNoteType_Empty ) continue; - if( head.type == TapNote::hold_head ) + if( head.type == TapNoteType_HoldHead ) { int iStartRow = lBegin->first + iMoveBy; int iEndRow = iStartRow + head.iDuration; @@ -175,7 +175,7 @@ void NoteData::CopyAll( const NoteData& from ) bool NoteData::IsRowEmpty( int row ) const { for( int t=0; t& addTo ) const { for( int t=0; t=0; t-- ) { - if( GetTapNote( t, row ).type == TapNote::empty ) + if( GetTapNote( t, row ).type == TapNoteType_Empty ) { iEmptyTrackOut = t; return true; @@ -251,7 +251,7 @@ int NoteData::GetNumTracksWithTap( int row ) const for( int t=0; t=0; t-- ) { const TapNote &tn = GetTapNote( t, row ); - if( tn.type == TapNote::tap || tn.type == TapNote::lift || tn.type == TapNote::hold_head ) + if( tn.type == TapNoteType_Tap || tn.type == TapNoteType_Lift || tn.type == TapNoteType_HoldHead ) return t; } return -1; @@ -316,7 +316,7 @@ void NoteData::AddHoldNote( int iTrack, int iStartRow, int iEndRow, TapNote tn ) { int iOtherRow = it->first; const TapNote &tnOther = it->second; - if( tnOther.type == TapNote::hold_head ) + if( tnOther.type == TapNoteType_HoldHead ) { iStartRow = min( iStartRow, iOtherRow ); iEndRow = max( iEndRow, iOtherRow + tnOther.iDuration ); @@ -349,7 +349,7 @@ void NoteData::AddHoldNote( int iTrack, int iStartRow, int iEndRow, TapNote tn ) bool NoteData::IsHoldHeadOrBodyAtRow( int iTrack, int iRow, int *pHeadRow ) const { const TapNote &tn = GetTapNote( iTrack, iRow ); - if( tn.type == TapNote::hold_head ) + if( tn.type == TapNoteType_HoldHead ) { if( pHeadRow != NULL ) *pHeadRow = iRow; @@ -369,7 +369,7 @@ bool NoteData::IsHoldNoteAtRow( int iTrack, int iRow, int *pHeadRow ) const if( pHeadRow == NULL ) pHeadRow = &iDummy; - /* Starting at iRow, search upwards. If we find a TapNote::hold_head, we're within + /* Starting at iRow, search upwards. If we find a TapNoteType_HoldHead, we're within * a hold. If we find a tap, mine or attack, we're not--those never lie * within hold notes. Ignore autoKeysound. */ FOREACH_NONEMPTY_ROW_IN_TRACK_RANGE_REVERSE( *this, iTrack, r, 0, iRow ) @@ -377,21 +377,21 @@ bool NoteData::IsHoldNoteAtRow( int iTrack, int iRow, int *pHeadRow ) const const TapNote &tn = GetTapNote( iTrack, r ); switch( tn.type ) { - case TapNote::hold_head: + case TapNoteType_HoldHead: if( tn.iDuration + r < iRow ) return false; *pHeadRow = r; return true; - case TapNote::tap: - case TapNote::mine: - case TapNote::attack: - case TapNote::lift: - case TapNote::fake: + case TapNoteType_Tap: + case TapNoteType_Mine: + case TapNoteType_Attack: + case TapNoteType_Lift: + case TapNoteType_Fake: return false; - case TapNote::empty: - case TapNote::autoKeysound: + case TapNoteType_Empty: + case TapNoteType_AutoKeysound: // ignore continue; DEFAULT_FAIL( tn.type ); @@ -450,7 +450,7 @@ int NoteData::GetLastRow() const /* XXX: We might have a hold note near the end with autoplay sounds * after it. Do something else with autoplay sounds ... */ const TapNote &tn = GetTapNote( t, iRow ); - if( tn.type == TapNote::hold_head ) + if( tn.type == TapNoteType_HoldHead ) iRow += tn.iDuration; iOldestRowFoundSoFar = max( iOldestRowFoundSoFar, iRow ); @@ -461,27 +461,27 @@ int NoteData::GetLastRow() const bool NoteData::IsTap(const TapNote &tn, const int row) const { - return (tn.type != TapNote::empty && tn.type != TapNote::mine - && tn.type != TapNote::lift && tn.type != TapNote::fake - && tn.type != TapNote::autoKeysound + return (tn.type != TapNoteType_Empty && tn.type != TapNoteType_Mine + && tn.type != TapNoteType_Lift && tn.type != TapNoteType_Fake + && tn.type != TapNoteType_AutoKeysound && GAMESTATE->GetProcessedTimingData()->IsJudgableAtRow(row)); } bool NoteData::IsMine(const TapNote &tn, const int row) const { - return (tn.type == TapNote::mine + return (tn.type == TapNoteType_Mine && GAMESTATE->GetProcessedTimingData()->IsJudgableAtRow(row)); } bool NoteData::IsLift(const TapNote &tn, const int row) const { - return (tn.type == TapNote::lift + return (tn.type == TapNoteType_Lift && GAMESTATE->GetProcessedTimingData()->IsJudgableAtRow(row)); } bool NoteData::IsFake(const TapNote &tn, const int row) const { - return (tn.type == TapNote::fake + return (tn.type == TapNoteType_Fake || !GAMESTATE->GetProcessedTimingData()->IsJudgableAtRow(row)); } @@ -553,11 +553,11 @@ bool NoteData::RowNeedsAtLeastSimultaneousPresses( int iMinSimultaneousPresses, const TapNote &tn = GetTapNote(t, row); switch( tn.type ) { - case TapNote::mine: - case TapNote::empty: - case TapNote::fake: - case TapNote::lift: // you don't "press" on a lift. - case TapNote::autoKeysound: + case TapNoteType_Mine: + case TapNoteType_Empty: + case TapNoteType_Fake: + case TapNoteType_Lift: // you don't "press" on a lift. + case TapNoteType_AutoKeysound: continue; // skip these types - they don't count default: break; } @@ -612,10 +612,10 @@ int NoteData::GetNumRowsWithSimultaneousTaps( int iMinTaps, int iStartIndex, int for( int t=0; t= iMinTaps ) @@ -634,8 +634,8 @@ int NoteData::GetNumHoldNotes( int iStartIndex, int iEndIndex ) const GetTapNoteRangeExclusive( t, iStartIndex, iEndIndex, lBegin, lEnd ); for( ; lBegin != lEnd; ++lBegin ) { - if( lBegin->second.type != TapNote::hold_head || - lBegin->second.subType != TapNote::hold_head_hold ) + if( lBegin->second.type != TapNoteType_HoldHead || + lBegin->second.subType != TapNoteSubType_Hold ) continue; if (!GAMESTATE->GetProcessedTimingData()->IsJudgableAtRow(lBegin->first)) continue; @@ -654,8 +654,8 @@ int NoteData::GetNumRolls( int iStartIndex, int iEndIndex ) const GetTapNoteRangeExclusive( t, iStartIndex, iEndIndex, lBegin, lEnd ); for( ; lBegin != lEnd; ++lBegin ) { - if( lBegin->second.type != TapNote::hold_head || - lBegin->second.subType != TapNote::hold_head_roll ) + if( lBegin->second.type != TapNoteType_HoldHead || + lBegin->second.subType != TapNoteSubType_Roll ) continue; if (!GAMESTATE->GetProcessedTimingData()->IsJudgableAtRow(lBegin->first)) continue; @@ -773,8 +773,8 @@ pair NoteData::GetNumHoldNotesTwoPlayer( int iStartIndex, int iEndInde GetTapNoteRangeExclusive( t, iStartIndex, iEndIndex, lBegin, lEnd ); for( ; lBegin != lEnd; ++lBegin ) { - if( lBegin->second.type != TapNote::hold_head || - lBegin->second.subType != TapNote::hold_head_hold ) + if( lBegin->second.type != TapNoteType_HoldHead || + lBegin->second.subType != TapNoteSubType_Hold ) continue; if (!GAMESTATE->GetProcessedTimingData()->IsJudgableAtRow(lBegin->first)) continue; @@ -816,8 +816,8 @@ pair NoteData::GetNumRollsTwoPlayer( int iStartIndex, int iEndIndex ) GetTapNoteRangeExclusive( t, iStartIndex, iEndIndex, lBegin, lEnd ); for( ; lBegin != lEnd; ++lBegin ) { - if( lBegin->second.type != TapNote::hold_head || - lBegin->second.subType != TapNote::hold_head_roll ) + if( lBegin->second.type != TapNoteType_HoldHead || + lBegin->second.subType != TapNoteSubType_Roll ) continue; if (!GAMESTATE->GetProcessedTimingData()->IsJudgableAtRow(lBegin->first)) continue; @@ -880,8 +880,8 @@ int NoteData::GetNumMinefields( int iStartIndex, int iEndIndex ) const GetTapNoteRangeExclusive( t, iStartIndex, iEndIndex, begin, end ); for( ; begin != end; ++begin ) { - if( begin->second.type != TapNote::hold_head || - begin->second.subType != TapNote::hold_head_mine ) + if( begin->second.type != TapNoteType_HoldHead || + begin->second.subType != TapNoteSubType_mine ) continue; iNumMinefields++; } @@ -1033,7 +1033,7 @@ void NoteData::GetTapNoteRangeInclusive( int iTrack, int iStartRow, int iEndRow, iterator prev = Decrement(lBegin); const TapNote &tn = prev->second; - if( tn.type == TapNote::hold_head ) + if( tn.type == TapNoteType_HoldHead ) { int iHoldStartRow = prev->first; int iHoldEndRow = iHoldStartRow + tn.iDuration; @@ -1052,7 +1052,7 @@ void NoteData::GetTapNoteRangeInclusive( int iTrack, int iStartRow, int iEndRow, // Include the next note if it's a hold and starts on iEndRow. const TapNote &tn = lEnd->second; int iHoldStartRow = lEnd->first; - if( tn.type == TapNote::hold_head && iHoldStartRow == iEndRow ) + if( tn.type == TapNoteType_HoldHead && iHoldStartRow == iEndRow ) ++lEnd; } } @@ -1066,7 +1066,7 @@ void NoteData::GetTapNoteRangeExclusive( int iTrack, int iStartRow, int iEndRow, { iterator prev = lEnd; --prev; - if( prev->second.type == TapNote::hold_head ) + if( prev->second.type == TapNoteType_HoldHead ) { int localStartRow = prev->first; const TapNote &tn = prev->second; diff --git a/src/NoteDataUtil.cpp b/src/NoteDataUtil.cpp index 8ad1e123da..49edf66357 100644 --- a/src/NoteDataUtil.cpp +++ b/src/NoteDataUtil.cpp @@ -181,7 +181,7 @@ static void LoadFromSMNoteDataStringWithPlayer( NoteData& out, const RString &sS float fDurationSeconds = 0; if( sscanf( p, "%255[^:]:%f}", szModifiers, &fDurationSeconds ) == 2 ) // not fatal if this fails due to malformed data { - tn.type = TapNote::attack; + tn.type = TapNoteType_Attack; tn.sAttackModifiers = szModifiers; tn.fAttackDurationSeconds = fDurationSeconds; } @@ -231,7 +231,7 @@ static void LoadFromSMNoteDataStringWithPlayer( NoteData& out, const RString &sS /* Optimization: if we pass TAP_EMPTY, NoteData will do a search * to remove anything in this position. We know that there's nothing * there, so avoid the search. */ - if( tn.type != TapNote::empty && ch != '3' ) + if( tn.type != TapNoteType_Empty && ch != '3' ) { tn.pn = pn; out.SetTapNote( iTrack, iIndex, tn ); @@ -251,7 +251,7 @@ static void LoadFromSMNoteDataStringWithPlayer( NoteData& out, const RString &sS { NoteData::iterator next = Increment( begin ); const TapNote &tn = begin->second; - if( tn.type == TapNote::hold_head && tn.iDuration == MAX_NOTE_ROW ) + if( tn.type == TapNoteType_HoldHead && tn.iDuration == MAX_NOTE_ROW ) { int iRow = begin->first; LOG->UserLog( "", "", "While loading .sm/.ssc note data, there was an unmatched 2 at beat %f", NoteRowToBeat(iRow) ); @@ -323,11 +323,11 @@ void NoteDataUtil::InsertHoldTails( NoteData &inout ) { int iRow = begin->first; const TapNote &tn = begin->second; - if( tn.type != TapNote::hold_head ) + if( tn.type != TapNoteType_HoldHead ) continue; TapNote tail = tn; - tail.type = TapNote::hold_tail; + tail.type = TapNoteType_HoldTail; /* If iDuration is 0, we'd end up overwriting the head with the tail * (and invalidating our iterator). Empty hold notes aren't valid. */ @@ -385,36 +385,36 @@ void NoteDataUtil::GetSMNoteDataString( const NoteData &in, RString &sRet ) char c; switch( tn.type ) { - case TapNote::empty: c = '0'; break; - case TapNote::tap: c = '1'; break; - case TapNote::hold_head: + case TapNoteType_Empty: c = '0'; break; + case TapNoteType_Tap: c = '1'; break; + case TapNoteType_HoldHead: switch( tn.subType ) { - case TapNote::hold_head_hold: c = '2'; break; - case TapNote::hold_head_roll: c = '4'; break; - //case TapNote::hold_head_mine: c = 'N'; break; + case TapNoteSubType_Hold: c = '2'; break; + case TapNoteSubType_Roll: c = '4'; break; + //case TapNoteSubType_Mine: c = 'N'; break; default: FAIL_M(ssprintf("Invalid tap note subtype: %i", tn.subType)); } break; - case TapNote::hold_tail: c = '3'; break; - case TapNote::mine: c = 'M'; break; - case TapNote::attack: c = 'A'; break; - case TapNote::autoKeysound: c = 'K'; break; - case TapNote::lift: c = 'L'; break; - case TapNote::fake: c = 'F'; break; + case TapNoteType_HoldTail: c = '3'; break; + case TapNoteType_Mine: c = 'M'; break; + case TapNoteType_Attack: c = 'A'; break; + case TapNoteType_AutoKeysound: c = 'K'; break; + case TapNoteType_Lift: c = 'L'; break; + case TapNoteType_Fake: c = 'F'; break; default: c = '\0'; FAIL_M(ssprintf("Invalid tap note type: %i", tn.type)); } sRet.append( 1, c ); - if( tn.type == TapNote::attack ) + if( tn.type == TapNoteType_Attack ) { sRet.append( ssprintf("{%s:%.2f}", tn.sAttackModifiers.c_str(), tn.fAttackDurationSeconds) ); } - // hey maybe if we have TapNote::item we can do things here. + // hey maybe if we have TapNoteType_Item we can do things here. if( tn.iKeysoundIndex >= 0 ) sRet.append( ssprintf("[%d]",tn.iKeysoundIndex) ); } @@ -480,7 +480,7 @@ void NoteDataUtil::CombineCompositeNoteData( NoteData &out, const vectorfirst; if( out.IsHoldNoteAtRow(track, i->first) ) continue; - if( i->second.type == TapNote::hold_head ) + if( i->second.type == TapNoteType_HoldHead ) out.AddHoldNote( track, row, row + i->second.iDuration, i->second ); else out.SetTapNote( track, row, i->second ); @@ -588,7 +588,7 @@ void PlaceAutoKeysound( NoteData &out, int row, TapNote akTap ) if( iEmptyTrack != -1 ) { - akTap.type = TapNote::autoKeysound; + akTap.type = TapNoteType_AutoKeysound; out.SetTapNote( iEmptyTrack, iEmptyRow, akTap ); } } @@ -619,12 +619,12 @@ void NoteDataUtil::LoadOverlapped( const NoteData &in, NoteData &out, int iNewNu for( int iTrackFrom = 0; iTrackFrom < in.GetNumTracks(); ++iTrackFrom ) { const TapNote &tnFrom = in.GetTapNote( iTrackFrom, row ); - if( tnFrom.type == TapNote::empty || tnFrom.type == TapNote::autoKeysound ) + if( tnFrom.type == TapNoteType_Empty || tnFrom.type == TapNoteType_AutoKeysound ) continue; // If this is a hold note, find the end. int iEndIndex = row; - if( tnFrom.type == TapNote::hold_head ) + if( tnFrom.type == TapNoteType_HoldHead ) iEndIndex = row + tnFrom.iDuration; int &iTrackTo = DestRow[iTrackFrom]; @@ -655,7 +655,7 @@ void NoteDataUtil::LoadOverlapped( const NoteData &in, NoteData &out, int iNewNu LastSourceTrack[iTrackTo] = iTrackFrom; LastSourceRow[iTrackTo] = iEndIndex; out.SetTapNote( iTrackTo, row, tnFrom ); - if( tnFrom.type == TapNote::hold_head ) + if( tnFrom.type == TapNoteType_HoldHead ) { const TapNote &tnTail = in.GetTapNote( iTrackFrom, iEndIndex ); out.SetTapNote( iTrackTo, iEndIndex, tnTail ); @@ -666,7 +666,7 @@ void NoteDataUtil::LoadOverlapped( const NoteData &in, NoteData &out, int iNewNu for( int iTrackFrom = 0; iTrackFrom < in.GetNumTracks(); ++iTrackFrom ) { const TapNote &tnFrom = in.GetTapNote( iTrackFrom, row ); - if( tnFrom.type != TapNote::autoKeysound ) + if( tnFrom.type != TapNoteType_AutoKeysound ) continue; PlaceAutoKeysound( out, row, tnFrom ); @@ -680,7 +680,7 @@ int FindLongestOverlappingHoldNoteForAnyTrack( const NoteData &in, int iRow ) for( int t=0; tsecond++; - if( tn.type == TapNote::tap || tn.type == TapNote::lift || tn.type == TapNote::hold_head ) + if( tn.type == TapNoteType_Tap || tn.type == TapNoteType_Lift || tn.type == TapNoteType_HoldHead ) { simultaneousMapTapHoldHead[r] = 1; } - if( tn.type == TapNote::hold_head ) + if( tn.type == TapNoteType_HoldHead ) { int searchStartRow = r + 1; int searchEndRow = r + tn.iDuration; @@ -829,9 +829,9 @@ RadarStats CalculateRadarStatsFast( const NoteData &in, RadarStats &out ) { switch( in.GetTapNote(t, rr).type ) { - case TapNote::mine: - case TapNote::empty: - case TapNote::fake: + case TapNoteType_Mine: + case TapNoteType_Empty: + case TapNoteType_Fake: continue; // skip these types - they don't count default: break; } @@ -975,10 +975,10 @@ void NoteDataUtil::RemoveHoldNotes( NoteData &in, int iStartIndex, int iEndIndex in.GetTapNoteRangeInclusive( t, iStartIndex, iEndIndex, begin, end ); for( ; begin != end; ++begin ) { - if( begin->second.type != TapNote::hold_head || - begin->second.subType != TapNote::hold_head_hold ) + if( begin->second.type != TapNoteType_HoldHead || + begin->second.subType != TapNoteSubType_Hold ) continue; - begin->second.type = TapNote::tap; + begin->second.type = TapNoteType_Tap; } } } @@ -991,10 +991,10 @@ void NoteDataUtil::ChangeRollsToHolds( NoteData &in, int iStartIndex, int iEndIn in.GetTapNoteRangeInclusive( t, iStartIndex, iEndIndex, begin, end ); for( ; begin != end; ++begin ) { - if( begin->second.type != TapNote::hold_head || - begin->second.subType != TapNote::hold_head_roll ) + if( begin->second.type != TapNoteType_HoldHead || + begin->second.subType != TapNoteSubType_Roll ) continue; - begin->second.subType = TapNote::hold_head_hold; + begin->second.subType = TapNoteSubType_Hold; } } } @@ -1007,10 +1007,10 @@ void NoteDataUtil::ChangeHoldsToRolls( NoteData &in, int iStartIndex, int iEndIn in.GetTapNoteRangeInclusive( t, iStartIndex, iEndIndex, begin, end ); for( ; begin != end; ++begin ) { - if( begin->second.type != TapNote::hold_head || - begin->second.subType != TapNote::hold_head_hold ) + if( begin->second.type != TapNoteType_HoldHead || + begin->second.subType != TapNoteSubType_Hold ) continue; - begin->second.subType = TapNote::hold_head_roll; + begin->second.subType = TapNoteSubType_Roll; } } } @@ -1044,7 +1044,7 @@ void NoteDataUtil::RemoveSimultaneousNotes( NoteData &in, int iMaxSimultaneous, for( int t=0; iTracksToRemove>0 && tsecond.type == TapNote::tap ) + if( iter != inout.end(track) && iter->second.type == TapNoteType_Tap ) inout.RemoveTapNote( track, iter ); } } @@ -1462,16 +1462,16 @@ static void SuperShuffleTaps( NoteData &inout, int iStartIndex, int iEndIndex ) const TapNote &tn1 = inout.GetTapNote( t1, r ); switch( tn1.type ) { - case TapNote::empty: - case TapNote::hold_head: - case TapNote::hold_tail: - case TapNote::autoKeysound: + case TapNoteType_Empty: + case TapNoteType_HoldHead: + case TapNoteType_HoldTail: + case TapNoteType_AutoKeysound: continue; // skip - case TapNote::tap: - case TapNote::mine: - case TapNote::attack: - case TapNote::lift: - case TapNote::fake: + case TapNoteType_Tap: + case TapNoteType_Mine: + case TapNoteType_Attack: + case TapNoteType_Lift: + case TapNoteType_Fake: break; // shuffle this DEFAULT_FAIL( tn1.type ); } @@ -1494,16 +1494,16 @@ static void SuperShuffleTaps( NoteData &inout, int iStartIndex, int iEndIndex ) const TapNote &tn2 = inout.GetTapNote( t2, r ); switch( tn2.type ) { - case TapNote::hold_head: - case TapNote::hold_tail: - case TapNote::autoKeysound: + case TapNoteType_HoldHead: + case TapNoteType_HoldTail: + case TapNoteType_AutoKeysound: continue; // don't swap with these - case TapNote::empty: - case TapNote::tap: - case TapNote::mine: - case TapNote::attack: - case TapNote::lift: - case TapNote::fake: + case TapNoteType_Empty: + case TapNoteType_Tap: + case TapNoteType_Mine: + case TapNoteType_Attack: + case TapNoteType_Lift: + case TapNoteType_Fake: break; // ok to swap with this DEFAULT_FAIL( tn2.type ); } @@ -1552,7 +1552,7 @@ void NoteDataUtil::Backwards( NoteData &inout ) int iRowLater = max_row-r; const TapNote &tnEarlier = inout.GetTapNote( t, iRowEarlier ); - if( tnEarlier.type == TapNote::hold_head ) + if( tnEarlier.type == TapNoteType_HoldHead ) iRowLater -= tnEarlier.iDuration; out.SetTapNote( t, iRowLater, tnEarlier ); @@ -1635,7 +1635,7 @@ void NoteDataUtil::Wide( NoteData &inout, int iStartIndex, int iEndIndex ) iTrackToAdd--; CLAMP( iTrackToAdd, 0, inout.GetNumTracks()-1 ); - if( inout.GetTapNote(iTrackToAdd, i).type != TapNote::empty && inout.GetTapNote(iTrackToAdd, i).type != TapNote::fake ) + if( inout.GetTapNote(iTrackToAdd, i).type != TapNoteType_Empty && inout.GetTapNote(iTrackToAdd, i).type != TapNoteType_Fake ) { iTrackToAdd = (iTrackToAdd+1) % inout.GetNumTracks(); } @@ -1832,7 +1832,7 @@ void NoteDataUtil::AddMines( NoteData &inout, int iStartIndex, int iEndIndex ) if( iRowCount>=iPlaceEveryRows ) { for( int t=0; t iSimultaneousHolds ) break; - if( inout.GetTapNote(t,r).type == TapNote::tap ) + if( inout.GetTapNote(t,r).type == TapNoteType_Tap ) { // Find the ending row for this hold int iTapsLeft = iSimultaneousHolds; @@ -1965,7 +1965,7 @@ void NoteDataUtil::ConvertTapsToHolds( NoteData &inout, int iSimultaneousHolds, // If there are two taps in a row on the same track, // don't convert the earlier one to a hold. - if( inout.GetTapNote(t,r2).type != TapNote::empty ) + if( inout.GetTapNote(t,r2).type != TapNoteType_Empty ) { addHold = false; break; @@ -2015,7 +2015,7 @@ void NoteDataUtil::Stomp( NoteData &inout, StepsType st, int iStartIndex, int iE for( int t=0; tsecond; - if( tn.type != TapNote::hold_head ) + if( tn.type != TapNoteType_HoldHead ) continue; if( tn.subType != subType ) continue; @@ -74,7 +74,7 @@ int GetSuccessfulMines( const NoteData &in, int iStartIndex = 0, int iEndIndex = NoteData::all_tracks_const_iterator iter = in.GetTapNoteRangeAllTracks( iStartIndex, iEndIndex ); for( ; !iter.IsAtEnd(); ++iter ) { - if( iter->type == TapNote::mine && iter->result.tns == TNS_AvoidMine ) + if( iter->type == TapNoteType_Mine && iter->result.tns == TNS_AvoidMine ) ++iNumSuccessfulMinesNotes; } return iNumSuccessfulMinesNotes; @@ -93,11 +93,11 @@ int GetSuccessfulHands( const NoteData &in, int iStartIndex = 0, int iEndIndex = for( int t=0; ttype == TapNote::lift && iter->result.tns >= tns ) + if( iter->type == TapNoteType_Lift && iter->result.tns >= tns ) ++iNumSuccessfulLiftNotes; } return iNumSuccessfulLiftNotes; @@ -153,10 +153,10 @@ int LastTapNoteScoreTrack( const NoteData &in, unsigned iRow, PlayerNumber pn ) { /* Skip empty tracks and mines */ const TapNote &tn = in.GetTapNote( t, iRow ); - if (tn.type == TapNote::empty || - tn.type == TapNote::mine || - tn.type == TapNote::fake || - tn.type == TapNote::autoKeysound) + if (tn.type == TapNoteType_Empty || + tn.type == TapNoteType_Mine || + tn.type == TapNoteType_Fake || + tn.type == TapNoteType_AutoKeysound) continue; if( tn.pn != PLAYER_INVALID && tn.pn != pn && pn != PLAYER_INVALID ) continue; @@ -190,10 +190,10 @@ int MinTapNoteScoreTrack( const NoteData &in, unsigned iRow, PlayerNumber pn ) { // Skip empty tracks and mines const TapNote &tn = in.GetTapNote( t, iRow ); - if (tn.type == TapNote::empty || - tn.type == TapNote::mine || - tn.type == TapNote::fake || - tn.type == TapNote::autoKeysound) + if (tn.type == TapNoteType_Empty || + tn.type == TapNoteType_Mine || + tn.type == TapNoteType_Fake || + tn.type == TapNoteType_AutoKeysound) continue; if( tn.pn != PLAYER_INVALID && tn.pn != pn && pn != PLAYER_INVALID ) continue; @@ -256,10 +256,10 @@ TapNoteScore NoteDataWithScoring::MinTapNoteScore( const NoteData &in, unsigned { // Ignore mines (and fake arrows), or the score will always be TNS_None. const TapNote &tn = in.GetTapNote( t, row ); - if (tn.type == TapNote::empty || - tn.type == TapNote::mine || - tn.type == TapNote::fake || - tn.type == TapNote::autoKeysound || + if (tn.type == TapNoteType_Empty || + tn.type == TapNoteType_Mine || + tn.type == TapNoteType_Fake || + tn.type == TapNoteType_AutoKeysound || ( plnum != PlayerNumber_Invalid && tn.pn != plnum ) ) continue; score = min( score, tn.result.tns ); @@ -332,8 +332,8 @@ float GetActualFreezeRadarValue( const NoteData &in, float fSongSeconds ) return 1.0f; const int ActualHolds = - GetNumHoldNotesWithScore( in, TapNote::hold_head_hold, HNS_Held ) + - GetNumHoldNotesWithScore( in, TapNote::hold_head_roll, HNS_Held ); + GetNumHoldNotesWithScore( in, TapNoteSubType_Hold, HNS_Held ) + + GetNumHoldNotesWithScore( in, TapNoteSubType_Roll, HNS_Held ); return clamp( float(ActualHolds) / iTotalHolds, 0.0f, 1.0f ); } @@ -355,13 +355,13 @@ void NoteDataWithScoring::GetActualRadarValues( const NoteData &in, const Player case RadarCategory_Chaos: out[rc] = GetActualChaosRadarValue( in, fSongSeconds, pss ); break; case RadarCategory_TapsAndHolds: out[rc] = (float) GetNumNWithScore( in, TNS_W4, 1 ); break; case RadarCategory_Jumps: out[rc] = (float) GetNumNWithScore( in, TNS_W4, 2 ); break; - case RadarCategory_Holds: out[rc] = (float) GetNumHoldNotesWithScore( in, TapNote::hold_head_hold, HNS_Held ); break; + case RadarCategory_Holds: out[rc] = (float) GetNumHoldNotesWithScore( in, TapNoteSubType_Hold, HNS_Held ); break; case RadarCategory_Mines: out[rc] = (float) GetSuccessfulMines( in ); break; case RadarCategory_Hands: out[rc] = (float) GetSuccessfulHands( in ); break; - case RadarCategory_Rolls: out[rc] = (float) GetNumHoldNotesWithScore( in, TapNote::hold_head_roll, HNS_Held ); break; + case RadarCategory_Rolls: out[rc] = (float) GetNumHoldNotesWithScore( in, TapNoteSubType_Roll, HNS_Held ); break; case RadarCategory_Lifts: out[rc] = (float) GetSuccessfulLifts( in, MIN_SCORE_TO_MAINTAIN_COMBO ); break; case RadarCategory_Fakes: out[rc] = (float) in.GetNumFakes(); break; - //case RadarCategory_Minefields: out[rc] = (float) GetNumMinefieldsWithScore( in, TapNote::hold_head_mine, HNS_Held ); break; + //case RadarCategory_Minefields: out[rc] = (float) GetNumMinefieldsWithScore( in, TapNoteSubType_Mine, HNS_Held ); break; DEFAULT_FAIL( rc ); } } diff --git a/src/NoteDisplay.cpp b/src/NoteDisplay.cpp index 94cdb1cb23..e8d4d51312 100644 --- a/src/NoteDisplay.cpp +++ b/src/NoteDisplay.cpp @@ -519,24 +519,24 @@ void NoteDisplay::DrawHoldBody( const TapNote& tn, int iCol, float fBeat, bool b float fDrawDistanceAfterTargetsPixels, float fDrawDistanceBeforeTargetsPixels, float fFadeInPercentOfDrawFar ) { vector vpSprTop; - Sprite *pSpriteTop = GetHoldSprite( m_HoldTopCap, NotePart_HoldTopCap, fBeat, tn.subType == TapNote::hold_head_roll, bIsBeingHeld && !cache->m_bHoldActiveIsAddLayer ); + Sprite *pSpriteTop = GetHoldSprite( m_HoldTopCap, NotePart_HoldTopCap, fBeat, tn.subType == TapNoteSubType_Roll, bIsBeingHeld && !cache->m_bHoldActiveIsAddLayer ); vpSprTop.push_back( pSpriteTop ); vector vpSprBody; - Sprite *pSpriteBody = GetHoldSprite( m_HoldBody, NotePart_HoldBody, fBeat, tn.subType == TapNote::hold_head_roll, bIsBeingHeld && !cache->m_bHoldActiveIsAddLayer ); + Sprite *pSpriteBody = GetHoldSprite( m_HoldBody, NotePart_HoldBody, fBeat, tn.subType == TapNoteSubType_Roll, bIsBeingHeld && !cache->m_bHoldActiveIsAddLayer ); vpSprBody.push_back( pSpriteBody ); vector vpSprBottom; - Sprite *pSpriteBottom = GetHoldSprite( m_HoldBottomCap, NotePart_HoldBottomCap, fBeat, tn.subType == TapNote::hold_head_roll, bIsBeingHeld && !cache->m_bHoldActiveIsAddLayer ); + Sprite *pSpriteBottom = GetHoldSprite( m_HoldBottomCap, NotePart_HoldBottomCap, fBeat, tn.subType == TapNoteSubType_Roll, bIsBeingHeld && !cache->m_bHoldActiveIsAddLayer ); vpSprBottom.push_back( pSpriteBottom ); if( bIsBeingHeld && cache->m_bHoldActiveIsAddLayer ) { - Sprite *pSprTop = GetHoldSprite( m_HoldTopCap, NotePart_HoldTopCap, fBeat, tn.subType == TapNote::hold_head_roll, true ); + Sprite *pSprTop = GetHoldSprite( m_HoldTopCap, NotePart_HoldTopCap, fBeat, tn.subType == TapNoteSubType_Roll, true ); vpSprTop.push_back( pSprTop ); - Sprite *pSprBody = GetHoldSprite( m_HoldBody, NotePart_HoldBody, fBeat, tn.subType == TapNote::hold_head_roll, true ); + Sprite *pSprBody = GetHoldSprite( m_HoldBody, NotePart_HoldBody, fBeat, tn.subType == TapNoteSubType_Roll, true ); vpSprBody.push_back( pSprBody ); - Sprite *pSprBottom = GetHoldSprite( m_HoldBottomCap, NotePart_HoldBottomCap, fBeat, tn.subType == TapNote::hold_head_roll, true ); + Sprite *pSprBottom = GetHoldSprite( m_HoldBottomCap, NotePart_HoldBottomCap, fBeat, tn.subType == TapNoteSubType_Roll, true ); vpSprBottom.push_back( pSprBottom ); } @@ -659,12 +659,12 @@ void NoteDisplay::DrawHold( const TapNote &tn, int iCol, int iRow, bool bIsBeing /* if( !cache->m_bHoldHeadIsAboveWavyParts ) { - Actor *pActor = GetHoldActor( m_HoldHead, NotePart_HoldHead, NoteRowToBeat(iRow), tn.subType == TapNote::hold_head_roll, bIsBeingHeld ); + Actor *pActor = GetHoldActor( m_HoldHead, NotePart_HoldHead, NoteRowToBeat(iRow), tn.subType == TapNoteSubType_Roll, bIsBeingHeld ); DrawActor( tn, pActor, NotePart_HoldHead, iCol, bFlipHeadAndTail ? fEndYOffset : fStartYOffset, fBeat, bIsAddition, fPercentFadeToFail, fReverseOffsetPixels, fColorScale, fDrawDistanceAfterTargetsPixels, fDrawDistanceBeforeTargetsPixels, fFadeInPercentOfDrawFar ); } if( !cache->m_bHoldTailIsAboveWavyParts ) { - Actor *pActor = GetHoldActor( m_HoldTail, NotePart_HoldTail, NoteRowToBeat(iRow), tn.subType == TapNote::hold_head_roll, bIsBeingHeld ); + Actor *pActor = GetHoldActor( m_HoldTail, NotePart_HoldTail, NoteRowToBeat(iRow), tn.subType == TapNoteSubType_Roll, bIsBeingHeld ); DrawActor( tn, pActor, NotePart_HoldTail, iCol, bFlipHeadAndTail ? fStartYOffset : fEndYOffset, fBeat, bIsAddition, fPercentFadeToFail, fReverseOffsetPixels, fColorScale, fDrawDistanceAfterTargetsPixels, fDrawDistanceBeforeTargetsPixels, fFadeInPercentOfDrawFar ); } */ @@ -677,19 +677,19 @@ void NoteDisplay::DrawHold( const TapNote &tn, int iCol, int iRow, bool bIsBeing // of the head and tail. Perhaps make this a theme/noteskin metric? -aj if( cache->m_bHoldTailIsAboveWavyParts ) { - Actor *pActor = GetHoldActor( m_HoldTail, NotePart_HoldTail, NoteRowToBeat(iRow), tn.subType == TapNote::hold_head_roll, bIsBeingHeld ); + Actor *pActor = GetHoldActor( m_HoldTail, NotePart_HoldTail, NoteRowToBeat(iRow), tn.subType == TapNoteSubType_Roll, bIsBeingHeld ); DrawActor( tn, pActor, NotePart_HoldTail, iCol, bFlipHeadAndTail ? fStartYOffset : fEndYOffset, fBeat, bIsAddition, fPercentFadeToFail, fReverseOffsetPixels, fColorScale, fDrawDistanceAfterTargetsPixels, fDrawDistanceBeforeTargetsPixels, fFadeInPercentOfDrawFar ); } if( cache->m_bHoldHeadIsAboveWavyParts ) { - Actor *pActor = GetHoldActor( m_HoldHead, NotePart_HoldHead, NoteRowToBeat(iRow), tn.subType == TapNote::hold_head_roll, bIsBeingHeld ); + Actor *pActor = GetHoldActor( m_HoldHead, NotePart_HoldHead, NoteRowToBeat(iRow), tn.subType == TapNoteSubType_Roll, bIsBeingHeld ); DrawActor( tn, pActor, NotePart_HoldHead, iCol, bFlipHeadAndTail ? fEndYOffset : fStartYOffset, fBeat, bIsAddition, fPercentFadeToFail, fReverseOffsetPixels, fColorScale, fDrawDistanceAfterTargetsPixels, fDrawDistanceBeforeTargetsPixels, fFadeInPercentOfDrawFar ); } } void NoteDisplay::DrawActor( const TapNote& tn, Actor* pActor, NotePart part, int iCol, float fYOffset, float fBeat, bool bIsAddition, float fPercentFadeToFail, float fReverseOffsetPixels, float fColorScale, float fDrawDistanceAfterTargetsPixels, float fDrawDistanceBeforeTargetsPixels, float fFadeInPercentOfDrawFar ) { - if (tn.type == TapNote::autoKeysound && !GAMESTATE->m_bInStepEditor) return; + if (tn.type == TapNoteType_AutoKeysound && !GAMESTATE->m_bInStepEditor) return; if( fYOffset < fDrawDistanceAfterTargetsPixels || fYOffset > fDrawDistanceBeforeTargetsPixels ) return; const float fY = ArrowEffects::GetYPos( m_pPlayerState, iCol, fYOffset, fReverseOffsetPixels ); @@ -702,8 +702,8 @@ void NoteDisplay::DrawActor( const TapNote& tn, Actor* pActor, NotePart part, in float fRotationX = 0, fRotationZ = 0; const float fRotationY = ArrowEffects::GetRotationY( m_pPlayerState, fYOffset ); - bool bIsHoldHead = tn.type == tn.hold_head; - bool bIsHoldCap = bIsHoldHead || tn.type == tn.hold_tail; + bool bIsHoldHead = tn.type == TapNoteType_HoldHead; + bool bIsHoldCap = bIsHoldHead || tn.type == TapNoteType_HoldTail; fRotationZ = ArrowEffects::GetRotationZ( m_pPlayerState, fBeat, bIsHoldHead ); if( !bIsHoldCap ) @@ -711,7 +711,7 @@ void NoteDisplay::DrawActor( const TapNote& tn, Actor* pActor, NotePart part, in fRotationX = ArrowEffects::GetRotationX( m_pPlayerState, fYOffset ); } - if( tn.type != tn.hold_head ) + if( tn.type != TapNoteType_HoldHead ) fColorScale *= ArrowEffects::GetBrightness( m_pPlayerState, fBeat ); pActor->SetRotationX( fRotationX ); @@ -752,23 +752,23 @@ void NoteDisplay::DrawTap(const TapNote& tn, int iCol, float fBeat, Actor* pActor = NULL; NotePart part = NotePart_Tap; /* - if( tn.source == TapNote::addition ) + if( tn.source == TapNoteSource_Addition ) { pActor = GetTapActor( m_TapAddition, NotePart_Addition, fBeat ); part = NotePart_Addition; } */ - if( tn.type == TapNote::lift ) + if( tn.type == TapNoteType_Lift ) { pActor = GetTapActor( m_TapLift, NotePart_Lift, fBeat ); part = NotePart_Lift; } - else if( tn.type == TapNote::mine ) + else if( tn.type == TapNoteType_Mine ) { pActor = GetTapActor( m_TapMine, NotePart_Mine, fBeat ); part = NotePart_Mine; } - else if( tn.type == TapNote::fake ) + else if( tn.type == TapNoteType_Fake ) { pActor = GetTapActor( m_TapFake, NotePart_Fake, fBeat ); part = NotePart_Fake; @@ -812,7 +812,7 @@ void NoteDisplay::DrawTap(const TapNote& tn, int iCol, float fBeat, pActor = GetTapActor( m_TapNote, NotePart_Tap, fBeat ); } - if( tn.type == TapNote::attack ) + if( tn.type == TapNoteType_Attack ) { Message msg( "SetAttack" ); msg.SetParam( "Modifiers", tn.sAttackModifiers ); @@ -823,7 +823,7 @@ void NoteDisplay::DrawTap(const TapNote& tn, int iCol, float fBeat, // this is the line that forces the (1,1,1,x) part of the noteskin diffuse -aj DrawActor( tn, pActor, part, iCol, fYOffset, fBeat, bIsAddition, fPercentFadeToFail, fReverseOffsetPixels, 1.0f, fDrawDistanceAfterTargetsPixels, fDrawDistanceBeforeTargetsPixels, fFadeInPercentOfDrawFar ); - if( tn.type == TapNote::attack ) + if( tn.type == TapNoteType_Attack ) pActor->PlayCommand( "UnsetAttack" ); } diff --git a/src/NoteField.cpp b/src/NoteField.cpp index 56fa3a3a6d..6bde0e551a 100644 --- a/src/NoteField.cpp +++ b/src/NoteField.cpp @@ -1214,7 +1214,7 @@ void NoteField::DrawPrimitives() for( ; begin != end; ++begin ) { const TapNote &tn = begin->second; //m_pNoteData->GetTapNote(c, j); - if( tn.type != TapNote::hold_head ) + if( tn.type != TapNoteType_HoldHead ) continue; // skip const HoldNoteResult &Result = tn.HoldResult; @@ -1243,7 +1243,7 @@ void NoteField::DrawPrimitives() continue; // skip } - bool bIsAddition = (tn.source == TapNote::addition); + bool bIsAddition = (tn.source == TapNoteSource_Addition); bool bIsHopoPossible = (tn.bHopoPossible); bool bUseAdditionColoring = bIsAddition || bIsHopoPossible; const bool bHoldGhostShowing = tn.HoldResult.bActive && tn.HoldResult.fLife > 0; @@ -1280,13 +1280,13 @@ void NoteField::DrawPrimitives() // Fixes hold head overlapping issue, but not the rolls. switch( tn.type ) { - case TapNote::empty: // no note here + case TapNoteType_Empty: // no note here { continue; } - case TapNote::hold_head: + case TapNoteType_HoldHead: { - //if (tn.subType == TapNote::hold_head_roll) + //if (tn.subType == TapNoteSubType_Roll) continue; // skip } default: break; @@ -1313,8 +1313,8 @@ void NoteField::DrawPrimitives() for( int c2=0; c2GetNumTracks(); c2++ ) { const TapNote &tmp = m_pNoteData->GetTapNote(c2, q); - if(tmp.type == TapNote::hold_head && - tmp.subType == TapNote::hold_head_hold) + if(tmp.type == TapNoteType_HoldHead && + tmp.subType == TapNoteSubType_Hold) { bHoldNoteBeginsOnThisBeat = true; break; @@ -1329,8 +1329,8 @@ void NoteField::DrawPrimitives() for( int c2=0; c2GetNumTracks(); c2++ ) { const TapNote &tmp = m_pNoteData->GetTapNote(c2, q); - if(tmp.type == TapNote::hold_head && - tmp.subType == TapNote::hold_head_roll) + if(tmp.type == TapNoteType_HoldHead && + tmp.subType == TapNoteSubType_Roll) { bRollNoteBeginsOnThisBeat = true; break; @@ -1342,7 +1342,7 @@ void NoteField::DrawPrimitives() if( m_iBeginMarker!=-1 && m_iEndMarker!=-1 ) bIsInSelectionRange = m_iBeginMarker<=q && q TapNote::fake ) + if (type_ > TapNoteType_Fake ) { - LOG->Trace("Invalid tap note type %d (most likely) due to random vanish issues. Assume it doesn't need judging.", (int)type_ ); - type = TapNote::empty; + LOG->Trace("Invalid tap note type %d (most likely) due to random vanish issues. Assume it doesn't need judging.", TapNoteTypeToString(type_).c_str() ); + type = TapNoteType_Empty; } } @@ -207,39 +223,6 @@ extern TapNote TAP_ORIGINAL_FAKE; // 'F' extern TapNote TAP_ADDITION_TAP; extern TapNote TAP_ADDITION_MINE; -/** - * @brief Retrieve the string representing the TapNote Type. - * - * TODO: Find a way to standardize this with the other enum string calls. - * @param tn the TapNote's type. - * @return the intended string. */ -inline const RString TapNoteTypeToString( TapNote::Type tn ) -{ - switch( tn ) - { - case TapNote::empty: - return RString("empty"); - case TapNote::tap: - return RString("tap"); - case TapNote::hold_head: - return RString("hold_head"); - case TapNote::hold_tail: - return RString("hold_tail"); - case TapNote::mine: - return RString("mine"); - case TapNote::lift: - return RString("lift"); - case TapNote::attack: - return RString("attack"); - case TapNote::autoKeysound: - return RString("autoKeysound"); - case TapNote::fake: - return RString("fake"); - default: - return RString(""); - } -} - /** * @brief The number of tracks allowed. * diff --git a/src/NotesLoaderBMS.cpp b/src/NotesLoaderBMS.cpp index ef49a5130c..9de9354d7d 100644 --- a/src/NotesLoaderBMS.cpp +++ b/src/NotesLoaderBMS.cpp @@ -942,8 +942,8 @@ bool BMSChartReader::ReadNoteData() { // this object is the end of the hold note. TapNote tn = nd.GetTapNote(track, holdStart[track]); - tn.type = TapNote::hold_head; - tn.subType = TapNote::hold_head_hold; + tn.type = TapNoteType_HoldHead; + tn.subType = TapNoteSubType_Hold; nd.AddHoldNote( track, holdStart[track], row, tn ); holdStart[track] = -1; lastNote[track] = -1; @@ -953,8 +953,8 @@ bool BMSChartReader::ReadNoteData() // this object is the end of the hold note. // lnobj: set last note to hold head. TapNote tn = nd.GetTapNote(track, lastNote[track]); - tn.type = TapNote::hold_head; - tn.subType = TapNote::hold_head_hold; + tn.type = TapNoteType_HoldHead; + tn.subType = TapNoteSubType_Hold; nd.AddHoldNote( track, lastNote[track], row, tn ); holdStart[track] = -1; lastNote[track] = -1; diff --git a/src/NotesLoaderDWI.cpp b/src/NotesLoaderDWI.cpp index e826cf56f0..ece1b5fe1f 100644 --- a/src/NotesLoaderDWI.cpp +++ b/src/NotesLoaderDWI.cpp @@ -367,7 +367,7 @@ static NoteData ParseNoteData(RString &step1, RString &step2, FOREACH_NONEMPTY_ROW_IN_TRACK( newNoteData, t, iHeadRow ) { TapNote tn = newNoteData.GetTapNote( t, iHeadRow ); - if( tn.type != TapNote::hold_head ) + if( tn.type != TapNoteType_HoldHead ) continue; int iTailRow = iHeadRow; @@ -375,9 +375,9 @@ static NoteData ParseNoteData(RString &step1, RString &step2, while( !bFound && newNoteData.GetNextTapNoteRowForTrack(t, iTailRow) ) { const TapNote &TailTap = newNoteData.GetTapNote( t, iTailRow ); - if( TailTap.type == TapNote::empty ) + if( TailTap.type == TapNoteType_Empty ) continue; - + newNoteData.SetTapNote( t, iTailRow, TAP_EMPTY ); tn.iDuration = iTailRow - iHeadRow; newNoteData.SetTapNote( t, iHeadRow, tn ); diff --git a/src/NotesLoaderJson.cpp b/src/NotesLoaderJson.cpp index b09d564454..60d7fd88dc 100644 --- a/src/NotesLoaderJson.cpp +++ b/src/NotesLoaderJson.cpp @@ -89,11 +89,11 @@ static void Deserialize(BackgroundChange &o, const Json::Value &root ) static void Deserialize( TapNote &o, const Json::Value &root ) { - //if( o.type != TapNote::tap ) + //if( o.type != TapNoteType_Tap ) if( root.isInt() ) - o.type = (TapNote::Type)root["Type"].asInt(); - //if( o.type == TapNote::hold_head ) - o.subType = (TapNote::SubType)root["SubType"].asInt(); + o.type = (TapNoteType)root["Type"].asInt(); + //if( o.type == TapNoteType_HoldHead ) + o.subType = (TapNoteSubType)root["SubType"].asInt(); //root["Source"] = (int)source; //if( !o.sAttackModifiers.empty() ) o.sAttackModifiers = root["AttackModifiers"].asString(); diff --git a/src/NotesWriterDWI.cpp b/src/NotesWriterDWI.cpp index 939848e7b3..5ce10f69ea 100644 --- a/src/NotesWriterDWI.cpp +++ b/src/NotesWriterDWI.cpp @@ -123,13 +123,13 @@ static RString NotesToDWIString( const TapNote tnCols[6] ) { switch( tnCols[col].type ) { - case TapNote::empty: - case TapNote::mine: + case TapNoteType_Empty: + case TapNoteType_Mine: continue; default: break; } - if( tnCols[col].type == TapNote::hold_head ) + if( tnCols[col].type == TapNoteType_HoldHead ) holds += dirs[col]; else taps += dirs[col]; diff --git a/src/NotesWriterJson.cpp b/src/NotesWriterJson.cpp index e1b056a9f0..0854d1d17e 100644 --- a/src/NotesWriterJson.cpp +++ b/src/NotesWriterJson.cpp @@ -55,9 +55,9 @@ static void Serialize( const TapNote &o, Json::Value &root ) { root = Json::Value(Json::objectValue); - if( o.type != TapNote::tap ) + if( o.type != TapNoteType_Tap ) root["Type"] = (int)o.type; - if( o.type == TapNote::hold_head ) + if( o.type == TapNoteType_HoldHead ) root["SubType"] = (int)o.subType; //root["Source"] = (int)source; if( !o.sAttackModifiers.empty() ) diff --git a/src/Player.cpp b/src/Player.cpp index 6a7e8a990c..0865791d96 100644 --- a/src/Player.cpp +++ b/src/Player.cpp @@ -537,16 +537,16 @@ static bool NeedsTapJudging( const TapNote &tn ) switch( tn.type ) { DEFAULT_FAIL( tn.type ); - case TapNote::tap: - case TapNote::hold_head: - case TapNote::mine: - case TapNote::lift: + case TapNoteType_Tap: + case TapNoteType_HoldHead: + case TapNoteType_Mine: + case TapNoteType_Lift: return tn.result.tns == TNS_None; - case TapNote::hold_tail: - case TapNote::attack: - case TapNote::autoKeysound: - case TapNote::fake: - case TapNote::empty: + case TapNoteType_HoldTail: + case TapNoteType_Attack: + case TapNoteType_AutoKeysound: + case TapNoteType_Fake: + case TapNoteType_Empty: return false; } } @@ -560,16 +560,16 @@ static bool NeedsHoldJudging( const TapNote &tn ) switch( tn.type ) { DEFAULT_FAIL( tn.type ); - case TapNote::hold_head: + case TapNoteType_HoldHead: return tn.HoldResult.hns == HNS_None; - case TapNote::tap: - case TapNote::hold_tail: - case TapNote::mine: - case TapNote::lift: - case TapNote::attack: - case TapNote::autoKeysound: - case TapNote::fake: - case TapNote::empty: + case TapNoteType_Tap: + case TapNoteType_HoldTail: + case TapNoteType_Mine: + case TapNoteType_Lift: + case TapNoteType_Attack: + case TapNoteType_AutoKeysound: + case TapNoteType_Fake: + case TapNoteType_Empty: return false; } } @@ -947,7 +947,7 @@ void Player::Update( float fDeltaTime ) iHeadRow = iSongRow; const TapNote &tn = m_NoteData.GetTapNote( iTrack, iHeadRow ); - if( tn.type != TapNote::hold_head || tn.subType != TapNote::hold_head_roll ) + if( tn.type != TapNoteType_HoldHead || tn.subType != TapNoteSubType_Roll ) continue; if( tn.HoldResult.hns != HNS_None ) continue; @@ -981,7 +981,7 @@ void Player::Update( float fDeltaTime ) for( ; !iter.IsAtEnd() && iter.Row() <= iSongRow; ++iter ) { TapNote &tn = *iter; - if( tn.type != TapNote::hold_head ) + if( tn.type != TapNoteType_HoldHead ) continue; int iTrack = iter.Track(); @@ -994,9 +994,9 @@ void Player::Update( float fDeltaTime ) switch( tn.subType ) { DEFAULT_FAIL( tn.subType ); - case TapNote::hold_head_hold: + case TapNoteSubType_Hold: break; - case TapNote::hold_head_roll: + case TapNoteSubType_Roll: { vector v; v.push_back( trtn ); @@ -1005,7 +1005,7 @@ void Player::Update( float fDeltaTime ) continue; // don't process this below } /* - case TapNote::hold_head_mine: + case TapNoteSubType_Mine: break; */ @@ -1088,14 +1088,14 @@ void Player::UpdateHoldNotes( int iSongRow, float fDeltaTime, vectoriTrack; ASSERT( iStartRow == trtn->iRow ); TapNote &tn = *trtn->pTN; int iEndRow = iStartRow + tn.iDuration; - if( subType == TapNote::SubType_Invalid ) + if( subType == TapNoteSubType_Invalid ) subType = tn.subType; /* All holds must be of the same subType because fLife is handled @@ -1250,7 +1250,7 @@ void Player::UpdateHoldNotes( int iSongRow, float fDeltaTime, vectorpTN; @@ -1296,7 +1296,7 @@ void Player::UpdateHoldNotes( int iSongRow, float fDeltaTime, vectorpTN; @@ -1311,7 +1311,7 @@ void Player::UpdateHoldNotes( int iSongRow, float fDeltaTime, vector= 0 && tn.iKeysoundIndex < (int) m_vKeysounds.size() ) { - float factor = (tn.subType == TapNote::hold_head_roll ? 2.0f * fLifeFraction : 10.0f * fLifeFraction - 8.5f); + float factor = (tn.subType == TapNoteSubType_Roll ? 2.0f * fLifeFraction : 10.0f * fLifeFraction - 8.5f); m_vKeysounds[tn.iKeysoundIndex].SetProperty ("Volume", max(0.0f, min(1.0f, factor)) * fVol); } } @@ -1667,7 +1667,7 @@ int Player::GetClosestNoteDirectional( int col, int iStartRow, int iEndRow, bool if (!m_Timing->IsJudgableAtRow( begin->first )) break; // unsure if autoKeysounds should be excluded. -Wolfman2000 - if( tn.type == TapNote::empty || tn.type == TapNote::autoKeysound ) + if( tn.type == TapNoteType_Empty || tn.type == TapNoteType_AutoKeysound ) break; if( !bAllowGraded && tn.result.tns != TNS_None ) break; @@ -1974,7 +1974,7 @@ void Player::PlayKeysound( const TapNote &tn, TapNoteScore score ) if( tn.iKeysoundIndex >= 0 && tn.iKeysoundIndex < (int) m_vKeysounds.size() ) { // handle a case for hold notes - if( tn.type == TapNote::hold_head ) + if( tn.type == TapNoteType_HoldHead ) { // if the hold is not already held if( tn.HoldResult.hns == HNS_None ) @@ -2046,15 +2046,15 @@ void Player::StepStrumHopo( int col, int row, const RageTimer &tm, bool bHeld, b for( ; begin != end; ++begin ) { TapNote &tn = begin->second; - if( tn.type != TapNote::hold_head ) + if( tn.type != TapNoteType_HoldHead ) continue; switch( tn.subType ) { DEFAULT_FAIL( tn.subType ); - case TapNote::hold_head_hold: + case TapNoteSubType_Hold: continue; - case TapNote::hold_head_roll: + case TapNoteSubType_Roll: break; } @@ -2240,18 +2240,18 @@ void Player::StepStrumHopo( int col, int row, const RageTimer &tm, bool bHeld, b case PC_HUMAN: switch( pTN->type ) { - case TapNote::mine: + case TapNoteType_Mine: // Stepped too close to mine? if( !bRelease && ( REQUIRE_STEP_ON_MINES == !bHeld ) && fSecondsFromExact <= GetWindowSeconds(TW_Mine) && m_Timing->IsJudgableAtRow(iSongRow)) score = TNS_HitMine; break; - case TapNote::attack: + case TapNoteType_Attack: if( !bRelease && fSecondsFromExact <= GetWindowSeconds(TW_Attack) && !pTN->result.bHidden ) score = AllowW1() ? TNS_W1 : TNS_W2; // sentinel break; - case TapNote::hold_head: + case TapNoteType_HoldHead: // oh wow, this was causing the trigger before the hold heads // bug. (It was fNoteOffset > 0.f before) -DaisuMaster if( !REQUIRE_STEP_ON_HOLD_HEADS && ( fNoteOffset <= GetWindowSeconds( TW_W5 ) && GetWindowSeconds( TW_W5 ) != 0 ) ) @@ -2261,7 +2261,7 @@ void Player::StepStrumHopo( int col, int row, const RageTimer &tm, bool bHeld, b } // Fall through to default. default: - if( (pTN->type == TapNote::lift) == bRelease ) + if( (pTN->type == TapNoteType_Lift) == bRelease ) { if( fSecondsFromExact <= GetWindowSeconds(TW_W1) ) score = TNS_W1; else if( fSecondsFromExact <= GetWindowSeconds(TW_W2) ) score = TNS_W2; @@ -2292,14 +2292,14 @@ void Player::StepStrumHopo( int col, int row, const RageTimer &tm, bool bHeld, b // TRICKY: We're asking the AI to judge mines. Consider TNS_W4 and // below as "mine was hit" and everything else as "mine was avoided" - if( pTN->type == TapNote::mine ) + if( pTN->type == TapNoteType_Mine ) { // The CPU hits a lot of mines. Only consider hitting the // first mine for a row. We know we're the first mine if // there are are no mines to the left of us. for( int t=0; ttype == TapNote::attack && score > TNS_W4 ) + if( pTN->type == TapNoteType_Attack && score > TNS_W4 ) score = TNS_W2; // sentinel /* AI will generate misses here. Don't handle a miss like a regular @@ -2405,7 +2405,7 @@ void Player::StepStrumHopo( int col, int row, const RageTimer &tm, bool bHeld, b for( int i=0; iGetCurrentStyle()->m_iColsPerPlayer; i++ ) { const TapNote &tn = m_NoteData.GetTapNote( i, iRowOfOverlappingNoteOrRow ); - bool bIsNote = (tn.type != TapNote::empty); + bool bIsNote = (tn.type != TapNoteType_Empty); if( iFirstNoteCol == -1 && bIsNote ) iFirstNoteCol = i; @@ -2432,7 +2432,7 @@ void Player::StepStrumHopo( int col, int row, const RageTimer &tm, bool bHeld, b for( int i=GAMESTATE->GetCurrentStyle()->m_iColsPerPlayer-1; i>=0; i-- ) { const TapNote &tn = m_NoteData.GetTapNote( i, iRowOfOverlappingNoteOrRow ); - bool bIsNote = (tn.type != TapNote::empty); + bool bIsNote = (tn.type != TapNoteType_Empty); if( bIsNote ) { iLastNoteCol = i; @@ -2462,7 +2462,7 @@ void Player::StepStrumHopo( int col, int row, const RageTimer &tm, bool bHeld, b } const TapNote &tn = m_NoteData.GetTapNote( col, iRowOfOverlappingNoteOrRow ); - ASSERT( tn.type != TapNote::empty ); + ASSERT( tn.type != TapNoteType_Empty ); int iRowsAgoLastNote = 100000; // TODO: find more reasonable value based on HOPO_CHAIN_SECONDS? NoteData::all_tracks_reverse_iterator iter = m_NoteData.GetTapNoteRangeAllTracksReverse( iRowsAgoLastNote-iRowsAgoLastNote, iRowOfOverlappingNoteOrRow-1 ); @@ -2489,7 +2489,7 @@ void Player::StepStrumHopo( int col, int row, const RageTimer &tm, bool bHeld, b } // handle attack notes - if( pTN->type == TapNote::attack && score == TNS_W2 ) + if( pTN->type == TapNoteType_Attack && score == TNS_W2 ) { score = TNS_None; // don't score this as anything @@ -2514,7 +2514,7 @@ void Player::StepStrumHopo( int col, int row, const RageTimer &tm, bool bHeld, b for( int t=0; tGetCurrentGame()->m_bCountNotesSeparately ) { - if( pTN->type != TapNote::mine ) + if( pTN->type != TapNoteType_Mine ) { const bool bBlind = (m_pPlayerState->m_PlayerOptions.GetCurrent().m_fBlind != 0); // XXX: This is the wrong combo for shared players. @@ -2734,7 +2734,7 @@ void Player::UpdateTapNotesMissedOlderThan( float fMissIfOlderThanSeconds ) if (!m_Timing->IsJudgableAtRow(iter.Row())) continue; - if( tn.type == TapNote::mine ) + if( tn.type == TapNoteType_Mine ) { tn.result.tns = TNS_AvoidMine; @@ -2793,9 +2793,9 @@ void Player::UpdateJudgedRows() for( int iTrack = 0; iTrack < m_NoteData.GetNumTracks(); ++iTrack ) { const TapNote &tn = m_NoteData.GetTapNote( iTrack, iRow ); - if (tn.type == TapNote::empty || - tn.type == TapNote::mine || - tn.type == TapNote::autoKeysound) continue; + if (tn.type == TapNoteType_Empty || + tn.type == TapNoteType_Mine || + tn.type == TapNoteType_AutoKeysound) continue; SetJudgment( tn.result.tns, iTrack, tn.result.fTapNoteOffset ); } } @@ -2805,8 +2805,8 @@ void Player::UpdateJudgedRows() for( int iTrack = 0; iTrack < m_NoteData.GetNumTracks(); ++iTrack ) { const TapNote &tn = m_NoteData.GetTapNote( iTrack, iRow ); - if (tn.type == TapNote::tap || tn.type == TapNote::lift || - ( tn.type == TapNote::hold_head && REQUIRE_STEP_ON_HOLD_HEADS ) ) + if (tn.type == TapNoteType_Tap || tn.type == TapNoteType_Lift || + ( tn.type == TapNoteType_HoldHead && REQUIRE_STEP_ON_HOLD_HEADS ) ) { viColsWithTaps.push_back( iTrack ); }; @@ -2841,7 +2841,7 @@ void Player::UpdateJudgedRows() *m_pIterUnjudgedMineRows = iter; } - bool bMineNotHidden = tn.type == TapNote::mine && !tn.result.bHidden; + bool bMineNotHidden = tn.type == TapNoteType_Mine && !tn.result.bHidden; if( !bMineNotHidden ) continue; @@ -2916,7 +2916,7 @@ void Player::FlashGhostRow( int iRow ) { const TapNote &tn = m_NoteData.GetTapNote( iTrack, iRow ); - if( tn.type == TapNote::empty || tn.type == TapNote::mine || tn.type == TapNote::fake ) + if( tn.type == TapNoteType_Empty || tn.type == TapNoteType_Mine || tn.type == TapNoteType_Fake ) continue; if( m_pNoteField ) m_pNoteField->DidTapNote( iTrack, lastTNS, bBright ); @@ -2939,7 +2939,7 @@ void Player::CrossedRows( int iLastRowCrossed, const RageTimer &now ) int iTrack = iter.Track(); switch( tn.type ) { - case TapNote::hold_head: + case TapNoteType_HoldHead: { tn.HoldResult.fLife = INITIAL_HOLD_LIFE; if( !REQUIRE_STEP_ON_HOLD_HEADS ) @@ -2959,7 +2959,7 @@ void Player::CrossedRows( int iLastRowCrossed, const RageTimer &now ) } break; } - case TapNote::mine: + case TapNoteType_Mine: { // Hold the panel while crossing a mine will cause the mine to explode // TODO: Remove use of PlayerNumber. @@ -2984,9 +2984,9 @@ void Player::CrossedRows( int iLastRowCrossed, const RageTimer &now ) // check to see if there's a note at the crossed row if( m_pPlayerState->m_PlayerController != PC_HUMAN ) { - if (tn.type != TapNote::empty && - tn.type != TapNote::fake && - tn.type != TapNote::autoKeysound && + if (tn.type != TapNoteType_Empty && + tn.type != TapNoteType_Fake && + tn.type != TapNoteType_AutoKeysound && tn.result.tns == TNS_None && this->m_Timing->IsJudgableAtRow(iRow) ) { @@ -3013,7 +3013,7 @@ void Player::CrossedRows( int iLastRowCrossed, const RageTimer &now ) for (int t = 0; t < m_NoteData.GetNumTracks(); ++t) { const TapNote &tap = m_NoteData.GetTapNote(t, iRow); - if (tap.type == TapNote::autoKeysound) + if (tap.type == TapNoteType_AutoKeysound) { PlayKeysound(tap, TNS_None); } @@ -3047,7 +3047,7 @@ void Player::CrossedRows( int iLastRowCrossed, const RageTimer &now ) for( ; !nIter.IsAtEnd(); ++nIter ) { TapNote &tn = *nIter; - if( tn.type != TapNote::hold_head ) + if( tn.type != TapNoteType_HoldHead ) continue; int iTrack = nIter.Track(); @@ -3109,10 +3109,10 @@ void Player::HandleTapRowScore( unsigned row ) { const TapNote &tn = m_NoteData.GetTapNote( track, row ); // Mines cannot be handled here. - if (tn.type == TapNote::empty || - tn.type == TapNote::fake || - tn.type == TapNote::mine || - tn.type == TapNote::autoKeysound) + if (tn.type == TapNoteType_Empty || + tn.type == TapNoteType_Fake || + tn.type == TapNoteType_Mine || + tn.type == TapNoteType_AutoKeysound) continue; if( m_pPrimaryScoreKeeper ) m_pPrimaryScoreKeeper->HandleTapScore( tn ); diff --git a/src/ScoreKeeper.cpp b/src/ScoreKeeper.cpp index 2a0825c614..fb85102464 100644 --- a/src/ScoreKeeper.cpp +++ b/src/ScoreKeeper.cpp @@ -19,7 +19,7 @@ void ScoreKeeper::GetScoreOfLastTapInRow( const NoteData &nd, int iRow, { const TapNote &tn = nd.GetTapNote( track, iRow ); - if( tn.type != TapNote::tap && tn.type != TapNote::hold_head ) + if( tn.type != TapNoteType_Tap && tn.type != TapNoteType_HoldHead ) continue; ++iNum; } diff --git a/src/ScoreKeeperNormal.cpp b/src/ScoreKeeperNormal.cpp index 59e768ab0e..6cb4e42ec0 100644 --- a/src/ScoreKeeperNormal.cpp +++ b/src/ScoreKeeperNormal.cpp @@ -337,7 +337,7 @@ void ScoreKeeperNormal::HandleTapScore( const TapNote &tn ) { TapNoteScore tns = tn.result.tns; - if( tn.type == TapNote::mine ) + if( tn.type == TapNoteType_Mine ) { if( tns == TNS_HitMine ) { @@ -463,7 +463,7 @@ void ScoreKeeperNormal::GetRowCounts( const NoteData &nd, int iRow, { const TapNote &tn = nd.GetTapNote( track, iRow ); - if( tn.type != TapNote::tap && tn.type != TapNote::hold_head && tn.type != TapNote::lift ) + if( tn.type != TapNoteType_Tap && tn.type != TapNoteType_HoldHead && tn.type != TapNoteType_Lift ) continue; TapNoteScore tns = tn.result.tns; if( tns >= m_MinScoreToContinueCombo ) diff --git a/src/ScreenEdit.cpp b/src/ScreenEdit.cpp index 3c8df4ab38..7216fb9802 100644 --- a/src/ScreenEdit.cpp +++ b/src/ScreenEdit.cpp @@ -1825,7 +1825,7 @@ bool ScreenEdit::InputEdit( const InputEventPlus &input, EditButton EditB ) m_NoteDataEdit.SetTapNote( iCol, iHeadRow, TAP_EMPTY ); // Don't CheckNumberOfNotesAndUndo. We don't want to revert any change that removes notes. } - else if( m_NoteDataEdit.GetTapNote(iCol, iSongIndex).type != TapNote::empty ) + else if( m_NoteDataEdit.GetTapNote(iCol, iSongIndex).type != TapNoteType_Empty ) { m_soundRemoveNote.Play(); SetDirty( true ); @@ -1855,10 +1855,10 @@ bool ScreenEdit::InputEdit( const InputEventPlus &input, EditButton EditB ) { switch ( m_selectedTap.type ) { - case TapNote::tap: m_selectedTap = TAP_ORIGINAL_FAKE; break; - case TapNote::mine: m_selectedTap = TAP_ORIGINAL_TAP; break; - case TapNote::lift: m_selectedTap = TAP_ORIGINAL_MINE; break; - case TapNote::fake: m_selectedTap = TAP_ORIGINAL_LIFT; break; + case TapNoteType_Tap: m_selectedTap = TAP_ORIGINAL_FAKE; break; + case TapNoteType_Mine: m_selectedTap = TAP_ORIGINAL_TAP; break; + case TapNoteType_Lift: m_selectedTap = TAP_ORIGINAL_MINE; break; + case TapNoteType_Fake: m_selectedTap = TAP_ORIGINAL_LIFT; break; DEFAULT_FAIL( m_selectedTap.type ); } return true; @@ -1867,10 +1867,10 @@ bool ScreenEdit::InputEdit( const InputEventPlus &input, EditButton EditB ) { switch ( m_selectedTap.type ) { - case TapNote::tap: m_selectedTap = TAP_ORIGINAL_MINE; break; - case TapNote::mine: m_selectedTap = TAP_ORIGINAL_LIFT; break; - case TapNote::lift: m_selectedTap = TAP_ORIGINAL_FAKE; break; - case TapNote::fake: m_selectedTap = TAP_ORIGINAL_TAP; break; + case TapNoteType_Tap: m_selectedTap = TAP_ORIGINAL_MINE; break; + case TapNoteType_Mine: m_selectedTap = TAP_ORIGINAL_LIFT; break; + case TapNoteType_Lift: m_selectedTap = TAP_ORIGINAL_FAKE; break; + case TapNoteType_Fake: m_selectedTap = TAP_ORIGINAL_TAP; break; DEFAULT_FAIL( m_selectedTap.type ); } return true; @@ -3501,18 +3501,18 @@ void ScreenEdit::HandleScreenMessage( const ScreenMessage SM ) // set note at this row to use this keysound file. // if it's empty, make it an auto keysound. newNote.iKeysoundIndex = sound; - if (newNote.type == TapNote::empty) + if (newNote.type == TapNoteType_Empty) { - newNote.type = TapNote::autoKeysound; // keysounds need something non empty. + newNote.type = TapNoteType_AutoKeysound; // keysounds need something non empty. } } else // sound > kses.size() { // remove the sound. if it's an auto keysound, make it empty. newNote.iKeysoundIndex = -1; - if (newNote.type == TapNote::autoKeysound) + if (newNote.type == TapNoteType_AutoKeysound) { - newNote.type = TapNote::empty; // autoKeysound with no sound is pointless. + newNote.type = TapNoteType_Empty; // autoKeysound with no sound is pointless. } } m_NoteDataEdit.SetTapNote(track, row, newNote); @@ -3530,8 +3530,8 @@ void ScreenEdit::HandleScreenMessage( const ScreenMessage SM ) if (newNote.iKeysoundIndex == static_cast(sound)) { newNote.iKeysoundIndex = -1; - if (newNote.type == TapNote::autoKeysound) - newNote.type = TapNote::empty; + if (newNote.type == TapNoteType_AutoKeysound) + newNote.type = TapNoteType_Empty; } else if (newNote.iKeysoundIndex > static_cast(sound)) newNote.iKeysoundIndex--; @@ -3560,8 +3560,8 @@ void ScreenEdit::HandleScreenMessage( const ScreenMessage SM ) { newNote.iKeysoundIndex = pos; } - if (newNote.type == TapNote::empty) - newNote.type = TapNote::autoKeysound; // keysounds need something non empty. + if (newNote.type == TapNoteType_Empty) + newNote.type = TapNoteType_AutoKeysound; // keysounds need something non empty. m_NoteDataEdit.SetTapNote(track, row, newNote); SetDirty(true); } @@ -3588,9 +3588,9 @@ void ScreenEdit::HandleScreenMessage( const ScreenMessage SM ) const int row = BeatToNoteRow( GAMESTATE->m_Position.m_fSongBeat ); TapNote tn( - TapNote::attack, - TapNote::SubType_Invalid, - TapNote::original, + TapNoteType_Attack, + TapNoteSubType_Invalid, + TapNoteSource_Original, sMods, g_fLastInsertAttackDurationSeconds, -1 ); @@ -4829,7 +4829,7 @@ void ScreenEdit::HandleAlterMenuChoice(AlterMenuChoice c, const vector &iAn for (int t = 0; t < nd.GetNumTracks(); t++) { const TapNote &tn = nd.GetTapNote(t, r); - if (tn.type != TapNote::empty) + if (tn.type != TapNoteType_Empty) { TapNote nTap = tn; nTap.pn = (tn.pn == PLAYER_1 ? @@ -4858,7 +4858,7 @@ void ScreenEdit::HandleAlterMenuChoice(AlterMenuChoice c, const vector &iAn for (int t = 0; t < tracks; t++) { const TapNote &tn = nd.GetTapNote(t, r); - if (tn.type != TapNote::empty && tn.pn == oPN) + if (tn.type != TapNoteType_Empty && tn.pn == oPN) { TapNote nTap = tn; nTap.pn = nPN; diff --git a/src/ScreenGameplay.cpp b/src/ScreenGameplay.cpp index 49adc799bf..a7159cec9a 100644 --- a/src/ScreenGameplay.cpp +++ b/src/ScreenGameplay.cpp @@ -1017,14 +1017,14 @@ void ScreenGameplay::SetupSong( int iSongIndex ) // load player { pi->m_NoteData = ndTransformed; - NoteDataUtil::RemoveAllTapsOfType( pi->m_NoteData, TapNote::autoKeysound ); + NoteDataUtil::RemoveAllTapsOfType( pi->m_NoteData, TapNoteType_AutoKeysound ); pi->m_pPlayer->Load(); } // load auto keysounds { NoteData nd = ndTransformed; - NoteDataUtil::RemoveAllTapsExceptForType( nd, TapNote::autoKeysound ); + NoteDataUtil::RemoveAllTapsExceptForType( nd, TapNoteType_AutoKeysound ); m_AutoKeysounds.Load( pi->GetStepsAndTrailIndex(), nd ); } @@ -2049,7 +2049,7 @@ void ScreenGameplay::UpdateLights() // for each index we crossed since the last update: FOREACH_NONEMPTY_ROW_IN_TRACK_RANGE( m_CabinetLightsNoteData, cl, r, iRowLastCrossed+1, iSongRow+1 ) { - if( m_CabinetLightsNoteData.GetTapNote( cl, r ).type != TapNote::empty ) + if( m_CabinetLightsNoteData.GetTapNote( cl, r ).type != TapNoteType_Empty ) bBlinkCabinetLight[cl] = true; } @@ -2068,7 +2068,7 @@ void ScreenGameplay::UpdateLights() FOREACH_NONEMPTY_ROW_IN_TRACK_RANGE( nd, t, r, iRowLastCrossed+1, iSongRow+1 ) { const TapNote &tn = nd.GetTapNote( t, r ); - if( tn.type != TapNote::mine ) + if( tn.type != TapNoteType_Mine ) bBlink = true; } @@ -2165,7 +2165,7 @@ void ScreenGameplay::SendCrossedMessages() int iNumTracksWithTapOrHoldHead = 0; for( int t=0; tsecond; - if( tn.type != TapNote::hold_head ) + if( tn.type != TapNoteType_HoldHead ) continue; if( tn.HoldResult.bActive ) ++iHoldsHeld; diff --git a/src/libtomcrypt/Debug/libtomcrypt.lib b/src/libtomcrypt/Debug/libtomcrypt.lib new file mode 100644 index 0000000000000000000000000000000000000000..f4d2d9a49e124e514cf3f067e3018336c91b96a9 GIT binary patch literal 1310624 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

a_?E)QM{ux4q*MptL$ult z_>acF?zpPVW>1}T)%bv9#+<)^GLLJ3IcFGRPDy7nI^hK7Tz}UQ_Wh}MBkrZ)znzc~ zKXu0!Z|;R;HyQEAS9&75BRppPi_5TSuBHm5BQfd*mRv`vyOCaOaK~B2x?O*AcuYc5I4mMA7^k56+x&1F$fSQ&T)i{IpQ`!mHzI?Ih}r;p{{lPJP(0xn3BKAbS>f3 z+IP4;O=X*+Y`?@)_lG}U@zJgYp1K!kBKW;Qi$VK<)_|S?3d}IW)U5;sp0DmYQ1onJ zK_30J?onLFf_?}Z2l^Q(#`L-{#4!qV7$`>eI;Q1p&=sJVo!8M?eFEseKoNIc0E##X zl(?p3&`i)&(7B*^9@O0qngRMXXeQ|QpgEvDf+XHL2Q(Mg7lTd!y$2M}jJmf$fm^F< zgCd#?%Hy-9fX)QPlceqn(5awLfKCJ52wDuf8MFlSCD0k5VJN>@p#4FepaVdO(`H{k z3IEnO>Z@>v<5rlqTKPh02VP;T?^M1}?LqiZmylz5(if`z9lspa!UUq4zEJHo{BnE? z6Nqa1LbZ?a%ibAgAgV*Py}0JM8m8@2zEJHa_&9+H(|%RHP^~RWzq8=!_TEFaSHWYB z!n8M)4{;bg;^cTYRQt-{eQWT3GkB~|DM!4I)W>I}=2b;q7wU#(9fC%zEkkrvS`@hm9Nw?5g2n<70-5 z91=fl$Pj}iJh3q`!-fIr92*xiOx_}Xxt+i-r}q;xOwkyu@XPy+=A_z-1%5dPlPbO} zEICEWa44}^;Ftf5(clKibmglfTnzrL@XLIg{q=ObNA(e6;+@$Fzs$jCU|%Vt|61Xf zIUFW5LyjFJvl(&)kelQqXN_}S?;~f8bAAYNk11Ied1E-|zeDC94dqOo96^P3@K==# zujyDHXbi{3IykpYo`1Y?&NvF8vfABZl=H`al(Qe@>_<7DK$NrUxF-t1W@Us)g+LQ7f>B;u2{PdJ`s3xMCiD~Z< z%CnCzuxBON@xeo)txW)JE6d@!wegM$l#T4`xb6JOId&96`-t;Jepxu`xTh8Xvvn|Y zGr-r@P-|U*HyYYnR!0Tr;1jGe(%lqN+sbmZF9KXwDt71bG@Q~V(dLcAzX|v5j-q9u z7P%^7#nGY;e1~ZkDx6|w*C5FA-C1uX(Er%=mG2BOF zPrcYZze-u8KgO_DKZg5=_i>mOfsD5rKZ4tj;BH|X@FTeYA0oJEOk`lxc~R#?83^uS zF)<#NL~sv_iB~L4@t(z;HwrXNdrtWjhC2tJ&;^G3!QX)4z6K%+!+k5f+K?BP*$*yW z7~(-{hvdxS4e_&!zQvo`dD+NrYb78TRSi6NsD%t+l;IMt8!q9x;S#P3CgHkZ60Qp- zftX+tt_!9auDgHn!u`TN_Ws?3s@LzIrPbm4alj#BF-*wlW%iF2FZ@WWX}8(Fzdi2k zUW511%}cfb#!kVNOS%F6v~0;UxULsmVgHzyy3J{C?#gRR7(kdnrV@`h%r4_a8upSK zvcCNMU07dT6E4$|YOj zTef5ce(MESM9NFU#583M?#gRL;fTC?-GE`|5U$5G)MA*_W?t){O6FBY>lV?HDDsCWbvN65l`~aAR7MVnQ@iIytNr3zwM77zz3BPE6o0i${ ztIxb|S>}fNf(^?G-q_O?yu}*>mf1JKGkOWlkh)Up?Hk_QR-gG%Q0Ar%k4J<(zs$a& z-hQ7DyKnKr`$B4Z)!RP`vcIuBbHmb*`hqtWKOX>Ho9!DI$!7a~Bzyi!Bh#YI6H?4X zqHWhFwgU_v-pn`9)IZWe`U95PWy=<3r$6$sW4-$m6e%IlzPHd*HZwjL7T-;9khPR4 zE$viV*vSlxGwfc=1hn4m5=vCU+W{WVr8Vz82Rp#2-@nqn3khXIG@F;#)eL|dQ>Y2!J$6;#!gjcX zsiS-dQ%3>_Q%BPwOdU)yI!c&2m_`*w*W3470nzI-4-R=%4CIS8@mXMkq_Y>&?ZVim z`#H|p1Q&+5O@8)fo$qp$IjU-=6PxPsiqm&1aiBOLsU!fBu0scFFTf||XqHs+wi&#G z29JhErCc<8QVUInM+q%C#@!NwS7GqJflr1A#iLDzh=fn->tpZ+8@zD_ufX7~gimVO z3126~8>#&S9~Zb`JRH7w!3)E;E#izKwJz|fG{eWQ#KBq&d~Dsp+S%~o+c11-@Ub5S zYx(dI8fk5KoJ;d;XyRD}sVaPd>W3?2Px}`Cm!Y&`8i2qVrXTK+Ud`x)6CiN;vLqnj z)VdLOu0#jbwc`@t;ZSW<#6h&y&cN0j&V;xZr2B}3O=$0o#0-Z$Hy4pL(;_(wksXFu z?KhCpUP!nbpWeeF_T!3eSci7AHxijGIuOP0Q{oGtBP@a)^aj*}>Sknp1XdJ6fHl2l z1}y2rnmNNDN{jwUm7A1GX<~eXx|)yn0)yk|>E1!X4l*jmg`{>s1;EiPHs?%@n8oId zh#6~!CGbl<3OO5UL?LH8%}~e`{_0W4nNA}LIlXCy!YU}NM%#m9mN|!ML?P!cjVL6n z{@+3eEa0IudCemz>2#~!JoCkT{Y!)EWcDFA9Tq=bUB@VWJQ09S*GFr(=4X?5(I(V*#|eL#u!I|KA`&@(~b2R#dPJLq80-#}wP zgPnvS74eGuGwSl%p#*;utfF^^E1GR%r0Zjp|08It0 z0ZjwF5Ogf)MW8vLkARK`eF-!d^fl0Y(9b~&K)(W=0Jb+Th({@NPGF4;Z{h4Bi%l_lm)@0+^ct z=*P*zxbevmz1eW1;6sO3Zj87>1OJ~uofBw?#$|H*PkVKf=@MRF)H%mTjBDEFIiFzy ziH5CxU-9+k2BCaV=L8{gUP>oX=RG^Tdxg9<|FZ1qf;8f7fiWL~F;bg^IMICYPtGv- zioH0TyVZJe;=x(y#TfxkKQGQmaH0$jF2smH%DJa3nO^X7Bx39kg=5}zCuJ~tE2oE= zs51;bl?F#IbI#PIV<BsaDoEyd=l=xQzn5S<5ny$(ud6tj-kBq z?3i#vkKUU4?s^?K#y};T~ z_*Nw(LNN*29zB@G*o9_=aA%oYVdt$8?!PEKB9zb^VHAtdYy!XXN!vU_;Ze{b5bo+t zMVQa`MzpK91wh(kfOwatz&+-|OG;@*++!|W!r&dWB;N2=={!AnaZy=WWw8$?UfBgd zDlB`Z?eNCLEs^s_VDmf0Ha0UOEiuR5GPt}fY6+HiI8b!OHPue{d`EF*}(d;`fDNZCPv^Hctp~12(-f1b5eL4WG>>24~|2(6}FyJ$On}S<>;)i^?Bg` z!$;0$GjG*lSPpERQ66RoeH+a~4)0O!G|2T(vdns8SonUB8PHJ9G#pUhh4>$)WOz-- z@;hc&_{B)^tmBP^=eW~iB>abdB)lI9??=L)KqS2AwkHq=&l%qlAiEm}Hv19G3kbRH zpdi=oqL~tPO)R+^PmuEI0yYkjW?7uxk05Vg#>t0Sc)-MGx*Xhk>G!>EIO&wkF;6An zO>~OjPsl#)o-GTmd~a~u>7$c&Pr)n2TEPz)zv80elgC_}{P9Tmqd$eEsI3N5F#|=sTgsQ8*I56{@z;R1%Sbtj{c&Fke zG(6yi+Gqa|Smjf9+_%&Ae9X@`_Z~OryjhuZHSIdgj;yfCp9;P&R(Tj^T~=7-Rf6w} zRo*T5zF6f%yk=Tqm2VV$U##-yg71q}9)Z_PE39&z;QL~gUlM#@tnx{C&1?*-yp6A* zeynogOs9KR&GbT-yR@pjsKQxP=&CL*1c26ESzcT{zsfDHeIVJzGmej?QNO)uzrE?E z+FiNRRorrDw;!wAV#Dx7)iaA{%{~^^hD}&yHScU8N|k4{6_p)}r1=bcRmUX9K5C0= zTo`VTONud|9v8iSTho;@tBcByYP2qLVS|rbR!d9F(ic~|OG;-P1IyevOa2(72H%y7 z(DCNGoH&4@vZlHimlc)Rrs}M$U?QXQW1^x2{^fNaTPfIu-! z5Bx8}|7xz-3nw5@VyU2;)-ik|c>Jd`0ifyvv1~1INIJ~ObLKl!uRF#;cn8xpKrsP& z6E+I5MkLOB2SiSs^^Wp54BX%jXpqb0cPn2gAx^ZL)~{bJFo02K_K)e`@(I1~(+Fuc zTrc?W?xS2^amD=AYMna0v?4Muc}jAoMj~gUFAauT7B>m z--ruqi(wdNP*urv?OR)MWqH*gXGzyJ>og*;gEZTW(jxbum>9+`IcDoP z*VLlu`%*+K_HsF16Lu#h)6lFIMfn!p{6$eTQQ<@=;p?m?NE4b(s~}=YHt<3fqA9|~ zX|X6O#xCC_QOkA2#AI7W!dQE9YI>#(1Bu!2)|lv|bpCT#5&Utu8XLo(G0_PLHcc&j zrX<@^v(i#ClE!7V$Q~DytuHSc3x>!3)Zh_EXmu-Q#K<_YlE{_8_F`o)Hd@$u6_sHg zSI9`ff47Fs)na9E8y<91A$N{i-C_`%#meAG=m_H>;~r7i8{jC}--62r5=2A5${CrenPwvlYo@sPNgxdquKzUX{DNvZTd}lArh& zCH;$%R&%uE(&;rbJ#)0EfvF`?1M`!j28ws11*HR{1_FFvSzTR9GjXHv{#Rb*jvAQW zD``|=jxu|Y;w&q5MfDT=?=zjn)s?Qw8SbbFPFGD)SyZ0828Y5$#l{SZDV&g0=&UF% zt0^h%)dCeo?y~Y3#Yd(oFL|7+aH8`BE=uY>_XMp=%Kak?f{wsKmxbZ0NM#EvKpDBh zHjeCEyn0CsS;2~%Sdfxp&vj%^u;->^WKYD)p1j||V;UNW?U}cDLBFmVW{Im@Yv3t!4coR-jAE z-`G|1+qAzu`qQA8{Ds4YYT94$mTa{Gy+iPQSD;7YZP;oB`WnIaU4h;!_`WO9cCn)D zYc1<$!S`K(-YNLLE6}6Git@OgH!trS*Jk`%k2|mW`&}LIe!W=meOI7g5q#ej=m@;& zHnsx&8Q+5aE71NG=%ZSIcUH|Rt#0{Odzar@){!9}{43B$Vgu)ocH*(;CBwf6?KhXz z!ZzSHmvtmV#UEr5I&P?sxvaQhKIXFGhI!0o&BvUV-@3!Jh03R_WgP@ltW3A!$~3pc zTCGf5oo4K1BP-Zq=^95Gd#r4=u@va$5wJGH)g_>&W4*oG;t>Jv&<*@5zWY0Tt6#jZ zOMp8ZzZ$q)65Ra}xI7Jc8%{vpi_?(J=M`^Ryl{)Kp|xfAV-TYqoOWC?$LcwcV9h~z znEWzMgO%c~cULJ{9DkhIjmztYI&lfvV;N}ifkU*nwWTu?K-e#n)nUn5_{hyTc!Daz zg~OyxH@Q~N*wzXap0j85*aB5-+hnLn8H)D7nhN!bii>I723Z~zTPR}i&CgnstS4Ra z(AqoP=X-}@x~z`!)w40$B+dje@%fD;h_(^-3}aClMJ$Sn=g~Hm>3=~VL!ne@ zsVGgTZ)McqRvdDT^OQ%2)J96*vJg}fS2}mEQ6ZTF?_l-&>JJ*#tlv7g3-a3NeYI_& z0EyN1ICPEjP~33+VC4{*3m>hSThH1O1RF;CRhBZK#M6M5*=4Z>?rDPv7#EEqu?6fE z@*?`ho5JhuTdWKnE!xD+YeIG4#9e+;qHE5HyR@D{6Dmdg5jKNj5mG`zu<8pRAtC*R zkD!V^_>ZJD3T1r=Yw61R5NjB#atJXQzfx`{d{SQ(d{SQxd{Ouh7QhlIw-nb>ZWVk| zZZ&+}gxrnzm2#iLN1zJ6W}+%MmIZ4O@JZN8oWVQW;MEwsiwz#nvX)^VGk82OQu4MN zy!Pmhl6MMxGLEwiUW&n+W$&ki5Q zm`E+(xO<*)m)0C)h=m64HuwnTiPRp3?_^O{Jft^H@Mt4M#`Ye396p0J+6jpezJ2iF zDaH`#i z|FiMW6;9>qj;X1m4xW>2#ac-7EgMB4^_4aJU>g>}Qtlvz<(ei&>Rs*X;VAEmDK`!gC`-`qf+rykR_Rp~j{;QACa zEc5-`2G?`cbt=LeR(sM^A{mhFhp?_Q;AelQ>k0T4+ZK2N*3}nu8m{|+E&|0kR(BgH zp5b*5f?}kpdkQob^hHqgjk-5Lhk^bCIvlh&bdLhHgN_E}nRaNDb>l&8pnn2Q1YHGc z2i**s2Kqf{I%t1n97BHHB+yLIOF*+gF9pp3eFiii^gYl5&>f%?Kxq$VA}EjXoCNwK zXd&oXD440BaiHgc#)D1+JsY$bGy}8*bOk8J-#S`waf03hdOqlVptC{QsR&ZCwyLuV zcTn<}D*}roe4*M}_&6$rX?G}JsIafY@gYom1i$o!YJbBoN0cz_dF8|LukdjU!tt-l zCoS!C61^KEz@09x-@-H+cUrc&{70w+-H>2JbV2_l?109Wl00 z?U2C>LODww&vTY(IoaTyZt!{=yuk)|KNU;5{8lxm^^YJ4xk&sMw}Z?gxDcZRDd%^x9D2jg z@rR*;H3yCRm6w)NLdpn;93E%7lc5IdmqL%(=1gncX}&cZzR1!sloe2tqZQr#gYLbw zVa>@q@)x6~aBSD!da!6?O3%KMdB~f03y>k@@Ac|}p`_G5jN4HSG>70$P#_^&bceI9 z!!ebPp}bRw2^sX@c_Li!og-2Gji>NeCC5FkIc94VIyA>NE;~IfD=8z@CZ7^!h$&B6 z^TLv5+Oo%{B&B4fCQ#a1)Dp*f1om)JVRL6(O7_^S%of2_RRR9TPLBopJyzgS<96!8!sh2r^j{#rj$b~ofVF?Ij6^7hZl&8lAh|^;gKJ>^>iai}_c${mH={VQ4>|7lAs*aM?A*GE$PW{$BQ6;kVy2s_@v3 zLM_M4`|bA}o&BD;m=T_1MTZEJK5?=5e4`&eDo+}Xi`4;^c*hkMd|rV^;3VUTlN^F8 zg_GQDKY$Bh|4c`U23mq0+j+o_L6!n0xMV8}0btLFg9Pp|JfKG59v=`<<9eZfCSPQI zntt|RBy9u9(-$K>XAeR^KYI`Y`q_gJ(9a%(fPShU1myXRD>D!9?7^V=0@E>yi#F9E z`aOg83@}CR6STn@l>@AyY%E_Bl#L%^>C8AbaX#1pF#F;^SRCQTMaE!4G}PgDT=v6f zbpW3-@hj!H04C-B1Rp=n25ZysE9ENSlX7$6lXCou+Zq4C!ZwkV>x2{$*bu1^h$4Lj z@Zp06yEmx7{9>sEt8rfw}LYN770pjcz6>j|ABKzoCp1DXwrwsIIC%#{eudJEI8 zQ9giF;A2h!Qc=E8jVt!7gfQ)4tgf0yWq!8Sv~eU+$AYjcdY+ZQgo(ff`&*)0goj zP~(Du)4*%!^rdwJs4OrQq|p3rM1@e0>%P3ieb>5+tx+lT$b=)IvAe(Uk;< zh4roX0G6Zmt)V~~&@qV30<}QgaXMrcE2IIUwnQzo!!Y?ICU!4iszAqQabu{3N=}I#51ELD za;E;y@SGQSRWiJ$W4)n?92<1QDvY<4S^(=$OBz*J028&Y!aV29B6oFZZDDd{aZPz? zh1*q_>U5|1*o$x4Y-O@AiB#<>a$xA8O?d~Vr7gC=wZm_L%MWqzLmW;d#KF{iPY}*Q z6Q{V(!b64#10o%;dt;m;yqPy`TC1nJ-^JH9R!%~4 za(Y%OUN+iCoG)TxZ1N0UY_)0=aVD4n0wIwzE-B9u>zEMh7%CDr8Ly=_Eib{5S?Zou zS%OU!Z6e6iLcq%@f}!wIcWE_VN<$)gfm>5nSut}+96pGIh?qniMebRcp1F#vomKA2 zYJ9{9iFgkxT=UBjxY}9FK@({UiTD!SYUlYCB}JuWg2~f;__pG)XT`uzc?C|&&uucg z=AWt59l8ggB$()`*~KoDLoLd|F&#%l&UPW|ArY8&XjSf6)ulxx<88ALsw-wX#A!#O z*cl6-K#YYsC_n(2LL|GWtdxm#xvOi6-FTHlapJZ^-cb<_C&yXIGw(Y>-~(LFF9Ke8 zu7gIyL>yIkgx0nI2g2sSHfAc>s-lt-XT?kxn!1mLG8RJ(ioxYPmNvKcL!@?fmBB+a7AWX6c)^#!i{^rKU|5{Mob8asAcu^wT4c9KgHlt%Cnb z;H2Ms1Xbr(ZVNcH?qc^#*f1^lgQ7>=<4mbuSFyeL%!3ak?ZgT7_%aY4@bsVa<6rKX z`C{~(AJ+ZtskqniDN^t!oU!8mehu3cjz!t#j~Yz{=v*^@8tf zaciI8`&!&e$9Dj$GoNk~d|!)Odj#Lt;?@{^2e3Nx=`z9hwYc?$;QLzK>V)qAjal5< z$!`QL{>0~Vd`CHk?v}4AaWp$dTKuSy<50`Rev4be{;VH0QiRj8O-uB%id@H_`(yHf z2Yt&2fIl2+#OtNP4;}Ga-D+VQ@LSzF5|G&+#p+hPZci&JI!-}H;!S801sxfxqe%cZ zz`PgVy0Hk@L-~}|t$kn$G)XwoBxmEw%IcOC2*k_kmbF#ELV&Nh+=J)Yk)wR z3YaNE#2@Cqi}JYffEF#OU& z6BlWvg{Hp32Y7>kuSg3`QZ5@jDVGl)zxqfEO}*iZq=gVo%2mN9<@heol?7>`Ny;rX zmYnAzaQ`)jep&7VTolvKrw3Y zPG*MOe1P~yG_YO7Ff19;+aq*M5_032J~&F}3Fr;AZ^S=S$Ymns>W&b4(;l!HyklzP zkt?S(FGOv<@Q?Q^7#t$b2KTfmWK+lHu)Iy!9Kvafmir)cI%3%@RD20E?qAp@| zqQEJHp!lA2G8im2H~xiHdS}Tz)KXYPKgHy%(?MoOFj<&FQhqKHNs9rG%W?eT#iY`1 z5oKuk=u}+mkRY6fQd3sra!hv;6@wBBi(uPl`sSgXg+^s4cqI zh=}Hox~ps5{Lt6xIvn>su%mr4koaYt5_UwW*XN3lURB5XM!yjDgpj?uX}BH;x(E~? z8evZ;4wL|(A)p&Thl9QfivC#l4(Mpm4?zh#Vw~rK9so@OjYOO&pfRASprb%B0M;df zri0SnPzGo&Xcj18X5&Gx2F(R!n)5;b0t&E2-EE+gLEi+$Vq)F9pbpUAL8pPT?VN;v zYr8+!;|}{wn0Ax$g=%-fhvop@y~-D=Jq{m=61=CBFI3xs7^pc+`%?KrweJkxj|Pus z4y9bM@`Z{6nfh8qSSA3xHeZgGXK_djv?9+&M= zK_+*TMvGQv=L?-;-{P9_?t=?<%O&XFd(E0^4r68GhD-WvV{{S>lW@WA0(ouzW!cji z&?%VBK;J{0P=J5fxQRuN)CPEQ&^NVcgM$mhiXBE$l}8R|(vf3rt;VK{7@_#Ym5!mz z<`6IeGy$CUhu02mSeklB((}{>LwW0A>uWv)Ynjr+P~Ljl2t6DT=nePvlD?J|jHM*4@3a9C8?j7_6+!Slh3;UFi{_m^kezU(H8lzlN4(=vcq( z37WReTeAt;(R}+gw4NrRT%G}vGaj!sI0@}Cc$Gz^Rm5E2WM0i7Ck!q}ZBd!C1R`7? zbLyAJ4gF;(KK|xy#@WVZr{FNgjO>=-#JtM)KWF8JyCppCuy`>5#-y|dFE%$y(`;;i za7T+5+lvPe@nXb+(XsQ|EbwAeaAPWDo=|u(&Rwmn+@zsLoQ}EPOwRA%sMZQE#*UHM z5bqT3YvqQWY)UiaIJuh93_0qnX@(q!#zj7IHcPzNhdy%Fc(G3*_nDIAh|w5c>?_E8 z+fdFls354oi~Xu(cumK8LmT-6;l)Zy{dlqF98cmmiPK_uqH(IW|HMY?<0qRu@o|#o zsxIb#p=kq*x%Zw>yx4_!$XHs&u>g$eXDzl-fH3`}#GHhrarS(H?s@}n;qBG!OnavG zUxgt%0-TsNx=L5zjm)x^)lo<}9&lAt7&a@QlrLCKS1M+t60y~k(&LR(YlulZBJ`Oa z_*g;BsPA~f%KR9zucpC{I3};*0q3qb@79F#mj4>zYLz))P0io1!9egYdgsi$7k#{b zVy8XYuYH^k;)CK_l0Tv9>Mst={3dYRk{j0FM%&UnK_EQfh1zHT5T`bt6VB57&5=*q2ptC$&VrPW5_T`_JNT4F=VxcCB`1Jna*Y$iQ4Fk zMho#ne)B^nY@^@&kl*~!40lwmv#DYGkAfjP;*%Q(VF?h^VyvvkDc|8wZVdMTyp9qg zHo&978Y0%uBVcuMBcNcL`MDPmt!M!zi#EVyQ}J0DT!9yhvc`*zf(Q{+1De2#se6D+ zcwxza7u!49-VVq$E^zMV>LN9@!-;?JdWnj|_h3kgpZRw)wGdlo-zFl4*`$@?L`9su zr%sD(2<6fNU|ktti;sSS%4$SDV~LCN0K+7ptiGTdG>wg&9>y#Nk`iM!K=^=c5hjg-iD?lyDv2?Za$ND2azLUe14_W4 zD7l&NNx3RRt_D7?3P_9@7il83rTCR{tKgIRR>Ox?8pz#A*u=OM)GK`N%Drl$Epw3YzA+xA-Bljt%eWlOpse^@V3GyQE9)z*HOg5lL4h1 zPX?565KBO`La@dYzhZ^lXya}geBt75K73pRvOZCd%U7(We)y+rh)QdX`wdZP48v6{ z(z|uQgeFjFrZ1m5DvjDV;{R;?x5K}3b^pz%G~&&okWe@Nz3^si5M-+Di2}aHqI0*x zc0_lP8#p5gN^1;&#``>qFA4#8u--8Pq!yN{;uh zQ(ZQOkmJZecQ~ZowNgy9V(;{{!JXzK?KUbs3?)e+&iaHmVx#FqDBoeO7{98t1N@mj7 zRJ#q&kS0Z&d2U>b&8m&FW!uMQrP)(6S_GH#F6{plTrPBQtZ~d+6y4$QawCQg87>5) zh?fi1?wNRhUV1lqI5!)j6<&@LCNF1UU#%M+OkY4QfbT+Z9FB;)GCz#S-w2sbkaNW&+TS7bkA`v|95#Js~*L;x-wjAlZ({kNJ6)01k#&9xBDMcCatXmG*+89Rfi4X`3Ya8KEF z!?ak~brWB_{Px2B+wFy2Ie1=C(Yf}|le7zBuB&c;ho;?#m-p}hUwdJn3BIqruu=Hb zWMwbxTEX|V7xtCl``Qaj!ArW8y|7yZ-`8H)F2VP;7j`yY$*t^#T_X6t_QGBjd|!KE z9q~%un7y#i`MTcXk9j^|55K)IWlOkOI1h{BE3U3|wcJvYYi<=xF1cqMuS53ySg)o) z19OXK6;;bhJhtaMIsB*09f<*;KZd<9%jvlv=;b#S*1|U6Hx_mzW5pi?=oLR)KS9ng z78XAuCaS?XbMYf|lVaK#nDg=jY?yYY@+q9xd-$9wY=!mv9k#-1A);)B-3qTZuxrWM<(8~-pa+#PV zUZeO}5vpVPMS-S+qVDQSKvA1@m7sk=F9L;(I0)}7(8q8+0CXcLaXz1d#(@3`8VeeT zIO0Kxv;;yxSezp6rxMpAL5YwX13Dkn2FmI<3IEnOn_F;)ZAKo7N1r?t5BUV|Vf@k; zsy&Ne<}6HmPWeK$Sj0fhVcJmT3)K<~p55S$H+VemiXlQZ9=0gMRvA3jsezSg@q071 z`F@i{jTr7s`0$xQIg~Z7*c)oKPMuy_5t)}fr9;ZoyJw78w)X3PAdyG@D&O?EHe%_j z(AYSxeQPVOEUy~mEa|#torci}C=c6=(jxbum>9+`Ip&2$a)SaB@OwCCMx_KoI4F<{ zjr4ik%^&=Al;?^*^P;0boCLCsbL{#$`0KkR0_Ljji5&h+&Kws@6KDxU#I{2x5is3m zpLM0YHvdwZ&VztKd)J;poF2Rj5N{fh1s={2aPBrZxDY8MWxtbo>?JS7ujDY4bh=EU z&Jdv*N4Es7tU*Gh79)tslcW5Y3P8%Nhixq=kV~j^+ZIP(+?1XRrI=`;#55GSixdZ+ zw4g^Xt-iZn$Kr0|>3Q4~N=kj8I3$wumBEQpoDh_#bUH^L5@o5HaUmR~tVdhX47J^v@E5Uv5MZ3EPxJ&_Y+TC&Mb91 zro)z@OBq8lee7;v9mx`F0r-bKCp+1mmSf{c)g-1PCC!#Nc3eu5JvH^{!4~GlDg78b zhpV)>rrPPA?tYz`A^R%!8Ub;A~qTRf;PiOf7Vo~sjzs$I4b>ijyvw!5m- zrGC1d(Mpc$&^w?q;$x4*ic#Fq7);dZh|1_BP#GTrn>s~Rta_O`~* z8>d31dqcSf0$8>yXSe45rM6?+)_1Qv9$Te0jL-p}kidvQnL1GEbkYf|b zvXX0%k7A^6Jmel7FC*n(W0en@y6pmNbw<9F#A*rV9YzQz9u!QL3dx*vN(dpxLBcV)RS zqgBXjwVdL&80EJZHL5VDx^gCrQb!$y#i#UMNi7O*vKVE&=XtvBiNoIXiR5FdO~igY zs{*tnOpuc8Ng4PgBw2xEW#%R2B;+L}WC%zNB?VjYbkQIonxKo)02M`Bk)4;HjNlpA zAt#xw$xO*fNyy6=d|fzL2v25Q8Tc3_g<+ZsX~>!Aoid<;1XrbkSfB%l4yeYogsfEi zIGmX5z=?)1Se0nc)uPmGWYKdw*`8s~w=0QmN&;E)NaWe`#h{K49#TCr>2)_bJEb664Ep5$wK{i z&=8>IB;@AV9Z3mUI2jscMKIJUP|urz>SjuAx;-m7V=~?*+eAd-(_MfzAt4tvfutrG zs)Ceso;|4`H$8u{qaZiKxY32ibU8Ggsq?pJj!-lE5ndzB! z(T>S%r)>ju;)%@X{KkP4l~dm z(Cl(2i{u?dbeP$R;?A0Y_K<9_10)+Qoy}CFn$m%iosgfOo1R#JT=INT-UyO6^6iuI zMLQs`mEpkgRlcK{j%R!6<=yS@wzcTn8Fd9(upSJ}Esf zKhF@sPyrE43w=fO7%)yy3#N?@OcqmcrfWVvk;)h_OyFLAZb4o?V@OXyM`yu9GBYPT z3zg}}OwY^XiLGa;AQ(9i#6HQ6O3Fwv)0x1~@sSXBUp0X3iqP60yb(@Iak*NSBn2=wP=SYDJH0Ij# zvI}z2UfG^06lfMgtz@yiqmVgv@qUo`elDi^xk{jq5@=->NJJfEC1+2}%E-pU2>r)M z43=I*wnSnuQhN!pMj2TfvyhiAqZQ=g|4g_=bR z*xZs5Fj(T{CTB7hm}JahW}!SN6a|YBD=!}lL{g@`S%zaXJ7dBGJlPTwGwj-#O6(-F zn20I`&pvh$kL(#rwu4z#luq7cJalqYlNS$dmZIK3^rH5b(sLT&qpcvvs5SO`syf*$ zgp8U*bUl$~k(}J@{OqLcjHHYN^wnh1`>3arSx7u7*~SK{SUQ{U%Fb_3_AN8L;!iP) z%b4Ud!gwaJ(=*yGW=Tx+vc-wddU>8|zRRp5O^g-Ok>m_KH3ujyr24NGFUT5~g?{6yb-jc3FpJ6V$DU+# z(9_NLa}y@&2OI?BX$% zlWz$2ZB#JVF2+P%W4}fPQ8Jm(I7mf3$SjC1md9rc9zrVXMvn9nj4{iLj?9*lo1I~3 zjP;W6X-0a#*Yr^<&MYr#6_b>l3{1xGAk0k2N1M}I@({DAI4wOd4WoiF+UPwe-Ymx^ zoRKiud#vHapCv!kESZ;=Q7{S5?FotKVdGFgde0cvZYiUea0VDJgi| zs*%Ez){~He5Ip7rwF&u-^f-)W@;ZdqiFhuGsTL*LlEYkxvfzx4+-P!9J=wX*;{8kL zs?+KOSImc##bf^@5l8;yyc|1TtW=_nJ3*SdV^j;LPYlyazk>#Y{h;D;Pkw8I4^zSk zcniW9F6Mu~pg3Vszoe{G|I99CpUvE=(E~vIPocq)pMw{mjEqERci6Kgq~~I8G$9s? z!SZzUjO?sb{$pkm5)p;;xQk{cR8^HZi;LXO%8LB?Ri&8eg+%ngt(^4a%)E5*ZiJZu zCeQ_Tp$E4#>TsaFcTo2cNO zCV9!2@CzO{Fm#c;yvccj#l05HTqAkwjN6>hA}gHH;>}gggsF+Ic;Mq5PiW$<4>!^T zz(7T%L!Rp18`lL!xp21#r%wpvnP8!UEYGi}x&UN8BPVGhn;cWZ_Ywy}i#L<(9Pw5V z20o+3lraM>HAJ)!$jHWn74s&KvhRl5ZzKCT=KRY?1!ic>C8wBBrzVn^Od+*k<(5{J z6&07dk}9jyN~*Jfuda3$CzsA}R$zIHk+RXFXzW=9nV3+9L`-B}k{oERtgT?FHKia+ z){LIpoTLJgTgq^f%C}I?Z83orsbQrfscJHeDRM|e0TjDuRhJf(c-o0-CX6=---2@{ zWFuZ-2pYl;DTgXzGa62gvy!k5iZg=biR`&d(%~&3GX;S%GidyY2^pvshdoU;={&qC zp)0UYG1BLmJ&QKW7eR3G zj-7=K?xJ_IjdH93TOViypQ&Rxb0iZ(z`GD)lgmrb%*o(q6*;Pi;@}q>DDZre!E`$$ z;&l}wDZ`$SRgmLI&CSLy<~2$73{Uv3kbFs(Y%o-b;pA2Qrdf?>8LSx5RmISAIu!A( z%z<$^Im3~jge<04VAp+FnIk49CRVf#7I-ll(`-}#TMMt#Fn{1@1U6uPjAKra5Il(| zh%U_U6r!^EJxNt}V>_Lsb)W087KBwA>>0WGt1Zb@|Ew6Xs&9`$^Vh$4Kv>}cf8sM; z4sN~l`(8JkbV}x!rxG@6+O0zVht6BqT)o2<`04AX#TP&D-abv+DfscX-1tUFuiSq> zWG{(qTXyD$z-=G`?9ItO?Vc?Qu6%EB+v%f|c2B|5kz4Q&Z4H_^=l=5^Y5l>7rDv^u zox9e?Gyx`A2 zwQBtRr<`|BhpR80ck{pc=3#wC@H1vyboC7vZHlg6J9O-_ifDWI^^ZlXG#vX2h?h*;QQM5enapF&V2CW=fXBeTogX`(76Lg z&jt8y%Z|k!5cl`Pb@_UQm zYaea?>5*5QXI?P>tu1%$eYi6W1PFf7(>umpwj*K4gX_LLl)P!%I+O!|A>jePE(jn0 zkaN8A#xtg0oj&b*)NhsGC%)Flp4aikzg`jd(XUrL`J^4?Aov&g*dhN-@TV88-_m~j zqd`SKS8rbY^(|KdRfcuy@PKcA=rDQv`L^_>-Pe~TO}iNBxm56J zOI`oby_zQXOkLdm`cdiYuDN0IXYE&Sig;-w$^ifkD?8_t1%L1C=guoE>a+g(UZ?aZ z|MkAtHEoUHN9?<9)6PQ&9-eyLFYeml=P&?m7yKy$PJf`)FCm9&9CO|bJk;$?py@)X zzr(uN`a7pB8u)C?E6-nY)8#!e^AP;I@4n$L0T*_7^z~)K29KyqyVFxQT?K!BdcVJ{TpN4A)#EO#>i6{BHJbLC;IHU1^Ns6rPwz6UW9u8oPumPV zC%2=X?F%n?C9>^=A9g?6A!6MXxyxYlNAMqZRs@U~HRs-5FLrqUj7hVSH0>tA|MS)@ zvp@c8=Z?Aa`uuX~z|VpG*&+C?AABU|s-)PjSKqnmjf&}gZJKr_)_=nT_N?#o!WAW# zO+9Dr`VC*a6^44L6#SVv2bOJKeea&ovWQyw8ZtP(`|CmNR==C=Z1vN& zQ?a}cpk8>uZ#%c1|9J4;t+m%po!X(tcC@PrfwfK>eLhU3_cl zvbOhL>CAm7z0FAjaLAM3Pfn`K9eK_4(=PiZY}K_7UkX!Z_X~b>>+PTRJvpxTllkpG z={Xe4MSTA4`^@O`OU|-J=Av1(l>97oigc5 zO}j$yADDFYn$Lb;a4`A)Yj#im_vL44+E&58>I&z^Ua9@dANcvR6;r=^9Qo~r(LOw2 zUU__K`CnpYeSXXDlV-mCw@t8aCioxryXo;uAGj>{=4rP*({=jLI!#+A__JrF z*R2@R>8D2?Iq(x;AA&lY1djKVh z>4eqZ%=v;p;}@;XfiZ6%`efIq>+U%JDvZs46a0Dm$8>)2qiM;3!6Vi4UM-GzdEqbT#9oH-&k+29S58|O@NllJ@5B*p_H~H5OVd^fe#GdVhsvh@ zWy-iimCxOI$pAp5-xd5lYw!Q%x%(c>>$YZJ`)9g8k9Kt$kb~g?i?_~yBCO-UpFfYf zb;qo+SJi6TG{Il+UEVcgJ_xzy!YAU3*3a#Qdc0lmQzGtc-R_JR_VgcfN7YrI?L@!+ zx8N^*w{6EKzP|Cw0k3}X{L8E6CE~nSj7{MIPxqeKc4z+30huRVe{FK@tEhLk;3vNo zwPJ4f+lHR9#->boZu(;b0(a2=Y~;HT`IoNV()+YnyH%ho8bHIY0W={`uDlM zed@WYAAjF?<2OH^-n~D@x9bJ})O(h{ewyo^lN^Iz`XtBJ>MBk9UhsYQx{m8YJ-&Ng z?-2ZjHzkaItZGf0C)N+ymGRlGACOM%~MZLpZ5{+i!u!lh@Su0 zw}VfAKBdcy1-m|3ai$Z`LBY>+e)(wa7{|+}$DKN5kh5;NradkAH*^eoclF8_*B{(l z7O?W#ZD^aA)IrZ_|H=wGGy2`%Ps`r?g?r2g7~fI_f7qpOJW_Mxm22~U>-^rUpT5&a z(=HeM4Pzq@EDyx$CXrqelEZ z8L%V4fB5N$Pqyy+`L5-ce;YIA~-zNPo*nrFgdz8Zbe z!x)DJe_YR-m-mfpGybi|omc(+t`7f%JqN)*@2oFEUiur0yS59umo|}u% zK2h~QqdyVoT&0%wXE@7BT~Yn!dGGUamCSY(&UJdsY7`YZD~ii%N=gf>tBNb!cxygB zdozpNvzoJWw~6#2)m5d{Gg_zxxh!(cuPAPgnx?H^^QEsjTAIib5_3$pR*9tGaPk(_ zKgzeZRMq}bHzH`L2HL2F<$|OXS5`dzG`KtT|em zZY^lJ&dTPfX(C7E#q(OI!Btvai!9Z)Pz^`^>iJdf7OKH#XqWx~X}X%5E?bkail)^x zQMScwx-HC4Wl=MmN)zco(YmTCE1T8gnov_!?V8on>cP4I4kMqbp72LqvgPHj`7U>9 zc}okothA`c-O?_E;>F-!+0qGAm1`CsXd_yfCsuZCOQ&I#)6Z{tvvb#0*0i*}AU7qI zb6ff#LZdDzncea^E>crn+N@_t(}PRtykdQzJI0gTV{QrOsJkd%DqSsoR8Bt@kA(kY z?@HjKD(?SF0wE+Qi3CNwRt$U;T$9^+=s$=bJ^yfP}#^)R7HO3m)L%?PxYw6|tucuz^y7-&H0pc5@C&$?J zLx#7ba&M0w)-D>u{wL;lPYf40UDYsP_NX80?x?_E)}y29x*jtL)LuX1_1>y#<7KOt zZzNngS7oojI|35iB>CU>i$hbP5T9-f8JC91vbGdtqo`MU63>+snOAU98845ewt)>*c1o>V25qxljJQ_r2@SSh`A{ z#~5#33;@O2-Qr2CiS?t#SLb%&Lm2<#v9`ujQ(h5sPpQ9{=EZn&Vb5^->g!_dE$eHR z)vSnhe86;ud!tPu)#1Xq^gE!JA8mT5iSZ)n*D}`s8}k9z_re=+h1Y|xZ&7Pc4zTNY zuMh^uz3x$}E^x1`E3b+5g~wO1+_{HG*TvuBGPk$JU1d5?y?clC&GWvFI3bk23`89Dz7Q8TIKWj%6zr;UKf%zweU6t z1b>ej*~JCKDf59Cf>$tOewHo6y{OK1Duk!b#&n)-r0qPRfSwAO@X5pkY(3QmeoYj_ zww$a9HpQ=*D^=M!K~hSeRKzi*SHV`ovfIWoG<0hUkadFQOz!e*MNJb^^Q z>@v=n9*s3HLx{2MKwTj=0c+sg07{>Ub+(ArU|k|&K)cZiDz-j`wN1o;2G)SK!UUjT zcm`4Kc7U$Rw$X`ikVNwq=)*}gSq8`*4G1~yVZy6K5G0yv5J8Y=vf^eetlZcEqJene z(IpqA4Q;|WIOYsUD$HTnjC7T|2FE73Fhi&>2axI#*O2*EVg?j|!+;-R;ZYlb?VE-z z{U8f<8S*MfAcV9HkPVR6LEa5{10;{@Mo2aph(y$LrXEY7BUqtJ)>@VB z1EoXL_XXdhI;*2y!aFtgCjxH}aRx-{B#{#L`x}T#o?hPXg^nk{hDG`cm-%KO%||Fv zn}fB?cMf7UEa}<>Sm$8@S1r~yEa`#+m5*PdcB|5DLM%tq=LOKkz^Rak2LLtaH4H3*90tkTA8^P(732w!>mWx! z-T?_1X5b#kQIIb}Wz1>=+o69Rp*@+FSb86z#8iELr3Ao| zeE(LuZBdyJmyhw{MZUIL6Y+XI;aw#E z83!P%=qYxAK=>)1D7~l1ZT9!eZEiar+re{<=W(l}B?+6iIyPes-R4Hewx;53jm53p zzLw?jJU6t(HDdiNliI*b|A4Gy1osbU+O@mXc)FV$Ek=PBQJ_UH;J*Ob0Di`^y=w;r z{%XTC6CEA(DNT-T4WGxM0XyFd+uUh^&7#0&6mV>tfGaSkkqd zu%3=3QM(;$8E2PgzboB2*pUsXbS+wkLcTsWg*Ph0;A2BO zlpJgu6V{=y3?H1?kYOE4Ic$|K(WS7`W@MU)#i$(7z3oyC(*Mp6K^^{V)u-@Tt`e!u zIO$9+!lc8Lv=$>p_H4dFwCaj-mrG>dW~4<2REL5Le1l+zg#UCAeygYN4@++gOY=cy zVE$kS)GTyz#dF3Eh_~#obp0fp4xUH6WdzXKXm-dGA@OVl#y}QAj)QbS^6D2sRzgmN z~kR5Da?h;g`5XD z6LLNzuWczLFCF%ycVLXk4vaC`;Yb}j9I0c6BXz7>>PXlvb*Cxa=}I?C>CRTV^OTNL z_hi|XN+(`jn$ZN&A=z;)pF(eIbVv>C&Ea#e1g|GH%#B$ZSIP8J`Mw^~YpiXqKMA=; zbeoHBF{AjRkwlLIbDBigqrZ&kJy1hOTzx~Ce+R6UlA4#1B(Q1y)=Ke3e9#Klf`Ao}T<5@M4B(v8~ zi2pyV(YFY3!dRQ{7GBMSc#=u86hn%*Tgp1x!tQ!O_|ES{k;euS zGln1|zHwGZsTLX<{^=Vb^iJScSn!V8-Z<@Eql}T?ET`-Bu#~)lHJ#Rcu&9|i89w^g zlWwDo)P$}t)azlX&=wAaCLvxPD+bga|Fy^wS~{58sMo_%p;sprnuK`1{P9|*O?#wJ zUY(Do1vUiBGiJUzye0|pq{wEC45{Mkq}N_}m`t13Pw0D3)ol9Jc}~|bS7>_I$am9T7|6NKGW(d_hZyzlfD|6JA6elf~zvNTB&Gq4h)jSj#OF3rux2gi*wEz3&H}qLtJq#pI2Bw}j(nU?j4Djd zmLmz1GxGE8Mw!L6br`wTOU$yLUIe<`{L^O|CG^1uSwzp3b9!OPRJ(VPUJtK}{M^(V zB^XSkzY6&ds_P3l9b&4xX090AuxIBOZ4evsUFX+(yzYWpOx;}RUtrJ4(p!~XG}S&e zzi8^L*;8lOxzA#*JY2cB@^V$nl~2VMGv?=tH$i^>6t2p-5_#OgEd`8-cjJ0-cO!nBE99uAC=Vj$i%*`8@n;X8y@PveKkxBgIBQ6C69eMXr6wz$QH z2k&v@d3}h?HZv$ z#^~(6GpA2EdDvci6IhEQTdKv0zkYC$m%@tdE1Tz8QttP|PnWNn+-I}Yq zLd$g7GN;GV6w8%Buik0OhnOvMYK1Lxet|7hnEfwsXWBBwbRw_2uGZ^68332+IzKL6 z_w4)8Zv=go|F9UUDEC)YFLoJx0X?f}Uf~R1*#Z;aKz=Wl54sYdXZ14EW4nLc2%tCk z0?SOiXw#Fxc6JY%AeD2@o*{Unsp_w*9CPP_F?y~ezp!L3*cr)E$;}7po55*_PDbhu z({(yYzO!U5SSi8M2DbY_+CgbcMc2ojRry`c>N-(Z4_PFSMES>5d7|Q-CjVEYPaB4M z>#J&OmS7x=>3HOx>nnFIbFWfqubw84BwHiefoou{i&EV^3DesW*yR8$#y^>IyNEW*(XlrU*B>UWzLLbR8 z_nOp4u(utKek2;Z+Crg^WcPYX=p)&^_~sXlHR~*)k7TvlDD;u6R&7Eb$zCN{^=?nN zam1U4uY2UFSLc`C^SKL_oEtH87mdB@Z$cl*!ZZ$pY^iaPY)c!2K9X&zP3R-pmZo5k zEj2EZeduPPk7Nz{K?xy74{FiLXnOfDE%KJip3Q#f`U>@&>!j;?dd^eQbv-?1 zu;{uP@nG8)W$rtUat0loRZo0k)Lgu9OZVO|7EPFoPqU(b^z-CIsKH(tG zfY}GZ_<6?cg5ZRMvBo3;?I67G(o&V8rRgzX84#nDCqX-Nsa-28*6P*z-a>>y@{{FZEs+OtplG(TJvHvHvk z8%H!Zw8l4Vi)$)wNhlsL@QFFQQ??^>f@8oHCA(!?u}REX*gd!erGq;*4(*8OJLims zg-yHGJKAvwNpp4&zDtx29 zQx;f0U7&J!RT8yUtflS?#5f3$sQpLj2$|zuo2Z?In9N5@waiEGn$)dV`EFFYhg3dV zb7j6)mF{h&;}|*S=L-2k^UCY#o9aZO4hii18I-%xeT2w(=x0FGCG( zB=b~`2Gp3PrE*6quncVyl$WS2als)&0r_IB%~-Oq7>E%>1MwK88=y)-({+-NaeNzU z^m#E0<1!L+&XY^bIRTz*dKp$65y5e!r11**v8)gp7UApcoDTUSrg5=GCLMA9*qtX+dO@AVWh?}D*p?KZ4&m7u#*k0on78k~9PeyPWjwMp26tdDJ$ z_03Q^KG9Nlj?y`mj{gO+Y^~B=sC1Vo9WT4gceT>ptaP_2-GfT^h|&?EBg<}6x>>z9 zaVYW~o}Hf&a4Vn#F#>J`y*oLuz<>G10dyhF7H2$T0FKaxjlRMZj!Qk2_q{2Y?b#Sf zL@7R?v|@jI-z~G`le_lk=`WdzAZp$h_W&3cN*$qRN)W)BosD-ChL&Q=XitJ>)8e&^ znX|I-5Nb!FwAj1Q;BnMaLo^ehNm3f8Zt#Fo1Z+UyqhbW9K{uj;)MTo(0m#84uLrh= z;dDLCZU%516Ns=cwj{*ULeKExg+sR*wMb3q`b<5^Qla(meoTm;r*B_7;E$(vRZl?A z$5Mm`mHW$e4Ms3gk8wsHzIW@AuIhQ(R7xJ{+qy;`DHEcz7FwHVa}ZW2{>j9?;`CDT zDo2ME#_5?vDUpAOQA|@c>#)N9*d7Wilr=|(6%zB$AWDfC(fBfmnoT$aUa6kJr}(eu zG`$8G5FxJ{0HJV$g#p!p`=MHwzS-k*E(e(}W%mz5fKC5eB zRiPdJTMMU_%qrP?V3mR`NK}>GsZdq({NR*4qulGWPk`k|se2o2l{_YUT#gy8(;bFq zY)*Zh$5wjD+W4cGEya)@OZkPk} zp-H`iRk<9`Xyv}ds&L@KIo6pIGg9Sm7E)zaF23Ol;h}j-=~PAlQ=%w^t9f`BM^we8 zR@*Wi(|lY3QG@3x+m=~e2n5H}dA7{Ob%1NQT^^s?mU*`8WZgzA;)`p&^IX6V+A@o3 z_ZWt=sNPdmk?E@*n+fi%oUH7uG80CqtkAuven}ZBuGl9PTS%2|@K;?TT}((7kIz-c zhjy%3i$`}qp;f*>FXzMG9g!zJM2o}>s@Nl-L^p0EyG2ECXR#t6VuU+%0%;K6yB4Nl z><5mIH*Ec2gQk5yF%5sc^Nw2sPk;8prx`2yKeYZze4pHmclc0g+3C~P=q)9XqblEggz3}utVr0F%75SJvG>}@ zroqcMatqT?w#4JFtY1_HM*6zy@)}RMz{;BcqTv{)tP=AOh*t)Cqx@d5Fbx)_p}flG zGvT(EE0ArOg=vVg~27?_5r@0J#>p$t6Ta&kz8njErso%O!w#_e6yfYZV? zlvS%qI{#C+205VqLojA=Ft58{9@vw{3=Zve7dU{9G0X9LH1E(Fv#hUn*Z6&9Q$7A^ z5%0S_8Klz3EVHdKOMVe_@`Zr$!s)imn%b(`CAGH91sIuJa3&^&6_?mDXJepo_9`R_ z7fiRtEIS_zwZ<&>)tF^A2s-O37VY`0)}C|^>awACw#F>I;7S1SqpMk4)|lnDpDxt2 zALcx)Tc6*WxFY`7W3Eq5n)BlLoxnm^W0nt$`zwG{)|jPxv^5WFAB;@9JayKXr8Q<5 zIhJqD!&+XpheK?fS{G^$=ewmfW@(LC#&{1{bFn6jJF&-upZmvajWuRz9+8Y`%yL3b zwggU!b$2++@e?PQaF+c9&N3Gu>0x?%qTwt@DRix#DGJW=I^fK!kuUC0nTP0NdlarT z!v6;&&%2zlgg|s~G_Ev4!83}_@Hl!62YM4)?A_-$&}`@OY#_?qHS`}9^XTfw79!LdUA0D6;ZtOVuWb4F z(OLV3yR2@Rc>m3oc+k*Cct4G@%5l~q=zOE_m>sQ?k|pY-WK&9uiX3yDv(IqMEt)xd zL3cc7M)5=S;w3Yj2CbPOG&4BQhD2^J$uBINu2ZG;5U{#u^k(T8R_!508M8(blJy)P zOKj^X%-<6{Sj6n>7kUw9k}UIK9%ND){$I5^e&H2xwe9eUw?Bl=KS5+34V8H zC-~hdo#1zG=>)&~RVVn}S)Jf_@9hM?`*|n$-NH`ryX!i^@4ns%es?G^x}9;7wOjaI zfoIq|NSKA+wZ_7&v2bfFyfSt}Q`cVtF^-1<18eb<8Ivw79B*$^kj4(NxA@8S(gpk2 zNN3^WBAtbgGg!>Dm3a3hq&7vnNRR1UWZyt3xXAi|O6Vz2-~_qIQsexo@NXLLPu_&# zS*i-585r5fj_ibutld8Vwep3xjjR|tS=!G2WE^XT zqt#YKCOO)D@OBQGu~yKMt$ne6ysRA_oXJDhid`JJ?6nb1Kf>U*wtIV!a||vN{r&ao zcb>O%^UnKs4u-?jl1efSk*I73q;$4!dqEu1mBp!7OpC*@B{DpMFNU6(5OzM^(hH(j` z$m&BXm2|CHZRJ3FIR6$0^SN6a7KRIOI?eoBYq5Po82=W_kbmn}kUs8CggAi&4jJ+i zJY1~38OteH$eyH!0R5@=HA*ik_f#P*skY{z;nlt+IFg`)XQauuH5e)$mLH24ZE*_9 ztiz$^8K4QIy0)Ues@~^ZghI3@NcF#b1 zm`romY>nYNy3Xe`REGCfFm=^e`N7>5^!0AEgjq==MwTzO&;!ab=@*u}tCI|0Z(#$2 z!RR#+C)Y?zKdyq-WrD8eCSHf1U|~ZI1J8+?wL(gAxk0YcJ&O%Ign^eU>@XIkfo4kLoR?k2a+6iWsqdBTL?)v ztmTlaAs0bj4(Wot1F`~=WM+#Ye*swu$@|m;*)@09b!aVsX6Q+OqQ{aoxQEd>uQuwj zWbI+4WBmssZ?d=&jHPHVDIJm`fDO$=UB%}{GU5FYW_!@27%xwQzTP_W*O!DSLOcj2 zU{gXo?`sTwXqnH9-Xy83@*Zi#4P_3I)KxS$8dNiqdg%JhwP%{k$T%K35hQgLqwF4d zExGqZ%~|cPcGdA&U?3S0HE=8@6+*-4aeA6U9%G);uoOc(;J!r7IuTPM^wDaLPQJa)5P8^c3D=!KklkAKY1JgcbHkz25C2Z|-)vd)ncj9=Nlgvia;y!Vx zATku^U~et%0sOnu;%*MnEbi>kKExo&9vI%nO0rD^;*_tYsOWK_kcCy>iak2YX5t`Ds5_C)BZU=Xrg+x zf>m=Xhx%Z@?94I@v+#<;NBT3p~2a4FVxPecUrcU}jt+_26vTPfI zOu`_27Hqm4>TV`9dQ#Ktv=X!^}5&mi`HI0>;H>Vu6>b)VbRi^=Lh!+3wATC;{!%+gGqT} zvhQ$Mi%puwWR&43`_5CtH^9Q(lmtUG%*08;Ox#pDWUk4)yj9o;P#mRk@>-&Ko}ynH z8b;GKTEV0ZnAU}GdoPEQc|mCbWeB(TI> zr4gA19UG3`u;lV!O_p3*fNfCukwtlY=)}BBPfdR0-6Qj^$zD4G=gbH^kF?hggW^bC ze*)~1Jh!7D5f{FWPJ_%rdM0EpBy6O(CR(5taw6n%NZM^Lgrwbe4J670Zici&(k`11 z`4Hq3$X`PiLcRn^yX~JKX}5g?l6Kp-Ah9oDr=|Ti8EvEeb^zoY$ipFNzqLWmha3h; zd+kU_+G$UPq@9-TH)yAw4++0cfioZ%LelqAIb;K51>`zNH{`XDOCWh)(M~%6?VuGk zx^JcHuqE6+dj(2LyDRHtjLt%2psj?@n+!)l{BZ29G%R%&B3%aY{$y|a$;3@(O1tFo z=MKV+U=ERXR~ntzYcoh2=2v45rlB${;9(OX)b7fApfkHGvj?rL%Fa2z7&o0JoD)T} zb4GV%gXc+vpam6AfF4xMdu2hzsS+V*LFIEQgQ(eLEaQ3VnFaM?OHKopl0t| z-!C~?hBFso_*53su_m)AqS;wl@EF}fYI4W~ z9XpzT953@2YiS`3&Bre5zdgvuzvlkz-%TM}edl5O;Su@lcC)`IR>AYIA|hW_vl(Jw zf>#eEPA6ZkY zt*O=4)av~`wc7Lq??rQm^2^!LZ}Wde1dgFPE8ISp*Hh=O_3nvZpsuG`bAIhT*bV18hwsFg(d=7QUF`-r zzstGIy$X=!q_mGv!s}UDQ&H}&63XaPu4ytJhW6K2)z&P@&A}UdQX1d*M0#8v&U8}R z`>4uSS)Q#=7w-8iZMqox8wyufjMdAsx<{Z9$Kmsr``tg3x!T5&PvdPOkDOP86Y=Ne zJM;a1?|k?=?3SFA)ht9A0o9Y$?EmT8mj9*V#9Mzh@B40HuMKSY_Jo8VubS5PowqLf zSIhgFb_ZU*qxoO@MCc>^FXiKtDw_YLp9y`W|D|0*AL)OoxF748K73wY+2m#G-@H}J zJ+}4dS(uKRkpZHJ(h(%nqM-$@WlS$`hH0M zm%=UVA)gyD8dt69+a{lR*7R*_`u1YKt!sZy`-jprW&?X(He9>d&a<6rvt__{I_t~J zHqGeHld2qJMmOwuc=sKOSH2YOG(DEAH6X_E?iB5EJ*Lm;rtwf%;w!(!obJWQvgsv+ ze?GVoQ7!lRM#nb|tCO_)BSgBPIkBXY8^me{W0>CDusS1{pg&WL@$1?eF?P$D+xo8hG&)QhtHef3<*sbHA_+}tEPe?10WqQ67BZpy_9jQ_B**P5 z01ilPDt>7F{J8jurMDaSf#IwM^TTg1**#buQJ+b>#10!ByE@yjqq7a~bhcr8!|Gj{ z|B!~&J2XE|**lsaD1z-;{RKjQD2wfiXo1Krw(W?r4RwfZ??lJjj-of1XA)U;PPbHe-I(|&F-5AePwtnp>n6gpw$Yn29Hf?|% zSKIws!+mTP3nD#iajT#&t|;+9lKL*Ru*aW4^NKM>KqyXUrRyyKmcYu}5S6 z`}*ryOwQxS#TUh14NkNV7W)ToZ=TsywDO%fJudd7UTk|wSOZ~;77a{NcZhL}m!im4 z#};hI4SV}YN9st&LjaGIEXBtxd&Sa3_A-Sh@vgCc&}g1q}oOTLjJo z8rkBe(p?FqTTIA}EeVd)MhCW|64W1uEQZI~XD!!f63)kVx zSZli~ShuPW&Dez|Wh9htGBup-Z7SY`Bi`LuioHLCY}+HVZAx%F)abzW47BG3Z8P@v z+?el%%A>^t!V0TzsF9lNH#SI8^zU*yytljL_Q_dMm|^3pTs7|b#t3u zE?FOw>53eyrG<@kvMooWC*WUMqIMEuQdfeQY<-#1)gwm0M!I&b+IpMX z`g^7Ov(m+(OO&-7gqW;3PwDJRSBKbOQS(EH!JLfcFNhH#k*>M%cOrG`RP3*a$>ZID zn5=o1(tWFR$@p`Y`O*=S`D{velG2SwEDd{0)J{PxPwaOFV!0xArpi}=7{*qSuMRO< zpe11CE5tIe7=gBK-o1uyRewzz0fGrMOt{z@j-wkNM%lqKBe0#anvD^`fN%xBZ3Kdg zl{X{98(3)I*2CI(pleP}`vyV_IgEzck~Qwyr2lV9SZaA zd6cY}-487k=z3W3LwdH#nb=On4!xr4a^Esso0POIdXAMMwMkE{f+b~Q+99}(3w;Z!qUUy<#vP8WWJuh6$i-n@Wq5-qn`d_ zSh_E6Wb^h3dipLs|2w?n5sdwR8J14M&2HX)v?*l4S72xA$#{h;t3Bt3yB^f@I2%M$QDRK_ehO$3S>M^6`^~C*yTeG zhnxa=8e{<^sZRmVJF1iBSLUImG^1@3}GTLjg~>5$Dx&xCvdvKaCm$k~wZLzX~x zK+c7X$1yE{OoBWUG8Yp6Q-PBq&xV`~>4fw^E`+RsTm*R$qzm#P$O_0`KrV*-JLD3` z9grT#p}0giH-Tdyt00RZt0Ct?o)38zq!)4pq!02+NIWQkpF!3`J_ZSRV_-AnD#(u^ zFMw=^1SBdj0GAm5l7SJB0sKyaY=F#zycF^j$hD9Kke5MDgS--QHYBc9fL|f&ATNTv z8uD7mYao9Hc`fAKkT*bXg}e#!7091L{u%O4$acuPAmjUjJppnEk*^u`` z4#0IL95FhS5jEjy<_F%rdMsJ{C1SX*p?gA)C2P+ihG!4D=k-{!_7Y-;2;Fu)maLtM zv(LSyX!&|9Su0k$IZAh~(v>S+wbGrhbgPwajnb`Gx(!Nqi_&dWx`&mH_Xt~+tUarA z&nex@O82VLy{mNZDcz?^_l45^SLyf`Aoszy0C^75lmrQ@9| z>zku=l}cBoboiG*=WRRoRNJi5nKSvPq2l^Km`Y>RFgB0iU5-f}k5g@glMzWY653>u z!kvppYw+L~*QL)ZJbPf#Gi{3}G~WJ?-{D;DxhbM+*PjA3R;CyZv@h(g+UmN|o{A%G zc|hB}n}|>QVt2WJbXFGnC0%2N2vVC6pO1BS!Hh@cktDLN!0oLCqfxLF zV>vP@);y0v=qBS*gFh4%qy{K&6{My{rP&^a)ghYE-XMSyhlX>=j*#K!qaVD?*pt+R zuF-9az*1y93f99jkr2-=m*Mk@l{hxJZ>b4gKdmQOO6K}dWw3?S+z(q4;@K@T44r+~ zAB-|m6T1GVo@A-e7A8TH5YNv*hClsy&it85nHSCsKy~1p^+d-0>m7F};Szvc&mDp#@o<40>!OW?4`NuPP z?BtAsDU&k_XH6cZhcEQiy1M!DBMIeYSCojx*nqV4vH_K7%aPM_OV@AddsIbF52%RFw)ZdO&g zUCZl@a-( zBj7JWzJQ*WJw;~-_$!g;s_=YK5b!_I^B70N^Nd?yOrfJFzjWsOnbW77Jgj)$83l9a z7Y+;6&YoE~E5Fz=4{Ar@^!fR-3JYe>nm>J3slgfFn{PXv4~QJq-`_~{k`-a^2C z7YO+M%XG&6>0VP8Ca-nLWfes|69F3)s1@giv3ez8^dST)l2v2ylyHEyjDm zqFDPMq*x1qd+P{r1@{Ih+(3XU2VUCHz7oQhq7k2RIKHrTwD-?2R4LHj6-0Y4!G?W+ z_69mrS~)vKbzhEwN#TR52f*zilK|X445;KFaN7$gaXQp+HpY?Zwh62bP|hC~fO`ro zwtxvIIMN3`F>Uvne{II85D0DB3fo@9kct_OtYd{!i9`m*Hv*VTC^CS#02ULNt7qG8 z$_C&ufVl)F4}2mu6qUOP=6CH+9ba!hZhNo+)6f81k{+X!hlmDmLQQ*(QjQK4-lao@ zcU=Lxye&rkTLcPP;;4s+M#fKcZ1Ei-q1b{;FnBB%;jtkKnka37k>1kq+c=!8hJVE& z(^@`Ev;pi)mT~T*;aO@;7i0o*>;YuHKe7`dzatDXzoR4!kq*dJCy@CUu!WC>bQ#xU z>^m?_q8Q!f3E+AUOUCa!Q{t(^8VKw|RLFe%&JjTr_zrcat!=IcNF6;0&nRH#Sc~R- zN0@H*m?lhjlVKLtqM*7*p{WwpJyOJI2RlK;fXmZp^hzWmPawc0s$1qe3p$yPma3yg zK9|b360xCJ(uET-cIJuN$5;;$F%F-O!2*N|S}JuU+mkxd>`5H~08*Eubf+jC(b^JI z?Nd4$_NDG>rQ4`<4=UZWO1D+%Qt>deYfjh3tJu|u4HmlV(R0b;*oc^H)zgUK7_hvd zwtk?t4nz+xOB{iiEHPc_N|kPv(ydjxjflaJiJG?{CXeWkYU^7{_kq%Vu5|xaxpy-X3~J1Xxt8@4fo zqp)}542GkyS!M+CQVwQgL@=YUb(XgywL?-_c{4J+gT=tMAo|^*unBDDnW1||81`{C zgH9KbHh|i^g@<7=fZBTt!6rK=ST_YM`oO?je~6=IF!0vj%A`skhAYZoY!~1+Q<~m8 z84NsgLs6`EfG8p*kcl5M@uO7tv7{N#vhox8RX#-#VTRm;G=Z&!RKf=;| za9cAlzra_2iG&@`ff0D$6L92!B2U+6z%0-zSS29l`i z+aSk5J^=}+W8ihjNsxbooDA6kX@^Y1zVabYf}8?b09gQe4rC!@IV9Q=SOGZ|ay8^M zNRm>X4tW#g49G_yiyic*Y{-8@o&$Lpjuro` zffFE|kf%W|gq#ZLg5;FD3dmYWH>4lZ1IZaMOCj%q1h6i!1+o^h6|xTUeMp?6Kp$M_ zm5?Vuu7cz|mZh)+SycY7uka!meTnG6R$cG?rf_xnEXONpA?}mI0 z@*YUev$+?Nb8GH{B!C3YWnwnRMdrQ$q>ak?;&nR`1l#W+V>Sie2 z0;M}g>6R$nGNoIgbQdb!AFjSU-V{BStR1FwM<^ZdLjC+H9q&M?D^xmk?g|>cU!c-z@Gb*a*9dut zBpM0M(Lf5f;SU2UjaMyPUQ?J|m^0IqL^KjA&0c&0w&a}p)f*Bjed;qW;juM`NT@XN zWPHP7kWlH@Uq7Zwrp;@fdxiv!z)b+7b90d@LuuSNSg7GOD+$ryUqPFuG)Rc|KlU>$ zr8{-4MxQAHYmN?s9rB73(jPq$eiSi7etMagBGkh7%1|XGv97D;1 z4<9pXk($u8amrXq)_kMN5MDFy>z>1x@7C*Ksn8bo6ZP?M~5%d`7nbhC1Tq`+ib!hreJ%|;LCqO9cK8l z{%v7~FK4L?6280#Xk|H@((u-+0LO*Xic6->F3z{3caIJk?k&La)WRYlj%O702H;qp zngauHoIEBcXYANLKpc-7KVDLE+obnma&v!*&tp8qB1A(Rk5c!ao+%3Act|?t_95Te z!7>k@$Y_XTyeVrpAy1p0k3DiU#Bmbp>W6`df&6qwVE@sX_hNE=pQYzxQ#(WSx{zl{ zcs|q9#Qj`^<$OI4(+s_e=v|M$p(-s-eDD{XTvqCHdwpf|bZC58VQtL5WOe9#tuMz@ zH@bGwQhXGhlBONYQ<#c_IpUT$C4>G|N6bCZHoFd#ex3_FHA`#-n4twftX}Osi_Y2t z^IBlu{SD@o5AS|rvX(Oq?njS32%}L;MbE@;k0j4{OWp&g!r|~)vI@U}PG_$vp^XaW zg>Xu9H}PoZTwi$?bkYVraf!EPiOzCt6!hu^2?gfyiX#OnYA9!RQrcT+`>JxUw|0e? zkA;3SiSvmyx69?MtM%0QG3*(^f!tN4J?Ejv@2;yZukny0PEw(71V`Tygzgn^XMV0$7Eai{A9+%f&;a=Pu|Cz?)Qs=E*;w`VXEynPa&o*M^ zo}h+ZwH5AiJb0^o9$%TSw%+SPvZfZUe>}A{Y-G%o&)E}A{LT{ao0DbmJ1f9%PF4`` ztI-@zU{Q+ps2ukni7^3`mBRv`^=KTW8^;mMkXeC*O!^o##nXX0= z3_z3UIt8O-Gq!VKFzQD%5Ra5(flR<|Bn2Y3+mQ0qps_*TN4zDZx( z#xF~1#hUFR(1c&^8M+>P7Xh~QNJzF9+!g`ui)QKQz=CJ>ttoE_nw=PY&e2cFWMyAxt6C zlq?JddJbtyPW`AP+f+o4^3G+Drevo+xFvN)YY#D!nlj<-m48_bwu?ZsERRT<$VDVr z^IrLvohmC4cb2UAJY6G=)MjoYe8Be5I0%X?W&4xQsWV8O-`nAD{7S0 zROT|&damg;9{-ebpIcc#WiCUljmgO!J7EtjR@vD(xmhBA(3|Xx;gSo7#~#gMMb6=n z5XEBk4Q^6;lg-wxJ-k8eQ8;pbjt#Uf^+R95z^)~l#i|4OK1M(Cw_ze1EiSsn%4GD0 zjveud88VNtj>dh%?r1^}^A+|WAFyUxNkl%o-E5O*d-`B`BqCpQE}h4a?@2u`PkCpS zx95=O`S5&EEN`#qdDspHUJqRQ-r>@@sSoK!_k-oF++EjO?qol<>~EI+&9cAkcl(>^ z5#Fy>xF4KH*>IB~)5oFb@51S8k6gKS#qwiV6?|UpB2a=cx^zS3c9Un}vR1=DWW<*R$%2w+CGI?VGPO{vI!vLjU(iKPWo+ zYUfoiJaO^H|9<=FLQG~rTT|msTX){Z{PV8-Pnxe!@u*wse+{s{&|m!eN%yUJ_u&PD zcWVC`?s@cWd{s&P8Fklw*sfBsiqyF0mp^+zSQb-G`1tWRM?86F z;%C1o{KfxWbrmStg$419;~SnF{K;eARQ5Z6$l!M0SWNB|`bf*-6k#bm{QfIn8S1jg+9`<_?6H{S{7&FLo1qP@m`^iv@Cuu^pTduLSZS4^eDSd=p!wQ zuM2&oWpQX1mc@3vO1qYWPz!s6IUj-hGTpj#Y6{K)o=;sv&0waHCvbVswJf_`M9 zIhqA=h{2ZvSFv|BtiDV5k-e*}1z#m_A{l+-lVW3r$&YLc_=bcZ*&!i*WFKvEw7lBd zRQzZ|Tl}Qwe1{mxk=vk{SUh04PDr$v6~eyyXoT<8Mn^|y8(O)cB}$3*hSeRyWo)Z( z8QZSapC>fJ^=n5&friz{C$_al+19RaYme9_-NJJIFB;zH*hc5D{!!~4+h8Q_fRQ*I zE=FlE&M>(cm1nqbTNX;~9AV^z%hS>hY_LYT6d#?iDR-kU4sx?}uG)gSxt~WzmbNr}5{JEYbh5W?*iE#( zZJy+43E5A3a6j#GKd&}9M$w7uqrNo8iXWvD*Slz2-dVrZ!HRL*Bg6@Y$69rQ*|v7H zZA8QgR@YEJQ@lsQa`7afE=etgtA*We6T20A!^Mfb3wg;R?^|jk@AM|eUC~^!uGzva z$OK%t21yaN0RsW^jR-4+GgO**69sh(Nm~+y1I-gfjMI^aV@aozJmHZkk?!wwx2p3I zqm?Ov>L)gdP9t4GX+C6VL_dcMmLqZKfn?%#CxtG`2x{c5=TRZdh+*FxQ| zN?j2S>Tpq_1Tm>2>BJDBTcdO&o{&0B+0yfod_wA;Qo0?8(T16>9fC(x#%3Xg*>lhZ z5F-{LUAqS{_V$U|FAm~)c<9ZD6cQ#( z2t%Z>3{f7Gx3dW%C`3x|m0RFaSbH;aEW|?Ns~&IyyLM+9wl#`(Q#4nSWm=C5%V1E~YzRv~9F~3{UgkGk zmFD7z8I1DeuQI2drnI8E;UB9Jc>fWBQ~*VWu0KJO2qc{40BCB2BhiJBqmf<%iT*8c z10ShsSCekiQJ7fi9DWn_nJjhDOI>=>^e3q*quYs(EB#lWO-{=%OOcnf?hg60uoZ(6D^yz_HAR8g? zg}f5-5y&RUCm`2BZi2i9@;8thAYX;VKyhFP92B-IV6 zaW+C0K;8j)7UZ3fwUBp1dLi$D9DwV1FqY^Dw4Y!L`^Oa0=7?Cba2bjo1G)#XW-M8_ z3}t7RqCJf@W72u(Awu^&){G@<$Kb4SZz8-N4Fx1xhzt>1a8S z`J77UQaX|t$+AAByF}?4lS2gn>E@qp|#vyf%|G>=zW<0e+V zexA7u!C&r0^-D75QOiBR<0r(idM2G(=83bm>k5-F+M}ptgwIW)aq%!?A+-$metU=} z8=9Xe4XfjSF`sXilGpcmszo4*kb&<;MuIJs35kZ!>8k>1Wu>Fm&gI^QSVK))z9AB!*`qNMqBT7tU>ZJuD^L{7+pY z&xW~${X%Nqnp}$xRF+XiOp!SJ6EUz4O6h~2EVbL_Y+lQ*%HU%mh%I-VnHGZhJ3$aDj?ub`MOwkWAp2VG%FfCf&FUGxz;Y}8 zxT1LEJX&|TnWz=aJ*#BCb4qDZkz=lN_8E@3MKfnFzyvtylJooMvGcpY2uA__#tiZ0 zaU6?Fw1SSufCMJCbr8~^U2`Kj0LcXy!kJm%oL-0vl9X18l)uvJF0Tl}igi@6pd!L% zr`)2~Hl7+!?V|d{7q+=$LGgr^7n_lXBQ57JML5d;adn>O*dyt*;_>@z>YG&P}LRynOio8R|=b-9DTe(bT1uQB#0^e@Gq`R&mO-ubnyal0S5 z#Q!2}rb0hDW5WHOBJTq=@3~I;=8=MrF}#lt`qa23kG*+O-X|5+A3gc!VM8wdLy?8B zUE3}_c3KEq%VVeIvD5O{nVmH{t8BTe%v0m4s;_XDSspw06b2hkUE(bFE^$@%3WrTp z(~No}j}cvIG5Gk(47N0<#o%Kx_$>C@mV3J5UHe}~*b>bp5w?u=0-Dwq1j|N8(`E!S zL_^bt;Bk|p0CoWw+=`|WIe27rXf3e~p`JcldIYUa0Ld6c}1=c}y=TA(iZ=}ORVQ*ja@uSBWt;C2u(2@q>I#!}DKVagSbv5XETJ<@>F znxMG-L>o49e>>rFQ9)OG1}4=3t~zwpfXGJM4}FY91Fh}}L^d3dOh~E$NRGD8k=UmJ zNN%5F0Fu>BYB~$F?aE6)0Bi94uWc5fV4j_}cd65+;8TH} z6<4`Fe&<^z0Pr^d!D^#)80xr-hUB)(MXg3{#gC3GZfR(X8(F-qsWf9!^75goj*&nz z7iToa8F<|}5nId(ToHkvZYs5Pahu@5<;{mGu@=wP{=wp|pDy;xokpT@iExl;+%Y1? z^hgmS?&Sn55{)bK%|=@0n~&J>SR@)(=39ca%vY!K0qrFaj}nb5^If6xZBY4cK#Yjb zMD1p*Wxhud8;T`e+m1DR=tS)>oI)Zu618Iy8!NWb1E18LtaQ_rZl2OzfY@Q8?4?R~ zgVNoubiY)(%}Vz*VzerzYe(T3mN8cgfgDbeph3VkuRz6^IQIxmB-Pjbk{1~ZAy2)(mjD#8tO~bo%!8HhNaKPNntSZ)9tu9eTyk=V*R7% zY9sL8BIXvumf9)09z9Kf_Z@mBfw>(8xe#d}{srcCG~^vfXG1;+iDx3v42kC|unlrN zg(hKQ;yaIA64B_(tcJW8vIg>}khPFMg9OY@U~7Gl#8R$+Y=>M4nS|bF6=X8x#gM6x#MT}P8NiS3 zCD%aOAsZm+UUDrYF}IgNE`@A@{1N0j$VSNZkXJ#X{|?ZN@U@VeA<>Hm=uG%V$iG4U z1o8vOpFwJUz|a7h26-#w5XjpgheF;7ITG?NNX|~U8}b~;`ylC#@&QQBOZX+^8py{W zZ-o36L*s&0UI}Wkd5Y2dK-cTAO#9JGmYnF=U-jR8N_W`kw z47p;>6*a`*y6VuwiD2Zh>uCyEYG#B6y|M~2&oY%}J!bT3Uu+5DV!Lzic!6FIONG|M zyEq}9Z)FVK;dIdtiojB#_4I=#*q-iix_^?@=xACdzSTAI9GZ_b30s0ScZbvEj1>l! z3T+{gvO%2gUpL!OW?4`FGSM zoVM6L`}CrMqFGb(nLB#cs2(f#46-|=WU6C&QAuI1Kz8NH|E?gr@IN_r{5SwCjgXy} zl{+yvZ(Od~DJ3=nrZjFGGEU6NHTj>!v?chT?1%pfqce_%*$u+h<*lnl!R+2Q2)8h9 z%*O}IJbY;FQ82rYV#ABbvx;B(2>hFhhS@y@|0R!LtYGJnBAb}(8x6C|$L3$a_L@U9 z%r5gK^4r4{qUAdi+XqGDv)j#G8LPm*owh6@Uv!LZE%N#FynOyU!`QAyo;Bh5qF`*B z^gL__1J5%qaqqD7HsQ#YX>npyV4pzdOkGjT?lD^}dR~j3*8Z*VPNBS!BhUfwUz z!A-`WMifjfJ!5Xi80kSerncBoi~-Ao(%$B{sR-g7sKV`Yc|CRhTJN6t((H=Bme|hY zu!Am0a(fO|?Gc^s_t70?6o~G30CEinCtIwt2QsVdnu~{zn%4TS+U@;6TRG*~tgA8R zh>!1R{whBZ`bbvUN%+W)=CASwp^s#h{fE#;vdT`yr+GA1+1rIal2x`%=p$KWPsJy7 zG=G(Ag+7v1_K!jz$tpVtpVXcCtNf6k+cD3jkHCUeTmC97f0bp`9=hGE?H*v{uYe2B z*nO5+tg?INRL#Gt&b?1qk@@lz`{l%Z8BdK)+Z>DYxaH+RPj>b2jt38No+ageuX~TF zUnBateTR9~Uz9DdYwukw3+!rvUAzA;IxyT-=8T(Q%e0+mJJkl?l)Agh@g{~@Nhh0w z0bZGl-?Xn_eC`m)6zxxXOvk$>VQ5jX$99lCb_%j6_Sga4p;gm^8KR?AlT0AhmWI_W zf*iJ`?HGKR1EOi-e+5bF(uKRlAaKK$K9hFsV4HP9(MTRjFqby0-X_RdH*57%L|hQC zZi^sUZCJfoCt%$iu}u=N{un1|nlYQInXX|z??L!t<5PbqonY8S+%BCNQ65At7#P7U-nBLILWvm{VlhjF< z)yMBF-s)(_Ms4RI;0+Z=)814(1c=GT;vvvXa&-8P<{4X#)aC>SHl|;hdIiW%(?#a= zo!iaJHhVmo9B zJnj*!oHVEK(G@u`N4{m6K&?K_KGjBsNO~1N|pVghy(Jq_Wy(Y?_9J z224E!;&EF03iALoGpEdSI_A#B*_RBPe(1!Yn+K$pWSV42a%u{S%0r;w@eRX5g+WKj z*4uD+f_;*ic=?%$3T7e_kDQgPp4^s9larE#IN6$INMXq`uG;z;sz4TmeV1xL3#${Zy;wvZh@Qy`2{4N@xVVJ=Rh8f&Tc-E&I!ywbg@ zbgwJjdrJ4A(tV+HUnw2Y0528xMJctxN>rejzvf*4A;Uq*b=%$A; zB8BJp2Y~{knH-nF6kLBQZ#5+mjYNU*DW{>lZ{gGJ5(QTIpFXr`n?fWLBTeW>=s6?` zY;eXgi%doID9=5EM1e8J-knbrD$uVK_ihB)e)J|PNDcZ26{O~Ll@@3hZx9aD7h4kI zjYHUR)Mft+KQF2%BK)UkU@2Mir6SE$c+I@Cf;D%%c_RK1Wf@h(6#20pXQ@!!6NYn9 z58uETUbz06+OF#Pwalg?v&>+DBy0)t6Q1@+&h1^*)1lYHQnJ-U@g&P&6DA} zqgDguB;H9(@TQ!sJ>nLWFC;$a^71NAg{C8uX4wn#XU%Y&US#J>#vWjeX4y+lpHVP1 ze|nLfU1#)?20!3*`_!2QvkD8QIbsDH@f=8$(LVJJK5qP;_y!-Jm6c}`fxf}}2{h4j zczH9ri)d(~QR=qSZ-6Lhq6v5-tVX`O#fPMP6zoyZL|3AUr;w-MP+1or<7jB264Z4G z^1Q+?2LwI@5=|6*oTz74cp}=LiG_hp?F_9m9(g8(=QG{vEYBO=q32~FY^e0cX0UPrRvy@;2W?kMjD;lp~VF_0iU z1XtJLOTJ&)S@<5dYxDA*#cqFPZ3U)eN}ZMjT?u`2xcPw}j{G3_;2jr1XH zR4{K2+XdgrwVoP!1xZR3HMq3_bJ_--crz_=&KpTj-&B3q53^hd?#EPtZBl9-k|AbdJTC_dRCJGv3=R_>cu3 zit!$>yixxzdZW&Ygb!s$!iTa=@S&G5UWgAIeD-YDV>){1B`5`YC=Vv_r(hB`&_e`v zBmr?V4JtF=>B4g?ZL{fQQPH=05tCbgq+%Sp{R&G479((Yn7bIDEBtuV zHKQY*g+3qJem%Bo-n8O{x)YIJtcomTKK! zr~zrUta6 z#bY`S64rd;Ndz(g=Q~h@^huDgvI~R&k9!o-Y%}e~(Jkh$>swQ_H}zPu_My_XDIGtU zrS-Xw9!thH889AivIEmnDH*PoYl8>BxGsHO;n@R=o@rY=q4D;A{0^Vqd;W>CsNPdm zk?E@*8`b}Y7^(+*u;IYr3%jefx^A?m;)q)w(01>J1x&Lqc9;7{X9>WC)R+w#91BQ@ z&&RsEV7ATjND|^{;9x8mj`;62%YrG!BJIGuwuxAlY##heITkTKZ~i^Z8w}=s;nu>w zX#C(O9)q+Hjvo3@g-n~*%*`O}z|ITY-db>SNF6PNPBCy*Cly%B_NzxkV;-}MA$(#- zwIW8hPadn+D@uv@1YLt?#Hd-fPx2h}+&(!~uSb*;@$*7!HW_XB)bxynfhWeWPs(0l zpW5ZdPso;rHnHw*mjBqC+=((f?Q#jiF845o&1imQFyF>Z=VMvNh&e>D%T?fNziiHf zxSe)6(<$U;+P$(lOlJzr*K2mKD{!-V_NCpccJU$(<9huu8@>K!8NDo{mu2+Y*G4bA zTe*E@cx<`okM904d3}LS&KF07Z;wq^mSv`wEHjo}Ch^vv%^UlHysJ%9i9l3!-nYyUg`MA8D8QROln^GDX79 z5^0yYP3R--GCPDm(k^p~u(QlK_SP#;$muudwI@73{>{Aue-H2WLLX_Dd0FTq?J|ep z#k@1SjF&I%mR+W7iN{}Azo^XTch^;y*Lcdyd|p=>rWzamFGM=R{N!4!Pde@8$)cEl zi0RO=kG%U<)L~+*fAMIK<;lqMWMp|V>g`#rz39m(`m1G(Bl4C9Bg=!4WtI8}aAqlI4Ml)OHRGhN;1-8uc zn)0eu7r1fmFh9H2>vh-Fdi^JZ@Ta=YZ_AuMtl;Fb5^wDiV7F~Wo+`J`HbSr*6)SS7 zGo<&rdH(tePc7(*;o0+y0>iWCuo$W+_g7UfRz5;|R@1z~8NRXwp8Y&#DIQ&G%<_NT z{kk<~c_55g&RTiQp-o2)Te{}qE1ykY^rQQ&F-ybyx;18Ld0)52EUht1Ys~V%8MD-1 zEv+$23rQa1Jz$MlT4R>xApmW^;%4{xnB_!k%yPevSz=zdHD=i*tic+ybm^06r+WO; zBETSB1O2Tr%N~uMb~)yGriKx9E@h#{aQWz3W0uyKrNHye9(w<_3$A%%O#elb3fj&t z)wJ7T_ezaRnzQa=*PzMQ7ry)HnASgj^uDI;5c>R=-T(f}>o;sD?fd(zfpafkg2@EH z(Wb^tx$)s|h7U@=Y+7y3QyV<5e1@?%p^)~x>IZX~b+w8ku}>MPu3 z>DCz@VsUTcv%Kf*8NS!zzu1#;hy%iVPV`sH7{{wDoTY`cw8kv=q_6Pp z7w0(^&Jv$MD#U`b%+1=vG0VK%@VVi?=!LoAm3uHZeC)oQ8@>*J%YEv>oD)plH7@U} zy4YujTa?Ha($Yd&?q{T>@$g#Xme#nXHE!8@IGiY8az|?1e?M+n`b1)T%kmq~J$K;I z?|q2Z6a1H^#vNq;__KHK_(lI)u6T80_St8C1dl92zpQdvi8jCQ1M6}JfBo2F9bbdr zR_I@fKl9t86TI_lTjO>=aEbp#O=}bS(HRr&_Y`>_sCmzI(l?J3d<=#vG2h#B-*5UX znA`BhkgxuI?Q?hh1prx#xA%c@e+BJXSG>JsGqdK0`>grldo?}YQ&(w?TUOb8ruinz z)hv;+6)uanH@4yIACTAY&~eM)%cV7PX`wA+ya%k2%kSUFC0=EJ5WXropx0f9Y1}e< zf<6#waawYI_+_}UD)%*~Wkqd`JLc)(f3+wrElNv^(sKV!4;N4F{u!~9d=(a_<#*$4 z%$gs5Aj}Vc{YUSgdfjCiCth{LuEf6$KNw@BKNVw{XB^+~P|0wXJ2zSiiZv9XMO9)MU&{oOLg z!72-CX+bTm0n6{-fF;J3ekfy>`+9zOZq9@p37+iXn5Bia6z{uxJ#Cj*%L=!Jwd{`g z-kKq9%@FU7VzbK`-aVk`?6Q1kGsKODcmIrBTE2L^n38XeTUv9(JHuKonv!zVg}+>V zb-^D~AKrB2^z$vOr7=g`!dhB$#4TP+i`UZPwLD;WErTzY*3hMewT$r|u!b(be?yl) zlyS>_jKfJ&2AO7Bvnl@a=gGTcoei5j+LP8Y(;h(2#+Ox>_ z@S!p%ShqAg{fGPAEB&Uz|3v&b=ju8jG`XA31(yp8gPYT5)W3~Z`BHOnsY=}zUTXTB-OQxu*rtbO&!SAsmx>-p#! zDO&qZ!H)ipJjdYNF#vfX+ZV-Ox?9g9GBRIp`b)nMN9Nv_*wX6yD!(UYVCkPNV5tQx zwScAj99UZJuPl>K?EV>+75>k*qqk3kkM!-S?BWXMo>em6IeUh1n@-h1x~kYwtPRo* zN?V#{^n_J@m$SNVPyDMN4EN&0P`tjXwq{9gj+Tz}8`y_$Rdux+Fb|h=nR^xXl9cul zv|i8Bnu>CFl~6M4(;-<4=Fe3X%nPZ2yNO3L=laUKD4T{{3sGZ{;3VkGo_XL5xjl}R?DD;tj>3=8m zk$&k12&`_TU-~&+V0f=j#?6aw?Ou1R?(Y>4Uq!jM7eIW1F}0G184DE9;$5};+e=56 z)ymQ3a_Q)@6XF5zz9sB)!hESzT>sytma zPFHEM?-6@e)$4oA$qTCVJ?0qg!dt2K8+}%&=%K-wb+g3A0;YiN}98KFuom4RWvzT8k+kw zI$D~FTbky4(^%TE^QoF%B*eYU|(Aut<0U< z>^$$BHCuRiliEe=nm#=DcLhlDG$d-pSaa9u+GR?2jneH@F`O;!D=ZmUjKEQNR?KY- zzraVq(b@o!{sL+4E>BBU<21~}GDlzmN*V*KQuLU7&=Kw>p+qlUG-iZW=dKs(sgJh-u!*|QcqC( zEk_x6Az>Jdd@XuDSCzZG##!a@`L%eQql2}HY56jjmW8rRU#h1EA>-AZvif4&ICa&*LD-k&rNC1hOGvs0d7g90JK!VZc9d4&+ggY$?hHE`mG; z^1AuhD*U9qF|(6 zh+35bYU{04Yt?$hiuI^fR9bJvdLme>Vx<-J|M|?!d;8vASxC_S{>>!seZTvC-}%mb zXTEd3nR$Q?z+VFn1-un-7~nmC#{fPEcr4%(fX4y840t@?-vCDdz5{pyAoF1)AXE5Y zTz#}T3QN!`6c(?&Y0%y^Xq?laj|8ok!s0Ph*J;THZG=G^WzgVFxI=J{Rk)_{Wl5|o zj;{k1#c>3(nRpiK-ge)^#SRN=Z9)*ziQ{u)n!`BQcWu0gm$ zo4*}FS0M|ez4MoD?<@|6z0+EmfONXG0;R!L;?f=CMuSBe*2)!eGz^3B9RoNV5JuVt zW6{O~rU0e_<^rYx&HNnmi->jDER)*ik!q&BlK`h3Tq&pK6HwIWY0+tzw~jTuREArkd)X_WOl= z0ZN_x?)sX7+x)+XnO}xt+DxK-^qvwq4Tn*dp4>k;nXcmGQFMD1-5$lVQEke@v15ZN8)G z5>EIM*hz|_iO|h2WLa^9lDuK*USThm+6HsOQ7AxioP?q0t_NQ zOm&CLHN8B`l{L@fUXat$q{*K%=C%528W%Mf8Dk|Yt^zc`nN=+wBatPSPL@GgDyp%m zX_Hg-Vco#EDdWbE6Z~8^Fhr~y*on^8YNctYbpu;;`_oe+#JU0BAt(T_nI&vO;8=v5 zTsP2MQ{}4?BypRD`&z}LQ=Lgpyyv&_rQ_kdL3~^fVC6d!d`IzSa&p~(m5)u!pG9K@FtqzA(-3E~UZHx2@)gYS&N@Bqik-Kin{OofN^YjC{+9xu8s zbS%!H);}ad-u2-54OtR+22Xw< zsp1z9ZY?tER`4A>R&ueb3Ki}PsPE1O&q%cFbWC@V9|7{#*);81@QhL&3-nw=%KH?0 z3_vg7Ka(kq?{Jm8fO14TI&TU&{7$5Eh<$T`^sABUSVYhM z$e#U?|0Vk)d0L65rJ^1s_9t3>BhPcIM5P{L{ml@yB&WApf0LV0P~RNxUw%Rb+|a@?~u?kuWFoHw-Wu@ z6t3BL51tvYTv$VK_khAQRwS<6K$lWqxlvy&S8i|#4q9MMyeY$KkG}Xl5Wo4#7C#g5 zlj}p|;t(#Sp`IKY3DKtYIY;5yOgu9dhE&yItY6!RS4gdHpIoYg$1W@x!4nk{*Oj=u zjn%ES7~seC=U{$em7I~%Rmk_Nz%@yy!^eyaSBB5mT#k9J1HH+Uv0}$VUqQv+9K4C& z6VoEChv7Oew7Zxr3b!66c-_lJ!5_TtM83Z5|od zXJoJJjHQ}(C3>JqF~RFzq>OW1pUSJ zsk?@6e0lwSd;5L6;-2p@zwx1<2d{fMRjh9bUiY$I(1X{#yeH_v>t0gP<4uYQUiTu` z!vwE;*&_IZ*S#Es!Fjl|>uzFi`M-7DOV4_huD-Zl)P&=|d_C(`de*CW8y!7+K)Zc? zA381Wc?;yyrY2wvcBk%GIjO0#FZ%KwM!RmM%xSEBgWtE89~l&IAsDf)tv?pUv)%kqb4 zEKUJQg_x=@n(2CosfH{g#MD%i+A_q{G+phkhd6#;*W`406_7vnejU?H39aksUj_6D z2Gb{^tDd0kR9L(=ZhUImgo%?TPf6(>Ov}j3!o+Z1e!G48)I!PAG7*v{}3Z^zDbDI@l|O!x9zA)-?&V>uh)*YgRb4RCv!RZ z5}#~+xZ}$QZyop4b$|CRIu5bYw98}4u07?I(tH25K7HAU_s?%8?cWQ$%g+1#Rcoi8 zF?QVTUsi1;?Ww)5zE*YRhuX653hJJp`#$F6HSJ~J9oN3H=#6h~sTw@$R~a|{inQ6E z@7{dk2hYvCv*67!L;F04p=oG$Jjk(PAp>7!#EMld(*;(6`vQSg;?9W2;d?gmE-HbcmaKwrgKAZ%K)n34zZwq3z?YMK~r&g|X02M1&oLsq*f?sOo z%F1PNTI-RUK+v#otBgU4aK$nyEd5HvVzFnOaWTi_%oSMTnmhjTg}{=2c>9rS1(v+9 ze0-9?xGY2?MyNgGge4n`y*hxJ*0vmrpH5t{T*smDO-C$OZfJZb6D#gmzk!8Hm*Jiv zFbewy*Kl0A<14)mTp}PqFGj-V^)AfqF#+pc=!b9PR^qymRw-Nzr{nm>S}gPG0F4(N zUjr%EW)lm$FbvnOhtK*NSg)|huRsxLrx+Q=wJ}^vqKO4dB!7l=Ck%HdU^?I~zyiR} z0cQaI1Mn=sF97EP{uA&Vz%Kz;03wVw#`$YN#)+vV*RK$h>sN@y3)7IaTNPhC;_4WB zs-t9PQBgO{2AI3DP|I++z(jfoN}>2A7BapKRM_8e+TSGnGTYx_^Y(%gYUC4E*|7u82=FSaL0J0_R3{RTEB~q112A8t+PRLHcxBMNi1tGj+^!=IAPRSJBejl zyEI=M)+_GV0~+|-<5oP$%Ba1p*UDE&SQEFVtQUN)>~OBhK{-fT`6-a39ZyRBhn;{Y z<`0@uoYa!gJ~L^})zocgfB4iNtyxP_yLf=bl3bP9UYt0seP&#H<{-ppZF$V#=_*bv zXzlrf?8STVc+J#72-u#pM+ST%5tcA2+?q|KV{k}?dPAX|BPlA3HYm)ZknY&}!;e3z zWthwyQ^_2OpRzoT1t!ZQ%c3lgdB)QsV6$<>YFxk|pRNUVHm+oCC~{$jz|ICHX}1B( z5VTNbnXjQ46}`N@6;PIM!n1J!Wto0hrfvk>Xf4a=Tf5OHiQ-JL9k>SL(!~P}F3w!G zNrq{VQ0Hk73)}Q{ou1}qNRtcQ$k8Bc1J(r&T)JZ%Sr_16EW9Lr zuPVc={AC#?Cd)9fcnC5;9mY2F5-42x2g50Ro&J%r4Bm^`XfZ33#LKD{Pq?=v~O ziSIn9J!iLAnY(-CvfW87L*~P>cf%OhCa;(dY;Do1JN43$xbszEi*aj;Hwq+iP4PN` zB&{i4Es*3jYtN%)=d4a$MdX;AbrP}XY-}&SbM3mg#W&A?ZOu&h-}q!lAA8QaHFyA~ zoYlwVY{cCzytNnK3)We`f9BIQR||Q9`eX+zf8!d-LGE?O2pot#XLWn=1Mu?}R(r3R ziO8&evZKEgwg%4>-^ODQv7C(vw!QcvaR1}Q$DUj>6FRJWvg1(5Sc3Mwx%^=sR_QAB+!Snv5ZyM14x zz72kUizVFAMg4VfKmJ<9n&_hbHn@lNzkERyQQr>MtIoOh`+bS}hw$@@tR=sWF6y6x zduZGP1tFsDx5U-L&}qHZ#}4_I9`D{JLzgzVPB(Psyz_o%hc(^@SqxoRFN+dQ7lzJ6 zoOZ_9$LaAtILOdNX%gOqt+U|W{>+0r^r$EMZ9OpRwBECl#{Mmes59qhBxl?9CF)GX z6(4VUJ?f~l;63}@tDi&>bz1Moe|djs6j5i+|E;AP@LRcFLF;unO?+6@jrDqrll&&GM?kO0nU{%^KQd~= z!*t^gh${{akstnZei4MW$IQI{sE<3wmT8x$|BSB=o63Y=^8Gsw1+<} zzkWn#ab>~&&+(f+i#o0};#DbMY>OhUteJWrwYpblab>ZavUS@VoyCUJ?3O~O109e1TR6k2ACP$`=wZ+lM&QB$w^}!f3xE#+ha4<+Cna)p?v*;!Bs`+SqxVna$fj z9`(aM#F?gCWvi*YW{~CohaFX=yF{Y$AhaOm*YXV_{D(@f7OUz>(sAm@oTsGGW!hpeQFS-qSipM# z&jP#`a24Qh0Urds5Ac0Jq)FRBeQ>fP;5fkF0agP(2)GvT_kh0xd2e-3OE?>HNYW&uLA;zX&pIzLF{ghnU3{Gl}{%cdrl(s6{!s)~sd| zKSaQyVjcA4`}WjVfZF2*ayBqd%?hH<9fbP#PucN<+a%-4Cu2l~jF~%%n!GSaBF>hh zC4*vDat-#KuahreJ`W@{Q745=?p#Q5TzgFWv|hiR{3%jNJN8H1R{mW>psO=c_p65~ z!4J5&UqD@o-S^!`a5eq~M3MjE8Z-4`(vD;#Ry*4LBJKC350c=a(}j z0+Q*OoIO;Qvs-(_?A9LazU{T_c>H7t$2m@UP`YU0{nmz0SR@n&P^ z^PwBc6(D| z<-kxY!|&<1OFl-7)}E|!PcrIeUnkd|K(_O#|zPnpVmy0yaa)W3Ai( zELN)qRwHOWU>O3#gs4_8o?Z&9PGHpd8(hP2>5e;Xm`HJo@C51@^J^E>6G5+C=w}G% zgaK_fKjbLpX(_V<*C1T1Uz9_%I%|{zTJW%KbYm-5Ny|A~AH;htJMWpJV-P<$Htfvs zVZfQ$e9`QOE1MmpI2LO)*L>r+E27D9nD8RP?hX8&7h@C`j{{}n;ko}|KfZSblEFdS|M*!Lp zuM+?d1%y4dQLoW}GXTc`&IH6uleXD_senxH1-N8=PE6M4#Nsu^lJ=0mK7qjE*@_Em zNnm>|uy}E*0PQP*ZK<%dc)rLIk`u(a3{u`8#8QR<9R(JzA#aTNZKR;wb6*BT%yHk# zIc^r4DCW2^qrIRbdF4ak#uE4CYghS@lX}7D%r~C4ujWI2(z{n#`^?=7UP*4hfYh?J zYw1IOn7B6Q?Eq5Te001irZ>w++1lc_4Q3p)(dQv_GPIq2cFc#A(6x-YJ5C)<^$jva zxVPasN#Tr6rNZ&r(T9^okH*hxT(Mdv?xO@Y4R=;S$)b6cv|9YWP|#QjN!m(a(*r;H}v-1@lcfCqF?W(RmK$CZdnxvq8jEw#%4 z3>QuvpbKWeE#j>(vxvJmkUgwCn0r&e#;jtEvm3uDA)QQyyYEt8k@kuC_ z)E95i#G7Il;2iv}1iS>W3Xp}c8W3Gf%?d3PXJ{eehE32vpp!!Zo39|=I(==hoAzYcl*L4 zUjr~X^C=X4LATquv7Wx@5(T!q>9)!8xA|V8;*+R3RD9+riY6##3qKeh?KZ}f?u*o8 zVHDw0o}Fkq`m&}NZPIQl;X}CM*KUW=g_m==l0#pR<1cXHlpcQ$R&4qs<^saYd0xq3 zrbw_IgQ$-1@Ny!G9i^mGrFi_W2vOkYSblU|1kIh=lET`=pk z7w(gKUGa3nM^;H@y$%z;c$|SAgF}U0vA2AEyww+fovT7W6nfdU;YB4ANv%PcB6LzF zkut|j5v8fjpz!$`BX@LNZ!joKAG+ULC}vFu;i=umK@MX-Xy$cKNliPF&gTfk{{K_UmC*SIu1z8q8$IyD_P0h9|Z6eb5JJ|&O2 zPB;QjP}|^6_s^Qe7}KgCB*}7rT|J^NYguM{=P%2>e>oUIhL>Y!^9x5`l53cvsIqLb zpTXd<+t}x0`Ak0j;l(ml|M<{*sPWCtoT^9Rf!%f?eCaLdV3De$ofYqx{YZS23VpDi zs*_0{1m7Zb!+tQ>^i!q?zh=s~6p;4dlD5it%SqvoKe}^+ zCL+G+>8>oNDq<78GVp%`YsYT+5Sj#aYD} zMfs(9&MFH%C99;YBr_vF%V{B}mKA0e6qe@aJF!GnK5=oeDtB{h>03-hLy7Ues=4WU&PiDkSwa=BbB9-La|^(}F^8ygpRJ(|-@ z;we_@fin${jH9h)_^R9spmU3JvP^$5v8AF>>@1y{o0VIVm*K=jN9cHjOgIYB6RxVY zuC8TXvy?8zyzygGCrsLxuVkf7nlfbyj)-wMc-qw}aoW{M?Wnd?%@*pktGC%An_Y<0 zu12AKI0`Lg!6?ayewgMAaoQD|zH=0hE;7`qNpIufdElEfT5_ET;0$r9(?g)gj>Wqa zTy&Hl>Qo)ffoY>qm(3X`*u;^7p-y#TN98`nBRLVS`0AFw8$tRsT#p9vIYXZ6)OWlt zNkYgAd8$)?@ExLf5#6w-Ivow3V*>e1%?m?u;TjE|OBElpH&nWCkgyRvw{qSHj$N)$ zrz^FB{w8=z**3$m;}c5WKSBQ$crIg$4aY%OsC4cR`d<|f`RKx(uJmy*U(o4FYvKPh z@GTPEr0{mI3w$4e=Vj4(GU;m?HZv}?1G{K4`AfQR@#`DR7czeR!M8#2hO<+~FA>e~ z9@!N8^TTR>V(Mh%NqWqT_yvV~CLWCe-x|fsUO~8g`we)mIa$gIX9sn7{2X{DoFe&{ zzoF!P3i`R=ai1#r40$2+xLWZ@PGJW@deEM)1K%FS%SnMy;l2)f+G$8bHR};6+|%@# z5f!i~mjUI7c9jXfmrU|Pg{z?)#W-Yu= zJWphH9`2WlCsMdi;Ndsmdmu}4u^fa7cSH<2liA3t9LX0+-)6-lIYZ~~20UB{zT{lV z6)t}r2)7J8O?jP%yIJu>3fF~)zXo6L{K(<5J<0&jQ3aAOlD?&iM{T58>#$02%Zf^ork+s@k9#u3Ow8fK2Nda zN&pCDR~+`g3ZB>0TudZ=4=U9|lrWUO47V@%HYnam;U<>hAeCuSR-|w<6^|ZzsBoFT zx!}7+@kYwu_rdez^v=WmTJb~*m-W@R;Ja{!({Vco=WP<}2DclPckK_zpuTkIC;5(cJ04|cg7lY^gO2HN}+}|o5$r(Ca z>iawJ&8?DLk@Wo@Jl|JKzDW9xbxR)o9x9!wZz}k8jtx!CX!eu$H z1mEY1H(a>8z;|XXPVk-EdALgyPo!|K#=~Xc8!%6Dg$tMCiZ<}9_I4ibBZ?l`U7lD=0c9zFDM;a&~Cyk^N2DcpC! z^G-|W;r8?CAxao3+}H4EAoxC0yaVw&R6WiK%v)RWl7FF;W#}8C9{)=5NKTQzA?xwI z!F)mWIP-%`tnR}_7cO1czU42*8H`ILpAo+h_4sndBRNCcAH%%>d}&K1SEO*C2hWS= zb{?)cP(Tk9FjRiL1A4FXH0^y{bm79~f{R7VFa}vJ`3?dIXZJ(TmpuACRJbhX$Aa%Z z#mjOO$_{Avjy7B?q_jxsJYDff&d~ZkfQPfd7k`1|3a4)p!rcg-dslWI?%x$pq;NUx z_!xX+E|gq$fKd9fUMm96h-iQK zQpL;`o|iR4&3;#8>yzIVd0t^FKoMBnov`koKb|0ExxHwx`fdK&h0v<@Lo!%kMGUB{@?u5+eO#~IiI6xIBV`bg(u zABBaDiwEd+ZGDs1UJ&gEWzraxc)ZO_tVvf?#cB?5{~;exU$NpV`W2J|7;{zeG|?N@(E8v zk$8*T^QxM$U_9c{+&nJ35)#Y&AHLTEZB~Ku^lm1%__7hcbt;;OW^a?Pu^Hc9i+Fl> zKRh0Ws32x|F^waQc;vVp!G%4}djJ^T1jCZ5=H|vlc!Sz7S14pY;+v_kujhG-fDsdq z+wE#+_rJIlM|%eN9Q`r(b2);y1mV1oX^y&vYD zbeZcHe|m8Frtg3Fyb>L4=$sUD+NEc2$~gOy@A|j&Djs!X>*Gj2L0|sYk+-gR=dRg@ z?9{$H)_d<;m|&6gSxr}cv}f)Yw!&4{-L;t;3ib;6(+eLfj@@v>j0qp+d~(GzA6|j} z68cU_F(s*E(~f${p1A&RrQTlOZa*9w0R{d0Pqxi}Fm~6rh1Z;QR=*+df23(22zp=V zCttj?`L_q%xccQyKMb)q zmp5*Y`SJGiea~T|o1l*wKKV9pZu9L8@4H9ty(jAvd~7h5a>}0?|HYaA>OI=~$M;6x z+j~6*FN*~|_$2WTK@UDj{4n&sL!BhvEa<@}i9avs!6%6y6Gu70CyAdY=)ot6KP~9N zCy5`9QCFyw#H$27_$2Y$1wHsA@h=4Z;m3cxaLA$y|Gln${k4N{-*%h)aO7c$FzN$& zlKB3dWLwX#K;vXt!mgjG>OYUXt8sC;>#AD1;gnYqBOE=ozX@+nA6H9jlc(7fvHejp z=o>XmeYwKOU3*~8%f$h|&5hlVmMuMprPq4vJS~o%!_s>WOP{yDHA;jEp!*I>7uA+& zh}CmmdWF8;vcgzyS;5toK{HNaJ|*U_rhCpy@9wVzbiLz&zJjOO*L6AWW*?4m?vA!n z|GYp~j;QCnK@~n!u%yM?Qqj`b+U&;9hDKkN&)e9*NOt+0?eQu43EIXv+vCUSN0s|e zFCV8LFW&VKe})s<%?hPDm}cV*h5R}iXPkFk$9+C8UHdo2ZJZ!a(7sn#yfz49FwQ0= zXoD3NuN8T#%Ny&9(OJg>>9DQ)$G$+n2gEpCxWNkkUj>5@aq1MSIdI2#7uayz`D!>; zY+=q6*eKkm3oHfqYJsKU&e;%o2=)qrVdg;Nd$Cx}iTkwz%f|gCf#u_VkHCs>|AWBF zaDPT%<+#5pusOKDC$I|KcM7Z$cZ{PUxdwMTrW@qB49kA;KM!kL`up5BgFR+ck zo)Xy2z+MvAt-#(A*qy*W5!k)Jz82U6zTH?z-Sd;?$NYE*yzp%4lXrhg4CjxmiQ$nYleN}9 z578KQo-7VF(a#C!Wt>N_28Wj{+oSmgweOZ3x~yKhteibKz-z@8#?f?6z_Ivw0xo&} z2!F{V)Q1XeGVVv=O4jmlA1r9oa33jX%+DhQ##hiM3+yV~kH8fxPIi!dOjn8Z0`?8A z;kb0i6lSFOjIK1^dJf2?pp6VTyNiB?;9`D`Wt|~hjB)fj<#pgnR2KkUn++6stVbXC zs>1Z7{}d0N#C)(erGJj()h-1Ge_x?~55#Zoy8jBlD;14^aoG-Ap+%IF05=+8F@7n4 z>44(_&j5r;w6TPy0eS%^0j>c=I=5{CJPD9GAuZb&cb0m&*`Ao(Y)?!c&n{`SWJ#md zN*d!NX-o-8+iK9Nj1w}tJQEYx$A;pD8w(6mU&=vc{EA#mLLS9qUv`u{is$6Srzxuy zhu7_C@AWk8WoMtA+a5yNYdo9oqqCl3S|ghfP@#d5FVN;(pfP3mj4sgT7K1i1z~<<(PaLte_k{%CQmF?_hpXMgkeV#B`5lm`NaOZ&p? zpO#Gm+)&sD<1!p@A|T3b8}0Tuz-fRZ0A~QAWQ)TdQ2K;Dv5ZQ4A|~yLm^_q0(jLWc zNfVjXfuEvI+n=vK7}b-gmC6F^BvBzTfPe~#nHN|gu>z9KnXHhQ6j`{E#i2y9$~g~96F0~epsJsD8tu!$WNkp1+-B(K6XfHo#vObxzx+UfTm^h(E$09olw z>Ca4}(<>G6Wd_kOOS){nneDwnVA-KN4cW*zz|2Lp;sj(`WdJf>nSeAmK$XqJWHu9v z=V5!|X@WSdL(=XwXb&hXUK3Tsh!G1Ly)}-JC#0Ofpk?9h0J4AfU^zd{7V`Ww>lYRb z>j`HkXCf|vb~04ZP@$@ZD;JpLD+Pvv0w3kL&lcF}xJ!Ftb<84@ERNJ-0Z7(X;V$hd zlohST(+*rL&UArRM2RN^SP}g&2bbWQ;J2a%&soTlds^%Nsr2fGLs^h z0nM}+5S0zj2Nh<5v=L^4_DPsYHJ(W`Atud)m^2efqnSt=q;_H)=(-w(UL1kd7hZM_ zkUd%)y{CWZBra5qa140a)k)TzxHCxEHiR$1tQR_Pg)700cs4em1k(?bhV9XKe+gzQ zfc?Bt=a1}vhA78@*~9PxOEKyxkv*u#+Q#7dOuz|%sMFdQFLY5v_OKn3*+Wcb53zXT zV6_AuN2-ok>vD6ykG1zwgxp!NM7<=AJxmr`Wo4~g16uezt;5p}T;cMx9?wPxV`7;jRh~MXoGY(WUXB6cJW)vzGkx^&`L`K0JMJLPymg0~eU(XUG3+(8Obfkdv*MDOVt|98zcpt|VMcZROhhBYWA&)@xQD7#hGS$NA|4 z*jW}?9bJEEp33a`Dzg^==0GG$uxJQTn}|$j+-0T{lbKE|UPM;Xw&1sgBF97L$ z!YFd4bL<;(TIU7`?<^N*fhT+}q7I5UOlDm(A)qd$ALimzT)jf%A{xn7Ea8egN@jl1 zbo_a_2ZkFl_ZV(qJK2QXVO*L4(*aumnR_sbHpUO}7rA#WaG86=WbP4@!(vI}uvpR{ zRpuUTasP^}WhfMKJ}~HGb1dL%M5$f*7)$YwzGR7Lz9fmn_!4#|t$g;!oqba~b{-_A zMRwZM=h+z5fI@yNNS&ESE_ftg=e=UqX~{grJc2dq5xxnRG(cj~0Ex-!L(*7% zNE$-#ssRRn%&^<-i=C0q>?ftMdJ6^FH64oG{s2bZ)LV$xoSNqdnr+KZ$i)Ssd=*nwa=%kXUQuqN$l zXAqq*Os-o$=-~p5iCc)v)bfb-##Qab3A_8!k(ZqWX6j^Ix?>oD9m1=SDGYZVAT#x9 zK*j-cZ6dS&09qt^V8D33*CE9!p9`USA6v;t;9|T+aDrgon?A1cqCsb zuw#Xfa@+%FyX!&Qjw@NruAD3|G)57+ZX6SK;9?HZJ&FF1c|?aUO;C+YKdc$qq&fY@ z(d?z@FueiO6cJr8Q32ep31AZe^1B@I&lI}PWbh*&g+Bl$WvoL!LDeTK6V z(#8d}4ras2@*B<~9H;2%g5_{0QdrAjQ}4v3yHJMnTNnln`aZyP!21C!0a1Gh!}%Q` z4QD4VX*k5B;SiICBWW}oNrTj`8jgA5Jltg6UIf#b8L)r02Uk~{d=F%#24t!WG`)Xj znyhPWz^c>+PmPOPxAv(*FwNtbn+S#z*hD;xjA7W105apy*Ajg+^hHI6eG8h*Fk&*p zh{+~j(oj2yWlr(@G*?$MEQ%&#AE(oKR!V2t%jQAyMK0xD@b!Yc?t9C{YC5nF$jLBf z$`V|;{!(rjgedO&WD$B3;SdF#_7PaB8D?N}&;cW0Je~xkar_am67VTN#%&8AOSK&- zB8`NYG!kO*;w6ftJ*4>LNbJ9|AHi>`L}MtDFS4PqAHl;Iy0`-*UPB;;SK7}?67Z0Hp^-7@OFb;u+gDPAY&U1h?oaX^60sjohxV`{L!{I_mX*k5B z;SiI}fuylHkThZk+Hh7bOVU~+E=bJTj~?o9=oF1*NxsOIH5aKM`I>;qo-F5^9U=_A zJ3IddZ-G@c`)7A@0+O{A z?T)|Peyhs|Np}pFRu>C+iXv`>RWU9v1JdeV0jvbX@TF}9;5I61z)`8Hr8?=oUYrU$;`TKAe4g0M`LD^&uV7Ud`^dI(tKEf@l@yTtH2gR zV&HlXRvyeURtlvS^YQLiy~UbJe*M*IKVO0F#HBliOY<=geqM)JFfMNZ(tO?otOR@u zknwvPkY>Y`+R|)@NwXm)%|_B_Hj)OZT{o6Qf1MP{SPo33bqaKf#+oFb)tY8QYx(s> zX-%xOBwrJ-$d%S)g!{8pS}m>B`(<=psgl6+Qc z3RP7}zRs(vGKBlHR8{q@bw7Po^-ow8t?o-eS{)iyVRc^vuE6izfUK&%0i^YnB6Xzo z5tG(OOj@6$(fT9}(z|Yb2coK~M3kd3F3D##u25A~1?2rKRTYfpr?0B^z!+#W{|2Pd z{0FcS@H;^Es`diXSk6SMNMj);jfI#r7D=PANE)Pe-B>!Qssfh+bow5m4$+OqP$Zw# zPy%ZqPBhJfyzZN5qQt<_n|Y$iw1lMP9JyPk173L1F^`mM3%90Bc7#l`k51hSV5kWu zEk+tg3?PjIpIa8jVF%;{Q!hXU%&m^nIEYE(ASRbnOWM7PFJ2rp)#Xl4r^bUk zwHma*4L_WeX^{HgSG!z@NJV2fk}tC1 zur6qWyzZ-A7C_>O0q-@!)Gja_*Z3~a{!4JY$;`abR)-D49 zX&l@%EscYiG!A02c9AsJE|LbR(l|J>7pojcV8zqJ6Y(q5!sK2d_H$Xr>%BuTtj*aI z{x$fToLwuI?b3X`+jDm9jBn3LYA@ciCNA`c&{u3>EKLg>+kZs#h2uIcRuOdkj5Y`5 zSK(naHYWM3HWsR@a~b5ByE@k+j9-W_HUe8Gp56ycR#+Xt){3Vu0J~IRp(-)VQ&XZkC#`oDhQIh(X6vl!|=>4mdfo?OXcJaYq=7eyvz<$D>_FH8<6p5CCEUE6#X#RF?Bl< zkd@$Iz)HX&fENKC4cHDi6!0p*VSubmj{&5v?T{z!pP00NV)0^$AoC$X%qA0y*RF#P z=2C*#$WBbY3uL|~aHW9A;dt>nP0B+hEW(J_5Yq!*v04gO=q1GaF@wJmF^{HXNIq-H z2<+Q&GEDL{0b{v~6}wX$A`I&c{tcl0EF;Xh?w?@>|9Ds=EqMeWE%^k%O2CnTD*#Uf z+yFQVkd}KrQb$@YF=@HP)iSzU+30$E5iL*tgp^p z--R9m>s|J6SqtyO`y;#-5!N>jkk&UIuo5s8a0Or*AgvGIZx`108>Ei3K4Q}Ph)L^{ zG+Lje@ukaw9+h-j_pMx(?0=OIs%z4ov!COdN1Te=HInuKXvt!U^~v~^ti6PL_;J!}c-n!BRzw%gIEj8(c|C>8G)}^- z3wjydX3e3;No5FAcZ|n&Xxj%cTM_Y2MVR&!K$`YRfR%tJ1Fir(1#mOqsep|CX@IO? z?-z2|0U;($oR}OpN!knQX}nfrydp(-Kfke~YaG589d0q$vxs>#b}aciw`0i{*^YmK z6x@PvyRWKcCn9hh&yF_jlU11MRXrwqy3;;ozm;S6d|bL?*tE%5z*7`412)F^WCGGA z@e)GVWH#Um{LTSnTyp_wi%-G7tZs=(TO<}QO0}eQD86_N(*KWI;5NiO8Vi(som-&f z>)ZmjBHW+F0=*3je;x~*3d^De76Q@&ivTMDivd>vmH^TM@q$8F;7dp$X@SI~1rn1M zC}|zwmo!M17RU;6|2DH)7DI*{%j}-tE7b95i98-Hai#xwv~>JzkHd6joW8E!f1rfr zh%|Bq9!G>7mf`l&%0fK`8p`H371&T*<`ao>@mummHr9FI8!Y@b<1QO#j#J-8LMDr9 zOE%pPfp&!8`=i14R|7+zFKF8H9nhEy95vGg9&7b$&;pOOq8}Q^bGYUhGXOF5jSarJ zjrE@9CHRiLueC`u?3CSsi`5h_<-$&s^NKVrZdj3-k! z9{)=7fU^P51)Kx867Y1uO90OVyc@6r@K1ne15$4nAoY0*@}=Pu zlZH<$UVB_UP2l2C!56Q+XwY6UXrCIiT?P%YJm6LIKEK4-g-AtH`%1pZ2F+>KPa&`S zrdgLm;%U)MvziRGp|QEXs?NJq91Yuro~XZVcOo9T3pMrXhT+fvYXE709>7Y#T0l;{ z&IP1leS*}HhDA&o7BRU>SkksAJ}kk*lb?ME#R*qdq?Y$Soo`awgSbaySCTKXU2y_Q z@y}kOo#QE z@@hZN?Hdk(bpCcq>@c7%x?|YPA3LDV?nAmWKCOU^(?XRGd`ltoftbt(V)5E0a7o%N z3X{DrN$W6ZKYKlK;HFv(FbC12-LEqxHb?we{^gOCG{z6dkb z!kx9yHL|DOO#pT%TuD-ITx@J9?kr3-I-UToe#_2*pwr8sV zD*-P8Tn>0KAZL?S12W!g02wi!&n*p$m^3V6vY#bsTNGcshEPPSvQRtZkmoK}gJGvhlfpT4MHy4m>~Z@RdO*-fwc9d?cH+j!@7vBG8#S@pMjhsFL8a%3_aBucG4mZc zr<_Chl;-THyX|eOe4$MWB%8iv+#3|TjRR@MGNqsbtW3pTZ(RFl0FyJPSS;vB zF)$vaIC_iKI1fD3a;eD+P@FP{!+)jgtvN)SFOKjt*le0heA`iHV;a(N%%nR>S)~7j z9BcZpWY}%->iN23_*HP}$M9l8Rw^O`hpzOm&chZ zcAIV~A1sxDwiBD)i&; zt-4ZpF>dD2`+;h={S$Xu3EjaW^lM&EW??Zod@FCR9W0c^xu`4gz4VLh>%2{zb`hpx&?hF9MZsXXU$+~3Jn?K0h z`B(WhZ-HQP=JXi|y4|)5cRhCo2yDmtN@kqNxp;K5as!YWc2VB_L`OjS&?Nk2`I>9b zMJ|QcYlqT{zO3nUh>)X~!G5TdZj77=*z0t;X=-tyyNL%(dfoPDijm90leo=Mp&u^vGF#n|LQWm-EMIpv zrJ=@VR-WAVc{hN`nM3EKu-*14?t17)3M_v1;S^QQ*= zPt_yteQQOeRBcpp=*ya_?32m5j&0 zb}&1aesU{_Lkzvvht-T!3UjMoL?g)Af z6TXBrOhRv4o>9s}{$DVz)hkJKOaqdv#2cTJ*hS8LM}bGixydbh~YYDKCx}TD-gX z)%hkbKv5&flOus2FSK9}&5gB)(m5C(Q*Y-4ko~#Svbr5_5W?rqsY);Uvg$Qb$k~89 z%g#UUScueR?tDLT&lmucGwa1l*lu%}^cpGi>FOQmbp^T_75Ye_7oRpNiUx{RuTgmF z*XxrVQYr^R0%c@r@D0Ukg6l>db;_5Ui zYjS42(m=PiO{qe!wB1_*T1JGbG3kCkV;<J_ta@=} zy4{8bK=kxV(=vV`%hxZzT=gV~CTG@b66i?P7=M0E6nb@BdeqYUElstUpeQSy~xMuOwBx>C38Dx{wpxqkitC6Fqoja%R1p zpxbS`aaV%1bb%HB_|SbOFA6@Y(}*7b`0NAbc)dQ~Yo^kvm6Q^*On z!>?nVD^;` zeBV59Cpe+DmU-^5rvOaOoIX=QxArOvMEd;u+mx*)FF=_TUPUS}@_m$%ijDxi3Wa1{ zuZ34^{~(fH6O|nLvg%bNZoaz#eI z`-y>il?chYUXwGNQiy3C^$d zBQHN%MMnX%UbBQR^Qdj6(5orA<{+yt>ZRw`Oe4Qu44YpZ^!f8E|Flw#Lw`*XhF7F5LBcb&kM3ZTs^?t1lO~Z!0&)$S*(95s+V;VD{@Z zY5pH$BI&hP=|x{wy~Lc7?P|~yaGid2Jcg+drPaNA@9h94XV$9%bnATYnL@9MO?nSW z_vlhPj`{mcLoW~&L!e%qpz!PUdgj6{k@Py6oqjm_vg&mD;jUR6ss!8F3#VX2ZsUsk=U zgq&@-vwe?`&-;hWudT(Iet9ZS9RSCU@ z7nKNGWkV-I*FfPwLmV4yP}tQMYq}+czkFd+!;Po@)ac(k@r6jKv0TZaFPUbWt&&YM zb#aTGay24-*#Gep9Rc}X3tqpb z_kMpo1`6Tx{b8jSeOdFJk+<7|^}6=;n)g+76fo;GPxvyo7juPPk7hj(5D6DIZz(s| z(92H@)QdLa*K7TiJHCvh*V{@j`m*XZU&wh4cQmA0<9pX(2oeKqaz!btT$3~FwE%Rx zZ4emsdUd|Qu1x;ybCVaKY%jRFgl@jji`b7UKB}CW`m1a-{r%OgpL%{3Nw4@gN)sPY z3dnaRrayg_JaSfABst@i9Qv}RPlJ#XobTVgTaB99?9A!YD14d6DGefh&V6Mo#uaAA zc1KU21|xmusQ9S#G1X&DQnC`!ICK86NP4-I9Qv~Ab&ik|tk>PeH!N1d6)@}7EPR>u zI!EZ$^t;g?TYceug4mxx>N$p9Yr^W)A|)#!4X-TtCX!z3lpOl9>g5x1-oc&q^N-KE zzydSX-rKk!2f*aadbNUXx0QkMAjRPmdbKoF{mbM1ftltjLeSYcd zk@R|B$)PW+UW)K>~Z9L)hOb|@Ytk=1q z+igk6FTMU*DzF>B`g66(i$Yha(3cu|T^m*}yn-_2*MuWJLVXrcRht61Tgjm>t6s~5 zoP6GK)!jXCn$+tbJO9WopUIi^S`NDG|L7IuGNISzr<}hrc~R(lD)ePSFY_D2^M#z? zTK(qQVcAwW=Fr=Oufe8NJzs==$q9=C`Zg|o(I9-BZ=~v1VN-R5kgQwF&{f|Y7AaMK zP;%(YnyMEFIk(`>QgCn4o43hS-TU=2q_5eT^;(GsR%^LH=rwlkk?hi#oJ(J)2HFLN zUdI|Wy@T;Fm4XYw=P%tCCtsNxNw3LD4t-IMr@D3S@Nx#fO30xVb>>`<;c9NFGIBut zsIOY!aV_vH(bCghSx#3KPESoA-`e77Zb=`HllrTC z&7Otn<7*n-t@WM;ABc0kzIje9-Q_AOD9LfTW>qyi)5oQ!bJ>W~IR$?crlgIpojhec zVmQ4#%at|H<6e-{(xiUQnAhs7Xt$vaB)qKlx3DWtHY#mpfs!&2^1B`!UYonJYwycTwXy{^%Vg@`Jf&I`eq+oEg}f=q8}?^7}a_zz-NFK+|b;8(oU#aG=#wnMp^;GhhqVBd(E{Nj}G z&X~%dA;Q<6g%)Cbx=ILw7!X3mgi>_gKuL)Gc=7e5pwQK;wLlN159%;j)6XCY{%3(g z%pX^w6kntKtWJ;!6JwwZ zSc&4R0Y-Wmo)FOpBIzkWqF(OvGK-7zaC#5Y$itIgJ~@9V8G#!2lKt1T~aE&NBvZ2MNU3sWTQi{T0B)VCDQ#kVrue!HzLn z$XH^wCV<=NZ z;6^ymP~?a_gkUuk4T^@Ohwz}rctIW{J;+1gCSajVATdaoX`7YUI~+l*b<1Xec=Tl4 zE-Oc*uq>Pr!c^Pz0s>RiNC8Ne2$I!WSxVNs+d=ZwgCHqQF0tPN{aJ|wo1g0G2KbC0 zn>uk)s>AQbrKO}!NllxWI>ApPhHVEECr)%YCXAmjMLwyFFN(2icg((f#*+j6^PJ`# z2khHs;JTEE*~KU6z2O-;dGP>E`-}cVL8q3KY3?knb8<6g7L^wj zWS%svc*d-(>E+qOtklw??2?S)oEaeJWEYfYlw@a>mXsHi%*=6cu!1=?Z9R~4w3z-3 zAnT-xne4h&%uqeoifp~(T9N1V<+oN>wD>$t^;Hets*09ocSYna9N8QIRInrNal2i$ zqAEnm9@AJoUpq-VrN1_mt7?)E@R2vh7_ivuZf!keic_cw$5`4$`tADsP5kbZyf~P1rHxZSf#n_eqP~^QxL%K7rRZ zHqSsm8V_;i&o4v1i5&k%Hkp5w*|v2fCul#FilKSx8s=2cOT zF?B_4Q-}iW*0>|ItVdBg0kf@y$c`;1EUA;y^2_LK*h> zP&W+H;`%3o6@&V!I&8+MZFIHxnp@pI?AeIx&)HL0KtrR;2LW;YQ88;xzIp7X)>pg9 zE!a>mX{sz}eZj{17uAplz7p|sHhdLjxeBszl2}~-nfN6|_`_5|CgHIik6rQ!yi?jF zQoN1Tt+gUBer9oDm8;I%;=|s>IH4$1%JBJ`%P}9}@nN5ajDpL>NK8zFoP$6b!GP<9 zNY3waJb)+t@PrZcRn3)gWF)9}eRYek3Lk{@VQxuA0#g<_A{pYquaW^V70JMJ`?al@ z8AS5qtlZg;4%)lzqOXTtckp4w>5pVQqiKBAn-nvv^oZM@U3&TJV-Ko6IcvumGc|3a zpvO(Sbh&$A`qkO*d_H#jiy!|TM_vee#$P=DdF`+3ubA2U`ILUsFP@7$MF2@Lnb+L4 z_t=5S7v(pOfA|XTOJB&-8IxivN56C5S>7dIzLj{<4{yA*=6QKIL{iKL_kNgr(q*n+ z{OQ5vo4)_y^GYnRL0pq!PP_E%O&Moj@?HOyUd5wsY<(Ob3m5d|e;s-2ig)gseaKGj zyJNlgzJ>2VN&2j&t3KK@_X}I$s_X9BJOi}DF`tfEH>Lq*P`oEQWdwsk8a7}wy(7*p=+x!P(cWqmE%~@yl8}j}~P!`#m6w}xF z$rtZz{_R0Gu6}vbxHIP9CBo@~zF=N{nO5HW_DfR_`S$+%_k62qn*{v@+ngVU*qh56 zx5xZ=`}w}-@HG!XA2WRNZQk7G+Z*0@kKB7t)+ac`tvBW0b=Pg*lx8;${Kw{d#wV=2 z9P~|sKI^!Zzdz)&`}fZ4bIzbccC}1^96@hMc<=i+ADMUZX*YlV%)8vES4WzJq#BK-yZ#r3JXhHrd%{e64;eY@hG?=c?|2FNnU}quHG13lAGW`}YS--(-^E<}AWX6*#XS7@ zj~5PEbm70()vv#H@a@|ee`L*KJlpsEs$p8}3cW|+Vud+o9tERi5xt69Q?H`l=+`Wi zy^0o7uVSIm1XQq$cas!vL)`&T(_K4P#!pOhR_L>w6~-iI1?M<}`ifB`A3J_sSG{Es z#s&?(+A#-6eQ(n|Pjfd!(^rEe>AIXc^pAbrk!(Knal0NJ(QZmH-EAM<7I)X<=k_gW zQst|g<2SFWr5lPrx(*oZbY0Jd7*5nGv*>0;Z(%`KlI7wfMR& z$KCAnm-Mbgs6{U>T@k`pu41&^;%%vDX>4tF<7Y!7MjqbA24*R`v)cc{5h9%6>&%%a z`!I~atM+JKkuwD`k2z`bI5{yX?w!qJPM$Q$G>@4m<}qIw%(K9x3pJ0)Q{pTx#60F! zjEyH?*wp(_$q7_*avsyPW|B|tg{;HD^Bh)2&>e}(kyKV`UdKTCCeZ|J6j#OmQdgKO)XF`)7(-WIZhv^E`D; zp5_X30sd)biaAg0Lc`G?bHZCOmx(u7(@!reca;|6TntHyRiwfrso#n z$OcX=(@S6Vyf~*AXW{nk|CSI#Q9>OqA8YnDVU@?eOhzApiPm335MO}>is5whFo(`^Qy*S3L7)G`!Ki7Ip6o-xxQwC^2<5odq5Gy^s}`6a}L_{4R4j`;&r z@{87S_@ecW9}p=#T+lJEy?9W2|C2Arst>K@NIyvs*7Sb}t5dWcTgkn9er4b%tJF8G zTH_z;OE#^d;nt(|@E-mAneXPc< ztWw@Zz_=zZS-S&wT2ZVxnn7Z(;5Vo3W3{(&KLJ;=7K3?h`Lr)ENyC>^740;G<}zsf zjEdyLcM%j{J1|cC$7)v_Pj59am~qfIzWCaKiI$9ujw^r6Uj^r}<>Ry@M%QrkGX%eG z035?e3l}41PUO5al3_p+#dhEtgo|$(lxwp=`QEy~qRb*!&h+VswfqFQ4_p+4`6l@l z@M)Nn!4{e%^>JFx2;qIDrvdXp3H=#s2h?h8je^e?!4g22K1i^Xkig@6+QivcGCHUmxpTnTs@;B|mbK;~%%AT#V> zT=Me=#N_7>h{bDbaYq7xc7?*?wPg5|d^{FH@(nj=JW5s4(hS;UgO+X3@(o(KL7QXH z>I_0UMCB^?#2L#)qgMx@QVfSf8mub-*wsy-HB9X z{q`mc!E&0q9gplb772zPjCFLk!EC`H`%)1l$P&vti!eTf{nQHu|Wb=DftRzJYSrOCSJ?4&! z^pGUQdS~-OM_*PsjEmi-*PZ{YSzI4U&czf0M_)3A_le)UIRYeOZ7C%4oi5$YTi-=4 zNk5Wey?3ae^kt1<94K}h-}%ygcHiL$GQ6D6B%AoQ0OXkV(WBLY9Of+D@t?kQL?k(^ zR_N$UhK8@*D(4U}jPwl%X)U3@0fA3H3Kx$%tpTqlf+dIj285Ix`Wq1Vn2~Tyb1C^s zt7OxAYUX%!OC2^rhJ16P8ea1b{^6=|9X@GF$|US?7km5hNkc4QSDs97ZKM=z7h8yL z9vYhq%bbO!1^FdeMR`tH&xYBHDo-6Kc9u@f&B`sw%OH1X){qAY6gji=3-hLy7Ues= z4Wa$%M+uZT3o~;H@-p&r_xmUTQ%6PYep8$O56D3RScfus^1kh-!}vrv|9-j~QLpM{ zHPkwkOQmV~?;+Nqln;o0KiyD-XLjAXKB5h!eC~lg8hs^`{v#e^x%DSX&8ru+BbKZpa<`p`$W)#_suym>Ik)O z?m9sa-Z%GmK@Z+HHxXl%Q2XYV3wrRrxn~4Dc;8$iMjhey&DC*4()FnZxzpXhpQ2~q zoID(CKi3{$b4Smk_R4XZ*F0Ir+1~yA+%_lgI&)pxD>r4I_R5VLHz9S3F-JL6?3HW68_f$< z9L;Kzl!5CMzTPmq5Ob7!pyo30wemeK9Ow3(+$$Hbw~de2C?4|Bh1%P8IOvjsf4cDEK&i`fU_^d=nMVNSa(IJ@_W+$SC;u7Hwn{e0=$w69r!?_}o$OF@Ec# z;A4{95+&bbQSdR}{u%`z!~G%(KIU&93N^V<`N6H6BctGB{yL-JI~sh`qTu6O$)+gy zhJo+;DENkh@3AQO_&)0WDEK(~{X7((=}jM4v`Sq60^cmPPn7xN)SMlGdt$Re=YGyh z)C+dj2ch=F?go7Wc&_A&TsT%Wq4vabxyTm9Lq0lVFRA)wJZX4Cp}h{iw-qm|Zi6pi z&*{hD`7Dsn^e&I`&cn4^@$fet>oruN-E&6aWr%U(fqbVTPKD#C;cBIES5GM1-t%sy z=iN%ryOjfeLLp8Bst7E*Kg}x^aW)~>BOaFii5m+_GgMi z#{I8exmK|2N09wb?a!^ZKm%iB2u)>w4CjQ4EK+`p}vZ# z2jP#=3O!34ICv4ftqnB}>=nZI^Tg4zT6Swwo!5;Mg&bvtq$-w16N?@i7+RL#n;-T5 zfIt#Q=xY3AhNA=_=)r)V$SOhaN zP>q0LI9i(Uaf({6r$%U8+uGpfF_L4nQtX0itaYeU;*6lnrkCXT{rDxbl?z38i*Awm zNe(}ThqzVM@QWk9c}OD2^h;`Jt*`bpGwf;{x-4Q<6~N+cXhQ6o@MR>AZ;Y1NT3bsG z3q8%Xb&ZRV7IkwQn{hsNy`#1Y30ULsd0Kpqg&sG~mTCzVP%~3k233u%4GSDH)_zu` zmSGfDj*`ZP(X~}R987V1L*rIJwsreO)nJ~r_Bom=DHqmSppk@JGURkYNK#J zSzsx+^Tf+oEe&_R|B2;xL2fMsb_(u%2N8?eYwXeyST^o_ZxXBJbpV|)Yxdg5oYlr11!Agm{H2L*|7i7zsD6mH5;M| z_Z2Rto$eUcwU{{LL#8+#@=0tNbpnpWZ@f`$8wZ#P$Xr5>wlQuwfDE)5m)yEZOm5vI z7O&l@o}%hhn7`^2>Nt2pEq5_WcP@a4ruf+=elg|#7xpvqeY8#Jt>6CHX!}6NB{aXA zwu6MPqAP}_^Pa#yS*w4uU)}!b%et$MPwY1Rh2>S(Cw&%44$CJUeOcvTb_jCx7jhRK zV@JUVAD=o3fuk?09Ol2>b_^fF-96KT>L9$Fni_3Ra^8__ zu;ak^uqL$I^nIND|Nbf7t%Z+I0$<<3(U&zooH6q6)BM}V|Cts^&Lky=zN~WMg&fv+ zbbo&KN9=SCA0KYvr=u^c9M*+)8|xW5?-Pmti6nZiW5giz3O{ zs^rj@RZd?}{ONPU@D0e?@OmYvNAzWt!;Rnma`DEYE0Go9<)o=c^ktR9R>LpntGk-s zizH{Rl0#osIY~l}UM@a=>(%EY$@!&{Ltj=ov_OA+F1@MXpONIeq~y?-RSv2d$kEGJ z*6ACN6^a>80-fD1DfDHP!;)pUadiUSxrZ-@is9v)rsU9uQ>n2D95Lao5{0pm5U)J$m9xg1B!{a)d9-zW%{@ zZntIQPV4)4z&~foef@*mzPwy`HE!n9%~6TN*KXX|0?`c?*bQ4IOqajS_m@=YgEdD$ zYOwya+h~n+H?;rao=B;&UCE&@rmBDEIPF&MNmmu5icjdBkKNB+4p6bj3XGvy3W^PGgu2YR`(<`SI`gJxX5?k%Om!A|mZVR> z=$k=c_?A9_`@S(y;{ZIsTUNHSWNKbkSxH`=(-@hjPbe!C9t;7Eh5)CbShlmYv^1|c zqomLuN&1sR_JD9QGo4vQWd)_hxh9p!&5?EhZ<#ZHYDr#ZVR5OGqkMexo~np(zBQSO zoY>S}n3r3S?~j2#0l<`%GXMe7GaKR_d?n43ssrP2g3dtjtinX{m%D66EPAjgU6gY*fFwdoV&1VTUhlr7UJ9~vN~acNmH55rsT=?M zo^$TZotZmHV3L&TJ}C#RUZm^KlM^tAYng_$si^wLFIGX7Htqqg=LV;li@)!lJ;2q#r{b1bQ;mtxzpm z@E@}5e7mD$QDI&|z9Udo_&0bL(7_S1EnH)Z3Jde{@=6xkrRM{iP_B?Mw@va-U3 zxEQ2AOo}G(HsLS%Q>~N|q$P```L~_VzXk3u#cdRVPkQXjG z@2^^nYaKx*@)qXV4X&1;yC@?+Zy{_73Y10ZBDuN>AFPT^!eS$)X4M&L{zrg=%{xlV zN=pNKBy6z{_|Vl4U6q)$yS%o=i%CNp{C@+%Y85D=u)*!kuJ*Wu73qM|N>^j0l&=5c$WN^`}nrrK3krT449=gKxePJ1|mHU>rDuvv3x@9lGF|6y@O*W4%9 zu222fuPfUZ<=lk9MQ|RN#R7R>=)?J_bAce3#R9oh=)+@yd?NJWu|V?h#%UG{(mj<_odr3$f-4 z!HjVhA2nL4U%lz8vPDO=B7#JD4OkID_P&T9oa|#_R5OL7>2rVtW(t`;BfwBqbkylO zX;r%qzBy71616|7lA0%EE0luHmQFg`Of327Y=(J4VohfG2$}{Y&cp!Rx3cYMP{T|d zYR(StV9e9encwahgSk4|FeeD+0$IViKrZA5dE4SaSku}O-~J_L+!%!!H#2VTi zhmy2&p~Sw864MFr5DwAq#;+_rjM4wcE(%dlBoV zg|PWphj{NJ$QO`CAySOrlOlM0Y_tP8No5EoAE&Pf@c5)}LQwl?$k{6RElv~en->|& zoQz^LRO}>GK$of{2qS9p=(nLC=zv(}92GPJPJ!jjls}-%REH)>8vGpP6;!Ci{UKwJ zUmO)m2OL^325~0DBojE6z7<%9W9MsuoCJ9)FgpK8Ey3AoS@V61Z3XX&7)U{N<>>jm-bpb-D@qq$sK^F&%{*c`^pFMs~YP zD_h)kHL0HZS*d0&PXQBD`U3@PpV^&_^-WXVHDj;2MccItP`zef<*N2hO-sXZQyL@K zL+zf%3?ldgH=QAUQL^em!y<~tfE(QZxL96FgnvHE9%7TEjr$J#is#pmjHC_Tl5w#F zhVZE^k_>`>!f&6sUMUQM)=YuP7zVvhp@`hhOR62#l2-K5%4B2922u+j5y8}x?xsV~cmX1b zTB5YS(&)!9Kx!eK(X3^2Qp;hg9Z^fPJU_T)1H?vxWA8{UMQEcc@EAAo9P6ski4KbG z`DF|99gA}E?Wk`)1%c_*1;zHF?7ZR})V1T`W?oUByP&{cP*PNoTfC@XkLND%@7w^) zT#!C}w@~bi^z<1L?X&e!F~t`H530;%~0%zV0Rl<){+2+#EUx;iv6gv5r)Dp&2D@oQP0cs`Ci(+ z-U~avA$<^LXE#N==aYPANRiO)EZ8}eEf0Alw7V2G<)Lo@PfA>JqA zU&jRTJ`h2SUc^^fvKks#Sh6gus4%xGYe_!7FfBA3U(fL=%W;5;a;ge*;S7jRS&AiZ zEm@futXW;>ayP7MM0|u6rx!;tJ|zyTtK=GmtlUVslrGc^2qp$|vH|1R|5X!tSsa5O{1&ldV{H2ejj4@bjC;Y~Uc8vYUA zvUl6PQs-XjZLAkBYL%X5XE+>Y&5U8qjIkR*$-OnWqM{G=Va<$T&5Yr01bu&M8oaxe z?gnRFOO2~?EwK7k9(j31IoWV1?B91YV?=t9#x z>FvXUtCqDdO#;3iPprK?WzEYg+RsQs8@pZ%AnZFfLD9Lfbz`#TU1w-33D|r*>ZG`ZA-CBs_xPxU6&NlB_FBmk~>>xc0|JYC!r~c^N$xL zf@u=T&p?TYzr^{aT`88O9noj{-6hU1?eN7(v>Cc4{7SnPltu~NsrZ$4=c2@27^U5b zUtT~%w7>XEfA^PSV)V7cQ92CzQCg;7=kV)l{JQo2(q@0@SAILfY+oTyMAj3rgsoU$ zf0(@Zd@-^L9)oUr2&;f~$SSxT@{(Xyf$~@Nz$+N8cm<2G)g~`s*u)fqoi=pP=@rBP zc4q=I`2>t6#6#E}abPgI!t_6=NFsrbu{B~@L?0rP;C^8uf4C2160qUhlpg0@FbT*g zSOA?3as}jg$W4&wknak}Lm{t&#JTp}2Z=M|XA-=ON8CTj1fQi9g$*L~{O4MJ;d zB~go4rC`>A)9WWKGzE%Lf6YdE72}PjCmb}~26{>pOT1vs!Y>iQ-|bHA#S8`le{j1R z(g!cJFET8mXaoVd|8cRrg!u@%WQ4t0G8jHSyD7LCVC{6yPb_C!JeqN_1O@4$V3LUV z*lT~wgCCM;%@klTq)3JMm7AI9*GTj|0PGKD&0aGYW~p{qE0|}%DYx2&dy;d$vj6QW$TBWj7Ro*dk=0e&t5A~i@~xbLdu7py)kzsO#avoO0LucXl4 z6rr9@nn0k0yqp|IQCV43qzQE#`kgj0Eqz8trY(?q9Q&W1o+hoynn;kW2|T~>FDa6d z4n{>5@{RrrM3_Vz`~M;A+D1zo-VSyX*2E>yUjv)zYV1F6K{M6_`FxvTbE#ri@RpCn zns`Imz(gd;HZa`P&@My%ILyv&&T`=M+>j!&9AM{Awmd`;Sq`u%54AJgX55ruIVc-_ z(>#7SSAD~BI2(T@wf)UWiN`{dpUOcV2mdI)M7GBC@9ksyf8KV(`KLes z_lCNT&F?I`t)dCRpYWM!#$tF+=)+kInfRPE8`FP@(1)`ax`aNQ#o)l3q#29hTA>eT zF?=la;Vg!Ecyl#lF)-L{a!fdjVXM%GvlvqF@feB4@IF5*ciY8cu^8khpf#r78q;r$ z=?^C{S#wOSt*mKu?hcbF*mbVnl`RT`HKaevYrvu~SQG}Ewnt<7dtfkdx|(qQff%$u z3F~w!LA;_1OvZ~Q=>mfk>>nAbm#{oQQ~{&QA^G(A$|3ngrzBL5k2RDU@GGHp0`G*Y zM`@e=C8AqjAqNmF;AmLhip+IPr{Epf2!)>k-P8~$oORf?5Bc(u_z_7Au;;V72OM0V zC#O4P8_=FeE!ZtNkIv^l_x_JL3~9o4y1Ac1Hgplpm@6HqpxZ91aSSKkScHptT< z$3yxcCqNQ&i3~B{qShvAcc@Z=_PAg7v|nc&1RwPWgz3K@Nfdel6mLL{c`aGv-t}Wc z8IBtBYQYDgHq&_^5Kn>!?q@Cv8H5>*8WR-Z^~EGn$97Qcg3Ie;4TiqaDt zZ%DZ2R3cKzG(#=(x(r5FcMnIlt9Byc$h-rX)*gF74)3N&X^mQe4|(>-famZS1jeh6 z9+LuYN91;Xt=eHNX~jE6CL3Eej92G5F~d^LQQH4it%zEp{CB0%k6~cEIzQ#jS~efA z{%_Tes3pn_bs>}JvjIMm$T9(>p3)&`L!h+csi@PHZ;~Xu5PrYE=L@$<;SMl zQj5!Msiif@8?cbOywHMYEqHc-;aPR_4h%xeXOcAn9iOUJJa#df-dnv|4yd={u>-3+ zX7fqcXPtE3w<(@M#YbJ!@+VC@51$puF{i&e<)%$<-M)Nur}ph6_g!Fvzby63nlAou z=ju;m7oBzG?KhM|cL1ov$uUo?eYkkYwO5z#?bz*KHZNSW>dns+>Xy|Vu;a30z!bDb zpx-k4ZMe0p5$LX|?uNR4fT%6(*1~Qr?AF3=YomX*gm|z0FVay$ch(4WYXrIl-&*jk z4d2RpG6LN&z}$QUx&h$*505}k$1d*v2z1uklM(1P*6YOxbhFXsW~0)r5$F6570Vi3cBk@bbSEe+GpAMHG zx)JD&4^M8BT!KGOExK7hf>MTa3BpI9|Kh@p&fr>H3g;4#?_K7;%K=wKK_ffS-=0GsFA;1%$i8TV9tcl)m8~h{C^}n9p&>Iv> zp*PX^2XX{@L19r|QE7IRlnMEzI{>VS^h`CRyjQG=Su@fNv(Lwg5$JzF=nehmHXDIX z%3x43iQ8WX;veVkF(x}lpc|+%T*r$k6WcQ;+M)A(Gt&A3JTe>lbEI{Rr@CsbtJ%G3 z11I8*dc3t2Qr-geP3IHJwL;4GVMzI=HI=w=nT?k?-NW<6q*R#u}l#x1-!oZNIdB-?rDDE50OYWb){!nE{RnX`6d#Mi7Dvy?fbXG-7Y!+qep z^zMf5GOIs*ms@aH8VAUCDdLbct~^&EIaCv<>da4l#QW)T)Y68i86i}OXq#PE3{uMqn12#fy|`tS&gg$T4@7Gd!Q zp%0I+*eUek5f&GK9AOq=@f@KKkFfZn(1%A@91S03qzH>GmjBY#;Pq6lc6)1ER#tkv zuBQ5)21!@yb7WRoqjW6)rRBf0{FnXWzf>=nQ97@zVLH|@9m|2a_c<`}netQdVbZzR zQ;N!mIVWxUZuu~Ow-1y5D^-2s!Q5tfFf9+J<-r_44`$%rwfvWwCL{YC z1ZUw=Ity!?F&TVaqqDls#VJ-i-sTnz&7EvqnC&*EQ# zUz;40efjO*P1<+V*#(U=9@yf3;Zsffh0w1^ed~88x;K3GM$*|oy#7MlvzU%f=-$Pdr!aq`yW18fiXWARQ1z~GW6{i<==g`^VjYvTVwxGS-S*bkgty5zx*JA z|8iag|K(*7{FncT;J?g|;J>^sg8y#2nBKR+#kKn)Dw;TVZ$MRoV{>wdf z-&*`jPmAThwEUNS>%TO#j+{L4rB zfPcAuH~5#1{^Va?iVN$Me)nD0RyVt9syqk~;POU2eEb8;e`)zIE&t^}`Y(g-U(1JS z`7pKP0WgB=S9;*hPoH|>Ytx3UoR_oX_@$b5ozTZG-h8@q-vyWEzV*qpZO?!7o~CUV z`mE<%-~9E}%eE{X{A}8YCFiWxG`r=){Qb_aHSK!*4=2ZLjXm~_$GXkSx-&6^Xf})y0`hljrm_)7&jWnKY|Z) zdjucmf(Sm$t0MR?Kab$UTqJywg_FwDD;KOe|MhFNnd7(Jk)~-k3Vk>S^An*D=U`?< z@L{$^@L|3j!H2njH$KdDmJieNVOl=SscDsKot5qeXI)E;3ryS^cjHvyn2Kfu|2ik$ z6=X9l9#^xc54|yNk2CuIIlUX2T>a8N!Oe*J_yPXJaI@(5b8U5vYn6(~(8njDx_Py; zc1>R#L&G2+Psl4~ls+trg=w)cEkCB^$6SrSxanzWQ=4j5YM3RhBSdM8!62!Pi_OAsPsteV7Gw(4qJyue6cqeckXHXCK5sw%nF`q1*B&Gj^N~y`EAue#=>D z(`WCN-*RSH{L7pBz;C%?H~f~V{pq(n2Y$Nasa)S z>c+Kvme!bY{3%;}OHF$K0k@N5zW?}@lkXkU^~&1IPdstN!S8;EgCls7!|fk``qmA1 z54+~vm#&|F{IMTt+Hpd^rnaC=s~CLC=9#0v{(TgD%gqJjPAzo&@#K%LzI)WOqi18x z_>~cSmhVRJS!P7=Sza8$XW1FSXPFzpXL(HopXEmpe3o+~_$<$e;IsTo1fOMcH$KZI z%V%l%EG?g<<+HSWmU|NPwqN*`{x?g@V`+ITqr3(zkLBLyvBYcdPh!3vI`Vo-QTZ#U zPgj$N3$Nw$^t73oGt+0!G%B$M9Mjpe;nW{j$^rCNird!mRa(AE{2^Pu%Kx;lvT@VAedDv9+_v;j zZ@v?I$Y*t$c6kI}>nTO$ ztDIqRD@&F-Z1jC|{N;dfD_!d?Ze@eJy3*6^tgLgd)Tinc%e9!<1Mg9`)Z+_nsSS;F zjjJ1Nsmo^|ADe1REiSXAmewF|z(VfwLd#oec`FCdTd8hb%U@~vEAd}p`78g^{>sZI zop;K(b06CI;@tloJocRZpRu@=XLa2&`|T09HoNgxTHMNd%U@~vD=mMe<*(dp{FVMU zOUq+vaVw*|1}u-|-siEjxRn7fW>o&lnY+oYoE0_}{NX;}R&u)Z=K^~qN_H(d+qi2~ zo`#&&pWMnVxUd@gn_KB>a5isf^7cs>%l9mbrRB7=oR$OWv^3nk1LV1sSc(Q97?I%B4lQ zv>cdwp92$)te=Vxlg_=KlF`wJ@KTt)hpxV!5|3cQv{~shc5faY%ZDl6dGp=gf|iw- zb4xB~2OwFswnOnJ3OgUNZUR~{N zcCD?<^@sG{<1g{8M`NuBGzaMV`v#?g8{+8t-1qhiT0vZp|g`9`yCL1OC(e%L|`A@-Mf% z_U^y_c+v2GUb@5KvwWC3|I+edx~94t>NI!*`gq0!=PEVTaUZu^U(Ns8=x0&(tZTw_ z%-&V~wfpX-T9=wFJDN$iF?ToK0HfdCI(NO>+ZTt;noE4Q=8{q4q$>5nQ&rY{JkiX@ z6a0c{`7kXKW|Y@}<-@dmm@8ZUV{?i3yAN~LjLhAblV?u4(T6!yyM6f`<(>mI?GWWL zHBO;U6(>+XigT$OQ$n()+^*%i`o&S2Ru8-R`$-KaQWrc-uWP+mH-cnai(#{If2joX zK(i&6tq5)JI@mo2n|gd&F(o3~lfmn3_Btn46dx~?_@N{B4cNS+?ATR%a++P(6$abw zfXyeNb~P?s91|<__UJtRTG{A2?gtL>v|LAC*3zPiqQdOC6N<~1x$STRrDJ`ieG>&Wk6?%M1zw$&~%~c-PDJ|fNx~lpl80Y5}Q`BOLMt163 zUe+F5#@%{pkJS)-fw>ZsQdWB!rdJ~BLZyBKb0Oqz9w4tPV{ps|pmu;ZH07`qO^elv zDsrl_%1fqK6_!*u@*PXG1J$bGfmP*>#Y-I}ISy^KTDOmJU4^#4QjZ8ym*#2vYQs}b z#%5%y^E#{Qo3xRzJ}#MmB;{FE#V&7cV~uE-IxQZ$vT8W$U0zqSwvQH{G6C9_y2ggp zGiPX{u>2a#JR9m^(Cl`SGmovrr+fr$v-{+Rnrc^_P}20lAk&R=Dv95|!UTVqE5#Dq;omEYZaBB!gD>uT`Y9rk>ItC3S!Mv`~SzYIHH>_$zrREl= z7e_Qc}m-!NEZm2M5RDOXL^v zHpCZ`d!_2l%E49AHgwcYpbL#4j%y}jBg_FwDD;KOe z|MhFNnd7(Jk)~Yg%v2Mn61a=e_ zP|Z}T*#T9$RKZ$WY1-j@55_l5qIRSzC1^|AyEb*b2xa-Q<>x<~wrkg}2hy>0|5l_g zZf$qOx2{jtT84?jIL&*AUPwfty+K(&_}Dru?t?r^dkDYW`Vj3&{Nh6#x^4JH@G$89j$f(U<<||v$E4Iv^q1%e{|b2` zvYzN{=VrN%=`6gjAB<0OE`Nr66Y?A_nN9f<>l}=wF_2gJ`PVUFekg66HZqxwcObL- zm`_(vzF4>c5>w)_JQj_+8?Z7lWhagV7wfR!nJEt{<9(sw^4lTH-y4==aU4F!^8HFj z!G2zWJPPI8lpcP2ANzg~WEv#OzD!7f8@_Bv8)Pozc*tVNLm^8c4}&}oax&yf$SIJG zkVitE4mlO_H;~gIdCX=&;!{nV3HcAmIgnpNWC{57mxU zr9`b#l@heO{JMMmx(>hYaleiSoUJ5kulRM_{kkr{4h4~j#tczqoD8wVv%gjwJ^Go= zqsnuSACdRR9jh|huKUMhbT92TOQ?I+w*Xfv{SIR7GrJQ++o|rFvDe(9?ZO2er`cDz zs=ZUw(r}oR#t1=C8yA~}-=2~YK!UpkwFpVE6i9C`coARr#x&IcPjUa_VtHNh!o7dv zw0}vj&El>baG@BJaa%l^aj}G}2vIS`X?P%Nk4-P+Egq6+%@n8ERNwZO3h^7ORVmM> zu9W=`Y@W4@5E!=<7t2=B0g>d^x28-jQVN5>bt{snB}#=#!+S%utUxnfHD)bed+LQJ z`YZVhyr!8%Em7kABa>*^0JFhiftCrh^^|z;!7&=*0oSUkFac_nz_w6c0=INdt;@N_ z;b~Hf<+Ux|n#Oev{v#!=bhWZ7Y;b$Ct3571R4A=jM(aMfvp~o zf2vt(KaCeQRawa6g0E1FN(skS?}9(|#1K0>W84@nUba_*JY3YS?QdarX&vgZP@(sQm-ySE zc72H@-;AED?Qbl(&egCQ_(Y3$RR$3Qcf;zaXLtO<0+cO4*#eXYVAzh|E5zGZfXODe z^8g{r@|)uZJls=&>%Pcu1}$gFab*=%rHcfXOjWW{6_zZ^Dk{va%36}YJ1}r$l#|G< z7hAO8%-#W)U*cFVqwswgR6A$uT7}r==hCLR`{i|5v(K;FgOX`O9lR zWM;=6*7(SQH_ceO)L88f=egE!Exh2E3+&i8+Nuy)=t zH-7TSHHUTjG_3@$?8z|)+-J-_-oHQe8$klFW>9F=+D0$ z@hraeh5nZ1E63lo;Pib;&VOO(puc{F58ii${)7u&%SnA@#t+-x)W`iC246>V%maVg zb>_kA&iwZ!^_N{S?v_{3|1WS|pUgMU-Tu^#Fitl>{I3U(Bl>Y1Bu?~EE7rK5emKic zYut|*0qrr2fL`k#w_GWBK=S(S>v3Ujk2Crk!|C17r0%ai?w>X8XHUlc^zseW0xqqA zKv7-;7I66^1TLp%8c<3FT&C$LC9q5dT&AV#z-9DMsUHLlK&9A>A3fEf(hPlza8eQ% z?Z7*yz(wuEMbogPaM2O>0T|u+v!4ySAD_lr=d{jLYUc043o>-{`*x1)JV5FInLtOR zqH}2H;QQ%`1h_~%k;PE_uLimfWUga68}GzM{Lc+tDE`Mf#L(#Ezjh>kL=yO)Z~>C$ z>v5mz68K*SRx&dY;8MvKD*!*jD1-)`fEMsIp$QDHmIal#En;|l9VZsX1i!Dq@GvIH zcQ}^eKNVOW{OG=USSGfY3rTFR6q4B9GDsUFQHb%7>^m@%9x%7tU?s7%yHtt&kckXt z(PgnXMl6Z5_!^4hEKcTGoQ)-Q7713jjJ=-rtsQY?VmHOlcAtsSY%h)u<;CUcXYLO#I_eFx5ac8LaX5{C~ch7&ZHJWh4=n(Xqb$Im?SHC{^ z>JN9EiCchM=s+HWtZxZL+yXiT9)r^Y2z(?Ua2iZNZfJCRU0x3yVTma`X%o=@#uhI& zfjvu1>B6-|GcN1MIhWUq8|ibDI*|3mKJzXb4F&g!DHT27e&Bfe7C;iYUIB^Y?pqC+ z4!H>ujsf5GkhqWqvW>Ihdj!jwkdHy)juS}te8|_ad<^7!kaoyVA+sQNLgqjYj?uJS z$bBGjE`0|;=0lE!EP$K~FuphX9U<7N?Q z2!44)G_6AX@<+66z(w&Vk3RDj=AX~Vd7b6*h^5@=#l2=s#v>Mw6>+h|N%bQ(RFp2b zyyY5W9a(lN)ljux0XP#+M6@$Pt-oXHt!Ha^#6(K}qgJq%w7S`EDvwy8W$sN}tWJrz z@x`})rPuLSF%<4oW!54MAImM%k);<_n&mv&b!h~P%+R>pc(OKme&SN-d}g@ zlJ45!Ba4ZTD7mKvN~6x8fzB`-Hoc=WEJquH&Jg?}6--X>U(mtoUUC*h^CtgP3l>!6 z*sIdY?2AeZ3rcc|^6m0jx?t9Vi8 z+=4~<3rmX%?Cu8hddf1t$ey2_U+gGyl-QjMW-gc^94!lGfITci`z@GJqsR7JFk`jb zTWi-AR8~7ffHUfUJ-3{jl3J?U|vR5AZbR%u3s>G4L7b(tJfiQB0!X zY5ZwS;Qlw`X>9eMe_j_zCOi#0o|eNyZXde|PvdG-FUG(14*p{!@qRMnLGX_<2Rx0{ z>QTjeUGg*x7dCW!gSb+EoT1EQ#)IH}eseGEPKMq6VRq&`hzU4u#)R#5_%C6#f=}$j zU^hkC@=!+Nk)*>WBh=1tx3Nj`DzcRgmzj8+aZdYYjQ)-2ar1!jDxAXO-?;K*@CA=f z;Rno6aZ1Nt6XTbG_>+^D9APVMLKXL^pkml^z^6l;%4W?Pq;JhZ-%aFQKL^tag=!wx zbq@yVw|K>^8%(Q^ck{qdDn7%5?+!doP52bMF?9aFi!;H&@xQ^BIf=6B1mK%FKBWoI z?6uWm>^l4b@gi;jA_Qc4z0DPPk#WfZ^ZcHvs^SB8b~;9<4};-k{C#@s#klnrtfg-Y zYerxV$E|y-SIeR6X4~bUd@t(MuM~s)QO)93-1Ua0y^NQj`Ki&|mpiRaL|F)09m$Cv=% zK@fVZiGdiCJx*&GB?>mJ1p~*Eo)Y802$!SC?>mJ;cc2)8LK8)lDD+rSnu%ZfIVB3s zx)Oz!c0{429pM{-!4id*c0{IZ$mZBHUA!I01ZtQ!1~mfxwc-K`wy) zAjlPvI7+@|NH{Eg{{uMzawFtKNZ?2s*c(3X%VbDyo0z@%=;z1P+C=SXRZ7r%?nih- zu-`rge7pI3C2@$9KY;f-6h=*;8}d zgWEA8n>?Cvu|z&}WK#`jZhQpSQD~wyla2)ka1qvyizPC`RO|fwdmYJ>n&4j@Okgee zDUb@pFMn*%7!gUH|K4M!q$V-3R&YBK`6brEbpL_1SLxf9n&96v)go&JBb)Ki1dz>Z zUmSBzckTR1wZmF+Pd`=~eNO}Nm3iKJkEj1jwIgbYGD9KAWE1<2met_$1gOngHXmF* zPPHRyi3Vo|w`{O*6&EZl&F>q)RP2c% zfV=AB-f3rsyAn_RBn&5I?D4>J2qyS<(6sNu?9B1hX8lpbib#?0)U~iXRoQaaBjKrM z!sgsiJH!3LZSZcnNZD|isZa6Ld-0rJKR|e@rxp|XRUtsGYc*!)i56A;!5XP#m^v^Bs~od_HlDCQC5&|-@Kg&s6&UHOQ*PSy*6qtjcWU2Ga{qX+ z)3zCFpRIc4oCm(&_n?s}2S0zTrag$aD6?_tvG_7djtL)^ew@&Uk4wKt=)=dQC*jK| zIVOBux=ZN8$EE*C=)=dQ55<>Ja!mNR^b>?Wd|djkgg$&+dY90Lk4vA9@1scL(&PAr z6SZd}3_P*MrMJ{a5vSXlkJ7fvFco&ae=6*?aw_Zy1HrBND83G0;&&o>t?C#X?sr2J?CW zoBBr-cRjKlMqQmBwQk(0wG4$Zy@*dawo$Y@wuzC)+fayeAdEE%JI_yg0v*})APxTa zy+fDAfBmw%|?LIGX)#XpafOR9T0Z>O;u4nqsO!k9UEravL4U6OoBqs^p6m zV{^H6Ae~x6OT8Gr8-l7DhwGjyDr^fG%&QOX-Jlsp#owfF1(JOx2FvbVt@Jtui+vFo z?085A)}fESBFIUQOCS$}#K)GvUaKJ|WBFvrBOvP_kAfs-%kjY*AUQ7B2bm7p1~~`v zB1lHA{vG6e$Oj>T`}%kc?U3B#$XM=|YHgynQUdES2YK{EJML9no!X|?w|gNBDICWolEPX{631PW z^XMCL+4#$2&lCuY&6`#xi5&(I6}H!V{1q3xNURl%zrv4zc8JX|J)QaOr#d1kHNn5f zt3}od#$Vw_P*^5Sdct2Xp%D^mN&NLOvCJQv=wSeV<)g+7B{d(<{IY6C)Dq<#N@HkQ z;jegdnzn3?zw$E zerdt47W`_#uLBCds(Uxc)1}|f0|dHqTX?8!8(b|% zR*8R=$!yh!sK(*~waN=hmsI$tvmU1m1_cbV3oEM1E0z?NYR$gVn?6O;%x$wbCU3W4eb73G<~(%7~+Az+Re5b zj=%5uG}rv*w_?Tb?cI1(06@xMa-bKrFRkSZyCH}o~YT?b{2cxem;L&cf_>G!oytLXT&-2 zG`f@vyCz=BE}ZXprEEJ3m<=1j$H@=y4&Jd`wDokHvb8@t|FM@m>1#+h7yu zwnqlp-W9NIPthZi8?3*_`gVuj@)>^XZ6+A)j_qp)NujFA%gv!AbXz6?%N+4WWU*OZ+1KhnEH=Ur?dNp?+7xU-M#Uq zAmd?Rfh0rIS-)fL_q%p&+W52&OCAiee_9^5P6u=Zf0Zr{$Fg%ebxGh5hk8j zHE7+U?qKTtt&eDTB)1no-4|E0RT-o_zRGzr_1!V3D-%!m>!O;9}Jw z5ZVI#Hrc6Ug#s!derC64B6)2I>BI5!`JH#gz0~&{D z91uGhd6dS;=ZA?>8A?FqpgRqv38HipN;XmY2qlcJ$J+gH3lT}fc2U9@NtBvV0>XyU zFHz#r8l`PTiCm0P+8X#vN1`-DYeEUU4d~85>1a{95Tz8c_G*-Pl80zFqI85P(bsyo zDBXqzr^$U6*7;Ko(L}TVt~s+q;v31Ze;$9#Zkx%Vg9fVdr0{( z4~$60XbK+n5-CVOY`y~~B+uxZLD9!B{z*J?dfKhU5!ztA?!+P>IXDM?MNxK9m1D^g z92CEbHfbS>85yC9*`bQ`P{oW;#q)akMF08;D z2bg>g(-%aT;b153U@s0SX5$pC+=b;hoO%K7vRR!qC8ipog0v~t;PhQMLy0L5K`{Xe zw^-sMflKSf($i{5ajZVaiY8nmdg3*41x`4@@fxMaedpu#f<^?x>QKlPSjK%TW=z2S z;X4bO6&xYg- z2_W|QWz6tp=$af((LH-@`49G6Xvmw8LJO}bC$TrAtAU8wC#o=!m zav#W_L+%fGA>;(eEs#e-UJN-K66e^r0P-@(0?5lD7eZbExft?F$a2VQAWwk27IG!z z^^h*e8zA{0;nUeX>Iqs9{}hRALzEJ<`GZSR;W@K`;ZT+exf3F z@0BP4;;lz_y)T!IzdZI#l7NW+;Y=>^d4kR2+(47gH^S?%NKKs3q@#36kY*M% zoBbLrh<7(W7g$TQGkrQre3D5GZS)@UJusFnPv^GyGz{1*prJ^*4Y$Q7YQUykSp?eQ zdn%vG0h^{U8}2Hf>;ao|LTzTS&-{0gHt69D{I6;J{|MCjbyzJPAKs+_n?Hrw%!Y>l zV*wjJy<}2*idP^_<9}hm=2P87Q#N>S!m$priNlgix()mM8M17L=agILdoVR|L1BId zQ`76IQTVK6Vl5m>B=%P(ZrvCXg!g@1EQxDO|Ehi92fdEe1pk(+c33O8ouSag#nvhF z%R5rO>8_pARXeN|Okj-{?dW$v_643Bx@+e?)edXPJ$*N5PuZP+25J03X0Qe??xw_3 zb4u$_xd8+5^kAitSGZ_-k3tHis&*3CA7s2w1-ERV=OxmnSCm%9xDKMU>R%WW)yw|G zIhkpgzr=iUlMua(Mr5>YYDQR->Xmh_DvuY%)j<{9)w9gh2!P^pA|6T&2Ee*kxiL|M zu|+WrnOU`!Zm*d-hyxqck_xyIq+8k8Sm&y4&?k`TWlSVf=5L9;G&iRtyRgX4zi;zE zOnNY-V*8?nImI~(i~5B1t4^UQ;n!ZZ1iYl2T9=`P0Qh9BQx2ADj zga7j1vlvUW)AY$|Y)n1HSjx;y%MgZw2b?ToEL~;OG&?S0CNm!JCH_la+L*;y^5HG= zRoE@%TNo0n*coFfB-T+GR=AaoFcfy+*&61&qW(nW2k@4+-vL~b?U}`5O2(sP3T)=` zEfI+iSjiU-@Z_oIph$e&Q(<#@sGUjw&V|i~%8vURsek{5%`m>%BKi9l z(jFP}^I)@3y#?~YW7ghvu)6~`C48es^0yaqoasvODH~ykA2WV5?Jnqr-D$A9Hp~v^ zEtqaCj`M*w7#k9{+o4{)Ds(m5JJ_Z#Ny+O4*Jj_$(er1V@&6ehK6B`UH)>wO9eBcT+NMDnX6BYRhjSh7IZfVT65O1epz$l>gMWtoB6aR%j6jSa>Hcp z%W^7Lx*IBUil(~OyEJEgjh5=Pr4~lh6(b05OFh2OmfFx**SNaTmbx5R%JO4VZK=g& zw$#!ZZ8fr5$W+tyU{(CyOvF1g5s^e~ zgeoOyHY_tAuJU9^X0j2Ok5u_6NM>+kM4k%CJWXX{c+5l_nTgji6Afi1p2$q(lbPrp zGf_@v;)KjZG@0kBJRg#Ify!Bs%-JgEKr-j5?0{s>Q#l`!xj^MYNalqqFM?z)Qn?tC zxkTksNaiw?7eg{HQJJ_cGrgzGOI2P5$-G?UVhoenbB13dkTbFBiKamFVV&I}yog&PmTVtdjPu+!!h$G0SLanKX+ z5^J4;F?5P0oj12$ z^H1Nzi%L)2K8bBZA#;_o22HU~IPt#OkU04wbQn&&j~5|MxQ`bfPP&i%u7hM(Mj}h% z5=)6Bf(c!M=&aN|?$@Cp(*F1zqRKikG@8@Nqi;B!Y`K31QeXePHorlTHqVq0RkgFhtUP7HVO*buJ}AqPj?8?V#<2et0p z)iU&c-c6m(&KEXqO!A@V8IF*HV5PSgC%46P7DB7xx>wpbshvqJ)Ji)@YQatC!w{6UlrUIiiN_3Omdc`V6`qx~!0k zmUVc)e~WxSHzJae_#Ai?DIUQ%ZDcYx(}B!Q>6=3lPa#rx`4n1=Qy>Tf9`rrH^KDQ% z6Q-{*7@~S&X&Nu`yO8z7{_>f%FBCT_C|Fm(ud@CT&h2$SZ8{`(q^B}K) z+zfdY?15^ea{zh6N98}eF6 z9>-ro@}NvXmNyYg@+M*_L1S&H`%;xaJal?pUXPz^*q<}lg`UzLJ_vDqH9lE?3h@rf zT!_WK2GVuc9g!SZV#&y2h{JMREO`t}e`wppx0i^CN0CX?(u^zzu8E7~KQf!j>^kN) zNn3pJofpSKVMs>W;$Y}8ZyoLjmY4>K((8@lja91rzoS)YkY>YH{7e&Q`5zn{J5aV` zPP9r>?TA{U%-3C+{4Fb@72hq)S~iaz$TtcmQA?EgGAWa2*}#+FLnd&ceMGi*HpdJz6_>u_s6){>rhKSUkRer(oy-UZXb|*Rx$CDiRUXouHe%pKsUU%`S=Vi-eh}3ZJPmYX$dkA7}zJxSQ6UaCLX>9D*al z#9C-4u%j66!FKff=A@TCT-seb$EkK$OYUjA((sd$ExT5>te#kb)q*%5=pi+c5(h|B z1)iA_I2FXWfYSJy9!%Zx-)F(J{KC>jrFQuT zW6p*%rP1}0f~U4rP;4*AFUT#-&+8K^UFZ&(QtGD7o{=WwSV|U~pYNtvZBh#!Tw2=f z*|Tl7IWyBU1AMmx?T+Pll>d5+{4eI&H{-kYW==sn{xv@IUup6>!skKQoPzgY)g(NI zUq@!*Q^1VZRfe___tUf!_<@8(yGU^_&sR3WP}qgfDafbj)nRsayYWtAecoroa6F7j z@U@!5`E$czm!fRB>yh|#V_|bhsGZ?HIS8+b7sB`yFV@$u^mwbiH0ceSOVjuX zZ}GYIc0Sj$TQ6xkBLCBD*NLMizA$vqU7B_`-m1*_T>lpO@OXx0_}(>(XLzg7hx57O z@D*#u=c*L?a6Z=`gg%_l^@Grd$1_}lFJQBHhF1xFIG^i%p%3SCO~yBIBtF+S{9d;B zTzfdhn8oL+#jM&Aexc+xH8=DR*SBenQ^n?thU9D!xPF8LuIZUNH4D)TRY1cueICI;K*KaW z>>*zL1hU_Og5cKJ$*m#!nUTj@ypOSe;^Px5n;w0OsA{1 z1DTs=Iu~!k#wcRvLN`AIOlKVe(bplH&mU-XB?vlC2TYlnh|j3xixsFjH$DN`h?>)C z0^FGrAlAt2AqdU>=!yLxNKQCKhp-L=D9yg%$Ow@9AjkqN9|8$XMYBPk1c}Z0K<**4 z!{>#Z1i1etLq@AVwqj!w#_3MJ+0Oz3bF$2!lLd( z{l#IN^RK7BOB@-08jlh_=TyQzV~I|2Gw7T8-R|hh7I$4us;7RI>3~k*7RS2@@QSHT zH7m8x?9Rserm60lvDe(9?b-z>OtY_YRePtVrQ!4{jS;k`zda=*EJ>&=E|wrh zPss>b3lKY&*BU;UwNb}E`gaL|-u~Aca8VeOaa%lU0L;-*)?$*8c24^H zrP`sBfL8-1SkpTs`)q)D5@^$_xF`&_YJ@g}o|%0BROXl1%km2I%kpwd`y%Ftv3sT< zWiamRKaaucUc$i%(`L^E!8(w7LOe6(WEc?7;R5kI3ir?~ak|VA&vBtwX+pA&oR_O= z+M9S-oETzfH$gm0P$3gYrZJfzo;IBHb71#dg;Mgij1;-!b=bV6?0CIJLLNVcO=qZ` zfy2Q*oq-0vg3Y=ExFp#eX8mJO!#7~_j$-2k`ez_3pgx%gDdX5uAj$p(+wpJD)(gAS zVK+6*&K$YDEzHh5(#Bn(c72JoK8gq4X#<6{hK4JO8g3n8h1#&-Rts(&P`EYpCJusL zLst$|uniIU&q82FSI?YX&>X|B01*$yFSR9dqLIDpS<_<>%afulNA_AhL?%tm}54dbbZ!I z=Y5;v8B~1KH7$PvL0#xie|5@Do8G#8`RGpV+ez-b-q5s{rG8n{#UJim{b}r?v#z}T z21XA&059FiF;A?0xOm95SC{YY2<*v!8#L?c&#(FH!^zJkE!qE#=P*4y-lEJ9*aUn` znMKs77W(jr8V?D5I08FLAgAFo%GC>fI0E~m(1#il059`4c01(1+KQ-wAeWv!M0Tx+8dgM&Zf`GZM!6sJjB;Ud za(jAbwIEpwl8y2juprqVAtXCvcVlWytVpv>bggW%&4+L|*|?l;JJNQNP(V+GT=2++ z46L1R1H6lhST`eGhj#-YaJnI|hl=7cOAqXUx6d9TECAbWbLi7^aV)oYUw^Cxtb1uY z)^>gjl?tgqMC2>viELUWx{0?Ua~;!_A!w@)I(rD($~p%l=OaHIJajqi`CNq%<(^)~ zPndxAxP79mL_aE&ax~CS_6Z(kANLPqT6{#B;5qh9ha?I+ z7m_G!HY7Z;zFbJ6vD^>T?EyXQfYm<8iQ40;#190S2;dQil8NJKhRAdGPZR}$pG*Y* zXe{{={CKTp?DeeB+F?F6KRIAvHa5R?V^XXqK@7Ox@dKJ6(w`BxE=9;#4=#oH*7bu9 zU#m>;HH+B`ySPEDX^&s?%;ff^@o@_WwH3dDP#rj&Cd2$I+k<8q+}7^cHuL2N@Uf0e*}ZS2cm|1Iv>nJ>3)d_@~^$)j;gyW(CFlOQIwZjZ@y>?9XqC+9}2 z*o4UsU+KJf)5b0zTH@q$U1H+8uFh%DY3Pd5VdA>3&au=%sdSjQu1n`3B#0^My4vDZ zH~=2)5I#a0RFaQylqk)_?_^QRz%Q>9IcJ=-E5)+3<8^f?vYazc+QG3Pu7FY6spuoG zDsu({p$&E=37IJo7mAU=@FsNGA@>yP@cQMPQGW=&r!YU)YHw{-*sUe*DsHC(nf=$d zhoUc5O!9@#UO`z{*VtU+5fK7t!#k@Xph{Loir2ts0Q$6EUbHFa^kSV;1vNsS!ix>i zKV^&_ASd!7D`Gpcp15zkUy1i~-TW1z8Ar z4CF${LdZpsOCXCNITKPbae`O8%A= z`G9|2W-Xh?3dmEfh+3k2qS9!ZXxV`D^3NeImJa~_Sx(E{uvs3l8z0NZ9dAs=BgV%T z`V$*CVnfBTTVp>S_j72fQ;MN->jq-VFs$i4G37kf4r^i4NcW3h{>UR1K$5vPaj|?I zU^@NUg?RSJI#Lt-`=nZAtzgPaA~bQar>pe`*HzrvT{~YWJJt%OyzmhepuF6(ZSGs$ zwUdhT!Ngj!*DI7p?Wuu2G8{I&qmMMA4M86X`=^pGfx*0s=;#b<8l`AR{wQD4U!2XrDzoBN4SiRQ*0AnQTSvC8-w44 zw(4PX9N&+TNc=EkeAJ?Wa;*F#-qo4#YOfe6f%}hoGCs~9$5J4fF+O;eU)>A4lVNvL zn4LM}V<08Kb|iHaz9z z6!~mKj7+bys=f(dt-YRVg=C8fsNPc7*svNCfs<_U8a|Lc8|pC^OS9WqwZ^ppG4SG3 zK7zK{eR4xhwX04jY5HK0X->rwe*@(~4RABD=;jhnbvJd%=~#gl%P?dKVNEbJUXVdp zu~}6-5GLGTv8O{k)`iAP}=Eil1qlBplInq=1jfY+1%)9T;;W`m2)O~ z409$L2A5m03p`#|Q+;)VyIM^9*fTNBV$S@SnKRwKwMWU2ux6eK`kS%>7xe8cbkPT( zsrF#@UT^g6IGepSu2p>y=D|~4*9X19)D+bX)pZ*@ZcnABv8CCG#fCHRAN`SL6(-6x*aaPjxSO%K*zwjZ_F`KCURh1GX6XF9X1ruT%nGl&+GGjtSAUXt? z5Q9yE9khRWGC2)pyGEy>+1AJ7=Y6>y1r0M2c-OXnDOaV7RfF_Z+lG24MymJqYhycF zJ7QXQ#gVKx%q(1t_;Zt~VFw*alicdvRA=@y;E;z^V}I;ElI|2Z1?J zwhes%FW1_UPsbJSL_NJ_@)80qxBs*C$(Z)r&MRfC#?I0QL?EJ`}OX7~| zoC}`U5YB}SD#^K^H(kbnpwC~%fEb06TdAsZu9G2@$269>tb;>WqU~|$+}bhx(vULTmWfT?$EngS1{$;g1Os&_jcTBqdQ6bCuA&T4S543St_?e+9B_T%z}InG8^(S$Q;Ng zAoC%ghg=Bxe~@IQ@OmhMsI=8>;1aZ{JIb}3@+CG;lgzL3e3w!Pq-}b zz|qr@VhMN6Pl6LeG&fe?bs?YZtXLnU2%0}54y)o~dGis^eed@3&yx&~E4Li;d`K;c zXO>gTqZt=Vq?hO}ljO3@d7IjfbGmEi0o4v`$zH#wH2R(f!ko~5XT}FI4|DRFYDd%( z<#=2TGTFqwqh-Z3N`Ts|Wpk#{{;C~OOEk#GkxZgx141sDG^gpSyOHzJhLJy_|DF0L zZdg=WSWuEvly8?0CUfeCX*`r-`=W)8;-aFQ5<8w^<`vau@)y}l^YRvDmloyq1!qL< zgeg;`FNrr`oy-D}J&<~egMx@k(=&xRStrSYb#nN4O|z>rWX3wVB=oj2VV#uWP4QLO zO$ue57@h^(L>eAYp>a^`8dx0$mKyC&M0Vp5_9P!;NbG_cJ0%HM&);D45!tLreBMNg zmof%_D&y223oqPA?2p4>GbPl{q<`tK*`n;a>))?ob2s0qk^KD&X^%7Lybqht6{Cdr znA!gFm1-H@NB=?QDw4mwkmJlJuFXb^Kr&y_ROuefDKFbzGTn*20dvRDE3VCtiGD(;xmgtV-aX90?mLD zXsTxgk!J!o^T685ngc=*wXu~)8){j$7Bo4@ov?TJg?+4SCOO}ia$P-YC0 zuY^9FK~jV-NHYe>Z-qXbL9$Ee!(*=;i!aFJm~aNk-9jJEAo)h@gg%@>G7;a4kr*WZ; z8D+=jnWv~sNRas`m4O5iD<)1X@-#?h z@==(98;cCwnAkCKW08Ry6FU|`!GRq!+JVR%s?AI;2y>>&b0L}MsSI41*fOIahzxw0 z7&D_Fh-`;s&QduWk~v4^Tu5ez%6X8?`6?GcG8d}65R!S3%0-aO#VVITGMB1c2Fbiw zCC@-j%~7>0K&}5HGkySP}E$q*LGj0_om@8UL{=ScF{Km?3)>>P1#{NnBC z4Jm}+KenhDo1C35Y}%OQgPviSlEjoy$#P1lBn{WR(qc*|YB41g_FPU01zSuBMJ=X; z;_--4wwMx%+K?%scoswGfc&$Pbig^H#3vE6qytVvNzwtOT`88O9sd}n3OhdjrQKO5 z@tzr_F~|>}MCKuwh;Fhg>@ZX4v*)+a%?r6;S%(+Mx5)Q%BO-}sj|#!WN00}jKrxWA z`=?KedipHJBTP(F;z6$yQ`nmc$i`Wv_>h}`8`Xr8r=C>2xbH&N6Z^^M)V@&MsFc^> zVrAd2gXEw8^^hwdvEIj<^Vg8Lz_s5%UIBR%iByHb`#ccE|@H?}U635<1@t zkiUa`6Y}?vA42{C@}H3RLb8ANLH--^K}a6IKSFYEry$Flhb4LQu#_MIL`hwjvcqIl zPOr=B@sqzocwtfd1C4Q!a4I8WFgTbRADusi5J;p^#A06q>C&r9j}I)dWF$ewVL2|A zqza}-es?opQ6eTDMJ7=zh&IMGak2c%<<^hb_o0&|ZLIQl$Gi%KAsGV$4Tc^REL{97 zF%1%>{q9Q2l*`875o%$OCdfjDd7Sts8%#rz?U)msCaQKsEm7v9N+y5Hir~bT2eX#V z2~G=DE25StS1S#_T|oCTkT&8)%lZ*}|D3mRui-#wDQA^t_$!Hm@rdD_E98j9izD{g zuh04@xE7b1lqx=K>j_u`S{*jX()foS&y!pCK6`Dos-%Q*>wGzki{-;gKVJ!=G~>6w z)h`W0<+D{eL2lhZFyW&lKS2 z@O9M=YvJq|dbp2hhu;WHo434lfWB?13I64u7ZYotoj`X4=UiStT)!c6N@;iPWT|#| zrOQ1fGhHT|XxX*0W%WerIv)9T34&kuI6fq%s8ejlue;HIktib*e%%=SF?<+eXE%xJbP}5QeiS~* zN6WT&qnq)___lC9Y&Px}u#>zw!_|*fyp-=$Hqufv<%gY&m46DeGv|j*#_=#F!4EV1 z9dI3=M@PXfP1$nSB`+<&Ue)d9!seJzI|CP$cD&IFlns}ec>F+x{O^m_w6d`gBS0Fg zXic7GXJv$u)V9>)3vHr4Av8lGy;xb!mX$|rQEaWaPw8&-_*=!)m zX6n{8e(dOX^T4ppKEs3WY&=a(xMmh_%$l>ynzQR>cV6=?4evUqe0OKg$8bI44JtY2 z#09Z`)!z8s>#JU=uE-m_?=&m&&{_C9^0)F=j!8Fq4+RsnlFT zY$*iD9t)KOvgy~8acu~~N+6q#%Ta>3GES7}Q2Yv6M~_ex{G<*@9sCH52h)gkq48ko zU?sG>5cv*MSXw<`1t#4AD`qC*A1e7`Mf?|HNCvQ35Mc=4+Lajvx2GdE=}HeUL%_=i zLK0rak?<8jVo!bS*Flin8u1MCxFmO}wTaq2ssy;V#S38F5BK&dzT54e4tB?%#-lXE zzjT;b;_3M*fWP$d_mqqfqy&F?fzZo;;`x6VBSFAzckKLCa63j2kVi8vmi~Vo1eCEp zhQ>Xg5L}B(`mG^jeNcmqs3agQ1L(%~dJo?5+%mCNFnGuFABe~ioAvE<9ZsWtXcA}| zl&lpD-UYy4))_q}CAGVDeoiAK){@}eePWqEHqpaCL=Fl5^4JiUVCrt}pC_e>pvX$3 z{w<|3w5$MY2@r?3Yz|m=sdhvyQI69)B>QYYL3na|2RJeWkrD3GA837n-Yv2h>mapO!;=W9<Hp^fV^@K0=oA~ z4=CWVIMYLb+MT43G2V-jP{0e7joJlM6p(=XFT?E2QNZ}XgG4kL2?b1oU9z&}#T^L+ zJPd#Bxf9#$m`@V#?AuGCsLKOm{Q$wCP&l+Z#6Yoli%1fhi8yq;Ph zp%q;s%4@&^34eqj;f%BlTdM6O+k9JKdXnje8A}vMI9-Pl;e6|9d~Q-;s*zZ8ln`@i zU^b4{cZYuc`q*c_e*OH4_?Wh(JM~#LFuHc97+sqr$I#mMj@y|i1Ai6$_Gj*7h;y3kRvtV8&b0MD)F@T1?8(8H+MWHl;w z0-9=oGtnb3N#ceEOp-%q^*JdTR&MaRJb*#~wGgKCA?u0#B23AlSYD+hJjuQimLyDh z2;{Ml;~}dd4~1-ioCvuN@-WCVArFT!V&n%qMXDqdP?CaC$BG}6Dw}|ZlOfo-p{}0-@)yKqnyMy zSc^#_bSHlFzJ%bUQvDKdV+x?0yt`$R*k52&6x-`P%86@OB-S!RIfVjIlsN{M%-$V+u^8lrU1(MuvFkz?&+SQoP3fo32ao9-WR|8@wdE3C?}sa zOv8}n$s2}aC6j2`fb#Sn6%DbF(ji&V}~Eg6xt!M^1j90GFX{3#=o5s#I4PRt6qkcrh9pAD>i6K>uu zz&SJ319lX2W+NWsap}b1wjRd6BqS1qB4M4sR5rp;*rnNx!;7isKhGV#u;ZZX2YX?+ z26j(`*_mUfX*j;d6bU;`=Xp@JJmitE(`?w}h1wbJDsGF|X_>O&GE<*or#It7uI=xL z{jLT^xT$LKuFB{u@bn8SWWP0v(gIHh5(@KsZM zb;}1gO#JKPlP)@^acS2h2UVVe&=mNtGK=2-wa|x0?=QjklUelsn}t3+dVdVQlagb? zqxT;#^x@I_e=qdm(fhv>`ta!eW%yb$i{5{Q(1%Cwe^=hmhhbvyiNs+gzPcUne_|Bo7>>f6izTyBnC9`14FQtP;vcte92G!l z2b&ds@3=TbpBN=P&`h#-OOeBs(Ah-;TI%RMuH9pEfeEwCS5&yJED{6Yj?c zqPF9H_-+I1mT-p{Q8|vSZtJ{d)5dK+XgrD74A9;-M^|SabO3dAT^w~YsDo134WjN~ zp+gj9S$8mXYNI(~qodl3yXM8OMb}W;))s$15tto^W1Wiq-0nz5pywyGr1s*St&haC z6$5;h-8n$6Ih zv%L&{GlczN@tZ zS3_63qYFW^N3=ePwJ57A!hfFI&f=BZE`D3L$H>LjhpCJkan5E|I-d)>CK5JA3p^t@ zZ|zIt&r4cpJoqbuHt@(dLt5WEWYe=9{z~U28xDcqkJk4VYBQ+T?>t?f8iVf)fd*qvut?v!p^eo48%6&K8jYqyg?|R;B^u3$(15Ori zmz{0@&)${5M^#<#mjptb1PB@nZgoIVP=T-qK}|?P5=aP3P^8fil7Wn5Yi7b$(V=m} zNY(al-FK?it!P^XiyEy(w6X!-4C8Cjf5);s}MF1fm^< z=!uxLlDB{-1K$RcUh*DrEbtRxI*`+9#{mZbvChz7-~`|>;6&g_z)8S~z{$YLz$w5? z;56VY;B?@8;Hkh;U>2|fI0M)S%m$th%mH2l%mv;GM4Jyi1k3~e5||Hc1r`8F8UP<6 z6puDL8+Z(`5O_SW2$%t!11tgJiV4*N=K?nX=K-66^MO|b&j9`y2&zHopTI@HG~DOT z0#*VS1K$9C0~o~dKO49PxCFQ!xD?m~tN^kFl6d3pec(nc;T4u_+^QvyaTg>u^km~+ zEqUn1UaqxdI|a0vm>je>oMqz|TbFzk zS&x$wL>>Se3zOmmowm2ng(`3VMdgwdCkS07u7AVe1;Di@8ql!!F?eZM8uSU+CcB0w z(%|J3wn4`rHxz34uWnx=7>X%#pll?_ROA*WL6Z=_LN8yudpr7>&bP2d+p!et2_G=U z5{fs^-m`gYVbXa$?BJPjPu5l^upvqEvSyoKYQ-&L&8A6LULSZ1V3JZI6`92ht7grI z;?au?Q=n>g_xiw_2a}W%DG*t+jk&=y-aW4m-$ot6hjMwq5WR3F81gCLU+Xh0$M5^& zyuB#1c-GA9nRD{8GST_&hmZKe%$)q$d9#WO^E3Um?&VDX@P(Ok@@M83&MlhVBjT0w zC>#Xl)zqo!ChZEiFXq*_^z`xL#hzX!1_<-&HLqc0N}IrgOl5?9sZdtJ6nH1J(*mkUP|G_ z^NXhRKjaJFxVUfS0p)OFjEa)9Mf0Vbl9!30X z5je`5T~|}@ul6+V|;0SV;l-r)}44guMSp#J1gf1Z`VnK>T%0nSzcD{|D5<-ZtG3OdV@IZ zHA@4*@}RFQhzF6RK~r!tW)>9Y8iym3giL*~s=-%YSzTA*uU%GW@V)RwJUH;Cm>PHH zwjrOkUi^b)wGw`PT0N!QY z7+xQX-pTMP!aJ)Q!|QI*I~iV_3FF4_I!p9UhSx))cQU;GEqW)zs~E4JZVaz$MDJvH zwTa%z@QV4_k9p9DdC-_VslwaxZikcM&R{HCDPAy!;FCM+&gWXA>^am<>zI_$J zHT9Z7*~{+dV}ABmmR8o8&hwW0gH;aadC{@Q>>f1qW0L#RZH(X*bD`10HV`9teJKfE zHh&q~&%T}WrCn%PoG-)p2j0LqoRw_s){@6aA2)uUE%^!yw+pB4vjW3qyLI>NJ+c6jHo_RaDRZUMPfxgwWuFVK0fmF1M zgEru=ScEG|CgJLB43stJrffF`gLZ}2IAoHVjR`MpX*~F2LN)^R%wDpa1v2|stFVOqFWTJ_N!B_nVgHMEw?vAy4oleoqTMZ#YOTW( z_P=O%OQc!ru!Q|D+PxA@tGz}e{K_OXtv=cqcwu6kw9pC9Hmx3F47~cujfIDt)OCx@ zJlfhuOX%LJn{7qATf%Ft!xHwtXg5l zeM@(%rQ2cYUb1uv=yp|o{UNFPCRw`EE!_o{wAotvsHOX}rR%VC$Kaf)nooeFkA|f? z%hIj1qz(!ob57 zDU3Nhi-hjLI!^(nq76<1t^<-e_c!3Fz%$W;uA1&+|1!F~y)2I+6H7%hmbfI6{X;uYj~8F!QdxW3$uWzDwop zzsKuLUxOSbvf|kNwqc#JcG0kFZjI3J=KH**VHLQK`{KY|rOd>imD<8>TI1Y8vd0qQ*%LEWRebna zS6ld;GSi$h`xf$LCLHZ+az=$@EZO6{r1 zFjITVWh=Cex$j{wVLYCZtyi_5=Ld~JKO3FMGGmfbB3M9pefsdMtjs9hoEjb#&YZt|QW-xW z>*s_BhhyeV{opd`W@Kd+7Z>Ku$uG*z)LYOspKf+$UQzLkIRyp1L#LC2<4UE=ESq1F zU6x(tt5~rhSYEN>3@{BdGmKu1<1{6G>QrIOsh@o@>@p@!w)r+o7KR1e4kq6%;sUmh3q~v$b8xtCYVP5k=wT0l{r08hxg88n+kx@dj2MHhDDmbS7fgC9 z_noVrc?)l6OYkP08aHRc*onuykdX5I-xmA(>~6zHn60A!?48zgA5QFOU3tyfXAk`P zpZ()V_~B(Q92xlGfU>dA{$XxrpYIyR zPekuzu%+Nl*NwsE6TOqc_PFSs47PrFKTeHvGT6Q$`q@KozU+kY{pP*&u>ZSH+%*vI zuy=^w$zbacy_3N<4sXew`6x@^J8X}?csVIHF&||r^kcW!D=vqRvnG1ZQ3|Z8Z@_cw zvN4~Ni?*1LvaX15F$UWyrS%PU%NxpTyvs1xC*U2qdcUY6K{VdwJ--T8mRI_g>8q)i zsd{joT2Zy4H&}}HL4%0L(ypFYd&p#pxhspgD~qw&_Nz-OukLw&L`V4LwdK`o0{%d0 zpsul@0@>O+%&GC$)v})&UXtz|?ps=qfKJ1G{(3L-6TK&S8R1FvRH#fqEzQ8vQyKjU z1+i@WB&WNw$xe4=_{OT;l_`SSr+5|=f?6LE)Hu*=5!7t_Gk1cTjeq7wPy<0{LvGT> z+&xh&v>i?Bb_fe?$F8Y(B_PFwmLmx zp?IHFL$=^m!#F9ob!u)09h4)D5bXvG?41re7Sq*+ zH)n?;?a|qjJ9&pE)SbLT8Upu`$z<*v2U#(9junX?+xZPQQ9_FFOSoe0C_4@tD!UR$ z9B)_59c5RCJopnRLEg+DSxO%|BSiNmq~RiUK;rOSqCqYVhZ@~|Iq`!$_l6(HnXbY+ zjop`13QC_A<;#g>$eJMjh8rWv&K`-l(F%uz>uACMbo`s^f*9IQ4hfkbcpEc@;lH-A z2IB|&z;`LQnCNBb~A^$26>kjP(&H!@TvVkLjIY2rE$pel7<^wZ< z1;7$uA#gE}Y?5l=93cHU%?DlqTmZZmi1r!!32-6sVc;U*fqHt|z9WHQJM%`N5-^ z5YMqgllh^%&J2C+m!`s2l-5jPe@M8Hj8Cx|S-UVlGN5@sLPO%oPD_J~>Ix|sUTm

fxv-)7nRN4K>%T zG?Blz=qyV`@-x^chxr*Zt_a|IR{IcHgUY?Gl`N&Kl5j*-@@fqo(uFnlaaG)*^tw!w zuDlkpgJY6XBITOJ46e)WbA;dQBKa9zc`agB$t0yjisF>m#%>jV>ugEH6UDfoEhoW#>O{O1NTRo*Lxf9looK zAY&7WU920Ig2M{yFpTi#(PAccic1mZJaGy8!y9nJx<%i#xCxzc6@Cbt`=jlGzSU+= z!}|Dc@d#{M2BM1A?$X-rrOI=s{fPivt2*b^Xj?TODUXqTyP3{hx^1QdvD;lyX z$exK(h1q2VIq-U&G-x4mmT#Q$Y9HO>1cD8X6+yg6CJjo!;xc&6!4h2?UF($j>y|by zlWqFEeg3%fBVNIm6JOUOZ z`TEx;{(c7hpyMsijYILi=$#yjJiNQPc>%gz^iB@NC!%-8d0T*Yx70W%hvGibJ2@2p z6upx}QGj;L-!7rrS^KXnX5%d4k!!{6OOney` z6H^_Gi3#Zr#>9kli!sr2j>g0c&AteSl$&I8LZm$oSxgR$Up9BF?--7+kiyaUJ%T-L z#c-3!(SUm%ED|z-cZG9PEYggQpf9i|iT+NM1&3)ph^%)S<(ZR03 z>w5e4=8qUXDrw%iaeMK-R{R7_`)DVn4Y`||)@?ExJzM%Cw`&Q^&m9P3usJr(gQK7M zASKKd%ciH(HsmT+$JbfkrnzQaeRN&TxjS|piwc@QIv3uDQmo}k*1EPet=ncadfkhw zE%*cW6_pEXVsmru=7A30!vju4gwa0FC= zjtwPG_GvFe2r;Zo!m3gKOb)$du#S!m7x8qF0kR8$>N=VpW7Y_c))k=ilYhp+(CbS6 zjncDLYo+a5!o~>;+iVtkBQ__%e8WQQrau3>jskt4`J*asgF4jMsCnk;NVQH!t3HdV zX52R%wN~tfjvUVq!L^a- z@MUc6HUdix_Jp5U5{*^(#rOmMZ^JJ>Q9#;?Uyiva8b6mjbsWM|CH`XRc=DB9JgQf< zFkaIL=o5{6NcipoX+9*iv;q=`N7IbEEQwxQR4w${qU`=)>2_MWPb`Uz;h*>)j(;<8 zaD+R_H8Nd*_e?vlg*=AIQM?wG;aJ7rQS+PJbx9Gt7Jls$J`3w^!SYJ{NAg()YKqEH z`~XHb(gz$+ESj}qGEo$3WfK~q7rV}{SoD!%a$2e?8%Sg!?PaqzsSif`NMU?3ljgEU zws0G4U)G=-vzD)-U3_$ybZV(cn|Pfz%4)wdWBvFt^@uDh?kaa1!uR;2FSX;JHBTd+0LY6~G68R{|dgUIlCcUJLv!@H$`z z@CG2SgByWeb9m0gRt>-rOE$itC6BS((s4+fOFhOaOZP2HcZsEIwsedXr|P4JaaHy% zOLwoOd&JWH%+kGR=~^uvRxarX{NkgSPHaQkec(qB<<6giOJM7%$Z2*a?!6M&HO0L1 zbTrTHGi_dI&~AV-QzG9C!qO<@_b$KyZEI2>zG9dRGzqq|y; z^Rj3X{+T|A>T2(SZoDxNy+$~(3{Sx!z*oav?KcCQ5nko1u15fqqm4sTS#JyeC*nV{ zn`IBiHBLhhUyfyp2guw~$+5ExVtKgdWABzF%h>ZVH$!q}$GIBU6&uKh_{Zg7C2lLb zAyjSf)G@(DfOJDg0Z&BU3#aDzX0NRhMotG1pXR03iu)r zbx4TDlYo1XKN;8u>l_1QH#8o|V>JQD-069C!o(oI!=DokJ9iasFGO~Q=8{P<2qK%z1)fZ|vW|O;5n@U}a zloA=YBb}_8wND#fF>W=x`?R@C*CM4vzD;X*4Pl#Y91@H?pk`iu+`F6a{vqyx$QZM( zea61)(Aduo`-FseJ}z+Unfi(Jhld6{pz`+L%{tQ$Yfmub?9}i&W|Hl(aZu2$p=R8W z_n97tMFfXS9vjQb{5ADuWzxsN35;ZxHTZl{rr&IY3qD_&Z?$QIflG{DYPT`sO(r)` z->Y6^)Ha#@?${|4#*Y(Tlls{g4+>G+CQcPo@}QJYnK8q}xt$y-Hy+gUJdyU~!h^~@ zyn8-n{)Kvq2IG-%h^mn1$&F{!f_2^sn64lp`psg{LSo5UKL|a*B(4xRgYO!e~YoIVyvndtLneYsyawsV?IES zHwQiP5t>sK7v@yWfLpoTtU1=A`0%2FIVHJyx$`kkOEIw$!iyH<7tb##GYyW`27ST? zGYU$|7L?2{n3IP$AXU6?cxiEVNv^g0YkGNNc=?=#g@t%JROR}G^~E!0z3E=`q(h;#9NaaFYWK5ckhw}{SoY2_X? z?iera0QqAT%e3o}UUnH$Qy%l}a{$g@V!X8d@|_clPPe}ya6%-0vhcLU~R;Pm$wv(D0JDz;IZvtp*>pGr%r*Fc# zJzMcWZ2aQ~Fi_k!jAU;piA!mJ+9W*5N-?tSAUvImVQ~`IQZ;dHk4aeqajlIUr9DoL zk{)^HPTEGEMiS&YVF+*3x`(nwSgf={9llQ@{1XxwWpeF_r4gQpp-_#KGnGbUBs|6-eU165d;N;;_rUB2PwBN2~ymeVX4_+>o8Dt?B7LC%wO+v8^#xGe9y^ zPRdFFCnLe+WU%?zu8eWWf+K)7on=Y2kUDSO9DQOXysVj`TQ~cMXm$q6@Juene^=~` z&fE6>voqL!!|V*^W=P}v5ZkZ_|7PO0vE^}p(8460jF!Re9SsDNLc(%^048jSV&Ej` z(VE0z5?YfuOya(wl}d}^wW(SZCB>$ob7iSa_kNy~u+VG3B3*B3m)CbZ(@jo2@X4(mXYveMf_oDjp$vEEQqPR#b z!`4H*DiuGH;y8IZSSRzBr6XsxE%;~EJQq5lBae!6H_+&d)+>qOq$Z%Fk5J%hi&S8P zA{FWAr|d8PnlcVyJqVf}?@)M%+@U={M{OG9-)9RCon>|=rJfL`E*z@flq z;4t8KfyV)_1C9XR3dF5UT&0Z!@}#hDR97-3btO~s$nyhRbF#q;kCI11;AM#JR{T;@ z?#I}|mHRPD9^-NRvV|ubPie_xya0)9J=u6!OCF;Q5?g(;v{FhQVPUcTCksc8622bd zsErpLIbM`J_}HkfiDV;9OCG}uiC0XrP?;$q6f$(YPLd@YA0>~$dl#>hWP|rEN*-~F z#w#Y-D1nZW$5;(X9T)ncQOAYN`K!PUBb#Jj$<97vSDX<4FZ`klF;@I0p;57q9{BMU zW@FdY+1W=tnhEhOIJ(Jtsp5vMy5N_)wZaCpW>VZRN@@JjiT4D<@XD`}l!oopOiGh$ zW`Rn>YfdF$F*Sre{qUyZ#@BLZf-TjxNGXxmXbrb4(t8%4klbo^XM$a->yc6--x67~ zjrD?W{ivD!1JBCIbx&Wf&c!XaOv6)9 zv$q7E|AhFR_+?M$tDaq|)_&UbU)-e&X|S)IV+4qxhtq*RP0}H<9e+CY>OX3Q4S45d zIs`{GK|IefcdKZ4*Tap3-2~~`(jG;_&ctA^$So8NyBt!!!y0x`B!`DJ?8rzb4{O-T z2}{YUN17P>WlO^j)2Om*#<4#tkI?X*&R*UsHI5t2wiwoMqj_ftYq+xev?jsi@|8d# z*HHHuchAB)ig9Ps=ek3&i{RuPY`$HY{Yk?!cFM%@llOytH+9N{3}qf>->vY5<53lH6lA$3| zXA#}zb;GU!<@{g9}f{%^}%s= zCLe9D#!bWIi{Y`sWTE927h0^m7-8>=O4y6n?&anb&lR_FF*kHyG&giTA^6GX49>>p z15j$*ncIeZ+IsOnhFv#caM9_HW<8@`1XAO^dxgJcSl+0bAN}hum!JLN!+$lz(>oYu z#Yg^d$J#4j8+*voY1z9LFI1o3Qsa{5U4DMWVW(f6^X9u_+kXA_pYZ_%D@cvY`jzjK zS6})5RSWw*mp*X*CCf3xRrE8ix&PAgOmw9C)AE$f`i{yiwr zr|9IH8u7)4v(HoG&VS{^yVt*Y|Cxuk8~+~R-~0wXWuZ@k{*3zX{dLds_u^+?blv^8 zFMw^i=zp>Dv8bqicZ=Q`)h`auWvOw_sDAmPcSiNQP4v#FekyvOGpgS>y!EEWIivbr zF8b<^e~|rX``pz>7AN%Ie#f*&4dXweKjZkOM-Knnk3X&I_st=PcLebII1_K^Zc+Vi z61_93pJMnqnSXQf7Vj3-?}wsydZdfT`+I7flleDW^iJmAEuwcu^?OJ3PUc@a-au31 zoXo#Q(Qkcx?}cAqb>YAMujc#L9(_;i4>2Z+cAm$#`Y$T;FA%H*wWjBu%IIgamumT( z!sEplgou}2)nj&3urlV^uD+(c)?Z#4Xs9T~!3fsXR5Yxq4@%xaT&wX1Dtdm{V+_JC zEQ7EcuRbwGVa(5658FVDQTSzK6lRzn?808>GE6dGnBONY5hrj~wlt0>6NPEkFb(zMPNIxxw_U}J9ThTLsdaKCL$Eq#!u>#%vB zZh(85+$aq^pG9flZLY&;jBh^!WWWse)5B0R?50jrK}zM8_ohri8@+dKRs zg5|oVeb6(xGQPEi<7d0hz%K8q1_MTGC9a@H7%;m|!7?%hTj!qZHT|iD-PdhyTDRHa zH4cPnZ|!2=T^Gs*cfFT$I@wF%Np2=jGA$09Zf4s+n}q8*E58HzKH-Css&^mG;CNWt zN9~#xJ|^e(C$qD;C<#=`Rycs$Y@<@{;Q`w0LZ#dzPJGy+Y=kja3J^@_0Lqc5AAx@| z1607m6GY;e-Eksutd4^fDqx|qD@I<~anO##J1StIvU>%24h<10T02Aw#4O>|E|!r&8@@|FECS(*ijq?$xyHY8Qz980Q#G(?tGL*n5~WMn}ZO;0o~ zgv3!L_W+0-zv3~&TcV^_@cL(Ge{R6C)1%m*EW`aI-e7Wlj7Udu_D`n5AL2?{P-qeU zQ}C}7wlj)9v|rgM=Fm6?lV?zvNmMwauq=1}e3&S5j~8DQ>KcRMJ&s#6Oyy1Qab%SS zp(crxEK|CpOMr3o9Cjb`!8I={+ODG$NCLzw_&H~Ow{u{uhKoAYYX&ktVp^K3(16~eX z0=x=X0c03ZjB$ou0S1771>%s4v$#f}f#b6p*ble{H~_d7NM^!$z{7!H1B8wSUI3g5 zTn{V;ej7+p0nXNJ}2$F-YtUl8q;|;d*#u=gl)*4{ho#&4CBAL{}vVAC=hyA#Idj z{wU&Dn18``-Th#eH|Tm;iUhQ9J^iGf2EF_rSDt&Fxo)kBfbBZRQm7|fjXVk{A{$Na z^KReVRXs8Q0y{oHs69=`xl+k1TNoza;n@Ov%C=*gs5a(KzB^qTNhzt2&(11YHETC) z{4niSvpf0Dr|XeYQeikSq10?6sj%^PkAy`Zo{=Q1h=(A%%d_G7S!DQ>sZ++g7jig2 zJIE0(voq%u=Vs;2DxT9T5iWIyUna~L*ASOwW%Dt>y`ZWwSXsBK*7DvLsn&kq3Tpkq z8RY?=6}?nhnQCL~lt~lE?+1%)+@z_PpvFWNS&GE6+>SnlPf1K}EV7TR#;9xz7awjr z&~?)ttvzMB#Ih_zOZ*J|Zox2Ri6<#npJun>S{RMTx?hb^c6b8oltuPE)g>!Ku}jai zcNbj1r<&WlVb>pa4|Kz>4t76t*txUKPGp~LOJKRVvdzZ8PWpG)@{o7ti*7pXGIgDn zo$W&As_?{T%!*!bZ?etqN9VTkV6)A9t9wi}+a05t#i(X6s@WHYYKBYtAo0u$VVdp0 zBXEpqCSK|OcU;2_f-5<)%J5}o{#kQN%8F;>vz$^TYSoN|GiT<`FDpJHcmB-6;xqB_ zAr|}8jD312LX6&ds0!2C7_1=g10O_^27TV~P~Fzso8IR>LW9_ehfY2O#h7XTYs|FA zUYT@b%Y!Yq`o3*sUY^h}-7x-*j|gr)>9X+&z>S%9z383Hw10};$xJK4Cjd8Q+MS|z zGSl{o-pNeM$0vZ)I43jhM$tQ&X>W<%$xIuKmmD`{T7&4_nQ1wEmGAKVT@BL025!8zXL5JoNfs{aFz5za z6e6H)wt|tuW!=E0)p)amQfO95&1rGMWizv&Ty0sIYkS0-dcWg+)MnG@u`WxPYHJfunOVhd`{Rdv% z($ta;e~Sr4t(V4uC@4X6Ti37KCR>L%fruO1dRfu7OBwS|E!_1Xs)B`V>q*LDyRjYt z0-K&h0NqyCGLP#r+?N8g%(rc2wmrEsX~bSwIW`8IQuhVz)!Ygko?8?B2q(4W2H#77Sj6`;PtUTBPJYx|U=b*}E3mtPMrmHX?klI&{365I9oz zAqYHaUVk0_=k+vpT94}%E$+OglRB%Z z4P4eu=H7vxZ0_BF&g=T4blNU^*I8XpNdea*^*vd{t75x>xZM$Lemh&QrNR1|cEzjX zd-ncrL1yP$Flc}4;vjn`=lvJ5Xg`k3-JRF9W`FA{?Yu5^YjN2wxBEm|=k@%R9SSep z=yu)NnMZHi*|7o>Xn*R8Z@<9(ptmnDw+Nj0xf>DoyLn-1f^f9k?00{-yj5*GzI{?B zH63CyzteUF{>@tpf~L1hcaLqw#_pNl{HwVeh59Dl!J@^&?;ef=X5)9GJxL<57Tt>^ z(rQh4EynP^1j}&cnZ=k}Eq9Wwl)iq`CN4RB~mv9C>9| zZ`n0MDik}AT6KM-+~$jJFr=A~(hSmUb42^bsVU?L=b_B*k6*6cSmCH~{!^ohnivNaUs@8cCLvVo9lx z#>&z(NT6)PZU`hYC=-pNA&nBr3+V)rhC>=5(nv_dMLHSMFp<(Bc}1ECiCo)6BLmXW zB29-hP^3&q(B2<4iG+1=S_+q~G3cwD?>Bsp zG83;SP7iq;icirOGYtiKn%5e7UYQ<(-XgRF`H{f&K=ddQ#2fu~=uYI(*GLd=^ym`A z8@*8I73k6Hhd4a}eO9Oqh&w~*P^=60iqHu_^m!ppa6&H_ngqmsCBzwSrvVoL(RYRx z0keSRz!|`0K=inw^}w0Hi-GyTD}V*S{{!NF7rGx<1bhgHyJm>fr*OXvwE!0YUk8=| z{{TD#_zv()Uk=m#za zRs&Z7Yk=ng>wp&lahDF!yGj6f7Z6P%bRTdf@Tb64z(;^v zn}DAIF9b4J_r<_u;3dHRz{`MXz-HhPz>UDK1Fr-Q2VMmn4g4-J1Nc2)7Vv6dA@KXa zg}`fpOMrM-4EcdK02_ce0)xPtfZqb%3=9Ep2VMre1NdFwCg63z9{_I#{t);B;61>n zfcF7^3A`Wp7VrV!yTBg-_X0Nqhx9Rw2Z2L@4*@3te+(=J{sed~@Tb54@L}LZz(;`e z4zmUL7;r1_x4_4Me*r!Yj6>Uh0+olb4mb=L z1mZ~|gb%yM2;gPFIxfF}W4fOx?RJqsKI{4H=S@D1R2;9r0ffc*}^ z^BwRIAe^p;4h2pD9t+F>4h2pFjsi{x&I6tbTmZzphfpan6X*wK0apNXfaE~r0)xOj z;2K~)a6Pa9cqypTeB_dOUCMie$9NRdp`ydJ zq^FrZ3u%z(a6O3R5!dyHi4JXAp0GW}JCM>u*RCax+@uDkMR#kxFcg*c5BIF^ugU=l<4@mo)Q9mKsrHmM`+1o z91m%P=y)Ha>1(3j!YRSV{x}8l+n~C+!DnQHsZ~ zCBkN>!-mI@uW;dd_D0*_0|{QWB5Zg=Q%RpM%$dXuI>KhO!-m_;*HLRPrm|*!+@l7b z_H9#Vaau9Sb0B`19vE})#RjgE&Qg|M#8Qz{aM2V|4~ns4f>Wx)#RpIT31)?E3Z{+#G~QzU{zT_Pce>AMjQlf=r{;k?|u;U z!svsb)twv!bE)GX=mpUSL91O3f?g7F5X?&SLD;{E;o7<=vv}6b?3r`&vNG{>efp%+ zhiA_?eR$5C(CwtC}g2GHbdb=0Yrg?KSbLM2_ z&B)D~(W`UFeXCt3kY~yS^6V;K#fk;N@`@E_ls5!2anud-KXe=xnzhj)6S%&P*ug zIA9cg-JlO4Z*tyRu{}$gyZK<<) zY%uaRh35eDWwYozJ@^Q0{`;zV1sXEX^u5BB+nnrZ(Ld$2>RT8(i#=jEI+rQZh1p_ zjd!MPK17kfqMz3DfN1qA*hG#As?Hye-*E_nn68~$E$vLwiHn}`D zx%^;GE|0#3?eR>amyJ0{GtEChr}z|l+Ard?WzPEzV*4;;TU%Ea#P{cj<=kOpQ;a zbrt2+KGuTg@5YKCNFPaq60o>TEzz}2p~hdgw2?!}pZ{EB=e*-&td$!vv!F0n4nq<$ z`Y>Qie}jdMo1xIy&JC>QUD-Wla$ z2Da5L$^}2ExJ9|p(JvfPE;zoL8t061!I#d|IA@fLt)h2ExiD})PmOa%xj0Mo&L|hR ziQXCILPfuDM!Cqrw~5ra(1qo#<=@@pTU2}5Z-%F=uEGZz(L1ADkTc*mm$*#y&bh>o zirzVwnB#?RbBQ?)m>TDtOZ>FxopXu%@8RcRMzC@(P zxz8m&gkKISPATo>xp6hUGM6|OodRd3UOxmL$fVf7D!KnH8}m5@=kV88#iCPGdjqyd z@Rb#%{@RM_#!6qQ+&EPbiQc}vV$mrkk1DOPUWHbwSD{YM!~fhI;OK|eeLT?iw3F~J zuPv|sT-s^k3Bg~+3BePc zaVjP{<5Wxv$EnbfD&EI4p+u@k1>bh-bmZJ3RrGP4@@tzD>^^DOHYeC^((uMyPOeG8 zT$?1@l(tqzjtDZu!Y;lI$po6VX-O*&Rnmr}EgV3DnVE z@Jwz8Rw{F_J7f+vf`)Wp4t8Kfb8b>XZpXlflgv5EePkNco=f8~Z%It|v_B`OVb6x7 z2`%n3nb@LiGntyLk#O?C@wz7oLp{RV8i|~mM>Jd{4$*r>%D^wbJga#`%B~oBWmf`; z-_6xLB4xK6d1Y5`*)>8MEOu-0tL(l5i61x8jAQVYe5gp|K@WnIXpkv(qUg?nG)kmu zNcdWSrJSYC;dJ+)6Co_+?$eg(8oZ6!XNYjvJ}YX52+NRrM%>Abkz}7C68(sP-8eLr zt7*Z1I{wXZd5EZ`>!}`&rE0>!JZ!SR78{;Ch_wyFKi(s7lF0k#?s#$LFrbEmlsqVn z7AkL=aGsj}&Ll-l?mw54&Cj3{taP>HI1zw3#qAfyE?KNr;<30E`JvF5q!t__VfUk) zu=|e#F2QoNhtPW93Ba3yXaU0RKN+|gdGHQHTYzJLPXR%(2t5l#OB0s=MBrPkG|5AcDoCYL+lCuCF1!e+& z3(Nw(2b=-?0GJKj1Iz;+8n0#pOac}lPcCC2ka05R07=Y1+Yj;7kVELsdc6%x*ftR$ zK}#NT&!sgclVvWFhkS8q>&aw@i{vp%uqCWH*;u5dF4>9xa4dx$e^9W;Pl#^n`*<4W zbz`Qn5O`xy31?MbqhAH0B8N@)m7GLHUS%wJ;mqw7BKI^2nlKIL z>gzJlHK=v#A`$R6onxu4=uZ2JiGUdel5ktoYm1Crz=e?%zXPW`k*m%WraOI4Ys{mH z_zMR_ce-8I!?VD)2r5Bj&9*^s_PF8WEXJMu>_8oMN>X%JrWS^^GScF!t*EQ?MKF89 z7Mjm=aA`1wnK}8h5gnm0Khs~^B?~4WRGYjRS$PF{dA-4ciQe!378S-bcFL3~6HLMj zaGzWl%RJ15*^Vbop){kh94HrN3HoL}5ZF_uON<3}pjU$n(|3rn-*Ucrg z+X|aens379pP8CE!`?m7j*k%6I5;WpT$nq%VaN46)D1gON{z=HcJ5r56Zs@>OPz6H z#=vg8w&gY685d?cY%-(mY~27?bsqj_X&dI5cs|fX#^&VC%vxAjQdltKlwm~+&d8o$ zk~1t)TU-drSW)f*sB?1)O0wqUWEamVDVVb`*ULL4$B^%Xu<9UjVeB-<9`j)S84I!y zDbNY;(ZV-#uD2?X*qrK6%se?IHM*z)NasoRjx*ujrk;mjt|e zy7690MepRj{8aQ#-phYP@ARQRAFrgTaZcXL^`dw3UN{fk&4>O-ypndtd-;T~t3Ccq z^*Q;_kMUl5I;0)ry&Mo-C3iiC7iiTh~>P1g_@_@+;>q#a2nq3Zt*_wbqP#UOfY^XrC zwk}v6^w-sryEMEc-8VA?o(h!-s7wZyp6c}uACH1qHh%w! zF5>(CeLMsHw|Oo*u?=uH52x@pj>}c}F4-B!r4h@bI4*rGf=G9|Z`qO8@-?v|uSMBi28kd4(WZF#r{c$2lT{g)AB}Sm5JL{8qwun=n}NfzzR{1d_o*R^4g9OMzst(9udJ z@L^yU@Fn03U^_4y_%1L9_z^H4H~{-w06YOW3pff`1RMuMD-TTo&INYOWVs1j&vuz? z+@>WDy)0@b%VsTkjGsYbJ5RPaEgoYownQ;mOis&xg~_t7=UX%aE8)cA5;POL3Uxt# z6{ss5<=j_tQdf9cv8&6@zVdQKU75D&TUSQbV;}#-*EtO1vy@4_&_1?)lDsjp6mzs@ zilnZP1ehRN5>?V6Es4;KgJzMXK?V~g&Ez#A=^Lb+bl)!zJrFUmRAfDDHQo2iQ^`t@ zSPC18bcOu#CwdF}LDzkv3NKhDmWtfMBxn-iIkwBRWbi#$rCPVrME*Xbvn+*rD$9fA zT7!EJ>M_sEvw3S_(s?~`=meNpN?DE78nvffc3Onyz=pMRN*rXY~dP#lFw~ zMFvVn#uU&B%(O2C%G3!{$1B?~1LZ?JVenCt=|CAMm!fa(4g=*Jbc>IHfpXLlYJKd| z-54lUuzMXgS-NBFih=T@aOWwND&~f*Lx7fT{_$?u@p0g}ZrGglpI>p<=~w5x`R>@Z zU%&lli7Ei5K+Gdc?|Nj(D>QPiJ^kAEpKCtv`d5Fu72hzP5(bLXBa26vCQfEbx#*qD zlx?DSGE>s4{KH|(?R2Vd73?jOW}5}=R4xESq*QDw42OIxLSY9i~T?GAz@P?BPhHIcdeSBjMR4VOF0FMVp_=ZR6L^ z_CuO;+r*Jb8wC0sDMes*Gje#J4Y@m-b9YR5X)B)9jolwKtK8#~`*`>7j(TbL?-HJy z@KV#d&Bnn0dkXQH6MnN{A!r*ZO*`YJ=C%d;qf#(CnoHLA*|2bP`}Z^pL?|B}+l|EL zq7Ly7)3JVCYY3~*{$V;UD{7^Gm=5s|)3J*~g0L{K#etD#Vfcs9g_S0_SvI9C63tr0WPdoZ2r7Xe>CK1Djri z8iy1|vT5B8W8j5XNxox4Zrd}t+aMcM2h(wwo7yf&&fO;Q>Fw*qk|%felQXfce+UIO z7AdRnY!e zJ3RTo0EY+!9_tXPbGV1+a8LLg?m7ytLR5q6+~W+d7*~%o^fO`(8Ls{U_?sasLoswt zz)*-{=$s7cMCj9u(;$r!iP0-lAtf4&DNH7WJ41&9FWhYC=RjO_{ zow0|A4T{SdMxza)W=5ywQo5uWhP(6O^-rAEc0HNDg* zpEagO8@tb%7jaC?#N$b(52t-Ut@Rj75~j~kAlNi?s}ouRJPx=Xcs%fC;0eGxfjIl( zvj*)!eAb)z(e~N%}fM)`WfsDF07g!0L2W0HM`M?W-3xFGeCBSQe3xNzBbSCf);36Pn z>zxIpC*#GyH-O&&z6C4=z70GZxD!|g`~WsOJ3ZG91 zK*trnuU8!VpeP!nFh~GMXmYx9`YN!MI3m8UsqQhEEYd4sdqN(gX{O97?vhkvq_rb3!)*GxcHV&q#IWY{_Bs zz^h8s95{dJ+qxbPDr1YmV}!Hj1L7~;t?OYcRy98nS+kAb(0%^WuTe(?e<^yHQ7v`! zab*Zj6^L-P<1jH}LCwvaU0jeqC%Z6@L8L&3>e3O;0f(F_&YU|tt9V91ZeFHz_Fb+e zzc@1++cYa@POtEsq7T}Ci|jNu10khMq7!gmT&Hp4CQL~e`!Lt(mE(onEN%BdxlT8x zDX!CR$f`%;wVCPSZRZ4ZVt<8A%F$xRM!&) zGp^Gk-L(68H|);E%3g5TWx8^mrsDY8Q)gVKQ(>2-ZF!-0#&wzvo8o9YTVKF+ornLk zv<>r2JRdmqz2j|X6HZXWLE<{;D0e+(IDHs%v=d`E#TZTpli{QiAl1yVkR#}lRSXEbv@JUK%BtbW~9C7P>K}0uYV5eay+gM#!yL`fU ze9}r9^cso=*3`hD!Cz6f!nX!%NgDJvv7qYeR zn(~H*x>aTL>5rFuM7F~I`6?>P>g&)9a8lGtxLB{Gt4fE!JO!18V`eduEQ4lopMtD9 z7N-kGVqbB(KEjcDFDKwy^|Bh`A2S?u(L$(h9Yeetl zgtdv@$q5^Q_xjE_VY~UxALE3@IAI4wiHk+)l0dngM2Ct+>FQyOxvwfGtjo8682>BA z|LS2Ih{fdkGREYZWFvcN{?}xa>;+1g;(v{wY)0+^F96TM94JgS_?elK#}MyDpF$K) zSRarYw(^^E_c>uHM&nVpp@h-Y;vS{T7RJjxO4lB6!mN-`@Ltr`w60C~U~Ri5;43QF zJk3ediuMG^>w$YBlMgnS%RV}n?4`MT4^QV7Je@S{qn)xXd-ewFn?F*ECd#5d=AyQK z!Qq{i+x^;6E#Qwe?TKqV1Y9$IWp3|hlFoE>`4QEDiL@cNW7pMCM%hKK7DgmFwe{PI zhj!zn9dHk{p@^y{cP4O|uAF15O;4NK+Wdag_PFLxd3g37Zr1my?BTTc8?hIi>|i5! zaEefcHKc4e;t>W-m}x2N*L8%jion;PzpSW(w6qkVrKRk89eOM_u+t3Hg<{~O>0(an zd$l#p$<~532x*oz_9{v9&Qi!m)9Y|l)4rT*#G7`YMCw3%GJ73ne6q+ox?Q=Zxcwb_ zBthQ>$~wRbGuP2+>xpYj=fO>pmbv%vLTqBVaYeLH`q$dUG0uHAseuX4;VAqor(4V=k``qQ6^U0ZIV{TQma@b52q~3Fx)CUD zECFJXwp$KK+0{c*^)*5og8xKt%1k?Q64K;<2Y%UQCmJu|_axE%#nQcN>3IDrI}apf zH{Q}sw{&ca%8t&Nl-(7Uj$`yncaNp}iKQa}O_k+nxw1>dMAEEynSdbrPCdL5>GTzAn{U3G=@MT^~;@< z$y+yDG8qj_7vY1Bos@YiT6IPgDU)R|SS+{wx41Eq?4(Tn1|n2U*4~2u>G(I-0x`6o zRLrPQfFxbA&r86**EZJRleFSxdXYCH|8f6^sXQ+_Qa8=We)>9ODN-eaup|?6F!E+_ zz-nK4r5_*4*ZLajgl}mwEZ1N}A%RC(5*z+E(Lj(`8!vcn6EF679P8Bt_Pj~ydF3bcsmeRpt!L+8Tb?AM*|-R zrUTyqjt3rzx+egK0w)5G15N^-2n2^MG!u9Va5j)+*7-neQ;1xsQ-S9LPXk^8#8Yyp z4VVpN;Kdvu_h}}Oq}4p&U|>G*cwhl=I&c;+7dRVO0>s@fR0AZL6_=QhSvLT2{}7Vu zT;PMq&jUUOoDU=^bph~AU2%dKxEaD$G8g;`^049UM+cyhasT>LiebaJjO2|9V)tK zwd66*!dX$o*t50dF;-i;^DG^m5-PjPEgf5>(uGO2yn2=HKFe;4rQ2rdc38USE!}ID z?)R2%r=?@tXU!hDI@CHowRA~1t4c?5w6Y^DTIr6qbR#X@$(Am|(y#`EMA9Q$TLT7^#-*o^sjpmWe2`gDS5rU6UwPC`_ZWNk zk~o>U%vT;9lP>o#rLmLT(E317&BE`#lAU6VbAwVOy-^CM<1$wr7tT>~(wX_N!cP$E zpT7yu3ta#Fz)HSf+md}Dr@n*mBmYOnb)uactBhTV&yDr_@5G^Pi}+bDx|w9}vO0M%R;U)qG)O%{EdaZ>imL(8xHac7n6{=x_JUXzC8GTgIZy z*|Tzs3JbI6WTNBllCGRLJ2R)Ss33p#oWkDVE9?DLEal9y`6bz9*;T%Z6$^sp6)Vmt zZwO>&7-eB~ZlGRg7gRL{E9+L(TFpmUnQCoSQ0ouQC=d9=icLXTnQCKf#<+2lKs`0n zzF5i`8RImmIm}Xi@#vm=WL$Ju_dGI&&=YJt9Lz7>!=acfOPS9Lzl6<{qhNrv_UF%&!Zn4mxDh8@?_(hWO5?0)I6b7v_}#PPMK&REJBuw%SWCSI+bv6N@R#*FuA z+1V~=mOl^wCAu!=nKFBmrF6;w(lfG4{k0XfsrgMjZYyR!BXtalM!EK}p04BH1q?_}71B6=sob`D-F-59pt7rm2V`$y3`8MebQ=+YU( z_G2vD|Iawp{-tI>HFtM}HJCxrb9ZU6c%VI`QpLP3#=I_;$Gk3x=oSyOpwoDuAkrqm7a<%O&eNx(PxHdmgoS%9jSoi# zh5N%aAvSl$TznrVGJ?6t55`Pxu|Y>duV{+HMdJ9TSELO5@@ul9DJnbAOh~Cg2@pvn z(x;*+D!b*-DLc?Tv|S^l!T47+MP>IL+_W`-nfDm z{HNoe18F*;d=!aoUs*+Qn}?0{*J6{yo(KK4B(#xl#vSqE_1)yWVT|0)d83I*Xd}VR zB)koS8LP1S5mcT7!z?$GTIDsH2g>jmki;?+a+=oT*zA*9bu;X7=EZN|$-vFXlTx(> zI0pC>5aZPXR0Ve|!u}=C490El93ylMkYIO>bRI5VZG+-5Q zI@*L>~B7hfyD}dQ-FoQ(}8n< zSwOV;eNd2Yz}B-(CL6bC$z$9Di6<}FctA@YV=E*@L3&I}9)o){K z6GNqoCthA0W*Q3tUtM$}(c!B@P~mvzzLJxm!b^$;e|hrjX!$tDMq9xvWs&tb2`cRH zI4;Sg2r3(fr*x>i{TE$>B#WRj4ws8TmX$?Nk?5d|HX7E9gAI9FO2Z1m!oFbWP&N`I+`IIio~AWwPr0lpLSyj>utbO@@oX2SiE2O3 z4;q7>Ejp3S&lIMkm~lSMqZ+Ijen51T%XG~=3v6eGahth8hL^|LHhP^xoA~p@s_UQ4 zs3U@o623Kynz!nTs`7?1Uu{KQr7yz6p6xb%aG5HFnK}8h^JWzn=4bl5_THB_E3+tj zZqAHZvu5`SQN=ns|2>a-F8b4K;ldFQ8=a~;Icz=jIL`cK1lMSiJ z!vFJDyAl&L=2WwFEzlYx16^=`)oqw6Bh$sB9$CV<;Hvx^|4h6F-J*x)W1S1XW*9f| z*%pbtn;Tb!E&By+LpvtL@vyPgpyT7i8{M!w7j}Ph*tv61N^solsWT4BBG{E`TOP{J zI4H|tb8fVq?JDNFcnt@&4f9Mq&N!$4d!F)^*41H_NNtY^C^1iY1u+6jjDT`52`Ku~ zwUbcHtNGwCP(DD%NAL9q=qaz8PVQnp+~A0L0 z7q{AApnD!7?HrRXpHO2Ylb9E`9=3s)7q>5=7q@Ztke%9#n-#J%?8PlT?8Qwywzc5p zMm)AU;^tOi3FD7pAe=v7gEXzPd2EY!F@Tq~ri_F@D)1Tk&cB5N zH0>u^dGVqZ$KT92KoXs%SDoP$NV{rZ1Z!& zaeG6YqO1m*iQB`Gdls(NN^GBu+~Wv|Qxq?736>25@+=<*{3Z~`BE-5*0Imm)1YQCh z1?0Y;2)q?|GLZYrk$tX*qt)(_>0Z=JlZ{p_$*8t9b{*w}0bO0sc%j|CvD(M7*~oY( zRl-gp$L8@>aJInlkbNcRST-9OM?~)V*Bjf__~J*)KOGubk8>=WVtU(L zkzzIC%+VR9>Jk3;%ylbG>FG9&Km4_PDO|@PCT7VVkia$+6@y5k<9OOFJLj6g#L|4SpD>ixlp!QAl0d~n8dl}CZth^`(?E%VngPCX-q z(Y@o!^0I1wAc!~ZB#F<4NNicbU_%L}=lN7%GQMw=m2pDxp^O^uHm#$|YjNsT-Il@sq?|K|N?9^P*JdxU@U8-~G{ z^U$AB|GmHNS^i%9?2E3u|MmsY(T!(n+%Hx>R+M=2jSIf$Bf6`6X@dqXIrh7UPF#_@ zXz=5|jd=|)M|5Le17ah(pU;4HEG}0pE*BoJs^9_L*ANI#$F3?5^n%k6?X|6nR1CPx z5-(ZHY+kZzEH7Crm6xne;-jtnU-KG(7tBr{QG0kS0x_=v;bt218qm|>lISbH=QNn| zK)}}!?0G#E4Z*Olke>7&f%58J*cwbB5?_D;f1or_*Vs^jY;7IlH~Z^q$w3-klI|Vu zTUzfu72vP;GC$FKlJ^`@Ku?9r1XLyiOHcJ;s1^mWZ2W$Q<=USZTn7|lt7%vl*Ct{uB>!Z$}XL48`%O2pt&Q`Kcqc-ML?({tZ39*j^{ zjIH#ie!E{k>e=0|Z!AfQ+pw?=DjzC*&2p9(O|Jl0|_^7Ju{gOZklRy#)iV8X) zC@w&N06|nHBoh+IMhJ@thA^3sfovudHUS4CYK&BEtI|cS7I$s2wkR$wu3+nKtlDb- z!Id;vH!9%9|NHK}@6DT;7ZOOIwa)z|^WAsex%a;1zWbK@opX?x`k)L z5GP`HV@!KK1HM6vrulaqO_9v8j`YArr(unpm&g1ua%1r;=ipP37`!?}#DLUWtiD8Ir}WcM?c>OvpYMjJ)nQfUE-^uc5%n zKuov$76MNNt^?xSiI6O30B^%GSq1k2M*@Ej90kPZ4-tap8DI*Q{{b8i{1k}ECf|M_ zdYz9ZvoL)2od`S|I085cm<~J#NGp5#381g_^MI>>*d`yno2LVR3(N$*0GtZsWK|aM z05BWa5BoO_$Pg_#z~g~=z`;QDaN$1ylf%Aqv0MnG|A3i5P8hY%lK2JIvX35)-+=kp zGS(ccEmXPxh~I#NJ@ax<&=XE7x{aPVWc+Zr7M#`WD1~w@cu8@{8~G44TL@1A^h01sgeQSgL&6F; zJj*2c27W37*%zH>R*X@#NX~|t`@vq*`JfdGRXr?)4Ml1azx)Z_!d{Sd-b=vGR6Q&e z$o=5W-|rz)gwxYCdxu^Pf-p8Wb}&P!XrTQK;ceEbd$s7nk>Yq+!?OPv$(jf2iN2R@JN{Y z;NOaC!q`>sK&M^}i5$t=wmq&1BUj`F>sfG3<|-Y%ZAW){4!9flyk$o^dPS+5Zbypiy=AH0 zMK<{&9KIs#Js|8o;Anae;N>em({J%4XBEX_uaJjEvB<-_r&Sb-yM;V7ibVw8C=((=qgc!n^3W(2 z4+?o`6pL?!JT!_$0bV1mqF8Jc^3W(2JB2(nip8mT(`+w_#Xi1;cG-$2cv`AB9L1u( z(%ot6VvEDacvM}V1`9{A2uHC9N3rV*G599u{nphBYP^1lEKV z6CWkovWB?GI@`l|{MA}HAq!3gA}BQMJh@?ioL9+vLk{W*KT;Yo7S`?bVbQz75H#$( zq%pU}o7k|XC2DzWlXG{JU}-EU_45I2(zIm;=rU?M(Z!K6v9uGHRU#!y|$~Y(YX)W5z9bkX>QmBGE1{4 z)+~0vdHptT+;(w9u!UNiP3Do+^aC@+*za{aw?V#czYo9OUg89{xwvspv_u=nt>N9t zu}`v5|FOG9uvuC_Fv1ptVARqWBfU2ZR#rjpqr^)TX(i0~ixS{yOA=2e|&oale_!p$-1jVyp8S*ZE2mGAP zi6lHzgnrHvL>0EM4O$NTbJ{^ApWi!0hcPM!W9xN)6-g*>@>jta6pT?Z1macr9u%8M zCJLAIAQxmAU4&(CWewVoO*|O$M0&np{0BX8f5|-ok3=IYf(hqOa8Gas1os5T)VC0F zoaGP?7uP{f?#V4c&=h=k1CxQ9fgmdQo&b&mz6>PyI8BsH5<4RI30K`Fb~M#rU3XiAh{*)17`uh0L}$Q zV!zSfe4~N$fLXu`fcd}$z>9zv0_%Vafop&z!1cgIz^j3!z+VI1z`KBDz|FvNAp4I8 zcyJC&GPb5K_B>WgQMvyJ59Q#`y1bnAbUHHl5~C7MIF`_PExms9g#3`dYAmYvRFsaW zs~l%(Au49Q{4uAs&m1m9l^*FSJ@KY{aO2=CxTDNn;vJdHBda9lIZjHWBGd5OQ8Keb za4u1bbDkZgP$mj5FwT1Z<@!-z?QaXt+q4adI~2ZZdq z+(F=OsT&S^sTBu=J#&H`Kc*zP6Q+w9>v&^Lx0{rZwbEldGdiKS1bXvB^sG4`&xYtF zZ!=Ci>S5y8{b#$Ty@-D%UW)B;K;E=#+S~YNGW5Le6<#S4zfa@$Lp%IS4VFUgm(_88 z8x;%~0;k=lNIjkwahy$8Ki90reeIr03WD}9fmQ5aXKOT^=@UbF-p=W`M@9Hd_2 z&EP~BT_j*1iMfV#-SEQG?fEq*;#uXXT5M0pV+O47YPE1Qim>w%%SY3Uu=A25;y15ryjYQ+&a%dW7GldzAIu#c0alKj-&+s3{_4(95~t zvFrn5VCxi!6_4dsWVNx+G&;X&SYu+eSQA!EF*B?QD<;Z|m4_92@<@%W9R#LC{FbbU zhW+-sL_PmRWYes;Nj9AuvJl^3w>zKb*3rGl^Mdg3yi%T+`+VIPLAQ7w^+f6(TY5A) zw>7NUcA#DnTLz*I6ul~U+m$&z-)!3|s)>Yimc|HGH6-y{u+FHV>C>fO+L~rTn$iEQ zf?aIB;prYxpMrhSI2sN}8d6JZRqcPoJdLce(TNQ^go-Ze!J1a|=%ZIvclcGsh^k`j zdR4;@zp6M$VsWxPb2_EXd31*L- z86^6d;k+0p&!XwwMS1>7MUL}0(PYmkMimEMPU<9)0i*QDt&)0RwJ1+QF65-%MTQ=| z21&h3ki)DUYQ7A=Qty4_NQz3*PQ_M(w}ad{MvfD~Qnud6J!0fuHgY|2iAlW^ja-3| zD>HIqqIA71Be%xL{lv({JNYgP6z{<8eTr z_GJSn0y*hQpF~YS^l-r|BR}jBEKdQx2}}q63zz{UpUesT4mcIaqlF{ovjI`3uRm}O za3F9lki#H(U>sTJ0lx-b0L(-$oDaMXSPa|>Tm&SY#|5PS=u+UPKsS(g#4;dnvWtPd zZ8(NbaW#(}%_Fi7lbUiZ%hF;HlF_dRKj3c47o%=9Ow$?WOVVqN~ZPdd!Ra)Ed zhjB)(uvk$VikxP(yiHvICoVLg;RjWzu5fq$mG z*cmf@miPP7TD*Cf5&9=Vm*w{OhcZ`rNo}#Wy4X|Y6`WbF-iCixZ5qRTA>&rO)>E&4 zXinbfWb{X~U}Dg6YS8k8pylyF%j1HUQ-YSq1}%>XS{^M%z8LI<9sesZ?xHJxj_j5A z*AsV^Lme-r)k=ux0YS0F4c3S)bzyUxEOWN^33_HA0`^td0{rW0_1A!b?2LUez z;#m7G1)dCS1lobu0*3(EdrtxK0H1?@IaDwg%b`ukY}$3mv7g0i)Mw6S^tf2(5gdBTttTtHXY#N=`ohxLcRnDdrAt(2DuFBaob~&pU zb-aoXc?A0}W~-8&)lmv%tLl#;L*843E`)=o{rutN(!hE`*{Y#_)1Hs;ZV4>KB_4Yw z$yUV$J$4+H7UIxH2`MGxkt+(2On@ZEkYIsViAs_W>F0g%EOwr)I#SibQh}UOT*jz} zS1eQIGm(YVXfNRbLL`=wT9+#cugJifdtpuIS+74;^{`Z6JsfnRBKdg4H2mf(ex|oA zC4s+xREsQydi)10$ZuNyoSWZ0SUvkxJ-n~UJ>?asCn+J7T_(HINe_|Gm84(C%#7o_ zrByt<=MzWf=w>-@k{O5 zH-F`l*UrY@#Qy>UQ!-yWeISpDBpVN-yGU_@^IiIN^d(AQf+tk#ahe_5!hFOB! zH5i=%5;pcrC5Z~~PseMmbA00$aU=ry#`5Jz$UG(EikFpC)Vr}nXHwcB#4uE<`Hrky z=Tv7#W~M_t>rNgwd1(5S$wM>pCXdUTm6J1hXj+;>D|Xectnn5jMvtp}soqMCBO`12 z)M@!SStx2guH)w+dyLUhZ}+ zb=K8rj$)Grg-Xwnf>nh@>BT~GrnkhkbaqK?og-CM&^=!4ip`IMqf*CDknCi;NF8~! zn~;j{&LWY`94pw&2k^M0kL6Zu=I7P5gDxhM1)F&;?w5V!0H$kcR&3^TQJ1?vLKoxF zjfo?n70dQ6=zRm7P3mUFdyEyEnIpzul@78ZS+SIPo$c&|-ZJQY9HQrNn8$oJ!h5j` z$IYD3t|d!(G4z%yT^`EzSjzR#SsAQn!76T0I(pmP$|~N1JzH^v) z6^n7hMW0BBm~!L&-wf-Qba__wn61}&Uiw7S_>z(kv2esYzgys0`Ptv&F8}VWmm2@9 zX&(vsdz;_SJo}pBA3eKe?XBN__whn}guw$&Ld1DjUwCWUg;)Jxq9oqG_xV|$Xj}I@9S1x>D)pd>Xq(~LLTast{2|d6Cy&r(p@0r(+A&t)oEjT&3JW-=f{7#Gal#t z*FqlZm2S6?hkB(Oji=Z4ywXMSo%)c!h=m!%^1aYiwzxakgJG|9rRY&zcfwZzLq2bJ zIP>$CdaAp=Il`aok?9|vI#<`X&*fcN<31wW7mkv+Y<_9A>rgyXnx{nr9!n4Qyc%W` zhaJ>)u@8hD)cr3ys2i*Eg#B#d6qC<7#U@VC>As5Dy9>{Pf=n?0yojwJw_n{mS9hGEq-rm&yw6pA8N`m z8V{6-%{L5-C*xl_M&mq>bc}}ie&kZ|%V}Ea7)|QsV_E7IA$JV^Wyn9NN4HpZ$gCZn z@!K>vfZvLluEXQKnX&OF$j%FLc*ZhhY%u=O!)#6@v%|B1dyb%Qu#Ii_AC7;$Eo6O% z;PPw;zS36JSArCAXtDDIyW%c1rYCMc*%jP$&MYwv!nSaq?7+#u!N7&Up};aA&Wf)F zcsg)7@C+b1GiL%H0*(Sc55yFk?+xG>;6H$v81sDqoB-6&CeEL45O5;!WFW2!-)TT_ z4tzYG=K*{tDIU6W<2Biu|$jEp3RqU{yBXB5<#LkQtUX^gru!Ph2 zgP>DzdZ?omN~d7w>oHFW^Jqpza_Xq3Qj*TU&Tt$*EwB`q zsLdql6rs+)IJLyI>E(a?TA!|$lE7bHDokus&VXf!W&Usq-&`}#zn@_7_@!m|nj*^> zMNFC5D$i1Z_27dC>fvM+)4%?DE3TdP>scq&a1n`mO!S2qNc>K_rd(5Z+rjF2RMo>$ zvbBFIiN2?Pr(Ha6ohKsfSM`WeBA>w1Es|aAyPt?)gVd_#n^#@CKov0o2Not#O60}| z)@+(!;~DSVB)SuIm?zN#2YEF~-HGXJ%W3dj$Mk8=+?<^BJO@UwgU*9v`a36U`jqKY z)4F9IJYYBU*>Gb*n^WK2>56Mq>V(vBaxz-{b~JaLI&u71sm{4;o0z*^imUHnbJv@U zlP%6Y`ay!un=l5FhcO@hL6Dxq!V_0K`ut7DY1(~i{*_(IYVNujdI_K&zCTd5$!^u& z+;yS(4k7fC9p(XpHPqsNL5QC9ob*c}de(E&uR-q(rORD!Z%%qAbUp~yGhH&=zSa2u zMCovuiN_D;s(U*`?O#vU9;ooLTra;Iabcb5Xg9-|SCpNZjcwDLj`1sHr;XE_9-^w~?O$7fZ7NEe zlH=5M=n;&^#OBwTRg{^kuhtJ)ta){MQFg8qtY%p<&c7->D?dBk2`d1(rjLKkOy`VQ z&OEGR=sC96*SxL>1_e?aA0W=p#Cx)gZWpPd+vVjK7_vS}mg~$FZN8j<=YXIncxi=G zh5q?i=jciZJchg*gbk+)v68x~(Zv;>I&U%dBPNmjRCjId4?HqnlGOpimx7o?2JOqt z&f&?ANsPgQ3LA*Xej;q3@NBjV4{>}jN{E>A*nn@EFaKi5&-xyhJNc2c?ZVOx@*iL0 z**0YA>6O3T|K8OLKHq{b8@CDl+4(2jy<^q2Z;tA{Xi|FXyjk+2QbI(`jH}nW`c1w* zP@yYTdm1`;CDUT}Z)#_Km+H_PBFTq)$Ce1-RfJe0363fr0x5z1G%O2|X` z3bejUh*kx`k&o@+f3+|2>CP1 z9uM+(c9)RnjUAOT=%uK*8~&Q_>9My3562OBUQ3Ah_M_${TcUS2FS~KUg7}km;`n3< zc^}6|pS*M11HEs$@|9ah&zt+9rrj#!OUttgV7qY7)nohbeel73dtvb`fN5q+Iy;Yy3Y9Kx9J}te7BI#dHANMZ??UB!QwmT z?>aZ4@5`F@osiEywc(-u|9tS9@?IAW=)b!TTxvQJx8f_@B;=udg?&OE%2z1Bi?tPB z;cg)h&d$V2%Gw+MMCU*RJm59KQ)<25=VB9yOCFXUVQc;K>=mS492 zr@|*t3!ilaaBph5n;X5bc-vwkb9G>zRp`+c|^82>_IK;LG6FWgIcQ2X7F7qqw_HpO0LQISi?3r4STF9 z_pzoK-!#rb*t;MJ_yj?c9Sv)CYxR+BlfX1+T+a52GOH2DZ;ea(pVG$=VQj|9ax56Gkv!c z)IM%^?&FTPo!&YdbPy$6!iow|>kRmOD+C`z_q3M8cz8Gpn+x<~&_f*q&_Lj(W8Kp{ z^@qXY_z>Gb9zwMCDSqwvPtx8*Rrtz*+&__{Q zB+~16{W0@7&cM3KL3|FD;e;+7+5CtNixj};2>6sJ2pw!>8x-f_KakLo==ZmgGbN|k zSy%|yLe}1bP}c7)Xdljl`iz5}mQm}Xu#aNumVy>23_+1P&nmaj*bKpm{2qkQKtjMk zcC3P2RBV+$4&Dl}`Z27gyLr4<)#0nr#KiZZ%XBp=;qor*6jMJe3&$LSJ5sKsT*G5U z$3JHvKVQjl>;!jY7?9kN;Xo(wbYKpU9FYrwX8~(~nEw_YILH~f63fZJtAJyHcLLLa zn}Hd?-vOrrw*s?(PXVU^p8-w>J`c%P#1Z!W2v`ri6No8!-`&8KKpvY_ zz=wbr1GfU#0RISF3w#FX!{58WOM&}<4M6t2%Yf`k?Q>s#fwc+vkJWBbIh!^GB_$sw zQ{`+Lw_3_(8?p*RR%6IayqPY41_ciyLiQV+E(c`{r$*`$F=kZ@UR z?8Z?*dG01sEE4$}Of$r<{E-q|Tq;S9ho6|z6Y|cx`KVO2uv8#VhT9SqS*zB+bWOi1 zYP6SbR4Z5t_4qeOFlYQcnfvU|VoYkko>x>o`244|B6w0nva@Eo)hNoHM*(k6R%{k) zhaCy39#KlvN5Y&;M$O7$2kv&3HCyv!bXJTgB`VAftl2c_&%V|9t}Q;Obw(y6#7j+A=otS=#9N-!^m z_ec9^siXf|`F`Nt@2pPfaWFi)6M7s@oFRJFe4K|u^sMZ8c-*@VYqot1KEL>`?i^8@4Q90nWb@cem@eq*NO^watzE=kmHVC2nI)*K2Kht!%O zC|+MtUA1`Z7<`h7NqiG+)UB+nbbD((uHvQcl`u$(N&FDfTF;WI(h_%t5K{G#0M+!O zLZgD20Tr;BNNi?dUCBYpCPHf=YAmR&T3lS`E%CbXk}nI^s)8qAnfojDw8UGE=kPjL zt*6FYU5nk0N&Fj%uPmvptzKSSgIe%0AtsUUZ*G^XxTc!EX7xt6S~YU8N(Z2VI8=%! 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 literal 0 HcmV?d00001 diff --git a/src/libtommath/Debug/libtommath.lib b/src/libtommath/Debug/libtommath.lib new file mode 100644 index 0000000000000000000000000000000000000000..330a2284fa1e778d44d4c0d92bcd7f2180525b02 GIT binary patch literal 680604 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 Date: Sat, 26 Jul 2014 15:48:36 -0500 Subject: [PATCH 49/80] update ScreenGameOver with a fancier "game over" graphic and bigger text --- .../ScreenGameOver underlay/default.lua | 19 +++++++++--------- .../Graphics/ScreenGameOver gameover.png | Bin 0 -> 26961 bytes .../default/~res/ScreenGameOver gameover.psd | Bin 0 -> 225927 bytes 3 files changed, 9 insertions(+), 10 deletions(-) create mode 100644 Themes/default/Graphics/ScreenGameOver gameover.png create mode 100644 _assets/Themes/default/~res/ScreenGameOver gameover.psd diff --git a/Themes/default/BGAnimations/ScreenGameOver underlay/default.lua b/Themes/default/BGAnimations/ScreenGameOver underlay/default.lua index 4cfaedad3c..689915f69a 100644 --- a/Themes/default/BGAnimations/ScreenGameOver underlay/default.lua +++ b/Themes/default/BGAnimations/ScreenGameOver underlay/default.lua @@ -1,11 +1,10 @@ return Def.ActorFrame { - InitCommand=cmd(x,SCREEN_CENTER_X;y,SCREEN_CENTER_Y); - LoadFont("Common Normal") .. { - Text=ScreenString("GAME OVER"); - InitCommand=cmd(y,-4;shadowlength,1;diffuse,Color("Red")); - }; - LoadFont("Common Normal") .. { - Text=ScreenString("Play again soon!"); - InitCommand=cmd(y,16;shadowlength,1;zoom,0.5;); - }; -}; \ No newline at end of file + InitCommand=cmd(Center), + LoadActor(THEME:GetPathG("ScreenGameOver","gameover"))..{ + InitCommand=cmd(y,-16;shadowlength,2) + }, + LoadFont("Common Normal")..{ + Text=ScreenString("Play again soon!"), + InitCommand=cmd(y,36;shadowlength,1) + } +} diff --git a/Themes/default/Graphics/ScreenGameOver gameover.png b/Themes/default/Graphics/ScreenGameOver gameover.png new file mode 100644 index 0000000000000000000000000000000000000000..0077fea369b25d3cb4a525b9feef77ef52acebb3 GIT binary patch literal 26961 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 Op=2eMzSf9?0{;g*uBA`_ literal 0 HcmV?d00001 diff --git a/_assets/Themes/default/~res/ScreenGameOver gameover.psd b/_assets/Themes/default/~res/ScreenGameOver gameover.psd new file mode 100644 index 0000000000000000000000000000000000000000..c05ce8d8292fa1c7befd47f56dbe7b28cb645c43 GIT binary patch literal 225927 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 Q6%xG>`@i{J*u(h#AJn`FeE Date: Sat, 26 Jul 2014 16:06:18 -0500 Subject: [PATCH 50/80] explicit float postfix added to some numbers in order to get visual studio to shut up --- src/Profile.cpp | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/src/Profile.cpp b/src/Profile.cpp index 764bd59f8e..de2c10f9c2 100644 --- a/src/Profile.cpp +++ b/src/Profile.cpp @@ -1541,36 +1541,36 @@ float Profile::CalculateCaloriesFromHeartRate(float HeartRate, float Duration) // Names for the constants in the equations. // Assumes male and unknown voomax. - float gender_factor= -55.0969; - float heart_factor= 0.6309; - float voo_factor= 0; - float weight_factor= 0.1988; - float age_factor= 0.2017; + float gender_factor= -55.0969f; + float heart_factor= 0.6309f; + float voo_factor= 0.0f; + float weight_factor= 0.1988f; + float age_factor= 0.2017f; if(m_Voomax > 0) { if(m_IsMale) { - gender_factor= -95.7735; - heart_factor= 0.634; - voo_factor= 0.404; - weight_factor= 0.394; - age_factor= 0.271; + gender_factor= -95.7735f; + heart_factor= 0.634f; + voo_factor= 0.404f; + weight_factor= 0.394f; + age_factor= 0.271f; } else { - gender_factor= -59.3954; - heart_factor= 0.45; - voo_factor= 0.380; - weight_factor= 0.103; - age_factor= 0.274; + gender_factor= -59.3954f; + heart_factor= 0.45f; + voo_factor= 0.380f; + weight_factor= 0.103f; + age_factor= 0.274f; } } else if(!m_IsMale) { - gender_factor= -20.4022; - heart_factor= 0.6309; - weight_factor= 0.1988; - age_factor= 0.2017; + gender_factor= -20.4022f; + heart_factor= 0.6309f; + weight_factor= 0.1988f; + age_factor= 0.2017f; } return ((gender_factor + (heart_factor * HeartRate) + (voo_factor * m_Voomax) + (weight_factor * kilos) + (age_factor + age)) From b0cac56864ec529f5a0b05bcec07a3cbf4e3ffb5 Mon Sep 17 00:00:00 2001 From: sigatrev Date: Sat, 26 Jul 2014 18:55:39 -0500 Subject: [PATCH 51/80] fix ActorScroller wrapping looping actor scrollers would never reach destination items with number higher than the number of items. --- src/ActorScroller.cpp | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/ActorScroller.cpp b/src/ActorScroller.cpp index faaece7ec2..99c72de667 100644 --- a/src/ActorScroller.cpp +++ b/src/ActorScroller.cpp @@ -205,7 +205,19 @@ void ActorScroller::UpdateInternal( float fDeltaTime ) m_fPauseCountdownSeconds = m_fSecondsPauseBetweenItems; if( m_bLoop ) - m_fCurrentItem = fmodf( m_fCurrentItem, (float) m_iNumItems ); + { + if( m_fCurrentItem < static_cast(m_iNumItems) * -1 && m_fDestinationItem < static_cast(m_iNumItems) * -1 ) + { + m_fCurrentItem += m_iNumItems; + m_fDestinationItem += m_iNumItems; + } + else if( m_fCurrentItem > static_cast(m_iNumItems) && m_fDestinationItem > static_cast(m_iNumItems) ) + { + m_fCurrentItem -= m_iNumItems; + m_fDestinationItem -= m_iNumItems; + } + } + } void ActorScroller::DrawPrimitives() From 71abf53d3c5da7c64a1e8867fd3a60770ae2ab2d Mon Sep 17 00:00:00 2001 From: freem Date: Sat, 26 Jul 2014 19:00:50 -0500 Subject: [PATCH 52/80] we dropped Visual C++ 6 support a long time ago, so remove most of the boolean operator hacks. However, the == one is still required (at least on Visual Studio 2008, not sure about others). Feel free to revert this if it's causing problems elsewhere. --- src/ThemeMetric.h | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/ThemeMetric.h b/src/ThemeMetric.h index 41ac59667e..f74d1c4e0b 100644 --- a/src/ThemeMetric.h +++ b/src/ThemeMetric.h @@ -170,10 +170,12 @@ public: bool IsLoaded() const { return m_Value.IsSet(); } // Hacks for VC6 for all boolean operators. - // todo: get rid of these -aj - bool operator ! () const { return !GetValue(); } - bool operator && ( const T& input ) const { return GetValue() && input; } - bool operator || ( const T& input ) const { return GetValue() || input; } + // These three no longer appear to be required: + //bool operator ! () const { return !GetValue(); } + //bool operator && ( const T& input ) const { return GetValue() && input; } + //bool operator || ( const T& input ) const { return GetValue() || input; } + + // This one is still required in at least Visual Studio 2008: bool operator == ( const T& input ) const { return GetValue() == input; } }; From bc73e053bbc3b1be5695792c768e59d5d03ec660 Mon Sep 17 00:00:00 2001 From: freem Date: Sat, 26 Jul 2014 19:01:49 -0500 Subject: [PATCH 53/80] telling Visual Studio to shut up about more warnings wrt/double and float --- src/ScreenGameplay.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/ScreenGameplay.cpp b/src/ScreenGameplay.cpp index 4d8b1ab646..9196dea14e 100644 --- a/src/ScreenGameplay.cpp +++ b/src/ScreenGameplay.cpp @@ -356,15 +356,15 @@ void ScreenGameplay::Init() m_HasteTurningPoints.clear(); m_HasteTurningPoints.push_back(-1); m_HasteTurningPoints.push_back(0); - m_HasteTurningPoints.push_back(.3); + m_HasteTurningPoints.push_back(0.3f); m_HasteTurningPoints.push_back(1); m_HasteAddAmounts.clear(); - m_HasteAddAmounts.push_back(-.5); + m_HasteAddAmounts.push_back(-0.5f); m_HasteAddAmounts.push_back(0); - m_HasteAddAmounts.push_back(.2); - m_HasteAddAmounts.push_back(.5); + m_HasteAddAmounts.push_back(0.2f); + m_HasteAddAmounts.push_back(0.5f); m_fHasteTimeBetweenUpdates= 4; - m_fHasteLifeSwitchPoint= .5; + m_fHasteLifeSwitchPoint= 0.5f; m_fCurrHasteRate= 1; // Should this be in BeginSong? Not sure whether it should carry over between songs. if( UseSongBackgroundAndForeground() ) From a5db63657cbc6cd0d422a8e4883d17ce30e6d49b Mon Sep 17 00:00:00 2001 From: Kyzentun Date: Sun, 27 Jul 2014 01:47:30 -0600 Subject: [PATCH 54/80] Changed GameCommand screen validation to allow OptionsList to work again. --- src/GameCommand.cpp | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/src/GameCommand.cpp b/src/GameCommand.cpp index e8ee6a1554..ddcd21271e 100644 --- a/src/GameCommand.cpp +++ b/src/GameCommand.cpp @@ -251,7 +251,27 @@ void GameCommand::LoadOne( const Command& cmd ) else if( sName == "screen" ) { - CHECK_INVALID_COND(m_sScreen, sValue, (!SCREENMAN->IsScreenNameValid(sValue)), ("Screen \"" + sValue + "\" has invalid class.")); + // OptionsList uses the screen command to push onto its stack. + // OptionsList "screen"s are OptionRow entries in ScreenOptionsMaster. + // So if the metric exists in ScreenOptionsMaster, consider it valid. + // Additionally, the screen value can be used to create an OptionRow. + // When used to create an OptionRow, it pulls a metric from OptionsList. + // -Kyz + + if(!THEME->HasMetric("ScreenOptionsMaster", sValue)) + { + if(!THEME->HasMetric("OptionsList", "Line" + sValue)) + { + if(!SCREENMAN->IsScreenNameValid(sValue)) + { + MAKE_INVALID("screen arg '" + sValue + "' is not a screen name, ScreenOptionsMaster list or OptionsList entry."); + } + } + } + if(!m_bInvalid) + { + m_sScreen= sValue; + } } else if( sName == "song" ) From ee53b9e601a2f2288826bcd83b6168f7a18881e4 Mon Sep 17 00:00:00 2001 From: Kyzentun Date: Sun, 27 Jul 2014 21:38:43 -0600 Subject: [PATCH 55/80] Adjusted text scaling that convert_text_to_indented_lines uses to make it adjust for resolution differences better. --- Themes/_fallback/Scripts/02 Utilities.lua | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Themes/_fallback/Scripts/02 Utilities.lua b/Themes/_fallback/Scripts/02 Utilities.lua index 2d456e770b..cb57430538 100644 --- a/Themes/_fallback/Scripts/02 Utilities.lua +++ b/Themes/_fallback/Scripts/02 Utilities.lua @@ -429,10 +429,12 @@ function convert_text_to_indented_lines(text, indent, width, text_zoom) if sub_lines > 0 then indent_mult= 2 end - local usable_width= width - (indent * indent_mult) - if text:GetWidth() * text_zoom > usable_width * 2 then + -- On larger resolutions, the font can be squished a bit to fit more on a line. + local resolution_width_mult= math.max(1, DISPLAY:GetDisplayHeight() / 720) + local usable_width= (width - (indent * indent_mult)) * resolution_width_mult + if text:GetWidth() * text_zoom > usable_width then clipped= true - width_clip_text(text, usable_width * 2) + width_clip_text(text, usable_width) end indented_lines[#indented_lines+1]= { indent_mult, text:GetText()} From eab2143ea71233411d280de9e86d8d5c97917a79 Mon Sep 17 00:00:00 2001 From: Andrew Udvare Date: Mon, 28 Jul 2014 03:33:31 -0700 Subject: [PATCH 56/80] Add option --with-ffmpeg-rpath to specify a hard-coded but safe RPATH as an alternative to the non-secure relative defaults --- autoconf/m4/video.m4 | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/autoconf/m4/video.m4 b/autoconf/m4/video.m4 index a2788263dc..02e4826f6e 100644 --- a/autoconf/m4/video.m4 +++ b/autoconf/m4/video.m4 @@ -3,6 +3,7 @@ AC_DEFUN([SM_VIDEO], [ AC_REQUIRE([SM_STATIC]) AC_ARG_WITH(ffmpeg, AS_HELP_STRING([--without-ffmpeg],[Disable ffmpeg support]), with_ffmpeg=$withval, with_ffmpeg=yes) +AC_ARG_WITH(ffmpeg-rpath, AS_HELP_STRING([--with-ffmpeg-rpath],[Specify RPATH for ffmpeg]), ffmpeg_rpath=$withval, ffmpeg_rpath=no) AC_ARG_WITH(static-ffmpeg, AS_HELP_STRING([--with-static-ffmpeg],[Statically link ffmpeg libraries]), with_static_ffmpeg=$withval, with_static_ffmpeg=no) AM_CONDITIONAL(STATIC_FFMPEG, test "$with_static_ffmpeg" = "yes") AC_ARG_WITH(system-ffmpeg, AS_HELP_STRING([--with-system-ffmpeg], [Use system instead of bundled ffmpeg (UNSUPPORTED)]), system_ffmpeg=yes, system_ffmpeg=no) @@ -94,7 +95,11 @@ dnl It's NOT autoconf-based, so AC_CONFIG_SUBDIRS does not work. CFLAGS="$CFLAGS -I$PWD/bundle/ffmpeg" CXXFLAGS="$CXXFLAGS -I$PWD/bundle/ffmpeg" dnl Make the binary find our bundled libs - LDFLAGS="$LDFLAGS -Wl,-rpath=. -Wl,-rpath=bundle/ffmpeg/libavutil,-rpath=bundle/ffmpeg/libavformat,-rpath=bundle/ffmpeg/libavcodec,-rpath=bundle/ffmpeg/libswscale" + if test "$ffmpeg_rpath" = "no"; then + LDFLAGS="$LDFLAGS -Wl,-rpath=. -Wl,-rpath=bundle/ffmpeg/libavutil,-rpath=bundle/ffmpeg/libavformat,-rpath=bundle/ffmpeg/libavcodec,-rpath=bundle/ffmpeg/libswscale" + else + LDFLAGS="$LDFLAGS -Wl,-rpath=$ffmpeg_rpath" + fi dnl Classic autoconf. This CANNOT be broken across multiple lines. VIDEO_LIBS="-L$PWD/bundle/ffmpeg/libavutil -lavutil -L$PWD/bundle/ffmpeg/libavformat -lavformat -L$PWD/bundle/ffmpeg/libavcodec -lavcodec -L$PWD/bundle/ffmpeg/libswscale -lswscale" have_ffmpeg=yes From 9038056ba4194b3246f724bc6ddb492222f8cf5c Mon Sep 17 00:00:00 2001 From: freem Date: Mon, 28 Jul 2014 17:54:50 -0500 Subject: [PATCH 57/80] Make default value for NumBackgrounds preference 10. (The previous value, 8, was unable to be selected in the menu, so it was always getting changed. Thanks to Mad Matt for pointing this out) --- src/Background.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Background.cpp b/src/Background.cpp index 910d5b4284..d607a20122 100644 --- a/src/Background.cpp +++ b/src/Background.cpp @@ -36,7 +36,7 @@ static ThemeMetric USE_STATIC_BG ("Background","UseStaticBackground"); static Preference g_bShowDanger( "ShowDanger", true ); static Preference g_fBGBrightness( "BGBrightness", 0.7f ); static Preference g_RandomBackgroundMode( "RandomBackgroundMode", BGMODE_RANDOMMOVIES ); -static Preference g_iNumBackgrounds( "NumBackgrounds", 8 ); +static Preference g_iNumBackgrounds( "NumBackgrounds", 10 ); static Preference g_bSongBackgrounds( "SongBackgrounds", true ); // Width of the region separating the left and right brightness areas: From 076d67132de8febfa3ce045e604934ef88b717ea Mon Sep 17 00:00:00 2001 From: Kyzentun Date: Tue, 29 Jul 2014 12:09:40 -0600 Subject: [PATCH 58/80] Reverted BitmapText::LoadFromNode back to previous logic. BitmapText now looks up font names in Fonts/ if the path doesn't resolve, so LoadFont is obsolete. Added optional arg to ActorUtil::ResolvePath and GetAttrPath to make them not report an error when something is optional. --- .../BGAnimations/ScreenTestInput underlay.lua | 4 +- src/ActorUtil.cpp | 10 ++-- src/ActorUtil.h | 4 +- src/BitmapText.cpp | 50 +++++++++---------- 4 files changed, 35 insertions(+), 33 deletions(-) diff --git a/Themes/_fallback/BGAnimations/ScreenTestInput underlay.lua b/Themes/_fallback/BGAnimations/ScreenTestInput underlay.lua index 862f42fdb1..ff3baa5bf7 100644 --- a/Themes/_fallback/BGAnimations/ScreenTestInput underlay.lua +++ b/Themes/_fallback/BGAnimations/ScreenTestInput underlay.lua @@ -3,12 +3,12 @@ return Def.ActorFrame { -- InitCommand=cmd(LoadGameController, --}; Def.DeviceList { - Font="Common normal"; + Font="Common Normal", InitCommand=cmd(x,SCREEN_LEFT+20;y,SCREEN_TOP+80;zoom,0.8;halign,0); }; Def.InputList { - Font="Common normal"; + Font="Common Normal", InitCommand=cmd(x,SCREEN_CENTER_X-250;y,SCREEN_CENTER_Y;zoom,1;halign,0;vertspacing,8); }; }; diff --git a/src/ActorUtil.cpp b/src/ActorUtil.cpp index 3d48573c6c..2fb3b5ffda 100644 --- a/src/ActorUtil.cpp +++ b/src/ActorUtil.cpp @@ -40,7 +40,7 @@ void ActorUtil::Register( const RString& sClassName, CreateActorFn pfn ) /* Resolves actor paths a la LoadActor("..."), with autowildcarding and .redir * files. Returns a path *within* the Rage filesystem, unlike the FILEMAN * function of the same name. */ -bool ActorUtil::ResolvePath( RString &sPath, const RString &sName ) +bool ActorUtil::ResolvePath( RString &sPath, const RString &sName, bool optional ) { CollapsePath( sPath ); @@ -54,6 +54,10 @@ bool ActorUtil::ResolvePath( RString &sPath, const RString &sName ) if( asPaths.empty() ) { + if(optional) + { + return false; + } RString sError = ssprintf( "%s: references a file \"%s\" which doesn't exist", sName.c_str(), sPath.c_str() ); switch(LuaHelpers::ReportScriptError(sError, "BROKEN_FILE_REFERENCE", true)) { @@ -402,7 +406,7 @@ RString ActorUtil::GetWhere( const XNode *pNode ) return sPath; } -bool ActorUtil::GetAttrPath( const XNode *pNode, const RString &sName, RString &sOut ) +bool ActorUtil::GetAttrPath( const XNode *pNode, const RString &sName, RString &sOut, bool optional ) { if( !pNode->GetAttrValue(sName, sOut) ) return false; @@ -419,7 +423,7 @@ bool ActorUtil::GetAttrPath( const XNode *pNode, const RString &sName, RString & sOut = sDir+sOut; } - return ActorUtil::ResolvePath( sOut, ActorUtil::GetWhere(pNode) ); + return ActorUtil::ResolvePath( sOut, ActorUtil::GetWhere(pNode), optional ); } apActorCommands ActorUtil::ParseActorCommands( const RString &sCommands, const RString &sName ) diff --git a/src/ActorUtil.h b/src/ActorUtil.h index 7679d7a236..3a6d139235 100644 --- a/src/ActorUtil.h +++ b/src/ActorUtil.h @@ -114,10 +114,10 @@ namespace ActorUtil Actor* MakeActor( const RString &sPath, Actor *pParentActor = NULL ); RString GetSourcePath( const XNode *pNode ); RString GetWhere( const XNode *pNode ); - bool GetAttrPath( const XNode *pNode, const RString &sName, RString &sOut ); + bool GetAttrPath( const XNode *pNode, const RString &sName, RString &sOut, bool optional= false ); bool LoadTableFromStackShowErrors( Lua *L ); - bool ResolvePath( RString &sPath, const RString &sName ); + bool ResolvePath( RString &sPath, const RString &sName, bool optional= false ); void SortByZPosition( vector &vActors ); diff --git a/src/BitmapText.cpp b/src/BitmapText.cpp index fd55c067d2..6f6c81b760 100644 --- a/src/BitmapText.cpp +++ b/src/BitmapText.cpp @@ -115,39 +115,37 @@ BitmapText::BitmapText( const BitmapText &cpy ): *this = cpy; } -void BitmapText::LoadFromNode( const XNode* pNode ) +void BitmapText::LoadFromNode( const XNode* node ) { - RString sText; - pNode->GetAttrValue( "Text", sText ); - RString sAltText; - pNode->GetAttrValue( "AltText", sAltText ); + RString text; + node->GetAttrValue("Text", text); + RString alt_text; + node->GetAttrValue("AltText", alt_text); - ThemeManager::EvaluateString( sText ); - ThemeManager::EvaluateString( sAltText ); + ThemeManager::EvaluateString(text); + ThemeManager::EvaluateString(alt_text); - RString sFont; - // Allow the Font attribute to be either a path or simply the name of a font. - // If it's a path, it will have a slash in it. - // Also allow it to be set through either "Font" or through "File". - if(!pNode->GetAttrValue("Font", sFont) && !pNode->GetAttrValue("File", sFont)) + RString font; + // Pass optional= true so that an error will not be reported if the path + // doesn't resolve to a file. This way, a font can be either a path or the + // name of a font to look up in Fonts/. -Kyz + if(!ActorUtil::GetAttrPath(node, "Font", font, true) && + !ActorUtil::GetAttrPath(node, "File", font, true)) { - LuaHelpers::ReportScriptErrorFmt("%s: BitmapText: Font or File attribute not found", - ActorUtil::GetWhere(pNode).c_str()); - sFont = "Common Normal"; - } - if(sFont.find("/") == RString::npos) - { - sFont= THEME->GetPathF("", sFont); - } - else if(!ActorUtil::ResolvePath(sFont, ActorUtil::GetWhere(pNode))) - { - sFont= THEME->GetPathF("", "Common Normal"); + if(!node->GetAttrValue("Font", font) && + !node->GetAttrValue("File", font)) // accept "File" for backward compatibility + { + LuaHelpers::ReportScriptErrorFmt("%s: BitmapText: Font or File attribute" + " not found", ActorUtil::GetWhere(node).c_str()); + font = "Common Normal"; + } + font = THEME->GetPathF("", font); } - LoadFromFont( sFont ); + LoadFromFont(font); - SetText( sText, sAltText ); - Actor::LoadFromNode( pNode ); + SetText(text, alt_text); + Actor::LoadFromNode(node); } bool BitmapText::LoadFromFont( const RString& sFontFilePath ) From 35fea8f68d29d909d8ebd6dbc061e2721877cc3e Mon Sep 17 00:00:00 2001 From: freem Date: Wed, 30 Jul 2014 04:37:21 -0500 Subject: [PATCH 59/80] updating luadocs --- Docs/Luadoc/LuaDocumentation.xml | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/Docs/Luadoc/LuaDocumentation.xml b/Docs/Luadoc/LuaDocumentation.xml index 4a9420f1ce..21f2f995d8 100644 --- a/Docs/Luadoc/LuaDocumentation.xml +++ b/Docs/Luadoc/LuaDocumentation.xml @@ -31,6 +31,9 @@ save yourself some time, copy this for undocumented things: [02 Colors.lua] Returns a color with the specified alpha. + + [03 CustomSpeedMods.lua] + [02 StageMods.lua] @@ -1572,6 +1575,9 @@ save yourself some time, copy this for undocumented things: Returns the number of items in the ActorScroller. + + Returns the number of seconds the scroller pauses between items. + Returns the number of seconds until the scroller reaches its destination. @@ -3182,6 +3188,9 @@ save yourself some time, copy this for undocumented things: Returns the player's grade. + + Returns the player's HighScore. + Returns the number of judgments for a specified HoldNoteScore. @@ -3580,7 +3589,7 @@ save yourself some time, copy this for undocumented things: Return the width of the display. - Return the FPS. + Return the number of frames per second. Return the VPF. @@ -3676,6 +3685,9 @@ save yourself some time, copy this for undocumented things: + + Returns the number of frames in this texture. + Return the texture coordinate rectangle as {left, top, right, bottom}. @@ -3952,6 +3964,9 @@ save yourself some time, copy this for undocumented things: Tells the screen to go to the previous screen. + + Returns true if the screen is currently transitioning. + Tells the screen to go to play its Out transition, and then posts the ScreenMessage sScreenMsg. To go to the next screen, use "SM_GoToNextScreen" as the argument. @@ -4041,6 +4056,9 @@ save yourself some time, copy this for undocumented things: Returns the songfile path. + + [02 Other.lua] Returns the number of stages this song costs. + Returns a table of Steps that have StepsType st. From 1042327690c686bdd1cf36dade661c9c06401582 Mon Sep 17 00:00:00 2001 From: freem Date: Thu, 31 Jul 2014 11:58:21 -0500 Subject: [PATCH 60/80] add libtommath and libtomcrypt to ignore list --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index fb310797ae..956874a71c 100644 --- a/.gitignore +++ b/.gitignore @@ -63,8 +63,10 @@ src/build-* src/Release-* src/libtomcrypt/build-* src/libtomcrypt/Release-* +src/libtomcrypt/Debug src/libtommath/build-* src/libtommath/Release-* +src/libtommath/Debug src/*.old */.deps */.dirstamp From 48425fa998541562a6614c04054b2044f187e280 Mon Sep 17 00:00:00 2001 From: freem Date: Thu, 31 Jul 2014 11:58:58 -0500 Subject: [PATCH 61/80] <Mad_Matt> hahaha. apparently I accidentally included my libtomcrypt and libtommath in my TapNote enum pull request <Mad_Matt> someone should probably remove those --- src/libtomcrypt/Debug/libtomcrypt.lib | Bin 1310624 -> 0 bytes src/libtommath/Debug/libtommath.lib | Bin 680604 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/libtomcrypt/Debug/libtomcrypt.lib delete mode 100644 src/libtommath/Debug/libtommath.lib diff --git a/src/libtomcrypt/Debug/libtomcrypt.lib b/src/libtomcrypt/Debug/libtomcrypt.lib deleted file mode 100644 index f4d2d9a49e124e514cf3f067e3018336c91b96a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1310624 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

a_?E)QM{ux4q*MptL$ult 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

fxv-)7nRN4K>%T zG?Blz=qyV`@-x^chxr*Zt_a|IR{IcHgUY?Gl`N&Kl5j*-@@fqo(uFnlaaG)*^tw!w zuDlkpgJY6XBITOJ46e)WbA;dQBKa9zc`agB$t0yjisF>m#%>jV>ugEH6UDfoEhoW#>O{O1NTRo*Lxf9looK zAY&7WU920Ig2M{yFpTi#(PAccic1mZJaGy8!y9nJx<%i#xCxzc6@Cbt`=jlGzSU+= z!}|Dc@d#{M2BM1A?$X-rrOI=s{fPivt2*b^Xj?TODUXqTyP3{hx^1QdvD;lyX z$exK(h1q2VIq-U&G-x4mmT#Q$Y9HO>1cD8X6+yg6CJjo!;xc&6!4h2?UF($j>y|by zlWqFEeg3%fBVNIm6JOUOZ z`TEx;{(c7hpyMsijYILi=$#yjJiNQPc>%gz^iB@NC!%-8d0T*Yx70W%hvGibJ2@2p z6upx}QGj;L-!7rrS^KXnX5%d4k!!{6OOney` z6H^_Gi3#Zr#>9kli!sr2j>g0c&AteSl$&I8LZm$oSxgR$Up9BF?--7+kiyaUJ%T-L z#c-3!(SUm%ED|z-cZG9PEYggQpf9i|iT+NM1&3)ph^%)S<(ZR03 z>w5e4=8qUXDrw%iaeMK-R{R7_`)DVn4Y`||)@?ExJzM%Cw`&Q^&m9P3usJr(gQK7M zASKKd%ciH(HsmT+$JbfkrnzQaeRN&TxjS|piwc@QIv3uDQmo}k*1EPet=ncadfkhw zE%*cW6_pEXVsmru=7A30!vju4gwa0FC= zjtwPG_GvFe2r;Zo!m3gKOb)$du#S!m7x8qF0kR8$>N=VpW7Y_c))k=ilYhp+(CbS6 zjncDLYo+a5!o~>;+iVtkBQ__%e8WQQrau3>jskt4`J*asgF4jMsCnk;NVQH!t3HdV zX52R%wN~tfjvUVq!L^a- z@MUc6HUdix_Jp5U5{*^(#rOmMZ^JJ>Q9#;?Uyiva8b6mjbsWM|CH`XRc=DB9JgQf< zFkaIL=o5{6NcipoX+9*iv;q=`N7IbEEQwxQR4w${qU`=)>2_MWPb`Uz;h*>)j(;<8 zaD+R_H8Nd*_e?vlg*=AIQM?wG;aJ7rQS+PJbx9Gt7Jls$J`3w^!SYJ{NAg()YKqEH z`~XHb(gz$+ESj}qGEo$3WfK~q7rV}{SoD!%a$2e?8%Sg!?PaqzsSif`NMU?3ljgEU zws0G4U)G=-vzD)-U3_$ybZV(cn|Pfz%4)wdWBvFt^@uDh?kaa1!uR;2FSX;JHBTd+0LY6~G68R{|dgUIlCcUJLv!@H$`z z@CG2SgByWeb9m0gRt>-rOE$itC6BS((s4+fOFhOaOZP2HcZsEIwsedXr|P4JaaHy% zOLwoOd&JWH%+kGR=~^uvRxarX{NkgSPHaQkec(qB<<6giOJM7%$Z2*a?!6M&HO0L1 zbTrTHGi_dI&~AV-QzG9C!qO<@_b$KyZEI2>zG9dRGzqq|y; z^Rj3X{+T|A>T2(SZoDxNy+$~(3{Sx!z*oav?KcCQ5nko1u15fqqm4sTS#JyeC*nV{ zn`IBiHBLhhUyfyp2guw~$+5ExVtKgdWABzF%h>ZVH$!q}$GIBU6&uKh_{Zg7C2lLb zAyjSf)G@(DfOJDg0Z&BU3#aDzX0NRhMotG1pXR03iu)r zbx4TDlYo1XKN;8u>l_1QH#8o|V>JQD-069C!o(oI!=DokJ9iasFGO~Q=8{P<2qK%z1)fZ|vW|O;5n@U}a zloA=YBb}_8wND#fF>W=x`?R@C*CM4vzD;X*4Pl#Y91@H?pk`iu+`F6a{vqyx$QZM( zea61)(Aduo`-FseJ}z+Unfi(Jhld6{pz`+L%{tQ$Yfmub?9}i&W|Hl(aZu2$p=R8W z_n97tMFfXS9vjQb{5ADuWzxsN35;ZxHTZl{rr&IY3qD_&Z?$QIflG{DYPT`sO(r)` z->Y6^)Ha#@?${|4#*Y(Tlls{g4+>G+CQcPo@}QJYnK8q}xt$y-Hy+gUJdyU~!h^~@ zyn8-n{)Kvq2IG-%h^mn1$&F{!f_2^sn64lp`psg{LSo5UKL|a*B(4xRgYO!e~YoIVyvndtLneYsyawsV?IES zHwQiP5t>sK7v@yWfLpoTtU1=A`0%2FIVHJyx$`kkOEIw$!iyH<7tb##GYyW`27ST? zGYU$|7L?2{n3IP$AXU6?cxiEVNv^g0YkGNNc=?=#g@t%JROR}G^~E!0z3E=`q(h;#9NaaFYWK5ckhw}{SoY2_X? z?iera0QqAT%e3o}UUnH$Qy%l}a{$g@V!X8d@|_clPPe}ya6%-0vhcLU~R;Pm$wv(D0JDz;IZvtp*>pGr%r*Fc# zJzMcWZ2aQ~Fi_k!jAU;piA!mJ+9W*5N-?tSAUvImVQ~`IQZ;dHk4aeqajlIUr9DoL zk{)^HPTEGEMiS&YVF+*3x`(nwSgf={9llQ@{1XxwWpeF_r4gQpp-_#KGnGbUBs|6-eU165d;N;;_rUB2PwBN2~ymeVX4_+>o8Dt?B7LC%wO+v8^#xGe9y^ zPRdFFCnLe+WU%?zu8eWWf+K)7on=Y2kUDSO9DQOXysVj`TQ~cMXm$q6@Juene^=~` z&fE6>voqL!!|V*^W=P}v5ZkZ_|7PO0vE^}p(8460jF!Re9SsDNLc(%^048jSV&Ej` z(VE0z5?YfuOya(wl}d}^wW(SZCB>$ob7iSa_kNy~u+VG3B3*B3m)CbZ(@jo2@X4(mXYveMf_oDjp$vEEQqPR#b z!`4H*DiuGH;y8IZSSRzBr6XsxE%;~EJQq5lBae!6H_+&d)+>qOq$Z%Fk5J%hi&S8P zA{FWAr|d8PnlcVyJqVf}?@)M%+@U={M{OG9-)9RCon>|=rJfL`E*z@flq z;4t8KfyV)_1C9XR3dF5UT&0Z!@}#hDR97-3btO~s$nyhRbF#q;kCI11;AM#JR{T;@ z?#I}|mHRPD9^-NRvV|ubPie_xya0)9J=u6!OCF;Q5?g(;v{FhQVPUcTCksc8622bd zsErpLIbM`J_}HkfiDV;9OCG}uiC0XrP?;$q6f$(YPLd@YA0>~$dl#>hWP|rEN*-~F z#w#Y-D1nZW$5;(X9T)ncQOAYN`K!PUBb#Jj$<97vSDX<4FZ`klF;@I0p;57q9{BMU zW@FdY+1W=tnhEhOIJ(Jtsp5vMy5N_)wZaCpW>VZRN@@JjiT4D<@XD`}l!oopOiGh$ zW`Rn>YfdF$F*Sre{qUyZ#@BLZf-TjxNGXxmXbrb4(t8%4klbo^XM$a->yc6--x67~ zjrD?W{ivD!1JBCIbx&Wf&c!XaOv6)9 zv$q7E|AhFR_+?M$tDaq|)_&UbU)-e&X|S)IV+4qxhtq*RP0}H<9e+CY>OX3Q4S45d zIs`{GK|IefcdKZ4*Tap3-2~~`(jG;_&ctA^$So8NyBt!!!y0x`B!`DJ?8rzb4{O-T z2}{YUN17P>WlO^j)2Om*#<4#tkI?X*&R*UsHI5t2wiwoMqj_ftYq+xev?jsi@|8d# z*HHHuchAB)ig9Ps=ek3&i{RuPY`$HY{Yk?!cFM%@llOytH+9N{3}qf>->vY5<53lH6lA$3| zXA#}zb;GU!<@{g9}f{%^}%s= zCLe9D#!bWIi{Y`sWTE927h0^m7-8>=O4y6n?&anb&lR_FF*kHyG&giTA^6GX49>>p z15j$*ncIeZ+IsOnhFv#caM9_HW<8@`1XAO^dxgJcSl+0bAN}hum!JLN!+$lz(>oYu z#Yg^d$J#4j8+*voY1z9LFI1o3Qsa{5U4DMWVW(f6^X9u_+kXA_pYZ_%D@cvY`jzjK zS6})5RSWw*mp*X*CCf3xRrE8ix&PAgOmw9C)AE$f`i{yiwr zr|9IH8u7)4v(HoG&VS{^yVt*Y|Cxuk8~+~R-~0wXWuZ@k{*3zX{dLds_u^+?blv^8 zFMw^i=zp>Dv8bqicZ=Q`)h`auWvOw_sDAmPcSiNQP4v#FekyvOGpgS>y!EEWIivbr zF8b<^e~|rX``pz>7AN%Ie#f*&4dXweKjZkOM-Knnk3X&I_st=PcLebII1_K^Zc+Vi z61_93pJMnqnSXQf7Vj3-?}wsydZdfT`+I7flleDW^iJmAEuwcu^?OJ3PUc@a-au31 zoXo#Q(Qkcx?}cAqb>YAMujc#L9(_;i4>2Z+cAm$#`Y$T;FA%H*wWjBu%IIgamumT( z!sEplgou}2)nj&3urlV^uD+(c)?Z#4Xs9T~!3fsXR5Yxq4@%xaT&wX1Dtdm{V+_JC zEQ7EcuRbwGVa(5658FVDQTSzK6lRzn?808>GE6dGnBONY5hrj~wlt0>6NPEkFb(zMPNIxxw_U}J9ThTLsdaKCL$Eq#!u>#%vB zZh(85+$aq^pG9flZLY&;jBh^!WWWse)5B0R?50jrK}zM8_ohri8@+dKRs zg5|oVeb6(xGQPEi<7d0hz%K8q1_MTGC9a@H7%;m|!7?%hTj!qZHT|iD-PdhyTDRHa zH4cPnZ|!2=T^Gs*cfFT$I@wF%Np2=jGA$09Zf4s+n}q8*E58HzKH-Css&^mG;CNWt zN9~#xJ|^e(C$qD;C<#=`Rycs$Y@<@{;Q`w0LZ#dzPJGy+Y=kja3J^@_0Lqc5AAx@| z1607m6GY;e-Eksutd4^fDqx|qD@I<~anO##J1StIvU>%24h<10T02Aw#4O>|E|!r&8@@|FECS(*ijq?$xyHY8Qz980Q#G(?tGL*n5~WMn}ZO;0o~ zgv3!L_W+0-zv3~&TcV^_@cL(Ge{R6C)1%m*EW`aI-e7Wlj7Udu_D`n5AL2?{P-qeU zQ}C}7wlj)9v|rgM=Fm6?lV?zvNmMwauq=1}e3&S5j~8DQ>KcRMJ&s#6Oyy1Qab%SS zp(crxEK|CpOMr3o9Cjb`!8I={+ODG$NCLzw_&H~Ow{u{uhKoAYYX&ktVp^K3(16~eX z0=x=X0c03ZjB$ou0S1771>%s4v$#f}f#b6p*ble{H~_d7NM^!$z{7!H1B8wSUI3g5 zTn{V;ej7+p0nXNJ}2$F-YtUl8q;|;d*#u=gl)*4{ho#&4CBAL{}vVAC=hyA#Idj z{wU&Dn18``-Th#eH|Tm;iUhQ9J^iGf2EF_rSDt&Fxo)kBfbBZRQm7|fjXVk{A{$Na z^KReVRXs8Q0y{oHs69=`xl+k1TNoza;n@Ov%C=*gs5a(KzB^qTNhzt2&(11YHETC) z{4niSvpf0Dr|XeYQeikSq10?6sj%^PkAy`Zo{=Q1h=(A%%d_G7S!DQ>sZ++g7jig2 zJIE0(voq%u=Vs;2DxT9T5iWIyUna~L*ASOwW%Dt>y`ZWwSXsBK*7DvLsn&kq3Tpkq z8RY?=6}?nhnQCL~lt~lE?+1%)+@z_PpvFWNS&GE6+>SnlPf1K}EV7TR#;9xz7awjr z&~?)ttvzMB#Ih_zOZ*J|Zox2Ri6<#npJun>S{RMTx?hb^c6b8oltuPE)g>!Ku}jai zcNbj1r<&WlVb>pa4|Kz>4t76t*txUKPGp~LOJKRVvdzZ8PWpG)@{o7ti*7pXGIgDn zo$W&As_?{T%!*!bZ?etqN9VTkV6)A9t9wi}+a05t#i(X6s@WHYYKBYtAo0u$VVdp0 zBXEpqCSK|OcU;2_f-5<)%J5}o{#kQN%8F;>vz$^TYSoN|GiT<`FDpJHcmB-6;xqB_ zAr|}8jD312LX6&ds0!2C7_1=g10O_^27TV~P~Fzso8IR>LW9_ehfY2O#h7XTYs|FA zUYT@b%Y!Yq`o3*sUY^h}-7x-*j|gr)>9X+&z>S%9z383Hw10};$xJK4Cjd8Q+MS|z zGSl{o-pNeM$0vZ)I43jhM$tQ&X>W<%$xIuKmmD`{T7&4_nQ1wEmGAKVT@BL025!8zXL5JoNfs{aFz5za z6e6H)wt|tuW!=E0)p)amQfO95&1rGMWizv&Ty0sIYkS0-dcWg+)MnG@u`WxPYHJfunOVhd`{Rdv% z($ta;e~Sr4t(V4uC@4X6Ti37KCR>L%fruO1dRfu7OBwS|E!_1Xs)B`V>q*LDyRjYt z0-K&h0NqyCGLP#r+?N8g%(rc2wmrEsX~bSwIW`8IQuhVz)!Ygko?8?B2q(4W2H#77Sj6`;PtUTBPJYx|U=b*}E3mtPMrmHX?klI&{365I9oz zAqYHaUVk0_=k+vpT94}%E$+OglRB%Z z4P4eu=H7vxZ0_BF&g=T4blNU^*I8XpNdea*^*vd{t75x>xZM$Lemh&QrNR1|cEzjX zd-ncrL1yP$Flc}4;vjn`=lvJ5Xg`k3-JRF9W`FA{?Yu5^YjN2wxBEm|=k@%R9SSep z=yu)NnMZHi*|7o>Xn*R8Z@<9(ptmnDw+Nj0xf>DoyLn-1f^f9k?00{-yj5*GzI{?B zH63CyzteUF{>@tpf~L1hcaLqw#_pNl{HwVeh59Dl!J@^&?;ef=X5)9GJxL<57Tt>^ z(rQh4EynP^1j}&cnZ=k}Eq9Wwl)iq`CN4RB~mv9C>9| zZ`n0MDik}AT6KM-+~$jJFr=A~(hSmUb42^bsVU?L=b_B*k6*6cSmCH~{!^ohnivNaUs@8cCLvVo9lx z#>&z(NT6)PZU`hYC=-pNA&nBr3+V)rhC>=5(nv_dMLHSMFp<(Bc}1ECiCo)6BLmXW zB29-hP^3&q(B2<4iG+1=S_+q~G3cwD?>Bsp zG83;SP7iq;icirOGYtiKn%5e7UYQ<(-XgRF`H{f&K=ddQ#2fu~=uYI(*GLd=^ym`A z8@*8I73k6Hhd4a}eO9Oqh&w~*P^=60iqHu_^m!ppa6&H_ngqmsCBzwSrvVoL(RYRx z0keSRz!|`0K=inw^}w0Hi-GyTD}V*S{{!NF7rGx<1bhgHyJm>fr*OXvwE!0YUk8=| z{{TD#_zv()Uk=m#za zRs&Z7Yk=ng>wp&lahDF!yGj6f7Z6P%bRTdf@Tb64z(;^v zn}DAIF9b4J_r<_u;3dHRz{`MXz-HhPz>UDK1Fr-Q2VMmn4g4-J1Nc2)7Vv6dA@KXa zg}`fpOMrM-4EcdK02_ce0)xPtfZqb%3=9Ep2VMre1NdFwCg63z9{_I#{t);B;61>n zfcF7^3A`Wp7VrV!yTBg-_X0Nqhx9Rw2Z2L@4*@3te+(=J{sed~@Tb54@L}LZz(;`e z4zmUL7;r1_x4_4Me*r!Yj6>Uh0+olb4mb=L z1mZ~|gb%yM2;gPFIxfF}W4fOx?RJqsKI{4H=S@D1R2;9r0ffc*}^ z^BwRIAe^p;4h2pD9t+F>4h2pFjsi{x&I6tbTmZzphfpan6X*wK0apNXfaE~r0)xOj z;2K~)a6Pa9cqypTeB_dOUCMie$9NRdp`ydJ zq^FrZ3u%z(a6O3R5!dyHi4JXAp0GW}JCM>u*RCax+@uDkMR#kxFcg*c5BIF^ugU=l<4@mo)Q9mKsrHmM`+1o z91m%P=y)Ha>1(3j!YRSV{x}8l+n~C+!DnQHsZ~ zCBkN>!-mI@uW;dd_D0*_0|{QWB5Zg=Q%RpM%$dXuI>KhO!-m_;*HLRPrm|*!+@l7b z_H9#Vaau9Sb0B`19vE})#RjgE&Qg|M#8Qz{aM2V|4~ns4f>Wx)#RpIT31)?E3Z{+#G~QzU{zT_Pce>AMjQlf=r{;k?|u;U z!svsb)twv!bE)GX=mpUSL91O3f?g7F5X?&SLD;{E;o7<=vv}6b?3r`&vNG{>efp%+ zhiA_?eR$5C(CwtC}g2GHbdb=0Yrg?KSbLM2_ z&B)D~(W`UFeXCt3kY~yS^6V;K#fk;N@`@E_ls5!2anud-KXe=xnzhj)6S%&P*ug zIA9cg-JlO4Z*tyRu{}$gyZK<<) zY%uaRh35eDWwYozJ@^Q0{`;zV1sXEX^u5BB+nnrZ(Ld$2>RT8(i#=jEI+rQZh1p_ zjd!MPK17kfqMz3DfN1qA*hG#As?Hye-*E_nn68~$E$vLwiHn}`D zx%^;GE|0#3?eR>amyJ0{GtEChr}z|l+Ard?WzPEzV*4;;TU%Ea#P{cj<=kOpQ;a zbrt2+KGuTg@5YKCNFPaq60o>TEzz}2p~hdgw2?!}pZ{EB=e*-&td$!vv!F0n4nq<$ z`Y>Qie}jdMo1xIy&JC>QUD-Wla$ z2Da5L$^}2ExJ9|p(JvfPE;zoL8t061!I#d|IA@fLt)h2ExiD})PmOa%xj0Mo&L|hR ziQXCILPfuDM!Cqrw~5ra(1qo#<=@@pTU2}5Z-%F=uEGZz(L1ADkTc*mm$*#y&bh>o zirzVwnB#?RbBQ?)m>TDtOZ>FxopXu%@8RcRMzC@(P zxz8m&gkKISPATo>xp6hUGM6|OodRd3UOxmL$fVf7D!KnH8}m5@=kV88#iCPGdjqyd z@Rb#%{@RM_#!6qQ+&EPbiQc}vV$mrkk1DOPUWHbwSD{YM!~fhI;OK|eeLT?iw3F~J zuPv|sT-s^k3Bg~+3BePc zaVjP{<5Wxv$EnbfD&EI4p+u@k1>bh-bmZJ3RrGP4@@tzD>^^DOHYeC^((uMyPOeG8 zT$?1@l(tqzjtDZu!Y;lI$po6VX-O*&Rnmr}EgV3DnVE z@Jwz8Rw{F_J7f+vf`)Wp4t8Kfb8b>XZpXlflgv5EePkNco=f8~Z%It|v_B`OVb6x7 z2`%n3nb@LiGntyLk#O?C@wz7oLp{RV8i|~mM>Jd{4$*r>%D^wbJga#`%B~oBWmf`; z-_6xLB4xK6d1Y5`*)>8MEOu-0tL(l5i61x8jAQVYe5gp|K@WnIXpkv(qUg?nG)kmu zNcdWSrJSYC;dJ+)6Co_+?$eg(8oZ6!XNYjvJ}YX52+NRrM%>Abkz}7C68(sP-8eLr zt7*Z1I{wXZd5EZ`>!}`&rE0>!JZ!SR78{;Ch_wyFKi(s7lF0k#?s#$LFrbEmlsqVn z7AkL=aGsj}&Ll-l?mw54&Cj3{taP>HI1zw3#qAfyE?KNr;<30E`JvF5q!t__VfUk) zu=|e#F2QoNhtPW93Ba3yXaU0RKN+|gdGHQHTYzJLPXR%(2t5l#OB0s=MBrPkG|5AcDoCYL+lCuCF1!e+& z3(Nw(2b=-?0GJKj1Iz;+8n0#pOac}lPcCC2ka05R07=Y1+Yj;7kVELsdc6%x*ftR$ zK}#NT&!sgclVvWFhkS8q>&aw@i{vp%uqCWH*;u5dF4>9xa4dx$e^9W;Pl#^n`*<4W zbz`Qn5O`xy31?MbqhAH0B8N@)m7GLHUS%wJ;mqw7BKI^2nlKIL z>gzJlHK=v#A`$R6onxu4=uZ2JiGUdel5ktoYm1Crz=e?%zXPW`k*m%WraOI4Ys{mH z_zMR_ce-8I!?VD)2r5Bj&9*^s_PF8WEXJMu>_8oMN>X%JrWS^^GScF!t*EQ?MKF89 z7Mjm=aA`1wnK}8h5gnm0Khs~^B?~4WRGYjRS$PF{dA-4ciQe!378S-bcFL3~6HLMj zaGzWl%RJ15*^Vbop){kh94HrN3HoL}5ZF_uON<3}pjU$n(|3rn-*Ucrg z+X|aens379pP8CE!`?m7j*k%6I5;WpT$nq%VaN46)D1gON{z=HcJ5r56Zs@>OPz6H z#=vg8w&gY685d?cY%-(mY~27?bsqj_X&dI5cs|fX#^&VC%vxAjQdltKlwm~+&d8o$ zk~1t)TU-drSW)f*sB?1)O0wqUWEamVDVVb`*ULL4$B^%Xu<9UjVeB-<9`j)S84I!y zDbNY;(ZV-#uD2?X*qrK6%se?IHM*z)NasoRjx*ujrk;mjt|e zy7690MepRj{8aQ#-phYP@ARQRAFrgTaZcXL^`dw3UN{fk&4>O-ypndtd-;T~t3Ccq z^*Q;_kMUl5I;0)ry&Mo-C3iiC7iiTh~>P1g_@_@+;>q#a2nq3Zt*_wbqP#UOfY^XrC zwk}v6^w-sryEMEc-8VA?o(h!-s7wZyp6c}uACH1qHh%w! zF5>(CeLMsHw|Oo*u?=uH52x@pj>}c}F4-B!r4h@bI4*rGf=G9|Z`qO8@-?v|uSMBi28kd4(WZF#r{c$2lT{g)AB}Sm5JL{8qwun=n}NfzzR{1d_o*R^4g9OMzst(9udJ z@L^yU@Fn03U^_4y_%1L9_z^H4H~{-w06YOW3pff`1RMuMD-TTo&INYOWVs1j&vuz? z+@>WDy)0@b%VsTkjGsYbJ5RPaEgoYownQ;mOis&xg~_t7=UX%aE8)cA5;POL3Uxt# z6{ss5<=j_tQdf9cv8&6@zVdQKU75D&TUSQbV;}#-*EtO1vy@4_&_1?)lDsjp6mzs@ zilnZP1ehRN5>?V6Es4;KgJzMXK?V~g&Ez#A=^Lb+bl)!zJrFUmRAfDDHQo2iQ^`t@ zSPC18bcOu#CwdF}LDzkv3NKhDmWtfMBxn-iIkwBRWbi#$rCPVrME*Xbvn+*rD$9fA zT7!EJ>M_sEvw3S_(s?~`=meNpN?DE78nvffc3Onyz=pMRN*rXY~dP#lFw~ zMFvVn#uU&B%(O2C%G3!{$1B?~1LZ?JVenCt=|CAMm!fa(4g=*Jbc>IHfpXLlYJKd| z-54lUuzMXgS-NBFih=T@aOWwND&~f*Lx7fT{_$?u@p0g}ZrGglpI>p<=~w5x`R>@Z zU%&lli7Ei5K+Gdc?|Nj(D>QPiJ^kAEpKCtv`d5Fu72hzP5(bLXBa26vCQfEbx#*qD zlx?DSGE>s4{KH|(?R2Vd73?jOW}5}=R4xESq*QDw42OIxLSY9i~T?GAz@P?BPhHIcdeSBjMR4VOF0FMVp_=ZR6L^ z_CuO;+r*Jb8wC0sDMes*Gje#J4Y@m-b9YR5X)B)9jolwKtK8#~`*`>7j(TbL?-HJy z@KV#d&Bnn0dkXQH6MnN{A!r*ZO*`YJ=C%d;qf#(CnoHLA*|2bP`}Z^pL?|B}+l|EL zq7Ly7)3JVCYY3~*{$V;UD{7^Gm=5s|)3J*~g0L{K#etD#Vfcs9g_S0_SvI9C63tr0WPdoZ2r7Xe>CK1Djri z8iy1|vT5B8W8j5XNxox4Zrd}t+aMcM2h(wwo7yf&&fO;Q>Fw*qk|%felQXfce+UIO z7AdRnY!e zJ3RTo0EY+!9_tXPbGV1+a8LLg?m7ytLR5q6+~W+d7*~%o^fO`(8Ls{U_?sasLoswt zz)*-{=$s7cMCj9u(;$r!iP0-lAtf4&DNH7WJ41&9FWhYC=RjO_{ zow0|A4T{SdMxza)W=5ywQo5uWhP(6O^-rAEc0HNDg* zpEagO8@tb%7jaC?#N$b(52t-Ut@Rj75~j~kAlNi?s}ouRJPx=Xcs%fC;0eGxfjIl( zvj*)!eAb)z(e~N%}fM)`WfsDF07g!0L2W0HM`M?W-3xFGeCBSQe3xNzBbSCf);36Pn z>zxIpC*#GyH-O&&z6C4=z70GZxD!|g`~WsOJ3ZG91 zK*trnuU8!VpeP!nFh~GMXmYx9`YN!MI3m8UsqQhEEYd4sdqN(gX{O97?vhkvq_rb3!)*GxcHV&q#IWY{_Bs zz^h8s95{dJ+qxbPDr1YmV}!Hj1L7~;t?OYcRy98nS+kAb(0%^WuTe(?e<^yHQ7v`! zab*Zj6^L-P<1jH}LCwvaU0jeqC%Z6@L8L&3>e3O;0f(F_&YU|tt9V91ZeFHz_Fb+e zzc@1++cYa@POtEsq7T}Ci|jNu10khMq7!gmT&Hp4CQL~e`!Lt(mE(onEN%BdxlT8x zDX!CR$f`%;wVCPSZRZ4ZVt<8A%F$xRM!&) zGp^Gk-L(68H|);E%3g5TWx8^mrsDY8Q)gVKQ(>2-ZF!-0#&wzvo8o9YTVKF+ornLk zv<>r2JRdmqz2j|X6HZXWLE<{;D0e+(IDHs%v=d`E#TZTpli{QiAl1yVkR#}lRSXEbv@JUK%BtbW~9C7P>K}0uYV5eay+gM#!yL`fU ze9}r9^cso=*3`hD!Cz6f!nX!%NgDJvv7qYeR zn(~H*x>aTL>5rFuM7F~I`6?>P>g&)9a8lGtxLB{Gt4fE!JO!18V`eduEQ4lopMtD9 z7N-kGVqbB(KEjcDFDKwy^|Bh`A2S?u(L$(h9Yeetl zgtdv@$q5^Q_xjE_VY~UxALE3@IAI4wiHk+)l0dngM2Ct+>FQyOxvwfGtjo8682>BA z|LS2Ih{fdkGREYZWFvcN{?}xa>;+1g;(v{wY)0+^F96TM94JgS_?elK#}MyDpF$K) zSRarYw(^^E_c>uHM&nVpp@h-Y;vS{T7RJjxO4lB6!mN-`@Ltr`w60C~U~Ri5;43QF zJk3ediuMG^>w$YBlMgnS%RV}n?4`MT4^QV7Je@S{qn)xXd-ewFn?F*ECd#5d=AyQK z!Qq{i+x^;6E#Qwe?TKqV1Y9$IWp3|hlFoE>`4QEDiL@cNW7pMCM%hKK7DgmFwe{PI zhj!zn9dHk{p@^y{cP4O|uAF15O;4NK+Wdag_PFLxd3g37Zr1my?BTTc8?hIi>|i5! zaEefcHKc4e;t>W-m}x2N*L8%jion;PzpSW(w6qkVrKRk89eOM_u+t3Hg<{~O>0(an zd$l#p$<~532x*oz_9{v9&Qi!m)9Y|l)4rT*#G7`YMCw3%GJ73ne6q+ox?Q=Zxcwb_ zBthQ>$~wRbGuP2+>xpYj=fO>pmbv%vLTqBVaYeLH`q$dUG0uHAseuX4;VAqor(4V=k``qQ6^U0ZIV{TQma@b52q~3Fx)CUD zECFJXwp$KK+0{c*^)*5og8xKt%1k?Q64K;<2Y%UQCmJu|_axE%#nQcN>3IDrI}apf zH{Q}sw{&ca%8t&Nl-(7Uj$`yncaNp}iKQa}O_k+nxw1>dMAEEynSdbrPCdL5>GTzAn{U3G=@MT^~;@< z$y+yDG8qj_7vY1Bos@YiT6IPgDU)R|SS+{wx41Eq?4(Tn1|n2U*4~2u>G(I-0x`6o zRLrPQfFxbA&r86**EZJRleFSxdXYCH|8f6^sXQ+_Qa8=We)>9ODN-eaup|?6F!E+_ zz-nK4r5_*4*ZLajgl}mwEZ1N}A%RC(5*z+E(Lj(`8!vcn6EF679P8Bt_Pj~ydF3bcsmeRpt!L+8Tb?AM*|-R zrUTyqjt3rzx+egK0w)5G15N^-2n2^MG!u9Va5j)+*7-neQ;1xsQ-S9LPXk^8#8Yyp z4VVpN;Kdvu_h}}Oq}4p&U|>G*cwhl=I&c;+7dRVO0>s@fR0AZL6_=QhSvLT2{}7Vu zT;PMq&jUUOoDU=^bph~AU2%dKxEaD$G8g;`^049UM+cyhasT>LiebaJjO2|9V)tK zwd66*!dX$o*t50dF;-i;^DG^m5-PjPEgf5>(uGO2yn2=HKFe;4rQ2rdc38USE!}ID z?)R2%r=?@tXU!hDI@CHowRA~1t4c?5w6Y^DTIr6qbR#X@$(Am|(y#`EMA9Q$TLT7^#-*o^sjpmWe2`gDS5rU6UwPC`_ZWNk zk~o>U%vT;9lP>o#rLmLT(E317&BE`#lAU6VbAwVOy-^CM<1$wr7tT>~(wX_N!cP$E zpT7yu3ta#Fz)HSf+md}Dr@n*mBmYOnb)uactBhTV&yDr_@5G^Pi}+bDx|w9}vO0M%R;U)qG)O%{EdaZ>imL(8xHac7n6{=x_JUXzC8GTgIZy z*|Tzs3JbI6WTNBllCGRLJ2R)Ss33p#oWkDVE9?DLEal9y`6bz9*;T%Z6$^sp6)Vmt zZwO>&7-eB~ZlGRg7gRL{E9+L(TFpmUnQCoSQ0ouQC=d9=icLXTnQCKf#<+2lKs`0n zzF5i`8RImmIm}Xi@#vm=WL$Ju_dGI&&=YJt9Lz7>!=acfOPS9Lzl6<{qhNrv_UF%&!Zn4mxDh8@?_(hWO5?0)I6b7v_}#PPMK&REJBuw%SWCSI+bv6N@R#*FuA z+1V~=mOl^wCAu!=nKFBmrF6;w(lfG4{k0XfsrgMjZYyR!BXtalM!EK}p04BH1q?_}71B6=sob`D-F-59pt7rm2V`$y3`8MebQ=+YU( z_G2vD|Iawp{-tI>HFtM}HJCxrb9ZU6c%VI`QpLP3#=I_;$Gk3x=oSyOpwoDuAkrqm7a<%O&eNx(PxHdmgoS%9jSoi# zh5N%aAvSl$TznrVGJ?6t55`Pxu|Y>duV{+HMdJ9TSELO5@@ul9DJnbAOh~Cg2@pvn z(x;*+D!b*-DLc?Tv|S^l!T47+MP>IL+_W`-nfDm z{HNoe18F*;d=!aoUs*+Qn}?0{*J6{yo(KK4B(#xl#vSqE_1)yWVT|0)d83I*Xd}VR zB)koS8LP1S5mcT7!z?$GTIDsH2g>jmki;?+a+=oT*zA*9bu;X7=EZN|$-vFXlTx(> zI0pC>5aZPXR0Ve|!u}=C490El93ylMkYIO>bRI5VZG+-5Q zI@*L>~B7hfyD}dQ-FoQ(}8n< zSwOV;eNd2Yz}B-(CL6bC$z$9Di6<}FctA@YV=E*@L3&I}9)o){K z6GNqoCthA0W*Q3tUtM$}(c!B@P~mvzzLJxm!b^$;e|hrjX!$tDMq9xvWs&tb2`cRH zI4;Sg2r3(fr*x>i{TE$>B#WRj4ws8TmX$?Nk?5d|HX7E9gAI9FO2Z1m!oFbWP&N`I+`IIio~AWwPr0lpLSyj>utbO@@oX2SiE2O3 z4;q7>Ejp3S&lIMkm~lSMqZ+Ijen51T%XG~=3v6eGahth8hL^|LHhP^xoA~p@s_UQ4 zs3U@o623Kynz!nTs`7?1Uu{KQr7yz6p6xb%aG5HFnK}8h^JWzn=4bl5_THB_E3+tj zZqAHZvu5`SQN=ns|2>a-F8b4K;ldFQ8=a~;Icz=jIL`cK1lMSiJ z!vFJDyAl&L=2WwFEzlYx16^=`)oqw6Bh$sB9$CV<;Hvx^|4h6F-J*x)W1S1XW*9f| z*%pbtn;Tb!E&By+LpvtL@vyPgpyT7i8{M!w7j}Ph*tv61N^solsWT4BBG{E`TOP{J zI4H|tb8fVq?JDNFcnt@&4f9Mq&N!$4d!F)^*41H_NNtY^C^1iY1u+6jjDT`52`Ku~ zwUbcHtNGwCP(DD%NAL9q=qaz8PVQnp+~A0L0 z7q{AApnD!7?HrRXpHO2Ylb9E`9=3s)7q>5=7q@Ztke%9#n-#J%?8PlT?8Qwywzc5p zMm)AU;^tOi3FD7pAe=v7gEXzPd2EY!F@Tq~ri_F@D)1Tk&cB5N zH0>u^dGVqZ$KT92KoXs%SDoP$NV{rZ1Z!& zaeG6YqO1m*iQB`Gdls(NN^GBu+~Wv|Qxq?736>25@+=<*{3Z~`BE-5*0Imm)1YQCh z1?0Y;2)q?|GLZYrk$tX*qt)(_>0Z=JlZ{p_$*8t9b{*w}0bO0sc%j|CvD(M7*~oY( zRl-gp$L8@>aJInlkbNcRST-9OM?~)V*Bjf__~J*)KOGubk8>=WVtU(L zkzzIC%+VR9>Jk3;%ylbG>FG9&Km4_PDO|@PCT7VVkia$+6@y5k<9OOFJLj6g#L|4SpD>ixlp!QAl0d~n8dl}CZth^`(?E%VngPCX-q z(Y@o!^0I1wAc!~ZB#F<4NNicbU_%L}=lN7%GQMw=m2pDxp^O^uHm#$|YjNsT-Il@sq?|K|N?9^P*JdxU@U8-~G{ z^U$AB|GmHNS^i%9?2E3u|MmsY(T!(n+%Hx>R+M=2jSIf$Bf6`6X@dqXIrh7UPF#_@ zXz=5|jd=|)M|5Le17ah(pU;4HEG}0pE*BoJs^9_L*ANI#$F3?5^n%k6?X|6nR1CPx z5-(ZHY+kZzEH7Crm6xne;-jtnU-KG(7tBr{QG0kS0x_=v;bt218qm|>lISbH=QNn| zK)}}!?0G#E4Z*Olke>7&f%58J*cwbB5?_D;f1or_*Vs^jY;7IlH~Z^q$w3-klI|Vu zTUzfu72vP;GC$FKlJ^`@Ku?9r1XLyiOHcJ;s1^mWZ2W$Q<=USZTn7|lt7%vl*Ct{uB>!Z$}XL48`%O2pt&Q`Kcqc-ML?({tZ39*j^{ zjIH#ie!E{k>e=0|Z!AfQ+pw?=DjzC*&2p9(O|Jl0|_^7Ju{gOZklRy#)iV8X) zC@w&N06|nHBoh+IMhJ@thA^3sfovudHUS4CYK&BEtI|cS7I$s2wkR$wu3+nKtlDb- z!Id;vH!9%9|NHK}@6DT;7ZOOIwa)z|^WAsex%a;1zWbK@opX?x`k)L z5GP`HV@!KK1HM6vrulaqO_9v8j`YArr(unpm&g1ua%1r;=ipP37`!?}#DLUWtiD8Ir}WcM?c>OvpYMjJ)nQfUE-^uc5%n zKuov$76MNNt^?xSiI6O30B^%GSq1k2M*@Ej90kPZ4-tap8DI*Q{{b8i{1k}ECf|M_ zdYz9ZvoL)2od`S|I085cm<~J#NGp5#381g_^MI>>*d`yno2LVR3(N$*0GtZsWK|aM z05BWa5BoO_$Pg_#z~g~=z`;QDaN$1ylf%Aqv0MnG|A3i5P8hY%lK2JIvX35)-+=kp zGS(ccEmXPxh~I#NJ@ax<&=XE7x{aPVWc+Zr7M#`WD1~w@cu8@{8~G44TL@1A^h01sgeQSgL&6F; zJj*2c27W37*%zH>R*X@#NX~|t`@vq*`JfdGRXr?)4Ml1azx)Z_!d{Sd-b=vGR6Q&e z$o=5W-|rz)gwxYCdxu^Pf-p8Wb}&P!XrTQK;ceEbd$s7nk>Yq+!?OPv$(jf2iN2R@JN{Y z;NOaC!q`>sK&M^}i5$t=wmq&1BUj`F>sfG3<|-Y%ZAW){4!9flyk$o^dPS+5Zbypiy=AH0 zMK<{&9KIs#Js|8o;Anae;N>em({J%4XBEX_uaJjEvB<-_r&Sb-yM;V7ibVw8C=((=qgc!n^3W(2 z4+?o`6pL?!JT!_$0bV1mqF8Jc^3W(2JB2(nip8mT(`+w_#Xi1;cG-$2cv`AB9L1u( z(%ot6VvEDacvM}V1`9{A2uHC9N3rV*G599u{nphBYP^1lEKV z6CWkovWB?GI@`l|{MA}HAq!3gA}BQMJh@?ioL9+vLk{W*KT;Yo7S`?bVbQz75H#$( zq%pU}o7k|XC2DzWlXG{JU}-EU_45I2(zIm;=rU?M(Z!K6v9uGHRU#!y|$~Y(YX)W5z9bkX>QmBGE1{4 z)+~0vdHptT+;(w9u!UNiP3Do+^aC@+*za{aw?V#czYo9OUg89{xwvspv_u=nt>N9t zu}`v5|FOG9uvuC_Fv1ptVARqWBfU2ZR#rjpqr^)TX(i0~ixS{yOA=2e|&oale_!p$-1jVyp8S*ZE2mGAP zi6lHzgnrHvL>0EM4O$NTbJ{^ApWi!0hcPM!W9xN)6-g*>@>jta6pT?Z1macr9u%8M zCJLAIAQxmAU4&(CWewVoO*|O$M0&np{0BX8f5|-ok3=IYf(hqOa8Gas1os5T)VC0F zoaGP?7uP{f?#V4c&=h=k1CxQ9fgmdQo&b&mz6>PyI8BsH5<4RI30K`Fb~M#rU3XiAh{*)17`uh0L}$Q zV!zSfe4~N$fLXu`fcd}$z>9zv0_%Vafop&z!1cgIz^j3!z+VI1z`KBDz|FvNAp4I8 zcyJC&GPb5K_B>WgQMvyJ59Q#`y1bnAbUHHl5~C7MIF`_PExms9g#3`dYAmYvRFsaW zs~l%(Au49Q{4uAs&m1m9l^*FSJ@KY{aO2=CxTDNn;vJdHBda9lIZjHWBGd5OQ8Keb za4u1bbDkZgP$mj5FwT1Z<@!-z?QaXt+q4adI~2ZZdq z+(F=OsT&S^sTBu=J#&H`Kc*zP6Q+w9>v&^Lx0{rZwbEldGdiKS1bXvB^sG4`&xYtF zZ!=Ci>S5y8{b#$Ty@-D%UW)B;K;E=#+S~YNGW5Le6<#S4zfa@$Lp%IS4VFUgm(_88 z8x;%~0;k=lNIjkwahy$8Ki90reeIr03WD}9fmQ5aXKOT^=@UbF-p=W`M@9Hd_2 z&EP~BT_j*1iMfV#-SEQG?fEq*;#uXXT5M0pV+O47YPE1Qim>w%%SY3Uu=A25;y15ryjYQ+&a%dW7GldzAIu#c0alKj-&+s3{_4(95~t zvFrn5VCxi!6_4dsWVNx+G&;X&SYu+eSQA!EF*B?QD<;Z|m4_92@<@%W9R#LC{FbbU zhW+-sL_PmRWYes;Nj9AuvJl^3w>zKb*3rGl^Mdg3yi%T+`+VIPLAQ7w^+f6(TY5A) zw>7NUcA#DnTLz*I6ul~U+m$&z-)!3|s)>Yimc|HGH6-y{u+FHV>C>fO+L~rTn$iEQ zf?aIB;prYxpMrhSI2sN}8d6JZRqcPoJdLce(TNQ^go-Ze!J1a|=%ZIvclcGsh^k`j zdR4;@zp6M$VsWxPb2_EXd31*L- z86^6d;k+0p&!XwwMS1>7MUL}0(PYmkMimEMPU<9)0i*QDt&)0RwJ1+QF65-%MTQ=| z21&h3ki)DUYQ7A=Qty4_NQz3*PQ_M(w}ad{MvfD~Qnud6J!0fuHgY|2iAlW^ja-3| zD>HIqqIA71Be%xL{lv({JNYgP6z{<8eTr z_GJSn0y*hQpF~YS^l-r|BR}jBEKdQx2}}q63zz{UpUesT4mcIaqlF{ovjI`3uRm}O za3F9lki#H(U>sTJ0lx-b0L(-$oDaMXSPa|>Tm&SY#|5PS=u+UPKsS(g#4;dnvWtPd zZ8(NbaW#(}%_Fi7lbUiZ%hF;HlF_dRKj3c47o%=9Ow$?WOVVqN~ZPdd!Ra)Ed zhjB)(uvk$VikxP(yiHvICoVLg;RjWzu5fq$mG z*cmf@miPP7TD*Cf5&9=Vm*w{OhcZ`rNo}#Wy4X|Y6`WbF-iCixZ5qRTA>&rO)>E&4 zXinbfWb{X~U}Dg6YS8k8pylyF%j1HUQ-YSq1}%>XS{^M%z8LI<9sesZ?xHJxj_j5A z*AsV^Lme-r)k=ux0YS0F4c3S)bzyUxEOWN^33_HA0`^td0{rW0_1A!b?2LUez z;#m7G1)dCS1lobu0*3(EdrtxK0H1?@IaDwg%b`ukY}$3mv7g0i)Mw6S^tf2(5gdBTttTtHXY#N=`ohxLcRnDdrAt(2DuFBaob~&pU zb-aoXc?A0}W~-8&)lmv%tLl#;L*843E`)=o{rutN(!hE`*{Y#_)1Hs;ZV4>KB_4Yw z$yUV$J$4+H7UIxH2`MGxkt+(2On@ZEkYIsViAs_W>F0g%EOwr)I#SibQh}UOT*jz} zS1eQIGm(YVXfNRbLL`=wT9+#cugJifdtpuIS+74;^{`Z6JsfnRBKdg4H2mf(ex|oA zC4s+xREsQydi)10$ZuNyoSWZ0SUvkxJ-n~UJ>?asCn+J7T_(HINe_|Gm84(C%#7o_ zrByt<=MzWf=w>-@k{O5 zH-F`l*UrY@#Qy>UQ!-yWeISpDBpVN-yGU_@^IiIN^d(AQf+tk#ahe_5!hFOB! zH5i=%5;pcrC5Z~~PseMmbA00$aU=ry#`5Jz$UG(EikFpC)Vr}nXHwcB#4uE<`Hrky z=Tv7#W~M_t>rNgwd1(5S$wM>pCXdUTm6J1hXj+;>D|Xectnn5jMvtp}soqMCBO`12 z)M@!SStx2guH)w+dyLUhZ}+ zb=K8rj$)Grg-Xwnf>nh@>BT~GrnkhkbaqK?og-CM&^=!4ip`IMqf*CDknCi;NF8~! zn~;j{&LWY`94pw&2k^M0kL6Zu=I7P5gDxhM1)F&;?w5V!0H$kcR&3^TQJ1?vLKoxF zjfo?n70dQ6=zRm7P3mUFdyEyEnIpzul@78ZS+SIPo$c&|-ZJQY9HQrNn8$oJ!h5j` z$IYD3t|d!(G4z%yT^`EzSjzR#SsAQn!76T0I(pmP$|~N1JzH^v) z6^n7hMW0BBm~!L&-wf-Qba__wn61}&Uiw7S_>z(kv2esYzgys0`Ptv&F8}VWmm2@9 zX&(vsdz;_SJo}pBA3eKe?XBN__whn}guw$&Ld1DjUwCWUg;)Jxq9oqG_xV|$Xj}I@9S1x>D)pd>Xq(~LLTast{2|d6Cy&r(p@0r(+A&t)oEjT&3JW-=f{7#Gal#t z*FqlZm2S6?hkB(Oji=Z4ywXMSo%)c!h=m!%^1aYiwzxakgJG|9rRY&zcfwZzLq2bJ zIP>$CdaAp=Il`aok?9|vI#<`X&*fcN<31wW7mkv+Y<_9A>rgyXnx{nr9!n4Qyc%W` zhaJ>)u@8hD)cr3ys2i*Eg#B#d6qC<7#U@VC>As5Dy9>{Pf=n?0yojwJw_n{mS9hGEq-rm&yw6pA8N`m z8V{6-%{L5-C*xl_M&mq>bc}}ie&kZ|%V}Ea7)|QsV_E7IA$JV^Wyn9NN4HpZ$gCZn z@!K>vfZvLluEXQKnX&OF$j%FLc*ZhhY%u=O!)#6@v%|B1dyb%Qu#Ii_AC7;$Eo6O% z;PPw;zS36JSArCAXtDDIyW%c1rYCMc*%jP$&MYwv!nSaq?7+#u!N7&Up};aA&Wf)F zcsg)7@C+b1GiL%H0*(Sc55yFk?+xG>;6H$v81sDqoB-6&CeEL45O5;!WFW2!-)TT_ z4tzYG=K*{tDIU6W<2Biu|$jEp3RqU{yBXB5<#LkQtUX^gru!Ph2 zgP>DzdZ?omN~d7w>oHFW^Jqpza_Xq3Qj*TU&Tt$*EwB`q zsLdql6rs+)IJLyI>E(a?TA!|$lE7bHDokus&VXf!W&Usq-&`}#zn@_7_@!m|nj*^> zMNFC5D$i1Z_27dC>fvM+)4%?DE3TdP>scq&a1n`mO!S2qNc>K_rd(5Z+rjF2RMo>$ zvbBFIiN2?Pr(Ha6ohKsfSM`WeBA>w1Es|aAyPt?)gVd_#n^#@CKov0o2Not#O60}| z)@+(!;~DSVB)SuIm?zN#2YEF~-HGXJ%W3dj$Mk8=+?<^BJO@UwgU*9v`a36U`jqKY z)4F9IJYYBU*>Gb*n^WK2>56Mq>V(vBaxz-{b~JaLI&u71sm{4;o0z*^imUHnbJv@U zlP%6Y`ay!un=l5FhcO@hL6Dxq!V_0K`ut7DY1(~i{*_(IYVNujdI_K&zCTd5$!^u& z+;yS(4k7fC9p(XpHPqsNL5QC9ob*c}de(E&uR-q(rORD!Z%%qAbUp~yGhH&=zSa2u zMCovuiN_D;s(U*`?O#vU9;ooLTra;Iabcb5Xg9-|SCpNZjcwDLj`1sHr;XE_9-^w~?O$7fZ7NEe zlH=5M=n;&^#OBwTRg{^kuhtJ)ta){MQFg8qtY%p<&c7->D?dBk2`d1(rjLKkOy`VQ z&OEGR=sC96*SxL>1_e?aA0W=p#Cx)gZWpPd+vVjK7_vS}mg~$FZN8j<=YXIncxi=G zh5q?i=jciZJchg*gbk+)v68x~(Zv;>I&U%dBPNmjRCjId4?HqnlGOpimx7o?2JOqt z&f&?ANsPgQ3LA*Xej;q3@NBjV4{>}jN{E>A*nn@EFaKi5&-xyhJNc2c?ZVOx@*iL0 z**0YA>6O3T|K8OLKHq{b8@CDl+4(2jy<^q2Z;tA{Xi|FXyjk+2QbI(`jH}nW`c1w* zP@yYTdm1`;CDUT}Z)#_Km+H_PBFTq)$Ce1-RfJe0363fr0x5z1G%O2|X` z3bejUh*kx`k&o@+f3+|2>CP1 z9uM+(c9)RnjUAOT=%uK*8~&Q_>9My3562OBUQ3Ah_M_${TcUS2FS~KUg7}km;`n3< zc^}6|pS*M11HEs$@|9ah&zt+9rrj#!OUttgV7qY7)nohbeel73dtvb`fN5q+Iy;Yy3Y9Kx9J}te7BI#dHANMZ??UB!QwmT z?>aZ4@5`F@osiEywc(-u|9tS9@?IAW=)b!TTxvQJx8f_@B;=udg?&OE%2z1Bi?tPB z;cg)h&d$V2%Gw+MMCU*RJm59KQ)<25=VB9yOCFXUVQc;K>=mS492 zr@|*t3!ilaaBph5n;X5bc-vwkb9G>zRp`+c|^82>_IK;LG6FWgIcQ2X7F7qqw_HpO0LQISi?3r4STF9 z_pzoK-!#rb*t;MJ_yj?c9Sv)CYxR+BlfX1+T+a52GOH2DZ;ea(pVG$=VQj|9ax56Gkv!c z)IM%^?&FTPo!&YdbPy$6!iow|>kRmOD+C`z_q3M8cz8Gpn+x<~&_f*q&_Lj(W8Kp{ z^@qXY_z>Gb9zwMCDSqwvPtx8*Rrtz*+&__{Q zB+~16{W0@7&cM3KL3|FD;e;+7+5CtNixj};2>6sJ2pw!>8x-f_KakLo==ZmgGbN|k zSy%|yLe}1bP}c7)Xdljl`iz5}mQm}Xu#aNumVy>23_+1P&nmaj*bKpm{2qkQKtjMk zcC3P2RBV+$4&Dl}`Z27gyLr4<)#0nr#KiZZ%XBp=;qor*6jMJe3&$LSJ5sKsT*G5U z$3JHvKVQjl>;!jY7?9kN;Xo(wbYKpU9FYrwX8~(~nEw_YILH~f63fZJtAJyHcLLLa zn}Hd?-vOrrw*s?(PXVU^p8-w>J`c%P#1Z!W2v`ri6No8!-`&8KKpvY_ zz=wbr1GfU#0RISF3w#FX!{58WOM&}<4M6t2%Yf`k?Q>s#fwc+vkJWBbIh!^GB_$sw zQ{`+Lw_3_(8?p*RR%6IayqPY41_ciyLiQV+E(c`{r$*`$F=kZ@UR z?8Z?*dG01sEE4$}Of$r<{E-q|Tq;S9ho6|z6Y|cx`KVO2uv8#VhT9SqS*zB+bWOi1 zYP6SbR4Z5t_4qeOFlYQcnfvU|VoYkko>x>o`244|B6w0nva@Eo)hNoHM*(k6R%{k) zhaCy39#KlvN5Y&;M$O7$2kv&3HCyv!bXJTgB`VAftl2c_&%V|9t}Q;Obw(y6#7j+A=otS=#9N-!^m z_ec9^siXf|`F`Nt@2pPfaWFi)6M7s@oFRJFe4K|u^sMZ8c-*@VYqot1KEL>`?i^8@4Q90nWb@cem@eq*NO^watzE=kmHVC2nI)*K2Kht!%O zC|+MtUA1`Z7<`h7NqiG+)UB+nbbD((uHvQcl`u$(N&FDfTF;WI(h_%t5K{G#0M+!O zLZgD20Tr;BNNi?dUCBYpCPHf=YAmR&T3lS`E%CbXk}nI^s)8qAnfojDw8UGE=kPjL zt*6FYU5nk0N&Fj%uPmvptzKSSgIe%0AtsUUZ*G^XxTc!EX7xt6S~YU8N(Z2VI8=%! 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 diff --git a/src/libtommath/Debug/libtommath.lib b/src/libtommath/Debug/libtommath.lib deleted file mode 100644 index 330a2284fa1e778d44d4c0d92bcd7f2180525b02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 680604 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 Date: Thu, 31 Jul 2014 11:25:05 -0600 Subject: [PATCH 62/80] Fixed invalid note type trace to use correct escape sequence. --- src/CombinedLifeMeterTug.cpp | 2 +- src/NoteTypes.h | 2 +- src/Player.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/CombinedLifeMeterTug.cpp b/src/CombinedLifeMeterTug.cpp index 7d1eefc502..c1d8cfdbfb 100644 --- a/src/CombinedLifeMeterTug.cpp +++ b/src/CombinedLifeMeterTug.cpp @@ -14,7 +14,7 @@ static void TugMeterPercentChangeInit( size_t /*ScoreEvent*/ i, RString &sNameOu switch( i ) { default: - FAIL_M(ssprintf("Invalid ScoreEvent: %i", i)); + FAIL_M(ssprintf("Invalid ScoreEvent: %i", static_cast(i))); case SE_W1: defaultValueOut = +0.010f; break; case SE_W2: defaultValueOut = +0.008f; break; case SE_W3: defaultValueOut = +0.004f; break; diff --git a/src/NoteTypes.h b/src/NoteTypes.h index 2d22b57d73..4cabac1e9c 100644 --- a/src/NoteTypes.h +++ b/src/NoteTypes.h @@ -180,7 +180,7 @@ struct TapNote { if (type_ > TapNoteType_Fake ) { - LOG->Trace("Invalid tap note type %d (most likely) due to random vanish issues. Assume it doesn't need judging.", TapNoteTypeToString(type_).c_str() ); + LOG->Trace("Invalid tap note type %s (most likely) due to random vanish issues. Assume it doesn't need judging.", TapNoteTypeToString(type_).c_str() ); type = TapNoteType_Empty; } } diff --git a/src/Player.cpp b/src/Player.cpp index 0865791d96..fe57053f31 100644 --- a/src/Player.cpp +++ b/src/Player.cpp @@ -108,7 +108,7 @@ void TimingWindowSecondsInit( size_t /*TimingWindow*/ i, RString &sNameOut, floa switch( i ) { default: - FAIL_M(ssprintf("Invalid timing window: %i", i)); + FAIL_M(ssprintf("Invalid timing window: %i", static_cast(i))); case TW_W1: defaultValueOut = 0.0225f; break; case TW_W2: defaultValueOut = 0.045f; break; case TW_W3: defaultValueOut = 0.090f; break; From 392ac045ebfb8de24652651c791f9e193c833b23 Mon Sep 17 00:00:00 2001 From: Kyzentun Date: Thu, 31 Jul 2014 14:57:00 -0600 Subject: [PATCH 63/80] Added MusicWheel:GetSelectedSection. --- Docs/Luadoc/Lua.xml | 1 + Docs/Luadoc/LuaDocumentation.xml | 3 +++ src/MusicWheel.cpp | 2 ++ 3 files changed, 6 insertions(+) diff --git a/Docs/Luadoc/Lua.xml b/Docs/Luadoc/Lua.xml index efe59ad1da..f6526dcfed 100644 --- a/Docs/Luadoc/Lua.xml +++ b/Docs/Luadoc/Lua.xml @@ -948,6 +948,7 @@ + diff --git a/Docs/Luadoc/LuaDocumentation.xml b/Docs/Luadoc/LuaDocumentation.xml index 0a2e59414f..69bd04a75e 100644 --- a/Docs/Luadoc/LuaDocumentation.xml +++ b/Docs/Luadoc/LuaDocumentation.xml @@ -2837,6 +2837,9 @@ save yourself some time, copy this for undocumented things: Changes the sort order of the wheel. Returns true if the order was changed. + + Returns the name of the currently selected section. + Returns true if the MusicWheel is currently handling Roulette selection. diff --git a/src/MusicWheel.cpp b/src/MusicWheel.cpp index f635cb45a5..ac9f6b18fa 100644 --- a/src/MusicWheel.cpp +++ b/src/MusicWheel.cpp @@ -1640,6 +1640,7 @@ public: } return 1; } + DEFINE_METHOD(GetSelectedSection, GetSelectedSection()); static int IsRouletting( T* p, lua_State *L ){ lua_pushboolean( L, p->IsRouletting() ); return 1; } static int SelectSong( T* p, lua_State *L ) { @@ -1666,6 +1667,7 @@ public: LunaMusicWheel() { ADD_METHOD( ChangeSort ); + ADD_METHOD( GetSelectedSection ); ADD_METHOD( IsRouletting ); ADD_METHOD( SelectSong ); ADD_METHOD( SelectCourse ); From dd9576397bc8ed9463a4b7d49d03337db0b51d16 Mon Sep 17 00:00:00 2001 From: freem Date: Fri, 1 Aug 2014 05:05:28 -0500 Subject: [PATCH 64/80] add libglew-dev to list of packages to get will hopefully shut up "configure: error: "No usable version of GLEW found."" msg --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 6fa600358f..6f95beeada 100644 --- a/.travis.yml +++ b/.travis.yml @@ -25,4 +25,5 @@ before_script: - sudo apt-get install libxtst-dev libxrandr-dev - sudo apt-get install libglu1-mesa-dev - sudo apt-get install mesa-common-dev + - sudo apt-get install libglew-dev - ./autogen.sh From d32aa39925821a58c39e798a8d486d9a11690c1e Mon Sep 17 00:00:00 2001 From: freem Date: Fri, 1 Aug 2014 05:05:42 -0500 Subject: [PATCH 65/80] add compile status from travis-ci; thanks @shakesoda --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 512b767da0..9b8fc26214 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,8 @@ StepMania Advanced cross-platform rhythm game for home and arcade use. +[![Build Status](https://travis-ci.org/stepmania/stepmania.svg?branch=master)](https://travis-ci.org/stepmania/stepmania) + Source is all MIT Licensed, songs are CC-NC, builds with MAD or GPL-licensed FFMPEG codecs are GPL. * Website: http://www.stepmania.com/ From 206d4169320355825615b55f2f93b2bcbd586b4f Mon Sep 17 00:00:00 2001 From: freem Date: Fri, 1 Aug 2014 05:36:20 -0500 Subject: [PATCH 66/80] we don't have a "make test", so travis reports the build as "failed" (also throw in an IRC notification) --- .travis.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.travis.yml b/.travis.yml index 6f95beeada..da0a4f3408 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,6 +6,7 @@ compiler: notifications: email: false + irc: "chat.freenode.net#stepmania-devs" before_script: - sudo apt-get install nasm @@ -26,4 +27,7 @@ before_script: - sudo apt-get install libglu1-mesa-dev - sudo apt-get install mesa-common-dev - sudo apt-get install libglew-dev + +script: - ./autogen.sh + - ./configure && make From f0d6bce62a334da55e0d6727e0ec1de436c3cd34 Mon Sep 17 00:00:00 2001 From: Kyzentun Date: Fri, 1 Aug 2014 11:16:17 -0600 Subject: [PATCH 67/80] Disabled AddATIToList on Windows because it makes mapconv crash. --- src/NoteData.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/NoteData.cpp b/src/NoteData.cpp index bd8de09ef2..ece1d84872 100644 --- a/src/NoteData.cpp +++ b/src/NoteData.cpp @@ -1178,12 +1178,19 @@ void NoteData::LoadFromNode( const XNode* pNode ) void NoteData::AddATIToList(all_tracks_iterator* iter) const { + // mapconv crashes on windows an apparently this function is the cause. + // So windows will still crash on courses that use transform mods until + // mapconv can be fixed. -Kyz +#ifndef WIN32 m_atis.insert(iter); +#endif } void NoteData::AddATIToList(all_tracks_const_iterator* iter) const { +#ifndef WIN32 m_const_atis.insert(iter); +#endif } void NoteData::RemoveATIFromList(all_tracks_iterator* iter) const From 6487261f32ed071e16f0c06b8576e806012b52f9 Mon Sep 17 00:00:00 2001 From: sigatrev Date: Fri, 1 Aug 2014 23:45:21 -0500 Subject: [PATCH 68/80] maintain music rate speed adjust after music has finished Keeps things like BGA effect clocks consistent when music stops. --- src/GameSoundManager.cpp | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/src/GameSoundManager.cpp b/src/GameSoundManager.cpp index 576eaddca4..9b90b5cf4d 100644 --- a/src/GameSoundManager.cpp +++ b/src/GameSoundManager.cpp @@ -555,7 +555,7 @@ void GameSoundManager::Update( float fDeltaTime ) { /* There's no song playing. Fake it. */ CHECKPOINT_M( ssprintf("%f, delta %f", GAMESTATE->m_Position.m_fMusicSeconds, fDeltaTime) ); - GAMESTATE->UpdateSongPosition( GAMESTATE->m_Position.m_fMusicSeconds + fDeltaTime, g_Playing->m_Timing ); + GAMESTATE->UpdateSongPosition( GAMESTATE->m_Position.m_fMusicSeconds + fDeltaTime * g_Playing->m_Music->GetPlaybackRate() , g_Playing->m_Timing ); return; } @@ -567,9 +567,7 @@ void GameSoundManager::Update( float fDeltaTime ) RageTimer tm; const float fSeconds = g_Playing->m_Music->GetPositionSeconds( &m_bApproximate, &tm ); - // // Check for song timing skips. - // if( PREFSMAN->m_bLogSkips && !g_Playing->m_bTimingDelayed ) { const float fExpectedTimePassed = (tm - GAMESTATE->m_Position.m_LastBeatUpdate) * g_Playing->m_Music->GetPlaybackRate(); @@ -586,10 +584,8 @@ void GameSoundManager::Update( float fDeltaTime ) sLastFile = ThisFile; } - // // If g_Playing->m_bTimingDelayed, we're waiting for the new music to actually start // playing. - // if( g_Playing->m_bTimingDelayed && !m_bApproximate ) { /* Load up the new timing data. */ @@ -608,10 +604,7 @@ void GameSoundManager::Update( float fDeltaTime ) GAMESTATE->UpdateSongPosition( fSeconds + fAdjust, g_Playing->m_Timing, tm + fAdjust ); } - - // // Send crossed messages - // if( GAMESTATE->m_pCurSong ) { static int iBeatLastCrossed = 0; @@ -633,10 +626,7 @@ void GameSoundManager::Update( float fDeltaTime ) iBeatLastCrossed = iBeatNow; } - - // // Update lights - // NoteData &lights = g_Playing->m_Lights; if( lights.GetNumTracks() > 0 ) // lights data was loaded { From 3478bc7650109f75866f01c4c834d15def90e8a9 Mon Sep 17 00:00:00 2001 From: sigatrev Date: Sat, 2 Aug 2014 18:09:52 -0500 Subject: [PATCH 69/80] added GetStylesForGame method --- Docs/Luadoc/Lua.xml | 1 + Docs/Luadoc/LuaDocumentation.xml | 3 +++ src/GameManager.cpp | 21 ++++++++++++++++++++- 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/Docs/Luadoc/Lua.xml b/Docs/Luadoc/Lua.xml index f6526dcfed..a06025a9f1 100644 --- a/Docs/Luadoc/Lua.xml +++ b/Docs/Luadoc/Lua.xml @@ -726,6 +726,7 @@ + diff --git a/Docs/Luadoc/LuaDocumentation.xml b/Docs/Luadoc/LuaDocumentation.xml index 69bd04a75e..0f9b57048b 100644 --- a/Docs/Luadoc/LuaDocumentation.xml +++ b/Docs/Luadoc/LuaDocumentation.xml @@ -2189,6 +2189,9 @@ save yourself some time, copy this for undocumented things: Returns a table of all selectable games. + + Returns a table of all the styles for the that exist for game. + Sets the current game to Game. The second argument is optional, and if provided will determine which theme is loaded when the game changes. If the second argument is not provided, the default theme from the preferences for the new game type will be loaded.
If only the game changes, the screen specified by the Common::AfterGameChangeScreen metric will be loaded.
diff --git a/src/GameManager.cpp b/src/GameManager.cpp index 9006119391..65a65e9da4 100644 --- a/src/GameManager.cpp +++ b/src/GameManager.cpp @@ -3160,10 +3160,28 @@ public: return 1; } + static int GetStylesForGame( T* p, lua_State *L ) + { + RString game_name= SArg(1); + const Game *pGame = p->StringToGame(game_name); + if(!pGame) + { + luaL_error(L, "GetStylesForGame: Invalid Game: '%s'", game_name.c_str()); + } + vector aStyles; + for( int s=0; pGame->m_apStyles[s]; ++s ) + { + Style *pStyle = const_cast