Page MenuHomePhabricator (Chris)

No OneTemporary

Authored By
Unknown
Size
36 KB
Referenced Files
None
Subscribers
None
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

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)

Event Timeline