Ejemplo n.º 1
0
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;
  }

}