#include "pong.h"
#include <raylib.h>
void leaderboard_record(int Score) {
bool LeaderBoardGoing = true;
struct {
char Name[256];
int Score;
} LeaderboardEntry;
LeaderboardEntry.Score = Score;
strcpy(LeaderboardEntry.Name, "\0");
uint16_t CharacterNumber = 0;
int Key = 0;
while(LeaderBoardGoing == true) {
BeginDrawing();
Key = GetKeyPressed();
switch(Key) {
case KEY_BACKSPACE:
if(CharacterNumber != 0) {
LeaderboardEntry.Name[CharacterNumber] = '\0';
CharacterNumber -= 1;
}
break;
case KEY_ENTER:
if(CharacterNumber != 0) {
LeaderBoardGoing = false;
}
break;
default:
if (Key >= 33 && Key <= 126) {
LeaderboardEntry.Name[CharacterNumber] = '\0'+Key;
CharacterNumber += 1;
}
break;
}
printf("%d,%s\n", CharacterNumber, LeaderboardEntry.Name);
EndDrawing();
}
char *LeaderboardDirectory = SDL_GetPrefPath("iotib", "Pong");
char LeaderboardFilePath[8192];
snprintf(LeaderboardFilePath, sizeof(LeaderboardFilePath), "%s/leaderboard.txt", LeaderboardDirectory);
FILE *LeaderboardFile;
// Put save to file here.
if ((LeaderboardFile = fopen(LeaderboardFilePath, "a")) == NULL) {
fprintf(stderr, "Unable to create leaderboard file.\n");
return;
}
fprintf(LeaderboardFile, "%s %d\n", LeaderboardEntry.Name, Score);
fclose(LeaderboardFile);
return;
}
void marathon_main() {
// Init Music
Mix_Music *Background = Mix_LoadMUS("resources/marathon.wav");
Mix_PlayMusic(Background, -1);
Mix_VolumeMusic(GlobalSettings.MusicVolume);
// Init balls lmao
struct Balls Ball;
Ball.X = 1280/2.0f;
Ball.Y = 720/2.0f;
Ball.Direction = LEFT;
Ball.Speed = 3.0f;
Ball.Angle = 0.0f;
// Init Player
struct Players Player;
Player.Y = 0;
Player.Direction = 0;
Player.Score = 0;
// Init sprites
Texture2D PaddleSprite = LoadTexture("resources/paddle.png");
Texture2D BallSprite = LoadTexture("resources/ball.png");
char PlayerScore[50]; // Used later to display score on screen.
// Set Collision Boxes
Player.HitBox = (Rectangle){80, Player.Y, 5, PaddleSprite.height};
Ball.HitBox = (Rectangle){Ball.X, Ball.Y, BallSprite.width, BallSprite.height};
// Init Camera
Camera2D MainCamera;
MainCamera.target = (Vector2){0, 0};
MainCamera.offset = (Vector2){0, 0};
MainCamera.rotation = 0;
bool MarathonGoing = true;
while(MarathonGoing == true && GameGoing == true) {
if (WindowShouldClose()) { //Quit Game if the window is closed.
GameGoing = false;
}
snprintf(PlayerScore, 50, "Player: %d", Player.Score);
MainCamera.zoom = GetScreenHeight()/720.0f;
MainCamera.offset = (Vector2){GetScreenWidth()/2.0f, GetScreenHeight()/2.0f};
MainCamera.target = (Vector2){1280/2.0f, 720/2.0f};
//Controls
if(IsKeyDown(KEY_UP)) {
Player.Y -= 10;
} else if (IsKeyDown(KEY_DOWN)) {
Player.Y += 10;
} else if(IsKeyPressed(KEY_ESCAPE)) {
EnableCursor();
} else if(IsMouseButtonPressed(MOUSE_BUTTON_LEFT) || IsCursorHidden() == true) {
Player.Y = GetMouseY()-PaddleSprite.height/2.0f;
DisableCursor();
}
// Leave game
if(IsKeyPressed(KEY_Q)) {
MarathonGoing = false;
}
if(GetMouseY() < 0) {
SetMousePosition(0, 0);
} else if(GetMouseY() > 720) {
SetMousePosition(0, 720);
}
//Check if players are off-screen
if (Player.Y < 0) {
Player.Y = 0;
} else if (Player.Y > 480) {
Player.Y = 480;
}
// Collision
ball(&Player.HitBox, NULL, &Ball, &Player.Score, NULL);
//Updates hitbox with player's position.
Player.HitBox.y = Player.Y;
// End Game
if(Ball.X < 0) {
leaderboard_record(Player.Score);
MarathonGoing = false;
}
BeginDrawing();
ClearBackground(BLACK);
BeginMode2D(MainCamera);
DrawRectangle(0, 0, 1280, 720, (Color){20, 20, 20, 255});
DrawTexture(PaddleSprite, 0, Player.Y, WHITE);
DrawTexture(BallSprite, Ball.X, Ball.Y, WHITE);
DrawText(PlayerScore, 0, 0, 32, BLUE);
EndMode2D();
EndDrawing();
}
Mix_HaltMusic();
Mix_FreeMusic(Background);
EnableCursor();
return;
}