From 1798a1ac7ced167abae55a8d4e64e59bb524a05e Mon Sep 17 00:00:00 2001 From: BoredGuy Date: Sat, 5 Jul 2025 18:26:59 +0300 Subject: Almost Done --- src/game.c | 130 ++++++++++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 99 insertions(+), 31 deletions(-) diff --git a/src/game.c b/src/game.c index 72afef6..0781d67 100644 --- a/src/game.c +++ b/src/game.c @@ -20,15 +20,11 @@ typedef enum Suite { SPADE = 3 } Suite; -typedef enum GameState { - POLLING, - MOVING -} GameState; - typedef struct Card { //Info for game logic Suite suite; int face; + void (*afterMove)(); //Info for drawing and animations Rectangle bounds; @@ -40,7 +36,6 @@ typedef struct Card { typedef struct Game { int turn; - GameState state; Card deck[DECK_SIZE]; Card hands[MAX_NUM_PLAYERS][DECK_SIZE]; @@ -65,11 +60,10 @@ int main(void) { srand((unsigned int)time(NULL)); LoadAssets(); - InitGame(4); + InitGame(3); while(!WindowShouldClose()) { UpdateGame(GetFrameTime()); - BeginDrawing(); ClearBackground(RAYWHITE); @@ -149,6 +143,20 @@ bool IsTravelling(const Card* c) { return c->travelTime > 0; } +bool IsAnyTravelling() { + for(int i = 0; i < game.cardsInDeck; i++) + if (IsTravelling(&game.deck[i])) return true; + + for(int i = 0; i < game.cardsInStack; i++) + if (IsTravelling(&game.stack[i])) return true; + + for(int i = 0; i < game.playerCount; i++) + for(int j = 0; j < game.cardsInHand[i]; j++) + if (IsTravelling(&game.hands[i][j])) return true; + + return false; +} + void UpdateCard(Card* c, float dt) { if (IsTravelling(c)) { float travelDistance = c->travelTimer / c->travelTime; @@ -163,6 +171,11 @@ void UpdateCard(Card* c, float dt) { c->bounds.y = c->targetPosition.y; c->travelTimer = c->travelTime = 0.0; + + if (c->afterMove) { + c->afterMove(); + c->afterMove = NULL; + } } } } @@ -235,9 +248,22 @@ void Deal(int toPlayer) { } } +static inline Card* TopCardInHand(int hand) { + return &game.hands[hand][game.cardsInHand[hand] - 1]; +} + void NextTurn() { game.turn = (game.turn + 1) % game.playerCount; FlipCards(); + + for(int i = 0; i < game.cardsInHand[game.turn]; i++) + if(CanPlayCard(&game.hands[game.turn][i])) return; + + Deal(game.turn); + Card* c = TopCardInHand(game.turn); + + if(!CanPlayCard(c)) + c->afterMove = NextTurn; } bool IsSpecialCard(const Card* c) { @@ -253,42 +279,84 @@ bool IsSpecialCard(const Card* c) { return false; } -void UpdateGame(float dt) { - for(int i = 0; i < game.cardsInDeck; i++) - UpdateCard(&game.deck[i], dt); - - for(int i = 0; i < game.cardsInStack; i++) - UpdateCard(&game.stack[i], dt); - - for(int i = 0; i < game.playerCount; i++) - for(int j = 0; j < game.cardsInHand[i]; j++) UpdateCard(&game.hands[i][j], dt); +static inline int NextPlayer() { + return (game.turn + 1) % game.playerCount; +} - if (IsMouseButtonPressed(MOUSE_BUTTON_LEFT)) { +//Make next player draw 5 +void AceOfSpadesEffect() { + for (int i = 0; i < 5; i++) Deal(NextPlayer()); + NextTurn(); +} + +//Make next player draw 2 +void TwoEffect() { + for(int i = 0; i < 2; i++) Deal(NextPlayer()); + NextTurn(); +} + +//Skip next turn; +void FiveEffect() { + game.turn = NextPlayer(); + NextTurn(); +} + +void CardEffect(Card* c) { + if (c->suite == SPADE && c->face == 0) { + c->afterMove = AceOfSpadesEffect; + } + + switch (c->face) { + case 1: + c->afterMove = TwoEffect; + break; + case 4: + c->afterMove = FiveEffect; + break; + default: + c->afterMove = NextTurn; + } +} + +void HandleMousePress() { + if (IsMouseButtonPressed(MOUSE_BUTTON_LEFT) && !IsAnyTravelling()) { for(int i = 0; i < game.cardsInHand[game.turn]; i++) { - const Card* c = &game.hands[game.turn][i]; + Card* c = &game.hands[game.turn][i]; if (MouseOn(c) && CanPlayCard(c)) { + if(IsSpecialCard(c)) { + CardEffect(c); + } + else { + c->afterMove = NextTurn; + } + MoveToStack(game.hands[game.turn], - i, - &game.cardsInHand[game.turn], - 0.5 - ); + i, + &game.cardsInHand[game.turn], + 0.5 + ); PositionCardsInHand(game.turn); - - NextTurn(); - //If the player has no playable cards deal them one and if that is also - //not playable just skip their turn - for(int i = 0; i < game.cardsInHand[game.turn]; i++) - if (CanPlayCard(&game.hands[game.turn][i])) return; - - Deal(game.turn); } } } } +void UpdateGame(float dt) { + for(int i = 0; i < game.cardsInDeck; i++) + UpdateCard(&game.deck[i], dt); + + for(int i = 0; i < game.cardsInStack; i++) + UpdateCard(&game.stack[i], dt); + + for(int i = 0; i < game.playerCount; i++) + for(int j = 0; j < game.cardsInHand[i]; j++) UpdateCard(&game.hands[i][j], dt); + + HandleMousePress(); +} + void ShuffleDeck() { for(int i = game.cardsInDeck - 1; i > 0; i--) { int selection = rand() % (i + 1); -- cgit v1.2.3