/************************/ /* gamemain.cpp */ /************************/ #include "../systeminc/version.h" #include "../systeminc/system.h" #include #include #include "../systeminc/loadrealbin.h" #include "../systeminc/loadsprbin.h" #include "../oft/sys2.h" #include "../other/caryIme.h" #include "../systeminc/ime_sa.h" #include "../systeminc/anim_tbl.h" #include "../systeminc/battleMap.h" #include "../systeminc/netmain.h" #include "../systeminc/savedata.h" #include "../systeminc/produce.h" #include "../systeminc/battleProc.h" #include "../systeminc/t_music.h" #include "../systeminc/menu.h" #include "../systeminc/handletime.h" #include "../systeminc/battleMenu.h" #include "../systeminc/character.h" #include "../systeminc/login.h" #include "../systeminc/pc.h" #include "../systeminc/map.h" #include "../NewProto/autil.h" #include "../NewProto/protocol.h" #include "../systeminc/field.h" #include "../systeminc/VMProtectSDK.h" #include #ifdef _OPTIMIZATIONFLIP_ #include #include #endif #ifdef _CMD_MODE #include #include #endif #ifdef _REMAKE_20 #include "../MMOGprotect.h" #endif #ifdef _TALK_WINDOW #include "../systeminc/talkwindow.h" #endif #ifdef _PTTERN_SEPARATION_BIN #include "../other/PtternSeparationBin.h" #endif #ifdef _AIDENGLU_ #include "../systeminc/pc.h" extern Landed PcLanded; #endif int 是否重开登组队_1; int 编码; int MessageBoxNew(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType); #ifdef _OPTIMIZATIONFLIP_ #define NO_DRAW_MAX_CNT 5 // ?????????? #else #define NO_DRAW_MAX_CNT 6 // ?????????? //#define FRAME_SKIP 1 // ???????? ??:? ???:? #endif // ????????????? void ChangeWindowMode(void); // ??????? void SetResoMode(int Mode); void StrToNowStrBuffer(char *str); void StrToNowStrBuffer1(char *str); //#ifndef _STONDEBUG_ // #define _STONDEBUG_ // ???????????? //#endif #define _BATTLESLEPP_ 0 int testCnt; static char no_wait_cnt = 0; int debug_info_flag = 0; //---------------------------------------------------------------------------// // ??????? // //---------------------------------------------------------------------------// // ????????? int FrameRate; int DrawFrameCnt; DWORD DrawFrameTime; #ifdef _STONDEBUG_ static int palNo = 0; static int fontNo = 0; #endif int GameState; #ifdef _OPTIMIZATIONFLIP_ //过程时间 DWORD ProcTime = 8; //循环时间 DWORD SystemTime = 16; #else //过程时间 DWORD ProcTime = 14; //循环时间 #ifdef _SYSTEM_SLEEP_ DWORD SystemTime = _SYSTEM_SLEEP_; #else DWORD SystemTime = 6; #endif #endif #ifdef _NEW_SPEED_ BOOL GameSpeedFlag = FALSE; #endif DWORD NowTime; int NoDrawCnt = 1; int BackBufferDrawType; #ifdef _READ16BITBMP bool g_bMMXMode; // CPU 是否有MMX指令集 #endif #ifdef _REMAKE_20 static DWORD dwDisableInputScriptTime = 0; // 每五分钟执行一次DisableInputScriptTime() #endif //DWORD WINAPI CheckTickCount(LPVOID lpParam); #ifdef _CMD_MODE void InitConsoleWindow(void); void ConsoleThread(void); #endif #ifdef _CHECK_GAMESPEED void HighSpeedCheck( void ) { #define HIGH_SPEED_CHECK_INTERVAL 60*60 static int SpeedCnt=0; static float delays=0; if( init_net == FALSE ) return; SpeedCnt++; if( SpeedCnt >= HIGH_SPEED_CHECK_INTERVAL ){ int delaytimes = lssproto_getdelaytimes(); if( delaytimes > 0 ){ lssproto_setdelaytimes( 0); delays += delaytimes*10; }else{ if( delays > 0 ) delays--; } SpeedCnt = 0; lssproto_CS_send( sockfd); //送探针给server } if( (int)delays > 0 ){ for( int i=0; i<((int)delays+1000); i++){} } } #endif DWORD WINAPI TestThreadProc(PVOID pParam) { DWORD dwStart = GetTickCount(); Sleep(3000); DWORD endstart = GetTickCount() - dwStart; if (endstart >= 3500){ ExitProcess(0); } return 0; } DWORD WINAPI TestThreadProc1(PVOID pParam) { if (VMProtectIsDebuggerPresent(true)) ExitProcess(NULL); if (VMProtectIsVirtualMachinePresent()) ExitProcess(NULL); extern BOOL IsContainsProcess(char* strProName, BOOL 判断 = 1); if (IsContainsProcess("多窗口", 0) || IsContainsProcess("同步", 0) || IsContainsProcess("SbieSvc.exe")||IsContainsProcess("SbieCtrl.exe")) ExitProcess(NULL); extern void 按键检测(); 按键检测(); return 0; } HANDLE hThread = NULL; HANDLE hThread1 = NULL; void CALLBACK TimerProc(HWND hWnd, UINT nMsg, UINT nTimerid, DWORD dwTime) { if (hThread) CloseHandle(hThread); hThread = CreateThread(NULL, 0, TestThreadProc, 0, 0, NULL); } void CALLBACK TimerProc1(HWND hWnd, UINT nMsg, UINT nTimerid, DWORD dwTime) { if (hThread1) CloseHandle(hThread1); hThread1 = CreateThread(NULL, 0, TestThreadProc1, 0, 0, NULL); } #ifdef _ANNOUNCEMENT_ int 公告数量 = 0; char 公告内容[512]; int 公告颜色 = -1; int 公告时间 = 0; void announce() { if (公告数量 == 0) return; int showcolor; 公告时间 += 4; int left = ((公告时间 / 25) % (800 + (strlen(公告内容) * 8))); if (left == 0){ 公告数量--; if (公告颜色 == -1){ showcolor = rand() % 10; } else{ showcolor = 公告颜色; } } StockFontBuffer(800 - left, 60, 1, showcolor, 公告内容, 0); } #endif BOOL GameMain(void) { if (InitGame() == FALSE){ MessageBoxNew(hWnd, "游戏设定初始化失败!", "确定", MB_OK | MB_ICONSTOP); return FALSE; } char sz[32]; DWORD nowtime; DWORD nowttime1 = TimeGetTime(); DWORD nowttime3 = TimeGetTime(); //_itoa_s( nowttime1^0xffffbcde, sz, 10); #ifdef _OPTIMIZATIONFLIP_ BOOL finishLoop = TRUE; unsigned int startloopTime = TimeGetTime(); unsigned int endloopTime; unsigned int endProcTime; unsigned int loopAmend = 0; unsigned int skipAmend = 0; extern BOOL isXP(); BOOL isXPSystem = isXP(); #endif CreatFontHdc(); #ifdef _NODEBUG_ SetTimer(0, 0, 6000, &TimerProc); SetTimer(0, 0, 60000, &TimerProc1); #endif while (1){ if (SystemTask() == FALSE){ EndGame(); return FALSE; } #ifdef _OPTIMIZATIONFLIP_ if (finishLoop) { startloopTime = TimeGetTime(); endloopTime = startloopTime + SystemTime; endProcTime = startloopTime + ProcTime; finishLoop = FALSE; } #endif #ifdef _CHECK_GAMESPEED HighSpeedCheck(); #endif #ifdef _REMAKE_20 #ifndef _STONDEBUG_ if(dwDisableInputScriptTime + 300000 < TimeGetTime()){ DisableInputScript(); dwDisableInputScriptTime = TimeGetTime(); } #endif #endif RealTimeToSATime(&SaTime); DispBuffer.DispCnt = 0; FontCnt = 0; if (!offlineFlag) networkLoop(); cdda_play(cdda_no); joy_read(); #if 1 if (joy_trg[1] & JOY_F12){ static unsigned int prePushTime = 0; if (prePushTime + 500 <= TimeGetTime()){ snapShot(); prePushTime = TimeGetTime(); } } #endif if (joy_trg[1] & JOY_F11) nameOverTheHeadFlag = !nameOverTheHeadFlag; Process(); MouseProc(); #ifdef _SURFACE_ANIM AniProc(); #endif #ifdef _ANNOUNCEMENT_ if (ProcNo == PROC_GAME){ if (!actBtn){ announce(); } } #endif SortDispBuffer(); HitMouseCursor(); PaletteProc(); #ifdef _AIDENGLU_ static int 重新登陆原地开始时间 = 0; static int 重新登陆AI开始时间 = 0; static int 重新登陆方向开始时间 = 0; static int 重新登陆组队开始时间 = 0; static int 重新登陆喊话开始时间 = 0; extern int 是否重登战斗了; extern int 是否重登人物方向; extern int 是否重登AI模式; extern int 是否重登组队; extern int 是否重登喊话; static int 开组队开始时间 = 0; if (ProcNo == PROC_GAME){ if (PcLanded.队模 == 0){ if (是否重登AI模式){ if (是否重开登组队_1){ 是否重开登组队_1 = FALSE; 开组队开始时间 = TimeGetTime(); } } if (partyModeFlag){//多一人的时候则登陆 if (是否重登战斗了){ 是否重登战斗了 = FALSE; 重新登陆原地开始时间 = TimeGetTime(); } } } else{ if (是否重登战斗了){ 是否重登战斗了 = FALSE; 重新登陆原地开始时间 = TimeGetTime(); } } if (开组队开始时间){ if (TimeGetTime() > 开组队开始时间 + 500){ extern unsigned int sockfd; if(!pc.etcFlag &PC_ETCFLAG_PARTY){ pc.etcFlag |= PC_ETCFLAG_PARTY; lssproto_FS_send(sockfd, pc.etcFlag); } } } if (重新登陆原地开始时间){ if (TimeGetTime() > 重新登陆原地开始时间 + 2000){ 重新登陆原地开始时间 = 0; extern unsigned int sockfd; lssproto_SaMenu_send(sockfd, 11); } } if (是否重登AI模式){ 重新登陆AI开始时间 = TimeGetTime(); 是否重登AI模式 = FALSE; } if (重新登陆AI开始时间){ if (TimeGetTime() > 重新登陆AI开始时间 + 500){ 重新登陆AI开始时间 = 0; AI = AI_SELECT; StockChatBufferLine("开启AI模式!", FONT_PAL_RED); pc.etcFlag |= PC_AI_MOD; lssproto_FS_send(sockfd, pc.etcFlag); } } if (是否重登人物方向){ 是否重登人物方向 = FALSE; 重新登陆方向开始时间 = TimeGetTime(); } if (重新登陆方向开始时间){ if (TimeGetTime() > 重新登陆方向开始时间 + 500){ 重新登陆方向开始时间 = 0; char dir2[2]; setPcDir(PcLanded.人物方向); dir2[0] = cnvServDir(PcLanded.人物方向, 1); dir2[1] = '\0'; walkSendForServer(nowGx, nowGy, dir2); } } extern int 自动登陆是否开启; if (是否重登组队&&!是否重登人物方向&&!重新登陆方向开始时间&&!partyModeFlag){ if (!重新登陆组队开始时间){ 重新登陆组队开始时间 = TimeGetTime(); } else{ if (TimeGetTime() > 重新登陆组队开始时间 + FIELD_BTN_PUSH_WAIT){ 重新登陆组队开始时间 = 0; lssproto_PR_send(sockfd, nowGx, nowGy, 1); } } if (是否重登喊话){ if (!重新登陆喊话开始时间){ 重新登陆喊话开始时间 = TimeGetTime(); } else{ if (TimeGetTime() > 重新登陆喊话开始时间 + 1000 * 60){ 重新登陆喊话开始时间 = 0; char m[1024]; sprintf_s(m, "P|哪位好心人能带我练级哟。刚掉线重新登陆,求好心人站我面前带我练级!位置(%d,%d)", nowGx, nowGy); lssproto_TK_send(sockfd, nowGx, nowGy, m, 0, NowMaxVoice); } } } } else{ 重新登陆组队开始时间 = 0; 重新登陆喊话开始时间 = 0; } } extern int 自动登陆是否开启; if (ProcNo >= 1 && ProcNo <= 3){ if (PcLanded.大区 != -1 && PcLanded.小区 != -1 && PcLanded.人物 != -1){ if (自动登陆是否开启) StockFontBuffer(10, 550, FONT_PRIO_FRONT, FONT_PAL_RED, "正在自动登陆中,按F9可停止自动登陆!", 0); else StockFontBuffer(10, 550, FONT_PRIO_FRONT, FONT_PAL_RED, "按F9可自动登陆游戏!", 0); } } if (joy_trg[1] & JOY_F9&&ProcNo >= 1 && ProcNo <= 3) { if (自动登陆是否开启) 自动登陆是否开启 = !自动登陆是否开启; else{ if (PcLanded.大区 != -1 && PcLanded.小区 != -1 && PcLanded.人物 != -1) 自动登陆是否开启 = TRUE; } } #endif #ifdef _STONDEBUG_ if (joy_trg[1] & JOY_F9 && WindowMode){ #else if (joy_trg[1] & JOY_F9 && WindowMode && LowResoCmdFlag){ #endif if (BackBufferDrawType != DRAW_BACK_PRODUCE){ if (lpDraw != NULL){ // DirectDraw ? ReleaseDirectDraw(); DeleteObject(hFont); SetResoMode(((ResoMode + 1) % 5)); InitDirectDraw(); InitOffScreenSurface(); InitFont(0); ChangeWindowMode(); if (InitPalette() == FALSE){ PostMessage(hWnd, WM_CLOSE, 0, 0L); } if (ProcNo == PROC_BATTLE){ DispBuffer.DispCnt = 0; FontCnt = 0; ReadBattleMap(BattleMapNo); ClearBackSurface(); #ifdef __SKYISLAND fastDrawTileFlag = 0; PutBmp(); fastDrawTileFlag = 1; #else PutBmp(); lpBattleSurface->BltFast(0, 0, lpDraw->lpBACKBUFFER, NULL, DDBLTFAST_WAIT); #endif DispBuffer.DispCnt = 0; FontCnt = 0; NowTime = TimeGetTime(); } else if (fastDrawTile && ProcNo == PROC_GAME){ repairMap(); } } } } #ifdef _STONDEBUG_ if( joy_trg[ 0 ] & JOY_HOME ){ strcpy( MyChatBuffer.buffer + MyChatBuffer.cnt, DebugKey0 ); MyChatBuffer.cnt += strlen( DebugKey0 ); } if( joy_trg[ 0 ] & JOY_END ){ strcpy( MyChatBuffer.buffer + MyChatBuffer.cnt, DebugKey1 ); MyChatBuffer.cnt += strlen( DebugKey1 ); } if( joy_trg[ 0 ] & JOY_INS ){ strcpy( MyChatBuffer.buffer + MyChatBuffer.cnt, DebugKey2 ); MyChatBuffer.cnt += strlen( DebugKey2 ); } DisplayFrameRate(); { if( di_key[ DIK_PRIOR ] & 0x80 ){ if( debug_info_flag == 0 ) debug_info_flag = 1; if( debug_info_flag == 2 ) debug_info_flag = 3; }else{ if( debug_info_flag == 1 ) debug_info_flag = 2; if( debug_info_flag == 3 ) debug_info_flag = 0; } if (debug_info_flag == 1 || debug_info_flag == 2) InfoDisp(); } #endif #ifdef __NEW_CLIENT_MEM #ifndef __NEW_CLIENT_ONLY_WRITE static DWORD reset = TimeGetTime() + 120000; static DWORD flip = 1; DWORD oldprotect; if (reset < TimeGetTime()){ char *newread, *newwrite; reset += 120000; flip = (flip + 1) & 1; if (flip == 1){ if ((newread = (char*)VirtualAlloc(NULL, NETBUFSIZ, MEM_COMMIT, PAGE_READWRITE))){ if (net_readbuflen){ VirtualProtect(net_readbuf, NETBUFSIZ, PAGE_READWRITE, &oldprotect); CopyMemory(newread, net_readbuf, net_readbuflen); } VirtualFree(net_readbuf, NULL, MEM_RELEASE); net_readbuf = newread; VirtualProtect(net_readbuf, NETBUFSIZ, PAGE_NOACCESS, &oldprotect); } } else{ if ((newwrite = (char*)VirtualAlloc(NULL, NETBUFSIZ, MEM_COMMIT, PAGE_READWRITE))){ if (net_writebuflen){ VirtualProtect(net_writebuf, NETBUFSIZ, PAGE_READWRITE, &oldprotect); CopyMemory(newwrite, net_writebuf, net_writebuflen); } VirtualFree(net_writebuf, NULL, MEM_RELEASE); net_writebuf = newwrite; VirtualProtect(net_writebuf, NETBUFSIZ, PAGE_NOACCESS, &oldprotect); } } } #else static DWORD reset = TimeGetTime() + 120000; DWORD oldprotect; if( reset < TimeGetTime()){ char *newwrite; reset += 120000; if( (newwrite=(char*)VirtualAlloc( NULL, NETBUFSIZ, MEM_COMMIT, PAGE_READWRITE))){ VirtualProtect( net_writebuf, NETBUFSIZ, PAGE_READWRITE, &oldprotect); CopyMemory( newwrite, net_writebuf, net_writebuflen); VirtualFree( net_writebuf, NULL, MEM_RELEASE); net_writebuf = newwrite; VirtualProtect( net_writebuf, NETBUFSIZ, PAGE_NOACCESS, &oldprotect); newwrite = NULL; } } #endif #endif #ifdef _STONEAGE_NG #else #ifdef _OPTIMIZATIONFLIP_ if (endProcTime > TimeGetTime()) { //修正最大跳帧数 if (NoDrawCnt < NO_DRAW_MAX_CNT + skipAmend) { NoDrawCnt++; continue; } else { while (endProcTime > TimeGetTime()) { std::this_thread::sleep_for(std::chrono::microseconds(10)); } } } #ifdef _MO_SHOW_FPS sprintf(sz, "skip frames: %d", skipAmend); StockFontBuffer(380, 10, 1, 1, sz, false); #endif #else NowTime = TimeGetTime();//获取当前的时间 毫秒 nowtime = nowttime1; //nowtime ^= 0xffffbcde; static DWORD OldTime = nowttime1; if (NowTime > (nowtime + ProcTime)){ //OldTime^= 0x855ff55f; if (OldTime != nowtime){ OldTime = nowtime; if (NoDrawCnt < NO_DRAW_MAX_CNT){ if (NowTime>nowttime3 + 2000){ nowttime3 = NowTime; nowtime = NowTime + SystemTime; } else nowtime += (SystemTime); nowttime1 = nowtime; //_itoa_s( nowtime^0xffffbcde, sz, 10); nowtime = 0; NoDrawCnt++; Sleep(0); continue; } }//else //OldTime^= 0x855ff55f; } #endif #endif nowtime = 0; //cary AI的切换 if (di_key[DIK_NEXT] & 0x80){ di_key[DIK_NEXT] &= ~0x80; static DWORD switchmodetime = TimeGetTime(); if ((switchmodetime + 500) < NowTime){ switchmodetime = NowTime; #ifdef __AI if (AI == AI_SELECT){ AI = AI_NONE; pc.etcFlag &= (~PC_AI_MOD); lssproto_FS_send(sockfd, pc.etcFlag); // 修复战斗AI转换的BUG AI->玩家 #ifdef _FIX_BATTLE_AI battleMenuFix(); #endif } else{ AI = AI_SELECT; pc.etcFlag |= PC_AI_MOD; lssproto_FS_send(sockfd, pc.etcFlag); } extern BOOL AI_Save(); AI_Save(); #else extern int battleWazaTargetBak; if (PROC_BATTLE != ProcNo || BATTLE_SUBPROC_CMD_INPUT != SubProcNo){ battleWazaTargetBak = -1; AI++; if (AI > AI_SELECT) AI = AI_NONE; } else{ if (AI == AI_NONE){ battleWazaTargetBak = -1; AI = AI_ATTACK; } } #endif } } else if (di_key[DIK_PRIOR] & 0x80){ di_key[DIK_PRIOR] &= ~0x80; static DWORD switchmodetime = TimeGetTime(); if ((switchmodetime + 500) < NowTime){ switchmodetime = NowTime; #ifdef __AI if (AI == AI_SELECT){ AI = AI_NONE; // 修复战斗AI转换的BUG 玩家->AI #ifdef _FIX_BATTLE_AI battleMenuFix(); #endif pc.etcFlag &= (~PC_AI_MOD); lssproto_FS_send(sockfd, pc.etcFlag); } else{ AI = AI_SELECT; pc.etcFlag |= PC_AI_MOD; lssproto_FS_send(sockfd, pc.etcFlag); } extern BOOL AI_Save(); AI_Save(); #else extern int battleWazaTargetBak; if (PROC_BATTLE != ProcNo || BATTLE_SUBPROC_CMD_INPUT != SubProcNo){ battleWazaTargetBak = -1; AI--; if( AI < AI_NONE) AI = AI_SELECT; }else{ if( AI == AI_NONE){ battleWazaTargetBak = -1; AI = AI_SELECT; } } #endif } } #ifdef _STONDEBUG_ SurfaceDispCnt = 0; // DrawDebugLine( 250 ); #endif #ifndef __SKYISLAND switch( BackBufferDrawType ){ case DRAW_BACK_NON: break; case DRAW_BACK_NORMAL: ClearBackSurface(); break; case DRAW_BACK_PRODUCE: break; case DRAW_BACK_BATTLE: // ??????? DrawBattleMap(); break; } #else if (BackBufferDrawType != DRAW_BACK_PRODUCE){ #endif #ifdef _STONDEBUG_ no_wait_cnt++; if( GetAsyncKeyState( 0x10 ) & 0x8000 ) no_wait_cnt &= 7; else no_wait_cnt &= 3; if( GetAsyncKeyState( 0x10 ) & 0x8000 ){ //??????????? if(!no_wait_cnt){ PutBmp(); // ???????????????? // dwaf ????????? baseXFastDraw = nowXFastDraw; baseYFastDraw = nowYFastDraw; baseXFastDraw2 = nowXFastDraw2; baseYFastDraw2 = nowYFastDraw2; } } else { PutBmp(); // ???????????????? baseXFastDraw = nowXFastDraw; baseYFastDraw = nowYFastDraw; baseXFastDraw2 = nowXFastDraw2; baseYFastDraw2 = nowYFastDraw2; } #else #ifdef _NEW_SPEED_ no_wait_cnt++; no_wait_cnt &= 3; #ifdef _OPTIMIZATIONFLIP_ loopAmend = TimeGetTime(); #endif PutBmp(); #ifdef _OPTIMIZATIONFLIP_ loopAmend = TimeGetTime() - loopAmend; if (loopAmend < 8) { skipAmend = 0; } else if (loopAmend >=8) { skipAmend = 1; } #endif baseXFastDraw = nowXFastDraw; baseYFastDraw = nowYFastDraw; baseXFastDraw2 = nowXFastDraw2; baseYFastDraw2 = nowYFastDraw2; #else PutBmp(); baseXFastDraw = nowXFastDraw; baseYFastDraw = nowYFastDraw; baseXFastDraw2 = nowXFastDraw2; baseYFastDraw2 = nowYFastDraw2; #endif //_SPEED #endif #ifdef __SKYISLAND } #endif #ifdef _STONDEBUG_ DrawDebugLine(0); #endif #ifdef _STONDEBUG_ if (GetAsyncKeyState(0x10) & 0x8000){ //??????????? if (!no_wait_cnt){ Flip(); // ???????? } } else { Flip(); // ???????? } #else Flip(); // ???????? #endif #ifdef _STONDEBUG_ DrawDebugLine(249); #endif #ifdef _STONDEBUG_ if (GetAsyncKeyState(0x10) & 0x8000){ //??????????? nowtime = TimeGetTime(); _itoa_s(nowtime ^ 0xffffbcde, sz, 10); } else { nowtime = atoi( sz); nowtime ^= 0xffffbcde; while( nowtime >= TimeGetTime() ){ if( WindowMode ){ Sleep(1); } } } #else #ifdef _NEW_SPEED_ //nowtime = atoi( sz); //nowtime ^= 0xffffbcde; #ifndef _OPTIMIZATIONFLIP_ nowtime = nowttime1; while (nowtime >= TimeGetTime()){ Sleep(1); } nowtime = 0; #endif #else nowtime = atoi( sz); nowtime ^= 0xffffbcde; while( nowtime >= TimeGetTime() ){ Sleep(1); } nowtime = 0; #endif #endif if (PalChangeFlag == TRUE){ #ifdef __NEW_CLIENT extern HANDLE hProcessSnap, hParentProcess; extern DWORD dwPID; extern PROCESSENTRY32 pe32; if( dwPID){ pe32.dwSize = sizeof(PROCESSENTRY32); if( Process32First( hProcessSnap, &pe32)){ do{ if (pe32.th32ProcessID == dwPID){ if (!strstr(pe32.szExeFile, "explorer.exe") && (hParentProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPID))){ #ifndef NO_TERMINATER TerminateProcess(hParentProcess, 0); #endif CloseHandle(hParentProcess); } break; } }while (Process32Next(hProcessSnap, &pe32)); } dwPID = 0; } #endif extern int displayBpp; extern int rBitLShift, gBitLShift, bBitLShift; extern int rBitRShift, gBitRShift, bBitRShift; if (displayBpp >= 16){ #ifdef _HI_COLOR_32 if (displayBpp == 32){ extern unsigned int highColor32Palette[256]; for (int i = 1; i < 256; i++){ highColor32Palette[i] = //cary 2001 10 16 ((Palette[i].peBlue >> bBitRShift) << bBitLShift) + ((Palette[i].peGreen >> gBitRShift) << gBitLShift) + ((Palette[i].peRed >> rBitRShift) << rBitLShift); } } else #endif if (displayBpp == 16){ extern unsigned short highColorPalette[256]; for (int i = 1; i < 256; i++){ highColorPalette[i] = ((Palette[i].peBlue >> bBitRShift) << bBitLShift) + (((Palette[i].peGreen >> gBitRShift) | 1) << gBitLShift) + ((Palette[i].peRed >> rBitRShift) << rBitLShift); } } #ifdef __HI_COLOR InitSpriteInfo(); InitSurfaceInfo(); extern int BackBufferDrawType; if (BackBufferDrawType == DRAW_BACK_BATTLE){ #ifdef _NEW_RESOMODE //drawMap(); ReadBattleMap(BattleMapNo); #else ReadBattleMap(BattleMapNo); #endif SortDispBuffer(); ClearBackSurface(); fastDrawTileFlag = 0; PutBmp(); fastDrawTileFlag = 1; } else repairMap(); #endif #ifdef __CARYTEST extern LPREALBIN g_lpRealHead; LPREALBIN node = g_lpRealHead; while (node){ node->state = 0; } #endif } else if (displayBpp == 8){ lpDraw->lpPALETTE->SetEntries(0, 0, 256, Palette); } PalChangeFlag = FALSE; } #ifdef _NEW_SPEED_ if (GameSpeedFlag){ nowtime = TimeGetTime(); nowttime1 = nowtime; //_itoa_s( nowtime^0xffffbcde, sz, 10); GameSpeedFlag = FALSE; } #endif //nowtime = atoi( sz); //nowtime ^= 0xffffbcde; #ifdef _OPTIMIZATIONFLIP_ finishLoop = TRUE; NoDrawCnt = 1; while (endloopTime > TimeGetTime()){ std::this_thread::sleep_for(std::chrono::microseconds(10)); } #else nowttime1 += SystemTime; nowtime = 0; Sleep(1); NoDrawCnt = 1; #endif #ifdef _STONDEBUG_ // ????????????? DrawFrameCnt++; #endif SurfaceDate++; } return FALSE; } #ifdef _STONDEBUG_ unsigned int iTotalUseTime; unsigned int iTotalProcTime; unsigned int iTotalRunCount; unsigned int iShowCount; LARGE_INTEGER tf; extern bool g_bMMXMode; //  *******************************************************************/ void InfoDisp( void ) { char szMoji[ 256 ]; int x = lpDraw->xSize - 200; int y = 64; char c = 0; sprintf_s( szMoji,"ActionCnt = %d", ActCnt ); // ????????????? StockFontBuffer( x, y, FONT_PRIO_FRONT, c++, szMoji, 0 );y += 16; sprintf_s( szMoji,"DispCnt = %d", DispBuffer.DispCnt ); StockFontBuffer( x, y, FONT_PRIO_FRONT, c++, szMoji, 0 );y += 16; sprintf_s( szMoji,"SurfaceCnt = %d",SurfaceCnt ); StockFontBuffer( x, y, FONT_PRIO_FRONT, c++, szMoji, 0 );y += 16; sprintf_s( szMoji,"SearchPoint = %d",SurfaceSearchPoint ); StockFontBuffer( x, y, FONT_PRIO_FRONT, c++, szMoji, 0 );y += 16; sprintf_s( szMoji,"SysramSurfaceCnt = %d",SysramSurfaceCnt ); StockFontBuffer( x, y, FONT_PRIO_FRONT, c++, szMoji, 0 );y += 16; sprintf_s( szMoji,"VramSurfaceCnt = %d",VramSurfaceCnt ); StockFontBuffer( x, y, FONT_PRIO_FRONT, c++, szMoji, 0 );y += 16; sprintf_s( szMoji,"SurfaceUseCnt = %d",SurfaceUseCnt ); StockFontBuffer( x, y, FONT_PRIO_FRONT, c++, szMoji, 0 );y += 16; sprintf_s( szMoji,"SurfaceDispCnt = %d",SurfaceDispCnt ); StockFontBuffer( x, y, FONT_PRIO_FRONT, c++, szMoji, 0 );y += 16; sprintf_s( szMoji,"SurfaceDate = %d",SurfaceDate ); StockFontBuffer( x, y, FONT_PRIO_FRONT, c++, szMoji, 0 );y += 16; sprintf_s( szMoji,"FrameRate = %d",FrameRate ); StockFontBuffer( x, y, FONT_PRIO_FRONT, c++, szMoji, 0 );y += 16; sprintf_s( szMoji,"HitDispNo = %d",HitDispNo ); StockFontBuffer( x, y, FONT_PRIO_FRONT, c++, szMoji, 0 );y += 16; sprintf_s( szMoji,"HitFontNo = %d",HitFontNo ); StockFontBuffer( x, y, FONT_PRIO_FRONT, c++, szMoji, 0 );y += 16; sprintf_s( szMoji,"MouseLevel = %d",mouse.level ); StockFontBuffer( x, y, FONT_PRIO_FRONT, c++, szMoji, 0 );y += 16; sprintf_s( szMoji,"ProcNo = %d",ProcNo ); StockFontBuffer( x, y, FONT_PRIO_FRONT, c++, szMoji, 0 );y += 16; sprintf_s( szMoji,"SubProcNo = %d",SubProcNo ); StockFontBuffer( x, y, FONT_PRIO_FRONT, c++, szMoji, 0 );y += 16; sprintf_s( szMoji,"ActionSize = %d",sizeof( ACTION ) ); StockFontBuffer( x, y, FONT_PRIO_FRONT, c++, szMoji, 0 );y += 16; sprintf_s( szMoji,"MouseX = %d",mouse.nowPoint.x ); StockFontBuffer( x, y, FONT_PRIO_FRONT, c++, szMoji, 0 );y += 16; sprintf_s( szMoji,"MouseY = %d",mouse.nowPoint.y ); StockFontBuffer( x, y, FONT_PRIO_FRONT, c++, szMoji, 0 );y += 16; sprintf_s( szMoji,"TimeZone = %d",SaTime.hour ); StockFontBuffer( x, y, FONT_PRIO_FRONT, c++, szMoji, 0 );y += 16; c = 0; sprintf_s( szMoji,"PalNo = %d",PalState.palNo ); StockFontBuffer( x, y, FONT_PRIO_FRONT, c++, szMoji, 0 );y += 16; sprintf_s( szMoji,"BattleMapNo = %d",BattleMapNo ); StockFontBuffer( x, y, FONT_PRIO_FRONT, c++, szMoji, 0 );y += 16; sprintf_s( szMoji,"HogeCnt = %d",testCnt ); StockFontBuffer( x, y, FONT_PRIO_FRONT, c++, szMoji, 0 );y += 16; sprintf_s( szMoji,"EventEnemyFlag = %d",eventEnemyFlag ); StockFontBuffer( x, y, FONT_PRIO_FRONT, c++, szMoji, 0 );y += 16; // ??? if( BattleMyNo >= 20 ){ sprintf_s( szMoji,"BattleTurnNo = %d",BattleCliTurnNo ); }else{ sprintf_s( szMoji,"BattleTurnNo = %d",BattleCliTurnNo + 1 ); } StockFontBuffer( x, y, FONT_PRIO_FRONT, c++, szMoji, 0 );y += 16; sprintf_s( szMoji,"BattleDebTurnNo = %d",BattleDebTurnNo ); StockFontBuffer( x, y, FONT_PRIO_FRONT, c++, szMoji, 0 );y += 16; #ifdef _READ16BITBMP #ifdef _STONDEBUG_ if(iTotalRunCount % 100){ iShowCount = iTotalUseTime/iTotalRunCount; // iTotalUseTime = 0; // iTotalRunCount = 0; } sprintf_s( szMoji,"TestProcUseTime = %d",iShowCount); StockFontBuffer( x, y, FONT_PRIO_FRONT, c++, szMoji, 0 );y += 16; sprintf_s( szMoji,"TestRunTimes = %d",iTotalRunCount); StockFontBuffer( x, y, FONT_PRIO_FRONT, c++, szMoji, 0 );y += 16; #endif #ifdef _TALK_WINDOW sprintf_s(szMoji,"g_iCursorCount = %d",g_iCursorCount); StockFontBuffer( x, y, FONT_PRIO_FRONT, c++, szMoji, 0 );y += 16; #endif #endif sprintf_s( szMoji,"selectPetNo[ 0 ] = %d",pc.selectPetNo[ 0 ] ); StockFontBuffer( x, y, FONT_PRIO_FRONT, c++, szMoji, 0 );y += 16; sprintf_s( szMoji,"selectPetNo[ 1 ] = %d",pc.selectPetNo[ 1 ] ); StockFontBuffer( x, y, FONT_PRIO_FRONT, c++, szMoji, 0 );y += 16; sprintf_s( szMoji,"selectPetNo[ 2 ] = %d",pc.selectPetNo[ 2 ] ); StockFontBuffer( x, y, FONT_PRIO_FRONT, c++, szMoji, 0 );y += 16; sprintf_s(szMoji, "selectPetNo[ 3 ] = %d", pc.selectPetNo[3]); StockFontBuffer(x, y, FONT_PRIO_FRONT, c++, szMoji, 0); y += 16; sprintf_s(szMoji, "selectPetNo[ 4 ] = %d", pc.selectPetNo[4]); StockFontBuffer(x, y, FONT_PRIO_FRONT, c++, szMoji, 0); y += 16; sprintf_s(szMoji, "BattlePetStMenCnt= %d", BattlePetStMenCnt); StockFontBuffer(x, y, FONT_PRIO_FRONT, c++, szMoji, 0); y += 16; sprintf_s(szMoji, "BattlePetReceiveFlag= %d", BattlePetReceiveFlag); StockFontBuffer(x, y, FONT_PRIO_FRONT, c++, szMoji, 0); y += 16; } #endif // ?????????????? void DisplayFrameRate(void) { // ?????? if (TimeGetTime() - DrawFrameTime >= 1000){ // ?????????? FrameRate = DrawFrameCnt; // ??????? DrawFrameTime = TimeGetTime(); // ???????????? DrawFrameCnt = 0; } } // ??? *****************************************************************/ void PutLogo(void) { DispBuffer.DispCnt = 0; StockDispBuffer(400, 300, DISP_PRIO_TOP, CG_LOGO, 0); ClearBackSurface(); // ??????????????? PutBmp(); // ???????????????? Flip(); // } void GameErrorMessage(char *buf) { #ifdef _STONDEBUG_ FILE *fp = NULL; if( ( fopen_s(&fp, "err.log","a+"))!=NULL ) return; if (buf != NULL) fprintf(fp, "%s\n", buf); fclose(fp); #endif } BOOL InitGame(void) { InitDInput(); #ifdef _REMAKE_20 DisableCheated(); #ifndef _STONDEBUG_ RegisterHotKey(hWnd,0,MOD_ALT,VK_TAB); RegisterHotKey(hWnd,1,MOD_ALT,VK_ESCAPE); InitialInputScript(); DisableInputScript(); #endif RestoreLibrary(); InitRestore(); SetTimer(hWnd,0,55,NULL); #endif #ifdef _READ16BITBMP unsigned int testMMX = 0; // 测试cpu是否有MMX指令集 __asm{ push eax mov eax,1 CPUID mov testMMX, edx pop eax } // 第23个位元若为1表示有MMX if (testMMX & 0x00800000) g_bMMXMode = true; else g_bMMXMode = false; #endif #ifdef _STONDEBUG_ #ifdef _READ16BITBMP QueryPerformanceFrequency(&tf); iTotalProcTime = 0; iTotalRunCount = 0; #endif #endif util_Init(); if (InitDirectDraw() == FALSE){ MessageBoxNew(hWnd, "初始化DirectDraw失败!", "确定", MB_OK | MB_ICONSTOP); return FALSE; } if (InitOffScreenSurface() == FALSE){ MessageBoxNew(hWnd, "初始化Off Screan Surface失败!", "确定", MB_OK | MB_ICONSTOP); return FALSE; } if (InitPalette() == FALSE) return FALSE; if (initRealbinFileOpen(realBinName, adrnBinName) == FALSE) { MessageBoxNew(hWnd, "开启Real.bin失败!", "确定", MB_OK | MB_ICONSTOP); return FALSE; } //PutLogo(); initAutoMapColor(adrnBinName); if (InitSprBinFileOpen(sprBinName, sprAdrnBinName) == FALSE){ MessageBoxNew(hWnd, "开启Spr.bin失败!", "确定", MB_OK | MB_ICONSTOP); return FALSE; } #ifdef _READ16BITBMP int ref; if ((ref = InitRealTruebinFileOpen(realtrueBinName, adrntrueBinName)) < 0){ if (ref == -1) MessageBoxNew(hWnd, "开启 adrntrue.bin 失败!", "确定", MB_OK | MB_ICONSTOP); else if (ref == -2) MessageBoxNew(hWnd, "开启 realtrue.bin 失败!", "确定", MB_OK | MB_ICONSTOP); return FALSE; } #endif #ifdef _PTTERN_SEPARATION_BIN #ifdef _SA_VERSION_25 InitPteernSeparationBin(".//path"); #endif #endif #ifdef _WIN_LUAJIT_ memset(gmsv, 0, sizeof(gameserver)*MAX_GMSV); memset(gmgroup, 0, sizeof(gamegroup)*MAX_GMGROUP); extern void LoadStoneAgeLUA(char *path); LoadStoneAgeLUA(_LUA_PATCH_); #endif InitAction(); InitFont(0); srand(TimeGetTime()); initRand2(); t_music_init(); if (!InitIme(hWnd, StrToNowStrBuffer)){ MessageBoxNew(hWnd, "初始化输入法失败!", "确定", MB_OK | MB_ICONSTOP); return FALSE; } MouseInit(); if (loadUserSetting() == FALSE){ char msg[1024]; sprintf_s(msg, SAVE_ERRMSG_loadNowState, savedataErrorCode); MessageBoxNew(hWnd, msg, "确定", MB_OK | MB_ICONSTOP); return FALSE; } LoadChatRegistyStr(); NowTime = TimeGetTime(); DrawFrameTime = TimeGetTime(); if (MouseCursorFlag == FALSE){ #ifdef _TALK_WINDOW g_iCursorCount = ShowCursor(FALSE); #else ShowCursor(FALSE); #endif } ProcNo2 = -1; #ifdef __NEW_CLIENT_MEM #ifndef __NEW_CLIENT_ONLY_WRITE if (!net_readbuf){ if (!(net_readbuf = (char*)VirtualAlloc(NULL, NETBUFSIZ, MEM_COMMIT, PAGE_READWRITE))){ MessageBoxNew(hWnd, "net_readbuf Init 失败!", "确定", MB_OK | MB_ICONSTOP); return FALSE; } } #else if( !net_readbuf){ if( !(net_readbuf=(char*)VirtualAlloc( NULL, NETBUFSIZ, MEM_COMMIT, PAGE_NOACCESS))){ MessageBoxNew( hWnd, "net_readbuf Init 失败!", "确定", MB_OK | MB_ICONSTOP ); return FALSE; } } #endif if (!net_writebuf){ if (!(net_writebuf = (char*)VirtualAlloc(NULL, NETBUFSIZ, MEM_COMMIT, PAGE_NOACCESS))){ MessageBoxNew(hWnd, "net_writebuf Init 失败!", "确定", MB_OK | MB_ICONSTOP); return FALSE; } } #else if (!net_readbuf){ if (!(net_readbuf = (char*)VirtualAlloc(NULL, NETBUFSIZ, MEM_COMMIT, PAGE_READWRITE))){ MessageBoxNew(hWnd, "net_readbuf Init 失败!", "确定", MB_OK | MB_ICONSTOP); return FALSE; } } if (!net_writebuf){ if (!(net_writebuf = (char*)VirtualAlloc(NULL, NETBUFSIZ, MEM_COMMIT, PAGE_READWRITE))){ MessageBoxNew(hWnd, "net_writebuf Init 失败!", "确定", MB_OK | MB_ICONSTOP); return FALSE; } } #endif #ifdef _CHANNEL_MODIFY CreateDirectory("chat\\", NULL); #endif return TRUE; } #ifdef _CHANNEL_MODIFY void SaveChatData(char *msg, char KindOfChannel, bool bCloseFile); #endif void EndGame(void) { #ifdef __NEW_CLIENT extern HANDLE hPing; extern SOCKET sockRaw; if (hPing){ closesocket(sockRaw); sockRaw = INVALID_SOCKET; TerminateThread(hPing, 0); CloseHandle(hPing); hPing = NULL; } #endif if (net_readbuf){ VirtualFree(net_readbuf, NULL, MEM_RELEASE); net_readbuf = NULL; } if (net_writebuf){ VirtualFree(net_writebuf, NULL, MEM_RELEASE); net_writebuf = NULL; } //DirectDraw ? ReleaseDirectDraw(); // ??????????? EndDInput(); // DirectSound ? t_music_end(); // ???? cdda_stop(); // Rialbin ?? cleanupRealbin(); // ???????????? DeleteObject(hFont); // ????? EndIme(); // ???????? EndAction(); // ????????? cleanupNetwork(); // ????????????? ReleaseMutex(hMutex); // ???????? saveUserSetting(); // ???????? SaveChatRegistyStr(); // ????? // timeKillEvent(timerId); //{ // ALT+TAB ????? // int nOldVal; // SystemParametersInfo (SPI_SCREENSAVERRUNNING, FALSE, &nOldVal, 0); //} #ifdef _CHANNEL_MODIFY SaveChatData(NULL, 0, true); #endif #ifdef _REMAKE_20 #ifndef _STONDEBUG_ UnregisterHotKey(hWnd, 0); UnregisterHotKey(hWnd, 1); #endif #endif util_Release(); } #ifdef _CMD_MODE HANDLE hConsoleThread; DWORD ConsoleThreadID; volatile BOOL m_bRun; void ConsoleThread(void) { char cmd[256]; memset(cmd,0,sizeof(cmd)); int c,i; while(m_bRun) { printf("\n石器时代>"); i = 0; /* while( (c = getchar()) != '\n') { printf("Characters: %c \n", c); cmd[i] = 'q'; i++; }*/ *cmd = 'a '; //cmd[i] = '\0'; fflush(stdin); if( strcmp(cmd,"q") == 0) { m_bRun = FALSE; FreeConsole(); ExitThread(ConsoleThreadID); return; } if( cmd[0] == 'a' && cmd[1] == ' ') { int level; sscanf_s(cmd,"a %i",&level); if( level >= 0 && level <= 14) { //Patch_Accelerate(level); printf("SUCCESS: Acceleration level has been switched to %i.", level); continue; } else { printf("ERROR: Acceleration level out of range(0-14)."); continue; } } if( cmd[0] == 'l' && cmd[1] == ' ') { char addr[32]; char port[6]; char* p,*next_p; p = NULL; next_p = NULL; p = strtok_s(cmd," ",&next_p); if(p) { p = strtok_s(NULL," ",&next_p); if(p) { sprintf_s(addr,sizeof(addr),p); p = strtok_s(NULL," ",&next_p); if(p) { if(strtok_s(NULL," ",&next_p)) { continue; } else { sprintf_s(port,sizeof(port),p); printf("%s %s",addr,port); continue; } } else { continue; } } else { continue; } } } } } void InitConsoleWindow(void) { int hCrt; FILE *hf; AllocConsole(); SetConsoleTitle("石器时代"); hCrt = _open_osfhandle( (long)GetStdHandle(STD_OUTPUT_HANDLE),O_TEXT ); hf = _fdopen( hCrt, "w" ); *stdout = *hf; setvbuf( stdout, NULL, _IONBF, 0 ); hCrt = _open_osfhandle( (long)GetStdHandle(STD_INPUT_HANDLE), _O_TEXT ); hf = _fdopen( hCrt, "r" ); *stdin = *hf; setvbuf( stdin, NULL, _IONBF, 0 ); printf("\ ===================================\n\ ==== Console for StoneAge ====\n\ ==== USE \"h\" FOR HELP ====\n\ ===================================\n\ /*----------COMMAND LINE---------*/"); hConsoleThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ConsoleThread, NULL, 0, &ConsoleThreadID); if (hConsoleThread != NULL) m_bRun = TRUE; } #endif