
/*********************************************************************
*   < _GAME_MOUSE.CPP >
**********************************************************************
*   マウス操作関係
**********************************************************************
*                                                   Copyright (C) 2005
*   Programed by Ochi
*********************************************************************/

#include "_speed.h"

/*********************************************************************
*   マウスの左ボタンが押されたときの処理
**********************************************************************
*   引数　：押された場所(POINT)
*   戻り値：終了(bool)
*********************************************************************/
bool CGame::LButtonDown( POINT pt )
{
    int     i, x, y, w, h, width, height;
    int     ptrBa[2];           cCards.SetBa( (int*)ptrBa );
    int     ptrTefuda[2][8];    cCards.SetTefuda( (int*)ptrTefuda );
    int     ptrYama[2][32];     cCards.SetYama( (int*)ptrYama );

    // 仮にJ1が定義されてると決め付けてる
    width   =  _frame.ReturnWinSize( 'W' );
    height  =  _frame.ReturnWinSize( 'H' );
    w       = _image.ReturnSize( "J1",'W' );    // カードの横の長さ
    h       = _image.ReturnSize( "J1",'H' );    // カードの縦の長さ
    x       = ((width/5)-w)/2;                  // カードの空きX
    y       = ((height/3)-h)/2;                 // カードの空きY

    if( pt.y<=height-y-h || pt.y>=height-y )
    {
        return 0;
    }

    for( i=-1; i<4; i++ )
    {
        if( i==-1 )
        {
            if( ptrYama[0][0]!=NULL && pt.x>=x && pt.x<=x+w)
            {
                nCardNo = i;
                ptCard.x = pt.x-x;
                ptCard.y = h-(height-pt.y-y);
                fLButton = TRUE;
                break;
            }
        }
        else if( ptrTefuda[0][i]!=0)
        {
            if( pt.x>=(x*2+w)*(i+1)+x && pt.x<=(x*2+w)*(i+1)+x+w )
            {
                nCardNo = i;
                ptCard.x = pt.x-((x*2+w)*(i+1))-x;
                ptCard.y = h-(height-pt.y-y);
                fLButton = TRUE;
                break;
            }
        }
    }   

    // 現在の画面状態をセーブ
    HDC     hDC;
    HDC*    hSaveDC = cDraw.ReturnSaveDC();
    HBITMAP hBmp;

    DeleteObject( *cDraw.ReturnSaveDC() );
    hDC = GetDC( cDraw.ReturnHWND() );
    hBmp = CreateCompatibleBitmap( hDC, _frame.ReturnWinSize('W'), _frame.ReturnWinSize('H') );
    *hSaveDC = CreateCompatibleDC( hDC );
    SelectObject( *hSaveDC, hBmp );
    cDraw.DrawCards( cCards, fLButton, nCardNo );
    BitBlt( *cDraw.ReturnSaveDC(), 0, 0, _frame.ReturnWinSize('W'), _frame.ReturnWinSize('H'), cDraw.ReturnMemoryDC(), 0, 0, SRCCOPY );
    ReleaseDC( cDraw.ReturnHWND(), hDC );

    return true;
}

/*********************************************************************
*   マウスの左ボタンが離されたときの処理
**********************************************************************
*   引数　：話された場所(POINT)
*   戻り値：終了(bool)
*********************************************************************/
bool CGame::LButtonUp( POINT pt )
{
    int x, y, w, h, width, height, n;
    int ptrBa[2];           cCards.SetBa( (int*)ptrBa );
    int ptrTefuda[2][8];    cCards.SetTefuda( (int*)ptrTefuda );
    int ptrYama[2][32];     cCards.SetYama( (int*)ptrYama );

    width   = _frame.ReturnWinSize( 'W' );
    height  = _frame.ReturnWinSize( 'H' );
    w       = _image.ReturnSize( "J1",'W' );    // カードの横の長さ
    h       = _image.ReturnSize( "J1",'H' );    // カードの縦の長さ
    x       = ((width/5)-w)/2;                  // カードの空きX
    y       = ((height/3)-h)/2;                 // カードの空きY

    // 山のカードが離された
    if( nCardNo==-1 )
    {
        if( pt.y>=height-y-h && pt.y<=height-y )
        {
            // ４つのどの場所で離されたか
            for( n=0; n<4; n++ )
            {
                if ( pt.x>=(x+w+x)*(n+1)+x && pt.x<=(x+w+x)*(n+1)+x+w )
                {
                    // 離された場所にカードがなければ置く
                    if( ptrTefuda[0][n]==NULL )
                    {
                        ptrTefuda[0][n] = ptrYama[0][0];
                        n=0;
                        // 山カードを取ったので、ずらす
                        while( n<23 )
                        {
                            ptrYama[0][n] = ptrYama[0][n+1];
                            if( ptrYama[0][n+1]==NULL )
                            {
                                break;
                            }
                            n++;
                        }
                    }
                    break;
                }
            }
        }
    }
    // 手札のカードが離された
    else
    {
        if( pt.y>=(height/2)-(h/2) && pt.y<=(height/2)+(h/2) )
        {
            if( pt.x>=width/2-x-w && pt.x<=width/2-x )
            {
                if( cCards.Judgment(ptrBa[0],ptrTefuda[0][nCardNo])==true )
                {
                    ptrBa[0] = ptrTefuda[0][nCardNo];
                    ptrTefuda[0][nCardNo] = NULL;
                }
            }
            if( pt.x>=width/2+x && pt.x<=width/2+x+w )
            {
                if( cCards.Judgment(ptrBa[1],ptrTefuda[0][nCardNo])==true )
                {
                    ptrBa[1] = ptrTefuda[0][nCardNo];
                    ptrTefuda[0][nCardNo] = NULL;
                }
            }
        }
    }
    
    fLButton=FALSE;
    cCards.ExtraSetToBuf( (int*)ptrBa, (int*)ptrTefuda, (int*)ptrYama );
    if( SendCards(BUF)==true )
    {
        GameInfo=PAUSE;
    }
    else
    {
        GameInfo=UPDATE;
    }

    return true;
}

/*********************************************************************
*   マウスが移動しているときの処理
**********************************************************************
*   引数　：移動中の場所(POINT)
*   戻り値：終了(bool)
*********************************************************************/
bool CGame::MouseMove( POINT pt )
{
    int ptrTefuda[2][8];
    cCards.SetTefuda( (int*)ptrTefuda );
    ptMouse = pt;

    BitBlt( cDraw.ReturnMemoryDC(), 0, 0, _frame.ReturnWinSize('W'), _frame.ReturnWinSize('H'), *cDraw.ReturnSaveDC(), 0, 0, SRCCOPY );
    if ( nCardNo == -1 )
    {
        _image.Draw( cDraw.ReturnMemoryDC(), "B1",
                     ptMouse.x-ptCard.x, ptMouse.y-ptCard.y ); 
    }
    else
    {
        _image.Draw( cDraw.ReturnMemoryDC(), cCards.Decode(ptrTefuda[0][nCardNo]),
                     ptMouse.x-ptCard.x, ptMouse.y-ptCard.y ); 
    }
    InvalidateRect( cDraw.ReturnHWND(), NULL, FALSE );

    return true;
}

/*********************************************************************
*   マウスの右ボタンが押されたときの処理
**********************************************************************
*   引数　：押された場所(POINT)
*   戻り値：終了(bool)
*********************************************************************/
bool CGame::RButtonDown( POINT pt )
{
    if( fLButton==TRUE )
    {
        return TRUE;
    }

    int     n, x, y, w, h, width, height;
    int     ptrBa[2];           cCards.SetBa( (int*)ptrBa );
    int     ptrTefuda[2][8];    cCards.SetTefuda( (int*)ptrTefuda );
    int     ptrYama[2][32];     cCards.SetYama( (int*)ptrYama );

    // なるべくimageクラスは直接使わないで！仮にJ1が定義されてると決め付けてる。
    width   = _frame.ReturnWinSize( 'W' );
    height  = _frame.ReturnWinSize( 'H' );
    w = _image.ReturnSize( "J1",'W' );  // カードの横の長さ
    h = _image.ReturnSize( "J1",'H' );  // カードの縦の長さ
    x = ((width/5)-w)/2;                // カードの空きX
    y = ((height/3)-h)/2;               // カードの空きY

    if( pt.x>=x && pt.x<=x+w && pt.y>=height-y-h && pt.y<=height-y && ptrYama[0][0]!=NULL )
    {
        for( n=0; n<4; n++ )
        {
            if( ptrTefuda[0][n]==NULL )
            {
                ptrTefuda[0][n] = ptrYama[0][0];
                // 山カードを取ったので、ずらす
                n=0;
                while( n<23 )
                {
                    ptrYama[0][n] = ptrYama[0][n+1];
                    if( ptrYama[0][n+1]==NULL )
                    {
                        break;
                    }
                    n++;
                }
                break;
            }
            if( n==3 )
            {
                return false;   // 手札に空きがなかった
            }
        }
    }

    cCards.ExtraSetToBuf( (int*)ptrBa, (int*)ptrTefuda, (int*)ptrYama );
    if( SendCards(BUF)==true )
    {
        GameInfo=PAUSE;
    }
    else
    {
        GameInfo=UPDATE;
    }

    return false;
}
