Exemplo n.º 1
0
void GameSession::run(LevelDefinitionBase* level) {
	
	_levelDefinition = level;

	startLevel();

	const Pad& pad = Hardware::getPad();

	while (isRunning()) {
		
		checkLevelComplete();
		animate();
		timer();
		move();

		if (pad.isStartNewPress()) {
			pause();
		} else if (pad.isSelectNewPress() && _isMapAvailable) {
			showMap();
		} else if (pad.isLHeld() && pad.isRHeld()) {
			commitSuicide();
		}

		Hardware::waitForVBlank();
	}
}
Exemplo n.º 2
0
void GameSession::move() {

	_movementTimer++;

	if (_movementTimer != MOVEMENT_TIME) return;

	_movementTimer = 0;

	movePlayer();

	_level->iterate(isGravityInverted());
	_isOddIteration = !_isOddIteration;

	decreaseGravityTime();

	// If the last iteration of the game caused the player to die, we either
	// need to reset the level to its default state or end the game
	if (_level->getPlayerBlock()->isDestroyed()) {
		if (_lives > 0) {
			startLevel();
		} else {
			_isRunning = false;
			_isGameOver = true;
		}
	}
}
Exemplo n.º 3
0
void KJezzball::newGame()
{
    // Check for running game
    closeGame();
    if ( m_state==Idle )
    {
        // untoggles the pause button in case it was toggled
        m_pauseButton->setChecked(false);

        // update displays
        m_game.level = 1;
        m_game.score = 0;

        m_levelLCD->display( m_game.level );
        m_scoreLCD->display( m_game.score );

        statusBar()->clear();

        // start new game
        m_state = Running;

        createLevel( m_game.level );
        startLevel();
    }
}
Exemplo n.º 4
0
void Lobby::checkFreeUsers(float p_DeltaTime)
{
	std::lock_guard<std::mutex> lock(m_UserLock);

	handlePackages();

	auto removeIt = std::remove_if(m_FreeUsers.begin(), m_FreeUsers.end(),
		[] (User::wPtr p_User)
		{
			User::ptr user = p_User.lock();
			return !user || user->getState() != User::State::LOBBY;
		});
	m_FreeUsers.erase(removeIt, m_FreeUsers.end());

	for (auto& level : m_Levels)
	{
		if (!level.m_JoinedUsers.empty())
		{
			level.m_WaitedTime += p_DeltaTime;
		}

		if (level.m_WaitedTime > level.m_TimeoutLength)
		{
			startLevel(level);
		}
	}
}
Exemplo n.º 5
0
void GameSession::checkLevelComplete() {
	
	if (_isLevelComplete) {
		
		SoundPlayer::stopAll();
		SoundPlayer::playLevelComplete();
		
		while (_remainingTime > 0) {
			_remainingTime -= _remainingTime >= 4 ? 4 : _remainingTime;
			addScore(_remainingTime >= 4 ? 4 : _remainingTime);		// One point per second
			
			_hud.drawTimerBar(_remainingTime);
			
			Hardware::waitForVBlank();
		}
		
		runTransition();
		
		if (_levelDefinition->getNextLevel() != NULL) {
			_levelDefinition = _levelDefinition->getNextLevel();
			startLevel();
		} else {
			_isRunning = false;
			_isGameComplete = true;
		}
	}
}
Exemplo n.º 6
0
void playGame()
{
    lives = MAX_LIVES;
    score = 0;
    startLevel();
    resetLevel();
    int resetPressed = FALSE;
    // game loop
	while (lives > 0) 
	{
        //test select button release
        if (KEY_DOWN_NOW(BUTTON_SELECT))
        {
            resetPressed = TRUE;
        }
        if (resetPressed && !KEY_DOWN_NOW(BUTTON_SELECT))
        {
            titleScreen();
        }
		waitForVBlank();
        erase();
        updateVars();
        checkOutsideScreen();
        generateObjs();
        draw();
	}
    gameOverScreen();
}
Exemplo n.º 7
0
/*
 * Just starts a new game
 */
void startGame() {
    level = 0;              // reset level
    difficulty = 0;         // reset difficulty level
    gameSpeed = 0;          // reset game seep level 
    timeEnd = pow(2, 5);    // sets the time endo to default (2Hz)

    startLevel();           // starts a new level
    playMusic(3);           // plays the tetris theme
}
Exemplo n.º 8
0
void scum(unsigned long startingSeed, short numberOfSeedsToScan, short scanThroughDepth) {
    unsigned long theSeed;
    char path[BROGUE_FILENAME_MAX];
    item *theItem;
    creature *monst;
    char buf[500];
    FILE *logFile;
    
    logFile = fopen("Brogue seed catalog.txt", "w");
    rogue.nextGame = NG_NOTHING;
    
    getAvailableFilePath(path, LAST_GAME_NAME, GAME_SUFFIX);
    strcat(path, GAME_SUFFIX);
    
    fprintf(logFile, "Brogue seed catalog, seeds %li to %li, through depth %i.\n\n\
To play one of these seeds, press control-N from the title screen \
and enter the seed number. Knowing which items will appear on \
the first %i depths will, of course, make the game significantly easier.",
            startingSeed, startingSeed + numberOfSeedsToScan - 1, scanThroughDepth, scanThroughDepth);
    
    for (theSeed = startingSeed; theSeed < startingSeed + numberOfSeedsToScan; theSeed++) {
        fprintf(logFile, "\n\nSeed %li:", theSeed);
        printf("\nScanned seed %li.", theSeed);
        rogue.nextGamePath[0] = '\0';
        randomNumbersGenerated = 0;
        
        rogue.playbackMode = false;
        rogue.playbackFastForward = false;
        rogue.playbackBetweenTurns = false;
        
        strcpy(currentFilePath, path);
        initializeRogue(theSeed);
        rogue.playbackOmniscience = true;
        for (rogue.depthLevel = 1; rogue.depthLevel <= scanThroughDepth; rogue.depthLevel++) {
            startLevel(rogue.depthLevel == 1 ? 1 : rogue.depthLevel - 1, 1); // descending into level n
            fprintf(logFile, "\n    Depth %i:", rogue.depthLevel);
            for (theItem = floorItems->nextItem; theItem != NULL; theItem = theItem->nextItem) {
                itemName(theItem, buf, true, true, NULL);
                upperCase(buf);
                fprintf(logFile, "\n        %s", buf);
                if (pmap[theItem->xLoc][theItem->yLoc].machineNumber > 0) {
                    fprintf(logFile, " (vault %i)", pmap[theItem->xLoc][theItem->yLoc].machineNumber);
                }
            }
            for (monst = monsters->nextCreature; monst != NULL; monst = monst->nextCreature) {
                scumMonster(monst, logFile);
            }
            for (monst = dormantMonsters->nextCreature; monst != NULL; monst = monst->nextCreature) {
                scumMonster(monst, logFile);
            }
        }
        freeEverything();
        remove(currentFilePath); // Don't add a spurious LastGame file to the brogue folder.
    }
    fclose(logFile);
}
Exemplo n.º 9
0
void SnakesGameManager::ReceiveMessage(Message* message)
{
    if(message->GetMessageName() == "StartGame")
	{
		startLevel(1);
	}
    else if(message->GetMessageName() == "ShowMenu"){
        showMenu();
    }
}
Exemplo n.º 10
0
void GameEngine::StartLevel(std::string _lvlName)
{
	m_levelImporter->LoadLevel(_lvlName);
	m_currentLevelName = _lvlName;

	Event startLevel(_lvlName);
	m_eventEngine->dispatch(LEVEL_START, &startLevel);

	m_levelStarted = true;
}
Exemplo n.º 11
0
BasicWork::State
ApplyBucketsWork::onRun()
{
    // Check if we're at the beginning of the new level
    if (isLevelComplete())
    {
        startLevel();
    }

    // The structure of these if statements is motivated by the following:
    // 1. mCurrApplicator should never be advanced if mSnapApplicator is
    //    not false. Otherwise it is possible for curr to modify the
    //    database when the invariants for snap are checked.
    // 2. There is no reason to advance mSnapApplicator or mCurrApplicator
    //    if there is nothing to be applied.
    if (mSnapApplicator)
    {
        if (*mSnapApplicator)
        {
            advance("snap", *mSnapApplicator);
            return State::WORK_RUNNING;
        }
        mApp.getInvariantManager().checkOnBucketApply(
            mSnapBucket, mApplyState.currentLedger, mLevel, false);
        mSnapApplicator.reset();
        mSnapBucket.reset();
        mBucketApplySuccess.Mark();
    }
    if (mCurrApplicator)
    {
        if (*mCurrApplicator)
        {
            advance("curr", *mCurrApplicator);
            return State::WORK_RUNNING;
        }
        mApp.getInvariantManager().checkOnBucketApply(
            mCurrBucket, mApplyState.currentLedger, mLevel, true);
        mCurrApplicator.reset();
        mCurrBucket.reset();
        mBucketApplySuccess.Mark();
    }

    mApp.getCatchupManager().logAndUpdateCatchupStatus(true);
    if (mLevel != 0)
    {
        --mLevel;
        CLOG(DEBUG, "History")
            << "ApplyBuckets : starting next level: " << mLevel;
        return State::WORK_RUNNING;
    }

    CLOG(DEBUG, "History") << "ApplyBuckets : done, restarting merges";
    mApp.getBucketManager().assumeState(mApplyState, mMaxProtocolVersion);
    return State::WORK_SUCCESS;
}
Exemplo n.º 12
0
void KJezzball::focusInEvent ( QFocusEvent *ev )
{
    if ( m_state==Suspend )
    {
        startLevel();
        m_state = Running;
        statusBar()->clear();
        m_pauseButton->setChecked(false);
        //m_gameWidget->display( QString::null );
    }

    KMainWindow::focusInEvent( ev );
}
Exemplo n.º 13
0
GameScene::GameScene(QObject *parent) :
    QGraphicsScene(parent),
    currentParticleNumber(0),
    _dt(0),
    firstStep(true),
    particlesToAdd(0)
{
    setSceneRect(0,0,800,480);
    currentParticleNumber = 0;
    startLevel(1);
    time.start();
    connect(&advanceTimer, SIGNAL(timeout()), SLOT(advance()));
    advanceTimer.start(1);
}
Exemplo n.º 14
0
void Lobby::joinLevel(User::ptr p_User, const std::string& p_LevelName)
{
	for (auto& level : m_Levels)
	{
		if (level.m_LevelName == p_LevelName)
		{
			level.m_JoinedUsers.push_back(p_User);
			p_User->setState(User::State::WAITING_FOR_GAME);

			if (level.m_JoinedUsers.size() >= level.m_MaxPlayers)
			{
				startLevel(level);
			}

			break;
		}
	}
}
Exemplo n.º 15
0
void GameSession::commitSuicide() {
	SoundPlayer::playSuicide();

	while (_remainingTime > 0) {
		_remainingTime -= 4;
		_hud.drawTimerBar(_remainingTime);
		Hardware::waitForVBlank();
	}

	decreaseLives();

	if (_lives > 0) {
		startLevel();
		render();
	} else {
		_isRunning = false;
		_isGameOver = true;
	}
}
Exemplo n.º 16
0
bool NormalGameModeManager::LevelUp() {
    int match = 1, i=0;
    while (match && i<theHeriswapGridSystem.Types) {
        if (remain[i] != 0) match=0;
        i++;
    }

    //si on a tous les objectifs
    if (match) {
        successMgr->sLevel1For2K(level, points);

        time -= glm::min(20 * 8.f / theHeriswapGridSystem.GridSize, time);

        PROFILE("NormalGameModeManager", "changeLevel", InstantEvent);

        startLevel(level+1);
    }
    return match;
}
Exemplo n.º 17
0
int main(int argc, char **argv) {
   pgInit(argc,argv);
   pgRegisterApp(PG_APP_NORMAL,"Blackout",0);

   /*** Top-level widgets: toolbar and canvas */
   wToolbar = pgNewWidget(PG_WIDGET_TOOLBAR,0,0);
   wCanvas = pgNewWidget(PG_WIDGET_CANVAS,0,0);
   pgBind(PGDEFAULT,PG_WE_BUILD,&evtDrawBoard,NULL);
   pgBind(PGDEFAULT,PG_WE_PNTR_DOWN,&evtMouseDown,NULL);

   /* Toolbar thingies */
   
   pgNewWidget(PG_WIDGET_BUTTON,PG_DERIVE_INSIDE,wToolbar);
   pgSetWidget(PGDEFAULT,
	       PG_WP_TEXT,pgNewString("Menu"),
	       PG_WP_EXTDEVENTS,PG_EXEV_PNTR_DOWN,
	       0);
   pgBind(PGDEFAULT,PG_WE_PNTR_DOWN,&btnMenu,NULL);

   wStatusLabel = pgNewWidget(PG_WIDGET_LABEL,0,0);
   pgSetWidget(PGDEFAULT,
	       PG_WP_SIDE,PG_S_ALL,
	       PG_WP_TRANSPARENT,0,
	       PG_WP_ALIGN,PG_A_CENTER,
//	       PG_WP_FONT,pgNewFont(NULL,10,PG_FSTYLE_BOLD),
	       0);


   /*** Allocate default game board */
   srand(time(NULL));
   boardwidth = 5;
   boardheight = 5;
   boardsize = sizeof(light) * boardwidth * boardheight;
   board = (light *) malloc(boardsize);
   solution = (light *) malloc(boardsize);
   startLevel(1);
   
   /*** Event loop */
   pgEventLoop();
   return 0;
}
Exemplo n.º 18
0
void KJezzball::switchLevel()
{
    m_game.score += m_level.score;

    // make sure the LCD provides enough digits for the score
    // (fixes #96841)
    int numDigits=0;
    int temp_score = m_game.score;
    for ( ; temp_score > 0; ++numDigits ) temp_score /= 10;
    if ( numDigits < 5 ) numDigits = 5; // set numDigits to at least 5, otherwise it does not look well

    m_scoreLCD->setNumDigits( numDigits );
    m_scoreLCD->display( m_game.score );

    QString score;
    score.setNum( m_level.score );

    QString level;
    level.setNum( m_game.level );

QString foo = QString(
i18n("You have successfully cleared more than 75% of the board.\n") +
i18n("%1 points: 15 points per remaining life\n").arg(m_level.lifes*15) +
i18n("%1 points: Bonus\n").arg((m_gameWidget->percent()-75)*2*(m_game.level+5)) +
i18n("%1 points: Total score for this level\n").arg(score) +
i18n("On to level %1. Remember you get %2 lives this time!")).arg(m_game.level+1).arg(m_game.level+2);

   KMessageBox::information( this,foo );


   // KMessageBox::information( this, i18n("You've completed level %1 with "
   //     "a score of %2.\nGet ready for the next one!").arg(level).arg(score));

    m_game.level++;
    m_levelLCD->display( m_game.level );

    createLevel( m_game.level );
    startLevel();
}
Exemplo n.º 19
0
/* Clickski! */
int evtMouseDown(struct pgEvent *evt) {
   int lx,ly;
   light *p;
   int i;
   
   /* What light was it in? */
   lx = (evt->e.pntr.x - bx) / lightw;
   ly = (evt->e.pntr.y - by) / lighth;

   if (evt->e.pntr.x < bx || lx >= boardwidth ||
       evt->e.pntr.y < by || ly >= boardwidth)
     return 0;

   invertLight(lx,ly);
   invertLight(lx-1,ly);
   invertLight(lx+1,ly);
   invertLight(lx,ly-1);
   invertLight(lx,ly+1);
   SOLUTION(lx,ly) ^= 1;
   
   /* Update the screen */
   pgWriteCmd(evt->from,PGCANVAS_INCREMENTAL,0);
   moves++;
   updateStatus();

   /* A win condition? */
   for (i=boardsize,p=board;i;i--,p++)
     if (*p)
       return 0; /* Nope. */
   
   /* Yep! */
   pgMessageDialogFmt("Blackout!",0,
		      "You completed level %d!\n\n"
		      "Moves: %d",level,moves);
   startLevel(level+1);
   
   return 0;
}
Exemplo n.º 20
0
void KJezzball::pauseGame()
{
    switch ( m_state )
    {
    case Running:
        m_state = Paused;
        statusBar()->message(i18n("Game paused.") );
        //m_gameWidget->display( i18n("Game paused. Press P to continue!") );
        stopLevel();
        break;

    case Paused:
    case Suspend:
        m_state = Running;
        statusBar()->clear();
        //m_gameWidget->display( QString::null );
        startLevel();
        break;

    case Idle:
        break;
    }
}
Exemplo n.º 21
0
// This is the basic program loop.
// When the program launches, or when a game ends, you end up here.
// If the player has already said what he wants to do next
// (by storing it in rogue.nextGame -- possibilities listed in enum NGCommands),
// we'll do it. The path (rogue.nextGamePath) is essentially a parameter for this command, and
// tells NG_VIEW_RECORDING and NG_OPEN_GAME which file to open. If there is a command but no
// accompanying path, and it's a command that should take a path, then pop up a dialog to have
// the player specify a path. If there is no command (i.e. if rogue.nextGame contains NG_NOTHING),
// then we'll display the title screen so the player can choose.
void mainBrogueJunction() {
	rogueEvent theEvent;
	char path[BROGUE_FILENAME_MAX], buf[100], seedDefault[100];
	char maxSeed[20];
	short i, j, k;
	boolean seedTooBig;
	
	// clear screen and display buffer
	for (i=0; i<COLS; i++) {
		for (j=0; j<ROWS; j++) {
			displayBuffer[i][j].character = 0;
			displayBuffer[i][j].needsUpdate = false;
			displayBuffer[i][j].opacity = 100;
			for (k=0; k<3; k++) {
				displayBuffer[i][j].foreColorComponents[k] = 0;
				displayBuffer[i][j].backColorComponents[k] = 0;
			}
			plotCharWithColor(' ', i, j, &black, &black);
		}
	}
	
	initializeLaunchArguments(&rogue.nextGame, rogue.nextGamePath, &rogue.nextGameSeed);
	
	do {
        rogue.gameHasEnded = false;
        rogue.playbackFastForward = false;
        rogue.playbackMode = false;
		switch (rogue.nextGame) {
			case NG_NOTHING:
				// Run the main menu to get a decision out of the player.
                // Seth: Added
                setBrogueGameEvent(BrogueGameEventShowTitle);
				titleMenu();
				break;
			case NG_NEW_GAME:
			case NG_NEW_GAME_WITH_SEED:
				rogue.nextGamePath[0] = '\0';
				randomNumbersGenerated = 0;
				
				rogue.playbackMode = false;
				rogue.playbackFastForward = false;
				rogue.playbackBetweenTurns = false;
                
                getAvailableFilePath(path, LAST_GAME_NAME, GAME_SUFFIX);
                strcat(path, GAME_SUFFIX);
				strcpy(currentFilePath, path);
				
				if (rogue.nextGame == NG_NEW_GAME_WITH_SEED) {
					if (rogue.nextGameSeed == 0) { // Prompt for seed; default is the previous game's seed.
						sprintf(maxSeed, "%lu", ULONG_MAX);
						if (previousGameSeed == 0) {
							seedDefault[0] = '\0';
						} else {
							sprintf(seedDefault, "%lu", previousGameSeed);
						}
						if (getInputTextString(buf, "Generate dungeon with seed number:",
											   log10(ULONG_MAX) + 1,
											   seedDefault,
											   "",
											   TEXT_INPUT_NUMBERS,
											   true)
							&& buf[0] != '\0') {
							seedTooBig = false;
							if (strlen(buf) > strlen(maxSeed)) {
								seedTooBig = true;
							} else if (strlen(buf) == strlen(maxSeed)) {
								for (i=0; maxSeed[i]; i++) {
									if (maxSeed[i] > buf[i]) {
										break; // we're good
									} else if (maxSeed[i] < buf[i]) {
										seedTooBig = true;
										break;
									}
								}
							}
							if (seedTooBig) {
								rogue.nextGameSeed = ULONG_MAX;
							} else {
								sscanf(buf, "%lu", &rogue.nextGameSeed);
							}
						} else {
							rogue.nextGame = NG_NOTHING;
							break; // Don't start a new game after all.
						}
					}
				} else {
					rogue.nextGameSeed = 0; // Seed based on clock.
				}
				// Seth: Added
                setBrogueGameEvent(BrogueGameEventStartNewGame);
				rogue.nextGame = NG_NOTHING;
				initializeRogue(rogue.nextGameSeed);
				startLevel(rogue.depthLevel, 1); // descending into level 1
				
				mainInputLoop();
				freeEverything();
				break;
			case NG_OPEN_GAME:
				rogue.nextGame = NG_NOTHING;
                // Seth: Added
                setBrogueGameEvent(BrogueGameEventBeginOpenGame);
				path[0] = '\0';
				if (rogue.nextGamePath[0]) {
					strcpy(path, rogue.nextGamePath);
					rogue.nextGamePath[0] = '\0';
				} else {
					dialogChooseFile(path, GAME_SUFFIX, "Open saved game:");
					//chooseFile(path, "Open saved game: ", "Saved game", GAME_SUFFIX);
				}
                
				if (openFile(path)) {
					loadSavedGame();
                    // Seth: Added
                    setBrogueGameEvent(BrogueGameEventOpenGame);
					mainInputLoop();
					freeEverything();
				} else {
					//dialogAlert("File not found.");
				}
				rogue.playbackMode = false;
				rogue.playbackOOS = false;
				// Seth: Added
                setBrogueGameEvent(BrogueGameEventOpenGameFinished);
				break;
			case NG_VIEW_RECORDING:
				rogue.nextGame = NG_NOTHING;
				// Seth: Added
                setBrogueGameEvent(BrogueGameEventBeginOpenGame);
				path[0] = '\0';
				if (rogue.nextGamePath[0]) {
					strcpy(path, rogue.nextGamePath);
					rogue.nextGamePath[0] = '\0';
				} else {
					dialogChooseFile(path, RECORDING_SUFFIX, "View recording:");
					//chooseFile(path, "View recording: ", "Recording", RECORDING_SUFFIX);
				}
				
				if (openFile(path)) {
                    // Seth: Added
                    setBrogueGameEvent(BrogueGameEventPlayRecording);
					randomNumbersGenerated = 0;
					rogue.playbackMode = true;
					initializeRogue(0); // Seed argument is ignored because we're in playback.
					if (!rogue.gameHasEnded) {
						startLevel(rogue.depthLevel, 1);
						pausePlayback();
						displayAnnotation(); // in case there's an annotation for turn 0
					}
					
					while(!rogue.gameHasEnded && rogue.playbackMode) {
						rogue.RNG = RNG_COSMETIC; // dancing terrain colors can't influence recordings
						rogue.playbackBetweenTurns = true;
						nextBrogueEvent(&theEvent, false, true, false);
						rogue.RNG = RNG_SUBSTANTIVE;
						
						executeEvent(&theEvent);
					}
					
					freeEverything();
				} else {
					// announce file not found
				}
				rogue.playbackMode = false;
				rogue.playbackOOS = false;
				
				break;
			case NG_HIGH_SCORES:
				rogue.nextGame = NG_NOTHING;
                // Seth: Added
                setBrogueGameEvent(BrogueGameEventShowHighScores);
				printHighScores(false);
				break;
            case NG_SCUM:
                rogue.nextGame = NG_NOTHING;
                scum(1, 1000, 5);
                break;
			case NG_QUIT:
				// No need to do anything.
				break;
			default:
				break;
		}
	} while (rogue.nextGame != NG_QUIT);
}
Exemplo n.º 22
0
// This is the basic program loop.
// When the program launches, or when a game ends, you end up here.
// If the player has already said what he wants to do next
// (by storing it in rogue.nextGame -- possibilities listed in enum NGCommands),
// we'll do it. The path (rogue.nextGamePath) is essentially a parameter for this command, and
// tells NG_VIEW_RECORDING and NG_OPEN_GAME which file to open. If there is a command but no
// accompanying path, and it's a command that should take a path, then pop up a dialog to have
// the player specify a path. If there is no command (i.e. if rogue.nextGame contains NG_NOTHING),
// then we'll display the title screen so the player can choose.
void mainBrogueJunction() {
	rogueEvent theEvent;
	char path[BROGUE_FILENAME_MAX], buf[100], seedDefault[100];
	char maxSeed[64];
	short i;
	boolean seedTooBig;

	if (ioInitialize() != 0) {
		printf("Failure to initialize display\n");
		exit(1);
	}
	
	initializeLaunchArguments(&rogue.nextGame, rogue.nextGamePath, &rogue.nextGameSeed);
	
	do {
        rogue.gameHasEnded = false;
        rogue.playbackFastForward = false;
        rogue.playbackMode = false;
		switch (rogue.nextGame) {
			case NG_NOTHING:
				// Run the main menu to get a decision out of the player.
				titleMenu();
				break;
			case NG_NEW_GAME:
			case NG_NEW_GAME_WITH_SEED:
				rogue.nextGamePath[0] = '\0';
				randomNumbersGenerated = 0;
				
				rogue.playbackMode = false;
				rogue.playbackFastForward = false;
				rogue.playbackBetweenTurns = false;
                
                getAvailableFilePath(path, LAST_GAME_NAME, GAME_SUFFIX);
                strcat(path, GAME_SUFFIX);
				strcpy(currentFilePath, path);
				
				if (rogue.nextGame == NG_NEW_GAME_WITH_SEED) {
					if (rogue.nextGameSeed == 0) { // Prompt for seed; default is the previous game's seed.
						sprintf(maxSeed, "%lu", ULONG_MAX);
						if (previousGameSeed == 0) {
							seedDefault[0] = '\0';
						} else {
							sprintf(seedDefault, "%lu", previousGameSeed);
						}
						if (getInputTextString(buf, "输入随机数种子生成地下城:",
											   log10(ULONG_MAX) + 1 + 6, // pad for header text
											   seedDefault,
											   "",
											   TEXT_INPUT_NUMBERS,
											   true)
							&& buf[0] != '\0') {
							seedTooBig = false;
							if (strlen(buf) > strlen(maxSeed)) {
								seedTooBig = true;
							} else if (strlen(buf) == strlen(maxSeed)) {
								for (i=0; maxSeed[i]; i++) {
									if (maxSeed[i] > buf[i]) {
										break; // we're good
									} else if (maxSeed[i] < buf[i]) {
										seedTooBig = true;
										break;
									}
								}
							}
							if (seedTooBig) {
								rogue.nextGameSeed = ULONG_MAX;
							} else {
								sscanf(buf, "%lu", &rogue.nextGameSeed);
							}
						} else {
							rogue.nextGame = NG_NOTHING;
							break; // Don't start a new game after all.
						}
					}
				} else {
					rogue.nextGameSeed = 0; // Seed based on clock.
				}
				
				rogue.nextGame = NG_NOTHING;
				initializeRogue(rogue.nextGameSeed);
				startLevel(rogue.depthLevel, 1); // descending into level 1
				
				mainInputLoop();
				freeEverything();
				break;
			case NG_OPEN_GAME:
				rogue.nextGame = NG_NOTHING;
				path[0] = '\0';
				if (rogue.nextGamePath[0]) {
					strcpy(path, rogue.nextGamePath);
					rogue.nextGamePath[0] = '\0';
				} else {
					dialogChooseFile(path, GAME_SUFFIX, "选择中断存档进行读取:");
					//chooseFile(path, "Open saved game: ", "Saved game", GAME_SUFFIX);
				}
					
				if (openFile(path)) {
					loadSavedGame();
					mainInputLoop();
					freeEverything();
				} else {
					//dialogAlert("File not found.");
				}
				rogue.playbackMode = false;
				rogue.playbackOOS = false;
				
				break;
			case NG_VIEW_RECORDING:
				rogue.nextGame = NG_NOTHING;
				
				path[0] = '\0';
				if (rogue.nextGamePath[0]) {
					strcpy(path, rogue.nextGamePath);
					rogue.nextGamePath[0] = '\0';
				} else {
					dialogChooseFile(path, RECORDING_SUFFIX, "选择录像文件进行回放:");
					//chooseFile(path, "View recording: ", "Recording", RECORDING_SUFFIX);
				}
				
				if (openFile(path)) {
					randomNumbersGenerated = 0;
					rogue.playbackMode = true;
					initializeRogue(0); // Seed argument is ignored because we're in playback.
					if (!rogue.gameHasEnded) {
						startLevel(rogue.depthLevel, 1);
						pausePlayback();
						displayAnnotation(); // in case there's an annotation for turn 0
					}
					
					while(!rogue.gameHasEnded && rogue.playbackMode) {
						rogue.RNG = RNG_COSMETIC; // dancing terrain colors can't influence recordings
						rogue.playbackBetweenTurns = true;
						nextBrogueEvent(&theEvent, false, true, false);
						rogue.RNG = RNG_SUBSTANTIVE;
						
						executeEvent(&theEvent);
					}
					
					freeEverything();
				} else {
					// announce file not found
				}
				rogue.playbackMode = false;
				rogue.playbackOOS = false;
				
				break;
			case NG_HIGH_SCORES:
				rogue.nextGame = NG_NOTHING;
				printHighScores(false);
				break;
            case NG_SCUM:
                rogue.nextGame = NG_NOTHING;
                scum(1, 1000, 5);
                break;
			case NG_QUIT:
				// No need to do anything.
				break;
			default:
				break;
		}
	} while (rogue.nextGame != NG_QUIT);
}
Exemplo n.º 23
0
GameEngine::GameEngine(SDL_Renderer * renderer)
{
    this->renderer = renderer;
    this->menu = new Menu(renderer);
    //this->logic = new Logic();
    this->mapEditor = new MapEditor(renderer);

    this->userInput = new UserInput();
    this->renderObject = new RenderObject(renderer);
    //this->logic = new Logic();
    this->critterFactory = new CritterFactory();



    renderObject->setRenderer();

    //Renders basic menu and default grid
    menu->renderMenu();
    mapEditor->drawGrid();
    //mapEditor->renderToTextureGrid();
    //mapEditor->renderGrid();
    SDL_RenderPresent(renderer);

    //Here input the userinput option, for the user to decide between picking one map or another map;

    //Phase 1, user decides between loading a premade map, or editting their own map

    menu->renderEditOrPremade();


    switch (UserInput::mapEditorSelect(0))
    {

    case 1:

        //menu loads a "finished" button

        //Edit their own map
        mapEditor->editGrid(0);

        //Turn map into file. Not used.
        mapEditor->makePremade();
        break;

    case 2:

        //menu loads options;
        menu->renderPremadeMapSelection();
        //Load premade map from map folder
        mapEditor->loadPremade();
        //draw premade map;
        mapEditor->drawGrid();
    }

    menu->renderStartEnd();

    //Set starting and ending points
    switch (UserInput::mapEditorSelect(0))
    {
    case 1:

        mapEditor->editGrid(1);
        break;

    case 2:
        mapEditor->editGrid(2);
        break;
    }
    switch (UserInput::mapEditorSelect(0))
    {
    case 1:

        mapEditor->editGrid(1);
        break;

    case 2:
        mapEditor->editGrid(2);
        break;
    }

    //TESTING THE PATH;
    mapEditor->pathTest();

    //CREATE THE FINAL GRID;
    mapEditor->renderToTextureGrid();

    menu->renderMenu();
    mapEditor->renderGrid();

    SDL_RenderPresent(renderer);
    //FINISHED PREPARATION

    //GAME STARTS HERE

    startLevel();

    //Render to texture
    //mapEditor->completeGridRender();

    ///START THE GAME!

}
Exemplo n.º 24
0
int main(int argc, char *argv[])
{
    int i;
    float r = 0;
    Space *space;
    Entity *cube1,*cube2;
    char bGameLoopRunning = 1;
    Vec3D cameraPosition = {-10,3,0};
    Vec3D cameraRotation = {180,0,180};
    SDL_Event e;
    Obj *bgobj;
    Sprite *bgtext;

	//my variables
	Ship *playerShip;
	int specMode;
    
    init_logger("gametest3d.log");
    if (graphics3d_init(1024,768,1,"gametest3d",33) != 0)
    {
        return -1;
    }
    model_init();
    obj_init();
    entity_init(255);
	initShips();
    
    bgobj = obj_load("models/mountainvillage.obj");
    bgtext = LoadSprite("models/mountain_text.png",1024,1024);
    
    //cube1 = newCube(vec3d(0,0,0),"Cubert");
    //cube2 = newCube(vec3d(10,0,0),"Hobbes");
    
    //cube1->body.velocity.x = 0.1;
    
    space = space_new();
    space_set_steps(space,100);
    
    space_add_body(space,&cube1->body);
    space_add_body(space,&cube2->body);

	//my variables
	specMode = 0;
	numShips = 0;
	shipVel = 0;
	shipRot = 0;
	turretRot = 0;
	gunElev = 0;
	realTurrRot = 0;

	playerShip = spawnShip(space, vec3d(-10,0,0), 1);

    while (bGameLoopRunning)
    {
		updateAllShipPos();
		for (i = 0; i < 100;i++)
        {
			space_do_step(space);
        }
		updateAllShipComp();
		applyGrav();
		if(specMode == 0)
		{
			cameraPosition.x = playerShip->hull->body.position.x;
			cameraPosition.y = (playerShip->hull->body.position.y + 5);
			cameraPosition.z = playerShip->hull->body.position.z;
		}

        while ( SDL_PollEvent(&e) ) 
        {
            if (e.type == SDL_QUIT)
            {
                bGameLoopRunning = 0;
            }
            else if (e.type == SDL_KEYDOWN)
            {
                if (e.key.keysym.sym == SDLK_ESCAPE)
                {
                    bGameLoopRunning = 0;
                }
                else if (e.key.keysym.sym == SDLK_SPACE)
                {
                    cameraPosition.z++;
                }
                else if (e.key.keysym.sym == SDLK_z)
                {
                    cameraPosition.z--;
                }
                else if (e.key.keysym.sym == SDLK_w)
                {
                    vec3d_add(
                        cameraPosition,
                        cameraPosition,
                        vec3d(
                            -sin(cameraRotation.z * DEGTORAD),
                            cos(cameraRotation.z * DEGTORAD),
                            0
                        ));
                }
                else if (e.key.keysym.sym == SDLK_s)
                {
                    vec3d_add(
                        cameraPosition,
                        cameraPosition,
                        vec3d(
                            sin(cameraRotation.z * DEGTORAD),
                            -cos(cameraRotation.z * DEGTORAD),
                            0
                        ));
                }
                else if (e.key.keysym.sym == SDLK_d)
                {
                    vec3d_add(
                        cameraPosition,
                        cameraPosition,
                        vec3d(
                            cos(cameraRotation.z * DEGTORAD),
                            sin(cameraRotation.z * DEGTORAD),
                            0
                        ));
                }
                else if (e.key.keysym.sym == SDLK_a)
                {
                    vec3d_add(
                        cameraPosition,
                        cameraPosition,
                        vec3d(
                            -cos(cameraRotation.z * DEGTORAD),
                            -sin(cameraRotation.z * DEGTORAD),
                            0
                        ));
                }
                else if (e.key.keysym.sym == SDLK_LEFT)
                {
                    cameraRotation.y -= 1;
                }
                else if (e.key.keysym.sym == SDLK_RIGHT)
                {
                    cameraRotation.y += 1;
                }
                else if (e.key.keysym.sym == SDLK_UP)
                {
                    cameraRotation.x += 1;
                }
                else if (e.key.keysym.sym == SDLK_DOWN)
                {
                    cameraRotation.x -= 1;
                }
				

				
				else if (e.key.keysym.sym == SDLK_y && shipVel < 0.4)
                {
                    shipVel += 0.1;
                }
				else if (e.key.keysym.sym == SDLK_h && shipVel > 0.05)
                {
                    shipVel -= 0.1;
                }
				else if (e.key.keysym.sym == SDLK_j)
                {
                    shipRot += 0.5;
					if(shipRot >= 360){shipRot -= 360;}
                }
				else if (e.key.keysym.sym == SDLK_g)
                {
                    shipRot -= 0.5;
					if(shipRot < 0){shipRot += 360;}
                }
				else if (e.key.keysym.sym == SDLK_m && turretRot < 135)
                {
                    turretRot += 1;
                }
				else if (e.key.keysym.sym == SDLK_b && turretRot > -135)
                {
                    turretRot -= 1;
                }
				else if (e.key.keysym.sym == SDLK_o && gunElev < 50)
                {
                    gunElev += 0.5;
                }
				else if (e.key.keysym.sym == SDLK_l && gunElev > -5)
                {
                    gunElev -= 0.5;
                }
				else if (e.key.keysym.sym == SDLK_q)
                {
					if(specMode == 0){specMode = 1;}
					else {specMode = 0;}
                }
				else if (e.key.keysym.sym == SDLK_p)
                {
					fireBullet(space, playerShip->gun->body.position, realTurrRot, gunElev, 0.5, -1);
				}
				else if (e.key.keysym.sym == SDLK_x)
                {
					fireBullet(space, playerShip->hull->body.position, shipRot, 0, 0, -2);
				}
				else if (e.key.keysym.sym == SDLK_1)
                {
					startLevel(space, 1);
				}
				else if (e.key.keysym.sym == SDLK_2)
                {
					startLevel(space, 2);
				}
				else if (e.key.keysym.sym == SDLK_3)
                {
					startLevel(space, 3);
				}
            }
        }
		 
        graphics3d_frame_begin();
        
        glPushMatrix();
        set_camera(
            cameraPosition,
            cameraRotation);
        
        entity_draw_all();
		//updateAllShipModels();
        obj_draw(
            bgobj,
            vec3d(0,0,2),
            vec3d(90,90,0),
            vec3d(5,5,5),
            vec4d(1,1,1,1),
            bgtext
        );
        
        if (r > 360)r -= 360;
        glPopMatrix();
        /* drawing code above here! */
        graphics3d_next_frame();
    } 
    return 0;
}
Exemplo n.º 25
0
//----------------------------------------------------------------------------------------------------------------------
GameWorld::GameWorld(int _level)
{
    L = luaL_newstate();
    registerLua(L);

    m_entityMgr = new EntityManager();

    m_win = 0;
    m_lose = 0;

    m_numberOfRiotersDead = 0;
    m_numberOfRiotersHome = 0;
    m_activePolice = 0;

    m_resetID = 1;

    // get a different lua level based in input level
    switch (_level)
    {
    case 1 :
    {
        luabridge::LuaRef startLevel = luabridge::getGlobal(L, "level1");
        startLevel();
        break;
    }
    case 2 :
    {
        luabridge::LuaRef startLevel = luabridge::getGlobal(L, "level2");
        startLevel();
        break;
    }
    case 3 :
    {
        luabridge::LuaRef startLevel = luabridge::getGlobal(L, "level3");
        startLevel();
        break;
    }
    case 4 :
    {
        luabridge::LuaRef startLevel = luabridge::getGlobal(L, "level4");
        startLevel();
        break;
    }
    case 5 :
    {
        luabridge::LuaRef startLevel = luabridge::getGlobal(L, "level5");
        startLevel();
        break;
    }
    default :
    {
        std::cout<<"Error: Invalid level"<<std::endl;
        break;
    }
    }

    // load in the meshes
    m_streetMesh = new ngl::Obj(m_streetMeshFile); //Obj for roads, should be tris
    m_buildingMesh = new ngl::Obj(m_buildingMeshFile); //Obj for buildings, should be tris
    m_streetMesh->createVAO();
    m_buildingMesh->createVAO();

    m_cellGraph = new CellGraph(m_cellGraphFile, 1); //Obj for cell graph, must be quads
    m_cellGraph->generateWalls();

    m_policeMesh = new ngl::Obj("models/policeMan.obj");
    m_rioterMesh = new ngl::Obj("models/rioterMan.obj");
    m_treeMesh = new ngl::Obj("models/tree.obj");
    m_streetLightMesh = new ngl::Obj("models/streetLight.obj");

    std::vector<ngl::Vec3> wallCentres = m_cellGraph->getWallCentres();
    std::vector<ngl::Vec3> wallNormals = m_cellGraph->getWallNormals();
    std::vector<int> wallRotations = m_cellGraph->getWallRotations();

    m_policeMesh->createVAO();
    m_rioterMesh->createVAO();
    m_treeMesh->createVAO();
    m_streetLightMesh->createVAO();

    //initialise rioters
    for (int i = 0; i < m_initialNumberOfRioters ; ++i)
    {
        Rioter* newRioter = new Rioter(this, m_rioterMesh);
        newRioter->setBoudingRadius(0.5f);
        newRioter->setDetectionRadius(3.5f);
        newRioter->setHeading(ngl::Vec3(-1+2*((float)rand())/RAND_MAX, 0.f, -1+2*((float)rand())/RAND_MAX));
        newRioter->setPos(ngl::Vec3(-25+50*((float)rand())/RAND_MAX, 0.f, -25+50*((float)rand())/RAND_MAX));
        m_cellGraph->initializeCells(m_entityMgr->getEntityFromID(newRioter->getID()));
        while (newRioter->getCurrentCellID() < 0)
        {
            newRioter->setPos(ngl::Vec3(-50+100*((float)rand())/RAND_MAX, 0.f, -50+100*((float)rand())/RAND_MAX));
            m_cellGraph->initializeCells(m_entityMgr->getEntityFromID(newRioter->getID()));
        }
        m_rioters.push_back(newRioter);
    }
    m_numberOfRioters = m_rioters.size();

    // initialise trees
    for (int i = 0; i < m_numberOfTrees ; ++i)
    {
        StaticEntity* newTree = new StaticEntity(this, ngl::Vec3(0,0,0),ngl::Vec3(0.0f,360*((float)rand()/RAND_MAX),0.0f),1.0,obstacleTree,m_treeMesh);
        newTree->setPos(ngl::Vec3(-25+50*((float)rand())/RAND_MAX, 0.f, -25+50*((float)rand())/RAND_MAX));
        m_cellGraph->initializeCells(m_entityMgr->getEntityFromID(newTree->getID()));
        while (newTree->getCurrentCellID() < 0)
        {
            newTree->setPos(ngl::Vec3(-50+100*((float)rand())/RAND_MAX, 0.f, -50+100*((float)rand())/RAND_MAX));
            m_cellGraph->initializeCells(m_entityMgr->getEntityFromID(newTree->getID()));
        }
        m_obstacles.push_back(newTree);
    }

    int numberOfWalls = wallCentres.size();

    //pick random streetlight positions
    int sample[m_numberOfStreetLights];
    std::vector<int> choices;
    int choice;

    for (int i=0; i<numberOfWalls; i++)
    {
        choices.push_back(i);
    }

    srand (time(NULL));

    assert (m_numberOfStreetLights<=numberOfWalls && "too many streetlights for the map size!");

    for(int i=0; i<m_numberOfStreetLights; i++)
    {
        do
        {
            choice = rand() % numberOfWalls;
        }
        while((choices[choice]==-1));

        choices[choice]=-1; // prevents duplicate choices
        sample[i] = choice;

    }

    for (int i = 0; i < m_numberOfStreetLights ; i++)
    {
        StaticEntity* newStreetLight = new StaticEntity(this, wallCentres[sample[i]]+(0.3*wallNormals[sample[i]]), ngl::Vec3(0.0f,wallRotations[sample[i]],0.0f), 0.2, obstacleStreetLight, m_streetLightMesh);
        m_cellGraph->initializeCells(m_entityMgr->getEntityFromID(newStreetLight->getID()));
        m_obstacles.push_back(newStreetLight);
    }

    m_numberOfObstacles = m_obstacles.size();
}
Exemplo n.º 26
0
/** Called whenever the timer goes off. Handles animation and triggers Things' functions for motion
*/
void GameSpace::handleTimer()
{
	// Update the player's position, independent of period_; also makes player movement very smooth
	player_->updatePrecisePos(WINDOW_MAX_X, WINDOW_MAX_Y);
	player_->move();
	
	// If player is invincible, update invincibility
	if(timerCount_ % 300 == 0 && player_->invincible()) { player_->invincible()--; }
		
	// Add a new strength potion every number of periods below
	if(timerCount_ % 20000 == 0 && level_ > 1)
	{
		Item* newItem = new PotionStrength(*potionStrengthPic_, this, player_);
		// Initialize the potion's position, add it to items list, add it to the scene
		newItem->randomPos(WINDOW_MAX_X, WINDOW_MAX_Y);
		items_.push_back(newItem);
		scene_->addItem(newItem);
	}
		
	// Check if new level is reached
	if( (timerCount_%(50000+30000*level_) == 0) && (level_ < 3)) { startLevel(true, level_+1); return; }
	
	if(timerCount_ % period_ == 0)
	{
		// ------------------- ADD NEW THINGS ----------------------
			// Add a new enemy every specified number of periods
			if(periodCount_ % 63 == 0)
			{
				Thing* newEnemy = NULL;
				switch(rand()%(level_+2))
				{
					case 0: newEnemy = new Zombie(*zombiePic_, this, player_);
						break;
					case 1: newEnemy = new Spider(*spiderPic_, this, player_);
						break;
					case 2: newEnemy = new Creeper(*creeperPic_, this, player_);
						break;
					case 3: newEnemy = new Skeleton(*skeletonPic_, this, player_);
						break;
					case 4: newEnemy = new Enderman(*endermanPic_, this, player_);
						break;
				}
				// Initialize the enemy's position
				newEnemy->randomPos(WINDOW_MAX_X, WINDOW_MAX_Y);
				// Add the enemy to the list of enemies and to the scene
				enemies_.push_back(newEnemy);
				scene_->addItem(newEnemy);
			}
			// Add a new heart every number of periods below
			if(periodCount_ % 376 == 0)
			{
				Item* newItem = new Heart(*heartPic_, this, player_);
				// Initialize the heart's position, add it to vector, add it to the scene
				newItem->randomPos(WINDOW_MAX_X, WINDOW_MAX_Y);
				items_.push_back(newItem);
				scene_->addItem(newItem);
			}
		
		// ------------------------ UPDATE THINGS ---------------------------------
			// Update each item & check for collisions between items and the player
			for(unsigned int i = 0; i < items_.size(); i++)
			{
				// Move the item (hearts don't move, potions do)
				items_[i]->updatePrecisePos(WINDOW_MAX_X, WINDOW_MAX_Y);
				items_[i]->move();
			
				if(items_[i]->collidesWithItem(player_))
				{
					items_[i]->playerEffect();
					score_+=100;
					delete items_[i]; // remove from scene & delete data
					items_.erase(items_.begin()+i); // remove pointer form vector
				}
			}
			// Update each enemy & check for collisions
			for(unsigned int i = 0; i < enemies_.size(); i++)
			{
				enemies_[i]->updatePrecisePos(WINDOW_MAX_X, WINDOW_MAX_Y);
				enemies_[i]->move();
			
				if(enemies_[i]->collidesWithItem(player_))
				{
					delete enemies_[i]; // remove from scene & delete data
					enemies_.erase(enemies_.begin()+i); // remove pointer form vector
					if(player_->invincible()==0) player_->changeHealth(-1); // if player is not invincible, give him damage
					if(gameOverFlag_) return; // in case a game ends when the player's health changes, stop trying to detect collisions
				}
			}
		
		// Update score
		if(periodCount_ % 4 == 0 && !gameOverFlag_) score_++;
		
		// Update MainWindow's labels
		parent_->updateLabels();
		
		// Increase period count
		periodCount_++;
	}
		
	// Every certain number of timer pulses, speed up the game by decreasing the period (does not affect player's speed)
	if(timerCount_ % 18000 == 0 && period_ > 8) period_--;
	
	timerCount_++;
}
Exemplo n.º 27
0
void menuNewGame(void) {
   if (pgMessageDialog("Give Up","Start over at level 1?",
		       PG_MSGBTN_YES | PG_MSGBTN_NO) == PG_MSGBTN_YES)
     startLevel(1);
}
Exemplo n.º 28
0
void menuRestartLevel(void) {
   if (pgMessageDialogFmt("Scratching Head",
			  PG_MSGBTN_YES | PG_MSGBTN_NO,
			  "Try level %d again?",level) == PG_MSGBTN_YES)
     startLevel(level);
}
Exemplo n.º 29
0
void NormalGameModeManager::changeLevel(int lvl) {
    startLevel(lvl);
    generateLeaves(0, theHeriswapGridSystem.Types);
    uiHelper.game->setupGameProp();
}
Exemplo n.º 30
0
void World::nextLevel() {
	startLevel(currentLevel+1);
}