void SetCompressor(NCOMPRESSOR compressor) { int i; if(g_sdata.compressor != compressor) { WORD command; LPCTSTR compressor_name; if(compressor > COMPRESSOR_SCRIPT && compressor < COMPRESSOR_BEST) { command = compressor_commands[(int)compressor]; compressor_name = compressor_names[(int)compressor]; } else if(compressor == COMPRESSOR_BEST) { command = compressor_commands[(int)compressor]; compressor_name = compressor_names[(int)COMPRESSOR_SCRIPT+1]; } else { compressor = COMPRESSOR_SCRIPT; command = IDM_COMPRESSOR_SCRIPT; compressor_name = _T(""); } g_sdata.compressor = compressor; g_sdata.compressor_name = compressor_name; UpdateToolBarCompressorButton(); for(i=(int)COMPRESSOR_SCRIPT; i<= (int)COMPRESSOR_BEST; i++) { CheckMenuItem(g_sdata.menu, compressor_commands[i], MF_BYCOMMAND | MF_UNCHECKED); } CheckMenuItem(g_sdata.menu, command, MF_BYCOMMAND | MF_CHECKED); ResetObjects(); } }
// ----------------------------------------------------------------------------- // Load game // Loads all the relevant data for a level. // If level != -1, it loads the filename with extension changed to .min // Otherwise it loads the appropriate level mine. // returns 0=everything ok, 1=old version, -1=error int LoadMineDataCompiled (CFile& cf, int bFileInfo) { int nStartOffset; nStartOffset = cf.Tell (); InitGameFileInfo (); if (ReadGameFileInfo (cf, nStartOffset)) return -1; if (ReadLevelInfo (cf)) return -1; gameStates.render.bD2XLights = gameStates.app.bD2XLevel && (gameTopFileInfo.fileinfoVersion >= 34); if (bFileInfo) return 0; gameData.objs.nNextSignature = 0; gameData.render.lights.nStatic = 0; nGameSaveOrgRobots = 0; nGameSavePlayers = 0; if (ReadObjectInfo (cf)) return -1; if (ReadWallInfo (cf)) return -1; if (ReadDoorInfo (cf)) return -1; if (ReadTriggerInfo (cf)) return -1; if (ReadReactorInfo (cf)) return -1; if (ReadBotGenInfo (cf)) return -1; if (ReadEquipGenInfo (cf)) return -1; if (ReadLightDeltaIndexInfo (cf)) return -1; if (ReadLightDeltaInfo (cf)) return -1; ClearLightSubtracted (); ResetObjects (gameFileInfo.objects.count); CheckAndLinkObjects (); ClearTransientObjects (1); //1 means clear proximity bombs CheckAndFixDoors (); //gameData.walls.nOpenDoors = gameFileInfo.doors.count; gameData.trigs.m_nTriggers = gameFileInfo.triggers.count; gameData.walls.nWalls = gameFileInfo.walls.count; CheckAndFixWalls (); CheckAndFixTriggers (); gameData.matCens.nBotCenters = gameFileInfo.botGen.count; FixObjectSegs (); #if DBG dump_mine_info (); #endif if ((gameTopFileInfo.fileinfoVersion < GAME_VERSION) && ((gameTopFileInfo.fileinfoVersion != 25) || (GAME_VERSION != 26))) return 1; //means old version return 0; }
void LoadMRUFile(int position) { if (!g_sdata.thread && position >=0 && position < MRU_LIST_SIZE && g_mru_list[position][0]) { SetScript(g_mru_list[position]); if(IsValidFile(g_mru_list[position])) { PushMRUFile(g_mru_list[position]); } else { PopMRUFile(g_mru_list[position]); BuildMRUMenus(); } ResetObjects(); CompileNSISScript(); } }
NSIS_ENTRYPOINT_SIMPLEGUI int WINAPI _tWinMain(HINSTANCE hInst,HINSTANCE hOldInst,LPTSTR CmdLineParams,int ShowCmd) { MSG msg; int status; HACCEL haccel; memset(&g_sdata,0,sizeof(NSCRIPTDATA)); memset(&g_resize,0,sizeof(NRESIZEDATA)); memset(&g_find,0,sizeof(NFINDREPLACE)); g_sdata.hInstance = hInst; g_sdata.symbols = NULL; g_sdata.sigint_event_legacy = CreateEvent(NULL, FALSE, FALSE, MakensisAPI::SigintEventNameLegacy); g_sdata.verbosity = (unsigned char) ReadRegSettingDW(REGVERBOSITY, 4); if (g_sdata.verbosity > 4) g_sdata.verbosity = 4; RestoreSymbols(); HINSTANCE hRichEditDLL = LoadLibrary(_T("RichEd20.dll")); if (!InitBranding()) { MessageBox(0,NSISERROR,ERRBOXTITLE,MB_ICONEXCLAMATION|MB_OK); return 1; } ResetObjects(); HWND hDialog = CreateDialog(g_sdata.hInstance,MAKEINTRESOURCE(DLG_MAIN),0,DialogProc); if (!hDialog) { MessageBox(0,DLGERROR,ERRBOXTITLE,MB_ICONEXCLAMATION|MB_OK); return 1; } haccel = LoadAccelerators(g_sdata.hInstance, MAKEINTRESOURCE(IDK_ACCEL)); while ((status=GetMessage(&msg,0,0,0))!=0) { if (status==-1) return -1; if (!IsDialogMessage(g_find.hwndFind, &msg)) { if (!TranslateAccelerator(hDialog,haccel,&msg)) { if (!IsDialogMessage(hDialog,&msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } } } MemSafeFree(g_sdata.script); if (g_sdata.script_cmd_args) GlobalFree(g_sdata.script_cmd_args); if (g_sdata.sigint_event) CloseHandle(g_sdata.sigint_event); if (g_sdata.sigint_event_legacy) CloseHandle(g_sdata.sigint_event_legacy); FreeLibrary(hRichEditDLL); FinalizeUpdate(); return msg.wParam; }
void LoadMRUFile(int position) { if (!g_sdata.thread && position >=0 && position < MRU_LIST_SIZE && g_mru_list[position][0]) { g_sdata.script = (char *)GlobalAlloc(GPTR,lstrlen(g_mru_list[position])+3); wsprintf(g_sdata.script,"\"%s\"",g_mru_list[position]); if(IsValidFile(g_mru_list[position])) { PushMRUFile(g_mru_list[position]); } else { PopMRUFile(g_mru_list[position]); BuildMRUMenus(); } ResetObjects(); CompileNSISScript(); } }
bool SceneTutorial21::Init() { int width = 640; int height = 480; glViewport(0, 0, width, height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0.0f, width, height, 0.0f, -1.0f, 1.0f); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glShadeModel(GL_SMOOTH); // Enable Smooth Shading glClearColor(0.0f, 0.0f, 0.0f, 0.5f); // Black Background glClearDepth(1.0f); // Depth Buffer Setup glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); // Set Line Antialiasing glEnable(GL_BLEND); // Enable Blending glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // Type Of Blending To Use for( int i = 0; i < 11; i ++ ) { for( int j = 0; j < 10; j ++ ) { vline[i][j] = 0; hline[j][i] = 0; } } filled = false; gameover = false; anti = true; delay = 0; adjust = 3; lives = 5; level = 1; level2 = level; stage = 1; img = MyImage::LoadImage("Textures/Image.bmp"); ResetObjects(); return true; }
//************************************************************************ void CNutDropScene::OnTimer (HWND hWnd, UINT id) //************************************************************************ { if (id != DROP_TIMER) { CGBScene::OnTimer (hWnd, id); return; } if (m_SoundPlaying == SuccessPlaying || m_SoundPlaying == IntroPlaying) return; // Select the next object if (SelectObject() == -1) { // If out of objects, re-cycle them ResetObjects(); SelectObject(); } }
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, char *cmdParam, int cmdShow) { MSG msg; int status; HACCEL haccel; my_memset(&g_sdata,0,sizeof(NSCRIPTDATA)); my_memset(&g_resize,0,sizeof(NRESIZEDATA)); my_memset(&g_find,0,sizeof(NFINDREPLACE)); g_sdata.hInstance=GetModuleHandle(0); g_sdata.script_alloced=false; g_sdata.symbols = NULL; RestoreSymbols(); if (!InitBranding()) { MessageBox(0,NSISERROR,"Error",MB_ICONEXCLAMATION|MB_OK); return 1; } ResetObjects(); HWND hDialog = CreateDialog(g_sdata.hInstance,MAKEINTRESOURCE(DLG_MAIN),0,DialogProc); if (!hDialog) { MessageBox(0,DLGERROR,"Error",MB_ICONEXCLAMATION|MB_OK); return 1; } haccel = LoadAccelerators(g_sdata.hInstance, MAKEINTRESOURCE(IDK_ACCEL)); while ((status=GetMessage(&msg,0,0,0))!=0) { if (status==-1) return -1; if (!IsDialogMessage(g_find.hwndFind, &msg)) { if (!TranslateAccelerator(hDialog,haccel,&msg)) { if (!IsDialogMessage(hDialog,&msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } } } if (g_sdata.script_alloced) GlobalFree(g_sdata.script); ExitProcess(msg.wParam); return msg.wParam; }
int WINAPI WinMain( HINSTANCE hInstance, // Instance HINSTANCE hPrevInstance, // Previous Instance LPSTR lpCmdLine, // Command Line Parameters int nCmdShow) // Window Show State { MSG msg; // Windows Message Structure BOOL done=FALSE; // Bool Variable To Exit Loop // Ask The User Which Screen Mode They Prefer if (MessageBox(NULL,"Would You Like To Run In Fullscreen Mode?", "Start FullScreen?",MB_YESNO|MB_ICONQUESTION)==IDNO) { fullscreen=FALSE; // Windowed Mode } // Create Our OpenGL Window if (!CreateGLWindow("NeHe's Line Tutorial",640,480,16,fullscreen)) { return 0; // Quit If Window Was Not Created } ResetObjects(); // Set Player / Enemy Starting Positions TimerInit(); while(!done) // Loop That Runs While done=FALSE { if (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) // Is There A Message Waiting? { if (msg.message==WM_QUIT) // Have We Received A Quit Message? { done=TRUE; // If So done=TRUE } else // If Not, Deal With Window Messages { TranslateMessage(&msg); // Translate The Message DispatchMessage(&msg); // Dispatch The Message } } else // If There Are No Messages { float start=TimerGetTime(); // Grab Timer Value Before We Draw // Draw The Scene. Watch For ESC Key And Quit Messages From DrawGLScene() if ((active && !DrawGLScene()) || keys[VK_ESCAPE]) // Active? Was There A Quit Received? { done=TRUE; // ESC or DrawGLScene Signalled A Quit } else // Not Time To Quit, Update Screen { SwapBuffers(hDC); // Swap Buffers (Double Buffering) } while(TimerGetTime()<start+float(steps[adjust]*2.0f)) {} // Waste Cycles On Fast Systems if (keys[VK_F1]) // Is F1 Being Pressed? { keys[VK_F1]=FALSE; // If So Make Key FALSE KillGLWindow(); // Kill Our Current Window fullscreen=!fullscreen; // Toggle Fullscreen / Windowed Mode // Recreate Our OpenGL Window if (!CreateGLWindow("NeHe's Line Tutorial",640,480,16,fullscreen)) { return 0; // Quit If Window Was Not Created } } if (keys['A'] && !ap) // If 'A' Key Is Pressed And Not Held { ap=TRUE; // ap Becomes TRUE anti=!anti; // Toggle Antialiasing } if (!keys['A']) // If 'A' Key Has Been Released { ap=FALSE; // ap Becomes FALSE } if (!gameover && active) // If Game Isn't Over And Programs Active Move Objects { for (loop1=0; loop1<(stage*level); loop1++) // Loop Through The Different Stages { if ((enemy[loop1].x<player.x) && (enemy[loop1].fy==enemy[loop1].y*40)) { enemy[loop1].x++; // Move The Enemy Right } if ((enemy[loop1].x>player.x) && (enemy[loop1].fy==enemy[loop1].y*40)) { enemy[loop1].x--; // Move The Enemy Left } if ((enemy[loop1].y<player.y) && (enemy[loop1].fx==enemy[loop1].x*60)) { enemy[loop1].y++; // Move The Enemy Down } if ((enemy[loop1].y>player.y) && (enemy[loop1].fx==enemy[loop1].x*60)) { enemy[loop1].y--; // Move The Enemy Up } if (delay>(3-level) && (hourglass.fx!=2)) // If Our Delay Is Done And Player Doesn't Have Hourglass { delay=0; // Reset The Delay Counter Back To Zero for (loop2=0; loop2<(stage*level); loop2++) // Loop Through All The Enemies { if (enemy[loop2].fx<enemy[loop2].x*60) // Is Fine Position On X Axis Lower Than Intended Position? { enemy[loop2].fx+=steps[adjust]; // If So, Increase Fine Position On X Axis enemy[loop2].spin+=steps[adjust]; // Spin Enemy Clockwise } if (enemy[loop2].fx>enemy[loop2].x*60) // Is Fine Position On X Axis Higher Than Intended Position? { enemy[loop2].fx-=steps[adjust]; // If So, Decrease Fine Position On X Axis enemy[loop2].spin-=steps[adjust]; // Spin Enemy Counter Clockwise } if (enemy[loop2].fy<enemy[loop2].y*40) // Is Fine Position On Y Axis Lower Than Intended Position? { enemy[loop2].fy+=steps[adjust]; // If So, Increase Fine Position On Y Axis enemy[loop2].spin+=steps[adjust]; // Spin Enemy Clockwise } if (enemy[loop2].fy>enemy[loop2].y*40) // Is Fine Position On Y Axis Higher Than Intended Position? { enemy[loop2].fy-=steps[adjust]; // If So, Decrease Fine Position On Y Axis enemy[loop2].spin-=steps[adjust]; // Spin Enemy Counter Clockwise } } } // Are Any Of The Enemies On Top Of The Player? if ((enemy[loop1].fx==player.fx) && (enemy[loop1].fy==player.fy)) { lives--; // If So, Player Loses A Life if (lives==0) // Are We Out Of Lives? { gameover=TRUE; // If So, gameover Becomes TRUE } ResetObjects(); // Reset Player / Enemy Positions PlaySound("Data/Die.wav", NULL, SND_SYNC); // Play The Death Sound } } if (keys[VK_RIGHT] && (player.x<10) && (player.fx==player.x*60) && (player.fy==player.y*40)) { hline[player.x][player.y]=TRUE; // Mark The Current Horizontal Border As Filled player.x++; // Move The Player Right } if (keys[VK_LEFT] && (player.x>0) && (player.fx==player.x*60) && (player.fy==player.y*40)) { player.x--; // Move The Player Left hline[player.x][player.y]=TRUE; // Mark The Current Horizontal Border As Filled } if (keys[VK_DOWN] && (player.y<10) && (player.fx==player.x*60) && (player.fy==player.y*40)) { vline[player.x][player.y]=TRUE; // Mark The Current Verticle Border As Filled player.y++; // Move The Player Down } if (keys[VK_UP] && (player.y>0) && (player.fx==player.x*60) && (player.fy==player.y*40)) { player.y--; // Move The Player Up vline[player.x][player.y]=TRUE; // Mark The Current Verticle Border As Filled } if (player.fx<player.x*60) // Is Fine Position On X Axis Lower Than Intended Position? { player.fx+=steps[adjust]; // If So, Increase The Fine X Position } if (player.fx>player.x*60) // Is Fine Position On X Axis Greater Than Intended Position? { player.fx-=steps[adjust]; // If So, Decrease The Fine X Position } if (player.fy<player.y*40) // Is Fine Position On Y Axis Lower Than Intended Position? { player.fy+=steps[adjust]; // If So, Increase The Fine Y Position } if (player.fy>player.y*40) // Is Fine Position On Y Axis Lower Than Intended Position? { player.fy-=steps[adjust]; // If So, Decrease The Fine Y Position } } else // Otherwise { if (keys[' ']) // If Spacebar Is Being Pressed { gameover=FALSE; // gameover Becomes FALSE filled=TRUE; // filled Becomes TRUE level=1; // Starting Level Is Set Back To One level2=1; // Displayed Level Is Also Set To One stage=0; // Game Stage Is Set To Zero lives=5; // Lives Is Set To Five } } if (filled) // Is The Grid Filled In? { PlaySound("Data/Complete.wav", NULL, SND_SYNC); // If So, Play The Level Complete Sound stage++; // Increase The Stage if (stage>3) // Is The Stage Higher Than 3? { stage=1; // If So, Set The Stage To One level++; // Increase The Level level2++; // Increase The Displayed Level if (level>3) // Is The Level Greater Than 3? { level=3; // If So, Set The Level To 3 lives++; // Give The Player A Free Life if (lives>5) // Does The Player Have More Than 5 Lives? { lives=5; // If So, Set Lives To Five } } } ResetObjects(); // Reset Player / Enemy Positions for (loop1=0; loop1<11; loop1++) // Loop Through The Grid X Coordinates { for (loop2=0; loop2<11; loop2++) // Loop Through The Grid Y Coordinates { if (loop1<10) // If X Coordinate Is Less Than 10 { hline[loop1][loop2]=FALSE; // Set The Current Horizontal Value To FALSE } if (loop2<10) // If Y Coordinate Is Less Than 10 { vline[loop1][loop2]=FALSE; // Set The Current Vertical Value To FALSE } } } } // If The Player Hits The Hourglass While It's Being Displayed On The Screen if ((player.fx==hourglass.x*60) && (player.fy==hourglass.y*40) && (hourglass.fx==1)) { // Play Freeze Enemy Sound PlaySound("Data/freeze.wav", NULL, SND_ASYNC | SND_LOOP); hourglass.fx=2; // Set The hourglass fx Variable To Two hourglass.fy=0; // Set The hourglass fy Variable To Zero } player.spin+=0.5f*steps[adjust]; // Spin The Player Clockwise if (player.spin>360.0f) // Is The spin Value Greater Than 360? { player.spin-=360; // If So, Subtract 360 } hourglass.spin-=0.25f*steps[adjust]; // Spin The Hourglass Counter Clockwise if (hourglass.spin<0.0f) // Is The spin Value Less Than 0? { hourglass.spin+=360.0f; // If So, Add 360 } hourglass.fy+=steps[adjust]; // Increase The hourglass fy Variable if ((hourglass.fx==0) && (hourglass.fy>6000/level)) // Is The hourglass fx Variable Equal To 0 And The fy { // Variable Greater Than 6000 Divided By The Current Level? PlaySound("Data/hourglass.wav", NULL, SND_ASYNC); // If So, Play The Hourglass Appears Sound hourglass.x=rand()%10+1; // Give The Hourglass A Random X Value hourglass.y=rand()%11; // Give The Hourglass A Random Y Value hourglass.fx=1; // Set hourglass fx Variable To One (Hourglass Stage) hourglass.fy=0; // Set hourglass fy Variable To Zero (Counter) } if ((hourglass.fx==1) && (hourglass.fy>6000/level)) // Is The hourglass fx Variable Equal To 1 And The fy { // Variable Greater Than 6000 Divided By The Current Level? hourglass.fx=0; // If So, Set fx To Zero (Hourglass Will Vanish) hourglass.fy=0; // Set fy to Zero (Counter Is Reset) } if ((hourglass.fx==2) && (hourglass.fy>500+(500*level))) // Is The hourglass fx Variable Equal To 2 And The fy { // Variable Greater Than 500 Plus 500 Times The Current Level? PlaySound(NULL, NULL, 0); // If So, Kill The Freeze Sound hourglass.fx=0; // Set hourglass fx Variable To Zero hourglass.fy=0; // Set hourglass fy Variable To Zero } delay++; // Increase The Enemy Delay Counter } } // Shutdown KillGLWindow(); // Kill The Window return (msg.wParam); // Exit The Program }
void SceneTutorial21::Update(float dt) { Scene::Update(dt); if (!gameover) // If Game Isn't Over And Programs Active Move Objects { for (loop1=0; loop1<(stage*level); loop1++) // Loop Through The Different Stages { if ((enemy[loop1].x<player.x) && (enemy[loop1].fy==enemy[loop1].y*40)) { enemy[loop1].x += dt; // Move The Enemy Right } if ((enemy[loop1].x>player.x) && (enemy[loop1].fy==enemy[loop1].y*40)) { enemy[loop1].x -= dt; // Move The Enemy Left } if ((enemy[loop1].y<player.y) && (enemy[loop1].fx==enemy[loop1].x*60)) { enemy[loop1].y += dt; // Move The Enemy Down } if ((enemy[loop1].y>player.y) && (enemy[loop1].fx==enemy[loop1].x*60)) { enemy[loop1].y -= dt; // Move The Enemy Up } if (delay>(3-level) && (hourglass.fx!=2)) // If Our Delay Is Done And Player Doesn't Have Hourglass { delay=0; // Reset The Delay Counter Back To Zero for (loop2=0; loop2<(stage*level); loop2++) // Loop Through All The Enemies { if (enemy[loop2].fx<enemy[loop2].x*60) // Is Fine Position On X Axis Lower Than Intended Position? { enemy[loop2].fx+=steps[adjust]; // If So, Increase Fine Position On X Axis enemy[loop2].spin+=steps[adjust]; // Spin Enemy Clockwise } if (enemy[loop2].fx>enemy[loop2].x*60) // Is Fine Position On X Axis Higher Than Intended Position? { enemy[loop2].fx-=steps[adjust]; // If So, Decrease Fine Position On X Axis enemy[loop2].spin-=steps[adjust]; // Spin Enemy Counter Clockwise } if (enemy[loop2].fy<enemy[loop2].y*40) // Is Fine Position On Y Axis Lower Than Intended Position? { enemy[loop2].fy+=steps[adjust]; // If So, Increase Fine Position On Y Axis enemy[loop2].spin+=steps[adjust]; // Spin Enemy Clockwise } if (enemy[loop2].fy>enemy[loop2].y*40) // Is Fine Position On Y Axis Higher Than Intended Position? { enemy[loop2].fy-=steps[adjust]; // If So, Decrease Fine Position On Y Axis enemy[loop2].spin-=steps[adjust]; // Spin Enemy Counter Clockwise } } } // Are Any Of The Enemies On Top Of The Player? if ((enemy[loop1].fx==player.fx) && (enemy[loop1].fy==player.fy)) { lives--; // If So, Player Loses A Life if (lives==0) // Are We Out Of Lives? { gameover=true; // If So, gameover Becomes TRUE } ResetObjects(); // Reset Player / Enemy Positions // PlaySound("Data/Die.wav", NULL, SND_SYNC); // Play The Death Sound } } if (Keyboard::PressedSpecial(GLUT_KEY_RIGHT) && (player.x<10) && (player.fx==player.x*60) && (player.fy==player.y*40)) { hline[player.x][player.y]=true; // Mark The Current Horizontal Border As Filled player.x += 5 * dt; // Move The Player Right } if (Keyboard::PressedSpecial(GLUT_KEY_LEFT) && (player.x>0) && (player.fx==player.x*60) && (player.fy==player.y*40)) { player.x--; // Move The Player Left hline[player.x][player.y]=true; // Mark The Current Horizontal Border As Filled } if (Keyboard::PressedSpecial(GLUT_KEY_DOWN) && (player.y<10) && (player.fx==player.x*60) && (player.fy==player.y*40)) { vline[player.x][player.y]=true; // Mark The Current Verticle Border As Filled player.y++; // Move The Player Down } if (Keyboard::PressedSpecial(GLUT_KEY_UP) && (player.y>0) && (player.fx==player.x*60) && (player.fy==player.y*40)) { player.y--; // Move The Player Up vline[player.x][player.y]=true; // Mark The Current Verticle Border As Filled } if (player.fx<player.x*60) // Is Fine Position On X Axis Lower Than Intended Position? { player.fx+=steps[adjust]; // If So, Increase The Fine X Position } if (player.fx>player.x*60) // Is Fine Position On X Axis Greater Than Intended Position? { player.fx-=steps[adjust]; // If So, Decrease The Fine X Position } if (player.fy<player.y*40) // Is Fine Position On Y Axis Lower Than Intended Position? { player.fy+=steps[adjust]; // If So, Increase The Fine Y Position } if (player.fy>player.y*40) // Is Fine Position On Y Axis Lower Than Intended Position? { player.fy-=steps[adjust]; // If So, Decrease The Fine Y Position } } else // Otherwise { if (Keyboard::PressedNormal(' ')) // If Spacebar Is Being Pressed { gameover=false; // gameover Becomes FALSE filled=true; // filled Becomes TRUE level=1; // Starting Level Is Set Back To One level2=1; // Displayed Level Is Also Set To One stage=0; // Game Stage Is Set To Zero lives=5; // Lives Is Set To Five } } if (filled) // Is The Grid Filled In? { // PlaySound("Data/Complete.wav", NULL, SND_SYNC); // If So, Play The Level Complete Sound stage++; // Increase The Stage if (stage>3) // Is The Stage Higher Than 3? { stage=1; // If So, Set The Stage To One level++; // Increase The Level level2++; // Increase The Displayed Level if (level>3) // Is The Level Greater Than 3? { level=3; // If So, Set The Level To 3 lives++; // Give The Player A Free Life if (lives>5) // Does The Player Have More Than 5 Lives? { lives=5; // If So, Set Lives To Five } } } ResetObjects(); // Reset Player / Enemy Positions for (loop1=0; loop1<11; loop1++) // Loop Through The Grid X Coordinates { for (loop2=0; loop2<11; loop2++) // Loop Through The Grid Y Coordinates { if (loop1<10) // If X Coordinate Is Less Than 10 { hline[loop1][loop2]=false; // Set The Current Horizontal Value To FALSE } if (loop2<10) // If Y Coordinate Is Less Than 10 { vline[loop1][loop2]=false; // Set The Current Vertical Value To FALSE } } } } // If The Player Hits The Hourglass While It's Being Displayed On The Screen if ((player.fx==hourglass.x*60) && (player.fy==hourglass.y*40) && (hourglass.fx==1)) { // Play Freeze Enemy Sound // PlaySound("Data/freeze.wav", NULL, SND_ASYNC | SND_LOOP); hourglass.fx=2; // Set The hourglass fx Variable To Two hourglass.fy=0; // Set The hourglass fy Variable To Zero } player.spin+=0.5f*steps[adjust]; // Spin The Player Clockwise if (player.spin>360.0f) // Is The spin Value Greater Than 360? { player.spin-=360; // If So, Subtract 360 } hourglass.spin-=0.25f*steps[adjust]; // Spin The Hourglass Counter Clockwise if (hourglass.spin<0.0f) // Is The spin Value Less Than 0? { hourglass.spin+=360.0f; // If So, Add 360 } hourglass.fy+=steps[adjust]; // Increase The hourglass fy Variable if ((hourglass.fx==0) && (hourglass.fy>6000/level)) // Is The hourglass fx Variable Equal To 0 And The fy { // Variable Greater Than 6000 Divided By The Current Level? // PlaySound("Data/hourglass.wav", NULL, SND_ASYNC); // If So, Play The Hourglass Appears Sound hourglass.x=rand()%10+1; // Give The Hourglass A Random X Value hourglass.y=rand()%11; // Give The Hourglass A Random Y Value hourglass.fx=1; // Set hourglass fx Variable To One (Hourglass Stage) hourglass.fy=0; // Set hourglass fy Variable To Zero (Counter) } if ((hourglass.fx==1) && (hourglass.fy>6000/level)) // Is The hourglass fx Variable Equal To 1 And The fy { // Variable Greater Than 6000 Divided By The Current Level? hourglass.fx=0; // If So, Set fx To Zero (Hourglass Will Vanish) hourglass.fy=0; // Set fy to Zero (Counter Is Reset) } if ((hourglass.fx==2) && (hourglass.fy>500+(500*level))) // Is The hourglass fx Variable Equal To 2 And The fy { // Variable Greater Than 500 Plus 500 Times The Current Level? // PlaySound(NULL, NULL, 0); // If So, Kill The Freeze Sound hourglass.fx=0; // Set hourglass fx Variable To Zero hourglass.fy=0; // Set hourglass fy Variable To Zero } delay++; // Increase The Enemy Delay Counter }
INT_PTR CALLBACK SettingsProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { case WM_INITDIALOG: { int i = 0; for(i = (int)COMPRESSOR_SCRIPT; i <= (int)COMPRESSOR_BEST; i++) { SendDlgItemMessage(hwndDlg, IDC_COMPRESSOR, CB_ADDSTRING, 0, (LPARAM)compressor_display_names[i]); } SendDlgItemMessage(hwndDlg, IDC_COMPRESSOR, CB_SETCURSEL, (WPARAM)g_sdata.default_compressor, (LPARAM)0); SetSymbols(hwndDlg, g_sdata.symbols); SetFocus(GetDlgItem(hwndDlg, IDC_SYMBOL)); break; } case WM_MAKENSIS_LOADSYMBOLSET: { TCHAR *name = (TCHAR *)wParam; TCHAR **symbols = LoadSymbolSet(name); HGLOBAL hMem; SetSymbols(hwndDlg, symbols); if(symbols) { hMem = GlobalHandle(symbols); GlobalUnlock(hMem); GlobalFree(hMem); } break; } case WM_MAKENSIS_SAVESYMBOLSET: { TCHAR *name = (TCHAR *)wParam; TCHAR **symbols = GetSymbols(hwndDlg); HGLOBAL hMem; if(symbols) { SaveSymbolSet(name, symbols); hMem = GlobalHandle(symbols); GlobalUnlock(hMem); GlobalFree(hMem); } break; } case WM_COMMAND: { switch (LOWORD(wParam)) { case IDOK: { ResetObjects(); ResetSymbols(); g_sdata.symbols = GetSymbols(hwndDlg); int n = SendDlgItemMessage(hwndDlg, IDC_COMPRESSOR, CB_GETCURSEL, (WPARAM)0, (LPARAM)0); if (n >= (int)COMPRESSOR_SCRIPT && n <= (int)COMPRESSOR_BEST) { g_sdata.default_compressor = (NCOMPRESSOR)n; } else { g_sdata.default_compressor = COMPRESSOR_SCRIPT; } EndDialog(hwndDlg, TRUE); SetCompressor(g_sdata.default_compressor); } break; case IDCANCEL: EndDialog(hwndDlg, TRUE); break; case IDC_RIGHT: { int n = SendDlgItemMessage(hwndDlg, IDC_SYMBOL, WM_GETTEXTLENGTH, 0, 0); if(n > 0) { TCHAR *buf = (TCHAR*) MemAllocZI((n+1)*sizeof(TCHAR)); SendDlgItemMessage(hwndDlg, IDC_SYMBOL, WM_GETTEXT, n+1, (LPARAM)buf); if(_tcsstr(buf,_T(" ")) || _tcsstr(buf,_T("\t"))) { MessageBox(hwndDlg,SYMBOLSERROR,ERRBOXTITLE,MB_OK|MB_ICONSTOP); MemFree(buf); break; } n = SendDlgItemMessage(hwndDlg, IDC_VALUE, WM_GETTEXTLENGTH, 0, 0); if(n > 0) { TCHAR *buf2 = (TCHAR*) MemAllocZI((n+1)*sizeof(TCHAR)); SendDlgItemMessage(hwndDlg, IDC_VALUE, WM_GETTEXT, n+1, (LPARAM)buf2); TCHAR *buf3 = (TCHAR*) MemAllocZI((lstrlen(buf)+lstrlen(buf2)+2)*sizeof(TCHAR)); wsprintf(buf3,_T("%s=%s"),buf,buf2); MemFree(buf); buf = buf3; MemFree(buf2); } int idx = SendDlgItemMessage(hwndDlg, IDC_SYMBOLS, LB_ADDSTRING, 0, (LPARAM)buf); if (idx >= 0) { SendDlgItemMessage(hwndDlg, IDC_SYMBOLS, LB_SETSEL, FALSE, -1); SendDlgItemMessage(hwndDlg, IDC_SYMBOLS, LB_SETSEL, TRUE, idx); } EnableSymbolEditButtons(hwndDlg); SendDlgItemMessage(hwndDlg, IDC_SYMBOL, WM_SETTEXT, 0, 0); SendDlgItemMessage(hwndDlg, IDC_VALUE, WM_SETTEXT, 0, 0); MemFree(buf); EnableSymbolSetButtons(hwndDlg); } } break; case IDC_LEFT: { if (SendDlgItemMessage(hwndDlg, IDC_SYMBOLS, LB_GETSELCOUNT, 0, 0) != 1) break; int index; int num = SendDlgItemMessage(hwndDlg, IDC_SYMBOLS, LB_GETSELITEMS, 1, (LPARAM) &index); if(num == 1) { int n = SendDlgItemMessage(hwndDlg, IDC_SYMBOLS, LB_GETTEXTLEN, (WPARAM)index, 0); if(n > 0) { TCHAR *buf = (TCHAR*) MemAllocZI((n+1)*sizeof(TCHAR)); SendDlgItemMessage(hwndDlg, IDC_SYMBOLS, LB_GETTEXT, (WPARAM)index, (LPARAM)buf); TCHAR *p = _tcsstr(buf,_T("=")); if(p) { SendDlgItemMessage(hwndDlg, IDC_VALUE, WM_SETTEXT, 0, (LPARAM)(p+1)); *p=0; } SendDlgItemMessage(hwndDlg, IDC_SYMBOL, WM_SETTEXT, 0, (LPARAM)buf); MemFree(buf); SendDlgItemMessage(hwndDlg, IDC_SYMBOLS, LB_DELETESTRING, (WPARAM)index, 0); EnableWindow(GetDlgItem(hwndDlg, IDC_LEFT), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_DEL), FALSE); EnableSymbolSetButtons(hwndDlg); } } } break; case IDC_CLEAR: { SendDlgItemMessage(hwndDlg, IDC_SYMBOLS, LB_RESETCONTENT , 0, 0); EnableSymbolSetButtons(hwndDlg); } break; case IDC_LOAD: case IDC_SAVE: { g_symbol_set_mode = IDC_LOAD == LOWORD(wParam) ? 1 : 2; DialogBox(g_sdata.hInstance,MAKEINTRESOURCE(DLG_SYMBOLSET),hwndDlg,(DLGPROC)SymbolSetProc); } break; case IDC_DEL: { int n = SendDlgItemMessage(hwndDlg, IDC_SYMBOLS, LB_GETSELCOUNT, 0, 0); int *items = (int*) MemAllocZI(n*sizeof(int)); if (items) { SendDlgItemMessage(hwndDlg, IDC_SYMBOLS, LB_GETSELITEMS, (WPARAM)n, (LPARAM)items); for(int i=n-1;i>=0;i--) SendDlgItemMessage(hwndDlg, IDC_SYMBOLS, LB_DELETESTRING, (WPARAM)items[i], 0); MemFree(items); } EnableSymbolEditButtons(hwndDlg); EnableSymbolSetButtons(hwndDlg); } break; case IDC_SYMBOL: if(HIWORD(wParam) == EN_CHANGE) { int n = SendDlgItemMessage(hwndDlg, IDC_SYMBOL, WM_GETTEXTLENGTH, 0, 0); EnableWindow(GetDlgItem(hwndDlg, IDC_RIGHT), n > 0); } break; case IDC_SYMBOLS: if (HIWORD(wParam) == LBN_SELCHANGE) { EnableSymbolEditButtons(hwndDlg); } else if (HIWORD(wParam) == LBN_DBLCLK) { SendDlgItemMessage(hwndDlg, IDC_LEFT, BM_CLICK, 0, 0); } break; } break; } } return FALSE; }
INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_INITDIALOG: { g_sdata.hwnd=hwndDlg; HICON hIcon = LoadIcon(g_sdata.hInstance,MAKEINTRESOURCE(IDI_ICON)); SetClassLongPtr(hwndDlg,GCLP_HICON,(LONG_PTR)hIcon); // Altered by Darren Owen (DrO) on 29/9/2003 // Added in receiving of mouse and key events from the richedit control SendMessage(GetDlgItem(hwndDlg,IDC_LOGWIN),EM_SETEVENTMASK,(WPARAM)NULL,ENM_SELCHANGE|ENM_MOUSEEVENTS|ENM_KEYEVENTS); DragAcceptFiles(g_sdata.hwnd,FALSE); g_sdata.menu = GetMenu(g_sdata.hwnd); g_sdata.fileSubmenu = FindSubMenu(g_sdata.menu, IDM_FILE); g_sdata.editSubmenu = FindSubMenu(g_sdata.menu, IDM_EDIT); g_sdata.toolsSubmenu = FindSubMenu(g_sdata.menu, IDM_TOOLS); RestoreMRUList(); CreateToolBar(); InitTooltips(g_sdata.hwnd); SetDlgItemText(g_sdata.hwnd,IDC_VERSION,g_sdata.branding); HFONT hFont = CreateFont(14,FW_NORMAL,FIXED_PITCH|FF_DONTCARE,_T("Courier New")); SendDlgItemMessage(hwndDlg,IDC_LOGWIN,WM_SETFONT,(WPARAM)hFont,0); RestoreWindowPos(g_sdata.hwnd); RestoreCompressor(); SetScript(_T("")); g_sdata.compressor = COMPRESSOR_NONE_SELECTED; g_sdata.userSelectCompressor = FALSE; ProcessCommandLine(); if(g_sdata.compressor == COMPRESSOR_NONE_SELECTED) { SetCompressor(g_sdata.default_compressor); } if(g_sdata.userSelectCompressor) { if (DialogBox(g_sdata.hInstance,MAKEINTRESOURCE(DLG_COMPRESSOR),g_sdata.hwnd,(DLGPROC)CompressorProc)) { EnableItems(g_sdata.hwnd); return TRUE; } } CompileNSISScript(); return TRUE; } case WM_PAINT: { PAINTSTRUCT ps; GetGripperPos(hwndDlg, g_resize.griprect); HDC hdc = BeginPaint(hwndDlg, &ps); DrawFrameControl(hdc, &g_resize.griprect, DFC_SCROLL, DFCS_SCROLLSIZEGRIP); EndPaint(hwndDlg, &ps); return TRUE; } case WM_DESTROY: { DragAcceptFiles(g_sdata.hwnd,FALSE); SaveSymbols(); SaveCompressor(); SaveMRUList(); SaveWindowPos(g_sdata.hwnd); ImageList_Destroy(g_toolbar.imagelist); ImageList_Destroy(g_toolbar.imagelistd); ImageList_Destroy(g_toolbar.imagelisth); DestroyTooltips(); PostQuitMessage(0); return TRUE; } case WM_CLOSE: { if (!g_sdata.thread) { DestroyWindow(hwndDlg); } return TRUE; } case WM_DROPFILES: { int num; TCHAR szTmp[MAX_PATH]; num = DragQueryFile((HDROP)wParam,(UINT)-1,NULL,0); if (num==1) { DragQueryFile((HDROP)wParam,0,szTmp,MAX_PATH); if (lstrlen(szTmp)>0) { SetScript(szTmp); PushMRUFile(g_sdata.script); ResetObjects(); CompileNSISScript(); } } else { MessageBox(hwndDlg,MULTIDROPERROR,ERRBOXTITLE,MB_OK|MB_ICONSTOP); } DragFinish((HDROP)wParam); break; } case WM_GETMINMAXINFO: { ((MINMAXINFO*)lParam)->ptMinTrackSize.x=MINWIDTH; ((MINMAXINFO*)lParam)->ptMinTrackSize.y=MINHEIGHT; } case WM_ENTERSIZEMOVE: { GetClientRect(g_sdata.hwnd, &g_resize.resizeRect); return TRUE; } case WM_SIZE: { if ((wParam == SIZE_MAXHIDE)||(wParam == SIZE_MAXSHOW)) return TRUE; RECT rSize; if (hwndDlg == g_sdata.hwnd) { GetClientRect(g_sdata.hwnd, &rSize); if (((rSize.right==0)&&(rSize.bottom==0))||((g_resize.resizeRect.right==0)&&(g_resize.resizeRect.bottom==0))) return TRUE; g_resize.dx = rSize.right - g_resize.resizeRect.right; g_resize.dy = rSize.bottom - g_resize.resizeRect.bottom; EnumChildWindows(g_sdata.hwnd, DialogResize, (LPARAM)0); g_resize.resizeRect = rSize; } return TRUE; } case WM_SIZING: { InvalidateRect(hwndDlg, &g_resize.griprect, TRUE); GetGripperPos(hwndDlg, g_resize.griprect); return TRUE; } case WM_NCHITTEST: { RECT r = g_resize.griprect; MapWindowPoints(hwndDlg, 0, (POINT*)&r, 2); POINT pt = {GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)}; if (PtInRect(&r, pt)) { SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, HTBOTTOMRIGHT); return TRUE; } return FALSE; } case WM_MAKENSIS_PROCESSCOMPLETE: { if (g_sdata.thread) { CloseHandle(g_sdata.thread); g_sdata.thread=0; } if(g_sdata.compressor == COMPRESSOR_BEST) { if (g_sdata.retcode==0 && FileExists(g_sdata.output_exe)) { TCHAR temp_file_name[1024]; // BUGBUG: Hardcoded buffer size wsprintf(temp_file_name,_T("%s_makensisw_temp"),g_sdata.output_exe); if(!lstrcmpi(g_sdata.compressor_name,compressor_names[(int)COMPRESSOR_SCRIPT+1])) { SetCompressorStats(); CopyFile(g_sdata.output_exe,temp_file_name,false); g_sdata.best_compressor_name = g_sdata.compressor_name; g_sdata.compressor_name = compressor_names[(int)COMPRESSOR_SCRIPT+2]; ResetObjects(); CompileNSISScript(); return TRUE; } else { int this_compressor=0; int i; HANDLE hPrev, hThis; DWORD prevSize=0, thisSize=0; for(i=(int)COMPRESSOR_SCRIPT+2; i<(int)COMPRESSOR_BEST; i++) { if(!lstrcmpi(g_sdata.compressor_name,compressor_names[i])) { this_compressor = i; break; } } if(FileExists(temp_file_name)) { hPrev = CreateFile(temp_file_name,GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, (DWORD)NULL, NULL); if(hPrev != INVALID_HANDLE_VALUE) { prevSize = GetFileSize(hPrev, 0); CloseHandle(hPrev); if(prevSize != INVALID_FILE_SIZE) { hThis = CreateFile(g_sdata.output_exe,GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, (DWORD)NULL, NULL); if(hThis != INVALID_HANDLE_VALUE) { thisSize = GetFileSize(hThis, 0); CloseHandle(hThis); if(thisSize != INVALID_FILE_SIZE) { if(prevSize > thisSize) { CopyFile(g_sdata.output_exe,temp_file_name,false); SetCompressorStats(); g_sdata.best_compressor_name = g_sdata.compressor_name; } } } } } } if(this_compressor == ((int)COMPRESSOR_BEST - 1)) { TCHAR buf[1024]; g_sdata.compressor_name = compressor_names[(int)COMPRESSOR_SCRIPT+1]; if(!lstrcmpi(g_sdata.best_compressor_name,compressor_names[this_compressor])) { wsprintf(buf,COMPRESSOR_MESSAGE,g_sdata.best_compressor_name,thisSize); LogMessage(g_sdata.hwnd,buf); } else { CopyFile(temp_file_name,g_sdata.output_exe,false); wsprintf(buf,RESTORED_COMPRESSOR_MESSAGE,g_sdata.best_compressor_name,prevSize); LogMessage(g_sdata.hwnd,buf); LogMessage(g_sdata.hwnd, g_sdata.compressor_stats); } DeleteFile(temp_file_name); lstrcpy(g_sdata.compressor_stats,_T("")); } else { g_sdata.compressor_name = compressor_names[this_compressor+1]; ResetObjects(); CompileNSISScript(); return TRUE; } } } } EnableItems(g_sdata.hwnd); if (!g_sdata.retcode) { MessageBeep(MB_ICONASTERISK); if (g_sdata.warnings) SetTitle(g_sdata.hwnd,_T("Finished with Warnings")); else SetTitle(g_sdata.hwnd,_T("Finished Sucessfully")); // Added by Darren Owen (DrO) on 1/10/2003 if(g_sdata.recompile_test) PostMessage(g_sdata.hwnd, WM_COMMAND, LOWORD(IDC_TEST), 0); } else { MessageBeep(MB_ICONEXCLAMATION); SetTitle(g_sdata.hwnd,_T("Compile Error: See Log for Details")); } // Added by Darren Owen (DrO) on 1/10/2003 // ensures the recompile and run state is reset after use g_sdata.recompile_test = 0; DragAcceptFiles(g_sdata.hwnd,TRUE); return TRUE; } case MakensisAPI::QUERYHOST: { if (MakensisAPI::QH_OUTPUTCHARSET) { const UINT reqcp = 1200; // We want UTF-16LE SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, (LONG_PTR)(1+reqcp)); return TRUE; } return FALSE; } case WM_NOTIFY: switch (((NMHDR*)lParam)->code ) { case EN_SELCHANGE: SendDlgItemMessage(hwndDlg,IDC_LOGWIN, EM_EXGETSEL, 0, (LPARAM) &g_sdata.textrange); { BOOL enabled = (g_sdata.textrange.cpMax-g_sdata.textrange.cpMin<=0?FALSE:TRUE); EnableMenuItem(g_sdata.menu,IDM_COPYSELECTED,(enabled?MF_ENABLED:MF_GRAYED)); EnableToolBarButton(IDM_COPY,enabled); } // Altered by Darren Owen (DrO) on 6/10/2003 // Allows the detection of the right-click menu when running on OSes below Windows 2000 // and will then simulate the effective WM_CONTEXTMENU message that would be received // note: removed the WM_CONTEXTMENU handling to prevent a duplicate menu appearing on // Windows 2000 and higher case EN_MSGFILTER: #define lpnmMsg ((MSGFILTER*)lParam) if(WM_RBUTTONUP == lpnmMsg->msg || (WM_KEYUP == lpnmMsg->msg && lpnmMsg->wParam == VK_APPS)){ POINT pt; HWND edit = GetDlgItem(g_sdata.hwnd,IDC_LOGWIN); RECT r; GetCursorPos(&pt); // Added and altered by Darren Owen (DrO) on 29/9/2003 // Will place the right-click menu in the top left corner of the window // if the application key is pressed and the mouse is not in the window // from here... ScreenToClient(edit, &pt); GetClientRect(edit, &r); if(!PtInRect(&r, pt)) pt.x = pt.y = 0; MapWindowPoints(edit, HWND_DESKTOP, &pt, 1); TrackPopupMenu(g_sdata.editSubmenu, TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_RIGHTBUTTON, pt.x, pt.y, 0, g_sdata.hwnd, 0); } case TBN_DROPDOWN: { LPNMTOOLBAR pToolBar = (LPNMTOOLBAR) lParam; if(pToolBar->hdr.hwndFrom == g_toolbar.hwnd && pToolBar->iItem == IDM_COMPRESSOR) { ShowToolbarDropdownMenu(); return TBDDRET_DEFAULT; } else { return TBDDRET_NODEFAULT; } } } return TRUE; case WM_COPYDATA: { PCOPYDATASTRUCT cds = PCOPYDATASTRUCT(lParam); switch (cds->dwData) { case MakensisAPI::NOTIFY_SCRIPT: MemSafeFree(g_sdata.input_script); g_sdata.input_script = (TCHAR*) MemAlloc(cds->cbData * sizeof(TCHAR)); lstrcpy(g_sdata.input_script, (TCHAR *)cds->lpData); break; case MakensisAPI::NOTIFY_WARNING: g_sdata.warnings++; break; case MakensisAPI::NOTIFY_ERROR: break; case MakensisAPI::NOTIFY_OUTPUT: MemSafeFree(g_sdata.output_exe); g_sdata.output_exe = (TCHAR*) MemAlloc(cds->cbData * sizeof(TCHAR)); lstrcpy(g_sdata.output_exe, (TCHAR *)cds->lpData); break; } return TRUE; } case WM_COMMAND: { switch (LOWORD(wParam)) { case IDM_BROWSESCR: { if (g_sdata.input_script) { TCHAR str[MAX_PATH],*str2; lstrcpy(str,g_sdata.input_script); str2=_tcsrchr(str,_T('\\')); if(str2!=NULL) *(str2+1)=0; ShellExecute(g_sdata.hwnd,_T("open"),str,NULL,NULL,SW_SHOWNORMAL); } return TRUE; } case IDM_ABOUT: { return DialogBox(g_sdata.hInstance,MAKEINTRESOURCE(DLG_ABOUT),hwndDlg,(DLGPROC)AboutProc); } case IDM_NSISHOME: { ShellExecuteA(g_sdata.hwnd,"open",NSIS_URL,NULL,NULL,SW_SHOWNORMAL); return TRUE; } case IDM_FORUM: { ShellExecuteA(g_sdata.hwnd,"open",NSIS_FOR,NULL,NULL,SW_SHOWNORMAL); return TRUE; } case IDM_NSISUPDATE: { Update(); return TRUE; } case IDM_SELECTALL: { SendDlgItemMessage(g_sdata.hwnd, IDC_LOGWIN, EM_SETSEL, 0, -1); return TRUE; } case IDM_DOCS: { ShowDocs(); return TRUE; } case IDM_LOADSCRIPT: { if (!g_sdata.thread) { OPENFILENAME l={sizeof(l),}; TCHAR buf[MAX_PATH]; l.hwndOwner = hwndDlg; l.lpstrFilter = _T("NSIS Script (*.nsi)\0*.nsi\0All Files (*.*)\0*.*\0"); l.lpstrFile = buf; l.nMaxFile = MAX_STRING-1; l.lpstrTitle = _T("Load Script"); l.lpstrDefExt = _T("log"); l.lpstrFileTitle = NULL; l.lpstrInitialDir = NULL; l.Flags = OFN_HIDEREADONLY|OFN_EXPLORER|OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST; lstrcpy(buf,_T("")); if (GetOpenFileName(&l)) { SetScript(buf); PushMRUFile(g_sdata.script); ResetObjects(); CompileNSISScript(); } } return TRUE; } case IDM_MRU_FILE: case IDM_MRU_FILE+1: case IDM_MRU_FILE+2: case IDM_MRU_FILE+3: case IDM_MRU_FILE+4: LoadMRUFile(LOWORD(wParam)-IDM_MRU_FILE); return TRUE; case IDM_CLEAR_MRU_LIST: ClearMRUList(); return TRUE; case IDM_COMPRESSOR: { SetCompressor((NCOMPRESSOR)(g_sdata.compressor+1)); return TRUE; } case IDM_CLEARLOG: { if (!g_sdata.thread) { ClearLog(g_sdata.hwnd); } return TRUE; } case IDM_RECOMPILE: { CompileNSISScript(); return TRUE; } // Added by Darren Owen (DrO) on 1/10/2003 case IDM_RECOMPILE_TEST: { g_sdata.recompile_test = 1; CompileNSISScript(); return TRUE; } case IDM_SETTINGS: { DialogBox(g_sdata.hInstance,MAKEINTRESOURCE(DLG_SETTINGS),g_sdata.hwnd,(DLGPROC)SettingsProc); return TRUE; } case IDM_TEST: case IDC_TEST: { if (g_sdata.output_exe) { ShellExecute(g_sdata.hwnd,_T("open"),g_sdata.output_exe,NULL,NULL,SW_SHOWNORMAL); } return TRUE; } case IDM_EDITSCRIPT: { if (g_sdata.input_script) { LPCTSTR verb = _T("open"); // BUGBUG: Should not force the open verb? HINSTANCE hi = ShellExecute(g_sdata.hwnd,verb,g_sdata.input_script,NULL,NULL,SW_SHOWNORMAL); if ((UINT_PTR)hi <= 32) { TCHAR path[MAX_PATH]; if (GetWindowsDirectory(path,sizeof(path))) { lstrcat(path,_T("\\notepad.exe")); ShellExecute(g_sdata.hwnd,verb,path,g_sdata.input_script,NULL,SW_SHOWNORMAL); } } } return TRUE; } case IDCANCEL: case IDM_EXIT: { if (!g_sdata.thread) { DestroyWindow(g_sdata.hwnd); } return TRUE; } case IDM_CANCEL: { SetEvent(g_sdata.sigint_event); SetEvent(g_sdata.sigint_event_legacy); return TRUE; } case IDM_COPY: { CopyToClipboard(g_sdata.hwnd); return TRUE; } case IDM_COPYSELECTED: { SendDlgItemMessage(g_sdata.hwnd,IDC_LOGWIN, WM_COPY, 0, 0); return TRUE; } case IDM_SAVE: { OPENFILENAME l={sizeof(l),}; TCHAR buf[MAX_STRING]; l.hwndOwner = hwndDlg; l.lpstrFilter = _T("Log Files (*.log)\0*.log\0Text Files (*.txt)\0*.txt\0All Files (*.*)\0*.*\0"); l.lpstrFile = buf; l.nMaxFile = MAX_STRING-1; l.lpstrTitle = _T("Save Output"); l.lpstrDefExt = _T("log"); l.lpstrInitialDir = NULL; l.Flags = OFN_HIDEREADONLY|OFN_EXPLORER|OFN_PATHMUSTEXIST; lstrcpy(buf,_T("output")); if (GetSaveFileName(&l)) { HANDLE hFile = CreateFile(buf,GENERIC_WRITE,0,0,CREATE_ALWAYS,0,0); if (INVALID_HANDLE_VALUE != hFile) { int len=SendDlgItemMessage(g_sdata.hwnd,IDC_LOGWIN,WM_GETTEXTLENGTH,0,0); TCHAR *existing_text=(TCHAR*) MemAlloc(len * sizeof(TCHAR)); if (existing_text) { // BUGBUG:TODO: Error message for bad hFile and existing_text? existing_text[0]=0; GetDlgItemText(g_sdata.hwnd, IDC_LOGWIN, existing_text, len); DWORD dwWritten = 0; WriteFile(hFile,existing_text,len,&dwWritten,0); MemFree(existing_text); } CloseHandle(hFile); } } return TRUE; } case IDM_FIND: { if (!g_find.uFindReplaceMsg) g_find.uFindReplaceMsg = RegisterWindowMessage(FINDMSGSTRING); memset(&g_find.fr, 0, sizeof(FINDREPLACE)); g_find.fr.lStructSize = sizeof(FINDREPLACE); g_find.fr.hwndOwner = hwndDlg; g_find.fr.Flags = FR_NOUPDOWN; g_find.fr.lpstrFindWhat = g_findbuf; g_find.fr.wFindWhatLen = COUNTOF(g_findbuf); g_find.hwndFind = FindText(&g_find.fr); return TRUE; } default: { int i; DWORD command = LOWORD(wParam); for(i=(int)COMPRESSOR_SCRIPT; i<=(int)COMPRESSOR_BEST; i++) { if(command == compressor_commands[i]) { SetCompressor((NCOMPRESSOR)i); return TRUE; } } } } } } if (g_find.uFindReplaceMsg && msg == g_find.uFindReplaceMsg) { LPFINDREPLACE lpfr = (LPFINDREPLACE)lParam; if (lpfr->Flags & FR_FINDNEXT) { WPARAM flags = FR_DOWN; if (lpfr->Flags & FR_MATCHCASE) flags |= FR_MATCHCASE; if (lpfr->Flags & FR_WHOLEWORD) flags |= FR_WHOLEWORD; FINDTEXTEX ft; SendDlgItemMessage(hwndDlg, IDC_LOGWIN, EM_EXGETSEL, 0, (LPARAM)&ft.chrg); if (ft.chrg.cpMax == ft.chrg.cpMin) ft.chrg.cpMin = 0; else ft.chrg.cpMin = ft.chrg.cpMax; ft.chrg.cpMax = SendDlgItemMessage(hwndDlg, IDC_LOGWIN, WM_GETTEXTLENGTH, 0, 0); ft.lpstrText = lpfr->lpstrFindWhat; ft.chrg.cpMin = SendDlgItemMessage(hwndDlg, IDC_LOGWIN, EM_FINDTEXTEX, flags, (LPARAM)&ft); if (ft.chrg.cpMin != -1) SendDlgItemMessage(hwndDlg, IDC_LOGWIN, EM_SETSEL, ft.chrgText.cpMin, ft.chrgText.cpMax); else MessageBeep(MB_ICONASTERISK); } if (lpfr->Flags & FR_DIALOGTERM) g_find.hwndFind = 0; return TRUE; } return 0; }
BOOL CALLBACK SettingsProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { case WM_INITDIALOG: { int i = 0; LRESULT rv; for(i = (int)COMPRESSOR_SCRIPT; i <= (int)COMPRESSOR_BEST; i++) { rv = SendDlgItemMessage(hwndDlg, IDC_COMPRESSOR, CB_ADDSTRING, 0, (LPARAM)compressor_display_names[i]); } rv = SendDlgItemMessage(hwndDlg, IDC_COMPRESSOR, CB_SETCURSEL, (WPARAM)g_sdata.default_compressor, (LPARAM)0); SetSymbols(hwndDlg, g_sdata.symbols); SetFocus(GetDlgItem(hwndDlg, IDC_SYMBOL)); break; } case WM_MAKENSIS_LOADSYMBOLSET: { char *name = (char *)wParam; char **symbols = LoadSymbolSet(name); HGLOBAL hMem; SetSymbols(hwndDlg, symbols); if(symbols) { hMem = GlobalHandle(symbols); GlobalUnlock(hMem); GlobalFree(hMem); } break; } case WM_MAKENSIS_SAVESYMBOLSET: { char *name = (char *)wParam; char **symbols = GetSymbols(hwndDlg); HGLOBAL hMem; if(symbols) { SaveSymbolSet(name, symbols); hMem = GlobalHandle(symbols); GlobalUnlock(hMem); GlobalFree(hMem); } break; } case WM_COMMAND: { switch (LOWORD(wParam)) { case IDOK: { ResetObjects(); ResetInputScript(); ResetSymbols(); g_sdata.symbols = GetSymbols(hwndDlg); int n = SendDlgItemMessage(hwndDlg, IDC_COMPRESSOR, CB_GETCURSEL, (WPARAM)0, (LPARAM)0); if (n >= (int)COMPRESSOR_SCRIPT && n <= (int)COMPRESSOR_BEST) { g_sdata.default_compressor = (NCOMPRESSOR)n; } else { g_sdata.default_compressor = COMPRESSOR_SCRIPT; } EndDialog(hwndDlg, TRUE); SetCompressor(g_sdata.default_compressor); } break; case IDCANCEL: EndDialog(hwndDlg, TRUE); break; case IDRIGHT: { int n = SendDlgItemMessage(hwndDlg, IDC_SYMBOL, WM_GETTEXTLENGTH, 0, 0); if(n > 0) { char *buf = (char *)GlobalAlloc(GPTR, (n+1)*sizeof(char)); SendDlgItemMessage(hwndDlg, IDC_SYMBOL, WM_GETTEXT, n+1, (LPARAM)buf); if(my_strstr(buf," ") || my_strstr(buf,"\t")) { MessageBox(hwndDlg,SYMBOLSERROR,"Error",MB_OK|MB_ICONSTOP); GlobalFree(buf); break; } n = SendDlgItemMessage(hwndDlg, IDC_VALUE, WM_GETTEXTLENGTH, 0, 0); if(n > 0) { char *buf2 = (char *)GlobalAlloc(GPTR, (n+1)*sizeof(char)); SendDlgItemMessage(hwndDlg, IDC_VALUE, WM_GETTEXT, n+1, (LPARAM)buf2); char *buf3 = (char *)GlobalAlloc(GPTR, (lstrlen(buf)+lstrlen(buf2)+2)*sizeof(char)); wsprintf(buf3,"%s=%s",buf,buf2); GlobalFree(buf); buf = buf3; GlobalFree(buf2); } SendDlgItemMessage(hwndDlg, IDC_SYMBOLS, LB_ADDSTRING, 0, (LPARAM)buf); SendDlgItemMessage(hwndDlg, IDC_SYMBOL, WM_SETTEXT, 0, 0); SendDlgItemMessage(hwndDlg, IDC_VALUE, WM_SETTEXT, 0, 0); GlobalFree(buf); EnableSymbolSetButtons(hwndDlg); } } break; case IDLEFT: { int index = SendDlgItemMessage(hwndDlg, IDC_SYMBOLS, LB_GETCURSEL, 0, 0); if(index != LB_ERR) { int n = SendDlgItemMessage(hwndDlg, IDC_SYMBOLS, LB_GETTEXTLEN, (WPARAM)index, 0); if(n > 0) { char *buf = (char *)GlobalAlloc(GPTR, (n+1)*sizeof(char)); SendDlgItemMessage(hwndDlg, IDC_SYMBOLS, LB_GETTEXT, (WPARAM)index, (LPARAM)buf); char *p = my_strstr(buf,"="); if(p) { SendDlgItemMessage(hwndDlg, IDC_VALUE, WM_SETTEXT, 0, (LPARAM)(p+1)); *p=0; } SendDlgItemMessage(hwndDlg, IDC_SYMBOL, WM_SETTEXT, 0, (LPARAM)buf); GlobalFree(buf); SendDlgItemMessage(hwndDlg, IDC_SYMBOLS, LB_DELETESTRING, (WPARAM)index, 0); EnableWindow(GetDlgItem(hwndDlg, IDLEFT), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDDEL), FALSE); EnableSymbolSetButtons(hwndDlg); } } } break; case IDCLEAR: { SendDlgItemMessage(hwndDlg, IDC_SYMBOLS, LB_RESETCONTENT , 0, 0); EnableSymbolSetButtons(hwndDlg); } break; case IDLOAD: { g_symbol_set_mode=1; DialogBox(g_sdata.hInstance,MAKEINTRESOURCE(DLG_SYMBOLSET),hwndDlg,(DLGPROC)SymbolSetProc); } break; case IDSAVE: { g_symbol_set_mode=2; DialogBox(g_sdata.hInstance,MAKEINTRESOURCE(DLG_SYMBOLSET),hwndDlg,(DLGPROC)SymbolSetProc); } break; case IDDEL: { int n = SendDlgItemMessage(hwndDlg, IDC_SYMBOLS, LB_GETSELCOUNT, 0, 0); int *items = (int *)GlobalAlloc(GPTR, n*sizeof(int)); int rv = SendDlgItemMessage(hwndDlg, IDC_SYMBOLS, LB_GETSELITEMS, (WPARAM)n, (LPARAM)items); int i; for(i=n-1;i>=0;i--) { SendDlgItemMessage(hwndDlg, IDC_SYMBOLS, LB_DELETESTRING, (WPARAM)items[i], 0); } EnableSymbolSetButtons(hwndDlg); } break; case IDC_SYMBOL: if(HIWORD(wParam) == EN_CHANGE) { int n = SendDlgItemMessage(hwndDlg, IDC_SYMBOL, WM_GETTEXTLENGTH, 0, 0); if(n > 0) { EnableWindow(GetDlgItem(hwndDlg, IDRIGHT), TRUE); } else { EnableWindow(GetDlgItem(hwndDlg, IDRIGHT), FALSE); } } break; case IDC_SYMBOLS: if(HIWORD(wParam) == LBN_SELCHANGE) { int n = SendDlgItemMessage(hwndDlg, IDC_SYMBOLS, LB_GETSELCOUNT, 0, 0); if(n == 0) { EnableWindow(GetDlgItem(hwndDlg, IDLEFT), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDDEL), FALSE); } else if(n == 1) { EnableWindow(GetDlgItem(hwndDlg, IDLEFT), TRUE); EnableWindow(GetDlgItem(hwndDlg, IDDEL), TRUE); } else if(n > 1) { EnableWindow(GetDlgItem(hwndDlg, IDLEFT), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDDEL), TRUE); } } break; } break; } } return FALSE; }
BOOL CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { static HINSTANCE hRichEditDLL = 0; if (!hRichEditDLL) hRichEditDLL= LoadLibrary("RichEd32.dll"); switch (msg) { case WM_INITDIALOG: { int argc; char **argv; int i, j; int argSpaceSize; bool chooseCompressor = false; g_sdata.hwnd=hwndDlg; HICON hIcon = LoadIcon(g_sdata.hInstance,MAKEINTRESOURCE(IDI_ICON)); SetClassLong(hwndDlg,GCL_HICON,(long)hIcon); // Altered by Darren Owen (DrO) on 29/9/2003 // Added in receiving of mouse and key events from the richedit control SendMessage(GetDlgItem(hwndDlg,IDC_LOGWIN),EM_SETEVENTMASK,NULL,ENM_SELCHANGE|ENM_MOUSEEVENTS|ENM_KEYEVENTS); DragAcceptFiles(g_sdata.hwnd,FALSE); g_sdata.menu = GetMenu(g_sdata.hwnd); g_sdata.fileSubmenu = GetSubMenu(g_sdata.menu, FILE_MENU_INDEX); g_sdata.editSubmenu = GetSubMenu(g_sdata.menu, EDIT_MENU_INDEX); g_sdata.toolsSubmenu = GetSubMenu(g_sdata.menu, TOOLS_MENU_INDEX); RestoreMRUList(); CreateToolBar(); InitTooltips(g_sdata.hwnd); SetBranding(g_sdata.hwnd); HFONT hFont = CreateFont(14,0,0,0,FW_NORMAL,0,0,0,DEFAULT_CHARSET,OUT_CHARACTER_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,FIXED_PITCH|FF_DONTCARE,"Courier New"); SendDlgItemMessage(hwndDlg,IDC_LOGWIN,WM_SETFONT,(WPARAM)hFont,0); RestoreWindowPos(g_sdata.hwnd); RestoreCompressor(); g_sdata.compressor = (NCOMPRESSOR)-1; argSpaceSize = SetArgv((char *)GetCommandLine(), &argc, &argv); if(argc > 1) { int n; g_sdata.script_alloced = true; g_sdata.script = (char *) GlobalAlloc(GPTR,argSpaceSize+2*(argc-1)*sizeof(char)+1); lstrcpy(g_sdata.script,""); for(i=1; i<argc; i++) { if(!lstrncmpi(argv[i],"/XSetCompressor ",lstrlen("/XSetCompressor "))) { char *p = argv[i]+lstrlen("/XSetCompressor "); if(!lstrncmpi(p,"/FINAL ",lstrlen("/FINAL "))) { p += lstrlen("/FINAL "); } while(*p == ' ') p++; if(p && lstrlen(p)) { for(j=(int)COMPRESSOR_SCRIPT+1; j < (int)COMPRESSOR_BEST; j++) { if(!lstrcmpi(p,compressor_names[j])) { SetCompressor((NCOMPRESSOR)j); } } } } else if(!lstrcmpi(argv[i],"/ChooseCompressor")) { chooseCompressor = true; } else { lstrcat(g_sdata.script,"\""); lstrcat(g_sdata.script,argv[i]); lstrcat(g_sdata.script,"\" "); } } n = lstrlen(g_sdata.script); if(n > 0) { g_sdata.script[n-1] = '\0'; } PushMRUFile(argv[argc-1]); } if (argSpaceSize) GlobalFree(argv); if(g_sdata.compressor == (NCOMPRESSOR)-1) { SetCompressor(g_sdata.default_compressor); } if(chooseCompressor) { if (DialogBox(g_sdata.hInstance,MAKEINTRESOURCE(DLG_COMPRESSOR),g_sdata.hwnd,(DLGPROC)CompressorProc)) { EnableItems(g_sdata.hwnd); return TRUE; } } CompileNSISScript(); return TRUE; } case WM_PAINT: { PAINTSTRUCT ps; GetClientRect(g_sdata.hwnd, &g_resize.griprect); HDC hdc = BeginPaint(g_sdata.hwnd, &ps); g_resize.griprect.left = g_resize.griprect.right - GetSystemMetrics(SM_CXVSCROLL); g_resize.griprect.top = g_resize.griprect.bottom - GetSystemMetrics(SM_CYVSCROLL); DrawFrameControl(hdc, &g_resize.griprect, DFC_SCROLL, DFCS_SCROLLSIZEGRIP); EndPaint(g_sdata.hwnd,&ps); return TRUE; } case WM_DESTROY: { SaveSymbols(); SaveCompressor(); SaveMRUList(); SaveWindowPos(g_sdata.hwnd); DestroyTooltips(); PostQuitMessage(0); return TRUE; } case WM_CLOSE: { if (!g_sdata.thread) { DragAcceptFiles(g_sdata.hwnd,FALSE); ImageList_Destroy(g_toolbar.imagelist); ImageList_Destroy(g_toolbar.imagelistd); ImageList_Destroy(g_toolbar.imagelisth); DestroyWindow(hwndDlg); FreeLibrary(hRichEditDLL); } return TRUE; } case WM_DROPFILES: { int num; char szTmp[MAX_PATH]; num = DragQueryFile((HDROP)wParam,-1,NULL,0); if (num==1) { DragQueryFile((HDROP)wParam,0,szTmp,MAX_PATH); if (lstrlen(szTmp)>0) { g_sdata.script_alloced = true; g_sdata.script = (char *)GlobalAlloc(GPTR,sizeof(szTmp)+7); wsprintf(g_sdata.script,"\"%s\"",szTmp); PushMRUFile(g_sdata.script); ResetObjects(); CompileNSISScript(); } } break; } case WM_GETMINMAXINFO: { ((MINMAXINFO*)lParam)->ptMinTrackSize.x=MINWIDTH; ((MINMAXINFO*)lParam)->ptMinTrackSize.y=MINHEIGHT; } case WM_ENTERSIZEMOVE: { GetClientRect(g_sdata.hwnd, &g_resize.resizeRect); return TRUE; } case WM_SIZE: { if ((wParam == SIZE_MAXHIDE)||(wParam == SIZE_MAXSHOW)) return TRUE; RECT rSize; if (hwndDlg == g_sdata.hwnd) { GetClientRect(g_sdata.hwnd, &rSize); if (((rSize.right==0)&&(rSize.bottom==0))||((g_resize.resizeRect.right==0)&&(g_resize.resizeRect.bottom==0))) return TRUE; g_resize.dx = rSize.right - g_resize.resizeRect.right; g_resize.dy = rSize.bottom - g_resize.resizeRect.bottom; EnumChildWindows(g_sdata.hwnd, DialogResize, (LPARAM)0); g_resize.resizeRect = rSize; } return TRUE; } case WM_SIZING: { InvalidateRect(g_sdata.hwnd,&g_resize.griprect,TRUE); GetClientRect(g_sdata.hwnd, &g_resize.griprect); g_resize.griprect.left = g_resize.griprect.right - GetSystemMetrics(SM_CXVSCROLL); g_resize.griprect.top = g_resize.griprect.bottom - GetSystemMetrics(SM_CYVSCROLL); return TRUE; } case WM_MAKENSIS_PROCESSCOMPLETE: { if (g_sdata.thread) { CloseHandle(g_sdata.thread); g_sdata.thread=0; } if(g_sdata.compressor == COMPRESSOR_BEST) { if (g_sdata.retcode==0 && FileExists(g_sdata.output_exe)) { char temp_file_name[1024]; wsprintf(temp_file_name,"%s_makensisw_temp",g_sdata.output_exe); if(!lstrcmpi(g_sdata.compressor_name,compressor_names[(int)COMPRESSOR_SCRIPT+1])) { SetCompressorStats(); CopyFile(g_sdata.output_exe,temp_file_name,false); g_sdata.best_compressor_name = g_sdata.compressor_name; g_sdata.compressor_name = compressor_names[(int)COMPRESSOR_SCRIPT+2]; ResetObjects(); ResetInputScript(); CompileNSISScript(); return TRUE; } else { int this_compressor; int last_compressor; int i; HANDLE hPrev, hThis; DWORD prevSize, thisSize; for(i=(int)COMPRESSOR_SCRIPT+2; i<(int)COMPRESSOR_BEST; i++) { if(!lstrcmpi(g_sdata.compressor_name,compressor_names[i])) { this_compressor = i; last_compressor = i-1; break; } } if(FileExists(temp_file_name)) { hPrev = CreateFile(temp_file_name,GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, NULL, NULL); if(hPrev != INVALID_HANDLE_VALUE) { prevSize = GetFileSize(hPrev, 0); CloseHandle(hPrev); if(prevSize != INVALID_FILE_SIZE) { hThis = CreateFile(g_sdata.output_exe,GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, NULL, NULL); if(hThis != INVALID_HANDLE_VALUE) { thisSize = GetFileSize(hThis, 0); CloseHandle(hThis); if(thisSize != INVALID_FILE_SIZE) { if(prevSize > thisSize) { CopyFile(g_sdata.output_exe,temp_file_name,false); SetCompressorStats(); g_sdata.best_compressor_name = g_sdata.compressor_name; } } } } } } if(this_compressor == ((int)COMPRESSOR_BEST - 1)) { char buf[1024]; g_sdata.compressor_name = compressor_names[(int)COMPRESSOR_SCRIPT+1]; g_sdata.appended = false; ResetInputScript(); if(!lstrcmpi(g_sdata.best_compressor_name,compressor_names[this_compressor])) { wsprintf(buf,COMPRESSOR_MESSAGE,g_sdata.best_compressor_name,thisSize); LogMessage(g_sdata.hwnd,buf); } else { CopyFile(temp_file_name,g_sdata.output_exe,false); wsprintf(buf,RESTORED_COMPRESSOR_MESSAGE,g_sdata.best_compressor_name,prevSize); LogMessage(g_sdata.hwnd,buf); LogMessage(g_sdata.hwnd, g_sdata.compressor_stats); } DeleteFile(temp_file_name); ResetInputScript(); lstrcpy(g_sdata.compressor_stats,""); } else { g_sdata.compressor_name = compressor_names[this_compressor+1]; ResetObjects(); ResetInputScript(); CompileNSISScript(); return TRUE; } } } } EnableItems(g_sdata.hwnd); if (!g_sdata.retcode) { MessageBeep(MB_ICONASTERISK); if (g_sdata.warnings) SetTitle(g_sdata.hwnd,"Finished with Warnings"); else SetTitle(g_sdata.hwnd,"Finished Sucessfully"); // Added by Darren Owen (DrO) on 1/10/2003 if(g_sdata.recompile_test) PostMessage(g_sdata.hwnd, WM_COMMAND, LOWORD(IDC_TEST), 0); } else { MessageBeep(MB_ICONEXCLAMATION); SetTitle(g_sdata.hwnd,"Compile Error: See Log for Details"); } // Added by Darren Owen (DrO) on 1/10/2003 // ensures the recompile and run state is reset after use g_sdata.recompile_test = 0; DragAcceptFiles(g_sdata.hwnd,TRUE); return TRUE; } case WM_NOTIFY: switch (((NMHDR*)lParam)->code ) { case EN_SELCHANGE: SendDlgItemMessage(hwndDlg,IDC_LOGWIN, EM_EXGETSEL, 0, (LPARAM) &g_sdata.textrange); { BOOL enabled = (g_sdata.textrange.cpMax-g_sdata.textrange.cpMin<=0?FALSE:TRUE); EnableMenuItem(g_sdata.menu,IDM_COPYSELECTED,(enabled?MF_ENABLED:MF_GRAYED)); EnableToolBarButton(IDM_COPY,enabled); } // Altered by Darren Owen (DrO) on 6/10/2003 // Allows the detection of the right-click menu when running on OSes below Windows 2000 // and will then simulate the effective WM_CONTEXTMENU message that would be received // note: removed the WM_CONTEXTMENU handling to prevent a duplicate menu appearing on // Windows 2000 and higher case EN_MSGFILTER: #define lpnmMsg ((MSGFILTER*)lParam) if(WM_RBUTTONUP == lpnmMsg->msg || WM_KEYUP == lpnmMsg->msg && lpnmMsg->wParam == VK_APPS){ POINT pt; HWND edit = GetDlgItem(g_sdata.hwnd,IDC_LOGWIN); RECT r; GetCursorPos(&pt); // Added and altered by Darren Owen (DrO) on 29/9/2003 // Will place the right-click menu in the top left corner of the window // if the application key is pressed and the mouse is not in the window // from here... ScreenToClient(edit, &pt); GetClientRect(edit, &r); if(!PtInRect(&r, pt)) pt.x = pt.y = 0; MapWindowPoints(edit, HWND_DESKTOP, &pt, 1); TrackPopupMenu(g_sdata.editSubmenu, TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_RIGHTBUTTON, pt.x, pt.y, 0, g_sdata.hwnd, 0); } case TBN_DROPDOWN: { LPNMTOOLBAR pToolBar = (LPNMTOOLBAR) lParam; if(pToolBar->hdr.hwndFrom == g_toolbar.hwnd && pToolBar->iItem == IDM_COMPRESSOR) { ShowToolbarDropdownMenu(); return TBDDRET_DEFAULT; } else { return TBDDRET_NODEFAULT; } } } return TRUE; case WM_COPYDATA: { PCOPYDATASTRUCT cds = PCOPYDATASTRUCT(lParam); switch (cds->dwData) { case MAKENSIS_NOTIFY_SCRIPT: if (g_sdata.input_script) GlobalFree(g_sdata.input_script); g_sdata.input_script = (char *)GlobalAlloc(GPTR, cds->cbData); lstrcpy(g_sdata.input_script, (char *)cds->lpData); break; case MAKENSIS_NOTIFY_WARNING: g_sdata.warnings++; break; case MAKENSIS_NOTIFY_ERROR: break; case MAKENSIS_NOTIFY_OUTPUT: if (g_sdata.output_exe) GlobalFree(g_sdata.output_exe); g_sdata.output_exe = (char *)GlobalAlloc(GPTR, cds->cbData); lstrcpy(g_sdata.output_exe, (char *)cds->lpData); break; } return TRUE; } case WM_COMMAND: { switch (LOWORD(wParam)) { case IDM_BROWSESCR: { if (g_sdata.input_script) { char str[MAX_PATH],*str2; lstrcpy(str,g_sdata.input_script); str2=my_strrchr(str,'\\'); if(str2!=NULL) *str2=0; ShellExecute(g_sdata.hwnd,"open",str,NULL,NULL,SW_SHOWNORMAL); } return TRUE; } case IDM_ABOUT: { DialogBox(g_sdata.hInstance,MAKEINTRESOURCE(DLG_ABOUT),g_sdata.hwnd,(DLGPROC)AboutProc); return TRUE; } case IDM_NSISHOME: { ShellExecute(g_sdata.hwnd,"open",NSIS_URL,NULL,NULL,SW_SHOWNORMAL); return TRUE; } case IDM_FORUM: { ShellExecute(g_sdata.hwnd,"open",NSIS_FOR,NULL,NULL,SW_SHOWNORMAL); return TRUE; } case IDM_NSISUPDATE: { int rv; rv = MessageBox(g_sdata.hwnd,NSISUPDATEPROMPT,"Question",MB_YESNO|MB_ICONQUESTION); if(rv == IDYES) { char pathf[MAX_PATH],*path; GetModuleFileName(NULL,pathf,sizeof(pathf)); path=my_strrchr(pathf,'\\'); if(path!=NULL) *path=0; lstrcat(pathf,NSIS_UPDATE); ShellExecute(g_sdata.hwnd,"open",pathf,NULL,NULL,SW_SHOWNORMAL); PostMessage(g_sdata.hwnd,WM_COMMAND, IDM_EXIT, 0); } return TRUE; } case IDM_SELECTALL: { SendDlgItemMessage(g_sdata.hwnd, IDC_LOGWIN, EM_SETSEL, 0, -1); return TRUE; } case IDM_DOCS: { ShowDocs(); return TRUE; } case IDM_LOADSCRIPT: { if (!g_sdata.thread) { OPENFILENAME l={sizeof(l),}; char buf[MAX_PATH]; l.hwndOwner = hwndDlg; l.lpstrFilter = "NSIS Script (*.nsi)\0*.nsi\0All Files (*.*)\0*.*\0"; l.lpstrFile = buf; l.nMaxFile = MAX_STRING-1; l.lpstrTitle = "Load Script"; l.lpstrDefExt = "log"; l.lpstrFileTitle = NULL; l.lpstrInitialDir = NULL; l.Flags = OFN_HIDEREADONLY|OFN_EXPLORER|OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST; lstrcpy(buf,""); if (GetOpenFileName(&l)) { g_sdata.script = (char *)GlobalAlloc(GPTR,lstrlen(buf)+3); wsprintf(g_sdata.script,"\"%s\"",buf); PushMRUFile(g_sdata.script); ResetObjects(); CompileNSISScript(); } } return TRUE; } case IDM_MRU_FILE: case IDM_MRU_FILE+1: case IDM_MRU_FILE+2: case IDM_MRU_FILE+3: case IDM_MRU_FILE+4: LoadMRUFile(LOWORD(wParam)-IDM_MRU_FILE); return TRUE; case IDM_CLEAR_MRU_LIST: ClearMRUList(); return TRUE; case IDM_COMPRESSOR: { SetCompressor((NCOMPRESSOR)(g_sdata.compressor+1)); return TRUE; } case IDM_CLEARLOG: { if (!g_sdata.thread) { ClearLog(g_sdata.hwnd); } return TRUE; } case IDM_RECOMPILE: { CompileNSISScript(); return TRUE; } // Added by Darren Owen (DrO) on 1/10/2003 case IDM_RECOMPILE_TEST: case IDC_RECOMPILE_TEST: { g_sdata.recompile_test = 1; CompileNSISScript(); return TRUE; } case IDM_SETTINGS: { DialogBox(g_sdata.hInstance,MAKEINTRESOURCE(DLG_SETTINGS),g_sdata.hwnd,(DLGPROC)SettingsProc); return TRUE; } case IDM_TEST: case IDC_TEST: { if (g_sdata.output_exe) { ShellExecute(g_sdata.hwnd,"open",g_sdata.output_exe,NULL,NULL,SW_SHOWNORMAL); } return TRUE; } case IDM_EDITSCRIPT: { if (g_sdata.input_script) { if ((int)ShellExecute(g_sdata.hwnd,"open",g_sdata.input_script,NULL,NULL,SW_SHOWNORMAL)<=32) { char path[MAX_PATH]; if (GetWindowsDirectory(path,sizeof(path))) { lstrcat(path,"\\notepad.exe"); ShellExecute(g_sdata.hwnd,"open",path,g_sdata.input_script,NULL,SW_SHOWNORMAL); } } } return TRUE; } case IDC_CLOSE: case IDM_EXIT: { if (!g_sdata.thread) { DestroyWindow(g_sdata.hwnd); } return TRUE; } case IDM_COPY: { CopyToClipboard(g_sdata.hwnd); return TRUE; } case IDM_COPYSELECTED: { SendDlgItemMessage(g_sdata.hwnd,IDC_LOGWIN, WM_COPY, 0, 0); return TRUE; } case IDM_SAVE: { OPENFILENAME l={sizeof(l),}; char buf[MAX_STRING]; l.hwndOwner = hwndDlg; l.lpstrFilter = "Log Files (*.log)\0*.log\0Text Files (*.txt)\0*.txt\0All Files (*.*)\0*.*\0"; l.lpstrFile = buf; l.nMaxFile = MAX_STRING-1; l.lpstrTitle = "Save Output"; l.lpstrDefExt = "log"; l.lpstrInitialDir = NULL; l.Flags = OFN_HIDEREADONLY|OFN_EXPLORER|OFN_PATHMUSTEXIST; lstrcpy(buf,"output"); if (GetSaveFileName(&l)) { HANDLE hFile = CreateFile(buf,GENERIC_WRITE,0,0,CREATE_ALWAYS,0,0); if (hFile) { int len=SendDlgItemMessage(g_sdata.hwnd,IDC_LOGWIN,WM_GETTEXTLENGTH,0,0); char *existing_text=(char*)GlobalAlloc(GPTR,len); existing_text[0]=0; GetDlgItemText(g_sdata.hwnd, IDC_LOGWIN, existing_text, len); DWORD dwWritten = 0; WriteFile(hFile,existing_text,len,&dwWritten,0); CloseHandle(hFile); GlobalFree(existing_text); } } return TRUE; } case IDM_FIND: { if (!g_find.uFindReplaceMsg) g_find.uFindReplaceMsg = RegisterWindowMessage(FINDMSGSTRING); my_memset(&g_find.fr, 0, sizeof(FINDREPLACE)); g_find.fr.lStructSize = sizeof(FINDREPLACE); g_find.fr.hwndOwner = hwndDlg; g_find.fr.Flags = FR_NOUPDOWN; g_find.fr.lpstrFindWhat = (char *)GlobalAlloc(GPTR, 128); if (!g_find.fr.lpstrFindWhat) return TRUE; g_find.fr.wFindWhatLen = 128; g_find.hwndFind = FindText(&g_find.fr); return TRUE; } default: { int i; DWORD command = LOWORD(wParam); for(i=(int)COMPRESSOR_SCRIPT; i<=(int)COMPRESSOR_BEST; i++) { if(command == compressor_commands[i]) { SetCompressor((NCOMPRESSOR)i); return TRUE; } } } } } } if (g_find.uFindReplaceMsg && msg == g_find.uFindReplaceMsg) { LPFINDREPLACE lpfr = (LPFINDREPLACE)lParam; if (lpfr->Flags & FR_FINDNEXT) { WPARAM flags = FR_DOWN; if (lpfr->Flags & FR_MATCHCASE) flags |= FR_MATCHCASE; if (lpfr->Flags & FR_WHOLEWORD) flags |= FR_WHOLEWORD; FINDTEXTEX ft; SendDlgItemMessage(hwndDlg, IDC_LOGWIN, EM_EXGETSEL, 0, (LPARAM)&ft.chrg); if (ft.chrg.cpMax == ft.chrg.cpMin) ft.chrg.cpMin = 0; else ft.chrg.cpMin = ft.chrg.cpMax; ft.chrg.cpMax = SendDlgItemMessage(hwndDlg, IDC_LOGWIN, WM_GETTEXTLENGTH, 0, 0); ft.lpstrText = lpfr->lpstrFindWhat; ft.chrg.cpMin = SendDlgItemMessage(hwndDlg, IDC_LOGWIN, EM_FINDTEXTEX, flags, (LPARAM)&ft); if (ft.chrg.cpMin != -1) SendDlgItemMessage(hwndDlg, IDC_LOGWIN, EM_SETSEL, ft.chrgText.cpMin, ft.chrgText.cpMax); else MessageBeep(MB_ICONASTERISK); } if (lpfr->Flags & FR_DIALOGTERM) g_find.hwndFind = 0; return TRUE; } return 0; }
int LoadMineSegmentsCompiled (CFile& cf) { int i, nSegments, nVertices; ubyte nCompiledVersion; char *psz; gameData.segs.vMin.Set (0x7fffffff, 0x7fffffff, 0x7fffffff); /* [X] = gameData.segs.vMin[Y] = gameData.segs.vMin[Y] = 0x7fffffff;*/ gameData.segs.vMax.Set (-0x7fffffff, -0x7fffffff, -0x7fffffff); /*[X] = gameData.segs.vMax[X] = gameData.segs.vMax[Y] = gameData.segs.vMax[Y] = -0x7fffffff;*/ gameStates.render.bColored = 0; bD1PigPresent = CFile::Exist (D1_PIGFILE, gameFolders.szDataDir, 0); psz = strchr (gameData.segs.szLevelFilename, '.'); bNewFileFormat = !psz || strcmp (psz, ".sdl"); // For compiled levels, textures map to themselves, prevent nTexOverride always being gray, // bug which Matt and John refused to acknowledge, so here is Mike, fixing it. //=============================== Reading part ============================== nCompiledVersion = cf.ReadByte (); //Assert ( nCompiledVersion==COMPILED_MINE_VERSION ); #if TRACE if (nCompiledVersion != COMPILED_MINE_VERSION) console.printf (CON_DBG, "compiled mine version=%i\n", nCompiledVersion); //many levels have "wrong" versions. Theres no point in aborting because of it, I think. console.printf (CON_DBG, " compiled mine version = %d\n", nCompiledVersion); #endif nVertices = bNewFileFormat ? cf.ReadShort () : cf.ReadInt (); Assert (nVertices <= MAX_VERTICES); #if TRACE console.printf (CON_DBG, " %d vertices\n", gameData.segs.nVertices); #endif nSegments = bNewFileFormat ? cf.ReadShort () : cf.ReadInt (); if (nSegments >= MAX_SEGMENTS) { Warning (TXT_LEVEL_TOO_LARGE); return -1; } if (!InitGame (nSegments, nVertices)) return -1; #if TRACE console.printf (CON_DBG, " %d segments\n", gameData.segs.nSegments); #endif for (i = 0; i < gameData.segs.nVertices; i++) { cf.ReadVector (gameData.segs.vertices [i]); #if !FLOAT_COORD gameData.segs.fVertices [i][X] = X2F (gameData.segs.vertices [i][X]); gameData.segs.fVertices [i][Y] = X2F (gameData.segs.vertices [i][Y]); gameData.segs.fVertices [i][Z] = X2F (gameData.segs.vertices [i][Z]); #endif if (gameData.segs.vMin [X] > gameData.segs.vertices [i][X]) gameData.segs.vMin [X] = gameData.segs.vertices [i][X]; if (gameData.segs.vMin [Y] > gameData.segs.vertices [i][Y]) gameData.segs.vMin [Y] = gameData.segs.vertices [i][Y]; if (gameData.segs.vMin [Z] > gameData.segs.vertices [i][Z]) gameData.segs.vMin [Z] = gameData.segs.vertices [i][Z]; if (gameData.segs.vMax [X] < gameData.segs.vertices [i][X]) gameData.segs.vMax [X] = gameData.segs.vertices [i][X]; if (gameData.segs.vMax [Y] < gameData.segs.vertices [i][Y]) gameData.segs.vMax [Y] = gameData.segs.vertices [i][Y]; if (gameData.segs.vMax [Z] < gameData.segs.vertices [i][Z]) gameData.segs.vMax [Z] = gameData.segs.vertices [i][Z]; } SEGMENTS.Clear (); #if TRACE console.printf (CON_DBG, " loading segments ...\n"); #endif gameData.segs.nLastVertex = gameData.segs.nVertices - 1; gameData.segs.nLastSegment = gameData.segs.nSegments - 1; if (gameStates.app.bProgressBars && gameOpts->menus.nStyle) LoadSegmentsGauge (cf); else { LoadSegmentsCompiled (-1, cf); SetupSegments (); // Fill in side type and normals. LoadExtSegmentsCompiled (cf); LoadVertLightsCompiled (-1, cf); LoadSideLightsCompiled (-1, cf); LoadTexColorsCompiled (-1, cf); ComputeSegSideCenters (-1); } gameData.segs.fRad = X2F (CFixVector::Dist(gameData.segs.vMax, gameData.segs.vMin)); ResetObjects (1); //one CObject, the player return 0; }