From a01a7c4240f26c1a0d37a8c0c82afc26c92d0f18 Mon Sep 17 00:00:00 2001 From: AJ Kelly Date: Sat, 15 May 2010 14:19:42 -0500 Subject: [PATCH] AnnouncerManager gets Lua bindings, and now exists at ANNOUNCER. New bindings: ANNOUNCER:DoesAnnouncerExist(sAnnouncer) - returns a bool ANNOUNCER:GetAnnouncerNames() - returns a table of strings ANNOUNCER:GetCurrentAnnouncer() - returns a string ANNOUNCER:SetCurrentAnnouncer(sAnnouncer) - sets the new announcer --- src/AnnouncerManager.cpp | 62 +++++++++++++++++++++++++++++++++++++++- src/AnnouncerManager.h | 8 ++++++ 2 files changed, 69 insertions(+), 1 deletion(-) diff --git a/src/AnnouncerManager.cpp b/src/AnnouncerManager.cpp index 3d5e3197a7..8e7d045d29 100644 --- a/src/AnnouncerManager.cpp +++ b/src/AnnouncerManager.cpp @@ -10,10 +10,28 @@ AnnouncerManager* ANNOUNCER = NULL; // global object accessable from anywhere in const RString EMPTY_ANNOUNCER_NAME = "Empty"; const RString ANNOUNCERS_DIR = "Announcers/"; +AnnouncerManager::AnnouncerManager() +{ + // Register with Lua. + { + Lua *L = LUA->Get(); + lua_pushstring( L, "ANNOUNCER" ); + this->PushSelf( L ); + lua_settable( L, LUA_GLOBALSINDEX ); + LUA->Release( L ); + } +} + +AnnouncerManager::~AnnouncerManager() +{ + // Unregister with Lua. + LUA->UnsetGlobal( "ANNOUNCER" ); +} + void AnnouncerManager::GetAnnouncerNames( vector& AddTo ) { GetDirListing( ANNOUNCERS_DIR+"*", AddTo, true ); - + StripCvsAndSvn( AddTo ); // strip out the empty announcer folder @@ -144,6 +162,48 @@ void AnnouncerManager::NextAnnouncer() } } } +// lua start +#include "LuaBinding.h" + +class LunaAnnouncerManager: public Luna +{ +public: + static int DoesAnnouncerExist( T* p, lua_State *L ) { lua_pushboolean(L, p->DoesAnnouncerExist( SArg(1) )); return 1; } + static int GetAnnouncerNames( T* p, lua_State *L ) + { + vector vAnnouncers; + p->GetAnnouncerNames( vAnnouncers ); + LuaHelpers::CreateTableFromArray(vAnnouncers, L); + return 1; + } + static int GetCurrentAnnouncer( T* p, lua_State *L ) + { + RString s = p->GetCurAnnouncerName(); + if( s.empty() ) + return 0; + lua_pushstring(L, s ); + return 1; + } + static int SetCurrentAnnouncer( T* p, lua_State *L ) + { + RString s = SArg(1); + // only bother switching if the announcer exists. -aj + if(p->DoesAnnouncerExist(s)) + p->SwitchAnnouncer(s); + return 0; + } + + LunaAnnouncerManager() + { + ADD_METHOD( DoesAnnouncerExist ); + ADD_METHOD( GetAnnouncerNames ); + ADD_METHOD( GetCurrentAnnouncer ); + ADD_METHOD( SetCurrentAnnouncer ); + } +}; + +LUA_REGISTER_CLASS( AnnouncerManager ) +// lua end /* * (c) 2001-2004 Chris Danford diff --git a/src/AnnouncerManager.h b/src/AnnouncerManager.h index 2a1c86d242..eaa80b30cf 100644 --- a/src/AnnouncerManager.h +++ b/src/AnnouncerManager.h @@ -1,9 +1,14 @@ #ifndef ANNOUNCER_MANAGER_H #define ANNOUNCER_MANAGER_H +#include "RageTypes.h" + class AnnouncerManager { public: + AnnouncerManager(); + ~AnnouncerManager(); + void GetAnnouncerNames( vector& AddTo ); bool DoesAnnouncerExist( RString sAnnouncerName ); void SwitchAnnouncer( RString sNewAnnouncerName ); @@ -13,6 +18,9 @@ public: RString GetPathTo( RString sFolderName ); bool HasSoundsFor( RString sFolderName ); + // Lua + void PushSelf( lua_State *L ); + protected: static RString GetAnnouncerDirFromName( RString sAnnouncerName ); RString GetPathTo( RString AnnouncerPath, RString sFolderName );