/////////////////////////////////////////////////////////////////////////// // // IN_UserInput() - Waits for the specified delay time (in ticks) or the // user pressing a key or a mouse button. If the clear flag is set, it // then either clears the key or waits for the user to let the mouse // button up. // /////////////////////////////////////////////////////////////////////////// boolean IN_UserInput(longword delay) { longword lasttime; lasttime = GetTimeCount(); IN_StartAck (); do { IN_ProcessEvents(); if (IN_CheckAck()) return true; SDL_Delay(5); } while (GetTimeCount() - lasttime < delay); return(false); }
// // Breathe Mr. BJ!!! // void BJ_Breathe (void) { static int which = 0, max = 10; int pics[2] = { L_GUYPIC, L_GUY2PIC }; //SDL_Delay(5); if ((int32_t) GetTimeCount () - lastBreathTime > max) { which ^= 1; VWB_DrawPic (0, 16, pics[which]); VW_UpdateScreen (); lastBreathTime = GetTimeCount(); max = 35; } }
/////////////////////////////////////////////////////////////////////////// // // US_LineInput() - Gets a line of user input at (x,y), the string defaults // to whatever is pointed at by def. Input is restricted to maxchars // chars or maxwidth pixels wide. If the user hits escape (and escok is // true), nothing is copied into buf, and false is returned. If the // user hits return, the current string is copied into buf, and true is // returned // /////////////////////////////////////////////////////////////////////////// boolean US_LineInput(int x,int y,char *buf,const char *def,boolean escok, int maxchars,int maxwidth) { boolean redraw, cursorvis,cursormoved, done,result, checkkey; ScanCode sc; char c; char s[MaxString],olds[MaxString]; int cursor,len; word i, w,h, temp; longword curtime, lasttime, lastdirtime, lastbuttontime, lastdirmovetime; ControlInfo ci; Direction lastdir = dir_None; if (def) strcpy(s,def); else *s = '\0'; *olds = '\0'; cursor = (int) strlen(s); cursormoved = redraw = true; cursorvis = done = false; lasttime = lastdirtime = lastdirmovetime = GetTimeCount(); lastbuttontime = lasttime + TickBase / 4; // 250 ms => first button press accepted after 500 ms LastASCII = key_None; LastScan = sc_None; while (!done) { ReadAnyControl(&ci); if (cursorvis) USL_XORICursor(x,y,s,cursor); sc = LastScan; LastScan = sc_None; c = LastASCII; LastASCII = key_None; checkkey = true; curtime = GetTimeCount(); // After each direction change accept the next change after 250 ms and then everz 125 ms if(ci.dir != lastdir || ((curtime - lastdirtime > TickBase / 4) && (curtime - lastdirmovetime > TickBase / 8))) { if(ci.dir != lastdir) { lastdir = ci.dir; lastdirtime = curtime; } lastdirmovetime = curtime; switch(ci.dir) { case dir_West: if(cursor) { // Remove trailing whitespace if cursor is at end of string if(s[cursor] == ' ' && s[cursor + 1] == 0) s[cursor] = 0; cursor--; } cursormoved = true; checkkey = false; break; case dir_East: if(cursor >= MaxString - 1) break; if(!s[cursor]) { USL_MeasureString(s,&w,&h); if(len >= maxchars || (maxwidth && w >= maxwidth)) break; s[cursor] = ' '; s[cursor + 1] = 0; } cursor++; cursormoved = true; checkkey = false; break; case dir_North: if(!s[cursor]) { USL_MeasureString(s,&w,&h); if(len >= maxchars || (maxwidth && w >= maxwidth)) break; s[cursor + 1] = 0; } s[cursor] = USL_RotateChar(s[cursor], 1); redraw = true; checkkey = false; break; case dir_South: if(!s[cursor]) { USL_MeasureString(s,&w,&h); if(len >= maxchars || (maxwidth && w >= maxwidth)) break; s[cursor + 1] = 0; } s[cursor] = USL_RotateChar(s[cursor], -1); redraw = true; checkkey = false; break; default: break; } } if((int)(curtime - lastbuttontime) > TickBase / 4) // 250 ms { if(ci.button0) // acts as return { strcpy(buf,s); done = true; result = true; checkkey = false; } if(ci.button1 && escok) // acts as escape { done = true; result = false; checkkey = false; } if(ci.button2) // acts as backspace { lastbuttontime = curtime; if(cursor) { strcpy(s + cursor - 1,s + cursor); cursor--; redraw = true; } cursormoved = true; checkkey = false; } } if(checkkey) { switch (sc) { case sc_LeftArrow: if (cursor) cursor--; c = key_None; cursormoved = true; break; case sc_RightArrow: if (s[cursor]) cursor++; c = key_None; cursormoved = true; break; case sc_Home: cursor = 0; c = key_None; cursormoved = true; break; case sc_End: cursor = (int) strlen(s); c = key_None; cursormoved = true; break; case sc_Return: strcpy(buf,s); done = true; result = true; c = key_None; break; case sc_Escape: if (escok) { done = true; result = false; } c = key_None; break; case sc_BackSpace: if (cursor) { strcpy(s + cursor - 1,s + cursor); cursor--; redraw = true; } c = key_None; cursormoved = true; break; case sc_Delete: if (s[cursor]) { strcpy(s + cursor,s + cursor + 1); redraw = true; } c = key_None; cursormoved = true; break; case SDLK_KP5: //0x4c: // Keypad 5 // TODO: hmmm... case sc_UpArrow: case sc_DownArrow: case sc_PgUp: case sc_PgDn: case sc_Insert: c = key_None; break; } if (c) { len = (int) strlen(s); USL_MeasureString(s,&w,&h); if(isprint(c) && (len < MaxString - 1) && ((!maxchars) || (len < maxchars)) && ((!maxwidth) || (w < maxwidth))) { for (i = len + 1;i > cursor;i--) s[i] = s[i - 1]; s[cursor++] = c; redraw = true; } } } if (redraw) { px = x; py = y; temp = fontcolor; fontcolor = backcolor; USL_DrawString(olds); fontcolor = (byte) temp; strcpy(olds,s); px = x; py = y; USL_DrawString(s); redraw = false; } if (cursormoved) { cursorvis = false; lasttime = curtime - TickBase; cursormoved = false; } if (curtime - lasttime > TickBase / 2) // 500 ms { lasttime = curtime; cursorvis ^= true; } else rarch_sleep(5); if (cursorvis) USL_XORICursor(x,y,s,cursor); VW_UpdateScreen(); } if (cursorvis) USL_XORICursor(x,y,s,cursor); if (!result) { px = x; py = y; USL_DrawString(olds); } VW_UpdateScreen(); IN_ClearKeysDown(); return(result); }
UINT WINAPI CBonCtrl::EpgCapBackThread(LPVOID param) { wstring folderPath; GetModuleFolderPath( folderPath ); wstring iniPath = folderPath; iniPath += L"\\BonCtrl.ini"; DWORD timeOut = GetPrivateProfileInt(L"EPGCAP", L"EpgCapTimeOut", 15, iniPath.c_str()); BOOL saveTimeOut = GetPrivateProfileInt(L"EPGCAP", L"EpgCapSaveTimeOut", 0, iniPath.c_str()); CBonCtrl* sys = (CBonCtrl*)param; if( ::WaitForSingleObject(sys->epgCapBackStopEvent, sys->epgCapBackStartWaitSec*1000) != WAIT_TIMEOUT ){ //キャンセルされた return 0; } if( sys->tsOut.IsRec() == TRUE ){ if( sys->enableRecEpgCap == FALSE ){ return 0; } }else{ if( sys->enableLiveEpgCap == FALSE ){ return 0; } } LONGLONG startTime = GetTimeCount(); wstring epgDataPath = L""; WORD ONID; WORD TSID; sys->tsOut.GetStreamID(&ONID, &TSID); if( sys->chUtil.IsEpgCapService(ONID, TSID) == FALSE ){ return 0; } sys->GetEpgDataFilePath(ONID, TSID, epgDataPath); sys->tsOut.StartSaveEPG(epgDataPath); sys->tsOut.ClearSectionStatus(); if( ::WaitForSingleObject(sys->epgCapBackStopEvent, 60*1000) != WAIT_TIMEOUT ){ //キャンセルされた sys->tsOut.StopSaveEPG(FALSE); return 0; } while(1){ //蓄積状態チェック BOOL chkNext = FALSE; BOOL leitFlag = sys->chUtil.IsPartial(ONID, TSID, sys->lastSID); EPG_SECTION_STATUS status = sys->tsOut.GetSectionStatus(leitFlag); if( ONID == 4 && sys->BSBasic == TRUE ){ if( status == EpgBasicAll || status == EpgHEITAll ){ chkNext = TRUE; } }else if( ONID == 6 && sys->CS1Basic == TRUE ){ if( status == EpgBasicAll || status == EpgHEITAll ){ chkNext = TRUE; } }else if( ONID == 7 && sys->CS2Basic == TRUE ){ if( status == EpgBasicAll || status == EpgHEITAll ){ chkNext = TRUE; } }else{ if( leitFlag == FALSE && status == EpgHEITAll ){ chkNext = TRUE; }else if( leitFlag == TRUE && status == EpgLEITAll ){ chkNext = TRUE; } } if( chkNext == TRUE ){ sys->tsOut.StopSaveEPG(TRUE); CSendCtrlCmd cmd; cmd.SetConnectTimeOut(1000); cmd.SendReloadEpg(); break; }else{ if( (startTime + timeOut*60 < GetTimeCount()) ){ //15分以上かかっているなら停止 sys->tsOut.StopSaveEPG(saveTimeOut); CSendCtrlCmd cmd; cmd.SetConnectTimeOut(1000); cmd.SendReloadEpg(); _OutputDebugString(L"++%d分でEPG取得完了せず or Ch変更でエラー", timeOut); break; } } if( ::WaitForSingleObject(sys->epgCapBackStopEvent, 10*1000) != WAIT_TIMEOUT ){ //キャンセルされた sys->tsOut.StopSaveEPG(FALSE); break; } } return 0; }
UINT WINAPI CBonCtrl::EpgCapThread(LPVOID param) { CBonCtrl* sys = (CBonCtrl*)param; BOOL chkNext = TRUE; BOOL startCap = FALSE; DWORD wait = 0; LONGLONG startTime = 0; DWORD chkCount = 0; DWORD chkWait = 8; BOOL chkBS = FALSE; BOOL chkCS1 = FALSE; BOOL chkCS2 = FALSE; wstring folderPath; GetModuleFolderPath( folderPath ); wstring iniPath = folderPath; iniPath += L"\\BonCtrl.ini"; DWORD timeOut = GetPrivateProfileInt(L"EPGCAP", L"EpgCapTimeOut", 15, iniPath.c_str()); BOOL saveTimeOut = GetPrivateProfileInt(L"EPGCAP", L"EpgCapSaveTimeOut", 0, iniPath.c_str()); while(1){ if( ::WaitForSingleObject(sys->epgCapStopEvent, wait) != WAIT_TIMEOUT ){ //キャンセルされた OutputDebugString(L"EpgCapThread::Canceled"); sys->epgSt_err = ST_CANCEL; sys->tsOut.StopSaveEPG(FALSE); break; } if( chkNext == TRUE ){ if( sys->tsOut.IsChChanging(NULL) == TRUE ){ Sleep(200); continue; } DWORD space = 0; DWORD ch = 0; sys->chUtil.GetCh(sys->epgCapChList[chkCount].ONID, sys->epgCapChList[chkCount].TSID, space, ch); sys->_SetCh(space, ch); startTime = GetTimeCount(); chkNext = FALSE; startCap = FALSE; wait = 1000; TCHAR debug[MAX_PATH]; wsprintf(debug, _T("EpgCapThread::Check SID = %d"), sys->epgCapChList[chkCount].SID); OutputDebugString(debug); if( sys->epgCapChList[chkCount].ONID == 4 ){ OutputDebugString(L"EpgCapThread::BS Channel"); chkBS = TRUE; }else if( sys->epgCapChList[chkCount].ONID == 6 ){ OutputDebugString(L"EpgCapThread::CS1 Channel"); chkCS1 = TRUE; }else if( sys->epgCapChList[chkCount].ONID == 7 ){ OutputDebugString(L"EpgCapThread::CS2 Channel"); chkCS2 = TRUE; } sys->epgSt_ch = sys->epgCapChList[chkCount]; }else{ BOOL chChgErr = FALSE; if( sys->tsOut.IsChChanging(&chChgErr) == TRUE ){ if( startTime + chkWait < GetTimeCount() ){ //チャンネル切り替えに10秒以上かかってるので無信号と判断 OutputDebugString(L"EpgCapThread::No signal"); chkNext = TRUE; } }else{ if( (startTime + chkWait + timeOut*60 < GetTimeCount()) || chChgErr == TRUE){ //15分以上かかっているなら停止 OutputDebugString(L"EpgCapThread::Time out"); sys->tsOut.StopSaveEPG(saveTimeOut); chkNext = TRUE; wait = 0; _OutputDebugString(L"++%d分でEPG取得完了せず or Ch変更でエラー", timeOut); }else if(startTime + chkWait < GetTimeCount() ){ //切り替えから15秒以上過ぎているので取得処理 if( startCap == FALSE ){ //取得開始 startCap = TRUE; wstring epgDataPath = L""; sys->GetEpgDataFilePath(sys->epgCapChList[chkCount].ONID, sys->epgCapChList[chkCount].TSID, epgDataPath); sys->tsOut.StartSaveEPG(epgDataPath); sys->tsOut.ClearSectionStatus(); wait = 60*1000; }else{ //蓄積状態チェック BOOL leitFlag = sys->chUtil.IsPartial(sys->epgCapChList[chkCount].ONID, sys->epgCapChList[chkCount].TSID, sys->epgCapChList[chkCount].SID); EPG_SECTION_STATUS status = sys->tsOut.GetSectionStatus(leitFlag); if( sys->epgCapChList[chkCount].ONID == 4 && sys->BSBasic == TRUE ){ if( status == EpgBasicAll || status == EpgHEITAll ){ chkNext = TRUE; } }else if( sys->epgCapChList[chkCount].ONID == 6 && sys->CS1Basic == TRUE ){ if( status == EpgBasicAll || status == EpgHEITAll ){ chkNext = TRUE; } }else if( sys->epgCapChList[chkCount].ONID == 7 && sys->CS2Basic == TRUE ){ if( status == EpgBasicAll || status == EpgHEITAll ){ chkNext = TRUE; } }else{ if( leitFlag == FALSE && status == EpgHEITAll ){ chkNext = TRUE; }else if( leitFlag == TRUE && status == EpgLEITAll ){ chkNext = TRUE; } } if( chkNext == TRUE ){ sys->tsOut.StopSaveEPG(TRUE); wait = 0; }else{ wait = 10*1000; } } } } if( chkNext == TRUE ){ //次のチャンネルへ chkCount++; if( sys->epgCapChList.size() <= chkCount ){ //全部チェック終わったので終了 sys->epgSt_err = ST_COMPLETE; return 0; } //BS 1チャンネルのみ? if( sys->epgCapChList[chkCount].ONID == 4 && sys->BSBasic == TRUE && chkBS == TRUE){ while(chkCount<(DWORD)sys->epgCapChList.size()){ if( sys->epgCapChList[chkCount].ONID != 4 ){ OutputDebugString(L"EpgCapThread::BS yet checked Basic"); break; } chkCount++; if( sys->epgCapChList.size() <= chkCount ){ //全部チェック終わったので終了 sys->epgSt_err = ST_COMPLETE; return 0; } } } //CS1 1チャンネルのみ? if( sys->epgCapChList[chkCount].ONID == 6 && sys->CS1Basic == TRUE && chkCS1 == TRUE ){ while(chkCount<(DWORD)sys->epgCapChList.size()){ if( sys->epgCapChList[chkCount].ONID != 6 ){ OutputDebugString(L"EpgCapThread::CS1 yet checked Basic"); break; } chkCount++; if( sys->epgCapChList.size() <= chkCount ){ //全部チェック終わったので終了 sys->epgSt_err = ST_COMPLETE; return 0; } } } //CS2 1チャンネルのみ? if( sys->epgCapChList[chkCount].ONID == 7 && sys->CS2Basic == TRUE && chkCS2 == TRUE ){ while(chkCount<(DWORD)sys->epgCapChList.size()){ if( sys->epgCapChList[chkCount].ONID != 7 ){ OutputDebugString(L"EpgCapThread::CS2 yet checked Basic"); break; } chkCount++; if( sys->epgCapChList.size() <= chkCount ){ //全部チェック終わったので終了 sys->epgSt_err = ST_COMPLETE; return 0; } } } } } } return 0; }
UINT WINAPI CBonCtrl::ChScanThread(LPVOID param) { CBonCtrl* sys = (CBonCtrl*)param; sys->chUtil.Clear(); wstring chSet4 = sys->bonUtil.GetChSet4Path(); wstring chSet5 = sys->bonUtil.GetChSet5Path(); vector<CHK_CH_INFO> chkList; map<DWORD, BON_SPACE_INFO> spaceMap; if( sys->bonUtil.GetOriginalChList(&spaceMap) != NO_ERR ){ sys->chSt_err = ST_COMPLETE; sys->chUtil.SaveChSet(chSet4, chSet5); return 0; } map<DWORD, BON_SPACE_INFO>::iterator itrSpace; for( itrSpace = spaceMap.begin(); itrSpace != spaceMap.end(); itrSpace++ ){ sys->chSt_totalNum += (DWORD)itrSpace->second.chMap.size(); map<DWORD, BON_CH_INFO>::iterator itrCh; for( itrCh = itrSpace->second.chMap.begin(); itrCh != itrSpace->second.chMap.end(); itrCh++ ){ CHK_CH_INFO item; item.space = itrSpace->second.space; item.spaceName = itrSpace->second.spaceName; item.ch = itrCh->second.ch; item.chName = itrCh->second.chName; chkList.push_back(item); } } if( sys->chSt_totalNum == 0 ){ sys->chSt_err = ST_COMPLETE; sys->chUtil.SaveChSet(chSet4, chSet5); return 0; } wstring folderPath; GetModuleFolderPath( folderPath ); wstring iniPath = folderPath; iniPath += L"\\BonCtrl.ini"; DWORD chChgTimeOut = GetPrivateProfileInt(L"CHSCAN", L"ChChgTimeOut", 9, iniPath.c_str()); DWORD serviceChkTimeOut = GetPrivateProfileInt(L"CHSCAN", L"ServiceChkTimeOut", 8, iniPath.c_str()); DWORD wait = 0; BOOL chkNext = TRUE; LONGLONG startTime = 0; DWORD chkWait = 0; DWORD chkCount = 0; BOOL firstChg = FALSE; while(1){ if( ::WaitForSingleObject(sys->chScanStopEvent, wait) != WAIT_TIMEOUT ){ //キャンセルされた sys->chSt_err = ST_CANCEL; break; } if( chkNext == TRUE ){ sys->chSt_space = chkList[chkCount].space; sys->chSt_ch = chkList[chkCount].ch; sys->chSt_chName = chkList[chkCount].chName; sys->_SetCh(chkList[chkCount].space, chkList[chkCount].ch, TRUE); if( firstChg == FALSE ){ firstChg = TRUE; sys->tsOut.ResetChChange(); } startTime = GetTimeCount(); chkNext = FALSE; wait = 1000; chkWait = chChgTimeOut; }else{ BOOL chChgErr = FALSE; if( sys->tsOut.IsChChanging(&chChgErr) == TRUE ){ if( startTime + chkWait < GetTimeCount() ){ //チャンネル切り替えに8秒以上かかってるので無信号と判断 OutputDebugString(L"★AutoScan Ch Change timeout\r\n"); chkNext = TRUE; } }else{ if( startTime + chkWait+serviceChkTimeOut < GetTimeCount() || chChgErr == TRUE){ //チャンネル切り替え成功したけどサービス一覧とれないので無信号と判断 OutputDebugString(L"★AutoScan GetService timeout\r\n"); chkNext = TRUE; }else{ //サービス一覧の取得を行う DWORD serviceListSize; SERVICE_INFO* serviceList; if( sys->tsOut.GetServiceListActual(&serviceListSize, &serviceList) == NO_ERR ){ if( serviceListSize > 0 ){ //一覧の取得ができた for( DWORD i=0 ;i<serviceListSize; i++ ){ if( serviceList[i].extInfo != NULL ){ if( serviceList[i].extInfo->service_name != NULL ){ if( wcslen(serviceList[i].extInfo->service_name) > 0 ){ sys->chUtil.AddServiceInfo(chkList[chkCount].space, chkList[chkCount].ch, chkList[chkCount].chName, &(serviceList[i])); } } } } chkNext = TRUE; } } } } if( chkNext == TRUE ){ //次のチャンネルへ chkCount++; sys->chSt_chkNum++; if( sys->chSt_totalNum <= chkCount ){ //全部チェック終わったので終了 sys->chSt_err = ST_COMPLETE; sys->chUtil.SaveChSet(chSet4, chSet5); break; } } } } sys->chUtil.LoadChSet(chSet4, chSet5); return 0; }
void CheckKeys (void) { ScanCode scan; if (screenfaded || demoplayback) // don't do anything with a faded screen return; scan = LastScan; #ifdef SPEAR // // SECRET CHEAT CODE: TAB-G-F10 // if (Keyboard[sc_Tab] && Keyboard[sc_G] && Keyboard[sc_F10]) { WindowH = 160; if (godmode) { Message ("God mode OFF"); SD_PlaySound (NOBONUSSND); } else { Message ("God mode ON"); SD_PlaySound (ENDBONUS2SND); } IN_Ack (); godmode ^= 1; DrawPlayBorderSides (); IN_ClearKeysDown (); return; } #endif // // SECRET CHEAT CODE: 'MLI' // if (Keyboard[sc_M] && Keyboard[sc_L] && Keyboard[sc_I]) { gamestate.health = 100; gamestate.ammo = 99; gamestate.keys = 3; gamestate.score = 0; gamestate.TimeCount += 42000L; GiveWeapon (wp_chaingun); DrawWeapon (); DrawHealth (); DrawKeys (); DrawAmmo (); DrawScore (); ClearMemory (); CA_CacheGrChunk (STARTFONT + 1); ClearSplitVWB (); Message (STR_CHEATER1 "\n" STR_CHEATER2 "\n\n" STR_CHEATER3 "\n" STR_CHEATER4 "\n" STR_CHEATER5); UNCACHEGRCHUNK (STARTFONT + 1); IN_ClearKeysDown (); IN_Ack (); if (viewsize < 17) DrawPlayBorder (); } // // OPEN UP DEBUG KEYS // #ifdef DEBUGKEYS if (Keyboard[sc_BackSpace] && Keyboard[sc_LShift] && Keyboard[sc_Alt] && param_debugmode) { ClearMemory (); CA_CacheGrChunk (STARTFONT + 1); ClearSplitVWB (); Message ("Debugging keys are\nnow available!"); UNCACHEGRCHUNK (STARTFONT + 1); IN_ClearKeysDown (); IN_Ack (); DrawPlayBorderSides (); DebugOk = 1; } #endif // // TRYING THE KEEN CHEAT CODE! // if (Keyboard[sc_B] && Keyboard[sc_A] && Keyboard[sc_T]) { ClearMemory (); CA_CacheGrChunk (STARTFONT + 1); ClearSplitVWB (); Message ("Commander Keen is also\n" "available from Apogee, but\n" "then, you already know\n" "that - right, Cheatmeister?!"); UNCACHEGRCHUNK (STARTFONT + 1); IN_ClearKeysDown (); IN_Ack (); if (viewsize < 18) DrawPlayBorder (); } // // pause key weirdness can't be checked as a scan code // if(buttonstate[bt_pause]) Paused = true; if(Paused) { int lastoffs = StopMusic(); LatchDrawPic (20 - 4, 80 - 2 * 8, PAUSEDPIC); VH_UpdateScreen(); IN_Ack (); Paused = false; ContinueMusic(lastoffs); if (MousePresent && IN_IsInputGrabbed()) IN_CenterMouse(); // Clear accumulated mouse movement lasttimecount = GetTimeCount(); return; } // // F1-F7/ESC to enter control panel // if ( #ifndef DEBCHECK scan == sc_F10 || #endif scan == sc_F9 || scan == sc_F7 || scan == sc_F8) // pop up quit dialog { short oldmapon = gamestate.mapon; short oldepisode = gamestate.episode; ClearMemory (); ClearSplitVWB (); US_ControlPanel (scan); DrawPlayBorderSides (); SETFONTCOLOR (0, 15); IN_ClearKeysDown (); return; } if ((scan >= sc_F1 && scan <= sc_F9) || scan == sc_Escape || buttonstate[bt_esc]) { int lastoffs = StopMusic (); ClearMemory (); VW_FadeOut (); US_ControlPanel (buttonstate[bt_esc] ? sc_Escape : scan); SETFONTCOLOR (0, 15); IN_ClearKeysDown (); VW_FadeOut(); if(viewsize != 21) DrawPlayScreen (); if (!startgame && !loadedgame) ContinueMusic (lastoffs); if (loadedgame) playstate = ex_abort; lasttimecount = GetTimeCount(); if (MousePresent && IN_IsInputGrabbed()) IN_CenterMouse(); // Clear accumulated mouse movement return; } // // TAB-? debug keys // #ifdef DEBUGKEYS if (Keyboard[sc_Tab] && DebugOk) { CA_CacheGrChunk (STARTFONT); fontnumber = 0; SETFONTCOLOR (0, 15); if (DebugKeys () && viewsize < 20) DrawPlayBorder (); // dont let the blue borders flash if (MousePresent && IN_IsInputGrabbed()) IN_CenterMouse(); // Clear accumulated mouse movement lasttimecount = GetTimeCount(); return; } #endif }
void PlayLoop (void) { #if defined(USE_FEATUREFLAGS) && defined(USE_CLOUDSKY) if(GetFeatureFlags() & FF_CLOUDSKY) InitSky(); #endif #ifdef USE_SHADING InitLevelShadeTable(); #endif playstate = ex_stillplaying; lasttimecount = GetTimeCount(); frameon = 0; anglefrac = 0; facecount = 0; funnyticount = 0; memset (buttonstate, 0, sizeof (buttonstate)); ClearPaletteShifts (); if (MousePresent && IN_IsInputGrabbed()) IN_CenterMouse(); // Clear accumulated mouse movement if (demoplayback) IN_StartAck (); do { PollControls (); // // actor thinking // madenoise = false; MoveDoors (); MovePWalls (); for (obj = player; obj; obj = obj->next) DoActor (obj); UpdatePaletteShifts (); ThreeDRefresh (); // // MAKE FUNNY FACE IF BJ DOESN'T MOVE FOR AWHILE // #ifdef SPEAR funnyticount += tics; if (funnyticount > 30l * 70) { funnyticount = 0; if(viewsize != 21) StatusDrawFace(BJWAITING1PIC + (US_RndT () & 1)); facecount = 0; } #endif gamestate.TimeCount += tics; UpdateSoundLoc (); // JAB if (screenfaded) VW_FadeIn (); CheckKeys (); // // debug aids // if (singlestep) { VW_WaitVBL (singlestep); lasttimecount = GetTimeCount(); } if (extravbls) VW_WaitVBL (extravbls); if (demoplayback) { if (IN_CheckAck ()) { IN_ClearKeysDown (); playstate = ex_abort; } } } while (!playstate && !startgame); if (playstate != ex_died) FinishPaletteShifts (); }