From 25e683b51285de4f381335e8efb60808980153b1 Mon Sep 17 00:00:00 2001
From: Dominic Masters <dominic@domsplace.com>
Date: Mon, 27 Sep 2021 21:53:56 -0700
Subject: [PATCH] Working on more AI kinks.

---
 src/game/poker/actions/bet.c  |  2 +-
 src/game/poker/actions/look.c |  1 -
 src/game/poker/pokerui.c      |  2 +-
 src/game/poker/pokerui.h      |  2 +-
 src/game/poker/pokerworld.c   | 19 +++++++++---------
 src/poker/actions/round.c     |  1 +
 src/poker/bet.c               | 11 ++++++++++-
 src/poker/turn.c              | 36 ++++++++++++++++++-----------------
 src/poker/winner.h            | 16 ++++++++--------
 src/vn/vnscene.c              |  6 +++---
 src/vn/vnscene.h              |  2 +-
 11 files changed, 54 insertions(+), 44 deletions(-)

diff --git a/src/game/poker/actions/bet.c b/src/game/poker/actions/bet.c
index 8f9086f8..c5325165 100644
--- a/src/game/poker/actions/bet.c
+++ b/src/game/poker/actions/bet.c
@@ -31,7 +31,7 @@ void _pokerGameActionBetOnUpdate(
   
   // Are they human?
   player = game->poker.players + game->poker.bet.better;
-  isHuman = game->poker.bet.better == POKER_PLAYER_HUMAN_INDEX && false;
+  isHuman = game->poker.bet.better == POKER_PLAYER_HUMAN_INDEX;
 
   // Handle as an AI
   if(isHuman) {
diff --git a/src/game/poker/actions/look.c b/src/game/poker/actions/look.c
index 4c7ee347..74e1b3fa 100644
--- a/src/game/poker/actions/look.c
+++ b/src/game/poker/actions/look.c
@@ -12,7 +12,6 @@ void _pokerGameActionLookOnStart(
 ) { 
   pokergame_t *game = (pokergame_t *)action->data;
   pokergameactiondata_t *data = game->actionData + i;
-  printf("Looking at %u\n", data->lookAtPlayer);
   pokerWorldLookAtPlayer(&game->scene, data->lookAtPlayer);
   queueNext(queue);
 }
diff --git a/src/game/poker/pokerui.c b/src/game/poker/pokerui.c
index 91fd7253..64fb8c27 100644
--- a/src/game/poker/pokerui.c
+++ b/src/game/poker/pokerui.c
@@ -59,7 +59,7 @@ void pokerUiUpdate(
   // Set up the camera perspective
   cameraPerspective(&camera, 45,
     (float)POKER_UI_PLAYER_IMAGE_SIZE / (float)POKER_UI_PLAYER_IMAGE_SIZE,
-    0.03f, 10.0f
+    0.03f, 100.0f
   );
 
   // Render the face of each player.
diff --git a/src/game/poker/pokerui.h b/src/game/poker/pokerui.h
index de6b5e77..bcc4b122 100644
--- a/src/game/poker/pokerui.h
+++ b/src/game/poker/pokerui.h
@@ -33,7 +33,7 @@
 #define POKER_UI_PLAYER_HEIGHT POKER_UI_PLAYER_IMAGE_SIZE
 
 #define POKER_UI_PLAYER_IMAGE_RESOLUTION POKER_UI_PLAYER_IMAGE_SIZE * 2
-#define POKER_UI_PLAYER_IMAGE_DIST 0.8f
+#define POKER_UI_PLAYER_IMAGE_DIST 0.7f
 #define POKER_UI_PLAYER_IMAGE_Y 0.1f
 #define POKER_UI_PLAYER_PADDING 8
 #define POKER_UI_PLAYER_CHIPS_ANIMATION_SPEED 0.5f
diff --git a/src/game/poker/pokerworld.c b/src/game/poker/pokerworld.c
index a54d1a98..4fd0be72 100644
--- a/src/game/poker/pokerworld.c
+++ b/src/game/poker/pokerworld.c
@@ -40,16 +40,15 @@ void pokerWorldInit(
 void pokerWorldLookAtPlayer(
   vnscene_t *scene, uint8_t playerIndex
 ) {
-  vnSceneLookAtCharacter(scene, playerIndex, -1);
-  // uint8_t seat = pokerGameSeatFromIndex(playerIndex);
-  // vnSceneLookAtCharacter(scene,
-  //   scene->cameraLook.x,
-  //   scene->cameraLook.y,
-  //   scene->cameraLook.z,
-  //   POKER_WORLD_SEAT_POSITION_X(seat),
-  //   scene->cameraLook.lookY,
-  //   POKER_WORLD_SEAT_POSITION_Z(seat)
-  // );
+  vncharacter_t *character = scene->characters + playerIndex;
+  vnSceneLookAt(scene,
+    scene->cameraLook.x,
+    scene->cameraLook.y,
+    scene->cameraLook.z,
+    character->x,
+    scene->cameraLook.lookY,
+    character->z
+  );
 }
 
 void pokerWorldRender(pokerworld_t *world, pokergameassets_t *assets) {
diff --git a/src/poker/actions/round.c b/src/poker/actions/round.c
index 723a9f3d..f75e3b3e 100644
--- a/src/poker/actions/round.c
+++ b/src/poker/actions/round.c
@@ -23,6 +23,7 @@ void _pokerActionRoundOnStart(queue_t *queue, queueaction_t *action ,uint8_t i){
   pokerDealerInit(&poker->dealer);
 
   // Reset the players
+  printf("Resetting the players\n");
   for(i = 0; i < POKER_PLAYER_COUNT; i++) {
     pokerPlayerReset(poker->players + i);
   }
diff --git a/src/poker/bet.c b/src/poker/bet.c
index d63ffbca..94f35417 100644
--- a/src/poker/bet.c
+++ b/src/poker/bet.c
@@ -33,12 +33,21 @@ void pokerBetResetBetter(
 ) {
   uint8_t i;
   pokerplayer_t *player;
+
+  // Reset the round betting state.
   for(i = 0; i < POKER_PLAYER_COUNT; i++) {
     player = players + i;
     player->state = flagOff(player->state, POKER_PLAYER_STATE_ROUND_MOVE);
   }
-  
+
+  // Now reset to the first player that needs to bet.
+
+  // We do this step first to reset the better
   bet->better = pokerBetGetRoundPlayerDefault(roundSmallBlind);
+
+  // Then we check who's remaining. We do this because the default better may
+  // have folded already.
+  bet->better = pokerBetGetRemainingPlayer(bet, players, roundSmallBlind);
 }
 
 bool pokerBetPlayerCanBet(pokerbet_t *bet, pokerplayer_t *player) {
diff --git a/src/poker/turn.c b/src/poker/turn.c
index 2d9df361..c2270351 100644
--- a/src/poker/turn.c
+++ b/src/poker/turn.c
@@ -31,7 +31,6 @@ pokerturn_t pokerTurnGet(poker_t *poker, uint8_t playerIndex) {
   // they are expected to win from those games, but I'm just going to use the
   // odds of the winning hand.
 
-
   // Is this preflop?
   if(poker->dealer.cardsFacing == 0 && player->cardCount >= 2) {
     // Get the hand weight
@@ -123,7 +122,7 @@ pokerturn_t pokerTurnGet(poker_t *poker, uint8_t playerIndex) {
       amount = maxBet;
     }
   } else if (confidence < 0.95 || poker->dealer.cardsFacing < 0x04) {
-    if(random < 30) {
+    if(random < 20) {
       amount = callBet;
     } else {
       amount = maxBet;
@@ -132,19 +131,21 @@ pokerturn_t pokerTurnGet(poker_t *poker, uint8_t playerIndex) {
     amount = (player->chips - callBet) * 9 / 10;
   }
 
-  if(isBluff) printf("Mum I'm bluffing\n");
-
-  printf("Raised %i times\n", player->timesRaised);
-  
-  // Let's not get caught in a raising loop with AI.
-  if(player->timesRaised >= POKER_TURN_MAX_RAISES) {
-    printf("Calling instead.\n");
-    amount = callBet;
+  // If this is the first round... make it a lot less likely I'll bet
+  if(poker->dealer.cardsFacing == 0x00 && amount > callBet) {
+    if(random > 5) amount = callBet;
   }
 
   // Did we actually bet?
   if(amount > 0) {
-    amount = mathMin(amount, callBet);
+    printf("I plan on betting %i chips\n", amount);
+
+    // Let's not get caught in a raising loop with AI.
+    if(player->timesRaised >= POKER_TURN_MAX_RAISES) {
+      amount = callBet;
+    }
+    
+    amount = mathMax(amount, callBet);
     turn = pokerTurnRaise(poker, playerIndex, amount);
     turn.confidence = confidence;
   } else if(pokerTurnCanPlayerCheck(poker, playerIndex)) {
@@ -170,10 +171,12 @@ void pokerTurnAction(poker_t *poker, pokerplayer_t *player, pokerturn_t *turn) {
 
     case POKER_TURN_TYPE_CHECK:
       pokerBetPlayer(&poker->bet, player, 0);
+      player->timesRaised = 0;
       break;
 
     case POKER_TURN_TYPE_FOLD:
       player->state |= POKER_PLAYER_STATE_FOLDED;
+      player->timesRaised = 0;
       break;
   }
   
@@ -193,9 +196,7 @@ pokerturn_t pokerTurnFold(poker_t *poker, uint8_t player) {
 }
 
 pokerturn_t pokerTurnCheck(poker_t *poker, uint8_t player) {
-  pokerturn_t turn;
-  turn.type = POKER_TURN_TYPE_CHECK;
-  return turn;
+  return pokerTurnRaise(poker, player, 0);
 }
 
 pokerturn_t pokerTurnCall(poker_t *poker, uint8_t playerIndex) {
@@ -213,9 +214,10 @@ pokerturn_t pokerTurnRaise(poker_t *poker, uint8_t playerIndex, int32_t chips) {
   pokerplayer_t *player;
   player = poker->players + playerIndex;
 
-  if(chips < poker->bet.currentBet) chips = poker->bet.currentBet;
-
-  if(player->chips <= chips) {
+  if(chips == 0) {
+    turn.type = POKER_TURN_TYPE_CHECK;
+    turn.chips = 0;
+  } else if(player->chips <= chips) {
     turn.chips = player->chips;
     turn.type = POKER_TURN_TYPE_ALL_IN;
   } else {
diff --git a/src/poker/winner.h b/src/poker/winner.h
index ca093c23..768cf1eb 100644
--- a/src/poker/winner.h
+++ b/src/poker/winner.h
@@ -32,15 +32,15 @@
 #define POKER_WINNNIG_TYPE_HIGH_CARD 0x0A
 
 #define POKER_WINNNIG_CONFIDENCE_ROYAL_FLUSH 1.0f
-#define POKER_WINNNIG_CONFIDENCE_STRAIGHT_FLUSH 0.9f
-#define POKER_WINNNIG_CONFIDENCE_FOUR_OF_A_KIND 0.85f
-#define POKER_WINNNIG_CONFIDENCE_FULL_HOUSE 0.83f
+#define POKER_WINNNIG_CONFIDENCE_STRAIGHT_FLUSH 0.99f
+#define POKER_WINNNIG_CONFIDENCE_FOUR_OF_A_KIND 0.9f
+#define POKER_WINNNIG_CONFIDENCE_FULL_HOUSE 0.85f
 #define POKER_WINNNIG_CONFIDENCE_FLUSH 0.8f
-#define POKER_WINNNIG_CONFIDENCE_STRAIGHT 0.75f
-#define POKER_WINNNIG_CONFIDENCE_THREE_OF_A_KIND 0.75f
-#define POKER_WINNNIG_CONFIDENCE_TWO_PAIR 0.7f
-#define POKER_WINNNIG_CONFIDENCE_PAIR 0.6f
-#define POKER_WINNNIG_CONFIDENCE_HIGH_CARD 0.5f
+#define POKER_WINNNIG_CONFIDENCE_STRAIGHT 0.7f
+#define POKER_WINNNIG_CONFIDENCE_THREE_OF_A_KIND 0.5f
+#define POKER_WINNNIG_CONFIDENCE_TWO_PAIR 0.4f
+#define POKER_WINNNIG_CONFIDENCE_PAIR 0.2f
+#define POKER_WINNNIG_CONFIDENCE_HIGH_CARD 0.1f
 
 /** Holds information about a player's winning state */
 typedef struct {
diff --git a/src/vn/vnscene.c b/src/vn/vnscene.c
index 780002e7..875e31b1 100644
--- a/src/vn/vnscene.c
+++ b/src/vn/vnscene.c
@@ -51,7 +51,7 @@ void vnSceneRenderWorld(vnscene_t *scene, engine_t *engine, shader_t *shader) {
   cameraLookAtStruct(&scene->camera, scene->cameraLook);
 
   // Set Camera Perspective
-  cameraPerspective(&scene->camera, 35,
+  cameraPerspective(&scene->camera, 45,
     engine->render.width/engine->render.height,
     0.01f, 1000.0f
   );
@@ -103,10 +103,10 @@ void vnSceneLookAt(vnscene_t *scene,
   timeline_t *t;
   easefunction_t *f;
 
-  d = 1.0f;
+  d = 0.7f;
   s = scene->timeline.current;
   t = &scene->timeline;
-  f = &easeOutQuart;
+  f = &easeOutQuad;
 
   // Clear the timeline
   timelineClear(t);
diff --git a/src/vn/vnscene.h b/src/vn/vnscene.h
index 23addf05..492234cd 100644
--- a/src/vn/vnscene.h
+++ b/src/vn/vnscene.h
@@ -18,7 +18,7 @@
 
 /** Maximum number of Visual Novel Characters the scene can support */
 #define VN_SCENE_CHARACTERS_MAX 6
-#define VN_SCENE_DISTANCE_DEFAULT -5.0f
+#define VN_SCENE_DISTANCE_DEFAULT -8.0f
 
 typedef struct {
   timeline_t timeline;