import "ecere" #define MCARD(k,n) ((n) * 4 + (k)) #define NUMBER(id) ((id) / 4) #define KIND(id) ((id) % 4) #define OFFSETTER1 15 #define OFFSETTER2 120 #define HOUSETYPE_STRAIGHT 0 #define HOUSETYPE_KIND 1 typedef struct { int typeOfHouse; union { struct straight { int first, last; int suit; } straight; struct kind { int number; bool suits[4]; } kind; }; } House; typedef struct { int numCards; int cardValues[13]; House houseDown[4]; int numHouseDown; bool cardLifted[13]; bool callTag; } Player; int cards[52]; int discard[28]; int discardCounter = 0; int deckCounter = 0; int numOfPlayers = 4; int currentPlayer = 0; int cardToReposition = 0; int xMouseMove=0,yMouseMove=0,xLeftButtonUp=0,yLeftButtonUp=0; int xCursorPositionAtCard=0,yCursorPositionAtCard=0,width=0,height=0; int dragCard = -1; Player player[4]; Point xyPositions[4] = { {30,150}, {30,500}, {600,500}, {600,150} }; bool flagButtonDown, leftDoubleClick, gameOver; //player[0].houseDown[0].straight.suit void NewDeckOfCards() { int i; for(i=0;i<52;i++) { cards[i]=i; } } void Shuffle() { int i,j,randNum; for(i=0;i<52;i++) { randNum = GetRandom(0,51); j=cards[i]; cards[i]=cards[randNum]; cards[randNum]=j; } } void DealCards(int numPlayers) { int c, p; player[0].cardValues[player[0].numCards++] = cards[deckCounter++]; for(c = 0; c<((numPlayers > 3) ? 9 : 12); c++) for(p = 0; p=0;i--) { if(checkIfHouse[i] == checkIfHouse[i-1] + 4) { straight++; //possible straight house } else if(NUMBER(checkIfHouse[i]) == NUMBER(checkIfHouse[i-1])) { house++; //possible 3or4 of a kind house } } if(straight == cardsToCheck-1) return 0; else if(house == cardsToCheck-1) return 1; else return -1; } int CompareInteger(int * a, int * b) { if(*a > *b) return 1; else if(*b > *a) return -1; else return 0; } void SortPlayerCards() { int c; for(c=0;c 0) { Bitmap bitmap = bitmapCards[discard[discardCounter-1]]; surface.Blit(bitmap, xLeftButtonUp, yLeftButtonUp,0,0, bitmap.width,bitmap.height); } for(j=0;j= 3) { int checkResult; qsort(tempHouse,tempCtr,sizeof(int),CompareInteger); checkResult = CheckHouse(tempCtr,tempHouse); switch(checkResult) { // 3/4 of a kind case 1: { House * house = &player[currentPlayer].houseDown[player[currentPlayer].numHouseDown]; house->typeOfHouse = checkResult; for(i=0;ikind.number = NUMBER(tempHouse[i]); house->kind.suits[KIND(tempHouse[i])] = true; } player[currentPlayer].numHouseDown++; break; } case 0: { House * house = &player[currentPlayer].houseDown[player[currentPlayer].numHouseDown]; house->typeOfHouse = checkResult; house->straight.first = NUMBER(tempHouse[0]); house->straight.last = NUMBER(tempHouse[tempCtr-1]); house->straight.suit = KIND(tempHouse[0]); player[currentPlayer].numHouseDown++; break; } case -1: { return true; break; } } for(i=0,j=0;i= 3) { int checkResult; qsort(tempHouse,tempCtr,sizeof(int),CompareInteger); checkResult = CheckHouse(tempCtr,tempHouse); switch(checkResult) { // 3/4 of a kind case 1: { House * house = &player[currentPlayer].houseDown[player[currentPlayer].numHouseDown]; house->typeOfHouse = checkResult; for(i=0;ikind.number = NUMBER(tempHouse[i]); house->kind.suits[KIND(tempHouse[i])] = true; } player[currentPlayer].numHouseDown++; break; } case 0: { House * house = &player[currentPlayer].houseDown[player[currentPlayer].numHouseDown]; house->typeOfHouse = checkResult; house->straight.first = NUMBER(tempHouse[0]); house->straight.last = NUMBER(tempHouse[tempCtr-1]); house->straight.suit = KIND(tempHouse[0]); player[currentPlayer].numHouseDown++; break; } case -1: { return true; //false; break; } } for(i=0,j=0;i=0;i--) { Bitmap bitmap = bitmapCards[player[currentPlayer].cardValues[i]]; if(Box { xyPositions[currentPlayer].x + (OFFSETTER1 * i), (player[currentPlayer].cardLifted[i] ? (xyPositions[currentPlayer].y - OFFSETTER2 - 20) :( xyPositions[currentPlayer].y - OFFSETTER2)), bitmap.width + (xyPositions[currentPlayer].x + OFFSETTER1 * i), bitmap.height + (player[currentPlayer].cardLifted[i] ? (xyPositions[currentPlayer].y - OFFSETTER2 - 20) : (xyPositions[currentPlayer].y - OFFSETTER2)) }.IsPointInside(Point { x, y }) && drawButton[currentPlayer].disabled) { dragCard = player[currentPlayer].cardValues[i]; cardToReposition = i; width = bitmap.width; height = bitmap.height; xCursorPositionAtCard = (xyPositions[currentPlayer].x + (OFFSETTER1 * i)) - x; yCursorPositionAtCard = (player[currentPlayer].cardLifted[i] ? (xyPositions[currentPlayer].y - OFFSETTER2 - y - 20) : (xyPositions[currentPlayer].y - OFFSETTER2 - y)); flagButtonDown = true; OnMouseMove(x,y,mods); break; } } } return true; } bool OnLeftButtonUp(int x, int y, Modifiers mods) { int h,i,j; Box boxDiscard={375, 315, 495, 475}; Box boxCard = {x + xCursorPositionAtCard,y + yCursorPositionAtCard, x + xCursorPositionAtCard + width - 1, y + yCursorPositionAtCard + height - 1}; if(flagButtonDown) { if(boxCard.Overlap(boxDiscard)) { xLeftButtonUp = 400; yLeftButtonUp = 350; CopyBytesBy4(&player[currentPlayer].cardValues[cardToReposition], &player[currentPlayer].cardValues[cardToReposition+1], player[currentPlayer].numCards-1-cardToReposition); player[currentPlayer].numCards--; discard[discardCounter++] = dragCard; if(player[currentPlayer].numCards == 0 || deckCounter == 52) { GameOver(); } else { for(i=0;i= 2 && player[currentPlayer].callTag == false) callButton[currentPlayer].disabled = false; } } else { for(j=0;j=0;i--) { Bitmap bitmap = bitmapCards[player[currentPlayer].cardValues[i]]; if(Box { xyPositions[currentPlayer].x + (OFFSETTER1 * i), (player[currentPlayer].cardLifted[i] ? (xyPositions[currentPlayer].y - OFFSETTER2 - 20) :(xyPositions[currentPlayer].y - OFFSETTER2)), bitmap.width + (xyPositions[currentPlayer].x + OFFSETTER1 * i), bitmap.height + (player[currentPlayer].cardLifted[i] ? (xyPositions[currentPlayer].y - OFFSETTER2 - 20) : (xyPositions[currentPlayer].y - OFFSETTER2)) }.IsPointInside(Point{x,y})) { player[currentPlayer].cardLifted[i] ^= true; Update(null); return false; } } return true; } bool OnRightButtonDown(int x, int y, Modifiers mods) { int i; if(!gameOver) { for(i=player[currentPlayer].numCards-1;i>=0;i--) { Bitmap bitmap = bitmapCards[player[currentPlayer].cardValues[i]]; if(Box { xyPositions[currentPlayer].x + (OFFSETTER1 * i), (player[currentPlayer].cardLifted[i] ? (xyPositions[currentPlayer].y - OFFSETTER2 - 20) :(xyPositions[currentPlayer].y - OFFSETTER2)), bitmap.width + (xyPositions[currentPlayer].x + OFFSETTER1 * i), bitmap.height + (player[currentPlayer].cardLifted[i] ? (xyPositions[currentPlayer].y - OFFSETTER2 - 20) : (xyPositions[currentPlayer].y - OFFSETTER2)) }.IsPointInside(Point{x,y}) && drawButton[currentPlayer].disabled) { dragCard = player[currentPlayer].cardValues[i]; cardToReposition = i; width = bitmap.width; height = bitmap.height; xCursorPositionAtCard = (xyPositions[currentPlayer].x + (OFFSETTER1 * i)) - x; yCursorPositionAtCard = (player[currentPlayer].cardLifted[i] ? (xyPositions[currentPlayer].y - OFFSETTER2 - y - 20) : (xyPositions[currentPlayer].y - OFFSETTER2 - y)); flagButtonDown = true; OnMouseMove(x,y,mods); break; } } } return true; } bool OnRightButtonUp(int x, int y, Modifiers mods) { Bitmap bitmap = cardBack; int swapCard,dest,source,i; Box boxPlayerCards={xyPositions[currentPlayer].x,xyPositions[currentPlayer].y - OFFSETTER2, xyPositions[currentPlayer].x + player[currentPlayer].numCards * OFFSETTER1 + bitmap.width, xyPositions[currentPlayer].y - OFFSETTER2 + bitmap.height}; Box boxCard = {x + xCursorPositionAtCard,y + yCursorPositionAtCard, x + xCursorPositionAtCard,y + yCursorPositionAtCard + height - 1}; if(flagButtonDown) { if(boxCard.Overlap(boxPlayerCards)) { swapCard = (x + xCursorPositionAtCard >= player[currentPlayer].numCards * 15 + xyPositions[currentPlayer].x) ? (player[currentPlayer].numCards-1) : ((x + xCursorPositionAtCard - xyPositions[currentPlayer].x) / 15); if(cardToReposition > swapCard) { dest = swapCard + 1; MoveBytes(&player[currentPlayer].cardValues[dest], &player[currentPlayer].cardValues[swapCard],(cardToReposition - swapCard) * sizeof(int)); player[currentPlayer].cardValues[swapCard] = dragCard; //player[currentPlayer].cardLifted[swapCard] = false; } else { dest = cardToReposition; source = cardToReposition + 1; MoveBytes(&player[currentPlayer].cardValues[dest], &player[currentPlayer].cardValues[source],(swapCard - cardToReposition) * sizeof(int)); player[currentPlayer].cardValues[swapCard] = dragCard; //player[currentPlayer].cardLifted[swapCard] = false; } } for(i=0;i