#if __cplusplus < 201103L
const DWORD m_RewardItemList[4][3] = {
#else
constexpr DWORD m_RewardItemList[4][3] = {
#endif
{100, 80015, 1},
{200, 80016, 2},
{300, 80017, 3},
{400, 80018, 4},
};
BYTE GetCardIndexToValue(const std::map<BYTE, std::vector<BYTE>>& cardList) {
BYTE value = 0;
#if __cplusplus < 201103L
for (std::map<BYTE, std::vector<BYTE>>::const_iterator it = cardList.begin(); it != cardList.end(); ++it)
#else
for (auto it = cardList.begin(); it != cardList.end(); ++it)
#endif
{
std::vector<std::pair<BYTE, BYTE>> m_AceCards;
#if __cplusplus < 201103L
for (std::vector<BYTE>::const_iterator itEx = it->second.begin(); itEx != it->second.end(); ++itEx)
{
const BYTE& cardIndex = *itEx;
#else
for (const auto& cardIndex : it->second)
{
#endif
if (cardIndex >= 11 && cardIndex <= 13) {
value += 10;
continue;
} else if (cardIndex == 1) {
m_AceCards.emplace_back(it->first, cardIndex);
continue;
}
value += cardIndex;
}
for (BYTE j = 0; j < m_AceCards.size(); ++j)
value += j == 0 ? 11 : 1;
}
return value;
}
void FindNewCard(LPCHARACTER ch, bool isForBot, BYTE& cartType, BYTE& cartIndex) {
const BYTE playerLucky = 25;
while (true) {
const BYTE cardType = number(0, 3);
const BYTE cardIndex = number(1, 13);
if (ch->IsHasBJCard(true, cardType, cardIndex) || ch->IsHasBJCard(false, cardType, cardIndex))
continue;
if (isForBot) {
std::map<BYTE, std::vector<BYTE>> tmpBotCards(ch->GetBJBotCards());
#if __cplusplus < 201103L
tempBotCards.insert(std::make_pair(cardType, cardIndex));
#else
tmpBotCards.emplace(cardType, cardIndex);
#endif
const BYTE newBotCardsValue = GetCardIndexToValue(tmpBotCards);
if (playerLucky > number(0, 100)) {
if (newBotCardsValue <= 21)
continue;
} else {
if (newBotCardsValue > 21)
continue;
}
} else {
std::map<BYTE, std::vector<BYTE>> tmpPlayerCards(ch->GetBJMyCards());
#if __cplusplus < 201103L
tempBotCards.insert(std::make_pair(cardType, cardIndex));
#else
tmpPlayerCards.emplace(cardType, cardIndex);
#endif
const BYTE newPlayerCardsValue = GetCardIndexToValue(tmpPlayerCards);
if (playerLucky > number(0, 100)) {
if (newPlayerCardsValue > 21)
continue;
} else {
if (newPlayerCardsValue <= 21)
continue;
}
}
cartType = cardType;
cartIndex = cardIndex;
return;
}
cartType = 0;
cartIndex = 1;
}
void BlackJackWinner(LPCHARACTER ch, bool isBotWinner) {
ch->ChatPacket(CHAT_TYPE_COMMAND, "BJShowGameStatus %d", isBotWinner);
ch->ChatPacket(CHAT_TYPE_COMMAND, "BJSetGameMode -1");
ch->SetProtectTime("blackjack_key", 0);
if (!isBotWinner)
ch->AutoGiveItem(m_RewardItemList[ch->GetProtectTime("blackjack_reward")][1], m_RewardItemList[ch->GetProtectTime("blackjack_reward")][2], true);
ch->SetProtectTime("blackjack_reward", 0);
ch->GetBJBotCards().clear();
ch->GetBJMyCards().clear();
}
ACMD(do_blackjack) {
std::vector<std::string> vecArgs;
split_argument(argument, vecArgs);
if (vecArgs.size() < 2) { return; }
else if (vecArgs[1] == "start") {
if (ch->GetProtectTime("blackjack_key") != 0)
return;
if (vecArgs.size() < 3) { return; }
BYTE rewardType;
if (!str_to_number(rewardType, vecArgs[2].c_str()))
return;
else if (rewardType >= _countof(m_RewardItemList))
return;
if (ch->CountSpecifyItem(25185) < m_RewardItemList[rewardType][0]) {
ch->ChatPacket(CHAT_TYPE_INFO, "|cff00ff00Yeterli Chip Yok !");
return;
}
ch->RemoveSpecifyItem(25185, m_RewardItemList[rewardType][0]);
const int createGameKey = number(1, 10000000);
ch->SetProtectTime("blackjack_key", createGameKey);
ch->SetProtectTime("blackjack_reward", rewardType);
ch->ChatPacket(CHAT_TYPE_COMMAND, "BJSetGameMode %d", createGameKey);
ch->GetBJBotCards().clear();
ch->GetBJMyCards().clear();
BYTE cardType = 0, cardIndex = 0;
//Bot-Card
FindNewCard(ch, true, cardType, cardIndex);
ch->AddBJCard(true, cardType, cardIndex);
ch->ChatPacket(CHAT_TYPE_COMMAND, "BJAddNewCard %d %d %d -1", true, cardType, cardIndex);
//Player-Cards
FindNewCard(ch, false, cardType, cardIndex);
ch->AddBJCard(false, cardType, cardIndex);
ch->ChatPacket(CHAT_TYPE_COMMAND, "BJAddNewCard %d %d %d -1", false, cardType, cardIndex);
FindNewCard(ch, false, cardType, cardIndex);
ch->AddBJCard(false, cardType, cardIndex);
ch->ChatPacket(CHAT_TYPE_COMMAND, "BJAddNewCard %d %d %d 97", false, cardType, cardIndex);
} else if (vecArgs[1] == "check" || vecArgs[1] == "stand" || vecArgs[1] == "newcard") {
if (vecArgs.size() < 3) { return; }
int gameKey;
if (!str_to_number(gameKey, vecArgs[2].c_str()))
return;
if (!gameKey)
return;
if (ch->GetProtectTime("blackjack_key") != gameKey)
return;
if (vecArgs[1] == "check") {
const BYTE playerValue = GetCardIndexToValue(ch->GetBJMyCards());
if (playerValue == 21)//playerWin
BlackJackWinner(ch, false);
else if (playerValue > 21)
BlackJackWinner(ch, true);
} else if (vecArgs[1] == "stand") {
const BYTE playerValue = GetCardIndexToValue(ch->GetBJMyCards());
const BYTE botValue = GetCardIndexToValue(ch->GetBJBotCards());
if (botValue > playerValue && botValue <= 21)
BlackJackWinner(ch, true);
else if (ch->GetBJBotCards().size() == 4 || botValue > 21)
BlackJackWinner(ch, false);
else {
BYTE cardType = 0, cardIndex = 0;
FindNewCard(ch, true, cardType, cardIndex);
ch->AddBJCard(true, cardType, cardIndex);
ch->ChatPacket(CHAT_TYPE_COMMAND, "BJAddNewCard %d %d %d 98", true, cardType, cardIndex);
}
} else if (vecArgs[1] == "newcard") {
if (ch->GetBJMyCards().size() == 4)
return;
BYTE cardType = 0, cardIndex = 0;
FindNewCard(ch, false, cardType, cardIndex);
ch->AddBJCard(false, cardType, cardIndex);
ch->ChatPacket(CHAT_TYPE_COMMAND, "BJAddNewCard %d %d %d 97", false, cardType, cardIndex);
}
}
}