BOOL SeekToTrackAndHold( IN INT cdrom, IN INT tindex ) /*++ Routine Description: Seek to specified track and enter hold state. Arguments: cdrom - index into gDevices array, specifies which CDROM device to access track - track on audio cd to seek to. Return Value: TRUE if successful, FALSE if not --*/ { DWORD status; CDROM_SEEK_AUDIO_MSF sam; sam.M = TRACK_M(cdrom,tindex); sam.S = TRACK_S(cdrom,tindex); sam.F = TRACK_F(cdrom,tindex); status = SeekCdrom( gDevices[ cdrom ]->hCd, &sam ); CheckStatus( "SeekToTrackAndHold", status, cdrom ); if (status == ERROR_SUCCESS) { ValidatePosition( cdrom ); } return( status==ERROR_SUCCESS ); }
///////////////////////////////////////////////////////////////////////////////////////////////////////////// // CalcAnimatedObjectBound: calculate bounds encompassing all vertex positions for given animation void CModel::CalcAnimatedObjectBounds(CSkeletonAnimDef* anim, CBoundingBoxAligned& result) { result.SetEmpty(); // Set the current animation on which to perform calculations (if it's necessary) if (anim != m_Anim->m_AnimDef) { CSkeletonAnim dummyanim; dummyanim.m_AnimDef=anim; if (!SetAnimation(&dummyanim)) return; } size_t numverts=m_pModelDef->GetNumVertices(); SModelVertex* verts=m_pModelDef->GetVertices(); // Remove any transformations, so that we calculate the bounding box // at the origin. The box is later re-transformed onto the object, without // having to recalculate the size of the box. CMatrix3D transform, oldtransform = GetTransform(); CModelAbstract* oldparent = m_Parent; m_Parent = 0; transform.SetIdentity(); CRenderableObject::SetTransform(transform); // Following seems to stomp over the current animation time - which, unsurprisingly, // introduces artefacts in the currently playing animation. Save it here and restore it // at the end. float AnimTime = m_AnimTime; // iterate through every frame of the animation for (size_t j=0;j<anim->GetNumFrames();j++) { m_PositionValid = false; ValidatePosition(); // extend bounds by vertex positions at the frame for (size_t i=0;i<numverts;i++) { result += CModelDef::SkinPoint(verts[i], GetAnimatedBoneMatrices()); } // advance to next frame m_AnimTime += anim->GetFrameTime(); } m_PositionValid = false; m_Parent = oldparent; SetTransform(oldtransform); m_AnimTime = AnimTime; }
BOOL ResumeTheCdromDrive( IN INT cdrom ) /*++ Routine Description: Tell the cdrom device to resume playing Arguments: cdrom - index into gDevices array, specifies which CDROM device to access Return Value: TRUE if resume was successful, FALSE if not --*/ { DWORD status; status = ResumeCdrom( gDevices[ cdrom ]->hCd ); CheckStatus( "ResumeCdrom", status, cdrom ); if (status==ERROR_NOT_READY) NoMediaUpdate( cdrom ); else ValidatePosition( cdrom ); return( status==ERROR_SUCCESS ); }
///////////////////////////////////////////////////////////////////////////////////////////////////////////// // CalcBound: calculate the world space bounds of this model void CModel::CalcBounds() { // Need to calculate the object bounds first, if that hasn't already been done if (! (m_Anim && m_Anim->m_AnimDef)) { if (m_ObjectBounds.IsEmpty()) CalcStaticObjectBounds(); } else { if (m_Anim->m_ObjectBounds.IsEmpty()) CalcAnimatedObjectBounds(m_Anim->m_AnimDef, m_Anim->m_ObjectBounds); ENSURE(! m_Anim->m_ObjectBounds.IsEmpty()); // (if this happens, it'll be recalculating the bounds every time) m_ObjectBounds = m_Anim->m_ObjectBounds; } // Ensure the transform is set correctly before we use it ValidatePosition(); // Now transform the object-space bounds to world-space bounds m_ObjectBounds.Transform(GetTransform(), m_WorldBounds); }
void Window::OnDragMove(const IntVector2& position, const IntVector2& screenPosition, int buttons, int qualifiers, Cursor* cursor) { if (dragMode_ == DRAG_NONE) return; IntVector2 delta = screenPosition - dragBeginCursor_; const IntVector2& position_ = GetPosition(); const IntVector2& size_ = GetSize(); const IntVector2& minSize_ = GetMinSize(); const IntVector2& maxSize_ = GetMaxSize(); switch (dragMode_) { case DRAG_MOVE: SetPosition(dragBeginPosition_ + delta); break; case DRAG_RESIZE_TOPLEFT: SetPosition(Clamp(dragBeginPosition_.x_ + delta.x_, position_.x_ - (maxSize_.x_ - size_.x_), position_.x_ + (size_.x_ - minSize_.x_)), Clamp(dragBeginPosition_.y_ + delta.y_, position_.y_ - (maxSize_.y_ - size_.y_), position_.y_ + (size_.y_ - minSize_.y_))); SetSize(dragBeginSize_ - delta); break; case DRAG_RESIZE_TOP: SetPosition(dragBeginPosition_.x_, Clamp(dragBeginPosition_.y_ + delta.y_, position_.y_ - (maxSize_.y_ - size_.y_), position_.y_ + (size_.y_ - minSize_.y_))); SetSize(dragBeginSize_.x_, dragBeginSize_.y_ - delta.y_); break; case DRAG_RESIZE_TOPRIGHT: SetPosition(dragBeginPosition_.x_, dragBeginPosition_.y_ + delta.y_); SetSize(dragBeginSize_.x_ + delta.x_, dragBeginSize_.y_ - delta.y_); break; case DRAG_RESIZE_RIGHT: SetSize(dragBeginSize_.x_ + delta.x_, dragBeginSize_.y_); break; case DRAG_RESIZE_BOTTOMRIGHT: SetSize(dragBeginSize_ + delta); break; case DRAG_RESIZE_BOTTOM: SetSize(dragBeginSize_.x_, dragBeginSize_.y_ + delta.y_); break; case DRAG_RESIZE_BOTTOMLEFT: SetPosition(Clamp(dragBeginPosition_.x_ + delta.x_, position_.x_ - (maxSize_.x_ - size_.x_), position_.x_ + (size_.x_ - minSize_.x_)), dragBeginPosition_.y_); SetSize(dragBeginSize_.x_ - delta.x_, dragBeginSize_.y_ + delta.y_); break; case DRAG_RESIZE_LEFT: SetPosition(Clamp(dragBeginPosition_.x_ + delta.x_, position_.x_ - (maxSize_.x_ - size_.x_), position_.x_ + (size_.x_ - minSize_.x_)), dragBeginPosition_.y_); SetSize(dragBeginSize_.x_ - delta.x_, dragBeginSize_.y_); break; default: break; } ValidatePosition(); SetCursorShape(dragMode_, cursor); }
INT_PTR CALLBACK DlgProcDisplayData(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { DBVARIANT dbv; RECT rc; TCHAR url[300]; MCONTACT hContact; switch (msg) { case WM_INITDIALOG: TranslateDialogDefault(hwndDlg); { MCONTACT hContact2 = lParam; SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR) hContact2); WindowList_Add(hWindowList, hwndDlg, hContact2); url[0] = '\0'; if (!db_get_ts(hContact2, MODULENAME, URL_KEY, &dbv)) { _tcsncpy_s(url, dbv.ptszVal, _TRUNCATE); db_free(&dbv); } SetDlgItemText(hwndDlg, IDC_OPEN_URL, FixButtonText(url, _countof(url))); char preservename[100]; if (!db_get_s(hContact2, MODULENAME, PRESERVE_NAME_KEY, &dbv)) { strncpy_s(preservename, _countof(preservename), dbv.pszVal, _TRUNCATE); db_free(&dbv); } else preservename[0] = 0; SetWindowTextA(hwndDlg, preservename); SendMessage(hwndDlg, WM_SETICON, ICON_SMALL, (LPARAM) LoadIcon(hInst, MAKEINTRESOURCE(IDI_SITE))); // ////// COLORREF colour = BackgoundClr; COLORREF txtcolor; SendDlgItemMessage(hwndDlg, IDC_DATA, EM_SETBKGNDCOLOR, 0, colour); SendDlgItemMessage(hwndDlg, IDC_UPDATE_BUTTON, BM_SETIMAGE, IMAGE_ICON, (LPARAM) LoadImage(hInst, MAKEINTRESOURCE(IDI_UPDATE), IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), 0)); SendDlgItemMessage(hwndDlg, IDC_UPDATE_BUTTON, BUTTONADDTOOLTIP, (WPARAM) TranslateT("Update data"), BATF_TCHAR); SendDlgItemMessage(hwndDlg, IDC_FIND_BUTTON, BM_SETIMAGE, IMAGE_ICON, (LPARAM) LoadImage(hInst, MAKEINTRESOURCE(IDI_FIND), IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), 0)); SendDlgItemMessage(hwndDlg, IDC_FIND_BUTTON, BUTTONADDTOOLTIP, (WPARAM) TranslateT("Find"), BATF_TCHAR); SendDlgItemMessage(hwndDlg, IDC_OPTIONS_BUTTON, BM_SETIMAGE, IMAGE_ICON, (LPARAM) LoadImage(hInst, MAKEINTRESOURCE(IDI_OPTIONS), IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), 0)); SendDlgItemMessage(hwndDlg, IDC_OPTIONS_BUTTON, BUTTONADDTOOLTIP, (WPARAM) TranslateT("Contact options"), BATF_TCHAR); SendDlgItemMessage(hwndDlg, IDC_ALERT_BUTTON, BM_SETIMAGE, IMAGE_ICON, (LPARAM) LoadImage(hInst, MAKEINTRESOURCE(IDI_ALERT), IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), 0)); SendDlgItemMessage(hwndDlg, IDC_ALERT_BUTTON, BUTTONADDTOOLTIP, (WPARAM) TranslateT("Alert options"), BATF_TCHAR); SendDlgItemMessage(hwndDlg, IDC_STOP, BM_SETIMAGE, IMAGE_ICON, (LPARAM) LoadImage(hInst, MAKEINTRESOURCE(IDI_STOP), IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), 0)); SendDlgItemMessage(hwndDlg, IDC_STOP, BUTTONADDTOOLTIP, (WPARAM) TranslateT("Stop processing"), BATF_TCHAR); SendDlgItemMessage(hwndDlg, IDC_OPEN_URL, BUTTONADDTOOLTIP, (WPARAM) TranslateT("Click here to open this URL in a browser window."), BATF_TCHAR); if (!db_get_b(hContact2, MODULENAME, ON_TOP_KEY, 0)) { SendDlgItemMessage(hwndDlg, IDC_STICK_BUTTON, BM_SETIMAGE, IMAGE_ICON, (LPARAM) LoadImage(hInst, MAKEINTRESOURCE(IDI_UNSTICK), IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), 0)); SendDlgItemMessage(hwndDlg, IDC_STICK_BUTTON, BUTTONADDTOOLTIP, (WPARAM) TranslateT("Stick to the front"), BATF_TCHAR); } else { SendDlgItemMessage(hwndDlg, IDC_STICK_BUTTON, BM_SETIMAGE, IMAGE_ICON, (LPARAM) LoadImage(hInst, MAKEINTRESOURCE(IDI_STICK), IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), 0)); SendDlgItemMessage(hwndDlg, IDC_STICK_BUTTON, BUTTONADDTOOLTIP, (WPARAM) TranslateT("Disable stick to the front"), BATF_TCHAR); } SendDlgItemMessage(hwndDlg, IDC_DATA, WM_SETFONT, (WPARAM) h_font, 1); txtcolor = TextClr; SetDlgItemText(hwndDlg, IDC_DATA, _T("")); InvalidateRect(hwndDlg, NULL, 1); SendDlgItemMessage(hwndDlg, IDC_DATA, EM_AUTOURLDETECT, 1, 0); int mask = (int)SendDlgItemMessage(hwndDlg, IDC_DATA, EM_GETEVENTMASK, 0, 0); SendDlgItemMessage(hwndDlg, IDC_DATA, EM_SETEVENTMASK, 0, mask | ENM_LINK | ENM_MOUSEEVENTS); SendDlgItemMessage(hwndDlg, IDC_STICK_BUTTON, BUTTONSETASFLATBTN, 0, 0); SendDlgItemMessage(hwndDlg, IDC_UPDATE_BUTTON, BUTTONSETASFLATBTN, 0, 0); SendDlgItemMessage(hwndDlg, IDC_FIND_BUTTON, BUTTONSETASFLATBTN, 0, 0); SendDlgItemMessage(hwndDlg, IDC_OPTIONS_BUTTON, BUTTONSETASFLATBTN, 0, 0); SendDlgItemMessage(hwndDlg, IDC_ALERT_BUTTON, BUTTONSETASFLATBTN, 0, 0); SendDlgItemMessage(hwndDlg, IDC_STOP, BUTTONSETASFLATBTN, 0, 0); SendDlgItemMessage(hwndDlg, IDC_OPEN_URL, BUTTONSETASFLATBTN, 0, 0); HDC hdc = GetDC(GetDlgItem(hwndDlg, IDC_STATUSBAR)); SelectObject(hdc, (HFONT) SendDlgItemMessage(hwndDlg, IDC_STATUSBAR, WM_GETFONT, 0, 0)); SIZE textSize; GetTextExtentPoint32(hdc, tszSizeString, _countof(tszSizeString), &textSize); int partWidth[2] = { textSize.cx, -1 }; ReleaseDC(GetDlgItem(hwndDlg, IDC_STATUSBAR), hdc); SendDlgItemMessage(hwndDlg, IDC_STATUSBAR, SB_SETPARTS, _countof(partWidth), (LPARAM)partWidth); SendDlgItemMessage(hwndDlg, IDC_STATUSBAR, SB_SETTEXT, 1 | SBT_OWNERDRAW, 0); if ( db_get_b(NULL, MODULENAME, SAVE_INDIVID_POS_KEY, 0)) Utils_RestoreWindowPosition(hwndDlg, hContact2, MODULENAME, "WV"); } break; case WM_NOTIFY: switch (((NMHDR *) lParam)->code) { case EN_MSGFILTER: switch (((MSGFILTER *) lParam)->msg) { case WM_RBUTTONUP: { POINT pt; CHARRANGE sel, all = {0, -1}; HMENU hSubMenu = GetSubMenu(hMenu, 0); TranslateMenu(hSubMenu); SendMessage(((NMHDR *) lParam)->hwndFrom, EM_EXGETSEL, 0, (LPARAM) & sel); EnableMenuItem(hSubMenu, IDM_COPY, MF_ENABLED); EnableMenuItem(hSubMenu, IDM_CUT, MF_ENABLED); EnableMenuItem(hSubMenu, IDM_DELETE, MF_ENABLED); if (sel.cpMin == sel.cpMax) { EnableMenuItem(hSubMenu, IDM_COPY, MF_BYCOMMAND | MF_GRAYED); EnableMenuItem(hSubMenu, IDM_CUT, MF_BYCOMMAND | MF_GRAYED); EnableMenuItem(hSubMenu, IDM_DELETE, MF_BYCOMMAND | MF_GRAYED); } pt.x = (short) LOWORD(((ENLINK *) lParam)->lParam); pt.y = (short) HIWORD(((ENLINK *) lParam)->lParam); ClientToScreen(((NMHDR *) lParam)->hwndFrom, &pt); switch (TrackPopupMenu(hSubMenu, TPM_RETURNCMD, pt.x, pt.y, 0, hwndDlg, NULL)) { case IDM_COPY: SendMessage(((NMHDR *) lParam)->hwndFrom, WM_COPY, 0, 0); break; case IDM_COPYALL: SendMessage(((NMHDR *) lParam)->hwndFrom, EM_EXSETSEL, 0, (LPARAM) & all); SendMessage(((NMHDR *) lParam)->hwndFrom, WM_COPY, 0, 0); SendMessage(((NMHDR *) lParam)->hwndFrom, EM_EXSETSEL, 0, (LPARAM) & sel); break; case IDM_SELECTALL: SendMessage(((NMHDR *) lParam)->hwndFrom, EM_EXSETSEL, 0, (LPARAM) & all); break; case IDM_CUT: SendMessage(((NMHDR *) lParam)->hwndFrom, WM_CUT, 0, 0); break; case IDM_PASTE: SendMessage(((NMHDR *) lParam)->hwndFrom, WM_PASTE, 0, 0); break; case IDM_DELETE: SendMessage(((NMHDR *) lParam)->hwndFrom, WM_CLEAR, 0, 0); break; case IDM_CLEAR_ALL: SetDlgItemTextA(hwndDlg, IDC_DATA, ""); SetFocus(GetDlgItem(hwndDlg, IDC_DATA)); break; } } } break; case EN_LINK: switch (((ENLINK *) lParam)->msg) { case WM_RBUTTONDOWN: case WM_LBUTTONUP: CHARRANGE sel; SendDlgItemMessage(hwndDlg, IDC_DATA, EM_EXGETSEL, 0, (LPARAM) & sel); if (sel.cpMin != sel.cpMax) break; TEXTRANGEA tr; tr.chrg = ((ENLINK *) lParam)->chrg; tr.lpstrText = (char*)malloc(tr.chrg.cpMax - tr.chrg.cpMin + 8); SendDlgItemMessage(hwndDlg, IDC_DATA, EM_GETTEXTRANGE, 0, (LPARAM) & tr); if (strchr(tr.lpstrText, '@') != NULL && strchr(tr.lpstrText, ':') == NULL && strchr(tr.lpstrText, '/') == NULL) { memmove(tr.lpstrText + 7, tr.lpstrText, tr.chrg.cpMax - tr.chrg.cpMin + 1); memcpy(tr.lpstrText, "mailto:", 7); } Utils_OpenUrl(tr.lpstrText); SetFocus(GetDlgItem(hwndDlg, IDC_DATA)); free(tr.lpstrText); break; } } break; // notify case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_OPEN_URL: GetDlgItemText(hwndDlg, IDC_OPEN_URL, url, _countof(url)); Utils_OpenUrlT(url); db_set_w(wParam, MODULENAME, "Status", ID_STATUS_ONLINE); break; case IDC_UPDATE_BUTTON: if (hContact = FindContactByUrl(hwndDlg)) { EnableWindow(GetDlgItem(hwndDlg, IDC_UPDATE_BUTTON), 0); UpdateMenuCommand(wParam, lParam, hContact); } break; case IDC_STOP: if (hContact = FindContactByUrl(hwndDlg)) db_set_b(hContact, MODULENAME, STOP_KEY, 1); break; case IDC_STICK_BUTTON: if (hContact = FindContactByUrl(hwndDlg)) OnTopMenuCommand(wParam, lParam, hContact); { TCHAR *ptszToolTip; HWND hTopmost; if (!db_get_b(hContact, MODULENAME, ON_TOP_KEY, 0)) { hTopmost = HWND_NOTOPMOST; ptszToolTip = TranslateT("Stick to the front"); } else { hTopmost = HWND_TOPMOST; ptszToolTip = TranslateT("Disable stick to the front"); } SendDlgItemMessage(hwndDlg, IDC_STICK_BUTTON, BM_SETIMAGE, IMAGE_ICON, (LPARAM)LoadImage(hInst, MAKEINTRESOURCE(IDI_UNSTICK), IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), 0)); SendDlgItemMessage(hwndDlg, IDC_STICK_BUTTON, BUTTONADDTOOLTIP, (WPARAM)ptszToolTip, BATF_TCHAR); SetWindowPos(hwndDlg, hTopmost, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE); } break; case IDC_FIND_BUTTON: { HWND hwndFind = CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_FIND), hwndDlg, DlgProcFind, (LPARAM) wParam); ShowWindow(hwndFind, SW_SHOW); EnableWindow(GetDlgItem(hwndDlg, IDC_FIND_BUTTON), 0); } break; case IDC_OPTIONS_BUTTON: if (hContact = FindContactByUrl(hwndDlg)) { ContactHwnd = CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_CONTACT_OPT), hwndDlg, DlgProcContactOpt, (LPARAM) hContact); ShowWindow(ContactHwnd, SW_SHOW); SetActiveWindow(ContactHwnd); EnableWindow(GetDlgItem(hwndDlg, IDC_OPTIONS_BUTTON), 0); EnableWindow(GetDlgItem(hwndDlg, IDC_ALERT_BUTTON), 0); } break; case IDC_ALERT_BUTTON: if (hContact = FindContactByUrl(hwndDlg)) { HWND hwndAlertOpt = CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_ALRT_OPT), hwndDlg, DlgProcAlertOpt, (LPARAM) hContact); ShowWindow(hwndAlertOpt, SW_SHOW); SetActiveWindow(hwndAlertOpt); EnableWindow(GetDlgItem(hwndDlg, IDC_ALERT_BUTTON), 0); EnableWindow(GetDlgItem(hwndDlg, IDC_OPTIONS_BUTTON), 0); } break; case IDOK: case IDCANCEL: if (hwndDlg != NULL) DestroyWindow(hwndDlg); return TRUE; } break; case WM_CLOSE: if (Yposition == -32000) Yposition = 100; if (Xposition == -32000) Xposition = 100; SavewinSettings(); if (hContact = FindContactByUrl(hwndDlg)) Utils_SaveWindowPosition(hwndDlg, hContact, MODULENAME, "WV"); if (hwndDlg != NULL) DestroyWindow(hwndDlg); return 0; case WM_DESTROY: WindowList_Remove(hWindowList, hwndDlg); return 0; case WM_SIZE: Utils_ResizeDialog(hwndDlg, hInst, MAKEINTRESOURCEA(IDD_DISPLAY_DATA), DataDialogResize); InvalidateRect(hwndDlg, NULL, TRUE); // global GetWindowRect(hwndDlg, &rc); Xposition = rc.left; Yposition = rc.top; WindowHeight = rc.bottom - rc.top; WindowWidth = rc.right - rc.left; break; case WM_MOVE: if (!IsIconic(hwndDlg) && !IsZoomed(hwndDlg)) { GetWindowRect(hwndDlg, &rc); // global Xposition = rc.left; Yposition = rc.top; WindowHeight = rc.bottom - rc.top; WindowWidth = rc.right - rc.left; if ((GetAsyncKeyState(VK_CONTROL) & 0x8000)) break; ValidatePosition(hwndDlg); } } return FALSE; }
BOOL SeekToCurrSecond( IN INT cdrom ) /*++ Routine Description: Seek to the position on the disc represented by the current time (position) information in gDevices, and continue playing to the end of the current track. Arguments: cdrom - index into gDevices array, specifies which CDROM device to access Return Value: TRUE if seek was successful, FALSE if not --*/ { DWORD status; CDROM_PLAY_AUDIO_MSF pam; int retry,i,endindex; PTRACK_PLAY tr; SUB_Q_CHANNEL_DATA subq; CDROM_SUB_Q_DATA_FORMAT df; // // Build starting and ending positions for play // tr = CDTIME(cdrom).CurrTrack; if (tr==NULL) { return( FALSE ); } // // This routine sometimes wants to play from the current position // through the end of the contiguous play. Since the current // position is only being stored accurate down to seconds, we get // the current position, see if it's reasonably close to our // starting position, then start the play from the actual current // position. // df.Format = IOCTL_CDROM_CURRENT_POSITION; df.Track = (UCHAR)CDTIME(cdrom).CurrTrack->TocIndex; GetCdromSubQData( gDevices[ cdrom ]->hCd, &subq, &df ); pam.StartingM = (UCHAR)(TRACK_M(cdrom,tr->TocIndex) + CDTIME(cdrom).TrackCurMin); pam.StartingS = (UCHAR)(TRACK_S(cdrom,tr->TocIndex) + CDTIME(cdrom).TrackCurSec); pam.StartingF = 0; i = pam.StartingM * 60 + pam.StartingS; i-= (INT) subq.CurrentPosition.AbsoluteAddress[1] * 60; i-= (INT) subq.CurrentPosition.AbsoluteAddress[2]; if (ABS(i) <= 1) { pam.StartingM = (INT) subq.CurrentPosition.AbsoluteAddress[1]; pam.StartingS = (INT) subq.CurrentPosition.AbsoluteAddress[2]; pam.StartingF = (INT) subq.CurrentPosition.AbsoluteAddress[3]; } if (pam.StartingS > 59) { pam.StartingM++; pam.StartingS = (UCHAR)(pam.StartingS - 60); } if ((CDTIME(cdrom).TrackCurMin==0) && (CDTIME(cdrom).TrackCurSec==0)) pam.StartingF = TRACK_F(cdrom,tr->TocIndex); if (gDevices[ cdrom ]->State & PLAYING) { endindex = FindContiguousEnd( cdrom, tr ); pam.EndingM = TRACK_M(cdrom,endindex); pam.EndingS = TRACK_S(cdrom,endindex); pam.EndingF = TRACK_F(cdrom,endindex); } else { pam.EndingM = pam.StartingM; pam.EndingS = pam.StartingS; pam.EndingF = pam.StartingF; } retry = 0; do { status = PlayCdrom( gDevices[ cdrom ]->hCd, &pam ); if (status != ERROR_SUCCESS) { // // Didn't play, so try backing off a little bit // at the end of the track // retry++; i = (INT)pam.EndingF - 30; if (i<0) { pam.EndingF = (UCHAR)(70 + i); if (pam.EndingS!=0) { pam.EndingS--; } else { pam.EndingS=59; pam.EndingM--; } } else { pam.EndingF = (UCHAR)i; } // // Store the information in our structures so that // we don't have to recompute this next time... // TRACK_M(cdrom,endindex) = pam.EndingM; TRACK_S(cdrom,endindex) = pam.EndingS; TRACK_F(cdrom,endindex) = pam.EndingF; } else retry = 15; } while ((retry<15) && (status!=ERROR_SUCCESS)); CheckStatus( "SeekToCurrSec", status, cdrom ); if (status == ERROR_SUCCESS) { ValidatePosition(cdrom); } return( status==ERROR_SUCCESS ); }
BOOL PlayCurrTrack( INT cdrom ) /*++ Routine Description: Set cdrom device playing from start MSF to end MSF of current track. Arguments: cdrom - index into gDevices array, specifies which CDROM device to access Return Value: TRUE if play was successful, FALSE if not --*/ { DWORD status; CDROM_PLAY_AUDIO_MSF pam; int retry,min,sec,endindex; INT i; PTRACK_PLAY tr; tr = CURRTRACK( cdrom ); if (tr==NULL) { return( FALSE ); } sec = TRACK_S(cdrom,tr->TocIndex) + CDTIME(cdrom).TrackCurSec; min = TRACK_M(cdrom,tr->TocIndex) + CDTIME(cdrom).TrackCurMin; min += (sec / 60); sec = (sec % 60); pam.StartingM = min; pam.StartingS = sec; pam.StartingF = TRACK_F(cdrom,tr->TocIndex); endindex = FindContiguousEnd( cdrom, tr ); pam.EndingM = TRACK_M(cdrom,endindex); pam.EndingS = TRACK_S(cdrom,endindex); pam.EndingF = TRACK_F(cdrom,endindex); // // for some reason, sometimes the lead out track // gived bad values, because when we try to // play the last track, we get an error. However, // if we back up a little bit from what is reported // to us as the end of the last track, we can get // it to play. Below is a hack to do just that... // retry = 0; do { status = PlayCdrom( gDevices[ cdrom ]->hCd, &pam ); if ( (status != ERROR_SUCCESS) ) { // // Didn't play, so try backing off a little bit // at the end of the track // retry++; i = (INT)pam.EndingF - 30; if (i<0) { pam.EndingF = (UCHAR)(70 + i); if (pam.EndingS!=0) { pam.EndingS--; } else { pam.EndingS=59; pam.EndingM--; } } else { pam.EndingF = (UCHAR)i; } // // Store the information in our structures so that // we don't have to recompute this next time... // TRACK_M(cdrom,endindex) = pam.EndingM; TRACK_S(cdrom,endindex) = pam.EndingS; TRACK_F(cdrom,endindex) = pam.EndingF; } else retry = 15; } while ((retry<15) && (status!=ERROR_SUCCESS)); CheckStatus( "PlayCurrTrack", status, cdrom ); if (status == ERROR_SUCCESS) { ValidatePosition( cdrom ); } return( status==ERROR_SUCCESS ); }
void UnMakeMove(int ply, int move, int wtm) { register int piece, from, to, captured, promote; /* ---------------------------------------------------------- | | | first, take care of the hash key if there's a possible | | enpassant pawn capture. | | | ---------------------------------------------------------- */ HashKey=save_hash_key[ply]; PawnHashKey=save_pawn_hash_key[ply]; /* ---------------------------------------------------------- | | | now do the piece-specific things by calling the | | appropriate routine. | | | ---------------------------------------------------------- */ piece=Piece(move); from=From(move); to=To(move); captured=Captured(move); promote=Promote(move); UnMakePieceMove: SetRL90(from,OccupiedRL90); SetRL45(from,OccupiedRL45); SetRR45(from,OccupiedRR45); ClearRL90(to,OccupiedRL90); ClearRL45(to,OccupiedRL45); ClearRR45(to,OccupiedRR45); bit_move=Or(set_mask[from],set_mask[to]); PieceOnSquare(to)=0; switch (piece) { /* ******************************************************************************** * * * unmake pawn moves. * * * ******************************************************************************** */ case pawn: if (wtm) { ClearSet(bit_move,WhitePawns); ClearSet(bit_move,WhitePieces); PieceOnSquare(from)=pawn; if (captured == 1) { if(EnPassant(ply) == to) { TotalPieces++; SetRL90(to-8,OccupiedRL90); SetRL45(to-8,OccupiedRL45); SetRR45(to-8,OccupiedRR45); Set(to-8,BlackPawns); Set(to-8,BlackPieces); PieceOnSquare(to-8)=-pawn; Material-=PAWN_VALUE; TotalBlackPawns++; captured=0; } } /* -------------------------------------------------------------------- | | | if this is a pawn promotion, remove the pawn from the counts | | then update the correct piece board to reflect the piece just | | created. | | | -------------------------------------------------------------------- */ if (promote) { TotalWhitePawns++; Material+=PAWN_VALUE; Clear(to,WhitePawns); Clear(to,WhitePieces); switch (promote) { case knight: Clear(to,WhiteKnights); TotalWhitePieces-=knight_v; Material-=KNIGHT_VALUE; break; case bishop: Clear(to,WhiteBishops); Clear(to,BishopsQueens); TotalWhitePieces-=bishop_v; Material-=BISHOP_VALUE; break; case rook: Clear(to,WhiteRooks); Clear(to,RooksQueens); TotalWhitePieces-=rook_v; Material-=ROOK_VALUE; break; case queen: Clear(to,WhiteQueens); Clear(to,BishopsQueens); Clear(to,RooksQueens); TotalWhitePieces-=queen_v; Material-=QUEEN_VALUE; break; } } } else { ClearSet(bit_move,BlackPawns); ClearSet(bit_move,BlackPieces); PieceOnSquare(from)=-pawn; if (captured == 1) { if(EnPassant(ply) == to) { TotalPieces++; SetRL90(to+8,OccupiedRL90); SetRL45(to+8,OccupiedRL45); SetRR45(to+8,OccupiedRR45); Set(to+8,WhitePawns); Set(to+8,WhitePieces); PieceOnSquare(to+8)=pawn; Material+=PAWN_VALUE; TotalWhitePawns++; captured=0; } } /* -------------------------------------------------------------------- | | | if this is a pawn promotion, remove the pawn from the counts | | then update the correct piece board to reflect the piece just | | created. | | | -------------------------------------------------------------------- */ if (promote) { TotalBlackPawns++; Material-=PAWN_VALUE; Clear(to,BlackPawns); Clear(to,BlackPieces); switch (promote) { case knight: Clear(to,BlackKnights); TotalBlackPieces-=knight_v; Material+=KNIGHT_VALUE; break; case bishop: Clear(to,BlackBishops); Clear(to,BishopsQueens); TotalBlackPieces-=bishop_v; Material+=BISHOP_VALUE; break; case rook: Clear(to,BlackRooks); Clear(to,RooksQueens); TotalBlackPieces-=rook_v; Material+=ROOK_VALUE; break; case queen: Clear(to,BlackQueens); Clear(to,BishopsQueens); Clear(to,RooksQueens); TotalBlackPieces-=queen_v; Material+=QUEEN_VALUE; break; } } } break; /* ******************************************************************************** * * * unmake knight moves. * * * ******************************************************************************** */ case knight: if (wtm) { ClearSet(bit_move,WhiteKnights); ClearSet(bit_move,WhitePieces); PieceOnSquare(from)=knight; } else { ClearSet(bit_move,BlackKnights); ClearSet(bit_move,BlackPieces); PieceOnSquare(from)=-knight; } break; /* ******************************************************************************** * * * unmake bishop moves. * * * ******************************************************************************** */ case bishop: ClearSet(bit_move,BishopsQueens); if (wtm) { ClearSet(bit_move,WhiteBishops); ClearSet(bit_move,WhitePieces); PieceOnSquare(from)=bishop; } else { ClearSet(bit_move,BlackBishops); ClearSet(bit_move,BlackPieces); PieceOnSquare(from)=-bishop; } break; /* ******************************************************************************** * * * unmake rook moves. * * * ******************************************************************************** */ case rook: ClearSet(bit_move,RooksQueens); if (wtm) { ClearSet(bit_move,WhiteRooks); ClearSet(bit_move,WhitePieces); PieceOnSquare(from)=rook; } else { ClearSet(bit_move,BlackRooks); ClearSet(bit_move,BlackPieces); PieceOnSquare(from)=-rook; } break; /* ******************************************************************************** * * * unmake queen moves. * * * ******************************************************************************** */ case queen: ClearSet(bit_move,BishopsQueens); ClearSet(bit_move,RooksQueens); if (wtm) { ClearSet(bit_move,WhiteQueens); ClearSet(bit_move,WhitePieces); PieceOnSquare(from)=queen; } else { ClearSet(bit_move,BlackQueens); ClearSet(bit_move,BlackPieces); PieceOnSquare(from)=-queen; } break; /* ******************************************************************************** * * * unmake king moves. * * * ******************************************************************************** */ case king: if (wtm) { ClearSet(bit_move,WhitePieces); PieceOnSquare(from)=king; WhiteKingSQ=from; if (abs(to-from) == 2) { if (to == 6) { from=H1; to=F1; piece=rook; goto UnMakePieceMove; } else { from=A1; to=D1; piece=rook; goto UnMakePieceMove; } } } else { ClearSet(bit_move,BlackPieces); PieceOnSquare(from)=-king; BlackKingSQ=from; if (abs(to-from) == 2) { if (to == 62) { from=H8; to=F8; piece=rook; goto UnMakePieceMove; } else { from=A8; to=D8; piece=rook; goto UnMakePieceMove; } } } break; } /* ******************************************************************************** * * * now it is time to restore a piece that was captured. * * * ******************************************************************************** */ if(captured) { TotalPieces++; SetRL90(to,OccupiedRL90); SetRL45(to,OccupiedRL45); SetRR45(to,OccupiedRR45); switch (captured) { /* ---------------------------------------------------------- | | | restore a captured pawn. | | | ---------------------------------------------------------- */ case pawn: if (wtm) { Set(to,BlackPawns); Set(to,BlackPieces); PieceOnSquare(to)=-pawn; Material-=PAWN_VALUE; TotalBlackPawns++; } else { Set(to,WhitePawns); Set(to,WhitePieces); PieceOnSquare(to)=pawn; Material+=PAWN_VALUE; TotalWhitePawns++; } break; /* ---------------------------------------------------------- | | | restore a captured knight. | | | ---------------------------------------------------------- */ case knight: if (wtm) { Set(to,BlackKnights); Set(to,BlackPieces); PieceOnSquare(to)=-knight; TotalBlackPieces+=knight_v; Material-=KNIGHT_VALUE; } else { Set(to,WhiteKnights); Set(to,WhitePieces); PieceOnSquare(to)=knight; TotalWhitePieces+=knight_v; Material+=KNIGHT_VALUE; } break; /* ---------------------------------------------------------- | | | restore a captured bishop. | | | ---------------------------------------------------------- */ case bishop: Set(to,BishopsQueens); if (wtm) { Set(to,BlackBishops); Set(to,BlackPieces); PieceOnSquare(to)=-bishop; TotalBlackPieces+=bishop_v; Material-=BISHOP_VALUE; } else { Set(to,WhiteBishops); Set(to,WhitePieces); PieceOnSquare(to)=bishop; TotalWhitePieces+=bishop_v; Material+=BISHOP_VALUE; } break; /* ---------------------------------------------------------- | | | restore a captured rook. | | | ---------------------------------------------------------- */ case rook: Set(to,RooksQueens); if (wtm) { Set(to,BlackRooks); Set(to,BlackPieces); PieceOnSquare(to)=-rook; TotalBlackPieces+=rook_v; Material-=ROOK_VALUE; } else { Set(to,WhiteRooks); Set(to,WhitePieces); PieceOnSquare(to)=rook; TotalWhitePieces+=rook_v; Material+=ROOK_VALUE; } break; /* ---------------------------------------------------------- | | | restore a captured queen. | | | ---------------------------------------------------------- */ case queen: Set(to,BishopsQueens); Set(to,RooksQueens); if (wtm) { Set(to,BlackQueens); Set(to,BlackPieces); PieceOnSquare(to)=-queen; TotalBlackPieces+=queen_v; Material-=QUEEN_VALUE; } else { Set(to,WhiteQueens); Set(to,WhitePieces); PieceOnSquare(to)=queen; TotalWhitePieces+=queen_v; Material+=QUEEN_VALUE; } break; /* ---------------------------------------------------------- | | | restore a captured king. [this is an error condition] | | | ---------------------------------------------------------- */ case king: printf("captured a king\n"); printf("piece=%d,from=%d,to=%d,captured=%d\n", piece,from,to,captured); printf("ply=%d\n",ply); if (log_file) DisplayChessBoard(log_file,search); } } #if defined(DEBUG) ValidatePosition(ply,move,"UnMakeMove(2)"); #endif return; }