From 8546a2bcf84240c9c837cab640e02c5de5e386b3 Mon Sep 17 00:00:00 2001 From: Dominic Masters Date: Mon, 3 May 2021 21:32:40 -0700 Subject: [PATCH] Added some basic font rendering and texas holdem --- assets/cards_normal.png | Bin 0 -> 91025 bytes assets/font.png | Bin 0 -> 8189 bytes assets/shaders/test.frag | 6 +- assets/world/entity.png | Bin 0 -> 2165 bytes include/dawn/cards/card.h | 99 +++++++++++++ include/dawn/cards/poker/holdem.h | 69 +++++++++ include/dawn/dawn.h | 10 ++ include/dawn/display/tileset.h | 3 + include/dawn/game/gametime.h | 8 +- include/dawn/world/entity/entity.h | 23 +++ src/card/card.c | 34 +++++ src/card/card.h | 35 +++++ src/card/poker/holdem.c | 169 +++++++++++++++++++++++ src/card/poker/holdem.h | 85 ++++++++++++ src/display/gui/font.c | 47 +++++++ src/display/gui/font.h | 17 +++ src/display/tileset.c | 29 ++-- src/game/game.c | 41 +++++- src/game/game.h | 5 + src/game/gametime.c | 1 + src/platform/glfw/glwfwplatform.c | 2 +- src/util/math.h | 7 +- src/util/rand.h | 28 ++++ src/world/entity/common.c | 39 +++++- src/world/entity/common.h | 7 +- src/world/entity/entities/player.c | 48 +++++++ src/world/entity/{ => entities}/player.h | 5 +- src/world/entity/entity.c | 18 ++- src/world/entity/entity.h | 3 + src/world/entity/entitytypes.c | 8 +- src/world/entity/entitytypes.h | 2 +- src/world/entity/player.c | 29 ---- src/world/map/chunk.c | 10 +- src/world/world.c | 11 ++ src/world/world.h | 1 + 35 files changed, 827 insertions(+), 72 deletions(-) create mode 100644 assets/cards_normal.png create mode 100644 assets/font.png create mode 100644 assets/world/entity.png create mode 100644 include/dawn/cards/card.h create mode 100644 include/dawn/cards/poker/holdem.h create mode 100644 src/card/card.c create mode 100644 src/card/card.h create mode 100644 src/card/poker/holdem.c create mode 100644 src/card/poker/holdem.h create mode 100644 src/display/gui/font.c create mode 100644 src/display/gui/font.h create mode 100644 src/util/rand.h create mode 100644 src/world/entity/entities/player.c rename src/world/entity/{ => entities}/player.h (75%) delete mode 100644 src/world/entity/player.c diff --git a/assets/cards_normal.png b/assets/cards_normal.png new file mode 100644 index 0000000000000000000000000000000000000000..d8e03d3adbae09e19cc4dc7f272403d4ecb44731 GIT binary patch literal 91025 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�>D0-$21((Q7EVWsm9*PtmZEeMVn6K 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 z%0A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 literal 0 HcmV?d00001 diff --git a/assets/font.png b/assets/font.png new file mode 100644 index 0000000000000000000000000000000000000000..49bec0dea59a606b36b877ce1f40b28c55a81d2e GIT binary patch literal 8189 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 O4uhMC00001b5ch_0Itp) z=>Px#1ZP1_K>z@;j|==^1poj5Do{*RMW~?2IADnA==cBt0LaMLI6zR?pm=ydK={zO zz&JSYXh^_lnCOte00013nN*4Z000hjQchF<|NsC0|NsC0|NsC007byu$N&HU32;bR za{vGi!T1FxJ;7p$N)=S0G7{NHV7JnO+%i3ZzM5#AFd9M!c?X2D}3EE!-x82 zz$uXCsS&1WK2`WozZvifq&cW~Fyf!-l>x6nnAQ@Z6R%OA6PK3(@^lPHfgNE*nv*gx zj|_J7voe5eGOi441@PA>5a)oI6+#GeJQ5szf+C1|xgg zi3}{5jBfxT-@#ax``x(ja`jjv(T89eKs+r{fUi~=RRAH~32X)#(s1>~0l`Evqz#l5 zD?vt%$Ymp5jp-4dK3%bO;UdfPf}MfKg9QGO5eo?KGBmjQY(#b!Q=E4fpkUz7(_7N> zZgMg9H-sVmz`*at*TC1nf6M@GseaY*F~u?8xB}bHu?5FrxoO;Wt_M0Rn7uWDn+=4^ zO|gue;OJSN&AFmz1Ac!mjfvfUzo4(cZF?gq0~?`Jz&#)MNUsch&j-c@{uSo~U_75s zHlJ4a`gkpFw}_w@$@g92Av^?)p?Z7l;lsX$2>v=v91NP@7*an!NAGp}aWri}`fX*(&e3{Vvh6|QMhF5s{bcOj# zSf)#!^VH(a0JiT04)bF!w^RRznwPlb%fi!v^T(a9rvZpF+`+7j>P?7`(-_cQbBPpV z1rO-rGl%6Fa0z6v!PWm1{Sxx?ZW@pRNbuwVz*)}{(*-Jesy(YL5JpbJ=f2~{`-9epdS z4A_JQ6`x)&(4h5g7up6CVS}FEWbJ`>^pjzrL)Z{;yD32P^>Tp?9lbW-6nOHEw?sPz zKGG`#UV*^AyCPUK{7kP5I0aJey$h@(nm6?_stkAqQbuO%|1v{<11aMx-qf#gWxysh zWb`(VXXH1-Y@kDE$fdLA_s{5kK{_&C(a-T(^i8b|D1tG=AN0MqD+svp zM$|Ci>*2nBcW4@50VF5|tOTfV#R_D^5LIUkf*14*7kyJJ11tbWAsG3ATstFvL2cb( zzoXxx+Q5!r=t1EALTxknf_^^hcLpqi#*~*Ftlt)_80&GXfd2k)cCa%L(7dBUw?Mv4 z8K1OW2V*_%RC1nf$e;;(1GPf0K*~4D;QtAeMO!=VDpK##B@ z?#~Bgw87Qa&b316n}H5t1qy5gr~Q9RuUBAP0P)JepXUb#JNli0VFC2qD;{S1&&d0F zbqR(A_yY;P$SaJWh#}s85k5O{U*PG2Z!I$n+6<%Y*^8q$9b<81B}~*0*1**2$y358QI%dZfW zUKuC_kiaOwZkzK<87pw@B&aHj!u;HOu4g{!aX`;M?PaIcKs4EZAvH1}xoZ3m7%m7{^9 zdgqq^hzX3|1Rpp4Llthb9%HPR!-4ssE$){q&FJBCXBTbf0@!RF4E3VhjtMG`*9#Wq r(HVo#hLK*dryLFZar|WiKR^Efb%uif7&$nI00000NkvXXu0mjfA-3>V literal 0 HcmV?d00001 diff --git a/include/dawn/cards/card.h b/include/dawn/cards/card.h new file mode 100644 index 00000000..33c05257 --- /dev/null +++ b/include/dawn/cards/card.h @@ -0,0 +1,99 @@ +/** + * Copyright (c) 2021 Dominic Masters + * + * This software is released under the MIT License. + * https://opensource.org/licenses/MIT + */ + +#pragma once +#include "../libs.h" + + +//////////////////////////////////////////////////////////////////////////////// +// Cards +//////////////////////////////////////////////////////////////////////////////// + +// Aces +#define CARD_CLUBS_ACE 0x00 +#define CARD_CLUBS_TWO 0x01 +#define CARD_CLUBS_THREE 0x02 +#define CARD_CLUBS_FOUR 0x03 +#define CARD_CLUBS_FIVE 0x04 +#define CARD_CLUBS_SIX 0x05 +#define CARD_CLUBS_SEVEN 0x06 +#define CARD_CLUBS_EIGHT 0x07 +#define CARD_CLUBS_NINE 0x08 +#define CARD_CLUBS_TEN 0x09 +#define CARD_CLUBS_JACK 0x0A +#define CARD_CLUBS_QUEEN 0x0B +#define CARD_CLUBS_KING 0x0C + +// Diamonds +#define CARD_DIAMONDS_ACE 0x0D +#define CARD_DIAMONDS_TWO 0x0E +#define CARD_DIAMONDS_THREE 0x0F +#define CARD_DIAMONDS_FOUR 0x10 +#define CARD_DIAMONDS_FIVE 0x11 +#define CARD_DIAMONDS_SIX 0x12 +#define CARD_DIAMONDS_SEVEN 0x13 +#define CARD_DIAMONDS_EIGHT 0x14 +#define CARD_DIAMONDS_NINE 0x15 +#define CARD_DIAMONDS_TEN 0x16 +#define CARD_DIAMONDS_JACK 0x17 +#define CARD_DIAMONDS_QUEEN 0x18 +#define CARD_DIAMONDS_KING 0x19 + +// Hearts +#define CARD_HEARTS_ACE 0x1A +#define CARD_HEARTS_TWO 0x1B +#define CARD_HEARTS_THREE 0x1C +#define CARD_HEARTS_FOUR 0x1D +#define CARD_HEARTS_FIVE 0x1E +#define CARD_HEARTS_SIX 0x1F +#define CARD_HEARTS_SEVEN 0x20 +#define CARD_HEARTS_EIGHT 0x21 +#define CARD_HEARTS_NINE 0x22 +#define CARD_HEARTS_TEN 0x23 +#define CARD_HEARTS_JACK 0x24 +#define CARD_HEARTS_QUEEN 0x25 +#define CARD_HEARTS_KING 0x26 + +// Spades +#define CARD_SPADES_ACE 0x27 +#define CARD_SPADES_TWO 0x28 +#define CARD_SPADES_THREE 0x29 +#define CARD_SPADES_FOUR 0x2A +#define CARD_SPADES_FIVE 0x2B +#define CARD_SPADES_SIX 0x2C +#define CARD_SPADES_SEVEN 0x2D +#define CARD_SPADES_EIGHT 0x2E +#define CARD_SPADES_NINE 0x2F +#define CARD_SPADES_TEN 0x30 +#define CARD_SPADES_JACK 0x31 +#define CARD_SPADES_QUEEN 0x32 +#define CARD_SPADES_KING 0x33 + +// Special Cards +#define CARD_RED_JOKER 0x34 +#define CARD_BLACK_JOKER 0x35 + +//////////////////////////////////////////////////////////////////////////////// +// Suits +//////////////////////////////////////////////////////////////////////////////// +#define CARD_SUIT_CLUBS 0x01 +#define CARD_SUIT_DIAMONDS 0x02 +#define CARD_SUIT_HEARTS 0x03 +#define CARD_SUIT_SPADES 0x04 + + +/** Count of cards in each suit */ +#define CARD_COUNT_PER_SUIT 13 + +/** Standard Card Deck Size */ +#define CARD_DECK_SIZE 52 + +/** Full Card Deck Size */ +#define CARD_DECK_SIZE_FULL 54 + +/** Type Representing a card's id */ +typedef uint8_t card_t; \ No newline at end of file diff --git a/include/dawn/cards/poker/holdem.h b/include/dawn/cards/poker/holdem.h new file mode 100644 index 00000000..7ef759ac --- /dev/null +++ b/include/dawn/cards/poker/holdem.h @@ -0,0 +1,69 @@ +/** + * Copyright (c) 2021 Dominic Masters + * + * This software is released under the MIT License. + * https://opensource.org/licenses/MIT + */ + +#pragma once +#include "../card.h" +#include "../../display/spritebatch.h" +#include "../../display/texture.h" +#include "../../display/tileset.h" + +/** How many cards a player can hold in their hand */ +#define HOLDEM_PLAYER_HAND 2 +/** How many cards the dealer can hold in their hand */ +#define HOLDEM_DEALER_HAND 5 +/** How many players in a holdem game (excludes dealer) */ +#define HOLDEM_PLAYER_COUNT 5 + +/** State for whether or not a player has folded */ +#define HOLDEM_STATE_FOLDED 0x01 +/** State for whether or not a player is showing their hand */ +#define HOLDEM_STATE_SHOWING 0x02 + +/** Texas Hold'em Player State */ +typedef struct { + /** Cards in the players' hand */ + card_t cards[HOLDEM_PLAYER_HAND]; + uint8_t cardCount; + + /** Current State of player */ + uint8_t state; + + /** Chips in players' posession */ + uint32_t chips; + + /** Current bet in current round player has placed */ + uint32_t currentBet; +} holdemplayer_t; + +/** Representation of a Texas Hold'em Game State */ +typedef struct { + /** Current Card Deck */ + card_t deck[CARD_DECK_SIZE]; + /** Count of cards in the deck */ + uint8_t deckSize; + + /** How big is the current small blind */ + uint32_t blindSmall; + /** How big is the current big blind */ + uint32_t blindBig; + /** Current round pot */ + uint32_t pot; + + /** Cards that have been dealt */ + card_t cards[HOLDEM_DEALER_HAND]; + /** How many dealt cards are face up */ + uint8_t cardsFacing; + + /** Player States */ + holdemplayer_t players[HOLDEM_PLAYER_COUNT]; +} holdemgame_t; + +typedef struct { + spritebatch_t *batch; + texture_t *texture; + tileset_t *tileset; +} holdemrender_t; \ No newline at end of file diff --git a/include/dawn/dawn.h b/include/dawn/dawn.h index c9c3a000..66e70503 100644 --- a/include/dawn/dawn.h +++ b/include/dawn/dawn.h @@ -6,6 +6,7 @@ #pragma once #include "libs.h" +// Display / Rendering #include "display/camera.h" #include "display/primitive.h" #include "display/render.h" @@ -14,15 +15,24 @@ #include "display/texture.h" #include "display/tileset.h" +// File / Asset Management #include "file/asset.h" +// Game Logic / Game Time Management #include "game/game.h" #include "game/gametime.h" +// Player Input #include "input/input.h" +// Poker Game Logic +#include "cards/card.h" +#include "cards/poker/holdem.h" + +// Utility Objects #include "util/list.h" +// 3D Tile Game World #include "world/entity/entity.h" #include "world/map/chunk.h" #include "world/map/map.h" diff --git a/include/dawn/display/tileset.h b/include/dawn/display/tileset.h index ff69339b..9cf131cc 100644 --- a/include/dawn/display/tileset.h +++ b/include/dawn/display/tileset.h @@ -16,6 +16,9 @@ typedef struct { /** Count of X/Y divisions */ int32_t columns, rows; + /** Size of each divison (in pixels) */ + float divX, divY; + /** Count of divisions (unused) */ int32_t count; diff --git a/include/dawn/game/gametime.h b/include/dawn/game/gametime.h index d05acc6b..0de91ba6 100644 --- a/include/dawn/game/gametime.h +++ b/include/dawn/game/gametime.h @@ -31,10 +31,14 @@ typedef struct { float last; /** - * Fixed timestep that occured since the last frame. Typically locked to 1/60 - * steps per second. + * Varying timestep that occured since the last frame. */ float delta; + + /** + * Fixed timestep that is not affected by framerate but remains consistent. + */ + float fixedDelta; } gametime_t; extern gametime_t TIME_STATE; \ No newline at end of file diff --git a/include/dawn/world/entity/entity.h b/include/dawn/world/entity/entity.h index 8962ad56..fb347560 100644 --- a/include/dawn/world/entity/entity.h +++ b/include/dawn/world/entity/entity.h @@ -8,6 +8,13 @@ #pragma once #include "../../libs.h" #include "../../display/spritebatch.h" +#include "../../display/texture.h" +#include "../../display/tileset.h" + +/** Entity Texture Information */ +#define ENTITY_ASSET_TEXTURE "world/entity.png" +#define ENTITY_WIDTH 32 +#define ENTITY_HEIGHT ENTITY_WIDTH /** Entity ID Definitions */ #define ENTITY_TYPE_NULL 0x00 @@ -19,6 +26,13 @@ /** Count of different types of entities */ #define ENTITY_TYPE_COUNT ENTITY_TYPE_PLAYER + 1 +#define ENTITY_DIRECTION_SOUTH 0x00 +#define ENTITY_DIRECTION_NORTH 0x01 +#define ENTITY_DIRECTION_WEST 0x02 +#define ENTITY_DIRECTION_EAST 0x03 + +#define ENTITY_STATE_WALKING 0x01 + /** Unique Entity ID */ typedef uint8_t entityid_t; @@ -31,12 +45,15 @@ typedef struct { int32_t gridX, gridY, gridZ; int32_t oldGridX, oldGridY, oldGridZ; float positionX, positionY, positionZ; + uint8_t direction; + uint32_t state; } entity_t; /** Definition for an entity type */ typedef struct { void (*entityInit)(entityid_t entityId, entity_t *entity); void (*entityUpdate)(entityid_t entityId, entity_t *entity); + void (*entityRender)(entityid_t entityId, entity_t *entity); void (*entityDispose)(entityid_t entityId, entity_t *entity); } entitytype_t; @@ -47,6 +64,12 @@ typedef struct { /** Sprite Batch in the state */ spritebatch_t *spriteBatch; + + /** Texture for entities */ + texture_t *texture; + + /** Divided Tileset for entities */ + tileset_t *tileset; } entitystate_t; /** Global Entity State */ diff --git a/src/card/card.c b/src/card/card.c new file mode 100644 index 00000000..c5b8ca38 --- /dev/null +++ b/src/card/card.c @@ -0,0 +1,34 @@ +/** + * Copyright (c) 2021 Dominic Masters + * + * This software is released under the MIT License. + * https://opensource.org/licenses/MIT + */ + +#include "card.h" + +void cardDeckFill(card_t *deck) { + uint8_t i; + for(i = 0; i < CARD_DECK_SIZE; i++) { + deck[i] = i; + } +} + +void cardShuffle(card_t *hand, uint8_t cardCount) { + uint8_t i, j; + card_t temporary; + for(i = 0; i < cardCount - 1; i++) { + // Select random element from remaining elements. + j = u8randRange(i, cardCount); + temporary = hand[j];// Take out other card + hand[j] = hand[i];// Move my card there + hand[i] = temporary;// Put other card here. + } +} + +void cardDeal(card_t *deck, card_t *hand, uint8_t deckSize, uint8_t handSize) { + card_t card; + card = deck[deckSize-1]; + deck[deckSize-1] = 0x00; + hand[handSize] = card; +} \ No newline at end of file diff --git a/src/card/card.h b/src/card/card.h new file mode 100644 index 00000000..8bae312d --- /dev/null +++ b/src/card/card.h @@ -0,0 +1,35 @@ +/** + * Copyright (c) 2021 Dominic Masters + * + * This software is released under the MIT License. + * https://opensource.org/licenses/MIT + */ + +#pragma once +#include +#include "../util/rand.h" + +/** + * Fills a deck with a standard set of cards (unshuffled) + * + * @param deck Deck to fill. Must be at least 52 elements. + */ +void cardDeckFill(card_t *deck); + +/** + * Shuffles the given hand or deck. + * + * @param hand The hand/deck to shuffle. + * @param cardCount The amount of cards that are in that deck/hand. + */ +void cardShuffle(card_t *hand, uint8_t cardCount); + +/** + * Deals a card of the top of the deck into the given hand. + * + * @param deck Deck to take from. + * @param hand Hand to put into. + * @param deckSize Size of the current deck. + * @param handSize Size of the current hand. + */ +void cardDeal(card_t *deck, card_t *hand, uint8_t deckSize, uint8_t handSize); \ No newline at end of file diff --git a/src/card/poker/holdem.c b/src/card/poker/holdem.c new file mode 100644 index 00000000..c90b5e02 --- /dev/null +++ b/src/card/poker/holdem.c @@ -0,0 +1,169 @@ +/** + * Copyright (c) 2021 Dominic Masters + * + * This software is released under the MIT License. + * https://opensource.org/licenses/MIT + */ + +#include "holdem.h" + +void holdemGameInit(holdemgame_t *game) { + uint8_t i; + holdemplayer_t *player; + + // Set Blinds to nil. + game->blindBig = 0; + game->blindSmall = 0; + + // Reset the players + for(i = 0; i < HOLDEM_PLAYER_COUNT; i++) { + player = game->players + i; + + // Set their state to 0 + player->state = 0x00; + + // Set their chips to zero + player->chips = 0; + } +} + +void holdemRoundInit(holdemgame_t *game) { + uint8_t i; + holdemplayer_t *player; + + // Refill the deck + cardDeckFill(game->deck); + game->deckSize = CARD_DECK_SIZE; + + // Reset the pot + game->pot = 0; + + // Reset the cards + game->cardsFacing = 0; + + // Reset the players + for(i = 0; i < HOLDEM_PLAYER_COUNT; i++) { + player = game->players + i; + + // Clear Round State(s) + player->state &= ~( + HOLDEM_STATE_FOLDED | + HOLDEM_STATE_SHOWING + ); + + player->cardCount = 0; + + // Set the players' current bet to zero. + player->currentBet = 0; + } +} + +void holdemDeal(holdemgame_t *game, holdemplayer_t *player) { + cardDeal(game->deck, player->cards, game->deckSize, player->cardCount); + game->deckSize--; + player->cardCount++; +} + +void holdemDealAll(holdemgame_t *game, uint8_t count) { + uint8_t i, j; + for(i = 0; i < count; i++) { + for(j = 0; j < HOLDEM_PLAYER_COUNT; j++) { + holdemDeal(game, game->players + j); + } + } +} + +void holdemFlop(holdemgame_t *game) { + if(game->cardsFacing >= HOLDEM_DEALER_HAND) return; + uint8_t i, count; + + + // Burn the card off the top + game->deckSize -= 1; + + // Change count depending on facing + count = game->cardsFacing == 0 ? 0x03 : 0x01; + + // Deal + for(i = 0; i < count; i++) { + cardDeal(game->deck, game->cards, game->deckSize, game->cardsFacing); + game->deckSize -= 1; + game->cardsFacing += 1; + } +} + +void holdemRenderInit(holdemrender_t *render) { + render->batch = spriteBatchCreate( + CARD_DECK_SIZE + (HOLDEM_PLAYER_COUNT * HOLDEM_PLAYER_HAND) + ); + render->texture = assetTextureLoad("cards_normal.png"); + render->tileset = tilesetCreate( + CARD_COUNT_PER_SUIT, 6, + render->texture->width, render->texture->height, + 0, 0, 0, 0 + ); +} + +void holdemRenderCard(holdemrender_t *render, card_t card, bool faceUp, float x, float y, float z) { + int32_t i; + + if(faceUp) { + uint8_t suit = card / CARD_COUNT_PER_SUIT; + uint8_t num = card % CARD_COUNT_PER_SUIT; + i = num + (( + suit == 0 ? 2 : + suit == 1 ? 3 : + suit == 2 ? 1 : + 0 + ) * CARD_COUNT_PER_SUIT); + } else { + i = 4 * render->tileset->columns; + } + + tilesetdiv_t *div = render->tileset->divisions + i; + + spriteBatchQuad(render->batch, -1, + x, y, z, + 3, 4, + div->x0, div->y0, div->x1, div->y1 + ); +} + +void holdemRender(holdemrender_t *render, holdemgame_t *game) { + uint8_t i, j; + holdemplayer_t *player; + + shaderUseTexture(GAME_STATE.shaderWorld, render->texture); + + // Flush + spriteBatchFlush(render->batch); + + // Render Deck + for(i = 0; i < game->deckSize; i++) { + holdemRenderCard(render, game->deck[i], false, 0, 6, i * 0.05f); + } + for(i = 0; i < game->cardsFacing; i++) { + holdemRenderCard(render, game->cards[i], true, 0, -i*1.5, i * 0.05f); + } + + // Render each players's hand + for(i = 0; i < HOLDEM_PLAYER_COUNT; i++) { + player = game->players + i; + + for(j = 0; j < player->cardCount; j++) { + holdemRenderCard(render, player->cards[j], true, + 4*(i+1), -(j * 1), j * 0.05f + ); + } + } + + // Draw + spriteBatchDraw(render->batch, 0, -1); +} + +uint32_t holdemBet(holdemgame_t *game, holdemplayer_t *player, uint32_t amount) { + uint32_t realAmount = mathMin(player->chips, amount); + game->pot += realAmount; + player->chips -= realAmount; + return realAmount; +} \ No newline at end of file diff --git a/src/card/poker/holdem.h b/src/card/poker/holdem.h new file mode 100644 index 00000000..0af4841f --- /dev/null +++ b/src/card/poker/holdem.h @@ -0,0 +1,85 @@ +/** + * Copyright (c) 2021 Dominic Masters + * + * This software is released under the MIT License. + * https://opensource.org/licenses/MIT + */ + +#pragma once +#include +#include "../card.h" +#include "../../util/rand.h" +#include "../../display/spritebatch.h" +#include "../../display/texture.h" +#include "../../display/tileset.h" +#include "../../display/shader.h" +#include "../../file/asset.h" + +/** + * Initializes a Teax Hold'em Game for the first time. + * + * @param game Game to initialize. + */ +void holdemGameInit(holdemgame_t *game); + +/** + * Initializes a Texas Hold'em Round for the first time. Does not affect the + * global game state. + * + * @param game Game's round you want to initialize. + */ +void holdemRoundInit(holdemgame_t *game); + +/** + * Deals a card to the given player, does all the follow up. + * + * @param game Game who's deck to deal from. + * @param player Player to deal into. + */ +void holdemDeal(holdemgame_t *game, holdemplayer_t *player); + +/** + * Deal cards to all players. + * + * @param game Game and players to deal around. + * @param count Count of cards to deal to each player. + */ +void holdemDealAll(holdemgame_t *game, uint8_t count); + +/** + * Draw the flop, turn or river + * + * @param game Game to flop/turn/river. + */ +void holdemFlop(holdemgame_t *game); + + +/** + * Initialize the Texas Hold'em Renderer. + * + * @param render Renderer to init. + */ +void holdemRenderInit(holdemrender_t *render); + +/** + * Renders a card. + * + * @param render Renderer to render against + * @param card Card to render. + */ +void holdemRenderCard(holdemrender_t *render, card_t card, bool faceUp, float x, float y, float z); + +/** + * Render an entire holdem game. + */ +void holdemRender(holdemrender_t *render, holdemgame_t *game); + +/** + * Takes the given bet from a player + * + * @param game Game to add the bet to. + * @param player Player to take the bet from. + * @param amount Amount to try and take. + * @return The real amount that was taken, chips considered. + */ +uint32_t holdemBet(holdemgame_t *game, holdemplayer_t *player, uint32_t amount); \ No newline at end of file diff --git a/src/display/gui/font.c b/src/display/gui/font.c new file mode 100644 index 00000000..af77416d --- /dev/null +++ b/src/display/gui/font.c @@ -0,0 +1,47 @@ +/** + * Copyright (c) 2021 Dominic Masters + * + * This software is released under the MIT License. + * https://opensource.org/licenses/MIT + */ + +#include "font.h" + +tilesetdiv_t * fontGetCharacterDivision(tileset_t *tileset, char character) { + int32_t i = ((int32_t)character) - FONT_CHAR_START; + return tileset->divisions + i; +} + +void fontSpriteBatchBuffer(spritebatch_t *batch, tileset_t *tileset, + char *string, float x, float y, float z, float charWidth, float charHeight +) { + int32_t i; + char c; + tilesetdiv_t *div; + float cx, cy; + + i = 0; + cx = x, cy = y; + + while(true) { + c = string[i]; + if(c == '\0') break; + i++; + + if(c == '\n') { + cx = x; + cy += charWidth; + continue; + } else if(c == ' ') { + cx += charHeight; + continue; + } + + div = fontGetCharacterDivision(tileset, c); + spriteBatchQuad(batch, -1, + cx, cy, z, charWidth, charHeight, + div->x0, div->y0, div->x1, div->y1 + ); + cx += charWidth; + } +} \ No newline at end of file diff --git a/src/display/gui/font.h b/src/display/gui/font.h new file mode 100644 index 00000000..d4a0040c --- /dev/null +++ b/src/display/gui/font.h @@ -0,0 +1,17 @@ +/** + * Copyright (c) 2021 Dominic Masters + * + * This software is released under the MIT License. + * https://opensource.org/licenses/MIT + */ + +#pragma once +#include +#include "../spritebatch.h" + +#define FONT_CHAR_START 33 + +tilesetdiv_t * fontGetCharacterDivision(tileset_t *tileset, char character); +void fontSpriteBatchBuffer(spritebatch_t *batch, tileset_t *tileset, + char *string, float x, float y, float z, float charWidth, float charHeight +); \ No newline at end of file diff --git a/src/display/tileset.c b/src/display/tileset.c index e96fa8aa..06219d64 100644 --- a/src/display/tileset.c +++ b/src/display/tileset.c @@ -14,7 +14,7 @@ tileset_t * tilesetCreate( int32_t borderX, int32_t borderY ) { tileset_t *tileset; - float divX, divY, tdivX; + float tdivX, tdivY; int32_t x, y, i; tileset = malloc(sizeof(tileset_t)); @@ -31,21 +31,30 @@ tileset_t * tilesetCreate( tileset->rows = rows; // Calculate division sizes (pixels) - divX = (width - (borderX * 2) - (gapX * (columns - 1))) / columns; - divY = (height - (borderY * 2) - (gapY * (rows - 1))) / rows; + tileset->divX = (width - (borderX * 2) - (gapX * (columns - 1))) / columns; + tileset->divY = (height - (borderY * 2) - (gapY * (rows - 1))) / rows; // Calculate the division sizes (units) - divX = divX / width; - divY = divY / height; + tdivX = tileset->divX / width; + tdivY = tileset->divY / height; - // Calculate the divisions + // Calculate the divisions (in units) i = -1; for(y = 0; y < rows; y++) { for(x = 0; x < columns; x++) { - tileset->divisions[++i].x0 = borderX + (divX * x) + (gapX * x); - tileset->divisions[i].y0 = borderY + (divY * y) + (gapY * y); - tileset->divisions[i].x1 = tileset->divisions[i].x0 + divX; - tileset->divisions[i].y1 = tileset->divisions[i].y0 + divY; + tileset->divisions[++i].x0 = ( + borderX + (tileset->divX * x) + (gapX * x) + ) / width; + tileset->divisions[i].x1 = tileset->divisions[i].x0 + tdivX; + + // tileset->divisions[i].y0 = (borderY + (divY * y) + (gapY * y)) / height; + // tileset->divisions[i].y1 = tileset->divisions[i].y0 + tdivY; + + // Vertically flipped for OpenGL + tileset->divisions[i].y1 = ( + borderY + (tileset->divY * y) + (gapY * y) + ) / height; + tileset->divisions[i].y0 = tileset->divisions[i].y1 + tdivY; } } diff --git a/src/game/game.c b/src/game/game.c index 86abee42..12fddaaa 100644 --- a/src/game/game.c +++ b/src/game/game.c @@ -9,6 +9,12 @@ game_t GAME_STATE; +holdemgame_t holdem; +holdemrender_t render; + +texture_t *fontTexture; +spritebatch_t *fontBatch; + bool gameInit() { // Init the game GAME_STATE.name = GAME_NAME; @@ -19,13 +25,31 @@ bool gameInit() { inputInit(); worldInit(); + holdemGameInit(&holdem); + holdemRenderInit(&render); + + holdemRoundInit(&holdem); + cardShuffle(holdem.deck, holdem.deckSize); + + // Deal Card + holdemDealAll(&holdem, 2); + holdemFlop(&holdem); + + fontTexture = assetTextureLoad("font.png"); + fontBatch = spriteBatchCreate(100); + tileset_t *tileset = tilesetCreate(20, 20, + fontTexture->width, fontTexture->height, + 1, 1, 1, 1 + ); + + char *buffer = "!\"#$%"; + fontSpriteBatchBuffer(fontBatch, tileset, buffer, 0, 0, 0, 1.1, 1.5); + // Load the world shader. GAME_STATE.shaderWorld = assetShaderLoad( "shaders/test.vert", "shaders/test.frag" ); - entityInit(0x00, 0x01); - // Init the input manger. return true; } @@ -39,16 +63,21 @@ bool gameUpdate(float platformDelta) { shaderUse(GAME_STATE.shaderWorld); // Set up the camera. - int32_t d = 10; - cameraLookAt(&GAME_STATE.cameraWorld, d, d, d, 0, 0, 0); + int x = 10; + cameraLookAt(&GAME_STATE.cameraWorld, x, 2.5f, 50, x, 2, 0); cameraPerspective(&GAME_STATE.cameraWorld, 45.0f, ((float)RENDER_STATE.width) / ((float)RENDER_STATE.height), 0.5f, 500.0f ); shaderUseCamera(GAME_STATE.shaderWorld, &GAME_STATE.cameraWorld); - + + + shaderUseTexture(GAME_STATE.shaderWorld, fontTexture); + spriteBatchDraw(fontBatch, 0, -1); + + // holdemRender(&render, &holdem); // Render the game scene. - worldRender(); + // worldRender(); if(inputIsPressed(INPUT_NULL)) return false; return true; diff --git a/src/game/game.h b/src/game/game.h index 9abe0236..0952d038 100644 --- a/src/game/game.h +++ b/src/game/game.h @@ -14,6 +14,11 @@ #include "../world/world.h" #include "../world/entity/entity.h" +#include "../card/poker/holdem.h" +#include "../display/gui/font.h" +#include "../display/spritebatch.h" +#include "../display/tileset.h" + /** * Initialize the game context. * diff --git a/src/game/gametime.c b/src/game/gametime.c index 58882e04..b364d38c 100644 --- a/src/game/gametime.c +++ b/src/game/gametime.c @@ -24,4 +24,5 @@ void gameTimeUpdate(float platformDelta) { TIME_STATE.last = TIME_STATE.current; TIME_STATE.current = TIME_STATE.current + platformDelta; TIME_STATE.delta = TIME_STATE.current - TIME_STATE.last; + TIME_STATE.fixedDelta = GAMETIME_FIXED_STEP; } \ No newline at end of file diff --git a/src/platform/glfw/glwfwplatform.c b/src/platform/glfw/glwfwplatform.c index 699cadbd..eb504fb3 100644 --- a/src/platform/glfw/glwfwplatform.c +++ b/src/platform/glfw/glwfwplatform.c @@ -61,7 +61,7 @@ int32_t main() { // Tick the engine. if(!gameUpdate(fDelta)) break; glfwSwapBuffers(window); - sleep(0); + sleep(0);//Fixes some weird high CPU bug, not actually necessary. } // Game has finished running, cleanup. diff --git a/src/util/math.h b/src/util/math.h index b32a0852..b7da5a68 100644 --- a/src/util/math.h +++ b/src/util/math.h @@ -5,6 +5,7 @@ #pragma once -#define mathMod(a,b) (a%b+b)%b -#define mathMax(a,b) (ab?b:a) \ No newline at end of file +#define mathMod(a,b) (a%b+b)%b +#define mathMax(a,b) (ab?b:a) +#define mathAbs(n) (n<0?-n:n) \ No newline at end of file diff --git a/src/util/rand.h b/src/util/rand.h new file mode 100644 index 00000000..c55b0c8c --- /dev/null +++ b/src/util/rand.h @@ -0,0 +1,28 @@ +/** + * Copyright (c) 2021 Dominic Masters + * + * This software is released under the MIT License. + * https://opensource.org/licenses/MIT + */ + +#pragma once +#include + +/** + * Generate a number between 0 and max. (max exclusive) + * + * @param max Max number to generate + * @return Number between 0 and max. + */ +#define u32rand(max) (rand()%max) +#define u8rand(max) (uint8_t)u23rand(max) + +/** + * Generate a number between min and max. (max exclusive, min inclusive) + * + * @param min Min number to generate. + * @param max Max number to generate. + * @return Number between min and max. + */ +#define u32randRange(min, max) (u32rand(max-min)+min) +#define u8randRange(min, max) (uint8_t)u32randRange(min,max) \ No newline at end of file diff --git a/src/world/entity/common.c b/src/world/entity/common.c index f363da5a..a2af301f 100644 --- a/src/world/entity/common.c +++ b/src/world/entity/common.c @@ -7,10 +7,34 @@ #include "common.h" +void entityCommonMoveUpdate(entityid_t id, entity_t *entity) { + float x, y, z, delta; + x = entity->gridX - entity->positionX; + y = entity->gridY - entity->positionY; + z = entity->gridZ - entity->positionZ; + + if(mathAbs(x) <= 0.05 && mathAbs(y) <= 0.05 && mathAbs(z) <= 0.05) { + entity->positionX = entity->gridX; + entity->positionY = entity->gridY; + entity->positionZ = entity->gridZ; + entity->state -= ENTITY_STATE_WALKING; + return; + } + + // TODO: Change this from easing curve to linear. + delta = TIME_STATE.delta * ENTITY_COMMON_MOVE_SPEED; + entity->positionX += x == 0 ? 0 : x > 0 ? delta : -delta; + entity->positionY += y == 0 ? 0 : y > 0 ? delta : -delta; + entity->positionZ += z == 0 ? 0 : z > 0 ? delta : -delta; +} + void entityCommonMove(entityid_t id, entity_t *entity, int32_t x, int32_t y, int32_t z) { int32_t newX, newY, newZ, chunkIndex, tileIndex; tileid_t tileId; + // Update state. + entity->state |= ENTITY_STATE_WALKING; + // Determine the new coordinates. newX = entity->gridX + x; newY = entity->gridY + y; @@ -35,15 +59,18 @@ void entityCommonMove(entityid_t id, entity_t *entity, int32_t x, int32_t y, int } void entityCommonRender(entityid_t id, entity_t *entity) { - float d = TIME_STATE.delta * ENTITY_COMMON_MOVE_SPEED; - entity->positionX += (entity->gridX - entity->positionX) * d; - entity->positionY += (entity->gridY - entity->positionY) * d; - entity->positionZ += (entity->gridZ - entity->positionZ) * d; + tilesetdiv_t div = tilesetGetDivision(ENTITY_STATE.tileset, 0, entity->direction); // Render sprite spriteBatchQuad(ENTITY_STATE.spriteBatch, -1, - entity->positionX, entity->positionY, entity->positionZ + 0.16, + entity->positionX, entity->positionY, entity->positionZ + 0.01, 1, 1, - 0, 0, 1, 1 + div.x0, div.y0, div.x1, div.y1 ); +} + +void entityCommonTurn(entityid_t id, entity_t *entity, uint8_t dir) { + if(entity->direction == dir) return; + entity->direction = dir; + entity->state = ENTITY_STATE_WALKING; } \ No newline at end of file diff --git a/src/world/entity/common.h b/src/world/entity/common.h index 180a056d..8e373c0b 100644 --- a/src/world/entity/common.h +++ b/src/world/entity/common.h @@ -8,9 +8,14 @@ #pragma once #include #include "../../display/spritebatch.h" +#include "../../display/tileset.h" #include "../map/tile.h" +#include "../map/chunk.h" +#include "../../util/math.h" -#define ENTITY_COMMON_MOVE_SPEED 10 +#define ENTITY_COMMON_MOVE_SPEED 3 +void entityCommonMoveUpdate(entityid_t id, entity_t *entity); void entityCommonMove(entityid_t id, entity_t *entity, int32_t x, int32_t y, int32_t z); void entityCommonRender(entityid_t id, entity_t *entity); +void entityCommonTurn(entityid_t id, entity_t *entity, uint8_t dir); \ No newline at end of file diff --git a/src/world/entity/entities/player.c b/src/world/entity/entities/player.c new file mode 100644 index 00000000..f2f76abf --- /dev/null +++ b/src/world/entity/entities/player.c @@ -0,0 +1,48 @@ +/** + * Copyright (c) 2021 Dominic Masters + * + * This software is released under the MIT License. + * https://opensource.org/licenses/MIT + */ + +#include "player.h" + +void playerInit(entityid_t id, entity_t *entity) { +} + +void playerUpdate(entityid_t id, entity_t *entity) { + // Movement + if(entity->state & ENTITY_STATE_WALKING) { + entityCommonMoveUpdate(id, entity); + } else { + if(inputIsPressed(INPUT_UP)) { + entityCommonTurn(id, entity, ENTITY_DIRECTION_NORTH); + } else if(inputIsPressed(INPUT_DOWN)) { + entityCommonTurn(id, entity, ENTITY_DIRECTION_SOUTH); + } else if(inputIsPressed(INPUT_LEFT)) { + entityCommonTurn(id, entity, ENTITY_DIRECTION_WEST); + } else if(inputIsPressed(INPUT_RIGHT)) { + entityCommonTurn(id, entity, ENTITY_DIRECTION_EAST); + + } else if(inputIsDown(INPUT_UP)) { + entityCommonTurn(id, entity, ENTITY_DIRECTION_NORTH); + entityCommonMove(id, entity, 0, 1, 0); + } else if(inputIsDown(INPUT_DOWN)) { + entityCommonTurn(id, entity, ENTITY_DIRECTION_SOUTH); + entityCommonMove(id, entity, 0, -1, 0); + } else if(inputIsDown(INPUT_LEFT)) { + entityCommonTurn(id, entity, ENTITY_DIRECTION_WEST); + entityCommonMove(id, entity, -1, 0, 0); + } else if(inputIsDown(INPUT_RIGHT)) { + entityCommonTurn(id, entity, ENTITY_DIRECTION_EAST); + entityCommonMove(id, entity, 1, 0, 0); + } + } +} + +void playerRender(entityid_t id, entity_t *entity) { + entityCommonRender(id, entity); +} + +void playerDispose(entityid_t id, entity_t *entity) { +} \ No newline at end of file diff --git a/src/world/entity/player.h b/src/world/entity/entities/player.h similarity index 75% rename from src/world/entity/player.h rename to src/world/entity/entities/player.h index 73f5969a..266dd288 100644 --- a/src/world/entity/player.h +++ b/src/world/entity/entities/player.h @@ -7,9 +7,10 @@ #pragma once #include -#include "common.h" -#include "../../input/input.h" +#include "../common.h" +#include "../../../input/input.h" void playerInit(entityid_t entityId, entity_t *entity); void playerUpdate(entityid_t entityId, entity_t *entity); +void playerRender(entityid_t entityId, entity_t *entity); void playerDispose(entityid_t entityId, entity_t *entity); \ No newline at end of file diff --git a/src/world/entity/entity.c b/src/world/entity/entity.c index 1d777a19..f90066b3 100644 --- a/src/world/entity/entity.c +++ b/src/world/entity/entity.c @@ -10,8 +10,22 @@ entitystate_t ENTITY_STATE; void entityStateInit() { + // Reset the entities memset(ENTITY_STATE.entities, 0, sizeof(entity_t) * ENTITY_COUNT); + + // Prepare the spritebatch. ENTITY_STATE.spriteBatch = spriteBatchCreate(ENTITY_COUNT); + + // Load the texture + ENTITY_STATE.texture = assetTextureLoad(ENTITY_ASSET_TEXTURE); + + // Divide the tileset + ENTITY_STATE.tileset = tilesetCreate( + ENTITY_STATE.texture->width/ENTITY_WIDTH, + ENTITY_STATE.texture->height/ENTITY_HEIGHT, + ENTITY_STATE.texture->width, ENTITY_STATE.texture->height, + 0,0,0,0 + ); } void entityStateRender() { @@ -21,14 +35,16 @@ void entityStateRender() { // Flush the batch. spriteBatchFlush(ENTITY_STATE.spriteBatch); - // Render the entities. + // Update and Render the entities. for(i = 0; i < ENTITY_COUNT; i++) { entity = ENTITY_STATE.entities + i; if(entity->type == ENTITY_TYPE_NULL) break; ENTITY_TYPES[entity->type].entityUpdate(i, entity); + ENTITY_TYPES[entity->type].entityRender(i, entity); } // Draw the sprite batch. + shaderUseTexture(GAME_STATE.shaderWorld, ENTITY_STATE.texture); shaderUsePosition(GAME_STATE.shaderWorld, 0, 0, 0, 0, 0, 0); spriteBatchDraw(ENTITY_STATE.spriteBatch, 0, -1); } diff --git a/src/world/entity/entity.h b/src/world/entity/entity.h index 65656acd..c2f9a2cf 100644 --- a/src/world/entity/entity.h +++ b/src/world/entity/entity.h @@ -8,8 +8,11 @@ #pragma once #include #include "entitytypes.h" +#include "../../file/asset.h" #include "../../display/spritebatch.h" #include "../../display/shader.h" +#include "../../display/texture.h" +#include "../../display/tileset.h" /** * Initializes the entity state system. diff --git a/src/world/entity/entitytypes.c b/src/world/entity/entitytypes.c index b9935a39..f325c10d 100644 --- a/src/world/entity/entitytypes.c +++ b/src/world/entity/entitytypes.c @@ -9,12 +9,18 @@ entitytype_t ENTITY_TYPES[ENTITY_TYPE_COUNT] = { // ENTITY_TYPE_NULL - { .entityInit = NULL, .entityUpdate = NULL, .entityDispose = NULL }, + { + .entityInit = NULL, + .entityUpdate = NULL, + .entityRender = NULL, + .entityDispose = NULL + }, // ENTITY_TYPE_PLAYER { .entityInit = &playerInit, .entityUpdate = &playerUpdate, + .entityRender = &playerRender, .entityDispose = &playerDispose } }; \ No newline at end of file diff --git a/src/world/entity/entitytypes.h b/src/world/entity/entitytypes.h index a45b0360..f95216e9 100644 --- a/src/world/entity/entitytypes.h +++ b/src/world/entity/entitytypes.h @@ -7,4 +7,4 @@ #pragma once #include -#include "player.h" \ No newline at end of file +#include "entities/player.h" \ No newline at end of file diff --git a/src/world/entity/player.c b/src/world/entity/player.c deleted file mode 100644 index 46a6bf17..00000000 --- a/src/world/entity/player.c +++ /dev/null @@ -1,29 +0,0 @@ -/** - * Copyright (c) 2021 Dominic Masters - * - * This software is released under the MIT License. - * https://opensource.org/licenses/MIT - */ - -#include "player.h" - -void playerInit(entityid_t id, entity_t *entity) { -} - -void playerUpdate(entityid_t id, entity_t *entity) { - if(inputIsPressed(INPUT_UP)) { - entityCommonMove(id, entity, 0, 1, 0); - } else if(inputIsPressed(INPUT_DOWN)) { - entityCommonMove(id, entity, 0, -1, 0); - } else if(inputIsPressed(INPUT_LEFT)) { - entityCommonMove(id, entity, -1, 0, 0); - } else if(inputIsPressed(INPUT_RIGHT)) { - entityCommonMove(id, entity, 1, 0, 0); - } - - // Render sprite - entityCommonRender(id, entity); -} - -void playerDispose(entityid_t id, entity_t *entity) { -} \ No newline at end of file diff --git a/src/world/map/chunk.c b/src/world/map/chunk.c index 47bd7628..20f6b6c5 100644 --- a/src/world/map/chunk.c +++ b/src/world/map/chunk.c @@ -12,10 +12,12 @@ void chunkLoad(chunk_t *chunk, int32_t x, int32_t y, int32_t z) { tiledef_t *tileDef; int32_t i, indiceCount, verticeCount, tx, ty, tz; - chunk->tiles[0] = 1; - chunk->tiles[1] = 1; - chunk->tiles[16] = 1; - chunk->tiles[17] = 1; + for(ty = 0; ty < CHUNK_HEIGHT; ty++) { + for(tx = 0; tx < CHUNK_WIDTH; tx++) { + if(z != 0) break; + chunk->tiles[ty*CHUNK_WIDTH + tx] = ty == 5 ? 2 : 1; + } + } // Start by loading the tiles and figuring out how big we need to make the // primitive that the chunk uses. diff --git a/src/world/world.c b/src/world/world.c index 5e0b6b48..ff2c42c7 100644 --- a/src/world/world.c +++ b/src/world/world.c @@ -13,6 +13,17 @@ void worldInit() { } void worldRender() { + if(ENTITY_STATE.entities[0].type != ENTITY_TYPE_NULL) { + cameraLookAt(&GAME_STATE.cameraWorld, + ENTITY_STATE.entities[0].positionX, + ENTITY_STATE.entities[0].positionY - 0.5, + ENTITY_STATE.entities[0].positionZ + 7, + + ENTITY_STATE.entities[0].positionX, + ENTITY_STATE.entities[0].positionY, + ENTITY_STATE.entities[0].positionZ + ); + } mapRender(); entityStateRender(); } diff --git a/src/world/world.h b/src/world/world.h index 6730ed88..7fdc14ec 100644 --- a/src/world/world.h +++ b/src/world/world.h @@ -9,6 +9,7 @@ #include #include "map/map.h" #include "entity/entity.h" +#include "../display/camera.h" void worldInit(); void worldRender();