De DigiWiki.
// Simple Poker
// Message Constants
integer AceHearts = 0;
integer TwoHearts = 1;
integer ThreeHearts = 2;
integer FourHearts = 3;
integer FiveHearts = 4;
integer SixHearts = 5;
integer SevenHearts = 6;
integer EightHearts = 7;
integer NineHearts = 8;
integer TenHearts = 9;
integer JackHearts = 10;
integer QueenHearts = 11;
integer KingHearts = 12;
integer AceDiamonds = 13;
integer TwoDiamonds = 14;
integer ThreeDiamonds = 15;
integer FourDiamonds = 16;
integer FiveDiamonds = 17;
integer SixDiamonds = 18;
integer SevenDiamonds = 19;
integer EightDiamonds = 20;
integer NineDiamonds = 21;
integer TenDiamonds = 22;
integer JackDiamonds = 23;
integer QueenDiamonds = 24;
integer KingDiamonds = 25;
integer AceSpades = 26;
integer TwoSpades = 27;
integer ThreeSpades = 28;
integer FourSpades = 29;
integer FiveSpades = 30;
integer SixSpades = 31;
integer SevenSpades = 32;
integer EightSpades = 33;
integer NineSpades = 34;
integer TenSpades = 35;
integer JackSpades = 36;
integer QueenSpades = 37;
integer KingSpades = 38;
integer AceClubs = 39;
integer TwoClubs = 40;
integer ThreeClubs = 41;
integer FourClubs = 42;
integer FiveClubs = 43;
integer SixClubs = 44;
integer SevenClubs = 45;
integer EightClubs = 46;
integer NineClubs = 47;
integer TenClubs = 48;
integer JackClubs = 49;
integer QueenClubs = 50;
integer KingClubs = 51;
integer MSG_RESET = 54;
integer NOTHING = 0;
integer JACK = -1;
integer ONEPAIR = 1;
integer TWOPAIRS = 2;
integer THREEOFKIND = 3;
integer FULLHOUSE = 4;
integer STRAIGHT = 5;
integer FLUSH = 5;
integer FOUROFKIND = 6;
integer STRAIGHTFLUSH = 7;
integer ROYALFLUSH = 8;
//Other Global Values
integer pc1;
integer pc2;
integer pc3;
integer pc4;
integer pc5;
list DECK = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,
26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51];
list shuDeck;
shuffleCards()
{
llSay(0, "Shuffling Deck...");
shuDeck = llListRandomize(DECK, 0);
llSleep(0.5);
}
dealCards()
{
pc1 = llList2Integer(shuDeck, 0);
pc2 = llList2Integer(shuDeck, 1);
pc3 = llList2Integer(shuDeck, 2);
pc4 = llList2Integer(shuDeck, 3);
pc5 = llList2Integer(shuDeck, 4);
llOwnerSay("cards = " + llList2CSV( [ pc1, pc2, pc3, pc4, pc5 ] ));
checkwin([ pc1, pc2, pc3, pc4, pc5 ]);
checkwin([ ThreeDiamonds, KingDiamonds, SevenDiamonds, TwoDiamonds, TenDiamonds ]); // a flush
checkwin([ EightSpades, NineSpades, SevenSpades, SixSpades, TenSpades ]); // a straight flush
checkwin([ EightSpades, NineDiamonds, SevenSpades, SixSpades, TenSpades ]); // a straight
checkwin([ EightSpades, JackDiamonds, SevenSpades, SixSpades, JackSpades ]); // a pair
checkwin([ EightSpades, JackDiamonds, SixDiamonds, SixSpades, JackSpades ]); // two pairs
}
integer checkwin( list cardvals) {
list suits;
list matched;
integer pairs = 0; // number of pairs
integer threes = 0; // number of three of kind
integer fours = 0; // number of fours;
integer flush = FALSE;
integer straight = FALSE;
cardvals = llListSort(cardvals,0, TRUE);
integer i;
integer j;
for ( i = 0; i < 4; i++ ) {
suits += [ 0 ]; // Initialise suits array to zero
}
for ( i = 0; i < 13; i++ ) {
matched += [ 0 ]; // Initialise matched array to zero
}
for ( i = 0; i < 5; i++ ) {
j = llList2Integer(cardvals, i) % 13 ;
// Update matched for cards
matched = llListReplaceList( matched, [ llList2Integer(matched, j) + 1 ], j, j );
// equivalent to matched[cardvals[i] % 13]++;
j = (integer) (llList2Integer(cardvals, i) / 13) ;
// Update suits for cards
suits= llListReplaceList( suits, [ llList2Integer(suits, j) + 1 ], j, j );
// equivalent to suits[cardvals[i]/13]++;
}
// Check for pairs, threes and fours
for ( i = 0; i < 13; i++ ) {
if ( llList2Integer(matched, i) == 2 ) {
pairs++;
}
else if ( llList2Integer(matched, i) == 3 ) {
threes++;
}
else if ( llList2Integer(matched, i) == 4 ) {
fours++;
}
}
// Check for a flush
for ( i = 0; i < 4; i++ ) {
if ( llList2Integer( suits, i ) == 5 ) {
flush = TRUE;
}
}
if ( (llList2Integer(cardvals,4) - llList2Integer(cardvals,1) == 3) && // Consistent with
(llList2Integer(cardvals,4) - llList2Integer(cardvals,0) == 12) && // A, T, J, Q, K...
flush ) { // If we also have a flush, then its a royal flush
llOwnerSay("Royal flush!");
return ROYALFLUSH;
}
else if ( llList2Integer(cardvals,4) - llList2Integer(cardvals,0) == 4 && flush ) {
llOwnerSay("Straight flush!");
return STRAIGHTFLUSH;
}
// Sort cards by face value (necessary to check for a straight)
for ( i = 0; i < 5; i++ )
{
// equivalent to cardvals[i] = cardvals[i] % 13;
cardvals = llListReplaceList( cardvals, [ llList2Integer(cardvals, i) % 13 ], i, i );
}
cardvals = llListSort(cardvals,0, TRUE);
if ( fours > 0 ) {
llOwnerSay("Four of a kind!");
return FOUROFKIND;
}
else if ( threes == 1 && pairs == 1 ) {
llOwnerSay("Full house!");
return FULLHOUSE;
}
else if ( flush ) {
llOwnerSay("A flush!");
return FLUSH;
}
else if ( llList2Integer(cardvals,4) - llList2Integer(cardvals,3) == 1 &&
llList2Integer(cardvals,3) - llList2Integer(cardvals,2) == 1 &&
llList2Integer(cardvals,2) - llList2Integer(cardvals,1) == 1 &&
( llList2Integer(cardvals,1) - llList2Integer(cardvals,0) == 1 ||
llList2Integer(cardvals,4) - llList2Integer(cardvals,0) == 12 ) ) {
llOwnerSay("A straight!");
return STRAIGHT;
}
else if ( threes > 0 ) {
llOwnerSay("Three of a kind!");
return THREEOFKIND;
}
else if ( pairs == 2 ) {
llOwnerSay("Two pair!");
return TWOPAIRS;
}
else if ( pairs == 1 ) {
llOwnerSay("One pair!");
return ONEPAIR;
}
// otionnally delete this piece of code . it s for machine games not table games
else if ( llList2Integer(matched,0) == 2 ||
llList2Integer(matched,10) == 2 ||
llList2Integer(matched,11) == 2 ||
llList2Integer(matched,12) == 2 ) {
llOwnerSay("Jacks or better!");
return JACK;
}
else {
llOwnerSay( "No win! Bad luck!");
return NOTHING;
}
}
default {
state_entry()
{
shuffleCards();
dealCards();
}
touch_start(integer number)
{
shuffleCards();
dealCards();
}
}