HLMOD.HU Forrás Megtekintés - www.hlmod.hu
  1.  
  2. #include <amxmodx>
  3. #include <amxmisc>
  4. #include <fakemeta>
  5.  
  6. #define PLUGIN "VideoPoker"
  7. #define AUTHOR "Albernaz o Carniceiro Demoniaco"
  8. #define VERSION "1.4"
  9.  
  10. new const CFG_FILENAME[] = "videopoker.ini";
  11. new const CFG_DICTIONARY[] = "videopoker.txt";
  12.  
  13. const CFG_MAX_PARAM_SIZE = 50;
  14. new CFG_SITE_URL[CFG_MAX_PARAM_SIZE];
  15. new CFG_CARD_PATH[CFG_MAX_PARAM_SIZE];
  16. new CFG_IMAGES_PATH[CFG_MAX_PARAM_SIZE];
  17.  
  18. new CARD_ACTIONS_ML[][] = {"VP_DISCARD","VP_HOLD"}
  19.  
  20. enum CVARS_LIST
  21. {
  22. BET_VALUE_MIN,
  23. CHAT_MESSAGES, // Chat messages announcing the results of the games played
  24. ENABLED, // 0 - game disabled , 1 - game enabled(Bad load of the cfg file sets it to 0
  25. START_METHOD // 0 - command videopoker, 1 - command say videopoker, 2 - both (Needs restart)
  26. }
  27.  
  28. new CVARS[CVARS_LIST];
  29. new CVARS_MIN[CVARS_LIST];
  30. new CVARS_MAX[CVARS_LIST];
  31.  
  32. const N_CARDS_PER_SUIT = 13;
  33. const N_SUITS = 4;
  34.  
  35. new cardFiguresNames[N_CARDS_PER_SUIT][] = { "Asz" , "Kettes", "Harmas", "Negyes", "Otos" , "Hatos", "Hetes", "Nyolcas", "Kilences", "Tizes", "Bubi","Dama","Kiraly" } ;
  36. new cardSuitNames[N_SUITS][] = { "Kor" ,"Karo","Treff","Pikk"};
  37.  
  38. enum CARD
  39. {
  40. SUIT,
  41. VALUE,
  42. ID
  43. }
  44.  
  45. const N_IDS = 33;
  46. const N_CARDS = 52;
  47.  
  48. new decks[N_IDS][N_CARDS][CARD];
  49. new decksCount[N_IDS];
  50.  
  51. const PER_PLAYER_MAX_CARDS = 5;
  52.  
  53. new bool:holdCard[N_IDS][PER_PLAYER_MAX_CARDS]
  54.  
  55. new decksPlayers[N_IDS][PER_PLAYER_MAX_CARDS][CARD];
  56. new decksPlayersCount[N_IDS];
  57.  
  58. new betValues[N_IDS];
  59.  
  60. new inGame[N_IDS];
  61. new gameOver[N_IDS];
  62.  
  63. enum GAME_RESULT
  64. {
  65. LOSE,
  66. PAIR_OF_JACKS_OR_BETTER,
  67. TWO_PAIRS,
  68. THREE_OF_A_KIND,
  69. STRAIGHT,
  70. FLUSH,
  71. FULL_HOUSE,
  72. FOUR_OF_A_KIND,
  73. STRAIGHT_FLUSH,
  74. ROYAL_FLUSH
  75. }
  76.  
  77. enum GAME_VALUES
  78. {
  79. ACE,
  80. TWO,
  81. THREE,
  82. FOUR,
  83. FIVE,
  84. SIX,
  85. SEVEN,
  86. EIGHT,
  87. NINE,
  88. TEN,
  89. JACK,
  90. QUEEN,
  91. KING
  92. }
  93.  
  94. enum GAME_SUITS
  95. {
  96. HEARTS,
  97. DIAMONDS,
  98. CLUBS,
  99. SPADES
  100. }
  101.  
  102. enum GAME_DATA
  103. {
  104. PAIRS,
  105. TRIPLES,
  106. FOURTUPLE,
  107. SUITS,
  108. PAIR_VALUE
  109. }
  110.  
  111. new GAME_RESULTS_TEXT[GAME_RESULT][] = {"","VP_PAIR_OF_JACKS_OR_BETTER","VP_TWO_PAIRS","VP_THREE_OF_A_KIND","VP_STRAIGHT","VP_FLUSH","VP_FULL_HOUSE","VP_FOUR_OF_A_KIND","VP_STRAIGHT_FLUSH","VP_ROYAL_FLUSH"};
  112.  
  113. new MONEY_MULTIPLY[GAME_RESULT] = {0,1,2,3,4,5,6,7,8,9}
  114.  
  115. #define OFFSET_CSMONEY 115
  116.  
  117. fm_get_user_money(index)
  118. {
  119. return get_pdata_int(index, OFFSET_CSMONEY);
  120. }
  121.  
  122. fm_set_user_money(index, money, flash = 1)
  123. {
  124. set_pdata_int(index, OFFSET_CSMONEY, money);
  125.  
  126. message_begin(MSG_ONE, get_user_msgid("Money"), {0,0,0}, index);
  127. write_long(money);
  128. write_byte(flash ? 1 : 0);
  129. message_end();
  130. }
  131.  
  132. public plugin_cfg()
  133. {
  134. handleConfigFile();
  135. }
  136. public plugin_init()
  137. {
  138. register_plugin(PLUGIN, VERSION, AUTHOR)
  139.  
  140. register_dictionary(CFG_DICTIONARY);
  141.  
  142. handleCvars();
  143.  
  144. switch(getCvar(START_METHOD))
  145. {
  146. case 0:
  147. {
  148. register_clcmd("videopoker","showMenuVideoPoker");
  149. }
  150. case 1:
  151. {
  152. register_clcmd("say videopoker","showMenuVideoPoker");
  153. }
  154. case 2:
  155. {
  156. register_clcmd("videopoker","showMenuVideoPoker");
  157. register_clcmd("say videopoker","showMenuVideoPoker");
  158. }
  159. }
  160. }
  161. handleCvars()
  162. {
  163. CVARS[BET_VALUE_MIN] = register_cvar("vp_min_bet_val", "100");
  164. CVARS[CHAT_MESSAGES] = register_cvar("vp_chat_msgs", "1");
  165. CVARS[ENABLED] = register_cvar("vp_enabled", "1", FCVAR_SERVER);
  166. CVARS[START_METHOD] = register_cvar("vp_start_method", "2")
  167.  
  168. CVARS_MIN[BET_VALUE_MIN] = 100;
  169. CVARS_MIN[CHAT_MESSAGES] = 0;
  170. CVARS_MIN[ENABLED] = 0;
  171. CVARS_MIN[START_METHOD] = 0;
  172.  
  173. CVARS_MAX[BET_VALUE_MIN] = 100000;
  174. CVARS_MAX[CHAT_MESSAGES] = 1;
  175. CVARS_MAX[ENABLED] = 1;
  176. CVARS_MAX[START_METHOD] = 2;
  177. }
  178. handleConfigFile()
  179. {
  180. const configsDirLastIndex = 49;
  181. new configsDir[configsDirLastIndex+1];
  182.  
  183. get_configsdir(configsDir,configsDirLastIndex);
  184.  
  185. const fileNameLastIndex = configsDirLastIndex + 15;
  186. new fileName[fileNameLastIndex+1];
  187.  
  188. format(fileName,fileNameLastIndex,"%s/%s",configsDir,CFG_FILENAME);
  189.  
  190. new sucess = 0;
  191.  
  192. if(file_exists(fileName))
  193. {
  194. new file = fopen(fileName,"r");
  195.  
  196. if( !feof(file) )
  197. {
  198. fgets (file, CFG_SITE_URL, CFG_MAX_PARAM_SIZE-1);
  199. sucess = 1;
  200. }
  201.  
  202. if( !feof(file) )
  203. fgets (file, CFG_CARD_PATH, CFG_MAX_PARAM_SIZE-1);
  204. else
  205. format(CFG_CARD_PATH,CFG_MAX_PARAM_SIZE-1,"");
  206.  
  207. if( !feof(file) )
  208. fgets (file, CFG_IMAGES_PATH, CFG_MAX_PARAM_SIZE-1);
  209. else
  210. format(CFG_IMAGES_PATH,CFG_MAX_PARAM_SIZE-1,"");
  211.  
  212. }
  213.  
  214. set_pcvar_num(CVARS[ENABLED],sucess);
  215.  
  216. }
  217. getCvar(CVARS_LIST:CVAR)
  218. {
  219. new cvarValue = get_pcvar_num(CVARS[CVAR]);
  220.  
  221. if(cvarValue < CVARS_MIN[CVAR])
  222. cvarValue = CVARS_MIN[CVAR];
  223.  
  224. else if(cvarValue > CVARS_MAX[CVAR])
  225. cvarValue = CVARS_MAX[CVAR];
  226.  
  227. set_pcvar_num(CVARS[CVAR],cvarValue);
  228.  
  229. return cvarValue;
  230. }
  231. motdShowTable(id)
  232. {
  233. const motdLast = 1299;
  234. new motd[motdLast+1];
  235.  
  236. const styleLast = 299;
  237. new style[styleLast+1];
  238.  
  239. format(style,styleLast,"<style>body{padding-top:5%%;font-family:Verdana, Arial, Helvetica, sans-serif;background-image: url('%s%sbackground.png'); text-align:center; width:60%%;margin:auto;margin-top:2%%;}.pi{padding:2%%;font-size:11px;}.m{padding:3%%;}.c{display:inline;}</style>",CFG_SITE_URL,CFG_IMAGES_PATH);
  240.  
  241. format(motd,motdLast,"%s",style);
  242.  
  243. format(motd,motdLast,"%s%s",motd,"<div'>");
  244.  
  245. for(new i=0; i< decksPlayersCount[id]; i++)
  246. {
  247. format(motd,motdLast,"%s<div class='c'><img src='%s%s%sOf%s.png'></div>",motd,CFG_SITE_URL,CFG_CARD_PATH,cardFiguresNames[ decksPlayers[id][i][ID]], cardSuitNames[ decksPlayers[id][i][SUIT] ]);
  248. }
  249.  
  250. format(motd,motdLast,"%s%s",motd,"</div>");
  251.  
  252. format(motd,motdLast,"%s%s",motd,"<div class='m'> ");
  253.  
  254. const MSG_LAST_INDEX= 50;
  255. new msg[MSG_LAST_INDEX+1];
  256.  
  257. if(gameOver[id])
  258. {
  259. new GAME_RESULT:gameResult = getGameResult(id)
  260.  
  261. switch(gameResult)
  262. {
  263. case LOSE:
  264. {
  265. format(msg,MSG_LAST_INDEX,"%L",id,"VP_MSG_MOTD_LOST");
  266. }
  267. default:
  268. {
  269. format(msg,MSG_LAST_INDEX,"%L (%L)",id,"VP_MSG_MOTD_WIN",id,GAME_RESULTS_TEXT[gameResult]);
  270. }
  271. }
  272. }
  273.  
  274. format(motd,motdLast,"%s%s",motd,msg);
  275.  
  276. format(motd,motdLast,"%s%s",motd,"</div>");
  277.  
  278.  
  279. show_motd(id,motd);
  280. }
  281.  
  282.  
  283. renewDeck(deck[N_CARDS][CARD],&count)
  284. {
  285. count = 0;
  286.  
  287. for(new i=0;i<N_SUITS;i++)
  288. {
  289. new j;
  290. new newCard[CARD];
  291.  
  292. newCard[SUIT] = i;
  293. newCard[ID] = 0;
  294. newCard[VALUE] = 14;
  295.  
  296. deck[count++] = newCard;
  297.  
  298. for(j=1;j<=12;j++)
  299. {
  300. new newCard[CARD];
  301.  
  302. newCard[SUIT] = i;
  303. newCard[ID] = j;
  304. newCard[VALUE] = j+1;
  305. deck[count++] = newCard;
  306. }
  307. }
  308.  
  309. }
  310.  
  311. public showMenuVideoPoker(id)
  312. {
  313. if(getCvar(ENABLED))
  314. {
  315. if(!inGame[id] && !gameOver[id])
  316. {
  317. showMenuStart(id);
  318. }
  319. else if(gameOver[id])
  320. {
  321. showMenuGameOver(id);
  322. }
  323. else if(inGame[id])
  324. {
  325. showMenuInGame(id);
  326. }
  327. }
  328. return PLUGIN_CONTINUE;
  329. }
  330. public showMenuGameOver(id)
  331. {
  332. new menu = menu_create("","handleMenuGameOver");
  333.  
  334. const TITLE_LAST_INDEX = 60 + CFG_MAX_PARAM_SIZE;
  335. new fullTitle[TITLE_LAST_INDEX+1];
  336.  
  337. format(fullTitle,TITLE_LAST_INDEX,"%L^n^n",id,"VP_TITLE_MENU");
  338.  
  339. const MSG_LAST_INDEX = 60;
  340. new msg[MSG_LAST_INDEX+1];
  341.  
  342. new GAME_RESULT:gameResult = getGameResult(id)
  343.  
  344. switch (gameResult)
  345. {
  346. case 0:
  347. {
  348. format(msg,MSG_LAST_INDEX,"%L",id,"VP_MSG_MENU_LOST",betValues[id]);
  349. }
  350. default:
  351. {
  352. format(msg,MSG_LAST_INDEX,"%L (%L)",id,"VP_MSG_MENU_WIN",betValues[id]*MONEY_MULTIPLY[gameResult],id,GAME_RESULTS_TEXT[gameResult]);
  353. }
  354. }
  355.  
  356. format(fullTitle,TITLE_LAST_INDEX,"%s%s",fullTitle,msg);
  357.  
  358. menu_setprop(menu,MPROP_TITLE,fullTitle);
  359.  
  360. new exitML[10]
  361. format(exitML,9,"\r%L",id,"VP_MSG_MENU_EXIT");
  362.  
  363. menu_setprop(menu, MPROP_EXITNAME, exitML);
  364.  
  365. const SHOW_TABLE_LAST_INDEX = 15;
  366. new showTable[SHOW_TABLE_LAST_INDEX+1];
  367.  
  368. format(showTable,SHOW_TABLE_LAST_INDEX,"%L",id,"VP_MSG_MENU_SHOW_TABLE");
  369.  
  370. const NEW_GAME_LAST_INDEX = 15;
  371. new newGame[NEW_GAME_LAST_INDEX+1];
  372.  
  373. format(newGame,NEW_GAME_LAST_INDEX,"%L",id,"VP_MSG_MENU_NEW_GAME");
  374.  
  375. menu_additem(menu, showTable,"1");
  376. menu_additem(menu, newGame,"2");
  377.  
  378. menu_display(id,menu,0);
  379. }
  380. public handleMenuGameOver(id , menu , item)
  381. {
  382. if( item < 0 )
  383. return PLUGIN_CONTINUE;
  384.  
  385. new access, callback;
  386.  
  387. new actionString[2];
  388. menu_item_getinfo(menu,item,access, actionString ,2,_,_, callback);
  389. new action = str_to_num(actionString);
  390.  
  391. switch(action)
  392. {
  393. case 1:
  394. {
  395. showMenuGameOver(id);
  396. motdShowTable(id);
  397. }
  398. case 2:
  399. {
  400. doReset(id);
  401. showMenuStart(id);
  402. }
  403. }
  404.  
  405. return PLUGIN_HANDLED;
  406. }
  407. public showMenuInGame(id)
  408. {
  409. new menu = menu_create("","handleMenuInGame");
  410.  
  411. const TITLE_LAST_INDEX = CFG_MAX_PARAM_SIZE + 1;
  412.  
  413. new title[TITLE_LAST_INDEX+1];
  414.  
  415. format(title,TITLE_LAST_INDEX,"%L^n^n",id,"VP_TITLE_MENU");
  416.  
  417. menu_setprop(menu,MPROP_TITLE,title);
  418.  
  419. new exitML[10]
  420. format(exitML,9,"\r%L",id,"VP_MSG_MENU_EXIT");
  421.  
  422. menu_setprop(menu, MPROP_EXITNAME, exitML);
  423.  
  424. new cardFigureName[20];
  425. new cardSuitName[20]
  426.  
  427. new ML_FIGURE_NAME[24]
  428. new ML_SUIT_NAME[24]
  429.  
  430. const cardTextLen = sizeof cardFigureName + 1 + 5 + 1 + sizeof cardSuitName + 1 + 4 + 20;
  431. new cardText[cardTextLen]
  432.  
  433. new actionString[] = "1"
  434.  
  435. for(new i=0;i<PER_PLAYER_MAX_CARDS;i++)
  436. {
  437. format(cardFigureName,19,cardFiguresNames[decksPlayers[id][i][ID]]);
  438. format(cardSuitName,19,cardSuitNames[decksPlayers[id][i][SUIT]]);
  439.  
  440. strtoupper(cardFigureName);
  441. strtoupper(cardSuitName);
  442.  
  443. format(ML_FIGURE_NAME,23,"VP_FIGURE_NAME_%s",cardFigureName);
  444. format(ML_SUIT_NAME,23,"VP_SUIT_NAME_%s",cardSuitName);
  445.  
  446. new hold = _:holdCard[id][i]
  447.  
  448. format(cardText,cardTextLen-1,"%L %L %L (^"%s%L\w^")",id,ML_FIGURE_NAME,id,"VP_FIGURE_SUIT_CONNECTOR",id,ML_SUIT_NAME,(hold ? "\y":"\r"),id,CARD_ACTIONS_ML[hold]);
  449.  
  450. menu_additem(menu,cardText,actionString);
  451.  
  452. actionString[0]++;
  453. }
  454.  
  455. menu_addtext(menu,"",0);
  456.  
  457. const SHOW_TABLE_LAST_INDEX = 15;
  458. new showTable[SHOW_TABLE_LAST_INDEX+1];
  459.  
  460. format(showTable,SHOW_TABLE_LAST_INDEX,"%L",id,"VP_MSG_MENU_SHOW_TABLE")
  461.  
  462. const PROCEED_LAST_INDEX = 20;
  463. new stopText[PROCEED_LAST_INDEX+1];
  464.  
  465. format(stopText,PROCEED_LAST_INDEX,"%L",id,"VP_MSG_MENU_PROCEED");
  466.  
  467. menu_additem(menu, showTable,"6");
  468.  
  469. menu_additem(menu, stopText,"7");
  470.  
  471. menu_display(id,menu,0);
  472.  
  473.  
  474. return PLUGIN_CONTINUE;
  475. }
  476. public handleMenuInGame(id , menu , item)
  477. {
  478. if( item < 0 )
  479. return PLUGIN_CONTINUE;
  480.  
  481. new access, callback;
  482.  
  483. new actionString[2];
  484. menu_item_getinfo(menu,item,access, actionString ,2,_,_, callback);
  485. new action = str_to_num(actionString);
  486.  
  487. switch(action)
  488. {
  489. case 1..5:
  490. {
  491. holdCard[id][action-1] = !holdCard[id][action-1]
  492. showMenuInGame(id);
  493. }
  494. case 6:
  495. {
  496. showMenuInGame(id);
  497. motdShowTable(id);
  498. }
  499. case 7:
  500. {
  501. stop(id);
  502. showMenuVideoPoker(id);
  503. motdShowTable(id);
  504. }
  505. }
  506.  
  507. return PLUGIN_HANDLED;
  508. }
  509. public showMenuStart(id)
  510. {
  511. new menu = menu_create("","handleMenuStart");
  512.  
  513. const TITLE_LAST_INDEX = 30 + CFG_MAX_PARAM_SIZE;
  514. new titleFull[TITLE_LAST_INDEX+1];
  515.  
  516. format(titleFull,TITLE_LAST_INDEX,"%L^n^n",id,"VP_TITLE_MENU");
  517.  
  518. new cvarBetValueMin = getCvar(BET_VALUE_MIN);
  519.  
  520. menu_setprop(menu,MPROP_PERPAGE,7);
  521.  
  522. if(fm_get_user_money(id) < cvarBetValueMin)
  523. {
  524. format(titleFull,TITLE_LAST_INDEX,"%L",id,"VP_MSG_MENU_WARN_MIN_BET",cvarBetValueMin);
  525.  
  526. new exitML[10]
  527. format(exitML,9,"\r%L",id,"VP_MSG_MENU_EXIT");
  528.  
  529. menu_additem(menu,exitML,"0");
  530. menu_setprop(menu,MPROP_EXIT,MEXIT_NEVER);
  531. }
  532. else
  533. {
  534. if(betValues[id] < cvarBetValueMin)
  535. betValues[id] = cvarBetValueMin;
  536.  
  537. if(betValues[id] > fm_get_user_money(id))
  538. betValues[id] = fm_get_user_money(id);
  539.  
  540. format(titleFull,TITLE_LAST_INDEX,"%s%L",titleFull,id,"VP_MSG_MENU_BET_VALUE",betValues[id]);
  541.  
  542. const RAISE_BET_LAST_INDEX = 30;
  543. const DOWN_BET_LAST_INDEX = 30;
  544. const BET_ALL_LAST_INDEX = 15;
  545. const START_GAME_LAST_INDEX = 15;
  546.  
  547. new raiseBet[RAISE_BET_LAST_INDEX+1];
  548. new downBet[DOWN_BET_LAST_INDEX+1];
  549. new betAll[BET_ALL_LAST_INDEX+1];
  550. new startGameText[START_GAME_LAST_INDEX+1];
  551.  
  552. format(betAll,BET_ALL_LAST_INDEX,"%L",id,"VP_MSG_MENU_BET_ALL");
  553.  
  554. format(startGameText,START_GAME_LAST_INDEX,"%L",id,"VP_MSG_MENU_START");
  555.  
  556. format(raiseBet,RAISE_BET_LAST_INDEX,"%L",id,"VP_MSG_MENU_RAISE_BET",100);
  557. format(downBet,DOWN_BET_LAST_INDEX,"%L",id,"VP_MSG_MENU_DOWN_BET",100);
  558.  
  559. menu_additem(menu, raiseBet,"1");
  560. menu_additem(menu, downBet,"2");
  561. menu_addtext(menu, "",0);
  562.  
  563. format(raiseBet,RAISE_BET_LAST_INDEX,"%L",id,"VP_MSG_MENU_RAISE_BET",1000);
  564. format(downBet,DOWN_BET_LAST_INDEX,"%L",id,"VP_MSG_MENU_DOWN_BET",1000);
  565.  
  566. menu_additem(menu, raiseBet,"3");
  567. menu_additem(menu, downBet,"4");
  568. menu_addtext(menu, "",0);
  569. menu_additem(menu, betAll,"5");
  570. menu_addtext(menu, "^n",0);
  571. menu_additem(menu, startGameText,"6");
  572. menu_addtext(menu,"",1);
  573.  
  574. }
  575. menu_setprop(menu,MPROP_BACKNAME,"");
  576. menu_setprop(menu,MPROP_NEXTNAME,"");
  577.  
  578. menu_setprop(menu,MPROP_TITLE,titleFull);
  579.  
  580.  
  581. new exitML[10]
  582. format(exitML,9,"\r%L",id,"VP_MSG_MENU_EXIT");
  583.  
  584. menu_setprop(menu, MPROP_EXITNAME, exitML);
  585.  
  586. menu_display(id,menu,0);
  587.  
  588.  
  589. return PLUGIN_CONTINUE;
  590. }
  591. public handleMenuStart(id , menu , item)
  592. {
  593. if( item < 0 )
  594. return PLUGIN_CONTINUE;
  595.  
  596. new access, callback;
  597.  
  598. new actionString[2];
  599. menu_item_getinfo(menu,item,access, actionString ,2,_,_, callback);
  600. new action = str_to_num(actionString);
  601.  
  602. switch(action)
  603. {
  604. case 1:
  605. {
  606. betValues[id] += 100;
  607. showMenuStart(id)
  608. }
  609. case 2:
  610. {
  611. betValues[id] -= 100;
  612. showMenuStart(id)
  613. }
  614. case 3:
  615. {
  616. betValues[id] += 1000;
  617. showMenuStart(id)
  618. }
  619. case 4:
  620. {
  621. betValues[id] -= 1000;
  622. showMenuStart(id)
  623. }
  624. case 5:
  625. {
  626. betValues[id] = fm_get_user_money(id);
  627. showMenuStart(id)
  628. }
  629. case 6:
  630. {
  631. if(fm_get_user_money(id) < getCvar(BET_VALUE_MIN))
  632. {
  633. showMenuStart(id)
  634. }
  635. else
  636. {
  637. startGame(id);
  638. showMenuVideoPoker(id);
  639. motdShowTable(id);
  640. }
  641. }
  642. }
  643.  
  644. return PLUGIN_HANDLED;
  645. }
  646. getRandomCard(deck[N_CARDS][CARD],&count)
  647. {
  648. if(!count)
  649. renewDeck(deck,count);
  650.  
  651. new randIndex = random(count);
  652. new newCard[CARD];
  653.  
  654. newCard = deck[randIndex];
  655.  
  656. deck[randIndex] = deck[--count];
  657.  
  658. return newCard;
  659. }
  660.  
  661. givePlayerCard(deck[N_CARDS][CARD],&deckCount,deckPlayer[PER_PLAYER_MAX_CARDS][CARD],&deckPlayerCount)
  662. {
  663. deckPlayer[deckPlayerCount++] = getRandomCard(deck,deckCount);
  664. }
  665.  
  666. startGame(id)
  667. {
  668. new money = fm_get_user_money(id);
  669. fm_set_user_money(id,money - betValues[id]);
  670.  
  671. inGame[id] = 1;
  672. gameOver[id] = 0;
  673.  
  674. decksCount[id] = 0;
  675. decksPlayersCount[id] = 0;
  676.  
  677. renewDeck(decks[id],decksCount[id]);
  678.  
  679. givePlayerCard(decks[id],decksCount[id],decksPlayers[id],decksPlayersCount[id]);
  680. givePlayerCard(decks[id],decksCount[id],decksPlayers[id],decksPlayersCount[id]);
  681. givePlayerCard(decks[id],decksCount[id],decksPlayers[id],decksPlayersCount[id]);
  682. givePlayerCard(decks[id],decksCount[id],decksPlayers[id],decksPlayersCount[id]);
  683. givePlayerCard(decks[id],decksCount[id],decksPlayers[id],decksPlayersCount[id]);
  684.  
  685. for(new i=0;i<PER_PLAYER_MAX_CARDS;i++)
  686. holdCard[id][i] = true;
  687. }
  688.  
  689. stop(id)
  690. {
  691. for(new i=0;i<PER_PLAYER_MAX_CARDS;i++)
  692. if(!holdCard[id][i])
  693. decksPlayers[id][i] = getRandomCard(decks[id],decksCount[id]);
  694.  
  695. doGameOver(id);
  696. }
  697.  
  698. GAME_RESULT:getGameResult(id)
  699. {
  700. new gameValues[GAME_VALUES]
  701. new gameSuits[GAME_SUITS]
  702. new gameData[GAME_DATA]
  703.  
  704. for(new i=0;i<PER_PLAYER_MAX_CARDS;i++)
  705. {
  706. new thisCard[CARD]
  707. thisCard = decksPlayers[id][i];
  708.  
  709. new GAME_VALUES:cardID = GAME_VALUES:thisCard[ID]
  710. new GAME_SUITS:cardSuit = GAME_SUITS:thisCard[SUIT]
  711.  
  712. if(!gameValues[cardID])
  713. {
  714. gameValues[cardID] = 1
  715. }
  716. else
  717. {
  718. gameValues[cardID]++;
  719.  
  720. switch(gameValues[cardID])
  721. {
  722. case 2:
  723. {
  724. gameData[PAIR_VALUE] = thisCard[VALUE]
  725. gameData[PAIRS]++
  726. }
  727. case 3:
  728. {
  729. gameData[PAIRS]--
  730. gameData[TRIPLES]++
  731. }
  732. case 4:
  733. {
  734. gameData[TRIPLES]--
  735. gameData[FOURTUPLE]++
  736. }
  737. }
  738. }
  739.  
  740. if(!gameSuits[cardSuit])
  741. {
  742. gameSuits[cardSuit] = 1
  743. gameData[SUITS]++;
  744. }
  745. else
  746. {
  747. gameSuits[cardSuit]++
  748. }
  749. }
  750.  
  751. if(gameData[FOURTUPLE])
  752. {
  753. return FOUR_OF_A_KIND;
  754. }
  755. else if(gameData[TRIPLES])
  756. {
  757. if(gameData[PAIRS])
  758. return FULL_HOUSE
  759. else
  760. return THREE_OF_A_KIND
  761. }
  762. else if(gameData[PAIRS])
  763. {
  764. if(gameData[PAIRS] == 2)
  765. return TWO_PAIRS;
  766. else if(gameData[PAIR_VALUE] > 10)
  767. return PAIR_OF_JACKS_OR_BETTER;
  768. }
  769. else
  770. {
  771. new higherValue = 2;
  772. new lowerValue = 14;
  773.  
  774. for(new i=0;i<PER_PLAYER_MAX_CARDS;i++)
  775. {
  776. new value = decksPlayers[id][i][VALUE];
  777.  
  778. if(value > higherValue)
  779. higherValue = value;
  780.  
  781. if(value < lowerValue)
  782. lowerValue = value;
  783. }
  784.  
  785. new bool:isStraight = (lowerValue + 4) == higherValue;
  786.  
  787. if(gameData[SUITS] == 1)
  788. {
  789. if(isStraight)
  790. {
  791. if(higherValue == 14)
  792. return ROYAL_FLUSH;
  793. else
  794. return STRAIGHT_FLUSH
  795. }
  796. else
  797. {
  798. return FLUSH
  799. }
  800. }
  801. else if(isStraight)
  802. {
  803. return STRAIGHT;
  804. }
  805. }
  806.  
  807. return LOSE
  808.  
  809. }
  810. doGameOver(id)
  811. {
  812. gameOver[id] = 1;
  813. inGame[id]= 0;
  814.  
  815. new money = fm_get_user_money(id);
  816.  
  817. new name[32];
  818. get_user_name(id,name,31);
  819.  
  820. new betValue = betValues[id];
  821.  
  822. new GAME_RESULT:gameResult = getGameResult(id);
  823. switch (getGameResult(id))
  824. {
  825. case 0:
  826. {
  827. if(getCvar(CHAT_MESSAGES))
  828. client_print(0,print_chat,"%L",id,"VP_MSG_CHAT_LOST",name,betValue);
  829. }
  830. default:
  831. {
  832. new moneyToPay = betValue * MONEY_MULTIPLY[gameResult];
  833. fm_set_user_money(id,money + betValue + moneyToPay);
  834.  
  835. if(getCvar(CHAT_MESSAGES))
  836. client_print(0,print_chat,"%L (%L)",id,"VP_MSG_CHAT_WIN",name,moneyToPay,id,GAME_RESULTS_TEXT[gameResult]);
  837. }
  838. }
  839. }
  840. doReset(id)
  841. {
  842. gameOver[id] = 0;
  843. inGame[id] = 0;
  844. betValues[id] = getCvar(BET_VALUE_MIN);
  845. }
  846. public client_connect(id)
  847. {
  848. doReset(id)
  849. }
  850. /* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
  851. *{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1038\\ f0\\ fs16 \n\\ par }
  852. */
  853.