/** * @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)); } }); }
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; }); }
/** * @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; }