Aleks11

Code example

Mar 7th, 2013
369
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 15.60 KB | None | 0 0
  1. #include "Game.h"
  2.  
  3. CDeckOfCards                g_Deck;
  4. CGameField                  g_Game;
  5.  
  6. HRESULT InitDeck()
  7. {
  8.     HRESULT hr;
  9.     V_RETURN(g_Deck.InitDeck());
  10.  
  11.     for (int i = 0; i < CARD_SUIT_COUNT; i++)
  12.     {
  13.         for (int j = 0; j < CARD_RANK_COUNT; j++)
  14.         {
  15.             g_Deck.GetCard((CARD_SUIT)i, (CARD_RANK)j)->SetCardEndPos(CARD_SIZE);
  16.         }
  17.     }
  18.  
  19.     return S_OK;
  20. }
  21.  
  22. void InitField()
  23. {
  24.     g_Game.InitField();
  25. }
  26.  
  27. void ProcessAndRender(ID3D11DeviceContext *pImmediateContext, ID3D11RenderTargetView *pRenderTargetView)
  28. {
  29.     g_Game.GameProcess();
  30.     g_Game.Render(pImmediateContext, pRenderTargetView);
  31. }
  32.  
  33. CCard *const GetTrump()
  34. {
  35.     return g_Game.GetTrump();
  36. }
  37.  
  38. int GetNumFreeCards()
  39. {
  40.     int dwNum = 0;
  41.     for (int i = 0; i < CARD_SUIT_COUNT; i++)
  42.     {
  43.         for (int j = 0; j < CARD_RANK_COUNT; j++)
  44.         {
  45.             if (g_Deck.GetCard((CARD_SUIT)i, (CARD_RANK)j)->GetCardState() == CARD_STATE_IN_DECK)
  46.                 dwNum++;
  47.         }
  48.     }
  49.  
  50.     return dwNum;
  51. }
  52.  
  53. void DestroyDeck()
  54. {
  55.     g_Deck.Clear();
  56. }
  57.  
  58. void DestroyField()
  59. {
  60.     g_Game.Clear();
  61. }
  62.  
  63. void CGameField::InitField()
  64. {
  65.     Clear();
  66.  
  67.     for (int i = 0; i < COUNT_PLAYERS; i++)
  68.     {
  69.         m_ppPlayers[i] = new CPlayer;
  70.     }
  71.  
  72.     if (COUNT_PLAYERS > 2)
  73.     {
  74.         m_ppPlayers[1]->InitPlayer(PLAYER_PLACE_RIGHT_UPPER_CORNER);
  75.  
  76.         if (COUNT_PLAYERS == 4)
  77.             m_ppPlayers[2]->InitPlayer(PLAYER_PLACE_RIGHT_BOTTOM_CORNER);
  78.     }
  79.  
  80.     m_ppPlayers[0]->InitPlayer(PLAYER_PLACE_LEFT_UPPER_CORNER);
  81.     m_ppPlayers[COUNT_PLAYERS - 1]->InitPlayer(PLAYER_PLACE_LEFT_BOTTOM_CORNER);
  82.  
  83.     if (!GetNumFreeCards())
  84.     {
  85.         m_pTrump = m_ppPlayers[COUNT_PLAYERS - 1]->GetCards().at(6 - 1);
  86.     } else {
  87.         while (!m_pTrump)
  88.         {
  89.             CARD_SUIT Suit = (CARD_SUIT)(rand() % CARD_SUIT_COUNT);
  90.             CARD_RANK Rank = (CARD_RANK)(rand() % CARD_RANK_COUNT);
  91.  
  92.             if (g_Deck.GetCard(Suit, Rank)->GetCardState() == CARD_STATE_IN_DECK)
  93.             {
  94.                 m_pTrump = const_cast<CCard *>(g_Deck.GetCard(Suit, Rank));
  95.             }
  96.         }
  97.     }
  98.  
  99.     CCard *pLowerTrump = nullptr;
  100.  
  101.     int nLayingPlayer = 0;
  102.     for (int i = 0; i < COUNT_PLAYERS; i++)
  103.     {
  104.         vector<CCard *> Cards = m_ppPlayers[i]->GetCards();
  105.  
  106.         for (int j = 0; j < m_ppPlayers[i]->GetNumCards(); j++)
  107.         {
  108.             if (Cards[j]->GetCardSuit() == m_pTrump->GetCardSuit() && (!pLowerTrump || pLowerTrump->GetCardRank() > Cards[j]->GetCardRank()))
  109.             {
  110.                 pLowerTrump = Cards[j];
  111.  
  112.                 nLayingPlayer = i;
  113.             }
  114.         }
  115.     }
  116.  
  117.     m_nCoversPlayer = (nLayingPlayer + 1) % COUNT_PLAYERS;
  118.  
  119.     if (!pLowerTrump)
  120.         m_nCoversPlayer = rand() % COUNT_PLAYERS;
  121.  
  122.     //m_nCoversPlayer = 0;
  123.  
  124.     m_ppPlayers[m_nCoversPlayer]->SetPlayerState(PLAYER_STATE_WAITING_NEXT_MOVE);
  125.  
  126.  
  127.     m_GameState = GAME_STATE_LOADED;
  128. };
  129.  
  130. void CPlayer::InitPlayer(PLAYER_PLACE const _Place)
  131. {
  132.     Clear();
  133.  
  134.     m_Place = _Place;
  135.  
  136.     m_nNumCardOnHands = 0;
  137.  
  138.     m_PlayerState = PLAYER_STATE_INITIALIZED;
  139.  
  140.     while (m_nNumCardOnHands != 6)
  141.     {
  142.         CARD_SUIT Suit = (CARD_SUIT)(rand() % CARD_SUIT_COUNT);
  143.         CARD_RANK Rank = (CARD_RANK)(rand() % CARD_RANK_COUNT);
  144.  
  145.         if (g_Deck.GetCard(Suit, Rank)->GetCardState() == CARD_STATE_IN_DECK)
  146.         {
  147.             PushCard(const_cast<CCard *>(g_Deck.GetCard(Suit, Rank)));
  148.  
  149.             m_Cards.back()->SetCardState(CARD_STATE_ON_HANDS);
  150.             m_Cards.back()->SetPlayer(this);
  151.         }
  152.     }
  153. };
  154.  
  155. // Is C1 greater than C2?
  156. bool IsGreaterCard(CCard const *const pC1, CCard const *const pC2)
  157. {
  158.     if (pC1->GetCardSuit() == g_Game.GetTrump()->GetCardSuit())
  159.     {
  160.         if (pC2->GetCardSuit() == g_Game.GetTrump()->GetCardSuit())
  161.             return pC1->GetCardRank() > pC2->GetCardRank();
  162.  
  163.         return true;
  164.     }
  165.  
  166.     if (pC2->GetCardSuit() == g_Game.GetTrump()->GetCardSuit())
  167.         return false;
  168.        
  169.     if (pC1->GetCardSuit() != pC2->GetCardSuit())
  170.         return false;
  171.        
  172.     return pC1->GetCardRank() > pC2->GetCardRank();
  173. }
  174.  
  175. void CPlayer::SortCards() const
  176. {
  177.     auto IsGreaterCardForSort = [](CCard const *const pC1, CCard const *const pC2) -> bool
  178.     {
  179.         if (pC1->GetCardSuit() == g_Game.GetTrump()->GetCardSuit())
  180.         {
  181.             if (pC2->GetCardSuit() == g_Game.GetTrump()->GetCardSuit())
  182.                 return pC1->GetCardRank() > pC2->GetCardRank();
  183.  
  184.             return true;
  185.         }
  186.  
  187.         if (pC2->GetCardSuit() == g_Game.GetTrump()->GetCardSuit())
  188.             return false;
  189.        
  190.         if (pC1->GetCardSuit() < pC2->GetCardSuit())
  191.             return true;
  192.        
  193.         if (pC1->GetCardSuit() == pC2->GetCardSuit())
  194.             return pC1->GetCardRank() > pC2->GetCardRank();
  195.  
  196.         return false;
  197.     };
  198.  
  199.     for (int i = 0; i < (int)m_Cards.size(); i++)
  200.     {
  201.         CCard const *const *ppTrueCard = &m_Cards[i];
  202.  
  203.         for (int j = i + 1; j < (int)m_Cards.size(); j++)
  204.         {
  205.             if (m_Cards[j] != m_Cards[i] && IsGreaterCardForSort(m_Cards[j], *ppTrueCard))
  206.                 ppTrueCard = &m_Cards[j];
  207.         }
  208.  
  209.         if (m_Cards[i] != *ppTrueCard)
  210.         {
  211.             CCard const *const pValue = m_Cards[i];
  212.             memcpy((void *)(&m_Cards[i]), (void *)ppTrueCard, 4);
  213.             memcpy((void *)ppTrueCard, (void *)(&pValue), 4);
  214.         }
  215.     }
  216. };
  217.  
  218. void CPlayer::DrawCards(ID3D11DeviceContext *pImmediateContext, ID3D11RenderTargetView *pRenderTargetView) const
  219. {
  220. #define Cards m_Cards
  221.     //vector<CCard *> Cards = m_Cards;
  222.     //Cards.assign(m_Cards.begin(), m_Cards.end());
  223.  
  224.     SortCards();
  225.  
  226.     static ID3D11ShaderResourceView *pSRVNull[100] = { NULL };
  227.  
  228.     CCBPerBatch *cbPerBatch = AUTGetCBPerBatch();
  229.  
  230.     // 1024, 768
  231.     if (m_Place == PLAYER_PLACE_LEFT_UPPER_CORNER)
  232.         cbPerBatch->vStart = XMFLOAT2(50.0f, 20.0f);
  233.     else if (m_Place == PLAYER_PLACE_RIGHT_UPPER_CORNER)
  234.         cbPerBatch->vStart = XMFLOAT2(400.0f, 20.0f);
  235.     else if (m_Place == PLAYER_PLACE_RIGHT_BOTTOM_CORNER)
  236.         cbPerBatch->vStart = XMFLOAT2(400.0f, 340.0f);
  237.     else
  238.         cbPerBatch->vStart = XMFLOAT2(50.0f, 340.0f);
  239.  
  240.     CCard *pOldCard = nullptr;
  241.  
  242.     cbPerBatch->vStart.x -= 30.0f;
  243.  
  244.     for (CCard *pCard : Cards)
  245.     {
  246.         if (pOldCard && pOldCard->GetCardSuit() != pCard->GetCardSuit())
  247.         {
  248.             cbPerBatch->vStart.x += 15.0f;
  249.             cbPerBatch->vStart.y += 5.0f;
  250.         }
  251.  
  252.         cbPerBatch->vStart.x += 30.0f;
  253.  
  254.         cbPerBatch->vEnd = CARD_SIZE;
  255.  
  256.         pCard->SetCardStartPos(cbPerBatch->vStart);
  257.  
  258.         //AUTSetCBPerBatch(cbPerBatch);
  259.         AUTUpdateD3DCBPerBatch(pImmediateContext);
  260.  
  261.         ID3D11ShaderResourceView *pSRV = pCard->GetSRV();
  262.         pImmediateContext->PSSetShaderResources(0, 1, &pSRV);
  263.         pImmediateContext->Draw(1, 0);
  264.         pImmediateContext->PSSetShaderResources(0, 1, pSRVNull);
  265.  
  266.         pOldCard = pCard;
  267.     }
  268. #undef Cards
  269. };
  270.  
  271. void CGameField::Render(ID3D11DeviceContext *pImmediateContext, ID3D11RenderTargetView *pRenderTargetView) const
  272. {
  273.     static ID3D11ShaderResourceView *pSRVNull[100] = { NULL };
  274.     static ID3D11RenderTargetView *pRTVNull[100] = { NULL };
  275.  
  276.     pImmediateContext->OMSetRenderTargets(1, &pRenderTargetView, NULL);
  277.  
  278.     AUTSetPShader(AUTMapIDsGet("PS_CardRenderer"), pImmediateContext);
  279.     AUTSetGShader(AUTMapIDsGet("GS_CardRenderer"), pImmediateContext);
  280.     AUTSetVShader(AUTMapIDsGet("VS_CardRenderer"), pImmediateContext);
  281.  
  282.     AUTSetPSSampler(AUTMapIDsGet("SamplerAnisotropic"), 0, pImmediateContext);
  283.  
  284.     pImmediateContext->IASetInputLayout(NULL);
  285.     pImmediateContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_POINTLIST);
  286.  
  287.     CCBPerBatch *cbPerBatch = AUTGetCBPerBatch();
  288.  
  289.     for (CCard *pCard : m_CardsOnField)
  290.     {
  291.         cbPerBatch->vStart = *pCard->GetCardStartPos();
  292.         cbPerBatch->vEnd = CARD_SIZE;
  293.         AUTUpdateD3DCBPerBatch(pImmediateContext);
  294.  
  295.         ID3D11ShaderResourceView *pSRV = pCard->GetSRV();
  296.         pImmediateContext->PSSetShaderResources(0, 1, &pSRV);
  297.         pImmediateContext->Draw(1, 0);
  298.         pImmediateContext->PSSetShaderResources(0, 1, pSRVNull);
  299.     }
  300.  
  301.     for (CCard *pCard : m_CoverCardsOnField)
  302.     {
  303.         cbPerBatch->vStart = *pCard->GetCardStartPos();
  304.         cbPerBatch->vEnd = CARD_SIZE;
  305.         AUTUpdateD3DCBPerBatch(pImmediateContext);
  306.  
  307.         ID3D11ShaderResourceView *pSRV = pCard->GetSRV();
  308.         pImmediateContext->PSSetShaderResources(0, 1, &pSRV);
  309.         pImmediateContext->Draw(1, 0);
  310.         pImmediateContext->PSSetShaderResources(0, 1, pSRVNull);
  311.     }
  312.  
  313.     for (int i = 0; i < COUNT_PLAYERS; i++)
  314.     {
  315.         m_ppPlayers[i]->DrawCards(pImmediateContext, pRenderTargetView);
  316.     }
  317.  
  318.     pImmediateContext->PSSetShaderResources(0, 1, pSRVNull);
  319.     pImmediateContext->OMSetRenderTargets(1, pRTVNull, NULL);
  320.     pImmediateContext->PSSetShader(NULL, NULL, 0);
  321.     pImmediateContext->GSSetShader(NULL, NULL, 0);
  322.     pImmediateContext->VSSetShader(NULL, NULL, 0);
  323. };
  324.  
  325. /*
  326. enum PLAYER_STATE
  327. {
  328.     PLAYER_STATE_NON_INITIALIZED = 0,
  329.     PLAYER_STATE_INITIALIZED,
  330.     PLAYER_STATE_CHOOSING_CARD, // if choosing finished, goto PLAYER_STATE_WAITING_NEXT_MOVE
  331.     PLAYER_STATE_COVERING_CARD, // if covering finished, goto PLAYER_STATE_WAITING_NEXT_MOVE
  332.     PLAYER_STATE_WAITING_NEXT_MOVE,
  333.     PLAYER_STATE_TAKING_CARDS_FROM_FIELD, // if taking finished, goto PLAYER_STATE_WAITING_NEXT_MOVE
  334.     PLAYER_STATE_GETTING_CARDS_FROM_DECK, // if getting finished, goto PLAYER_STATE_WAITING_NEXT_MOVE
  335.     PLAYER_STATE_LEFT
  336. };
  337.  
  338. enum GAME_STATE
  339. {
  340.     GAME_STATE_NON_LOADED = 0,
  341.     GAME_STATE_LOADED,
  342.     GAME_STATE_PUSHING_FIRST_CARD, // if pushing finished, goto GAME_STATE_PUSHED_FIRST_CARD
  343.     GAME_STATE_PUSHED_FIRST_CARD,
  344.     GAME_STATE_ADDING_CARD, // if adding finished, goto GAME_STATE_ADDED_CARD
  345.     GAME_STATE_ADDED_CARD,
  346.     GAME_STATE_COVERING_CARD, // if covering finished, goto GAME_STATE_COVERED_CARD
  347.     GAME_STATE_COVERED_CARD,
  348.     GAME_STATE_TAKING_CARDS_FROM_FIELD, // if taking finished, goto GAME_STATE_TAKED_CARDS_FROM_FIELD
  349.     GAME_STATE_TAKED_CARDS_FROM_FIELD,
  350.     GAME_STATE_GETTING_CARDS_FROM_DECK, // if getting finished, goto GAME_STATE_GETTED_CARDS_FROM_DECK
  351.     GAME_STATE_GETTED_CARDS_FROM_DECK,
  352.     GAME_STATE_FINISH
  353. };
  354. */
  355.  
  356. void CGameField::GameProcess()
  357. {
  358.     /*
  359.     static DWORD dwCount = 0;
  360.     if (GAME_STATE_ADDED_CARD == m_GameState)
  361.     {
  362.         if (dwCount < 500)
  363.         {
  364.             dwCount++;
  365.             return;
  366.         }
  367.     }
  368.     */
  369.  
  370.     switch(m_GameState)
  371.     {
  372.     case GAME_STATE_LOADED:
  373.         {
  374.             int nPushingCardPlayer = (m_nCoversPlayer - 1);
  375.  
  376.             if (nPushingCardPlayer < 0)
  377.                 nPushingCardPlayer = COUNT_PLAYERS - 1;
  378.  
  379.             nPushingCardPlayer %= COUNT_PLAYERS;
  380.  
  381.             CPlayer *const pPlayer = m_ppPlayers[nPushingCardPlayer];
  382.             CCard const *const pChoosedCard = pPlayer->GetChoosedCard();
  383.             CCard *pMinCard = nullptr;
  384.  
  385.             //pPlayer->SetPlayerState(PLAYER_STATE_CHOOSING_CARD);
  386.             //m_GameState = GAME_STATE_ADDING_CARD;
  387.  
  388.             if (nPushingCardPlayer == (COUNT_PLAYERS - 1) && pPlayer->GetPlayerState() != PLAYER_STATE_CHOOSED_CARD)
  389.                 break;
  390.  
  391.             if (nPushingCardPlayer != COUNT_PLAYERS - 1)
  392.             {
  393.                 vector<CCard *> const Cards = pPlayer->GetCards();
  394.  
  395.                 for (CCard *pCard : Cards)
  396.                 {
  397.                     if (pCard->GetCardSuit() == m_pTrump->GetCardSuit())
  398.                     {
  399.                         pMinCard = pCard;
  400.                         break;
  401.                     }
  402.                 }
  403.                
  404.                 if (!pMinCard)
  405.                 {
  406.                     pMinCard = Cards[0];
  407.                     for (CCard *pCard : Cards)
  408.                     {
  409.                         if (pCard->GetCardRank() > pMinCard->GetCardRank())
  410.                             pMinCard = pCard;
  411.                     }
  412.                 } else {
  413.                     for (CCard *pCard : Cards)
  414.                     {
  415.                         if (pCard->GetCardRank() < pMinCard->GetCardRank() && pCard->GetCardSuit() != m_pTrump->GetCardSuit())
  416.                             pMinCard = pCard;
  417.                     }
  418.                 }
  419.             } else {
  420.                 pMinCard = pPlayer->GetChoosedCard();
  421.             }
  422.  
  423.             pMinCard->SetPlayer(nullptr);
  424.             pMinCard->SetCardState(CARD_STATE_ON_FIELD);
  425.             pMinCard->SetCardStartPos(XMFLOAT2(200.0f + m_nLastCoveredCard * 10.0f, 180.0f + m_nLastCoveredCard * 1.0f));
  426.  
  427.             m_CardsOnField.push_back(pMinCard);
  428.  
  429.             pPlayer->RemoveCard(pMinCard);
  430.    
  431.             pPlayer->SetPlayerState(PLAYER_STATE_WAITING_NEXT_MOVE);
  432.             m_ppPlayers[m_nCoversPlayer]->SetPlayerState(PLAYER_STATE_COVERING_CARD);
  433.  
  434.             //m_nLastCoveredCard++;
  435.             m_nLastCoveredCard = 0;
  436.  
  437.             m_GameState = GAME_STATE_ADDED_CARD;
  438.  
  439.             break;
  440.         }
  441.     case GAME_STATE_ADDED_CARD:
  442.         {
  443.             CPlayer *const pPlayer = m_ppPlayers[m_nCoversPlayer];
  444.             CCard *pChoosedCard = pPlayer->GetChoosedCard();
  445.  
  446.             // выбираем карту, которой будем покрывать карту, лежащую на столе
  447.             if (m_nCoversPlayer != (COUNT_PLAYERS - 1) && pPlayer->GetPlayerState() != PLAYER_STATE_TAKING_CARDS_FROM_FIELD)
  448.             {
  449.                 for (CCard *pCard : pPlayer->GetCards())
  450.                 {
  451.                     if (pCard->GetCardSuit() == m_pTrump->GetCardSuit() &&
  452.                         m_CardsOnField[m_nLastCoveredCard]->GetCardSuit() != m_pTrump->GetCardSuit() &&
  453.                         m_CardsOnField[m_nLastCoveredCard]->GetCardRank() == pCard->GetCardRank())
  454.                     {
  455.                         pChoosedCard = pCard;
  456.                         break;
  457.                     }
  458.  
  459.                     if (IsGreaterCard(pCard, m_CardsOnField[m_nLastCoveredCard]) && (!pChoosedCard || IsGreaterCard(pChoosedCard, pCard)))
  460.                         pChoosedCard = pCard;
  461.                 }
  462.  
  463.                 if (!pChoosedCard)
  464.                 {
  465.                     pPlayer->SetPlayerState(PLAYER_STATE_TAKING_CARDS_FROM_FIELD);
  466.                     break;
  467.                 }
  468.  
  469.                 pChoosedCard->SetPlayer(nullptr);
  470.             }
  471.  
  472.             // если это игрок и он выбрал карту
  473.             // если это любой чувак и он уже покрывает
  474.             if (m_nCoversPlayer == (COUNT_PLAYERS - 1) && pPlayer->GetPlayerState() == PLAYER_STATE_CHOOSED_CARD ||
  475.                 m_nCoversPlayer != (COUNT_PLAYERS - 1) && pPlayer->GetPlayerState() == PLAYER_STATE_COVERING_CARD)
  476.             {
  477.                 if (IsGreaterCard(pChoosedCard, m_CardsOnField[m_nLastCoveredCard]))
  478.                 {
  479.                     pChoosedCard->SetCardState(CARD_STATE_ON_FIELD);
  480.                     pChoosedCard->SetCardStartPos(XMFLOAT2(215.0f + m_nLastCoveredCard * 10.0f, 200.0f + m_nLastCoveredCard * 1.0f));
  481.  
  482.                     m_CoverCardsOnField.push_back(pChoosedCard);
  483.  
  484.                     pPlayer->RemoveCard(pChoosedCard);
  485.    
  486.                     pPlayer->SetPlayerState(PLAYER_STATE_WAITING_NEXT_MOVE);
  487.  
  488.                     m_nLastCoveredCard = 0;
  489.                     //m_nLastCoveredCard++;
  490.  
  491.                     m_GameState = GAME_STATE_COVERED_CARD;
  492.                 } else {
  493.                     class CFakeClass {};
  494.  
  495.                     typedef void (CFakeClass::*Func)(PLAYER_STATE);
  496.                     Func pFunc = (Func)&CPlayer::SetPlayerState;
  497.  
  498.                     void *pPl = const_cast<void *>(pChoosedCard->GetPlayer());
  499.  
  500.                     _asm
  501.                     {
  502.                         // this pointer
  503.                         mov ecx, pPl
  504.                         push PLAYER_STATE_COVERING_CARD
  505.                         call pFunc
  506.                     };
  507.                    
  508.                     ((CFakeClass *)pPl->*pFunc)(PLAYER_STATE_COVERING_CARD);
  509.  
  510.                     pChoosedCard = nullptr;
  511.                 }
  512.             }
  513.             else if (pPlayer->GetPlayerState() == PLAYER_STATE_TAKING_CARDS_FROM_FIELD)
  514.             {
  515.                 for (CCard *pCard : m_CardsOnField)
  516.                 {
  517.                     pCard->SetCardState(CARD_STATE_ON_HANDS);
  518.                     pPlayer->PushCard(pCard);
  519.                     pCard = nullptr;
  520.                 }
  521.  
  522.                 m_CardsOnField.clear();
  523.  
  524.                 for (CCard *pCard : m_CoverCardsOnField)
  525.                 {
  526.                     pCard->SetCardState(CARD_STATE_ON_HANDS);
  527.                     pPlayer->PushCard(pCard);
  528.                     pCard = nullptr;
  529.                 }
  530.  
  531.                 m_nLastCoveredCard = 0;
  532.  
  533.                 m_CoverCardsOnField.clear();
  534.  
  535.                 m_GameState = GAME_STATE_TAKED_CARDS_FROM_FIELD;
  536.  
  537.                 pPlayer->SetPlayerState(PLAYER_STATE_WAITING_NEXT_MOVE);
  538.             }
  539.  
  540.             break;
  541.         }
  542.     case GAME_STATE_TAKED_CARDS_FROM_FIELD:
  543.         {
  544.             m_GameState = GAME_STATE_GETTED_CARDS_FROM_DECK;
  545.         break;
  546.         }
  547.     default:
  548.         break;
  549.     }
  550. }
  551.  
  552. void CGameField::ProcessPlayerInput(int const _nPlayerID, XMFLOAT2 const &_vPos, bool const _bTaking, bool const _bNextMove)
  553. {
  554.     return m_ppPlayers[_nPlayerID]->ProcessPlayerInput(_vPos, _bTaking, _bNextMove);
  555. }
  556.  
  557. void ProcessPlayerInput(XMFLOAT2 const &_vPos, bool const _bTaking, bool const _bNextMove)
  558. {
  559.     return g_Game.ProcessPlayerInput(COUNT_PLAYERS - 1, _vPos, _bTaking, _bNextMove);
  560. }
  561.  
  562. void CPlayer::ProcessPlayerInput(XMFLOAT2 const &_vPos, bool const _bTaking, bool const _bNextMove)
  563. {
  564.     if (_bTaking)
  565.         m_PlayerState = PLAYER_STATE_TAKING_CARDS_FROM_FIELD;
  566.  
  567.     if (_bNextMove)
  568.         m_PlayerState = PLAYER_STATE_WAITING_NEXT_MOVE;
  569.  
  570.     if (m_PlayerState == PLAYER_STATE_CHOOSED_CARD)
  571.         return;
  572.  
  573.     //SortCards();
  574.  
  575.     for (int i = (int)m_Cards.size() - 1; i >= 0; i--)
  576.     {
  577.         CCard *const pCard = m_Cards[i];
  578.         XMFLOAT2 const *const vStartPos = pCard->GetCardStartPos();
  579.         XMFLOAT2 vEndPos = *vStartPos;
  580.         XMStoreFloat2(&vEndPos, XMVectorAdd(XMLoadFloat2(&vEndPos), XMLoadFloat2(pCard->GetCardEndPos())));
  581.  
  582.         if (vStartPos->x <= _vPos.x && vEndPos.x >= _vPos.x && vStartPos->y <= _vPos.y && vEndPos.y >= _vPos.y)
  583.         {
  584.             m_PlayerState = PLAYER_STATE_CHOOSED_CARD;
  585.             m_pChoosedCard = pCard;
  586.  
  587.             return;
  588.         }
  589.     }
  590. }
Advertisement
Add Comment
Please, Sign In to add comment