// this is a wrapper to launch EDuke32 properly from Dukester X 1.5 // gcc -o duke3d_w32.exe wrapper.c #include #include #include #define ISWS(x) ((x == ' ') || (x == '\t') || (x == '\r') || (x == '\n')) #define UNUSED_PARAMETER(x) x=x int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow) { int i=0,j=0; char CmdLine[1024], sCmdLine[1024], szFileName[255]; LPTSTR szCmdLine; FILE * fp=fopen("wrapper.log","w"); STARTUPINFO si; PROCESS_INFORMATION pi; UNUSED_PARAMETER(hInstance); UNUSED_PARAMETER(hPrevInst); UNUSED_PARAMETER(nCmdShow); strcpy(sCmdLine,lpCmdLine); szFileName[0] = '\0'; while (sCmdLine[i] == ' ') i++; while (i < (signed)strlen(sCmdLine)) { if (sCmdLine[i] == '-' && sCmdLine[i+1] == 'n' && sCmdLine[i+2] == 'e' && sCmdLine[i+3] == 't') { CmdLine[i-1] = '\0'; i += 5; while (sCmdLine[i] != ' ' && i < (signed)strlen(sCmdLine)) { szFileName[j] = sCmdLine[i]; j++,i++; } szFileName[j] = '\0'; break; } else CmdLine[i] = sCmdLine[i]; i++; CmdLine[i] = '\0'; } if (szFileName[0] != '\0' && CmdLine[0] != '\0') sprintf(sCmdLine,"eduke32.exe %s -rmnet %s",CmdLine,szFileName); else if (CmdLine[0] != '\0') sprintf(sCmdLine,"eduke32.exe %s",CmdLine); else sprintf(sCmdLine,"eduke32.exe"); szCmdLine = sCmdLine; fprintf(fp,"EDuke32 wrapper for Dukester X v0.02\n"); fprintf(fp,"Copyright (c) 2006 EDuke32 team\n\n"); fprintf(fp,"Args passed to wrapper: %s\n",lpCmdLine); fprintf(fp,"Final command line: %s",szCmdLine); fclose(fp); ZeroMemory(&si,sizeof(si)); ZeroMemory(&pi,sizeof(pi)); si.cb = sizeof(si); printf("Launching EDuke32...\n\nPlease leave this window open for the entire duration of your game."); if (!CreateProcess(NULL,szCmdLine,NULL,NULL,0,0,NULL,NULL,&si,&pi)) { MessageBox(0,"Failed to start eduke32.exe.", "Failure starting game", MB_OK|MB_ICONSTOP); return 1; } else WaitForSingleObject(pi.hProcess,INFINITE); return 0; }