Beispiel #1
0
MainWindow::MainWindow( GameEngine * currentEngine) :
 isGameLaunched(false),keystate()
{
  currentGameEngine = currentEngine ;

  // menubar creation
  menuBar = new QMenuBar();
  QMenu * gameMenu = menuBar->addMenu("Game");
  gameMenu->addAction("New Game",this,SLOT(diplayNewGame()));
  gameMenu->addAction("Stop Game",currentGameEngine, SLOT(stop()));
  gameMenu->addAction("Options",this, SLOT(displayOptions()));
  gameMenu->addSeparator();
  gameMenu->addAction("Quit",qApp,SLOT(quit()));
  QMenu * helpMenu = menuBar->addMenu("Help");
  helpMenu->addAction("About chmeup",this,SLOT(displayAbout()));

  setFixedSize(screenWidthGlobal + 2 * BORDER_WIDTH ,screenHeightGlobal + menuBar->sizeHint().height() + 2* BORDER_HEIGHT);

  // central widget
  setCentralWidget(&screen);

  connect(currentGameEngine, SIGNAL(updateUI()), this, SLOT(update())) ;
  connect(currentGameEngine, SIGNAL(requestKeyUI()),this,SLOT(keysNeeded()));
  connect(currentGameEngine, SIGNAL(displayGameOverScreen()), this, SLOT(gameOverDisplay()));
  connect(currentGameEngine, SIGNAL(displayGameWonScreen()),this,SLOT(gameWonDisplay()));
  connect(this,SIGNAL(sendKeys(KeyPressedFrame * )),currentGameEngine,SLOT(getKeyFrame(KeyPressedFrame *)));
  connect(this,SIGNAL(sendPause()), currentGameEngine, SLOT(pause()));

  setMenuBar(menuBar);

}
void handleKeyPress()
{
    TCOD_key_t key = TCODConsole::waitForKeypress(true);
    switch (key.c)
    {
        //actions
    case MOVE_WEST:
        player->moveAction(player->getXPosition() - 1, player->getYPosition(), player->getMapLevel());
        break;
    case MOVE_SOUTH:
        player->moveAction(player->getXPosition(), player->getYPosition() + 1, player->getMapLevel());
        break;
    case MOVE_NORTH:
        player->moveAction(player->getXPosition(), player->getYPosition() - 1, player->getMapLevel());
        break;
    case MOVE_EAST:
        player->moveAction(player->getXPosition() + 1, player->getYPosition(), player->getMapLevel());
        break;
    case MOVE_NORTHWEST:
        player->moveAction(player->getXPosition() - 1, player->getYPosition() - 1, player->getMapLevel());
        break;
    case MOVE_NORTHEAST:
        player->moveAction(player->getXPosition() + 1, player->getYPosition() - 1, player->getMapLevel());
        break;
    case MOVE_SOUTHWEST:
        player->moveAction(player->getXPosition() - 1, player->getYPosition() + 1, player->getMapLevel());
        break;
    case MOVE_SOUTHEAST:
        player->moveAction(player->getXPosition() + 1, player->getYPosition() + 1, player->getMapLevel());
        break;
    case REST:
        player->restAction();
        break;
    case MOVE_DOWNSTAIRS:
        player->descendStairsAction();
        break;
    case MOVE_UPSTAIRS:
        player->ascendStairsAction();
        break;
    case OPEN_DOOR:
        player->openDoorAction();
        break;
    case CLOSE_DOOR:
        player->closeDoorAction();
        break;
    case PICKUP:
        player->pickupItemAction();
        break;
    case CHANGE_CLASS:
        player->changeClassAction();
        displayGameScreen();
        updateScreen();
        break;

        //screens
    case SHOW_INVENTORY:
        displayInventoryScreen();
        break;
    case HELP:
        displayHelpScreen();
        displayGameScreen();
        updateScreen();
        break;
    case QUIT:
        displayGameOverScreen("You have exited the game.");
        break;
    }
}
int main(int argc, char* argv[])
{
    int seed = init_rand();
    //int seed = init_rand(1314485160);
    std::cout << "seed:" << seed << std::endl;

    initScreen();
    displayTitleScreen();

    int world_width = worldScreenDims[WIDTH];
    int world_height = worldScreenDims[HEIGHT];
    int world_depth = 5;

    world = new World(world_width, world_height, world_depth);
    setWorld(world);//interface.h, just to keep a pointer to the world so It doesn't have to get passed with every message, prompt, etc. probably a better way to do this but i cba
    player = world->generatePlayer();
    enemies = world->generateEnemies(4,8);
    world->generateItems(25,50);

    std::stringstream intro_stream;
    intro_stream << "You are " << player->getName() << ", an Adventurer in search of the Icon of Weedaula.";
    message(intro_stream.str());
    message("Bring the Icon back to the surface to win the game!");
    message("Press '?' for help");

    while (!isGameOver())
    {
        world->incrementTimeStep();
        player->FOV(player->getMapLevel());
        displayGameScreen();
        updateScreen();

        player->startTurn();
        while (!player->isTurnFinished() && player->isTurn() && !isGameOver())
        {
            handleKeyPress();
        }
        player->endTurn();

        enemies = world->getEnemyList();
        for (unsigned int i = 0; i < enemies.size(); i++)
        {
            Enemy *en = enemies[i];
            en->FOV(en->getMapLevel());
            en->startTurn();
            if (en->isTurn() && withinRange(en->getMapLevel(), player->getMapLevel(), player->getMapLevel()))
            {
                en->takeTurn();
            }
            en->endTurn();
        }
    }

    if (isGameOver())
    {
        if (!player->isAlive())
        {
            displayGameOverScreen("You have been struck down");
        }
    }
}