void CEditor::HandleKeys() { Uint8* keys; keys = SDL_GetKeyState(NULL); SDL_Event event; // the hot spot for mouse scrolling, you need to press the left mouse button within this area on whatever side int scrollHotSpot = 30; while (SDL_PollEvent(&event)) { if (event.type == SDL_QUIT) { done = 1; } if (event.type == SDL_KEYDOWN) { if (event.key.keysym.sym == SDLK_SPACE) { } } if (event.type == SDL_MOUSEBUTTONDOWN) { switch (event.button.button) { case SDL_BUTTON_LEFT: // mouse button 1 { int previous_objectedit_selected = objectedit_selected; bool handled = false; // see if we can select an object being pointed at. if ( ! handled ) { switch (current_object) { case 1: // environment objectedit_selected = zoneToEdit->LocateEnvironment(editorFocus->getX()+mouseX,editorFocus->getY()+mouseY); break; case 2: // shadows objectedit_selected = zoneToEdit->LocateShadow(editorFocus->getX()+mouseX,editorFocus->getY()+mouseY); break; case 3: // collisionboxes objectedit_selected = zoneToEdit->LocateCollisionbox(editorFocus->getX()+mouseX,editorFocus->getY()+mouseY); break; case 4: // NPCs objectedit_selected = zoneToEdit->LocateNPC(editorFocus->getX()+mouseX,editorFocus->getY()+mouseY); default: curAdjacentTiles.clear(); break; } } if ( previous_objectedit_selected != objectedit_selected ) { // something new was selected. Update adjacency-list if necessary if ( adjacencyModeEnabled ) { updateAdjacencyList(); } } } break; case SDL_BUTTON_RIGHT: // right mouse button. { bool handled = false; // first check whether we are in adjacency mode and can place a tile. If not we select a tile if ( ! handled && adjacencyModeEnabled ) { handled = checkAndPlaceAdjacentTile(); } } break; case SDL_BUTTON_WHEELUP: // scroll up { // if mouse is over a tile for adjacency selection, change to next tile in the selection // else increase our tileposition bool handled = false; if ( adjacencyModeEnabled ) { handled = checkAndApplyAdjacencyModification( 1 ); } if ( ! handled ) { inc_tilepos(); } } break; case SDL_BUTTON_WHEELDOWN: // scroll down { // if mouse is over a tile for adjacency selection, change to previous tile in the selection // else decrease our tileposition bool handled = false; if ( adjacencyModeEnabled ) { handled = checkAndApplyAdjacencyModification( -1 ); } if ( ! handled ) { dec_tilepos(); } } break; } } if (event.type == SDL_MOUSEMOTION) { mouseX = event.motion.x; mouseY = Configuration::screenHeight - event.motion.y - 1; } } // the arrow-keys. if an object is selected, we move it around. if Left shift is pushed, we scale the object.. // else we move around in our zone. if (objectedit_selected >= 0 && !KP_moveonce) { switch (current_object) { case 1: // environment if (keys[SDLK_LSHIFT]) { if (keys[SDLK_DOWN]) { zoneToEdit->EnvironmentMap[objectedit_selected].y_scale -= 0.01f; } if (keys[SDLK_UP]) { zoneToEdit->EnvironmentMap[objectedit_selected].y_scale += 0.01f; } if (keys[SDLK_LEFT]) { zoneToEdit->EnvironmentMap[objectedit_selected].x_scale -= 0.01f; } if (keys[SDLK_RIGHT]) { zoneToEdit->EnvironmentMap[objectedit_selected].x_scale += 0.01f; } } else { if (keys[SDLK_RCTRL]) // right ctrl is held down, then we only want to move environment 1 pixel at time { KP_moveonce = true; } if (keys[SDLK_DOWN]) { zoneToEdit->EnvironmentMap[objectedit_selected].y_pos--; } if (keys[SDLK_UP]) { zoneToEdit->EnvironmentMap[objectedit_selected].y_pos++; } if (keys[SDLK_LEFT]) { zoneToEdit->EnvironmentMap[objectedit_selected].x_pos--; } if (keys[SDLK_RIGHT]) { zoneToEdit->EnvironmentMap[objectedit_selected].x_pos++; } } break; case 2: // shadows if (keys[SDLK_LSHIFT]) { if (keys[SDLK_DOWN]) { zoneToEdit->ShadowMap[objectedit_selected].y_scale -= 0.01f; } if (keys[SDLK_UP]) { zoneToEdit->ShadowMap[objectedit_selected].y_scale += 0.01f; } if (keys[SDLK_LEFT]) { zoneToEdit->ShadowMap[objectedit_selected].x_scale -= 0.01f; } if (keys[SDLK_RIGHT]) { zoneToEdit->ShadowMap[objectedit_selected].x_scale += 0.01f; } } else { if (keys[SDLK_DOWN]) { zoneToEdit->ShadowMap[objectedit_selected].y_pos--; } if (keys[SDLK_UP]) { zoneToEdit->ShadowMap[objectedit_selected].y_pos++; } if (keys[SDLK_LEFT]) { zoneToEdit->ShadowMap[objectedit_selected].x_pos--; } if (keys[SDLK_RIGHT]) { zoneToEdit->ShadowMap[objectedit_selected].x_pos++; } } break; case 3: // collisionboxes if (keys[SDLK_LSHIFT]) { if (keys[SDLK_DOWN]) { zoneToEdit->CollisionMap[objectedit_selected].CR.h -= 1; } if (keys[SDLK_UP]) { zoneToEdit->CollisionMap[objectedit_selected].CR.h += 1; } if (keys[SDLK_LEFT]) { zoneToEdit->CollisionMap[objectedit_selected].CR.w -= 1; } if (keys[SDLK_RIGHT]) { zoneToEdit->CollisionMap[objectedit_selected].CR.w += 1; } } else { if (keys[SDLK_DOWN]) { zoneToEdit->CollisionMap[objectedit_selected].CR.y--; } if (keys[SDLK_UP]) { zoneToEdit->CollisionMap[objectedit_selected].CR.y++; } if (keys[SDLK_LEFT]) { zoneToEdit->CollisionMap[objectedit_selected].CR.x--; } if (keys[SDLK_RIGHT]) { zoneToEdit->CollisionMap[objectedit_selected].CR.x++; } } break; case 4: // NPCs if (keys[SDLK_DOWN]) { zoneToEdit->getNPCs()[ objectedit_selected ]->y_spawn_pos--; zoneToEdit->getNPCs()[ objectedit_selected ]->y_pos--; } if (keys[SDLK_UP]) { zoneToEdit->getNPCs()[ objectedit_selected ]->y_spawn_pos++; zoneToEdit->getNPCs()[ objectedit_selected ]->y_pos++; } if (keys[SDLK_LEFT]) { zoneToEdit->getNPCs()[ objectedit_selected ]->x_spawn_pos--; zoneToEdit->getNPCs()[ objectedit_selected ]->x_pos--; } if (keys[SDLK_RIGHT]) { zoneToEdit->getNPCs()[ objectedit_selected ]->x_spawn_pos++; zoneToEdit->getNPCs()[ objectedit_selected ]->x_pos++; } break; } } else if ( objectedit_selected < 0 ) { // Not editting an object, use arrows to move screen if(SDL_GetMouseState(NULL, NULL) &SDL_BUTTON(1)) { //corners if(mouseX < scrollHotSpot && mouseY < scrollHotSpot) editorFocus->setFocus(editorFocus->getX()-1, editorFocus->getY()-1); //bottom-left else if(mouseX < scrollHotSpot && mouseY > Configuration::screenHeight-scrollHotSpot) editorFocus->setFocus(editorFocus->getX()-1, editorFocus->getY()+1); //top-left else if(mouseX > Configuration::screenWidth-scrollHotSpot && mouseY < scrollHotSpot) editorFocus->setFocus(editorFocus->getX()+1, editorFocus->getY()-1); //bottom-right else if(mouseX > Configuration::screenWidth-scrollHotSpot && mouseY > Configuration::screenHeight-scrollHotSpot) editorFocus->setFocus(editorFocus->getX()+1, editorFocus->getY()+1); //top-right else { //sides if(mouseX < scrollHotSpot) editorFocus->setFocus(editorFocus->getX()-1, editorFocus->getY()); //left if(mouseX > Configuration::screenWidth-scrollHotSpot) editorFocus->setFocus(editorFocus->getX()+1, editorFocus->getY()); //right if(mouseY < scrollHotSpot) editorFocus->setFocus(editorFocus->getX(), editorFocus->getY()-1); //bottom if(mouseY > Configuration::screenHeight-scrollHotSpot) editorFocus->setFocus(editorFocus->getX(), editorFocus->getY()+1); //top } } if (keys[SDLK_DOWN]) { editorFocus->setFocus(editorFocus->getX(), editorFocus->getY()-2); } if (keys[SDLK_UP]) { editorFocus->setFocus(editorFocus->getX(), editorFocus->getY()+2); } if (keys[SDLK_LEFT]) { editorFocus->setFocus(editorFocus->getX()-2, editorFocus->getY()); } if (keys[SDLK_RIGHT]) { editorFocus->setFocus(editorFocus->getX()+2, editorFocus->getY()); } } if (!keys[SDLK_DOWN] && !keys[SDLK_UP] && !keys[SDLK_LEFT] && !keys[SDLK_RIGHT]) { KP_moveonce = false; } if (keys[SDLK_DELETE] && !KP_delete_environment) { KP_delete_environment = true; switch (current_object) { case 0: // tiles zoneToEdit->DeleteTile(zoneToEdit->LocateTile(editorFocus->getX()+mouseX,editorFocus->getY()+mouseY)); break; case 1: // environment if ( zoneToEdit->DeleteEnvironment(editorFocus->getX()+mouseX,editorFocus->getY()+mouseY) == 0 ) objectedit_selected = -1; break; case 2: // shadows if ( zoneToEdit->DeleteShadow(editorFocus->getX()+mouseX,editorFocus->getY()+mouseY) == 0 ) objectedit_selected = -1; break; case 3: // collisionboxes if ( zoneToEdit->DeleteCollisionbox(editorFocus->getX()+mouseX,editorFocus->getY()+mouseY) == 0 ) objectedit_selected = -1; break; case 4: // NPCs if ( zoneToEdit->DeleteNPC(editorFocus->getX()+mouseX,editorFocus->getY()+mouseY) == 0 ) { zoneToEdit->cleanupNPCList(); objectedit_selected = -1; } break; } } if (!keys[SDLK_DELETE]) { KP_delete_environment = false; } if (keys[SDLK_RETURN] && !KP_add_environment) { objectedit_selected = -1; KP_add_environment = true; switch (current_object) { case 0: // tiles { Tile *currentTile = EditorInterface::getTileSet()->getAllTilesOfType( TileClassificationType::FLOOR )[ current_tilepos ]; zoneToEdit->ChangeTile(zoneToEdit->LocateTile(editorFocus->getX()+mouseX,editorFocus->getY()+mouseY),currentTile); } break; case 1: // environment { Tile *currentTile = EditorInterface::getTileSet()->getAllTilesOfType( TileClassificationType::ENVIRONMENT )[ current_tilepos ]; zoneToEdit->AddEnvironment(editorFocus->getX()+mouseX,editorFocus->getY()+mouseY,currentTile, true /* centered on pos */ ); } break; case 2: // shadows { Tile *currentTile = EditorInterface::getTileSet()->getAllTilesOfType( TileClassificationType::SHADOW )[ current_tilepos ]; zoneToEdit->AddShadow(editorFocus->getX()+mouseX,editorFocus->getY()+mouseY,currentTile); } break; case 3: // collisionboxes zoneToEdit->AddCollisionbox(editorFocus->getX()+mouseX,editorFocus->getY()+mouseY); break; case 4: // NPCs CNPC *curNPC = DawnInterface::addMobSpawnPoint( editorNPCs[ current_tilepos ].first, editorFocus->getX()+mouseX-48, editorFocus->getY()+mouseY-48, 180, 1 ); curNPC->setAttitude( Attitude::HOSTILE ); break; } } if (!keys[SDLK_RETURN]) { KP_add_environment = false; } if (keys[SDLK_l] && !KP_toggle_editor) { current_tilepos = 0; tilepos_offset = 0; objectedit_selected = -1; enabled = false; KP_toggle_editor = true; *editorFocus = *originalFocus; delete originalFocus; } if (!keys[SDLK_l]) { KP_toggle_editor = false; } if (keys[SDLK_m] && !KP_toggle_adjacencyMode) { KP_toggle_adjacencyMode = true; adjacencyModeEnabled = ! adjacencyModeEnabled; if ( adjacencyModeEnabled ) { updateAdjacencyList(); } } if (!keys[SDLK_m]) { KP_toggle_adjacencyMode = false; } if (keys['.']) { // increase the amount of transparency of the object. switch (current_object) { case 1: // environment if (zoneToEdit->EnvironmentMap[objectedit_selected].transparency > 0.01f) { zoneToEdit->EnvironmentMap[objectedit_selected].transparency -= 0.01f; } break; case 2: // shadows if (zoneToEdit->ShadowMap[objectedit_selected].transparency > 0.01f) { zoneToEdit->ShadowMap[objectedit_selected].transparency -= 0.01f; } break; } } if (keys[',']) { // decrease the amount of transparency of the object. switch (current_object) { case 1: // environment if (zoneToEdit->EnvironmentMap[objectedit_selected].transparency < 0.99f) { zoneToEdit->EnvironmentMap[objectedit_selected].transparency += 0.01f; } break; case 2: // shadows if (zoneToEdit->ShadowMap[objectedit_selected].transparency < 0.99f) { zoneToEdit->ShadowMap[objectedit_selected].transparency += 0.01f; } break; } } // change the objects red color if (keys['1']) { switch (current_object) { case 1: if (keys[SDLK_LSHIFT]) { if (zoneToEdit->EnvironmentMap[objectedit_selected].red > 0.01f) { zoneToEdit->EnvironmentMap[objectedit_selected].red -= 0.01f; } } else { if (zoneToEdit->EnvironmentMap[objectedit_selected].red < 1.0f) { zoneToEdit->EnvironmentMap[objectedit_selected].red += 0.01f; } } break; case 2: if (keys[SDLK_LSHIFT]) { if (zoneToEdit->ShadowMap[objectedit_selected].red > 0.01f) { zoneToEdit->ShadowMap[objectedit_selected].red -= 0.01f; } } else { if (zoneToEdit->ShadowMap[objectedit_selected].red < 1.0f) { zoneToEdit->ShadowMap[objectedit_selected].red += 0.01f; } } break; } } // change the objects green color if (keys['2']) { switch (current_object) { case 1: if (keys[SDLK_LSHIFT]) { if (zoneToEdit->EnvironmentMap[objectedit_selected].green > 0.01f) { zoneToEdit->EnvironmentMap[objectedit_selected].green -= 0.01f; } } else { if (zoneToEdit->EnvironmentMap[objectedit_selected].green < 1.0f) { zoneToEdit->EnvironmentMap[objectedit_selected].green += 0.01f; } } break; case 2: if (keys[SDLK_LSHIFT]) { if (zoneToEdit->ShadowMap[objectedit_selected].green > 0.01f) { zoneToEdit->ShadowMap[objectedit_selected].green -= 0.01f; } } else { if (zoneToEdit->ShadowMap[objectedit_selected].green < 1.0f) { zoneToEdit->ShadowMap[objectedit_selected].green += 0.01f; } } break; } } // change the objects blue color if (keys['3']) { switch (current_object) { case 1: if (keys[SDLK_LSHIFT]) { if (zoneToEdit->EnvironmentMap[objectedit_selected].blue > 0.01f) { zoneToEdit->EnvironmentMap[objectedit_selected].blue -= 0.01f; } } else { if (zoneToEdit->EnvironmentMap[objectedit_selected].blue < 1.0f) { zoneToEdit->EnvironmentMap[objectedit_selected].blue += 0.01f; } } break; case 2: if (keys[SDLK_LSHIFT]) { if (zoneToEdit->ShadowMap[objectedit_selected].blue > 0.01f) { zoneToEdit->ShadowMap[objectedit_selected].blue -= 0.01f; } } else { if (zoneToEdit->ShadowMap[objectedit_selected].blue < 1.0f) { zoneToEdit->ShadowMap[objectedit_selected].blue += 0.01f; } } break; } } // increase the Z-position if (keys[SDLK_b] && !KP_increase_Zpos) { KP_increase_Zpos = true; if ( current_object == 1 ) // environment { zoneToEdit->EnvironmentMap[objectedit_selected].z_pos++; } } if (!keys[SDLK_b]) { KP_increase_Zpos = false; } // decrease the Z-position if (keys[SDLK_n] && !KP_decrease_Zpos) { KP_decrease_Zpos = true; if ( current_object == 1 ) // environment { if ( zoneToEdit->EnvironmentMap[objectedit_selected].z_pos > 0 ) { zoneToEdit->EnvironmentMap[objectedit_selected].z_pos--; } } } if (!keys[SDLK_n]) { KP_decrease_Zpos = false; } if (keys[SDLK_F1] && !KP_toggle_tileset) { current_tilepos = 0; tilepos_offset = 0; objectedit_selected = -1; KP_toggle_tileset = true; if (current_object < 4) { current_object++; } else { current_object = 0; } } if (!keys[SDLK_F1]) { KP_toggle_tileset = false; } if (keys[SDLK_s] && !KP_save_zone) { KP_save_zone = true; SaveZone(); message.AddText(editorFocus->getX() + (Configuration::screenWidth/2), editorFocus->getY() + (Configuration::screenHeight/2), 1.0f, 0.625f, 0.71f, 1.0f, 15, 3.0f, "Zone saved ..."); } if (!keys[SDLK_s]) { KP_save_zone = false; } }
void ZoneCommands(pentry entries[], int x) { if(!strcmp(gcPage,"Zone")) { ProcessZoneVars(entries,x); if(!strcmp(gcFunction,"Select Zone")) { SelectZone(1); htmlZone(); } else if(!strcmp(gcFunction,"New")) { // SelectZone();//No hidden fields when disabled sprintf(gcNewStep,"Confirm "); gcMessage="Modify data, review, then confirm. Any other action to cancel."; gcInputStatus[0]=0; SetZoneFieldsOn(); cuSerial[0]=0; htmlZone(); } else if(!strcmp(gcFunction,"Confirm New")) { if(ValidateZoneInput()) NewZone(); if(strcmp(gcMessage,"Zone Created")) { sprintf(gcNewStep,"Confirm "); gcInputStatus[0]=0; SetZoneFieldsOn(); } else { time_t luClock; unsigned uNameServer=0; time(&luClock); sprintf(gcInputStatus,"disabled"); sscanf(cuNameServer,"%u",&uNameServer); if(uNameServer) { if(AdminSubmitJob("New",uNameServer,gcZone,0,luClock)) htmlPlainTextError(mysql_error(&gMysql)); } else { gcMessage="<blink>Error: </blink>Contact admin: uNameServer error"; } SelectZone(1); } htmlZone(); } else if(!strcmp(gcFunction,"Modify")) { SelectZone(1);//No hidden fields when disabled sprintf(gcModStep,"Confirm "); gcMessage="Modify data, review, then confirm. Any other action to cancel."; gcInputStatus[0]=0; SetZoneFieldsOn(); if(uOwner!=uForClient) { uForClient=uOwner; //Don't mess zone ownership by mistake if loaded via another company sprintf(gcCustomer,"%s",ForeignKey("tClient","cLabel",uOwner)); } htmlZone(); } else if(!strcmp(gcFunction,"Confirm Modify")) { if(ValidateZoneInput()) UpdateZone(); if(strcmp(gcMessage,"Zone Modified")) { sprintf(gcModStep,"Confirm "); gcInputStatus[0]=0; SetZoneFieldsOn(); } else { time_t luClock; unsigned uNameServer=0; time(&luClock); sprintf(gcInputStatus,"disabled"); sscanf(cuNameServer,"%u",&uNameServer); if(uNameServer) { if(AdminSubmitJob("Modify",uNameServer,gcZone,0,luClock)) htmlPlainTextError(mysql_error(&gMysql)); } else { gcMessage="<blink>Error: </blink>Contact admin: uNameServer error"; } SelectZone(1); } htmlZone(); } else if(!strcmp(gcFunction,"Delete")) { SelectZone(1);//No hidden fields when disabled sprintf(gcDelStep,"Confirm "); htmlZone(); } else if(!strcmp(gcFunction,"Confirm Delete")) { SelectZone(1);//No hidden fields when disabled SaveZone(); DelZone(); if(!strcmp(gcMessage,"Zone Deleted")) { time_t luClock; unsigned uNameServer=0; time(&luClock); sprintf(gcInputStatus,"disabled"); sscanf(cuNameServer,"%u",&uNameServer); if(uNameServer) { if(AdminSubmitJob("Delete",uNameServer,gcZone,0,luClock)) htmlPlainTextError(mysql_error(&gMysql)); } else { gcMessage="<blink>Error: </blink>Contact admin: uNameServer error"; } } htmlZone(); } else if(!strcmp(gcFunction,"Bulk Import")) { htmlBulkOp(); } else if(!strcmp(gcFunction,"Restore Zones")) { htmlRestoreZone(); } else if(!strcmp(gcFunction,"Restore RRs")) { htmlRestoreResource(cuZone); } else if(!strcmp(gcFunction,"Zone Diagnostics")) { ZoneDiagnostics(); } else if(gcZone[0]) { SelectZone(1); htmlZone(); } htmlZone(); } }//void ZoneCommands(pentry entries[], int x)
/*------------------------------------------------------*/ int PcLinkDecode (char *c) { /* long i; rtime t1,t2; char cc[128]; double a,b,aa; */ switch(*c) { case '=': LoadFromPc(++c); break; case ':': puts_rld(++c); return(eof); case '*': puts_C100(++c); puts_C100("\r"); return(eof); case '.': GpsComm(++c); return(eof); case '@': WriteSophie(++c); return(eof); case '-': DeleteFromPc(++c); break; case '?': ListToPc(++c); break; case '#': SetAlarm(); break; #ifndef WIN32 case '!': sector_erase(SYSPAR,0); SavePar(SYSPAR,0); sector_erase(FONTS,0); fonts=FONTS; WriteGunData(Guns,&fonts); fonts=SaveZone(SaveFonts(fonts)); break; #endif /* testiranje hitrosti case 'r': sscanf(++c,"%ld,%lf",&i,&a); ReadTime(&t1); watchdog(); PIT_disable(); while(i--) b=sqrt(a); PIT_enable(); wait(5); ReadTime(&t2); sprintf(cc,">>> %lf\r\n",dtime(&t2,&t1)); puts_pc(cc); beep(100); break; case 'm': sscanf(++c,"%ld,%lf,&lf",&i,&a,&b); ReadTime(&t1); watchdog(); PIT_disable(); while(i--) aa=a*b; PIT_enable(); wait(5); ReadTime(&t2); sprintf(cc,">>> %lf\r\n",dtime(&t2,&t1)); puts_pc(cc); beep(100); break; case 'p': sscanf(++c,"%ld,%lf,&lf",&i,&a,&b); ReadTime(&t1); watchdog(); PIT_disable(); while(i--) aa=pow(a,b); PIT_enable(); wait(5); ReadTime(&t2); sprintf(cc,">>> %lf\r\n",dtime(&t2,&t1)); puts_pc(cc); beep(100); break; case 'e': sscanf(++c,"%ld,%lf",&i,&a); ReadTime(&t1); watchdog(); PIT_disable(); while(i--) aa=exp(a); PIT_enable(); wait(5); ReadTime(&t2); sprintf(cc,">>> %lf\r\n",dtime(&t2,&t1)); puts_pc(cc); beep(100); break; case 's': sscanf(++c,"%ld,%lf",&i,&a); ReadTime(&t1); watchdog(); PIT_disable(); while(i--) aa=sin(a); PIT_enable(); wait(5); ReadTime(&t2); sprintf(cc,">>> %lf\r\n",dtime(&t2,&t1)); puts_pc(cc); beep(100); break; case 't': sscanf(++c,"%ld,%lf",&i,&a); ReadTime(&t1); watchdog(); PIT_disable(); while(i--) aa=tan(a); PIT_enable(); wait(5); ReadTime(&t2); sprintf(cc,">>> %lf\r\n",dtime(&t2,&t1)); puts_pc(cc); beep(100); break; case 'a': sscanf(++c,"%ld,%lf",&i,&a); ReadTime(&t1); watchdog(); PIT_disable(); while(i--) aa=atan(a); PIT_enable(); wait(5); ReadTime(&t2); sprintf(cc,">>> %lf\r\n",dtime(&t2,&t1)); puts_pc(cc); beep(100); break; */ default: if(chrtx(c)) Ungetch(chrtx(c),0); break; } return(null); }