summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/game.c130
1 files 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);