void ToTitleScreen(void) { if (WelcomeMessage == NULL) { int Length = 2, NewLength; WelcomeMessage = malloc(Length); while ((NewLength = snprintf(WelcomeMessage, Length, "Welcome to HOCOSLAMFY\n\nPress %s to play\nor %s to exit\n\nIn-game:\n%s to rise\n%s to pause\n%s to exit", GetEnterGamePrompt(), GetExitGamePrompt(), GetBoostPrompt(), GetPausePrompt(), GetExitGamePrompt())) >= Length) { Length = NewLength + 1; WelcomeMessage = realloc(WelcomeMessage, Length); } } GatherInput = TitleScreenGatherInput; DoLogic = TitleScreenDoLogic; OutputFrame = TitleScreenOutputFrame; }
void ToTitleScreen(const bool start) { countdownMs = -1; ResetMovement(); MusicSetLoud(false); BackgroundsInit(&BG); Start = start; if (Start) { sprintf( WelcomeMessage, "%s to pause\n%s to exit", GetPausePrompt(), GetExitGamePrompt()); } else { // Find out the result of the game int maxScore = 0; for (int i = 0; i < MAX_PLAYERS; i++) { if (players[i].Score > maxScore) maxScore = players[i].Score; } winners = 0; for (int i = 0; i < MAX_PLAYERS; i++) { if (!players[i].Enabled) continue; if (players[i].Score == maxScore) { winnerIndices[winners] = i; winners++; } } if (PlayerEnabledCount() == 1) { sprintf( WelcomeMessage, "Your score was %d!\n%s to exit", maxScore, GetExitGamePrompt()); } else if (winners == 1) { sprintf( WelcomeMessage, "Wins with score %d!\n%s to exit", maxScore, GetExitGamePrompt()); } else { sprintf( WelcomeMessage, "Tied with score %d!\n%s to exit", maxScore, GetExitGamePrompt()); } HighScoresAdd(maxScore); } HighScoreDisplayInit(&HSD); CArrayClear(&Particles); SpaceReset(&space); // Add bottom edge so we don't fall through SpaceAddBottomEdge(&space); // Initialise players here for (int i = 0; i < MAX_PLAYERS; i++) { PlayerInit(&players[i], i, cpv( (i + 1) * FIELD_WIDTH / (MAX_PLAYERS + 1), FIELD_HEIGHT * 0.75f)); playersEnabled[i] = false; } // Add platforms for players to jump off for (int i = 0; i < MAX_PLAYERS; i++) { BlockInit( &blocks[i], (i + 1) * FIELD_WIDTH / (MAX_PLAYERS + 1) - BLOCK_WIDTH / 2, BLOCK_Y, BLOCK_WIDTH); } GatherInput = TitleScreenGatherInput; DoLogic = TitleScreenDoLogic; OutputFrame = TitleScreenOutputFrame; }
void ToScore(uint32_t Score, enum GameOverReason GameOverReason) { if (ScoreMessage != NULL) { free(ScoreMessage); ScoreMessage = NULL; } int Length = 2, NewLength; ScoreMessage = malloc(Length); const char* GameOverReasonString = ""; switch (GameOverReason) { case FIELD_BORDER_COLLISION: GameOverReasonString = "You crashed into the wall"; break; case RECTANGLE_COLLISION: GameOverReasonString = "You crashed into an object"; break; } while ((NewLength = snprintf(ScoreMessage, Length, "GAME OVER\n%s\n\nYour score was %" PRIu32 "\n\nPress %s to play again\nor %s to exit", GameOverReasonString, Score, GetEnterGamePrompt(), GetExitGamePrompt())) >= Length) { Length = NewLength + 1; ScoreMessage = realloc(ScoreMessage, Length); } GatherInput = ScoreGatherInput; DoLogic = ScoreDoLogic; OutputFrame = ScoreOutputFrame; }