3 #define MCARD(k,n) ((n) * 4 + (k))
4 #define NUMBER(id) ((id) / 4)
5 #define KIND(id) ((id) % 4)
8 #define HOUSETYPE_STRAIGHT 0
9 #define HOUSETYPE_KIND 1
42 int discardCounter = 0;
45 int currentPlayer = 0;
46 int cardToReposition = 0;
47 int xMouseMove=0,yMouseMove=0,xLeftButtonUp=0,yLeftButtonUp=0;
48 int xCursorPositionAtCard=0,yCursorPositionAtCard=0,width=0,height=0;
51 Point xyPositions[4] =
59 bool flagButtonDown, leftDoubleClick, gameOver;
61 //player[0].houseDown[0].straight.suit
77 randNum = GetRandom(0,51);
79 cards[i]=cards[randNum];
84 void DealCards(int numPlayers)
88 player[0].cardValues[player[0].numCards++] = cards[deckCounter++];
89 for(c = 0; c<((numPlayers > 3) ? 9 : 12); c++)
90 for(p = 0; p<numPlayers; p++)
91 player[(p+1)%numPlayers].cardValues[player[(p+1)%numPlayers].numCards++] = cards[deckCounter++];
92 //player[0].houseDown[0].straight.suit
95 int CheckHouse(int cardsToCheck,int * checkIfHouse)
97 int i,straight=0,house=0;
98 for(i=cardsToCheck-1;i>=0;i--)
100 if(checkIfHouse[i] == checkIfHouse[i-1] + 4)
102 straight++; //possible straight house
104 else if(NUMBER(checkIfHouse[i]) == NUMBER(checkIfHouse[i-1]))
106 house++; //possible 3or4 of a kind house
109 if(straight == cardsToCheck-1)
111 else if(house == cardsToCheck-1)
117 int CompareInteger(int * a, int * b)
126 void SortPlayerCards()
129 for(c=0;c<numOfPlayers;c++)
131 qsort(player[c].cardValues,player[c].numCards,sizeof(int),CompareInteger);
132 //qsort(tempHouse,tempCtr,sizeof(int),CompareInteger);
136 class TongIts : Window
138 Bitmap bitmapCards[52];
140 Button drawButton[4], chowButton[4], dumpButton[4], callButton[4], showButton[4], doneButton[4];
145 background = Color { 113,156,169 };
146 borderStyle = sizable;
148 size = Size { 900,700 };
153 RandomSeed((int)(GetTime() * 1000));
156 DealCards(numOfPlayers);
158 for(c = 0; c<numOfPlayers; c++)
160 drawButton[c] = Button { this, text = "Draw Card", position = xyPositions[c], size = Size { 80,20 }, id = c*6, disabled = true, NotifyClicked = DrawClicked };
161 chowButton[c] = Button { this, text = "Chow", position = Point { xyPositions[c].x + 80,xyPositions[c].y }, size = Size { 80,20 }, id = c*6, disabled = true, NotifyClicked = ChowClicked };
162 dumpButton[c] = Button { this, text = "Dump", position = Point { xyPositions[c].x + 160, xyPositions[c].y }, size = Size { 80,20 }, id = c*6, disabled = true, NotifyClicked = DumpClicked };
163 callButton[c] = Button { this, text = "Call", position = Point { xyPositions[c].x, xyPositions[c].y + 20 }, size = Size { 80,20 }, id = c*6, disabled = true, NotifyClicked = CallClicked };
164 showButton[c] = Button { this, text = "Show", position = Point { xyPositions[c].x + 80, xyPositions[c].y + 20 }, size = Size { 80,20 }, id = c*6, disabled = true, NotifyClicked = ShowClicked };
165 doneButton[c] = Button { this, text = "Done", position = Point { xyPositions[c].x + 160, xyPositions[c].y + 20 },size = Size { 80,20 }, id = c*6, disabled = true, NotifyClicked = DoneClicked };
167 showButton[currentPlayer].disabled = false;
168 dumpButton[currentPlayer].disabled = false;
172 bool OnLoadGraphics()
175 Bitmap ptrCardLoad {};
176 ptrCardLoad.Load(":cards.pcx",null,null);
177 cardBack.LoadT(":ecereCard.png", null, displaySystem);
181 Bitmap bitmap { transparent = true };
182 bitmap.Allocate(null,ptrCardLoad.width, ptrCardLoad.height/52,0,pixelFormat8,true);
183 CopyBytesBy4(bitmap.palette, ptrCardLoad.palette, 256);
184 bitmap.Grab(ptrCardLoad,0,(ptrCardLoad.height/52)*i);
185 bitmap.MakeDD(displaySystem);
186 bitmapCards[i] = bitmap;
192 void OnUnloadGraphics()
196 bitmapCards[i].Free();
204 this, hasClose = true, background = LightBlue, text = "Game Over", [position.y] = A_CENTER|20, size = Size { 300, 200 }
206 Button { gameOverBox, text = "Close", [position.y] = A_CENTER|80, size = Size { 80,20 } };
211 void OnRedraw(Surface surface)
213 int h=0,i=0,j=0,k=0,x=0;
215 surface.Rectangle(375, 315, 495, 475);
219 surface.SetForeground(blue);
220 surface.SetBackground(red);
221 // surface.Area(375,100,495,150);
222 surface.Area(375,370,495,420);
223 //surface.TextOpacity(true);
224 // surface.WriteTextf(398, 115,"GAME OVER");
225 surface.WriteTextf(398, 385,"GAME OVER");
228 for(i=deckCounter,x=0;i<52;i+=5,x+=2)
230 Bitmap bitmap = cardBack;
231 surface.Blit(bitmap,400 + x, 195 + x,0,0, bitmap.width,bitmap.height);
234 if(discardCounter > 0)
236 Bitmap bitmap = bitmapCards[discard[discardCounter-1]];
237 surface.Blit(bitmap, xLeftButtonUp, yLeftButtonUp,0,0, bitmap.width,bitmap.height);
240 for(j=0;j<numOfPlayers;j++)
242 for(i=0;i<player[j].numCards;i++)
244 if(player[j].cardValues[i] != dragCard || (!flagButtonDown))
246 Bitmap bitmap = bitmapCards[player[j].cardValues[i]];
247 if(player[j].cardLifted[i])
249 surface.Blit(bitmap,xyPositions[j].x + OFFSETTER1 * i,xyPositions[j].y - OFFSETTER2 - 20,0,0, bitmap.width,bitmap.height);
253 surface.Blit(bitmap,xyPositions[j].x + OFFSETTER1 * i,xyPositions[j].y - OFFSETTER2,0,0, bitmap.width,bitmap.height);
257 for(i=0,h=0;i<player[j].numHouseDown;i++,h++)
259 if(player[j].houseDown[i].typeOfHouse == 0)
261 for(k=player[j].houseDown[i].straight.first;k<=player[j].houseDown[i].straight.last;k++)
263 Bitmap bitmap = bitmapCards[MCARD((player[j].houseDown[i].straight.suit),(k))];
264 surface.Blit(bitmap,xyPositions[j].x + OFFSETTER1 * h,xyPositions[j].y + 75,0,0, bitmap.width,bitmap.height);
269 if(player[j].houseDown[i].typeOfHouse == 1)
271 for(k=0;k<4;k++) //player[j].houseDown[i].kind.suits[k]
273 if(player[j].houseDown[i].kind.suits[k] == true)
275 Bitmap bitmap = bitmapCards[MCARD((k),(player[j].houseDown[i].kind.number))];
276 surface.Blit(bitmap,xyPositions[j].x + OFFSETTER1 * h,xyPositions[j].y + 75,0,0, bitmap.width,bitmap.height);
278 } //_2D xyPositions[4] = {{30,150},{30,500},{540,500},{540,150}};
285 for(i=0;i<player[currentPlayer].numCards;i++)
287 Bitmap bitmap = bitmapCards[player[currentPlayer].cardValues[i]];
288 if(player[currentPlayer].cardValues[i] == dragCard)
290 surface.Blit(bitmap,xMouseMove + xCursorPositionAtCard,yMouseMove + yCursorPositionAtCard,0,0, bitmap.width,bitmap.height);
296 surface.SetForeground(blue);
297 surface.SetBackground(red);
298 // surface.Area(375,100,495,150);
299 surface.Area(375,370,495,420);
300 //surface.TextOpacity(true);
301 // surface.WriteTextf(398, 115,"GAME OVER");
302 surface.WriteTextf(398, 385,"GAME OVER");
303 for(i=0;i<numOfPlayers;i++)
305 drawButton[i].disabled = true;
306 chowButton[i].disabled = true;
307 dumpButton[i].disabled = true;
308 callButton[i].disabled = true;
309 showButton[i].disabled = true;
310 doneButton[i].disabled = true;
312 // eWindow_Create("MessageBox",MSGBOX_OK,ES_CAPTION,window,null,A_LEFT,A_RIGHT,200,100,0,null,0,null,0);
316 for(i=0;i<player[j].numCards;i++)
318 Bitmap bitmap = bitmapCards[MCARD(KIND(player[2].cardValues[i]),NUMBER(player[2].cardValues[i]))];
319 surface.Blit(bitmap,30+15*i,500,0,0, bitmap.width,bitmap.height);
324 for(i=0;i<player[j].numCards;i++)
326 //Bitmap bitmap1 = bitmapCards[MCARD(KIND(player[1].cardValues[i]),NUMBER(player[1].cardValues[i]))];
327 Bitmap bitmap = cardBack;
328 surface.Blit(bitmap,30+15*i,30+nextLane,0,0, bitmap.width,bitmap.height);
334 bool DrawClicked(Button button, int x, int y, Modifiers mods)
336 player[currentPlayer].cardValues[player[currentPlayer].numCards++] = cards[deckCounter++];
337 drawButton[currentPlayer].disabled = true;
338 chowButton[currentPlayer].disabled = true;
339 callButton[currentPlayer].disabled = true;
340 showButton[currentPlayer].disabled = false;
341 dumpButton[currentPlayer].disabled = false;
346 bool ChowClicked(Button button, int x, int y, Modifiers mods)
348 int i, j, suit, number;
355 suit = KIND(discard[discardCounter-1]);
356 number = NUMBER(discard[discardCounter-1]);
357 tempHouse[tempCtr++] = discard[discardCounter-1];
358 for(i=0;i<player[currentPlayer].numCards;i++)
360 if(player[currentPlayer].cardLifted[i])
362 tempHouse[tempCtr++] = player[currentPlayer].cardValues[i];
369 qsort(tempHouse,tempCtr,sizeof(int),CompareInteger);
370 checkResult = CheckHouse(tempCtr,tempHouse);
376 House * house = &player[currentPlayer].houseDown[player[currentPlayer].numHouseDown];
377 house->typeOfHouse = checkResult;
378 for(i=0;i<tempCtr;i++)
380 house->kind.number = NUMBER(tempHouse[i]);
381 house->kind.suits[KIND(tempHouse[i])] = true;
383 player[currentPlayer].numHouseDown++;
388 House * house = &player[currentPlayer].houseDown[player[currentPlayer].numHouseDown];
389 house->typeOfHouse = checkResult;
390 house->straight.first = NUMBER(tempHouse[0]);
391 house->straight.last = NUMBER(tempHouse[tempCtr-1]);
392 house->straight.suit = KIND(tempHouse[0]);
393 player[currentPlayer].numHouseDown++;
402 for(i=0,j=0;i<player[currentPlayer].numCards;i++)
404 if(!player[currentPlayer].cardLifted[i])
406 player[currentPlayer].cardValues[j] = player[currentPlayer].cardValues[i];
407 player[currentPlayer].cardLifted[j] = false;
411 player[currentPlayer].numCards = j;
412 discard[discardCounter--];
413 drawButton[currentPlayer].disabled = true;
414 chowButton[currentPlayer].disabled = true;
415 callButton[currentPlayer].disabled = true;
416 showButton[currentPlayer].disabled = false;
417 dumpButton[currentPlayer].disabled = false;
420 if(player[currentPlayer].numCards == 0)
427 bool DumpClicked(Button button, int x, int y, Modifiers mods)
429 MessageBox { text = button.text }.Create();
433 bool CallClicked(Button button, int x, int y, Modifiers mods)
435 MessageBox { text = button.text }.Create();
439 bool ShowClicked(Button button, int x, int y, Modifiers mods)
448 for(i=0;i<player[currentPlayer].numCards;i++)
450 if(player[currentPlayer].cardLifted[i])
452 tempHouse[tempCtr++] = player[currentPlayer].cardValues[i];
458 qsort(tempHouse,tempCtr,sizeof(int),CompareInteger);
459 checkResult = CheckHouse(tempCtr,tempHouse);
465 House * house = &player[currentPlayer].houseDown[player[currentPlayer].numHouseDown];
466 house->typeOfHouse = checkResult;
467 for(i=0;i<tempCtr;i++)
469 house->kind.number = NUMBER(tempHouse[i]);
470 house->kind.suits[KIND(tempHouse[i])] = true;
472 player[currentPlayer].numHouseDown++;
477 House * house = &player[currentPlayer].houseDown[player[currentPlayer].numHouseDown];
478 house->typeOfHouse = checkResult;
479 house->straight.first = NUMBER(tempHouse[0]);
480 house->straight.last = NUMBER(tempHouse[tempCtr-1]);
481 house->straight.suit = KIND(tempHouse[0]);
482 player[currentPlayer].numHouseDown++;
487 return true; //false;
491 for(i=0,j=0;i<player[currentPlayer].numCards;i++)
493 if(!player[currentPlayer].cardLifted[i])
495 player[currentPlayer].cardValues[j] = player[currentPlayer].cardValues[i];
496 player[currentPlayer].cardLifted[j] = false;
500 player[currentPlayer].numCards = j;
501 if(player[currentPlayer].numCards == 0)
510 bool DoneClicked(Button button, int x, int y, Modifiers mods)
512 MessageBox { text = button.text }.Create();
516 bool OnMouseMove(int x, int y, Modifiers mods)
528 bool OnLeftButtonDown(int x, int y, Modifiers mods)
533 for(i=player[currentPlayer].numCards-1;i>=0;i--)
535 Bitmap bitmap = bitmapCards[player[currentPlayer].cardValues[i]];
537 xyPositions[currentPlayer].x + (OFFSETTER1 * i),
538 (player[currentPlayer].cardLifted[i] ? (xyPositions[currentPlayer].y - OFFSETTER2 - 20) :( xyPositions[currentPlayer].y - OFFSETTER2)),
539 bitmap.width + (xyPositions[currentPlayer].x + OFFSETTER1 * i),
540 bitmap.height + (player[currentPlayer].cardLifted[i] ? (xyPositions[currentPlayer].y - OFFSETTER2 - 20) : (xyPositions[currentPlayer].y - OFFSETTER2))
541 }.IsPointInside(Point { x, y }) && drawButton[currentPlayer].disabled)
543 dragCard = player[currentPlayer].cardValues[i];
544 cardToReposition = i;
545 width = bitmap.width;
546 height = bitmap.height;
547 xCursorPositionAtCard = (xyPositions[currentPlayer].x + (OFFSETTER1 * i)) - x;
548 yCursorPositionAtCard = (player[currentPlayer].cardLifted[i] ?
549 (xyPositions[currentPlayer].y - OFFSETTER2 - y - 20) :
550 (xyPositions[currentPlayer].y - OFFSETTER2 - y));
551 flagButtonDown = true;
552 OnMouseMove(x,y,mods);
560 bool OnLeftButtonUp(int x, int y, Modifiers mods)
563 Box boxDiscard={375, 315, 495, 475};
564 Box boxCard = {x + xCursorPositionAtCard,y + yCursorPositionAtCard, x + xCursorPositionAtCard + width - 1, y + yCursorPositionAtCard + height - 1};
567 if(boxCard.Overlap(boxDiscard))
571 CopyBytesBy4(&player[currentPlayer].cardValues[cardToReposition],
572 &player[currentPlayer].cardValues[cardToReposition+1],
573 player[currentPlayer].numCards-1-cardToReposition);
574 player[currentPlayer].numCards--;
575 discard[discardCounter++] = dragCard;
576 if(player[currentPlayer].numCards == 0 || deckCounter == 52)
582 for(i=0;i<player[currentPlayer].numCards;i++)
584 player[currentPlayer].cardLifted[i] = false;
586 drawButton[currentPlayer].disabled = true;
587 chowButton[currentPlayer].disabled = true;
588 dumpButton[currentPlayer].disabled = true;
589 callButton[currentPlayer].disabled = true;
590 showButton[currentPlayer].disabled = true;
591 doneButton[currentPlayer].disabled = true;
592 player[currentPlayer].callTag = false;
594 currentPlayer %= numOfPlayers;
595 drawButton[currentPlayer].disabled = false;
596 chowButton[currentPlayer].disabled = false;
597 if(player[currentPlayer].numHouseDown >= 2 && player[currentPlayer].callTag == false)
598 callButton[currentPlayer].disabled = false;
603 for(j=0;j<numOfPlayers;j++)
605 Bitmap bitmap = cardBack;
608 xyPositions[j].x,xyPositions[j].y + 75,
609 0, xyPositions[j].y + 75 + bitmap.height
611 for(i=0;i<player[j].numHouseDown;i++)
613 if(player[j].houseDown[i].typeOfHouse == 0)
615 boxHouseDown.right = boxHouseDown.left + bitmap.width +
616 (player[j].houseDown[i].straight.last - player[j].houseDown[i].straight.first) * OFFSETTER1 - 1;
617 if(boxCard.Overlap(boxHouseDown))
619 if(dragCard == MCARD((player[j].houseDown[i].straight.suit),(player[j].houseDown[i].straight.first)) - 4)
621 player[j].houseDown[i].straight.first --;
622 CopyBytesBy4(&player[currentPlayer].cardValues[cardToReposition],
623 &player[currentPlayer].cardValues[cardToReposition+1],
624 player[currentPlayer].numCards-1-cardToReposition);
625 player[currentPlayer].numCards--;
626 player[j].callTag = true;
631 else if(dragCard == MCARD((player[j].houseDown[i].straight.suit),(player[j].houseDown[i].straight.last )) + 4)
633 player[j].houseDown[i].straight.last ++;
634 CopyBytesBy4(&player[currentPlayer].cardValues[cardToReposition],
635 &player[currentPlayer].cardValues[cardToReposition+1],
636 player[currentPlayer].numCards-1-cardToReposition);
637 player[currentPlayer].numCards--;
638 player[j].callTag = true;
644 (player[j].houseDown[i].straight.last - player[j].houseDown[i].straight.first + 2) * OFFSETTER1;
646 else if(player[j].houseDown[i].typeOfHouse == 1)
648 if(player[j].houseDown[i].kind.suits[0] == false || player[j].houseDown[i].kind.suits[1] == false ||
649 player[j].houseDown[i].kind.suits[2] == false || player[j].houseDown[i].kind.suits[3] == false)
652 boxHouseDown.right = boxHouseDown.left + (2 * OFFSETTER1) + bitmap.width - 1;
658 if(boxCard.Overlap(boxHouseDown))
660 if(NUMBER(dragCard) == player[j].houseDown[i].kind.number)
662 player[j].houseDown[i].kind.suits[KIND(dragCard)] = true;
663 CopyBytesBy4(&player[currentPlayer].cardValues[cardToReposition],
664 &player[currentPlayer].cardValues[cardToReposition+1],
665 player[currentPlayer].numCards-1-cardToReposition);
666 player[currentPlayer].numCards--;
667 player[j].callTag = true;
672 boxHouseDown.left += (h * OFFSETTER1);
677 flagButtonDown = false;
684 bool OnLeftDoubleClick(int x, int y, Modifiers mods)
687 for(i=player[currentPlayer].numCards-1;i>=0;i--)
689 Bitmap bitmap = bitmapCards[player[currentPlayer].cardValues[i]];
692 xyPositions[currentPlayer].x + (OFFSETTER1 * i),
693 (player[currentPlayer].cardLifted[i] ? (xyPositions[currentPlayer].y - OFFSETTER2 - 20) :(xyPositions[currentPlayer].y - OFFSETTER2)),
694 bitmap.width + (xyPositions[currentPlayer].x + OFFSETTER1 * i),
695 bitmap.height + (player[currentPlayer].cardLifted[i] ? (xyPositions[currentPlayer].y - OFFSETTER2 - 20) : (xyPositions[currentPlayer].y - OFFSETTER2))
696 }.IsPointInside(Point{x,y}))
698 player[currentPlayer].cardLifted[i] ^= true;
707 bool OnRightButtonDown(int x, int y, Modifiers mods)
713 for(i=player[currentPlayer].numCards-1;i>=0;i--)
715 Bitmap bitmap = bitmapCards[player[currentPlayer].cardValues[i]];
717 xyPositions[currentPlayer].x + (OFFSETTER1 * i),
718 (player[currentPlayer].cardLifted[i] ? (xyPositions[currentPlayer].y - OFFSETTER2 - 20) :(xyPositions[currentPlayer].y - OFFSETTER2)),
719 bitmap.width + (xyPositions[currentPlayer].x + OFFSETTER1 * i),
720 bitmap.height + (player[currentPlayer].cardLifted[i] ? (xyPositions[currentPlayer].y - OFFSETTER2 - 20) : (xyPositions[currentPlayer].y - OFFSETTER2))
721 }.IsPointInside(Point{x,y}) && drawButton[currentPlayer].disabled)
724 dragCard = player[currentPlayer].cardValues[i];
725 cardToReposition = i;
726 width = bitmap.width;
727 height = bitmap.height;
728 xCursorPositionAtCard = (xyPositions[currentPlayer].x + (OFFSETTER1 * i)) - x;
729 yCursorPositionAtCard = (player[currentPlayer].cardLifted[i] ?
730 (xyPositions[currentPlayer].y - OFFSETTER2 - y - 20) :
731 (xyPositions[currentPlayer].y - OFFSETTER2 - y));
732 flagButtonDown = true;
733 OnMouseMove(x,y,mods);
742 bool OnRightButtonUp(int x, int y, Modifiers mods)
744 Bitmap bitmap = cardBack;
745 int swapCard,dest,source,i;
746 Box boxPlayerCards={xyPositions[currentPlayer].x,xyPositions[currentPlayer].y - OFFSETTER2,
747 xyPositions[currentPlayer].x + player[currentPlayer].numCards * OFFSETTER1 + bitmap.width,
748 xyPositions[currentPlayer].y - OFFSETTER2 + bitmap.height};
749 Box boxCard = {x + xCursorPositionAtCard,y + yCursorPositionAtCard, x + xCursorPositionAtCard,y + yCursorPositionAtCard + height - 1};
753 if(boxCard.Overlap(boxPlayerCards))
755 swapCard = (x + xCursorPositionAtCard >= player[currentPlayer].numCards * 15 + xyPositions[currentPlayer].x) ?
756 (player[currentPlayer].numCards-1) : ((x + xCursorPositionAtCard - xyPositions[currentPlayer].x) / 15);
757 if(cardToReposition > swapCard)
760 MoveBytes(&player[currentPlayer].cardValues[dest],
761 &player[currentPlayer].cardValues[swapCard],(cardToReposition - swapCard) * sizeof(int));
762 player[currentPlayer].cardValues[swapCard] = dragCard;
763 //player[currentPlayer].cardLifted[swapCard] = false;
767 dest = cardToReposition;
768 source = cardToReposition + 1;
769 MoveBytes(&player[currentPlayer].cardValues[dest],
770 &player[currentPlayer].cardValues[source],(swapCard - cardToReposition) * sizeof(int));
771 player[currentPlayer].cardValues[swapCard] = dragCard;
772 //player[currentPlayer].cardLifted[swapCard] = false;
777 for(i=0;i<player[currentPlayer].numCards;i++)
779 player[currentPlayer].cardLifted[i] = false;
782 flagButtonDown = false;