bool OutdoorPvPBT::Update(uint32 diff) { OutdoorPvP::Update(diff); if(m_FirstLoad == false) { if(m_LastWin == ALLIANCE) sLog->outInfo(LOG_FILTER_GENERAL, "|cffEE9A00A[OutdoorPvPBT]: Borean Tundra has started! Last Winner: Alliance(%u)", ALLIANCE); else if(m_LastWin == HORDE) sLog->outInfo(LOG_FILTER_GENERAL, "|cffEE9A00A[OutdoorPvPBT]: Borean Tundra has started! Last Winner: Horde(%u)", HORDE); else if(m_LastWin == 0) sLog->outInfo(LOG_FILTER_GENERAL, "|cffEE9A00A[OutdoorPvPBT]: Borean Tundra has started! Last Winner: Neutral(0)"); m_FirstLoad = true; } if(m_ally_gathered <= 50 && limit_A == 0) { IS_ABLE_TO_SHOW_MESSAGE = true; // We allow the message to pass IS_RESOURCE_MESSAGE_A = true; // We allow the message to be shown limit_A = 1; // We set this to one to stop the spamming PlaySounds(false); } else if(m_horde_gathered <= 50 && limit_H == 0) { IS_ABLE_TO_SHOW_MESSAGE = true; // We allow the message to pass IS_RESOURCE_MESSAGE_H = true; // We allow the message to be shown limit_H = 1; // Same as above PlaySounds(true); } else if(m_ally_gathered <= 0 && limit_A == 1) { IS_ABLE_TO_SHOW_MESSAGE = true; // We allow the message to pass IS_RESOURCE_MESSAGE_A = true; // We allow the message to be shown limit_A = 2; PlaySounds(false); } else if(m_horde_gathered <= 0 && limit_H == 1) { IS_ABLE_TO_SHOW_MESSAGE = true; // We allow the message to pass IS_RESOURCE_MESSAGE_H = true; // We allow the message to be shown limit_H = 2; PlaySounds(true); } else if(m_ally_gathered <= 300 && limit_resources_message_A == 0) { IS_ABLE_TO_SHOW_MESSAGE = true; limit_resources_message_A = 1; PlaySounds(false); } else if(m_horde_gathered <= 300 && limit_resources_message_H == 0) { IS_ABLE_TO_SHOW_MESSAGE = true; limit_resources_message_H = 1; PlaySounds(true); } else if(m_ally_gathered <= 200 && limit_resources_message_A == 1) { IS_ABLE_TO_SHOW_MESSAGE = true; limit_resources_message_A = 2; PlaySounds(false); } else if(m_horde_gathered <= 200 && limit_resources_message_H == 1) { IS_ABLE_TO_SHOW_MESSAGE = true; limit_resources_message_H = 2; PlaySounds(true); } else if(m_ally_gathered <= 100 && limit_resources_message_A == 2) { IS_ABLE_TO_SHOW_MESSAGE = true; limit_resources_message_A = 3; PlaySounds(false); } else if(m_horde_gathered <= 100 && limit_resources_message_H == 2) { IS_ABLE_TO_SHOW_MESSAGE = true; limit_resources_message_H = 3; PlaySounds(true); } if(IS_ABLE_TO_SHOW_MESSAGE == true) // This will limit the spam { SessionMap m_sessions = sWorld->GetAllSessions(); for(SessionMap::iterator itr = m_sessions.begin(); itr != m_sessions.end(); ++itr) // We're searching for all the sessions(Players) { if(!itr->second || !itr->second->GetPlayer() || !itr->second->GetPlayer()->IsInWorld() || itr->second->GetPlayer()->GetZoneId() != 3537) continue; if(itr->second->GetPlayer()->GetZoneId() == 3537) { char msg[250]; if(limit_resources_message_A == 1 || limit_resources_message_A == 2 || limit_resources_message_A == 3) { snprintf(msg, 250, "|cffEE9A00A[Borean Tundra Defense]: Alliance has %u resources remaining!", m_ally_gathered); itr->second->GetPlayer()->MonsterTextEmote(msg, itr->second->GetPlayer()->GetGUID()); } else if(limit_resources_message_H == 1 || limit_resources_message_H == 2 || limit_resources_message_H == 3) { snprintf(msg, 250, "|cffEE9A00A[Borean Tundra Defense]: Horde has %u resources remaining!", m_horde_gathered); itr->second->GetPlayer()->MonsterTextEmote(msg, itr->second->GetPlayer()->GetGUID()); } if(IS_RESOURCE_MESSAGE_A == true) { if(limit_A == 1) { snprintf(msg, 250, "|cffEE9A00A[Borean Tundra Defense]: Alliance has %u resources remaining!", m_ally_gathered); itr->second->GetPlayer()->MonsterTextEmote(msg, itr->second->GetPlayer()->GetGUID()); IS_RESOURCE_MESSAGE_A = false; // Reset } else if(limit_A == 2) { itr->second->GetPlayer()->MonsterTextEmote("|cffEE9A00A[Borean Tundra Defense]: Alliance has 0 resources! Horde wins!", itr->second->GetPlayer()->GetGUID()); HandleWinMessage("|cffEE9A00AHorde Wins!"); HandleRewards(itr->second->GetPlayer(), 1500, true, false, false); switch(itr->second->GetPlayer()->GetTeam()) { case ALLIANCE: HandleBuffs(itr->second->GetPlayer(), true); break; case HORDE: HandleBuffs(itr->second->GetPlayer(), false); break; } m_LastWin = HORDE; IS_RESOURCE_MESSAGE_A = false; // Reset } } else if(IS_RESOURCE_MESSAGE_H == true) { if(limit_H == 1) { snprintf(msg, 250, "|cffEE9A00A[Borean Tundra Defense]: Horde has %u resources remaining!", m_horde_gathered); itr->second->GetPlayer()->MonsterTextEmote(msg, itr->second->GetPlayer()->GetGUID()); IS_RESOURCE_MESSAGE_H = false; // Reset } else if(limit_H == 2) { itr->second->GetPlayer()->MonsterTextEmote("|cffEE9A00A[Borean Tundra Defense]: Horde has 0 resources! Alliance wins!", itr->second->GetPlayer()->GetGUID()); HandleWinMessage("Alliance Wins!"); HandleRewards(itr->second->GetPlayer(), 1500, true, false, false); switch(itr->second->GetPlayer()->GetTeam()) { case ALLIANCE: HandleBuffs(itr->second->GetPlayer(), false); break; case HORDE: HandleBuffs(itr->second->GetPlayer(), true); break; } m_LastWin = ALLIANCE; IS_RESOURCE_MESSAGE_H = false; // Reset } } } else { // Don't send anything } } } IS_ABLE_TO_SHOW_MESSAGE = false; // Reset return false; }
void CGameView::OnTimer(UINT_PTR nIDEvent) { // 심장소리 음악 if (!gv_min && gv_sec < 10 && !gv_timeDV){ // 분이 0이고 초가 10초 미만일 때 시간제한 음악 켬 StopSounds (gv_bgDV) ; PlaySounds (gv_timeDV) ; } CClientDC dc (this) ; CRect rect ; GetClientRect (&rect) ; CFont myFont, *pOldFont ; CString str; // Text 설정 Part myFont.CreateFont (25, 0, 0, 0, FW_BOLD, true, false, false, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, gv_font) ; pOldFont =dc.SelectObject (&myFont) ; dc.SetBkColor (gv_bgColor) ; // 글자의 배경은 바탕과 같이 dc.SetTextColor (0x00FFFFFF & ~gv_bgColor) ; // 글자 색을 바탕화면의 반대 색으로 // 시간에 따른 출력부 if (!gv_scoreTF) { if (gv_min < 10 && gv_min) gv_minStr.Format (_T(" 0%d"), gv_min) ; else if (!gv_min) gv_minStr.Format (_T (" 00")) ; else gv_minStr.Format (_T (" %d"), gv_min) ; if (gv_sec < 10 && gv_sec) gv_secStr.Format (_T("0%d"), gv_sec) ; else if (!gv_sec) gv_secStr.Format (_T ("00")) ; else gv_secStr.Format (_T ("%d"), gv_sec) ; if (gv_csec < 10 && gv_csec) gv_csecStr.Format (_T("0%d"), gv_csec) ; else if (!gv_csec) gv_csecStr.Format (_T ("00")) ; else gv_csecStr.Format (_T ("%d"), gv_csec) ; str.Format (_T (" %s : %s : %s "), gv_minStr, gv_secStr, gv_csecStr) ; dc.SetTextAlign (TA_RIGHT) ; dc.TextOutW (rect.Width () -20, rect.top +45, str) ; // 초계산 if (--gv_csec < 0) { if (!gv_min && !gv_sec) OnSuccess () ; gv_csec =99 ; gv_sec-- ; pTimeDlg ->timeCtrl.StepIt () ; // 초가 줄때마다 실행 } if (gv_sec < 0 && gv_min) { gv_sec =59 ; gv_min-- ; } // 카운트 출력 str.Format (_T (" CLICK COUNT : %u "), gv_cnt) ; dc.TextOutW (rect.Width () -20, rect.top +20, str) ; // 점수 출력 dc.SetTextAlign (TA_CENTER) ; str.Format (_T (" Score : %u "), gv_point) ; dc.TextOutW (rect.Width () /2, rect.top +25, str) ; } else { while (gv_tempMin-- > 0) gv_tempSec +=60 ; // 분이 남아 있다면 초로 옮김 // 시간 감소 및 포인트 증가 if (gv_tempSec > 0) { // 초가 0보다 클때까지 gv_point+=3 ; gv_tempSec-- ; // 점수는 3증가 초는 1증감 pTimeDlg ->timeCtrl.StepIt () ; dc.SetTextAlign (TA_CENTER) ; str.Format (_T (" Score :%u "), gv_point) ; dc.TextOutW (rect.Width () /2 , rect.top +25, str) ; } } dc.SelectObject (myFont) ; myFont.DeleteObject () ; CView::OnTimer(nIDEvent); }
void CGameView::OnDraw(CDC* pDC) { CGameDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; //**** 배경색 ************* CBrush brush (gv_bgColor); CBrush *pOldB =pDC ->SelectObject (&brush) ; CRect rect; GetClientRect(&rect); pDC->Rectangle(rect); pDC->SelectObject(pOldB); //*********************** // 랜덤하지 않으면 랜덤함수 호출 if(pDoc->gd_bRandom) pDoc->OnRandom(); int nCount = 0; go: CDC memDC; CBitmap* pOldBmp; if(isInit){ // Font 설정 Part CFont myFont, *pOldFont ; myFont.CreateFont (40, 0, 0, 0, FW_BOLD, true, false, false, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, gv_font) ; pOldFont =pDC->SelectObject (&myFont) ; // Text 설정 Part CString str =_T ("HINT") ; pDC->SetBkColor (gv_bgColor) ; // 글자의 배경은 바탕과 같이 pDC->SetTextColor (0x00FFFFFF & ~gv_bgColor) ; // 글자 색을 바탕화면의 반대 색으로 pDC->SetTextAlign (TA_CENTER) ; // 가운데 출력 pDC->TextOutW (rect.Width () /2, rect.top +20, str) ; // 보여주는 파트 pDoc->gd_nBmpFirstID = pDoc->gd_nBmpSecondID = 0 ; // 비트맵의 이름을 초기화 pDoc->gd_bMouse = FALSE; for(int i=0;i<pDoc->gd_nRow;i++) for(int j=0;j<pDoc->gd_nCol;j++) pDoc->gd_bShow[i][j] = TRUE; } memDC.CreateCompatibleDC(pDC); for(int n=0;n<pDoc->gd_nRow;n++){ for(int m=0;m<pDoc->gd_nCol;m++){ // 이미지 출력 int imgStartPtrX = rect.right/(pDoc->gd_nCol+2); int imgStartPtrY = rect.bottom/(pDoc->gd_nRow+2); /* 이미지 출력 */ if(pDoc->gd_bShow[n][m]){ pDoc->gd_bmp[n][m].LoadBitmapW(IDB_BITMAP1+pDoc->gd_nRnd[nCount]); pOldBmp = memDC.SelectObject(&pDoc->gd_bmp[n][m]); pDC->StretchBlt( imgStartPtrX*(m+1), imgStartPtrY*(n+1), imgStartPtrX, imgStartPtrY, &memDC, 0, 0, pDoc->gd_bmCell.cx, pDoc->gd_bmCell.cy, SRCCOPY); pDoc->gd_bmp[n][m].DeleteObject(); } /* 커버 출력 */ if(!pDoc->gd_bShow[n][m]){ CBitmap bmp; bmp.LoadBitmapW(IDB_BITMAP1); // 커버 출력 pOldBmp = memDC.SelectObject(&bmp); pDC->StretchBlt( imgStartPtrX*(m+1), imgStartPtrY*(n+1), imgStartPtrX, imgStartPtrY, &memDC, 0, 0, pDoc->gd_bmCell.cx, pDoc->gd_bmCell.cy, SRCCOPY); bmp.DeleteObject(); } nCount++; } } memDC.SelectObject(pOldBmp); pDoc->ResizeWindow(); // 게임이 시작된 시점에서의 처리 if(isInit){ isInit = FALSE; for(int i=0;i<pDoc->gd_nRow;i++) for(int j=0;j<pDoc->gd_nCol;j++) pDoc->gd_bShow[i][j] = FALSE; // 음악 디바이스 열기 gv_timeDV =OpenSounds (_T ("C:\\image\\심장소리.mp3")) ; gv_successDV =OpenSounds (_T ("C:\\image\\박수갈채.mp3")) ; gv_failDV =OpenSounds (_T ("C:\\image\\언더테이커_등장.mp3")) ; gv_bgDV =OpenSounds (_T ("C:\\image\\Terranigma-Light_Side_Field.mp3")) ; // 타임바 범위 정의 gv_timeUpper = gv_min*60 + gv_sec; pTimeDlg ->timeCtrl.SetRange32 (0, gv_timeUpper) ; // 범위 pTimeDlg ->timeCtrl.SetPos (gv_min*60 +gv_sec) ; // 초기위치 PlaySound (L"C:\\image\\즐거운시간되십시오.wav", NULL, SND_SYNC) ; // Hint time int time; if(gv_lev == _T("초급")) time = 600; else if(gv_lev == _T("중급")) time = 1000; else time = 1800; pTimeDlg ->ShowWindow (SW_SHOW) ; // 모달리스 시작 Sleep(time); pDC ->TextOutW (rect.Width () /2, rect.top +20, _T (" ")) ; PlaySounds (gv_bgDV) ; // 슬립 끝나고 배경음 SetTimer (true, 1, NULL) ; goto go; } }
// 성공했을때 void CGameView::OnSuccess(void) { // 랭크 기록 여부 KillTimer (true) ; // 메세지 박스를 선택 안해도 시간이 흐르지 않도록 int res; StopSounds (gv_bgDV) ; StopSounds (gv_timeDV) ; // 시간이 지나거나 성공하면 음악을 끔 if(gv_sec != 0){ PlaySounds (gv_successDV) ; gv_scoreTF =!gv_scoreTF ; // 스코어 타이머 가동 gv_tempMin =gv_min ; gv_tempSec =gv_sec ; SetTimer (true, 40, NULL) ; // 점수에 남은 시간에 대한 포인트를 더한다. res =AfxMessageBox (_T ("축하드립니다! 랭크를 기록 하시겠습니까?"), MB_YESNO) ; // 기록 할 때 if (res == IDYES) { CRankNameDlg dlgName ; dlgName.DoModal () ; CRankDlg *mem =new CRankDlg (dlgName.name, gv_minStr, gv_secStr, gv_csecStr, gv_cnt, gv_lev, gv_rank, gv_point) ; mem ->DoModal () ; } } else{ PlaySounds (gv_failDV) ; res =AfxMessageBox (_T ("안타깝네요. 다시 하시겠습니까?"), MB_YESNO) ; gv_TF =true ; // 재시작을 다시 묻지 않기 위해 StopSounds (gv_failDV) ; // 대화상자를 닫으면 음악을 끄게한다. } // 재시작 여부 if(gv_TF == false){ // 게임 끝내면 gv_TF는 원래 값으로 되돌아옴 KillTimer (true) ; gv_scoreTF =!gv_scoreTF ; // 스코어 타이머 해제 StopSounds (gv_successDV) ; // 대화상자가 뜨기전 음악을 끈다. res = AfxMessageBox(_T("다시 시작하시겠습니까?"), MB_YESNO); } if(res == IDYES){ gv_cnt = gv_point = gv_min = 0 ; gv_csec =100 ; CGameDoc* pDoc = GetDocument(); gv_sec = pDoc->gd_time; pDoc->gd_bRandom = TRUE; // 랜덤하게 그림의 ID변경 for(int n=0;n<pDoc->gd_nRow;n++) for(int m=0;m<pDoc->gd_nCol;m++) pDoc->gd_bShow[n][m] = FALSE; // 아무 그림도 선택하지 않은것으로 인식하기 위한 초기화 pDoc->gd_nBmpFirstID = pDoc->gd_nBmpSecondID = 0 ; pDoc->gd_bMouse = FALSE; gv_nMatchCount = 0; isInit = TRUE; Invalidate(); } else{ // 다시 하지 않으면 종료 PlaySound (L"C:\\image\\벌써가게흐흥.wav", NULL, SND_SYNC) ; PostMessageW(WM_QUIT); } }