Advertisement
Slowhand-VI

gambling_roulette.fos

Aug 19th, 2015
285
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 14.41 KB | None | 0 0
  1. /**
  2.  *  Code for roulette gambling. Made for the basic FOnline development tutorial at fodev.net.
  3.  *  Author: Slowhand.
  4.  *  Reviewer: N/A
  5.  */
  6.  
  7. #include "gambling_h.fos"
  8.  
  9. #include "economy_h.fos"
  10. #include "_math.fos"
  11. #include "_vars.fos"
  12. #include "_macros.fos"
  13.  
  14. /** DIALOGUE FUNCTIONS
  15.  *
  16.  *  Functions called directly from dialogues, deamands or results.
  17.  *  - Signatures keep 2 Critter params and extra params if needed.
  18.  *  - Prefixes used depends on dialogue calls: result - "r_", demand - "d_", dialogue - "dlg_"
  19.  */
  20.  
  21. void r_ResetCasinoBet(Critter& player, Critter@ casinoHost)
  22. {
  23.     resetCasinoBet(player);
  24. }
  25.  
  26. void r_SetBetValue(Critter& player, Critter@ npc, int value)
  27. {
  28.     setBetValue(player, value);
  29. }
  30.  
  31. void r_SetBetType(Critter& player, Critter@ npc, int type)
  32. {
  33.     setBetType(player, type);
  34. }
  35.  
  36. void r_SetRouletteRoll(Critter& player, Critter@ npc, int roll)
  37. {
  38.     setRouletteRoll(player, roll);
  39. }
  40.  
  41. void r_SetBetProgress(Critter& player, Critter@ npc, int progress)
  42. {
  43.     setBetProgress(player, progress);
  44. }
  45.  
  46. /**< This is used to set the number the player bets on using the "Say" option in dialogue menu. */
  47. uint dlg_SetBetNumberUsingSay(Critter& player, Critter@ npc, string@ say)
  48. {
  49.     if(!IS_DIALOG_SAY_MODE(say))
  50.         return 0;
  51.  
  52.     /**< If the number the player enters is not in range, notify him and make him try again. */
  53.     int betNumber = 0;
  54.     if(!StrToInt(say, betNumber) || (betNumber < 0) || (betNumber > 36))
  55.     {
  56.         player.Say(SAY_DIALOG, "Please type a number between 0 and 36 in numeric format.");
  57.         return 0;
  58.     }
  59.  
  60.     setBetNumber(player, betNumber);
  61.     setBetProgress(player, GAMB_BET_PLACED);
  62.     player.Say(SAY_DIALOG, "You bet on " + betNumber + ".");
  63.     return FORCE_DIALOG_ROULETTE_BET_VALUE;
  64. }
  65.  
  66. /**< Rolls the winning number. Sets LVAR_gambling_bet_value to the amount won. (does not pay it) */
  67. void r_SpinTheRoulette(Critter& player, Critter@ casinoHost)
  68. {
  69.     int betType = getBetType(player);
  70.     int betValue = getBetValue(player);
  71.     int betProgress = getBetProgress(player);
  72.  
  73.     if (betType == GAMB_NO_BET || betValue == GAMB_NO_BET
  74.             || betProgress != GAMB_BET_PAYED)
  75.     {
  76.         resetCasinoBet(player);
  77.         return;
  78.     }
  79.  
  80.     SpinCasinoWheel(player);
  81.  
  82.     if (betType == GAMB_ROULETTE_BET_NUMBER)
  83.     {
  84.         DecideIfStraightBetWon(player, casinoHost);
  85.     }
  86.     if (betType == GAMB_ROULETTE_BET_RED)
  87.     {
  88.         DecideIfRedBetWon(player, casinoHost);
  89.     }
  90.     if (betType == GAMB_ROULETTE_BET_BLACK)
  91.     {
  92.         DecideIfBlackBetWon(player, casinoHost);
  93.     }
  94.     if (betType == GAMB_ROULETTE_BET_EVEN)
  95.     {
  96.         DecideIfEvenBetWon(player, casinoHost);
  97.     }
  98.     if (betType == GAMB_ROULETTE_BET_ODD)
  99.     {
  100.         DecideIfOddBetWon(player, casinoHost);
  101.     }
  102.     if (betType == GAMB_ROULETTE_BET_MANQUE)
  103.     {
  104.         DecideIfManqueBetWon(player, casinoHost);
  105.     }
  106.     if (betType == GAMB_ROULETTE_BET_PASSE)
  107.     {
  108.         DecideIfPasseBetWon(player, casinoHost);
  109.     }
  110. }
  111.  
  112. /**< Adds bet win value to players inventory.*/
  113. void r_PayWinnerBet(Critter& player, Critter@ casinoHost)
  114. {
  115.     int betValue = getBetValue(player);
  116.     int betProgress = getBetProgress(player);
  117.     if (betValue < 0)
  118.         return;
  119.     if (betProgress == GAMB_BET_WON)
  120.     {
  121.         BanksTransferToCritter(player, betValue, TRANSACTION_DEFAULT, false);
  122.     }
  123. }
  124.  
  125. /**< Used with Lexers to show current bet and the number rolled. */
  126. void dlg_ShowBetInfo(Critter& player, Critter@ npc, string@ text)
  127. {
  128.     if(!IS_DIALOG_GENERATED(text))
  129.         return;
  130.  
  131.     text += "$betValue" + getBetValue(player);
  132.     text += "$betType" + getBetTypeAsString(player);
  133.     text += "$rouletteRoll" + getRouletteRoll(player);
  134.     text += "$rollColor" + getRouletteNumberColorAsString(getRouletteNumberColor(getRouletteRoll(player)));
  135.     text += "$betProgress" + getBetProgress(player);
  136. }
  137.  
  138. /**< END OF: Dialogue Functions */
  139.  
  140.  
  141. /**< SETTERS */
  142.  
  143. void setBetValue(Critter& player, int value)
  144. {
  145.     if (!valid(player))
  146.         return;
  147.     GameVar@ betValue = GetLocalVar(LVAR_gambling_bet_value, player.Id);
  148.     if (!valid(betValue))
  149.             return;
  150.     betValue = value;
  151. }
  152.  
  153. void setBetType(Critter& player, int type)
  154. {
  155.     if (!valid(player))
  156.         return;
  157.     GameVar@ betType = GetLocalVar(LVAR_gambling_bet_type, player.Id);
  158.     if (!valid(betType))
  159.             return;
  160.     betType = type;
  161. }
  162.  
  163. void setBetNumber(Critter& player, int number)
  164. {
  165.     if (!valid(player))
  166.         return;
  167.     GameVar@ betNumber = GetLocalVar(LVAR_gambling_bet_number, player.Id);
  168.     if (!valid(betNumber))
  169.             return;
  170.     betNumber = number;
  171. }
  172.  
  173. void setRouletteRoll(Critter& player, int roll)
  174. {
  175.     if (!valid(player))
  176.         return;
  177.     GameVar@ rouletteRoll = GetLocalVar(LVAR_gambling_roulette_roll, player.Id);
  178.     if (!valid(rouletteRoll))
  179.             return;
  180.     rouletteRoll = roll;
  181. }
  182.  
  183. void setBetProgress(Critter& player, int progress)
  184. {
  185.     if (!valid(player))
  186.         return;
  187.     GameVar@ betProgress = GetLocalVar(LVAR_gambling_bet_progress, player.Id);
  188.     if (!valid(betProgress))
  189.             return;
  190.     betProgress = progress;
  191. }
  192.  
  193. /**< END OF: Setters */
  194.  
  195.  
  196. /**< GETTERS */
  197.  
  198. int getBetValue(Critter& player)
  199. {
  200.     if (!valid(player))
  201.         return 0;
  202.     GameVar@ betValue = GetLocalVar(LVAR_gambling_bet_value, player.Id);
  203.     if (!valid(betValue))
  204.             return 0;
  205.     return betValue.GetValue();
  206. }
  207.  
  208. int getBetType(Critter& player)
  209. {
  210.     if (!valid(player))
  211.         return 0;
  212.     GameVar@ betType = GetLocalVar(LVAR_gambling_bet_type, player.Id);
  213.     if (!valid(betType))
  214.             return 0;
  215.     return betType.GetValue();
  216. }
  217.  
  218. int getBetNumber(Critter& player)
  219. {
  220.     if (!valid(player))
  221.         return 0;
  222.     GameVar@ betNumber = GetLocalVar(LVAR_gambling_bet_number, player.Id);
  223.     if (!valid(betNumber))
  224.             return 0;
  225.     return betNumber.GetValue();
  226. }
  227.  
  228. int getRouletteRoll(Critter& player)
  229. {
  230.     if (!valid(player))
  231.         return 0;
  232.     GameVar@ rouletteRoll = GetLocalVar(LVAR_gambling_roulette_roll, player.Id);
  233.     if (!valid(rouletteRoll))
  234.             return 0;
  235.     return rouletteRoll.GetValue();
  236. }
  237.  
  238. int getBetProgress(Critter& player)
  239. {
  240.     if (!valid(player))
  241.         return 0;
  242.     GameVar@ betProgress = GetLocalVar(LVAR_gambling_bet_progress, player.Id);
  243.     if (!valid(betProgress))
  244.             return 0;
  245.     return betProgress.GetValue();
  246. }
  247.  
  248. /**< END OF: Setters */
  249.  
  250.  
  251. /**< INIT */
  252.  
  253. void resetCasinoBet(Critter& player)
  254. {
  255.     setBetValue(player, GAMB_NO_BET);
  256.     setBetType(player, GAMB_NO_BET);
  257.     setBetNumber(player, GAMB_NO_BET);
  258.     setRouletteRoll(player, GAMB_NO_BET);
  259.     setBetProgress(player, GAMB_NO_BET);
  260. }
  261.  
  262. /**< END OF: Init */
  263.  
  264.  
  265. /**< CASINO LOGIC */
  266.  
  267. void DecideIfStraightBetWon(Critter& player, Critter@ casinoHost)
  268. {
  269.     int betNumber = getBetNumber(player);
  270.     if (betNumber == getRouletteRoll(player))
  271.     {
  272.         if (isRerollNeeded(player, casinoHost))
  273.         {
  274.             SpinCasinoWheel(player);
  275.             if (betNumber == getRouletteRoll(player))
  276.             {
  277.                 RouletteNumberWin(player);
  278.             }
  279.             else
  280.             {
  281.                 RouletteLost(player);
  282.             }
  283.         }
  284.         else
  285.         {
  286.             RouletteNumberWin(player);
  287.         }
  288.     }
  289.     else
  290.     {
  291.         RouletteLost(player);
  292.     }
  293. }
  294.  
  295. void DecideIfRedBetWon(Critter& player, Critter@ casinoHost)
  296. {
  297.     if (getRouletteNumberColor(getRouletteRoll(player)) == GAMB_ROULETTE_COLOR_RED)
  298.     {
  299.         if (isRerollNeeded(player, casinoHost))
  300.         {
  301.             SpinCasinoWheel(player);
  302.             if (getRouletteNumberColor(getRouletteRoll(player)) == GAMB_ROULETTE_COLOR_RED)
  303.             {
  304.                 RouletteDoubleWin(player);
  305.             }
  306.             else
  307.             {
  308.                 RouletteLost(player);
  309.             }
  310.         }
  311.         else
  312.         {
  313.             RouletteDoubleWin(player);
  314.         }
  315.     }
  316.     else
  317.     {
  318.         RouletteLost(player);
  319.     }
  320. }
  321.  
  322. void DecideIfBlackBetWon(Critter& player, Critter@ casinoHost)
  323. {
  324.     if (getRouletteNumberColor(getRouletteRoll(player)) == GAMB_ROULETTE_COLOR_BLACK)
  325.     {
  326.         if (isRerollNeeded(player, casinoHost))
  327.         {
  328.             SpinCasinoWheel(player);
  329.             if (getRouletteNumberColor(getRouletteRoll(player)) == GAMB_ROULETTE_COLOR_BLACK)
  330.             {
  331.                 RouletteDoubleWin(player);
  332.             }
  333.             else
  334.             {
  335.                 RouletteLost(player);
  336.             }
  337.         }
  338.         else
  339.         {
  340.             RouletteDoubleWin(player);
  341.         }
  342.     }
  343.     else
  344.     {
  345.         RouletteLost(player);
  346.     }
  347. }
  348.  
  349. void DecideIfOddBetWon(Critter& player, Critter@ casinoHost)
  350. {
  351.     if (isOdd(getRouletteRoll(player)))
  352.     {
  353.         if (isRerollNeeded(player, casinoHost))
  354.         {
  355.             SpinCasinoWheel(player);
  356.             if (isOdd(getRouletteRoll(player)))
  357.             {
  358.                 RouletteDoubleWin(player);
  359.             }
  360.             else
  361.             {
  362.                 RouletteLost(player);
  363.             }
  364.         }
  365.         else
  366.         {
  367.             RouletteDoubleWin(player);
  368.         }
  369.     }
  370.     else
  371.     {
  372.         RouletteLost(player);
  373.     }
  374. }
  375.  
  376. void DecideIfEvenBetWon(Critter& player, Critter@ casinoHost)
  377. {
  378.     if (isEven(getRouletteRoll(player)))
  379.     {
  380.         if (isRerollNeeded(player, casinoHost))
  381.         {
  382.             SpinCasinoWheel(player);
  383.             if (isEven(getRouletteRoll(player)))
  384.             {
  385.                 RouletteDoubleWin(player);
  386.             }
  387.             else
  388.             {
  389.                 RouletteLost(player);
  390.             }
  391.         }
  392.         else
  393.         {
  394.             RouletteDoubleWin(player);
  395.         }
  396.     }
  397.     else
  398.     {
  399.         RouletteLost(player);
  400.     }
  401. }
  402.  
  403. void DecideIfManqueBetWon(Critter& player, Critter@ casinoHost)
  404. {
  405.     if (isManque(getRouletteRoll(player)))
  406.     {
  407.         if (isRerollNeeded(player, casinoHost))
  408.         {
  409.             SpinCasinoWheel(player);
  410.             if (isManque(getRouletteRoll(player)))
  411.             {
  412.                 RouletteDoubleWin(player);
  413.             }
  414.             else
  415.             {
  416.                 RouletteLost(player);
  417.             }
  418.         }
  419.         else
  420.         {
  421.             RouletteDoubleWin(player);
  422.         }
  423.     }
  424.     else
  425.     {
  426.         RouletteLost(player);
  427.     }
  428. }
  429.  
  430. void DecideIfPasseBetWon(Critter& player, Critter@ casinoHost)
  431. {
  432.     if (isPasse(getRouletteRoll(player)))
  433.     {
  434.         if (isRerollNeeded(player, casinoHost))
  435.         {
  436.             SpinCasinoWheel(player);
  437.             if (isPasse(getRouletteRoll(player)))
  438.             {
  439.                 RouletteDoubleWin(player);
  440.             }
  441.             else
  442.             {
  443.                 RouletteLost(player);
  444.             }
  445.         }
  446.         else
  447.         {
  448.             RouletteDoubleWin(player);
  449.         }
  450.     }
  451.     else
  452.     {
  453.         RouletteLost(player);
  454.     }
  455. }
  456.  
  457. void SpinCasinoWheel(Critter& player)
  458. {
  459.     int roll = Random(0, 36);
  460.     setRouletteRoll(player, roll);
  461. }
  462.  
  463. /**< Decides if a re-roll is needed based on player and casino host gambling difference. */
  464. /**< If player gambling skill is higher or equal to casino host skill, then there is no extra difficulty in winning. */
  465. bool isRerollNeeded(Critter& player, Critter@ casinoHost)
  466. {
  467.     if (!valid(player) || !valid(casinoHost))
  468.         return false;
  469.  
  470.     int gamblingDisadvantage = CLAMP(casinoHost.Skill[SK_GAMBLING] - player.Skill[SK_GAMBLING], 0, 100);
  471.     if (Random(1, 100) <= gamblingDisadvantage)
  472.     {
  473.         return true;
  474.     }
  475.     else
  476.     {
  477.         return false;
  478.     }
  479. }
  480.  
  481. int getRouletteNumberColor(int number)
  482. {
  483.     array <int> red = {1, 3, 5, 7, 9, 12, 14, 16, 18, 21, 23, 25, 27, 28, 30, 32, 34, 36};
  484.     if (number < 0 || number > 36)
  485.         return GAMB_ROULETTE_COLOR_NONE;
  486.     if (number == 0)
  487.         return GAMB_ROULETTE_COLOR_GREEN;
  488.     for (int i = 0; i < 18; i++)
  489.     {
  490.         if (red[i] == number)
  491.             return GAMB_ROULETTE_COLOR_RED;
  492.     }
  493.     return GAMB_ROULETTE_COLOR_BLACK;
  494. }
  495.  
  496. void RouletteLost(Critter& player)
  497. {
  498.     setBetProgress(player, GAMB_BET_LOST);
  499. }
  500.  
  501. void RouletteNumberWin(Critter& player)
  502. {
  503.     setBetValue(player, getBetValue(player) * 35);
  504.     setBetProgress(player, GAMB_BET_WON);
  505. }
  506.  
  507. void RouletteDoubleWin(Critter& player)
  508. {
  509.     setBetValue(player, getBetValue(player) * 2);
  510.     setBetProgress(player, GAMB_BET_WON);
  511. }
  512.  
  513. /**< END OF: Casino Logic */
  514.  
  515.  
  516. /**< AUX */
  517.  
  518. bool isOdd(int number)
  519. {
  520.     if (number <= 0 || number > 36)
  521.         return false;
  522.  
  523.     if (number % 2 != 0)
  524.     {
  525.         return true;
  526.     }
  527.     else
  528.     {
  529.         return false;
  530.     }
  531. }
  532.  
  533. bool isEven(int number)
  534. {
  535.     if (number <= 0 || number > 36)
  536.         return false;
  537.  
  538.     if (number % 2 == 0)
  539.     {
  540.         return true;
  541.     }
  542.     else
  543.     {
  544.         return false;
  545.     }
  546. }
  547.  
  548. bool isManque(int number)
  549. {
  550.     if (number <= 0 || number > 36)
  551.         return false;
  552.  
  553.     if (number <= 18)
  554.     {
  555.         return true;
  556.     }
  557.     else
  558.     {
  559.         return false;
  560.     }
  561. }
  562.  
  563. bool isPasse(int number)
  564. {
  565.     if (number <= 0 || number > 36)
  566.         return false;
  567.  
  568.     if (number > 18)
  569.     {
  570.         return true;
  571.     }
  572.     else
  573.     {
  574.         return false;
  575.     }
  576. }
  577.  
  578. string getBetTypeAsString(Critter& player)
  579. {
  580.     string retValue = "";
  581.     int betType = getBetType(player);
  582.     if (betType == GAMB_ROULETTE_BET_NUMBER)
  583.     {
  584.         retValue ="" + getBetNumber(player);
  585.     }
  586.     if (betType == GAMB_ROULETTE_BET_RED)
  587.     {
  588.         retValue ="red";
  589.     }
  590.     if (betType == GAMB_ROULETTE_BET_BLACK)
  591.     {
  592.         retValue ="black";
  593.     }
  594.     if (betType == GAMB_ROULETTE_BET_ODD)
  595.     {
  596.         retValue ="odd";
  597.     }
  598.     if (betType == GAMB_ROULETTE_BET_EVEN)
  599.     {
  600.         retValue ="even";
  601.     }
  602.     if (betType == GAMB_ROULETTE_BET_MANQUE)
  603.     {
  604.         retValue ="manque";
  605.     }
  606.     if (betType == GAMB_ROULETTE_BET_PASSE)
  607.     {
  608.         retValue ="passe";
  609.     }
  610.     return retValue;
  611. }
  612.  
  613. string getRouletteNumberColorAsString(int colorValue)
  614. {
  615.     string retValue = "";
  616.     if (colorValue == GAMB_ROULETTE_COLOR_RED)
  617.     {
  618.         retValue = "red";
  619.     }
  620.     if (colorValue == GAMB_ROULETTE_COLOR_BLACK)
  621.     {
  622.         retValue = "black";
  623.     }
  624.     if (colorValue == GAMB_ROULETTE_COLOR_GREEN)
  625.     {
  626.         retValue = "green";
  627.     }
  628.     return retValue;
  629. }
  630.  
  631. /**< END OF: AUX */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement