Exemplo n.º 1
0
 /**
  * @param HandBetPair $hand
  * @param DealerHand  $dealerHand
  *
  * @return Promise
  */
 public function requestAction(HandBetPair $hand, DealerHand $dealerHand)
 {
     return \Blackjack\Promise\timedResolve(self::RESPONSE_SPEED)->then(function () use($hand, $dealerHand) {
         if ($this->getSeat() === null) {
             return \React\Promise\reject(new \RuntimeException('Player kicked'));
         }
         if ($hand->getHand()->canSplitPair()) {
             return \React\Promise\resolve(new HandAction(HandAction::ACTION_SPLIT));
         }
         if ($hand->getHand()->getValue() === 10) {
             return \React\Promise\resolve(new HandAction(HandAction::ACTION_DOUBLE_DOWN));
         }
         if ($hand->getHand()->getValue() < 17) {
             return \React\Promise\resolve(new HandAction(HandAction::ACTION_HIT));
         } else {
             return \React\Promise\resolve(new HandAction(HandAction::ACTION_STAND));
         }
     });
 }
Exemplo n.º 2
0
 public function distributePlayerWinnings(Player $player, HandBetPair $hand)
 {
     return \Blackjack\Promise\timedResolve(self::ACTION_SPEED)->then(function () use($player) {
         return $this->ensurePlayerActive($player);
     })->then(function () use($player, $hand) {
         if ($hand->getHand()->beatsHand($this->dealerHand)) {
             // Player wins
             $winnings = $hand->getBet() + (int) ($hand->getBet() * $this->computeWinningModifier($hand->getHand()));
             $player->getChips()->acceptWinnings($winnings);
         } elseif ($hand->getHand()->drawnWithHand($this->dealerHand)) {
             // It's a push
             $winnings = $hand->getBet();
             $player->getChips()->acceptWinnings($winnings);
         } else {
             // Player lost
             $winnings = 0;
         }
         return $winnings;
     });
 }
Exemplo n.º 3
0
 /**
  * @return Promise
  */
 private function distributeWinnings()
 {
     $promise = \Blackjack\Promise\timedResolve(self::LONG_PAUSE_SPEED);
     foreach ($this->table->getSeats() as $seat) {
         if (!$seat->isInPlay()) {
             continue;
         }
         foreach ($seat->getHands() as $hand) {
             // Chain actions
             $promise = $promise->then(function () use($seat, $hand) {
                 return $this->table->distributePlayerWinnings($seat->getPlayer(), $hand)->then(function ($winnings) use($seat, $hand) {
                     if ($winnings === $hand->getBet()) {
                         $message = 'Player draws with dealer';
                     } elseif ($winnings > $hand->getBet()) {
                         $message = 'Player beats dealer';
                     } else {
                         $message = 'Player loses to dealer';
                     }
                     $this->logger->info($message, ['player' => $seat->getPlayer()->getName(), 'bet' => $hand->getBet(), 'winnings' => $winnings, 'playerHand' => (string) $hand->getHand(), 'dealerHand' => (string) $this->table->getDealerHand()]);
                 });
             });
         }
     }
     return $promise;
 }