Page Menu
Home
Phabricator (Chris)
Search
Configure Global Search
Log In
Files
F131756
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Authored By
Unknown
Size
36 KB
Referenced Files
None
Subscribers
None
View Options
diff --git a/src/DrawRle.h b/src/DrawRle.h
new file mode 100644
index 0000000..c0224bb
--- /dev/null
+++ b/src/DrawRle.h
@@ -0,0 +1,345 @@
+// At this point the following methods should be defined:
+
+// METHODNAME: The name of the drawing method
+// METHODNAME_FLIPT: The name of the flipped drawing method
+// PIXEL_PTR: type of pointer to the target surface pixels
+// PUT_PIXEL(p,c): Draw pixel of color c to pixel ptr type p
+// PITCH: This added to PIXEL_PTR type will result in the next scanline
+
+
+void METHODNAME_FLIP( RLE_SPRITE* src, int dx, int dy )
+{
+#define RLE_PTR signed char*
+#define RLE_IS_EOL(c) ((c) == 0)
+//#define PIXEL_PTR unsigned char*
+#define OFFSET_PIXEL_PTR(p,x) ((PIXEL_PTR) (p) + (x))
+#define INC_PIXEL_PTR(p) ((p)++)
+#define DEC_PIXEL_PTR(p) ((p)--)
+//#define PUT_PIXEL(p,c) (*((unsigned char *)(p)) = (c))
+
+ int x, y, w, h; // width and height of visible area
+ int dxbeg, dybeg; // beginning in destination
+ int sxbeg, sybeg; // beginning in source
+ RLE_PTR s;
+
+ SDL_Surface* dst = gamescreen;
+ // Clip to dst->clip_rect
+ int dst_cl = dst->clip_rect.x;
+ int dst_cr = dst->clip_rect.w + dst_cl - 1;
+ int dst_ct = dst->clip_rect.y;
+ int dst_cb = dst->clip_rect.h + dst_ct;
+
+// if (dst->clip)
+ if (1)
+ {
+ int tmp;
+
+ dxbeg = dx;
+ if ( dst_cl > dx ) dxbeg = dst_cl;
+
+ tmp = dx + src->w - dst_cr;
+ sxbeg = ((tmp < 0) ? 0 : tmp);
+
+ tmp = dx + src->w;
+ if (tmp > dst_cr ) tmp = dst_cr;
+ w = tmp - dxbeg;
+ if (w <= 0)
+ return;
+
+ tmp = dst_ct - dy;
+ sybeg = ((tmp < 0) ? 0 : tmp);
+ dybeg = sybeg + dy;
+
+ tmp = dst_cb - dy;
+ h = ((tmp > src->h) ? src->h : tmp) - sybeg;
+ if (h <= 0)
+ return;
+ }
+ else {
+ w = src->w;
+ h = src->h;
+ sxbeg = 0;
+ sybeg = 0;
+ dxbeg = dx;
+ dybeg = dy;
+ }
+
+ s = (RLE_PTR) (src->dat);
+ dxbeg += w;
+
+ // Clip top.
+ for (y = sybeg - 1; y >= 0; y--)
+ {
+ long c = *s++;
+
+ while (!RLE_IS_EOL(c))
+ {
+ if (c > 0)
+ s += c;
+ c = *s++;
+ }
+ }
+
+ //@@@ bmp_select(dst);
+
+ /* Visible part. */
+ for (y = 0; y < h; y++)
+ {
+ //@@@ PIXEL_PTR d = OFFSET_PIXEL_PTR(bmp_write_line(dst, dybeg + y), dxbeg);
+ PIXEL_PTR d = (PIXEL_PTR) dst->pixels;
+ d += (dybeg+y)*PITCH;
+ d = OFFSET_PIXEL_PTR( d, dxbeg );
+ long c = *s++;
+
+ // Clip left.
+ for (x = sxbeg; x > 0; )
+ {
+ if (RLE_IS_EOL(c))
+ goto next_line;
+ else if (c > 0)
+ {
+ // Run of solid pixels.
+ if ((x - c) >= 0)
+ {
+ // Fully clipped.
+ x -= c;
+ s += c;
+ }
+ else
+ {
+ // Visible on the right.
+ c -= x;
+ s += x;
+ break;
+ }
+ }
+ else
+ {
+ // Run of transparent pixels.
+ if ((x + c) >= 0) {
+ // Fully clipped.
+ x += c;
+ }
+ else {
+ // Visible on the right.
+ c += x;
+ break;
+ }
+ }
+
+ c = *s++;
+ }
+
+ /* Visible part. */
+ for (x = w; x > 0; )
+ {
+ if (RLE_IS_EOL(c))
+ goto next_line;
+ else if (c > 0)
+ {
+ /* Run of solid pixels. */
+ if ((x - c) >= 0)
+ {
+ /* Fully visible. */
+ x -= c;
+ for (c--; c >= 0; s++, DEC_PIXEL_PTR(d), c--)
+ {
+ unsigned long col = *s;
+ PUT_PIXEL(d, col);
+ }
+ }
+ else
+ {
+ /* Clipped on the right. */
+ c -= x;
+ for (x--; x >= 0; s++, DEC_PIXEL_PTR(d), x--)
+ {
+ unsigned long col = *s;
+ PUT_PIXEL(d, col);
+ }
+ break;
+ }
+ }
+ else
+ {
+ /* Run of transparent pixels. */
+ x += c;
+ d = OFFSET_PIXEL_PTR(d, c);
+ }
+
+ c = *s++;
+ }
+
+ /* Clip right. */
+ while (!RLE_IS_EOL(c))
+ {
+ if (c > 0)
+ s += c;
+ c = *s++;
+ }
+
+ next_line: ;
+ }
+
+ //@@@bmp_unwrite_line(dst);
+}
+
+void METHODNAME( RLE_SPRITE* src, int dx, int dy )
+{
+#define RLE_PTR signed char*
+#define RLE_IS_EOL(c) ((c) == 0)
+//#define PIXEL_PTR unsigned char*
+#define OFFSET_PIXEL_PTR(p,x) ((PIXEL_PTR) (p) + (x))
+#define INC_PIXEL_PTR(p) ((p)++)
+#define DEC_PIXEL_PTR(p) ((p)--)
+//#define PUT_PIXEL(p,c) (*((unsigned char *)(p)) = (c))
+//#define PUT_PIXEL(p,c) bmp_write8((unsigned long) (p), (c))
+
+ int x, y, w, h; // width and height of visible area
+ int dxbeg, dybeg; // beginning in destination
+ int sxbeg, sybeg; // beginning in source
+ RLE_PTR s;
+
+ SDL_Surface* dst = gamescreen;
+ // Clip to dst->clip_rect
+ int dst_cl = dst->clip_rect.x;
+ int dst_cr = dst->clip_rect.w + dst_cl;
+ int dst_ct = dst->clip_rect.y;
+ int dst_cb = dst->clip_rect.h + dst_ct;
+
+// if (dst->clip)
+ if (1)
+ {
+ int tmp;
+
+ tmp = dst_cl - dx;
+ sxbeg = ((tmp < 0) ? 0 : tmp);
+ dxbeg = sxbeg + dx;
+
+ tmp = dst_cr - dx;
+ w = ((tmp > src->w) ? src->w : tmp) - sxbeg;
+ if ( w<=0 ) return;
+
+ tmp = dst_ct - dy;
+ sybeg = ((tmp < 0) ? 0 : tmp);
+ dybeg = sybeg + dy;
+
+ tmp = dst_cb - dy;
+ h = ((tmp > src->h) ? src->h : tmp) - sybeg;
+ if ( h<=0 ) return;
+ }
+ else
+ {
+ w = src->w;
+ h = src->h;
+ sxbeg = 0;
+ sybeg = 0;
+ dxbeg = dx;
+ dybeg = dy;
+ }
+
+ s = (RLE_PTR) (src->dat);
+
+ /* Clip top. */
+ for (y = sybeg - 1; y >= 0; y--)
+ {
+ long c = *s++;
+
+ while (!RLE_IS_EOL(c))
+ {
+ if (c > 0)
+ s += c;
+ c = *s++;
+ }
+ }
+
+ //@@@ bmp_select(dst);
+
+ /* Visible part. */
+ for (y = 0; y < h; y++)
+ {
+ //@@@ PIXEL_PTR d = OFFSET_PIXEL_PTR(bmp_write_line(dst, dybeg + y), dxbeg);
+ PIXEL_PTR d = (PIXEL_PTR) dst->pixels;
+ d += (dybeg+y)*PITCH;
+ d = OFFSET_PIXEL_PTR( d, dxbeg );
+ long c = *s++;
+
+ /* Clip left. */
+ for (x = sxbeg; x > 0; ) {
+ if (RLE_IS_EOL(c))
+ goto next_line;
+ else if (c > 0) {
+ /* Run of solid pixels. */
+ if ((x - c) >= 0) {
+ /* Fully clipped. */
+ x -= c;
+ s += c;
+ }
+ else {
+ /* Visible on the right. */
+ c -= x;
+ s += x;
+ break;
+ }
+ }
+ else {
+ /* Run of transparent pixels. */
+ if ((x + c) >= 0) {
+ /* Fully clipped. */
+ x += c;
+ }
+ else {
+ /* Visible on the right. */
+ c += x;
+ break;
+ }
+ }
+
+ c = *s++;
+ }
+
+ /* Visible part. */
+ for (x = w; x > 0; ) {
+ if (RLE_IS_EOL(c))
+ goto next_line;
+ else if (c > 0) {
+ /* Run of solid pixels. */
+ if ((x - c) >= 0) {
+ /* Fully visible. */
+ x -= c;
+ for (c--; c >= 0; s++, INC_PIXEL_PTR(d), c--) {
+ unsigned long col = (unsigned char) (*s);
+ PUT_PIXEL(d, col);
+ }
+ }
+ else {
+ /* Clipped on the right. */
+ c -= x;
+ for (x--; x >= 0; s++, INC_PIXEL_PTR(d), x--) {
+ unsigned long col = *s;
+ PUT_PIXEL(d, col);
+ }
+ break;
+ }
+ }
+ else {
+ /* Run of transparent pixels. */
+ x += c;
+ d = OFFSET_PIXEL_PTR(d, -c);
+ }
+
+ c = *s++;
+ }
+
+ /* Clip right. */
+ while (!RLE_IS_EOL(c)) {
+ if (c > 0)
+ s += c;
+ c = *s++;
+ }
+
+next_line: ;
+ }
+
+ //@@@bmp_unwrite_line(dst);
+}
diff --git a/src/PlayerSelectController.cpp b/src/PlayerSelectController.cpp
new file mode 100644
index 0000000..ba3046d
--- /dev/null
+++ b/src/PlayerSelectController.cpp
@@ -0,0 +1,485 @@
+#include "PlayerSelectController.h"
+#include "PlayerSelectView.h"
+#include "PlayerSelect.h"
+#include "Chooser.h"
+#include "MortalNetwork.h"
+#include "State.h"
+#include "Backend.h"
+#include "Event.h"
+#include "Audio.h"
+
+#include "TextArea.h"
+#include "sge_tt_text.h"
+#include "common.h"
+
+
+
+int GetBackgroundNumber();
+
+
+
+CPlayerSelectController::CPlayerSelectController( bool a_bNetworkGame )
+{
+ m_bNetworkGame = a_bNetworkGame;
+ m_bTeamMode = SState::Team_CUSTOM == g_oState.m_enTeamMode;
+ m_poView = new CPlayerSelectView( a_bNetworkGame, m_bTeamMode );
+}
+
+
+CPlayerSelectController::~CPlayerSelectController()
+{
+ delete m_poView;
+ m_poView = NULL;
+}
+
+
+
+void CPlayerSelectController::GetThisTick()
+{
+ m_iLastTick = m_iThisTick;
+
+ while (1)
+ {
+ m_iThisTick = SDL_GetTicks() / m_iGameSpeed;
+ if ( m_iThisTick==m_iLastTick )
+ {
+ SDL_Delay(1);
+ }
+ else
+ {
+ break;
+ }
+ }
+}
+
+
+
+bool CPlayerSelectController::HandleChatKey( SDL_Event& a_roEvent )
+{
+ if ( !m_bNetworkGame )
+ {
+ return false;
+ }
+
+ SDLKey enKey = a_roEvent.key.keysym.sym;
+
+ if ( enKey == SDLK_PAGEUP || enKey == SDLK_KP9 )
+ {
+ m_poView->GetTextArea()->ScrollUp();
+ return true;
+ }
+ if ( enKey == SDLK_PAGEDOWN || enKey == SDLK_KP3 )
+ {
+ m_poView->GetTextArea()->ScrollDown();
+ return true;
+ }
+
+ if ( !m_bChatActive && (SDLK_ESCAPE == enKey || SDLK_TAB == enKey
+ || SDLK_RETURN == enKey || SDLK_KP_ENTER == enKey ) )
+ {
+ // Activate chat.
+ m_acChatMsg[0] = 0;
+ m_poView->GetReadline()->Clear();
+ m_poView->GetReadline()->Restart( m_acChatMsg, strlen(m_acChatMsg), 256, C_LIGHTCYAN, C_BLACK, 255 );
+ m_bChatActive = true;
+ return true;
+ }
+
+ if ( !m_bChatActive )
+ {
+ return false;
+ }
+
+ if ( SDLK_ESCAPE == enKey || SDLK_TAB == enKey )
+ {
+ // Deactivate chat.
+ m_poView->GetReadline()->Clear();
+ m_bChatActive = false;
+ return true;
+ }
+
+ // other keys..
+
+ m_poView->GetReadline()->HandleKeyEvent( a_roEvent );
+ int iResult = m_poView->GetReadline()->GetResult();
+
+ if ( iResult < 0 )
+ {
+ // Escape was pressed?
+ m_poView->GetReadline()->Clear();
+ m_bChatActive = false;
+ }
+ if ( iResult > 0 )
+ {
+ if ( strlen( m_acChatMsg ) )
+ {
+ g_poNetwork->SendMsg( m_acChatMsg );
+ std::string sMsg = std::string("<") + g_oState.m_acNick + "> " + m_acChatMsg;
+ m_poView->GetTextArea()->AddString( sMsg.c_str(), C_LIGHTCYAN );
+ m_poView->GetTextArea()->Redraw();
+ m_poView->GetTextArea()->Clear();
+ m_acChatMsg[0] = 0;
+ m_poView->GetReadline()->Restart( m_acChatMsg, strlen(m_acChatMsg), 256, C_LIGHTCYAN, C_BLACK, 255 );
+ }
+ else
+ {
+ m_poView->GetReadline()->Clear();
+ m_bChatActive = false;
+ }
+ }
+
+ return true;
+}
+
+
+
+void CPlayerSelectController::HandleEvents()
+{
+ SDL_Event oSdlEvent;
+ while (SDL_PollEvent(&oSdlEvent))
+ {
+ if ( m_bChatActive
+ && SDL_KEYDOWN == oSdlEvent.type )
+ {
+ HandleChatKey( oSdlEvent );
+ continue;
+ }
+
+ SMortalEvent oEvent;
+ TranslateEvent( &oSdlEvent, &oEvent );
+
+ switch ( oEvent.m_enType )
+ {
+ case Me_QUIT:
+ g_oState.m_bQuitFlag = true;
+ break;
+
+ case Me_MENU:
+ DoMenu();
+ if ( m_bNetworkGame && g_poNetwork->IsMaster() )
+ {
+ g_poNetwork->SendGameParams( g_oState.m_iGameSpeed, g_oState.m_iGameTime, g_oState.m_iHitPoints, GetBackgroundNumber() );
+ }
+ break;
+
+ case Me_PLAYERKEYDOWN:
+ HandleKey( oEvent.m_iPlayer, oEvent.m_iKey );
+ break;
+
+ case Me_NOTHING:
+ case Me_SKIP:
+ case Me_PLAYERKEYUP:
+ break;
+ } // end of switch statement
+ }
+}
+
+
+
+void CPlayerSelectController::HandleKey( int a_iPlayer, int a_iKey )
+{
+ if ( !m_abPlayerActive[a_iPlayer] )
+ {
+ return;
+ }
+
+ int iSetPlayer = a_iPlayer;
+ if ( m_bTeamMode && !g_oState.m_bTeamMultiselect )
+ {
+ iSetPlayer = 0;
+ }
+
+ // MOVE THE CURSOR
+
+ if ( a_iKey < 4 )
+ {
+ g_oChooser.MoveRectangle( a_iPlayer, a_iKey );
+ FighterEnum enNewFighter = g_oChooser.GetCurrentFighter( a_iPlayer );
+ if ( enNewFighter != g_oPlayerSelect.GetPlayerInfo( iSetPlayer ).m_enFighter )
+ {
+ Audio->PlaySample("strange_quack.voc");
+ if ( IsFighterSelectable(enNewFighter) )
+ {
+ if ( m_bNetworkGame )
+ {
+ g_poNetwork->SendFighter( enNewFighter );
+ }
+
+ g_oPlayerSelect.SetPlayer( iSetPlayer, enNewFighter );
+ }
+ }
+ return;
+ }
+
+ // SELECT THE CURRENT FIGHTER
+
+ FighterEnum enFighter = g_oChooser.GetCurrentFighter( a_iPlayer );
+ if ( !IsFighterSelectable( enFighter ) )
+ {
+ // Current fighter cannot be selected.
+ return;
+ }
+
+ Audio->PlaySample("magic.voc");
+ g_oBackend.PerlEvalF( "PlayerSelected(%d);", iSetPlayer );
+ if ( m_bNetworkGame )
+ {
+ g_poNetwork->SendFighter( enFighter );
+ g_poNetwork->SendReady();
+ }
+
+ bool bKeepPlayerActive = false;
+
+ PlayerInfo& roInfo = g_oPlayerSelect.EditPlayerInfo(a_iPlayer);
+ const PlayerInfo& roOtherInfo = g_oPlayerSelect.GetPlayerInfo(1-a_iPlayer);
+ int iTeamSize = roInfo.m_aenTeam.size() + 1;
+ int iOtherTeamSize = roOtherInfo.m_aenTeam.size();
+
+ if ( m_bTeamMode )
+ {
+ m_poView->AddFighterToTeam( a_iPlayer, enFighter );
+ roInfo.m_aenTeam.push_back( enFighter );
+
+ if ( g_oState.m_bTeamMultiselect )
+ {
+ SetPlayerActive( a_iPlayer, iTeamSize < g_oState.m_iTeamSize );
+ }
+ else
+ {
+ --m_iNumberOfSelectableFighters;
+ g_oChooser.MarkFighter( enFighter, a_iPlayer ? C_LIGHTMAGENTA : C_LIGHTGREEN );
+ ActivateNextPlayer( a_iPlayer );
+ }
+ }
+ else
+ {
+ roInfo.m_aenTeam.clear();
+ roInfo.m_aenTeam.push_back( enFighter );
+ SetPlayerActive( a_iPlayer, false );
+ }
+
+}
+
+
+void CPlayerSelectController::HandleNetwork()
+{
+ g_poNetwork->Update();
+
+ // 1. READ CHAT MESSAGES
+
+ bool bUpdateText = false;
+ while ( g_poNetwork->IsMsgAvailable() )
+ {
+ const char* pcMsg = g_poNetwork->GetMsg();
+ int iColor = C_YELLOW;
+ if ( pcMsg[0] == '*' && pcMsg[1] == '*' && pcMsg[2] == '*' ) iColor = C_WHITE;
+ m_poView->GetTextArea()->AddString( pcMsg, iColor );
+ bUpdateText = true;
+ }
+ if ( bUpdateText )
+ {
+ Audio->PlaySample("pop.wav");
+ m_poView->GetTextArea()->Redraw();
+ }
+
+ // 2. READ PLAYER SELECTION ACTIONS
+
+ bool bMaster = g_poNetwork->IsMaster();
+ int iPlayer = bMaster ? 1 : 0;
+
+ if ( !m_abPlayerActive[iPlayer] )
+ {
+ return;
+ }
+
+ FighterEnum enOldFighter = g_oPlayerSelect.GetPlayerInfo(iPlayer).m_enFighter;
+ FighterEnum enRemoteFighter = g_poNetwork->GetRemoteFighter();
+
+ if ( enOldFighter != enRemoteFighter
+ && enRemoteFighter != UNKNOWN )
+ {
+ Audio->PlaySample("strange_quack.voc");
+ g_oPlayerSelect.SetPlayer( iPlayer, enRemoteFighter );
+ g_oChooser.SetRectangle( iPlayer, enRemoteFighter );
+ }
+
+ bool bDone = g_poNetwork->IsRemoteSideReady();
+ if ( bDone )
+ {
+ m_abPlayerActive[iPlayer] = false;
+ Audio->PlaySample("magic.voc");
+ g_oBackend.PerlEvalF( "PlayerSelected(%d);", iPlayer );
+
+ PlayerInfo& roInfo = g_oPlayerSelect.EditPlayerInfo( iPlayer );
+
+ roInfo.m_aenTeam.clear();
+ roInfo.m_aenTeam.push_back( enRemoteFighter );
+ SetPlayerActive( iPlayer, false );
+ }
+}
+
+
+
+void CPlayerSelectController::MarkFighters()
+{
+ int iNumberOfFighters = g_oBackend.GetNumberOfFighters();
+ int i;
+
+ for ( i=0; i<iNumberOfFighters; ++i )
+ {
+ FighterEnum enFighter = g_oBackend.GetFighterID( i );
+ if ( !g_oPlayerSelect.IsLocalFighterAvailable( enFighter ) )
+ {
+ g_oChooser.MarkFighter( enFighter, C_LIGHTRED );
+ }
+ }
+}
+
+
+
+void CPlayerSelectController::SetPlayerActive( int a_iPlayer, bool a_bActive )
+{
+ m_abPlayerActive[a_iPlayer] = a_bActive;
+ g_oChooser.SetRectangleVisible( a_iPlayer, a_bActive );
+}
+
+
+/** This method finds the next player and lets him choose a fighter.
+This only should be called in team mode without multiselect.
+*/
+
+void CPlayerSelectController::ActivateNextPlayer( int a_iCurrentPlayer )
+{
+ // Go in the following order:
+ // 1 2 3 4 4 3 2 1 1 2 3 4 ...
+
+ int iNextPlayer = a_iCurrentPlayer;
+
+ if ( m_iNumberOfSelectableFighters <= 0 )
+ {
+ SetPlayerActive( a_iCurrentPlayer, false );
+ return;
+ }
+
+ if ( a_iCurrentPlayer == 0 )
+ {
+ iNextPlayer = 1;
+ }
+ else if ( g_oState.m_iNumPlayers-1 == a_iCurrentPlayer )
+ {
+ iNextPlayer = a_iCurrentPlayer - 1;
+ }
+ else
+ {
+ iNextPlayer = GetTeamSize(a_iCurrentPlayer-1) > GetTeamSize(a_iCurrentPlayer+1) ?
+ a_iCurrentPlayer+1 : a_iCurrentPlayer-1;
+ }
+
+ if ( GetTeamSize(a_iCurrentPlayer) <= GetTeamSize(iNextPlayer) )
+ {
+ iNextPlayer = a_iCurrentPlayer;
+ }
+
+ if ( iNextPlayer != a_iCurrentPlayer )
+ {
+ SetPlayerActive( a_iCurrentPlayer, false );
+ }
+ SetPlayerActive( iNextPlayer, GetTeamSize(iNextPlayer) < g_oState.m_iTeamSize );
+}
+
+
+int CPlayerSelectController::GetTeamSize( int a_iPlayer )
+{
+ return g_oPlayerSelect.GetPlayerInfo( a_iPlayer ).m_aenTeam.size();
+}
+
+
+
+bool CPlayerSelectController::IsFighterSelectable( FighterEnum a_enFighter )
+{
+ if ( !g_oPlayerSelect.IsFighterAvailable( a_enFighter ) )
+ {
+ return false;
+ }
+
+ if ( m_bTeamMode && !g_oState.m_bTeamMultiselect && g_oPlayerSelect.IsFighterInTeam(a_enFighter) )
+ {
+ return false;
+ }
+
+ return true;
+}
+
+
+
+void CPlayerSelectController::DoPlayerSelect()
+{
+
+ // 1. INITIALIZE
+
+ if ( SState::IN_NETWORK == g_oState.m_enGameMode )
+ {
+ g_oState.m_enTeamMode = SState::Team_ONE_VS_ONE;
+ g_oState.m_iNumPlayers = 2;
+ }
+
+ int i;
+ for ( i=0; i<g_oState.m_iNumPlayers; ++i )
+ {
+ g_oPlayerSelect.SetPlayer( i, g_oChooser.GetCurrentFighter(i) );
+ SetPlayerActive( i, !m_bTeamMode || g_oState.m_bTeamMultiselect || 0 == i );
+ }
+ m_iNumberOfSelectableFighters = g_oBackend.GetNumberOfAvailableFighters();
+ MarkFighters();
+
+ if ( m_bTeamMode )
+ {
+ for ( int i=0; i<g_oState.m_iNumPlayers; ++i )
+ {
+ g_oPlayerSelect.EditPlayerInfo(i).m_aenTeam.clear();
+ }
+ }
+
+ if ( m_bNetworkGame && g_poNetwork->IsMaster() )
+ {
+ g_poNetwork->SendGameParams( g_oState.m_iGameSpeed, g_oState.m_iGameTime, g_oState.m_iHitPoints, GetBackgroundNumber() );
+ }
+
+ g_oBackend.PerlEvalF( "SelectStart(%d);", g_oState.m_iNumPlayers );
+
+ m_bChatActive = false;
+
+ m_iGameSpeed = 12 ;
+ m_iThisTick = SDL_GetTicks() / m_iGameSpeed;
+ m_iLastTick = m_iThisTick - 1;
+
+ // 2. RUN THE PLAYER SELECTION LOOP
+
+ while (1)
+ {
+ // 2.1. Wait for the next tick (on extremely fast machines..)
+ GetThisTick();
+ int iAdvance = m_iThisTick - m_iLastTick;
+ if ( iAdvance > 5 )
+ iAdvance = 5;
+
+ // 2.2. Handle events
+ HandleEvents();
+ if ( m_bNetworkGame )
+ {
+ HandleNetwork();
+ }
+
+ // 2.3. Update the view
+ m_poView->Advance( iAdvance );
+ m_poView->Draw();
+
+ if ( g_oState.m_bQuitFlag || SState::IN_DEMO == g_oState.m_enGameMode)
+ break;
+
+ //@ FIX THIS
+
+ if ( !m_abPlayerActive[0] && !m_abPlayerActive[1] && m_poView->IsOver() )
+ break;
+ }
+}
diff --git a/src/PlayerSelectController.h b/src/PlayerSelectController.h
new file mode 100644
index 0000000..f88d044
--- /dev/null
+++ b/src/PlayerSelectController.h
@@ -0,0 +1,49 @@
+#ifndef PLAYERSELECTCONTROLLER_H
+#define PLAYERSELECTCONTROLLER_H
+
+#include "SDL.h"
+#include "FighterEnum.h"
+#include "common.h"
+
+class CPlayerSelectView;
+
+class CPlayerSelectController
+{
+public:
+ CPlayerSelectController( bool a_bNetworkGame );
+ ~CPlayerSelectController();
+
+ void DoPlayerSelect();
+
+protected:
+ void HandleEvents();
+ void HandleKey( int a_iPlayer, int a_iKey );
+ bool HandleChatKey( SDL_Event& a_roEvent );
+ void HandleNetwork();
+ void GetThisTick();
+ void MarkFighters();
+
+ void SetPlayerActive( int a_iPlayer, bool a_bActive );
+ void ActivateNextPlayer( int a_iCurrentPlayer );
+ int GetTeamSize( int a_iPlayer );
+
+ bool IsFighterSelectable( FighterEnum a_enFighter );
+
+
+protected:
+ CPlayerSelectView* m_poView;
+ bool m_bNetworkGame;
+ bool m_bTeamMode;
+ bool m_bChatActive;
+ char m_acChatMsg[256];
+ int m_iNumberOfSelectableFighters;
+
+ bool m_abPlayerActive[MAXPLAYERS];
+
+ int m_iGameSpeed;
+ int m_iThisTick;
+ int m_iLastTick;
+};
+
+
+#endif // PLAYERSELECTCONTROLLER_H
diff --git a/src/PlayerSelectView.cpp b/src/PlayerSelectView.cpp
new file mode 100644
index 0000000..24624bc
--- /dev/null
+++ b/src/PlayerSelectView.cpp
@@ -0,0 +1,587 @@
+#include "sge_tt_text.h"
+#include "sge_bm_text.h"
+#include "sge_primitives.h"
+#include "RlePack.h"
+
+#include "PlayerSelectView.h"
+#include "PlayerSelect.h"
+
+#include "Chooser.h"
+#include "TextArea.h"
+#include "Backend.h"
+#include "State.h"
+#include "gfx.h"
+#include "common.h"
+
+
+
+
+
+class CTeamDisplay
+{
+public:
+ CTeamDisplay( int a_iPlayer, SDL_Surface* a_poScreen, const SDL_Rect& a_roRect );
+ ~CTeamDisplay();
+
+ void DrawTitle( Uint32 a_iColor );
+ void DrawQuestionMark( Uint32 a_iColor, int a_iNumber=-1 );
+ void AddFighter( FighterEnum a_enFighter );
+ void DrawFighter( FighterEnum a_enFighter, int a_iNumber );
+ SDL_Rect GetRect( int a_iNumber=-1 );
+ int GetCount() { return m_iCount; }
+
+protected:
+ int m_iPlayer;
+ SDL_Surface* m_poScreen;
+ SDL_Rect m_oRect;
+ int m_iTitleX;
+
+ int m_iCount;
+ int m_iMax;
+};
+
+
+CTeamDisplay::CTeamDisplay( int a_iPlayer, SDL_Surface* a_poScreen, const SDL_Rect& a_roRect )
+{
+ m_iPlayer = a_iPlayer;
+ m_poScreen = a_poScreen;
+ m_oRect = a_roRect;
+ m_iCount = 0;
+ m_iMax = g_oState.m_iTeamSize;
+ m_iTitleX = m_oRect.x;
+
+ const char* pcFormat = Translate("Team %d");
+ SDL_Rect oTextSize = sge_TTF_TextSize( impactFont, pcFormat );
+ int w = oTextSize.w;
+ m_oRect.w -= w;
+ m_oRect.x += w;
+
+ DrawTitle( C_WHITE );
+
+ for ( int i=0; i< m_iMax; ++i )
+ {
+ DrawQuestionMark( C_WHITE, i );
+ }
+}
+
+
+CTeamDisplay::~CTeamDisplay() {}
+
+
+void CTeamDisplay::DrawTitle( Uint32 a_iColor )
+{
+ char acBuffer[128];
+ const char* pcFormat = Translate("Team %d");
+
+ sprintf( acBuffer, pcFormat, m_iPlayer+1 );
+ DrawTextMSZ( acBuffer, impactFont, m_iTitleX, m_oRect.y+m_oRect.h/2,
+ AlignVCenter|UseShadow, a_iColor, m_poScreen, false );
+}
+
+
+void CTeamDisplay::DrawQuestionMark( Uint32 a_iColor, int a_iNumber )
+{
+ if ( a_iNumber < 0 ) a_iNumber = m_iCount;
+ if ( a_iNumber >= m_iMax ) return;
+
+ SDL_Rect oRect = GetRect( a_iNumber );
+ sge_Rect( m_poScreen, oRect.x, oRect.y, oRect.x+oRect.w, oRect.y+oRect.h, C_WHITE );
+ DrawTextMSZ( "?", impactFont, oRect.x+oRect.w/2, oRect.y+oRect.h/2, AlignCenter, a_iColor, m_poScreen, false );
+}
+
+
+void CTeamDisplay::AddFighter( FighterEnum a_enFighter )
+{
+ DrawQuestionMark( C_WHITE );
+ ++m_iCount;
+}
+
+
+void CTeamDisplay::DrawFighter( FighterEnum a_enFighter, int a_iNumber )
+{
+ SDL_Rect oRect = GetRect( a_iNumber );
+ g_oChooser.DrawPortrait( a_enFighter, m_poScreen, oRect );
+ sge_Rect( m_poScreen, oRect.x, oRect.y, oRect.x+oRect.w, oRect.y+oRect.h, C_WHITE );
+}
+
+
+SDL_Rect CTeamDisplay::GetRect( int a_iNumber )
+{
+ if ( a_iNumber < 0 ) a_iNumber = m_iCount;
+ if ( m_oRect.h > 75 )
+ {
+ m_oRect.y += (m_oRect.h - 75) / 2;
+ m_oRect.h = 75;
+ }
+
+ int iGap = 5;
+ int iWidth = m_oRect.w / m_iMax;
+ if ( iWidth > m_oRect.h + iGap ) iWidth = m_oRect.h + iGap;
+
+ SDL_Rect oRect;
+ oRect.y = m_oRect.y;
+ oRect.h = m_oRect.h;
+ oRect.x = m_oRect.x + iWidth * a_iNumber;
+ oRect.w = iWidth - iGap;
+
+ return oRect;
+}
+
+
+
+IViewElement::IViewElement( CPlayerSelectView* a_poView, int a_iPriority )
+{
+ m_poView = a_poView;
+ m_iPriority = a_iPriority;
+
+ m_poView->AddViewElement( this, m_iPriority );
+}
+
+
+IViewElement::~IViewElement()
+{
+}
+
+
+int IViewElement::GetPriority() const
+{
+ return m_iPriority;
+}
+
+
+/**
+The portrait of a given fighter will gracefully fly from the chooser
+to a team display. The view element will delete itself afterwards.
+*/
+
+class CFlyingPortraitViewElement: public IViewElement
+{
+public:
+ CFlyingPortraitViewElement( CPlayerSelectView* a_poView, CTeamDisplay* a_poTeamDisplay,
+ FighterEnum a_enFighter, const SDL_Rect& a_oSrcRect, const SDL_Rect& a_oDstRect )
+ : IViewElement( a_poView, 0 )
+ {
+ m_poTeamDisplay = a_poTeamDisplay;
+ m_iTeamNumber = m_poTeamDisplay->GetCount();
+ m_enFighter = a_enFighter;
+ m_oRect = a_oSrcRect;
+ m_oDstRect = a_oDstRect;
+
+ m_dX = m_oRect.x + m_oRect.w / 2;
+ m_dY = m_oRect.y + m_oRect.h / 2;
+ m_dSize = MIN( m_oRect.w, m_oRect.h );
+
+ m_dSpeedX = 0.0;
+ m_dSpeedY = - m_dY / 15;
+ m_dSpeedSize= 0.0;
+
+ m_dTargetX = m_oDstRect.x + m_oDstRect.w / 2;
+ m_dTargetY = m_oDstRect.y + m_oDstRect.h / 2;
+ m_dTargetSize = MIN( m_oDstRect.w, m_oDstRect.h);
+
+ m_iTotalTime = 70 + m_dY / 7.5;
+ m_iTime = m_iTotalTime;
+
+ }
+
+ ~CFlyingPortraitViewElement() {}
+
+ void Advance( int a_iNumFrames )
+ {
+ if ( m_dX + m_dSpeedX * 0.5 * m_iTime > m_dTargetX ) m_dSpeedX -= a_iNumFrames * 0.5; else m_dSpeedX += a_iNumFrames * 0.5;
+ if ( m_dY + m_dSpeedY * 0.5 * m_iTime > m_dTargetY ) m_dSpeedY -= a_iNumFrames * 0.5; else m_dSpeedY += a_iNumFrames * 0.5;
+
+ m_dX += m_dSpeedX * a_iNumFrames;
+ m_dY += m_dSpeedY * a_iNumFrames;
+
+ double dTargetSize = (m_iTime > m_iTotalTime/2) ? 75.0 : m_dTargetSize;
+ int iTargetTime = (m_iTime > m_iTotalTime/2) ? m_iTime : ( m_iTotalTime/2-m_iTime );
+ if ( m_dSize + m_dSpeedSize * iTargetTime > dTargetSize ) m_dSpeedSize -= a_iNumFrames * 0.3; else m_dSpeedSize += a_iNumFrames * 0.3;
+
+ m_dSize += m_dSpeedSize * a_iNumFrames;
+
+ m_oRect.x = int( m_dX - m_dSize / 2 );
+ m_oRect.y = int( m_dY - m_dSize / 2 );
+ m_oRect.w = m_oRect.h = (int)m_dSize;
+
+ m_iTime -= a_iNumFrames;
+ if ( m_iTime < 0 )
+ {
+ m_poTeamDisplay->DrawFighter( m_enFighter, m_iTeamNumber );
+ m_poView->RemoveViewElement( this );
+ delete( this );
+ }
+ }
+
+ void Draw()
+ {
+ g_oChooser.DrawPortrait( m_enFighter, gamescreen, m_oRect );
+ }
+
+protected:
+ CTeamDisplay* m_poTeamDisplay;
+ int m_iTeamNumber;
+ FighterEnum m_enFighter;
+ double m_dX, m_dY, m_dSize;
+ double m_dSpeedX, m_dSpeedY, m_dSpeedSize;
+ double m_dTargetX, m_dTargetY, m_dTargetSize;
+ int m_iTotalTime;
+ int m_iTime;
+ SDL_Rect m_oDstRect;
+ SDL_Rect m_oRect;
+ int m_iNumber;
+};
+
+/**
+This view element implements the "opening courtain" effect at the start
+of the player selection routine. It removes itself when the effect is
+finished
+*/
+
+class CCourtainViewElement: public IViewElement
+{
+public:
+ CCourtainViewElement( CPlayerSelectView* a_poView ) : IViewElement( a_poView, 0 )
+ {
+ m_iCourtain = 0;
+ m_iCourtainSpeed = 0;
+ m_iCourtainTime = 80;
+ }
+
+ ~CCourtainViewElement() {}
+
+ void Advance( int a_iNumFrames )
+ {
+ if ( a_iNumFrames > 5 ) a_iNumFrames = 5;
+
+ if ( m_iCourtainTime <= 0 )
+ {
+ SDL_SetClipRect( gamescreen, NULL );
+ m_poView->RemoveViewElement( this );
+ delete( this );
+ }
+
+ if ( m_iCourtain + m_iCourtainSpeed * m_iCourtainTime /2 < 320 * 4 )
+ m_iCourtainSpeed += a_iNumFrames;
+ else
+ m_iCourtainSpeed -= a_iNumFrames;
+
+ m_iCourtain += m_iCourtainSpeed * a_iNumFrames;
+ m_iCourtainTime -= a_iNumFrames;
+
+ if ( m_iCourtainTime > 0 )
+ {
+ SDL_Rect oRect;
+ oRect.x = 320 - m_iCourtain/4; oRect.y = 0;
+ oRect.w = m_iCourtain / 2; oRect.h = gamescreen->h;
+ if ( oRect.x < 0 ) oRect.x = 0;
+ if ( oRect.w > gamescreen->w ) oRect.w = gamescreen->w;
+ SDL_SetClipRect( gamescreen, &oRect );
+ }
+ }
+
+ void Draw()
+ {
+ }
+
+protected:
+ int m_iCourtain;
+ int m_iCourtainSpeed;
+ int m_iCourtainTime;
+
+};
+
+
+
+/** This view element flashes the title and '?' mark of active teams. */
+
+class CTeamFlashViewElement: public IViewElement
+{
+public:
+ CTeamFlashViewElement( CPlayerSelectView* a_poView, int a_iPriority )
+ : IViewElement( a_poView, a_iPriority )
+ {
+ for ( int i=0; i<MAXPLAYERS; ++i )
+ {
+ m_bActive[i] = false;
+ }
+ }
+
+ ~CTeamFlashViewElement() {}
+
+ void Advance( int a_iNumFrames )
+ {
+ m_iCycle = (m_iCycle + a_iNumFrames*10) % 512;
+ }
+
+ void Draw()
+ {
+ int iLum = m_iCycle < 256 ? m_iCycle : 511-m_iCycle;
+
+ for ( int i=0; i<g_oState.m_iNumPlayers; ++i )
+ {
+ if ( g_oChooser.IsRectangleVisible( i ) )
+ {
+ SDL_Color oColor;
+ switch (i)
+ {
+ case 0: oColor.r = 85; oColor.g = 255; oColor.b = 85; break;
+ case 1: oColor.r = 255; oColor.g = 85; oColor.b = 255; break;
+ case 2: oColor.r = 255; oColor.g = 255; oColor.b = 85; break;
+ default: oColor.r = 85; oColor.g = 85; oColor.b = 255; break;
+ }
+ Uint32 iColor = SDL_MapRGB( gamescreen->format, oColor.r*iLum/256, oColor.g*iLum/256, oColor.b*iLum/256 );
+ m_poView->GetTeamDisplay(i)->DrawTitle( iColor );
+ m_poView->GetTeamDisplay(i)->DrawQuestionMark( iColor );
+ m_bActive[i] = true;
+ }
+ else if ( m_bActive[i] )
+ {
+ m_poView->GetTeamDisplay(i)->DrawTitle( C_WHITE );
+ m_bActive[i] = false;
+ }
+ }
+ }
+
+protected:
+ int m_iCycle;
+ bool m_bActive[MAXPLAYERS];
+};
+
+
+
+
+
+/*************************************************************************
+ CPLAYERSELECTVIEW CLASS
+*************************************************************************/
+
+CPlayerSelectView::CPlayerSelectView( bool a_bNetworkGame, bool a_bTeamMode )
+{
+ m_bOver = false;
+ m_bNetworkGame = a_bNetworkGame;
+ m_bTeamMode = a_bTeamMode;
+ m_bTeamMultiselect = g_oState.m_bTeamMultiselect;
+ m_poReadline = NULL;
+ m_poTextArea = NULL;
+ m_iTime = 0;
+
+ int i;
+ for ( i=0; i<MAXPLAYERS; ++i ) m_apoTeamDisplays[i] = NULL;
+
+ SDL_FillRect( gamescreen, NULL, C_BLACK );
+ SDL_Flip( gamescreen );
+ m_poBackground = LoadBackground( "FighterStats.jpg", 64 ); //m_bNetworkGame ? "PlayerSelect_chat.png" : "PlayerSelect.png", 111 );
+ if ( m_poBackground ) SDL_SetColorKey( m_poBackground, 0, 0 );
+
+ new CCourtainViewElement(this);
+
+ if ( m_bTeamMode )
+ {
+ new CTeamFlashViewElement(this, 0);
+ SDL_Rect oRect;
+ oRect.x = 10; oRect.w = 620;
+ oRect.y = 380; oRect.h = 40;
+ m_apoTeamDisplays[0] = new CTeamDisplay( 0, m_poBackground, oRect );
+ oRect.y = 430; oRect.h = 40;
+ m_apoTeamDisplays[1] = new CTeamDisplay( 1, m_poBackground, oRect );
+ if ( g_oState.m_iNumPlayers >= 3 )
+ {
+ oRect.y = 330;
+ m_apoTeamDisplays[2] = new CTeamDisplay( 2, m_poBackground, oRect );
+ }
+
+ if ( g_oState.m_iNumPlayers >= 4 )
+ {
+ oRect.y = 280;
+ m_apoTeamDisplays[3] = new CTeamDisplay( 3, m_poBackground, oRect );
+ }
+
+ if ( m_bTeamMultiselect )
+ {
+ m_iChooserTop = 25;
+ m_iChooserHeight = 80 * 4;
+ m_iChooserLeft = 158;
+ m_iChooserWidth = 64*5;
+ }
+ else
+ {
+ DrawGradientText( "Choose A Fighter Dammit", titleFont, 10, m_poBackground );
+ m_iChooserTop = 75;
+ m_iChooserHeight = 80 * 4 - 50;
+ m_iChooserLeft = 180;
+ m_iChooserWidth = 430;
+ }
+ m_iFighterYOffset = -100;
+ m_iFighterNameYOffset = -95;
+ }
+ else if ( m_bNetworkGame )
+ {
+ m_iChooserLeft = 158;
+ m_iChooserTop = 26;
+ m_iChooserWidth = 64 * 5;
+ m_iChooserHeight = 64 * 4;
+ m_iFighterYOffset = -130;
+ m_iFighterNameYOffset = -170;
+ }
+ else
+ {
+ m_iChooserLeft = 158;
+ m_iChooserTop = 74;
+ m_iChooserWidth = 80*4;
+ m_iChooserHeight = 80*5;
+ m_iFighterYOffset = 0;
+ m_iFighterNameYOffset = 0;
+ }
+
+ g_oChooser.Start( m_poBackground );
+ g_oChooser.Resize( m_iChooserLeft, m_iChooserTop, m_iChooserLeft+m_iChooserWidth, m_iChooserTop+m_iChooserHeight );
+ g_oChooser.Draw();
+
+ if ( !m_bNetworkGame && !m_bTeamMode )
+ {
+ DrawGradientText( "Choose A Fighter Dammit", titleFont, 10, m_poBackground );
+ }
+
+ if ( m_bNetworkGame )
+ {
+ char acMsg[256];
+ sprintf( acMsg, "Press Enter to chat, Page Up/Page Down to scroll..." );
+
+ if ( m_bNetworkGame )
+ {
+ m_poReadline = new CReadline( m_bNetworkGame ? m_poBackground : NULL, chatFont,
+ acMsg, strlen(acMsg), 256, 15, 465, 610, C_LIGHTCYAN, C_BLACK, 255 );
+ m_poTextArea = new CTextArea( m_poBackground, chatFont, 15, 313, 610, 32*4 );
+ }
+ }
+
+}
+
+
+CPlayerSelectView::~CPlayerSelectView()
+{
+ delete m_apoTeamDisplays[0]; m_apoTeamDisplays[0] = NULL;
+ delete m_apoTeamDisplays[1]; m_apoTeamDisplays[1] = NULL;
+
+ TViewElements::iterator it;
+ for ( it=m_apoElements.begin(); it!= m_apoElements.end(); ++it )
+ {
+ delete *it;
+ }
+ m_apoElements.clear();
+
+ delete m_poTextArea;
+ delete m_poReadline;
+ SDL_FreeSurface( m_poBackground );
+}
+
+
+void CPlayerSelectView::Advance( int a_iNumFrames )
+{
+ m_iTime += a_iNumFrames;
+
+ for ( int i=0; i<a_iNumFrames; ++i )
+ {
+ g_oBackend.AdvancePerl();
+
+ TViewElements::iterator it;
+ }
+
+ TViewElements::iterator it;
+ TViewElements::iterator itNext;
+ for ( it = m_apoElements.begin(); it != m_apoElements.end(); )
+ {
+ itNext = it;
+ ++itNext;
+ (*it)->Advance( a_iNumFrames );
+ it = itNext;
+ }
+}
+
+
+void CPlayerSelectView::Draw()
+{
+ TViewElements::iterator it;
+
+ g_oBackend.ReadFromPerl();
+ m_bOver = g_oBackend.m_iGameOver;
+
+ g_oChooser.DrawRectangles(m_iTime);
+ SDL_BlitSurface( m_poBackground, NULL, gamescreen, NULL );
+
+ for ( it = m_apoElements.begin(); it != m_apoElements.end(); ++it )
+ {
+ (*it)->Draw();
+ }
+
+ for ( int i=0; i<g_oState.m_iNumPlayers; ++i )
+ {
+ if ( m_bTeamMode && 1==i && !m_bTeamMultiselect ) continue;
+
+ const PlayerInfo& roPlayerInfo = g_oPlayerSelect.GetPlayerInfo( i );
+ int iPlayerNameWidth = g_oPlayerSelect.GetFighterNameWidth( i );
+
+ if ( g_oBackend.m_aoPlayers[i].m_iFrame )
+ {
+ roPlayerInfo.m_poPack->Draw(
+ ABS(g_oBackend.m_aoPlayers[i].m_iFrame)-1,
+ g_oBackend.m_aoPlayers[i].m_iX, g_oBackend.m_aoPlayers[i].m_iY + m_iFighterYOffset,
+ g_oBackend.m_aoPlayers[i].m_iFrame < 0 );
+ }
+ int x = ( m_iChooserLeft - iPlayerNameWidth ) / 2;
+ if ( x<10 ) x = 10;
+ if ( i ) x = gamescreen->w - x - iPlayerNameWidth;
+
+ sge_BF_textout( gamescreen, fastFont, g_oPlayerSelect.GetFighterName(i),
+ x, gamescreen->h - 40 + m_iFighterNameYOffset );
+ }
+
+ SDL_Flip( gamescreen );
+}
+
+
+CReadline* CPlayerSelectView::GetReadline()
+{
+ return m_poReadline;
+}
+
+
+CTextArea* CPlayerSelectView::GetTextArea()
+{
+ return m_poTextArea;
+}
+
+
+void CPlayerSelectView::AddViewElement( IViewElement* a_poElement, int a_iPriority )
+{
+
+ m_apoElements.push_back( a_poElement );
+}
+
+
+void CPlayerSelectView::RemoveViewElement( IViewElement* a_poElement )
+{
+ m_apoElements.remove( a_poElement );
+}
+
+
+void CPlayerSelectView::AddFighterToTeam( int a_iPlayer, FighterEnum a_enFighter )
+{
+ new CFlyingPortraitViewElement( this, m_apoTeamDisplays[a_iPlayer], a_enFighter,
+ g_oChooser.GetFighterRect( a_enFighter ),
+ m_apoTeamDisplays[a_iPlayer]->GetRect() );
+ m_apoTeamDisplays[a_iPlayer]->AddFighter( a_enFighter );
+}
+
+
+bool CPlayerSelectView::IsOver()
+{
+ return m_bOver;
+}
+
+
+CTeamDisplay* CPlayerSelectView::GetTeamDisplay( int a_iPlayer )
+{
+ return m_apoTeamDisplays[a_iPlayer];
+}
diff --git a/src/PlayerSelectView.h b/src/PlayerSelectView.h
new file mode 100644
index 0000000..759badd
--- /dev/null
+++ b/src/PlayerSelectView.h
@@ -0,0 +1,75 @@
+#ifndef PLAYERSELECTVIEW_H
+#define PLAYERSELECTVIEW_H
+
+#include "FighterEnum.h"
+#include "State.h"
+#include <list>
+
+struct SDL_Surface;
+class CTextArea;
+class CReadline;
+class CPlayerSelectView;
+class CTeamDisplay;
+
+
+
+class IViewElement
+{
+public:
+ IViewElement( CPlayerSelectView* a_poView, int a_iPriority );
+ virtual ~IViewElement();
+
+ int GetPriority() const;
+ virtual void Advance( int a_iNumFrames ) = 0;
+ virtual void Draw() = 0;
+
+protected:
+ CPlayerSelectView* m_poView;
+ int m_iPriority;
+};
+
+
+
+
+
+class CPlayerSelectView
+{
+public:
+ CPlayerSelectView( bool a_bNetworkGame, bool a_bTeamMode );
+ ~CPlayerSelectView();
+
+ void Advance( int a_iNumFrames );
+ void Draw();
+ CTextArea* GetTextArea();
+ CReadline* GetReadline();
+
+ void AddViewElement( IViewElement* a_poElement, int a_iPriority );
+ void RemoveViewElement( IViewElement* a_poElement );
+ void AddFighterToTeam( int a_iPlayer, FighterEnum a_enFighter );
+ bool IsOver();
+
+ CTeamDisplay* GetTeamDisplay( int a_iPlayer );
+
+protected:
+ bool m_bTeamMode;
+ bool m_bTeamMultiselect;
+ bool m_bNetworkGame;
+ SDL_Surface* m_poBackground;
+ CTextArea* m_poTextArea;
+ CReadline* m_poReadline;
+ bool m_bOver;
+
+ int m_iChooserTop;
+ int m_iChooserLeft;
+ int m_iChooserHeight;
+ int m_iChooserWidth;
+ int m_iFighterYOffset;
+ int m_iFighterNameYOffset;
+
+ int m_iTime;
+ typedef std::list<IViewElement*> TViewElements;
+ TViewElements m_apoElements;
+ CTeamDisplay* m_apoTeamDisplays[MAXPLAYERS];
+};
+
+#endif // PLAYERSELECTVIEW_H
File Metadata
Details
Attached
Mime Type
text/x-diff
Expires
Tue, Jun 16, 12:20 AM (2 w, 1 d ago)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
70607
Default Alt Text
(36 KB)
Attached To
Mode
R76 OpenMortal
Attached
Detach File
Event Timeline