
/*********************************************************************
*   < _GAME.CPP >
**********************************************************************
*   ゲームの進行関係
**********************************************************************
*                                                   Copyright (C) 2005
*   Programed by Ochi
*********************************************************************/

#include "_speed.h"

/*********************************************************************
*   デバック画面にメッセージを追加する
**********************************************************************
*   引数　：追加するメッセージ(const char*)
*   戻り値：無し
*********************************************************************/
void CGame::Debug_Send( const char* szSendString )
{
    char szBuf[1000000]; // 1MB 超えることは無いだろうと仮定。
    //SCROLLINFO scr;
    HWND hWnd = cDraw.ReturnHWND();

    GetDlgItemText( cDraw.ReturnHWND(), EDIT_DEBUG, szBuf, sizeof(szBuf) );
    if ( szBuf[0] != NULL ) {
        strcat(szBuf, "\r\n");
    }
    strcat( szBuf, szSendString );
    SetWindowText( GetDlgItem(hWnd,EDIT_DEBUG), szBuf );

    // スクロールバーの位置調整
    //GetScrollInfo( GetDlgItem(hWnd,EDIT_DEBUG), SB_VERT, &scr );
    //SetScrollInfo( GetDlgItem(hWnd,EDIT_DEBUG), SB_VERT, &scr, TRUE );
}

/*********************************************************************
*   タイマーを描画する
**********************************************************************
*   引数　：無し
*   戻り値：無し
*********************************************************************/
void CGame::DrawTimer( void )
{
    char szTime[65];

    sprintf( szTime, "%ld [ms]", cTimer.Time() );
    SetWindowText( GetDlgItem(cDraw.ReturnHWND(),STATIC_TIMER), szTime );
}

/*********************************************************************
*   タイマーとデバッグウィンドウを初期化する
**********************************************************************
*   引数　：メインとなるウィンドウハンドル(HWND)
*   戻り値：終了(bool)
*********************************************************************/
bool CGame::FormatStartUp( HWND hWnd )
{
    static bool bFirst = true;

    cCards.SetupDemo();
    cDraw.FormatDC( hWnd );
    if( bFirst==true )
    {
        cDraw.LoadAllImage();
        // タイマーを作成
        CreateWindow( "STATIC", "0[ms]",
                      WS_CHILD|WS_VISIBLE|SS_RIGHT,
                      _frame.ReturnWinSize('W')-150, _frame.ReturnWinSize('H')/2-10, 140, 20,
                      hWnd,
                      (HMENU)STATIC_TIMER,
                      NULL,
                      NULL);

        // デバッグウィンドウの生成
        CreateWindow( "EDIT","",
                      WS_CHILD|WS_VISIBLE|WS_HSCROLL|WS_VSCROLL|ES_MULTILINE,
                      0,480,600,120,
                      hWnd,
                      (HMENU)EDIT_DEBUG,
                      NULL,
                      NULL );
        Debug_Send( "speed ver0.5 open." );
        bFirst = false;
    }
    cDraw.DrawCards( cCards, fLButton, nCardNo );

    return true;
}

/*********************************************************************
*   次のゲームを開始する
**********************************************************************
*   引数　：勝ち負けの情報(int), 相手に送るか否か(bool)
*   戻り値：終了(bool)
*********************************************************************/
bool CGame::NextGame( int Judge, bool Call )
{
    GameInfo = NEXTGAME;
    char strMessage[RECV_UDP+1];

    if( Call==true )
    {
        SendCards(NULL);
    }

    if( Judge==WIN )
    {
        strcpy( strMessage, "勝ちました！ " );
    }
    else if( Judge==DEFEAT )
    {
        strcpy( strMessage, "負けました… " );
    }
    else if( Judge==DRAW )
    {
        strcpy( strMessage, "引き分けです。 " );
    }
    else
    {
        strcpy( strMessage, "エラーにより勝敗が判定できません " );
    }
    strcat( strMessage, "もう一度やりますか？" );

    if( MessageBox(cDraw.ReturnHWND(),strMessage,"ゲーム終了",MB_ICONQUESTION | MB_YESNO)==IDNO )
    {
        DestroyWindow( cDraw.ReturnHWND() );
        PostQuitMessage( 0 );
        Message( "ByeBye!", "Speed で遊んで頂きありがとうございました。", 0 );
        DeleteObject( hReceive );
    }
    else
    {
        FormatStartUp( cDraw.ReturnHWND() );
        Connect();
        DeleteObject( hReceive );
    }

    return true;
}

/*********************************************************************
*   ゲームがストップしてしまったときの処理
**********************************************************************
*   引数　：現在のゲーム状況(int)
*   戻り値：終了(bool)
*********************************************************************/
bool CGame::Restart( int Flug )
{
    switch( Flug )
    {
    case PAUSE_1:
        GameInfo = Flug;
        break;

    case PLAY:
        GameInfo = Flug;
        break;

    case NULL:
        GameInfo = PAUSE_0;
        MessageBox( cDraw.ReturnHWND(), "両者ともこれ以上カードを置けません。\nOK を押すと場にカードを１枚置きます。", "ゲーム中断", MB_OK );
        if( GameInfo==PAUSE_0 )
        {
            cCards.SetRestart();
            cGame.SendCards( INVISIBLE );
            GameInfo = PAUSE_1;
        }
        else if( GameInfo==PAUSE_1 )
        {
            cCards.SetRestart();
            cGame.SendCards( RESTART );
            cDraw.DrawCards( cCards, FALSE, NULL );
            InvalidateRect( cDraw.ReturnHWND(), NULL, FALSE );
            GameInfo = PLAY;
        }
        break;
    }

    return true;
}

/*********************************************************************
*   プライベートなメソッドを渡す
**********************************************************************
*   引数　：無し
*   戻り値：要求されたメソッド
*********************************************************************/
CCards* CGame::ReturnCCardsPtr( void )
{
    return &cCards;
}

bool CGame::ReturnLButton( void )
{
    return fLButton;
}

int CGame::ReturnGameInfo( void )
{
    return GameInfo;
}

HDC CGame::ReturnHDC( void )
{
    return cDraw.ReturnMemoryDC();
}
