/******************************************************************************* * Description: the setup function that doesn't actually setup the game, but * does the ncurses window setup, other system-related calls * * Inputs: * * Returns: ******************************************************************************/ void presetup( void ) { getHighscores(); /* prepare the screen */ initscr(); cbreak(); noecho(); // turns off echoing characters read by getch() curs_set(0); // hide the cursor MAX_ROW = LINES; MAX_COL = COLS; srand(time(NULL)); // seed for random number generator /* check for size of terminal window bigger than 30 by 30 */ if( MAX_ROW <= 30 || MAX_COL <= 30 ) { teardown(); printf( "your terminal window is too small! try again.\n" ); exit(-1); } /* clear screen */ clear(); /* draw border */ drawBorder( '#', '#', '#', '#' ); /* write a message that says press something to start */ char welcomeMesg1[] = "Welcome to Snake!"; char welcomeMesg2[] = "Press any key to begin playing"; mvprintw( MAX_ROW/2 - 5, (MAX_COL-strlen(welcomeMesg1))/2, "%s", welcomeMesg1 ); mvprintw( MAX_ROW/2 - 2, (MAX_COL-strlen(welcomeMesg2))/2, "%s", welcomeMesg2 ); showHighScores(); /* wait for something to be pressed, then return */ getch(); }
/** Called at the end of a race. Checks if the current times are worth a new * score, if so it notifies the HighscoreManager so the new score is added * and saved. */ void World::updateHighscores(int* best_highscore_rank, int* best_finish_time, std::string* highscore_who, StateManager::ActivePlayer** best_player) { *best_highscore_rank = -1; *best_player = NULL; if(!m_use_highscores) return; // Add times to highscore list. First compute the order of karts, // so that the timing of the fastest kart is added first (otherwise // someone might get into the highscore list, only to be kicked out // again by a faster kart in the same race), which might be confusing // if we ever decide to display a message (e.g. during a race) unsigned int *index = new unsigned int[m_karts.size()]; const unsigned int kart_amount = (unsigned int) m_karts.size(); for (unsigned int i=0; i<kart_amount; i++ ) { index[i] = 999; // first reset the contents of the array } for (unsigned int i=0; i<kart_amount; i++ ) { const int pos = m_karts[i]->getPosition()-1; if(pos < 0 || pos >= (int)kart_amount) continue; // wrong position index[pos] = i; } for (unsigned int pos=0; pos<kart_amount; pos++) { if(index[pos] == 999) { // no kart claimed to be in this position, most likely means // the kart location data is wrong #ifdef DEBUG Log::error("[World]", "Incorrect kart positions:"); for (unsigned int i=0; i<m_karts.size(); i++ ) { Log::error("[World]", "i=%d position %d.",i, m_karts[i]->getPosition()); } #endif continue; } // Only record times for player karts and only if // they finished the race if(!m_karts[index[pos]]->getController()->isPlayerController()) continue; if (!m_karts[index[pos]]->hasFinishedRace()) continue; assert(index[pos] < m_karts.size()); Kart *k = (Kart*)m_karts[index[pos]]; Highscores* highscores = getHighscores(); PlayerController *controller = (PlayerController*)(k->getController()); int highscore_rank = 0; if (controller->getPlayer()->getProfile() != NULL) // if we have the player profile here highscore_rank = highscores->addData(k->getIdent(), controller->getPlayer()->getProfile()->getName(), k->getFinishTime()); if (highscore_rank > 0) { if (*best_highscore_rank == -1 || highscore_rank < *best_highscore_rank) { *best_highscore_rank = highscore_rank; *best_finish_time = (int)(k->getFinishTime()); *best_player = controller->getPlayer(); *highscore_who = k->getIdent(); } highscore_manager->saveHighscores(); } } // next position delete []index; } // updateHighscores