Loading [MathJax]/extensions/tex2jax.js

Garbage CardGame

This is a fun card game that I learned from camp and I made a game for Windows. It’s easy to play and win. And soon will come more card decks to choose from. The card deck current;y included in the game by default came from Microsoft Windows XP. The game is fun and includes sound effects. The game is portable and doesn’t need to be installed or have administrative rights. Just tell the web browser to run or save the file. There is even a web version as well.

ScreenShots

Game Table

Change Card Deck Window

How to build a card deck?

In order to build a card deck you must create a DLL Resource file with bitmaps. No coding required! Just make sure to name it with a .CAR file extension.
  1. unit garbage1;
  2. //Main Card Game Unit
  3. interface
  4. uses
  5. Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  6. ExtCtrls, StdCtrls, Menus, ComCtrls,shellapi,mmsystem, DBClient, MConnect;
  7. const
  8. Version=$100;
  9. card_error=1;
  10. card_visible=4;
  11. card_flipped=8;
  12. card_exists=2;
  13. card_dead=16+card_flipped;
  14. type
  15. Tgarbagegame = class(TForm)
  16. GroupBox1: TGroupBox;
  17. Image1: TImage;
  18. Image2: TImage;
  19. Image3: TImage;
  20. Image4: TImage;
  21. Image5: TImage;
  22. Image6: TImage;
  23. Image7: TImage;
  24. Image8: TImage;
  25. Image9: TImage;
  26. Image10: TImage;
  27. Image12: TImage;
  28. Image11: TImage;
  29. GroupBox2: TGroupBox;
  30. Image13: TImage;
  31. Image14: TImage;
  32. Image15: TImage;
  33. Image16: TImage;
  34. Image17: TImage;
  35. Image18: TImage;
  36. Image19: TImage;
  37. Image20: TImage;
  38. Image21: TImage;
  39. Image22: TImage;
  40. StatusBar1: TStatusBar;
  41. MainMenu1: TMainMenu;
  42. Game1: TMenuItem;
  43. ChangeBack1: TMenuItem;
  44. Button1: TButton;
  45. Help1: TMenuItem;
  46. AboutGarbage1: TMenuItem;
  47. ListBox1: TListBox;
  48. Rules1: TMenuItem;
  49. KingsAreWild1: TMenuItem;
  50. DCOMConnection1: TDCOMConnection;
  51. procedure FormCreate(Sender: TObject);
  52. procedure ChangeBack1Click(Sender: TObject);
  53. procedure Button1Click(Sender: TObject);
  54. procedure Image13Click(Sender: TObject);
  55. procedure Image11Click(Sender: TObject);
  56. procedure AboutGarbage1Click(Sender: TObject);
  57. procedure ListBox1DblClick(Sender: TObject);
  58. procedure Rules1Click(Sender: TObject);
  59. procedure KingsAreWild1Click(Sender: TObject);
  60. private
  61. { Private declarations }
  62. public
  63. { Public declarations }
  64. end;
  65. TPlayingCard=record
  66. face,suit:byte;
  67. flags:word;
  68. end;
  69. TPlayingCards=array[1..10]of tplayingcard;
  70. procedure newgame;
  71. function pcback(index:integer):pchar;
  72. procedure updatecards;
  73. var
  74. garbagegame: Tgarbagegame;
  75. playerpos:byte=10;
  76. hdeck:hmodule;
  77. computerpos:byte=10;
  78. back:dword;
  79. deck_pics:array[0..12,1..4]of HBITMAP;
  80. hbacks:array[0..11]of hbitmap;
  81. emptyslots:array[0..2]of hbitmap;
  82. Faces:array[0..12]of string=('Ace','Two','Three','Four','Five','Six','Seven',
  83. 'Eight','Nine','Ten','Jack','Queen','King');
  84. Suits:array[1..4]of string=('Clubs','Diamonds','Hearts','Spades');
  85. discard:tlist;
  86. kingswild:dword=1;
  87. cturn,pturn:byte;
  88. candraw:boolean;
  89. gamenum,whoseturn:integer;
  90. harrows:array[0..1]of hicon;
  91. playercards,computercards:tplayingcards;
  92. used:array[0..12,1..4]of boolean;
  93. implementation
  94. {$R *.DFM}
  95. {$RESOURCE DECK.RES}
  96. {$RESOURCE GARBAGE32.RES}
  97. uses garbage2;
  98. procedure endround;
  99. var msg,par:array[0..512]of char;
  100. i:integer;
  101. hk:hkey;
  102. begin
  103. for i:=1to 10do begin if computercards[i].flags and card_flipped=0then
  104. computercards[i].flags:=computercards[i].flags or card_dead;
  105. if playercards[i].flags and card_flipped=0then playercards[i].flags:=
  106. playercards[i].flags or card_dead;
  107. end;
  108. updatecards;
  109. regcreatekey(hkey_current_user,'Software\Justin\Garbage',hk);
  110. regdeletevalue(hk,'SavedGame');
  111. regclosekey(hk);
  112. if inttostr(playerpos)=garbagegame.StatusBar1.Panels[2].text then begin
  113. dec(playerpos);
  114. if playerpos=0 then begin
  115. playsound('GOOD2',hinstance,snd_resource or snd_sync);
  116. if messagebox(garbagegame.handle,strfmt(msg,
  117. 'You won!'#13#10'Your score:0 points'#13#10'Computer score:%d points'#13#10'Play again?',
  118. [computerpos]),'Game Over',mb_yesno)=idno then exit;
  119. computerpos:=10;
  120. playerpos:=10;
  121. gamenum:=0;
  122. end else begin playsound('CLAP',hinstance,snd_resource or snd_sync);messagebox(
  123. garbagegame.handle,strfmt(msg,
  124. 'You won this round!'#13#10'Your score:%d points'#13#10'Computer score:%d points',
  125. [playerpos,computerpos]),'Garbage',0);
  126. end;
  127. end;
  128. if inttostr(computerpos)=garbagegame.StatusBar1.Panels[3].text then begin
  129. dec(computerpos);
  130. if computerpos=0 then begin
  131. if messagebox(garbagegame.handle,strfmt(msg,
  132. 'You lost!'#13#10'Your score:%d'#13#10'Computer score:0 points'#13#10'Play again?',
  133. [playerpos]),'Game Over',mb_yesno)=idno then exit;
  134. computerpos:=10;
  135. playerpos:=10;
  136. gamenum:=0;
  137. end else messagebox(garbagegame.handle,strfmt(msg,
  138. 'You lost this round!'#13#10'Your score:%d points'#13#10'Computer score:%d points',
  139. [playerpos,computerpos]),'Garbage',0);
  140. end;
  141. shellexecute(0,nil,pchar(application.exename),strfmt(par,'%d %d %d %d %d',[
  142. playerpos,computerpos,gamenum,whoseturn,back]),nil,SW_SHOWNORMAL);
  143. exitprocess(0);
  144. end;
  145. procedure reshuffle;
  146. var i:integer;
  147. p:pointer;
  148. c:tplayingcard;
  149. l:tlist;
  150. begin
  151. //With the game being two player I don't think this function will ever be called!
  152. l:=tlist.Create;
  153. for i:=0 to discard.Count-2do begin p:=discard[i];copymemory(@c,@p,4);l.Add(p);
  154. used[c.face,c.suit]:=false;
  155. end;
  156. for i:=0to l.Count-1do discard.Remove(l[i]);
  157. l.Free;
  158. end;
  159. function CardBack:byte;
  160. var rs,rtyp:Dword;
  161. hk:hkey;
  162. begin
  163. RegCreateKey(hkey_current_user,'Software\Justin\Garbage',hk);
  164. back:=255;
  165. rs:=4;
  166. regqueryvalueex(hk,'CardBack',nil,@rtyp,@back,@rs);
  167. result:=back;
  168. regclosekey(hk);
  169. if back>11then back:=strtointdef(paramstr(5),random(12));
  170. end;
  171. function allused:boolean;
  172. var i,j:integer;
  173. begin
  174. result :=true;
  175. for i:=0to 12do for j:=1to 4do result:= result and used[i,j];
  176. end;
  177. function drawcard:tplayingcard;
  178. label newcard;
  179. begin
  180. result.flags:=card_error;
  181. if allused then exit;
  182. newcard:
  183. result.suit:=Random(4)+1;
  184. result.face:=random(13);
  185. if used[result.face,result.suit] then goto newcard;
  186. used[result.face,result.suit]:=true;
  187. result.flags:=card_exists;
  188. end;
  189. procedure playermoveenable;
  190. var p:pointer;
  191. c:tplayingcard;
  192. begin
  193. garbagegame.Image13.Enabled:=false;
  194. garbagegame.Image14.Enabled:=false;
  195. garbagegame.Image15.Enabled:=false;
  196. garbagegame.Image16.Enabled:=false;
  197. garbagegame.Image17.Enabled:=false;
  198. garbagegame.Image18.Enabled:=false;
  199. garbagegame.Image19.Enabled:=false;
  200. garbagegame.Image20.Enabled:=false;
  201. garbagegame.Image21.Enabled:=false;
  202. garbagegame.Image22.Enabled:=false;
  203. p:=discard.Last;
  204. copymemory(@c,@p,4);
  205. if(c.face<10)then
  206. if((1+c.face)>playerpos)and(c.face<12)then exit;
  207. if(c.face<10)then
  208. if playercards[c.face+1].flags and card_flipped>0then exit;
  209. case c.face of
  210. 0:garbagegame.Image13.Enabled:=true;
  211. 1:garbagegame.Image14.Enabled:=true;
  212. 2:garbagegame.Image15.Enabled:=true;
  213. 3:garbagegame.Image16.Enabled:=true;
  214. 4:garbagegame.Image17.Enabled:=true;
  215. 5:garbagegame.Image18.Enabled:=true;
  216. 6:garbagegame.Image19.Enabled:=true;
  217. 7:garbagegame.Image20.Enabled:=true;
  218. 8:garbagegame.Image21.Enabled:=true;
  219. 9:garbagegame.Image22.Enabled:=true;
  220. end;
  221. if(kingswild=1)and(c.face=12)then begin
  222. garbagegame.Image13.Enabled:=(playercards[1].flags and card_flipped=0);
  223. garbagegame.Image14.Enabled:=(playercards[2].flags and card_flipped=0);
  224. garbagegame.Image15.Enabled:=(playercards[3].flags and card_flipped=0);
  225. garbagegame.Image16.Enabled:=(playercards[4].flags and card_flipped=0);
  226. garbagegame.Image17.Enabled:=(playercards[5].flags and card_flipped=0);
  227. garbagegame.Image18.Enabled:=(playercards[6].flags and card_flipped=0);
  228. garbagegame.Image19.Enabled:=(playercards[7].flags and card_flipped=0);
  229. garbagegame.Image20.Enabled:=(playercards[8].flags and card_flipped=0);
  230. garbagegame.Image21.Enabled:=(playercards[9].flags and card_flipped=0);
  231. garbagegame.Image22.Enabled:=(playercards[10].flags and card_flipped=0);
  232. end;
  233. end;
  234. procedure AddCardToListBox(car:pointer;typ:integer;nturns:pbyte);
  235. var c:tplayingcard;
  236. p:pointer;
  237. rwave:array[0..8]of char;
  238. begin
  239. p:=car;
  240. copymemory(@C,@p,4);
  241. if nturns<>nil then nturns^:=nturns^+1;
  242. case typ of
  243. 0:garbagegame.ListBox1.Items.insert(0,format('You drawn an %s of %s.',[faces[c.face],
  244. suits[c.suit]]));
  245. 1:begin garbagegame.ListBox1.Items.insert(0,format('You flipped over an %s of %s.',
  246. [faces[c.face],suits[c.suit]]));if nturns=nil then playsound('DING',hinstance,
  247. snd_Resource or SND_SYNC)else if nturns^>3 then playsound(strfmt(rwave,'GOOD%d',
  248. [random(3)]),hinstance,snd_Resource or SND_SYNC)else playsound('DING',hinstance,
  249. snd_Resource or SND_SYNC);end;
  250. 2:garbagegame.ListBox1.Items.insert(0,format('Computer has drawn an %s of %s.',[
  251. faces[c.face],suits[c.suit]]));
  252. 3:Begin garbagegame.ListBox1.Items.insert(0,format(
  253. 'Computer has flipped over an %s of %s.',[faces[c.face],suits[c.suit]]));
  254. if nturns=nil then playsound('DING',hinstance,snd_Resource or SND_SYNC)else if
  255. nturns^>3 then playsound(strfmt(rwave,'GOOD%d',[random(3)]),hinstance,
  256. snd_Resource or SND_SYNC)else playsound('DING',hinstance,snd_Resource or SND_SYNC);end;
  257. end;
  258. end;
  259. procedure NewGame;
  260. var i:integer;
  261. begin
  262. candraw:=true;
  263. discard.clear;
  264. Garbagegame.StatusBar1.Panels[1].text:=format('%d/%d',[playerpos,computerpos]);
  265. for i:=2 to 3do
  266. garbagegame.StatusBar1.Panels[i].text:='0';
  267. inc(gamenum);
  268. garbagegame.StatusBar1.Panels[0].text:=format('Game %d',[gamenum]);
  269. zeromemory(@used,sizeof(used));
  270. zeromemory(@playercards,sizeof(playercards));
  271. zeromemory(@computercards,sizeof(computercards));
  272. for i:=1to playerpos do playercards[i]:=drawcard;
  273. for i:=1to computerpos do computercards[i]:= drawcard;
  274. if allused then reshuffle;
  275. discard.Add(pointer(drawcard));
  276. addcardtolistbox(discard.Last,0,nil);
  277. garbagegame.Image11.Enabled:=false;
  278. playermoveenable;
  279. garbagegame.Button1.visible:=true;
  280. end;
  281. function pccard(i,j:integer):pchar;
  282. begin
  283. result:=stralloc(8);
  284. strfmt(result,'CARD%d%x',[j,i]);
  285. end;
  286. function pcback(index:integer):pchar;
  287. begin
  288. result:=stralloc(8);
  289. strfmt(result,'BACK%d',[index]);
  290. end;
  291. procedure updatecards;
  292. var p:pointer;
  293. c:tplayingcard;
  294. i,j:integer;
  295. pc:pchar;
  296. nocard:tbitmap;
  297. begin
  298. candraw:=not allused;
  299. with garbagegame do begin
  300. image1.Transparent:=(computercards[1].flags and card_dead=card_dead);
  301. image2.Transparent:=(computercards[2].flags and card_dead=card_dead);
  302. image3.Transparent:=(computercards[3].flags and card_dead=card_dead);
  303. image4.Transparent:=(computercards[4].flags and card_dead=card_dead);
  304. image5.Transparent:=(computercards[5].flags and card_dead=card_dead);
  305. image6.Transparent:=(computercards[6].flags and card_dead=card_dead);
  306. image7.Transparent:=(computercards[7].flags and card_dead=card_dead);
  307. image8.Transparent:=(computercards[8].flags and card_dead=card_dead);
  308. image9.Transparent:=(computercards[9].flags and card_dead=card_dead);
  309. image10.Transparent:=(computercards[10].flags and card_dead=card_dead);
  310. image13.Transparent:=(playercards[1].flags and card_dead=card_dead);
  311. image14.Transparent:=(playercards[2].flags and card_dead=card_dead);
  312. image15.Transparent:=(playercards[3].flags and card_dead=card_dead);
  313. image16.Transparent:=(playercards[4].flags and card_dead=card_dead);
  314. image17.Transparent:=(playercards[5].flags and card_dead=card_dead);
  315. image18.Transparent:=(playercards[6].flags and card_dead=card_dead);
  316. image19.Transparent:=(playercards[7].flags and card_dead=card_dead);
  317. image20.Transparent:=(playercards[8].flags and card_dead=card_dead);
  318. image21.Transparent:=(playercards[9].flags and card_dead=card_dead);
  319. image22.Transparent:=(playercards[10].flags and card_dead=card_dead);
  320. end;
  321. for i:=0to 2do begin deleteobject(emptyslots[i]);pc:=pccard(i,0);emptyslots[i]:=loadbitmap(hdeck,pc);
  322. strdispose(pc);end;
  323. for i:=0to 11 do begin deleteobject(hbacks[i]);pc:=pcback(i);hbacks[i]:=loadbitmap(hdeck,pc);
  324. strdispose(pc);end;
  325. for i:=0 to 12do for j:=1to 4do begin deleteobject(deck_pics[i,j]);pc:=pccard(i,j);deck_pics[i,j]:=
  326. loadbitmap(hdeck,pc);strdispose(pc);end;
  327. if computercards[1].flags and card_flipped=0then
  328. garbagegame.image1.picture.bitmap.handle:= hbacks[back] else
  329. garbagegame.image1.picture.bitmap.handle:= deck_pics[computercards[1].face,
  330. computercards[1].suit];
  331. if computercards[2].flags and card_flipped=0then
  332. garbagegame.image2.picture.bitmap.handle:= hbacks[back] else
  333. garbagegame.image2.picture.bitmap.handle:= deck_pics[computercards[2].face,
  334. computercards[2].suit];
  335. if computercards[3].flags and card_flipped=0then
  336. garbagegame.image3.picture.bitmap.handle:= hbacks[back] else
  337. garbagegame.image3.picture.bitmap.handle:= deck_pics[computercards[3].face,
  338. computercards[3].suit];
  339. if computercards[4].flags and card_flipped=0then
  340. garbagegame.image4.picture.bitmap.handle:= hbacks[back] else
  341. garbagegame.image4.picture.bitmap.handle:= deck_pics[computercards[4].face,
  342. computercards[4].suit];
  343. if computercards[5].flags and card_flipped=0then
  344. garbagegame.image5.picture.bitmap.handle:= hbacks[back] else
  345. garbagegame.image5.picture.bitmap.handle:= deck_pics[computercards[5].face,
  346. computercards[5].suit];
  347. if computercards[6].flags and card_flipped=0then
  348. garbagegame.image6.picture.bitmap.handle:= hbacks[back] else
  349. garbagegame.image6.picture.bitmap.handle:= deck_pics[computercards[6].face,
  350. computercards[6].suit];
  351. if computercards[7].flags and card_flipped=0then
  352. garbagegame.image7.picture.bitmap.handle:= hbacks[back] else
  353. garbagegame.image7.picture.bitmap.handle:= deck_pics[computercards[7].face,
  354. computercards[7].suit];
  355. if computercards[8].flags and card_flipped=0then
  356. garbagegame.image8.picture.bitmap.handle:= hbacks[back] else
  357. garbagegame.image8.picture.bitmap.handle:= deck_pics[computercards[8].face,
  358. computercards[8].suit];
  359. if computercards[9].flags and card_flipped=0then
  360. garbagegame.image9.picture.bitmap.handle:= hbacks[back] else
  361. garbagegame.image9.picture.bitmap.handle:= deck_pics[computercards[9].face,
  362. computercards[9].suit];
  363. if computercards[10].flags and card_flipped=0then
  364. garbagegame.image10.picture.bitmap.handle:= hbacks[back] else
  365. garbagegame.image10.picture.bitmap.handle:= deck_pics[computercards[10].face,
  366. computercards[10].suit];
  367. if discard.Count=0 then garbagegame.Image12.Picture.Bitmap.Handle:=emptyslots[0]
  368. else begin p:=discard.Last;Copymemory(@c,@p,4);
  369. garbagegame.Image12.Picture.Bitmap.handle:=deck_pics[c.face,c.suit];
  370. end;
  371. if playercards[1].flags and card_flipped=0then
  372. garbagegame.image13.picture.bitmap.handle:= hbacks[back] else
  373. garbagegame.image13.picture.bitmap.handle:= deck_pics[playercards[1].face,
  374. playercards[1].suit];
  375. if playercards[2].flags and card_flipped=0then
  376. garbagegame.image14.picture.bitmap.handle:= hbacks[back] else
  377. garbagegame.image14.picture.bitmap.handle:= deck_pics[playercards[2].face,
  378. playercards[2].suit];
  379. if playercards[3].flags and card_flipped=0then
  380. garbagegame.image15.picture.bitmap.handle:= hbacks[back] else
  381. garbagegame.image15.picture.bitmap.handle:= deck_pics[playercards[3].face,
  382. playercards[3].suit];
  383. if playercards[4].flags and card_flipped=0then
  384. garbagegame.image16.picture.bitmap.handle:= hbacks[back] else
  385. garbagegame.image16.picture.bitmap.handle:= deck_pics[playercards[4].face,
  386. playercards[4].suit];
  387. if playercards[5].flags and card_flipped=0then
  388. garbagegame.image17.picture.bitmap.handle:= hbacks[back] else
  389. garbagegame.image17.picture.bitmap.handle:= deck_pics[playercards[5].face,
  390. playercards[5].suit];
  391. if playercards[6].flags and card_flipped=0then
  392. garbagegame.image18.picture.bitmap.handle:= hbacks[back] else
  393. garbagegame.image18.picture.bitmap.handle:= deck_pics[playercards[6].face,
  394. playercards[6].suit];
  395. if playercards[7].flags and card_flipped=0then
  396. garbagegame.image19.picture.bitmap.handle:= hbacks[back] else
  397. garbagegame.image19.picture.bitmap.handle:= deck_pics[playercards[7].face,
  398. playercards[7].suit];
  399. if playercards[8].flags and card_flipped=0then
  400. garbagegame.image20.Picture.bitmap.handle:= hbacks[back] else
  401. garbagegame.image20.picture.bitmap.handle:= deck_pics[playercards[8].face,
  402. playercards[8].suit];
  403. if playercards[9].flags and card_flipped=0then
  404. garbagegame.image21.picture.bitmap.handle:= hbacks[back] else
  405. garbagegame.image21.picture.bitmap.handle:= deck_pics[playercards[9].face,
  406. playercards[9].suit];
  407. if playercards[10].flags and card_flipped=0then
  408. garbagegame.image22.picture.bitmap.handle:= hbacks[back] else
  409. garbagegame.image22.picture.bitmap.handle:= deck_pics[playercards[10].face,
  410. playercards[10].suit];
  411. if allused then garbagegame.Image11.Picture.Bitmap.Handle:=emptyslots[2]
  412. else garbagegame.Image11.Picture.Bitmap.handle:=hbacks[back];
  413. end;
  414. function computerthread(dummy:pointer):dword;stdcall;
  415. var p:pointer;
  416. c,cd:tplayingcard;
  417. drawused:boolean;
  418. i,kingpos:integer;
  419. label draw,discard0,endturn,ktry;
  420. begin
  421. inc(whoseturn);
  422. cturn:=0;
  423. pturn:=0;
  424. garbagegame.Button1.Visible:=false;
  425. drawused:=false;
  426. discard0:
  427. p:=discard.Last;
  428. copymemory(@c,@p,4);
  429. if(c.face=12)and(kingswild=1)then begin
  430. ktry:kingpos:=random(computerpos)+1;
  431. if(computercards[kingpos].flags and card_flipped>0)then goto ktry;
  432. i:=strtoint(garbagegame.statusbar1.panels[3].text)+1;
  433. garbagegame.StatusBar1.Panels[3].text:=inttostr(i);
  434. discard[discard.Count-1]:=pointer(computercards[kingpos]);
  435. c.flags:=c.flags or card_flipped;
  436. computercards[kingpos]:=c;
  437. addcardtolistbox(discard.last,3,@cturn);
  438. drawused:=true;
  439. updatecards;
  440. if i=computerpos then begin endround;exit;end;
  441. goto discard0;
  442. end;
  443. if c.face+1>computerpos then goto draw;
  444. if computercards[c.face+1].flags and card_flipped>0then goto draw;
  445. i:=strtoint(garbagegame.statusbar1.panels[3].text)+1;
  446. garbagegame.StatusBar1.Panels[3].text:=inttostr(i);
  447. discard[discard.Count-1]:=pointer(computercards[c.face+1]);
  448. c.flags:=c.flags or card_flipped;
  449. computercards[c.face+1]:=c;
  450. addcardtolistbox(discard.last,3,@cturn);
  451. drawused:=true;
  452. updatecards;
  453. if i=computerpos then begin endround;exit;end;
  454. goto discard0;
  455. draw:
  456. sleep(1000);
  457. if drawused then goto endturn;
  458. drawused:=true;
  459. if allused then reshuffle;
  460. discard.Add(pointer(drawcard));
  461. addcardtolistbox(discard.last,2,nil);
  462. goto discard0;
  463. endturn:garbagegame.Button1.Visible:=true;
  464. updatecards;
  465. playermoveenable;
  466. garbagegame.Image11.Enabled:=true;
  467. end;
  468. procedure Tgarbagegame.FormCreate(Sender: TObject);
  469. var i,j:integer;
  470. pc:pchar;
  471. hk:hkey;
  472. tid,rs:dword;
  473. deckdll:array[0..max_path]of char;
  474. begin
  475. randomize;
  476. candraw:=true;
  477. discard:=tlist.Create;
  478. regcreatekey(hkey_current_User,'Software\Justin\Garbage',hk);
  479. if regqueryvalueex(hk,'DeckDLL',nil,nil,@deckdll,@rs)=error_success then
  480. hdeck:=loadlibrary(deckdll)else hdeck:=hinstance;cardback;
  481. rs:=4;
  482. regqueryvalueex(hk,'KingsWild',nil,nil,@kingswild,@rs);
  483. kingsarewild1.checked:=(kingswild=1);
  484. playerpos:=strtointdef(paramstr(1),10);
  485. computerpos:=strtointdef(paramstr(2),10);
  486. gamenum:=strtointdef(paramstr(3),0);
  487. regclosekey(hk);
  488. whoseturn:=strtointdef(paramstr(4),0);
  489. image1.Visible:=true;
  490. image2.Visible:=(computerpos>1);
  491. image3.Visible:=(computerpos>2);
  492. image4.Visible:=(computerpos>3);
  493. image5.Visible:=(computerpos>4);
  494. image6.Visible:=(computerpos>5);
  495. image7.Visible:=(computerpos>6);
  496. image8.Visible:=(computerpos>7);
  497. image9.Visible:=(computerpos>8);
  498. image10.Visible:=(computerpos>9);
  499. image13.Visible:=true;
  500. image14.Visible:=(playerpos>1);
  501. image15.Visible:=(playerpos>2);
  502. image16.Visible:=(playerpos>3);
  503. image17.Visible:=(playerpos>4);
  504. image18.Visible:=(playerpos>5);
  505. image19.Visible:=(playerpos>6);
  506. image20.Visible:=(playerpos>7);
  507. image21.Visible:=(playerpos>8);
  508. image22.Visible:=(playerpos>9);
  509. pturn:=0;
  510. newgame;
  511. updatecards;
  512. end;
  513. procedure Tgarbagegame.ChangeBack1Click(Sender: TObject);
  514. begin
  515. changebackwnd.Visible:=true;
  516. changebackwnd.BringToFront;
  517. visible:=false;
  518. end;
  519. procedure Tgarbagegame.Button1Click(Sender: TObject);
  520. var tid:dword;
  521. begin
  522. createthread(nil,0,@computerthread,nil,0,tid);
  523. end;
  524. procedure Tgarbagegame.Image13Click(Sender: TObject);
  525. var p:pointer;
  526. c,cd:tplayingcard;
  527. i:integer;
  528. begin
  529. inc(whoseturn);
  530. p:=discard.Last;
  531. copymemory(@c,@p,4);
  532. if kingswild=0 then
  533. if TImage(sender).tag<>c.face then exit;
  534. cd:=playercards[TImage(sender).tag+1];
  535. discard[discard.Count-1]:=pointer(cd);
  536. addcardtolistbox(discard.last,1,@pturn);
  537. playercards[timage(sender).tag+1]:=c;
  538. playercards[timage(sender).tag+1].flags:=c.flags or card_flipped;
  539. playermoveenable;
  540. garbagegame.Image11.Enabled:=false;
  541. updatecards;
  542. i:=strtoint(statusbar1.panels[2].text)+1;
  543. statusbar1.Panels[2].text:=inttostr(i);
  544. if i=playerpos then begin endround;exit;end;
  545. end;
  546. procedure Tgarbagegame.Image11Click(Sender: TObject);
  547. begin
  548. if allused then reshuffle;
  549. discard.add(pointer(drawcard));
  550. addcardtolistbox(discard.last,0,nil);
  551. updatecards;
  552. image11.Enabled:=false;
  553. playermoveenable;
  554. end;
  555. procedure Tgarbagegame.AboutGarbage1Click(Sender: TObject);
  556. var aboutt:array[0..1024]of char;
  557. begin
  558. messagebox(handle,strfmt(aboutt,
  559. 'Garbage v%d.%d by Justin Roeder.'#13#10'Special thanks goes to Camp CILCA'#13#10'Website: https://delphijustin.biz',[
  560. hibyte(version),lobyte(version)]),'About Garbage',0);
  561. end;
  562. procedure Tgarbagegame.ListBox1DblClick(Sender: TObject);
  563. begin
  564. messagebox(handle,PChar(Listbox1.items[listbox1.itemindex]),'Garbage',0);
  565. end;
  566. procedure Tgarbagegame.Rules1Click(Sender: TObject);
  567. begin
  568. shellexecute(handle,nil,'http://www.gathertogethergames.com/garbage',nil,nil,
  569. sw_show);
  570. end;
  571. procedure Tgarbagegame.KingsAreWild1Click(Sender: TObject);
  572. var hk:hkey;
  573. begin
  574. kingsarewild1.Checked:=not kingsarewild1.Checked;
  575. if kingsarewild1.Checked then kingswild:=1 else kingswild:=0;
  576. regcreatekey(hkey_current_user,'Software\Justin\Garbage',hk);
  577. regsetvalueex(hk,'KingsWild',0,reg_dword,@kingswild,4);
  578. regclosekey(hk);
  579. end;
  580. end.
  581. unit garbage2;
  582. //Change CardDeck Unit
  583. interface
  584. uses
  585. Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  586. StdCtrls, ExtCtrls, ExtDlgs,Shellapi;
  587. type
  588. Tchangebackwnd = class(TForm)
  589. ScrollBar1: TScrollBar;
  590. Button1: TButton;
  591. Button2: TButton;
  592. CheckBox1: TCheckBox;
  593. Button3: TButton;
  594. Button4: TButton;
  595. OpenDialog1: TOpenDialog;
  596. Button5: TButton;
  597. procedure Button1Click(Sender: TObject);
  598. procedure ScrollBar1Change(Sender: TObject);
  599. procedure Button2Click(Sender: TObject);
  600. procedure FormPaint(Sender: TObject);
  601. procedure FormClose(Sender: TObject; var Action: TCloseAction);
  602. procedure Button4Click(Sender: TObject);
  603. procedure Button3Click(Sender: TObject);
  604. procedure Button5Click(Sender: TObject);
  605. private
  606. { Private declarations }
  607. public
  608. { Public declarations }
  609. end;
  610. var
  611. changebackwnd: Tchangebackwnd;
  612. implementation
  613. {$R *.DFM}
  614. uses garbage1;
  615. procedure Tchangebackwnd.Button1Click(Sender: TObject);
  616. var hk:hkey;
  617. ba:dword;
  618. begin
  619. regcreatekey(hkey_current_user,'software\Justin\Garbage',hk);
  620. if checkbox1.checked then ba:=255 else ba:=scrollbar1.Position;
  621. Regsetvalueex(hk,'CardBack',0,reg_dword,@ba,4);
  622. regclosekey(hk);
  623. if ba=255then back:=random(12)else back:=ba;
  624. updatecards;
  625. close;
  626. end;
  627. procedure Tchangebackwnd.ScrollBar1Change(Sender: TObject);
  628. begin
  629. formpaint(nil);
  630. end;
  631. procedure Tchangebackwnd.Button2Click(Sender: TObject);
  632. begin
  633. close;
  634. end;
  635. procedure Tchangebackwnd.FormPaint(Sender: TObject);
  636. var bmp:tbitmap;
  637. backst:array[0..8]of char;
  638. begin
  639. bmp:=tbitmap.Create;
  640. bmp.Handle:=loadbitmap(hdeck,strfmt(backst,'BACK%d',[scrollbar1.position]));
  641. canvas.Draw(0,0,bmp);
  642. bmp.FreeImage;
  643. bmp.Free;
  644. end;
  645. procedure Tchangebackwnd.FormClose(Sender: TObject;
  646. var Action: TCloseAction);
  647. begin
  648. garbagegame.Visible:=true;
  649. end;
  650. procedure Tchangebackwnd.Button4Click(Sender: TObject);
  651. var hk:hkey;
  652. begin
  653. regcreatekey(hkey_current_user,'Software\Justin\Garbage',hk);
  654. regdeletevalue(hk,'DeckDLL');
  655. Regdeletevalue(hk,'CardBack');
  656. regclosekey(hk);
  657. end;
  658. procedure Tchangebackwnd.Button3Click(Sender: TObject);
  659. var hk:hkey;
  660. hdec:hmodule;
  661. buff:array[0..max_path]of char;
  662. begin
  663. if not opendialog1.Execute then exit;
  664. hdec:=loadlibrary(pchar(opendialog1.filename));
  665. if hdec=0 then begin messagebox(handle,pchar(syserrormessage(getlasterror)),
  666. 'delphijustin Card Deck',mb_iconerror);exit;end;
  667. hdeck:=hdec;
  668. regcreatekey(hkey_current_user,'Software\Justin\Garbage',hk);
  669. regsetvalueex(hk,'DeckDLL',0,reg_sz,strpcopy(buff,opendialog1.filename),length(
  670. opendialog1.filename)+1);
  671. Regclosekey(hk);
  672. repaint;
  673. end;
  674. procedure Tchangebackwnd.Button5Click(Sender: TObject);
  675. begin
  676. shellexecute(handle,nil,'https://delphijustin.biz/bin/carddecks/',nil,nil,sw_show);
  677. end;
  678. end.
unit garbage1;
//Main Card Game Unit
interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls, StdCtrls, Menus, ComCtrls,shellapi,mmsystem, DBClient, MConnect;
const
Version=$100;
card_error=1;
card_visible=4;
card_flipped=8;
card_exists=2;
card_dead=16+card_flipped;
type
  Tgarbagegame = class(TForm)
    GroupBox1: TGroupBox;
    Image1: TImage;
    Image2: TImage;
    Image3: TImage;
    Image4: TImage;
    Image5: TImage;
    Image6: TImage;
    Image7: TImage;
    Image8: TImage;
    Image9: TImage;
    Image10: TImage;
    Image12: TImage;
    Image11: TImage;
    GroupBox2: TGroupBox;
    Image13: TImage;
    Image14: TImage;
    Image15: TImage;
    Image16: TImage;
    Image17: TImage;
    Image18: TImage;
    Image19: TImage;
    Image20: TImage;
    Image21: TImage;
    Image22: TImage;
    StatusBar1: TStatusBar;
    MainMenu1: TMainMenu;
    Game1: TMenuItem;
    ChangeBack1: TMenuItem;
    Button1: TButton;
    Help1: TMenuItem;
    AboutGarbage1: TMenuItem;
    ListBox1: TListBox;
    Rules1: TMenuItem;
    KingsAreWild1: TMenuItem;
    DCOMConnection1: TDCOMConnection;
    procedure FormCreate(Sender: TObject);
    procedure ChangeBack1Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Image13Click(Sender: TObject);
    procedure Image11Click(Sender: TObject);
    procedure AboutGarbage1Click(Sender: TObject);
    procedure ListBox1DblClick(Sender: TObject);
    procedure Rules1Click(Sender: TObject);
    procedure KingsAreWild1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
TPlayingCard=record
face,suit:byte;
flags:word;
end;
TPlayingCards=array[1..10]of tplayingcard;
procedure newgame;
function pcback(index:integer):pchar;
procedure updatecards;
var
  garbagegame: Tgarbagegame;
  playerpos:byte=10;
  hdeck:hmodule;
  computerpos:byte=10;
  back:dword;
  deck_pics:array[0..12,1..4]of HBITMAP;
hbacks:array[0..11]of hbitmap;
emptyslots:array[0..2]of hbitmap;
Faces:array[0..12]of string=('Ace','Two','Three','Four','Five','Six','Seven',
'Eight','Nine','Ten','Jack','Queen','King');
Suits:array[1..4]of string=('Clubs','Diamonds','Hearts','Spades');
discard:tlist;
kingswild:dword=1;
cturn,pturn:byte;
candraw:boolean;
gamenum,whoseturn:integer;
harrows:array[0..1]of hicon;
playercards,computercards:tplayingcards;
used:array[0..12,1..4]of boolean;
implementation

{$R *.DFM}
{$RESOURCE DECK.RES}
{$RESOURCE GARBAGE32.RES}
uses garbage2;

procedure endround;
var msg,par:array[0..512]of char;
i:integer;
hk:hkey;
begin
for i:=1to 10do begin if computercards[i].flags and card_flipped=0then
computercards[i].flags:=computercards[i].flags or card_dead;
if playercards[i].flags and card_flipped=0then playercards[i].flags:=
playercards[i].flags or card_dead;
end;
updatecards;
regcreatekey(hkey_current_user,'Software\Justin\Garbage',hk);
regdeletevalue(hk,'SavedGame');
regclosekey(hk);
if inttostr(playerpos)=garbagegame.StatusBar1.Panels[2].text then begin
dec(playerpos);
if playerpos=0 then begin
playsound('GOOD2',hinstance,snd_resource or snd_sync);
if messagebox(garbagegame.handle,strfmt(msg,
'You won!'#13#10'Your score:0 points'#13#10'Computer score:%d points'#13#10'Play again?',
[computerpos]),'Game Over',mb_yesno)=idno then exit;
computerpos:=10;
playerpos:=10;
gamenum:=0;
end else begin playsound('CLAP',hinstance,snd_resource or snd_sync);messagebox(
garbagegame.handle,strfmt(msg,
'You won this round!'#13#10'Your score:%d points'#13#10'Computer score:%d points',
[playerpos,computerpos]),'Garbage',0);
end;
end;
if inttostr(computerpos)=garbagegame.StatusBar1.Panels[3].text then begin
dec(computerpos);
if computerpos=0 then begin
if messagebox(garbagegame.handle,strfmt(msg,
'You lost!'#13#10'Your score:%d'#13#10'Computer score:0 points'#13#10'Play again?',
[playerpos]),'Game Over',mb_yesno)=idno then exit;
computerpos:=10;
playerpos:=10;
gamenum:=0;
end else messagebox(garbagegame.handle,strfmt(msg,
'You lost this round!'#13#10'Your score:%d points'#13#10'Computer score:%d points',
[playerpos,computerpos]),'Garbage',0);
end;
shellexecute(0,nil,pchar(application.exename),strfmt(par,'%d %d %d %d %d',[
playerpos,computerpos,gamenum,whoseturn,back]),nil,SW_SHOWNORMAL);
exitprocess(0);
end;
procedure reshuffle;
var i:integer;
p:pointer;
c:tplayingcard;
l:tlist;
begin
//With the game being two player I don't think this function will ever be called!
l:=tlist.Create;
for i:=0 to discard.Count-2do begin p:=discard[i];copymemory(@c,@p,4);l.Add(p);
used[c.face,c.suit]:=false;
end;
for i:=0to l.Count-1do discard.Remove(l[i]);
l.Free;
end;
function CardBack:byte;
var rs,rtyp:Dword;
hk:hkey;
begin
RegCreateKey(hkey_current_user,'Software\Justin\Garbage',hk);
back:=255;
rs:=4;
regqueryvalueex(hk,'CardBack',nil,@rtyp,@back,@rs);
result:=back;
regclosekey(hk);
if back>11then back:=strtointdef(paramstr(5),random(12));
end;
function allused:boolean;
var i,j:integer;
begin
result :=true;
for i:=0to 12do for j:=1to 4do result:= result and used[i,j];
end;
function drawcard:tplayingcard;
label newcard;
begin
result.flags:=card_error;
if allused then exit;
newcard:
result.suit:=Random(4)+1;
result.face:=random(13);
if used[result.face,result.suit] then goto newcard;
used[result.face,result.suit]:=true;
result.flags:=card_exists;
end;

procedure playermoveenable;
var p:pointer;
c:tplayingcard;
begin
garbagegame.Image13.Enabled:=false;
garbagegame.Image14.Enabled:=false;
garbagegame.Image15.Enabled:=false;
garbagegame.Image16.Enabled:=false;
garbagegame.Image17.Enabled:=false;
garbagegame.Image18.Enabled:=false;
garbagegame.Image19.Enabled:=false;
garbagegame.Image20.Enabled:=false;
garbagegame.Image21.Enabled:=false;
garbagegame.Image22.Enabled:=false;
p:=discard.Last;
copymemory(@c,@p,4);
if(c.face<10)then
if((1+c.face)>playerpos)and(c.face<12)then exit;
if(c.face<10)then
if playercards[c.face+1].flags and card_flipped>0then exit;
case c.face of
0:garbagegame.Image13.Enabled:=true;
1:garbagegame.Image14.Enabled:=true;
2:garbagegame.Image15.Enabled:=true;
3:garbagegame.Image16.Enabled:=true;
4:garbagegame.Image17.Enabled:=true;
5:garbagegame.Image18.Enabled:=true;
6:garbagegame.Image19.Enabled:=true;
7:garbagegame.Image20.Enabled:=true;
8:garbagegame.Image21.Enabled:=true;
9:garbagegame.Image22.Enabled:=true;
end;
if(kingswild=1)and(c.face=12)then begin
garbagegame.Image13.Enabled:=(playercards[1].flags and card_flipped=0);
garbagegame.Image14.Enabled:=(playercards[2].flags and card_flipped=0);
garbagegame.Image15.Enabled:=(playercards[3].flags and card_flipped=0);
garbagegame.Image16.Enabled:=(playercards[4].flags and card_flipped=0);
garbagegame.Image17.Enabled:=(playercards[5].flags and card_flipped=0);
garbagegame.Image18.Enabled:=(playercards[6].flags and card_flipped=0);
garbagegame.Image19.Enabled:=(playercards[7].flags and card_flipped=0);
garbagegame.Image20.Enabled:=(playercards[8].flags and card_flipped=0);
garbagegame.Image21.Enabled:=(playercards[9].flags and card_flipped=0);
garbagegame.Image22.Enabled:=(playercards[10].flags and card_flipped=0);
end;
end;

procedure AddCardToListBox(car:pointer;typ:integer;nturns:pbyte);
var c:tplayingcard;
p:pointer;
rwave:array[0..8]of char;
begin
p:=car;
copymemory(@C,@p,4);
if nturns<>nil then nturns^:=nturns^+1;
case typ of
0:garbagegame.ListBox1.Items.insert(0,format('You drawn an %s of %s.',[faces[c.face],
suits[c.suit]]));
1:begin garbagegame.ListBox1.Items.insert(0,format('You flipped over an %s of %s.',
[faces[c.face],suits[c.suit]]));if nturns=nil then playsound('DING',hinstance,
snd_Resource or SND_SYNC)else if nturns^>3 then playsound(strfmt(rwave,'GOOD%d',
[random(3)]),hinstance,snd_Resource or SND_SYNC)else playsound('DING',hinstance,
snd_Resource or SND_SYNC);end;
2:garbagegame.ListBox1.Items.insert(0,format('Computer has drawn an %s of %s.',[
faces[c.face],suits[c.suit]]));
3:Begin garbagegame.ListBox1.Items.insert(0,format(
'Computer has flipped over an %s of %s.',[faces[c.face],suits[c.suit]]));
if nturns=nil then playsound('DING',hinstance,snd_Resource or SND_SYNC)else if
nturns^>3 then playsound(strfmt(rwave,'GOOD%d',[random(3)]),hinstance,
snd_Resource or SND_SYNC)else playsound('DING',hinstance,snd_Resource or SND_SYNC);end;
end;
end;

procedure NewGame;
var i:integer;
begin
candraw:=true;
discard.clear;
Garbagegame.StatusBar1.Panels[1].text:=format('%d/%d',[playerpos,computerpos]);
for i:=2 to 3do
garbagegame.StatusBar1.Panels[i].text:='0';
inc(gamenum);
garbagegame.StatusBar1.Panels[0].text:=format('Game %d',[gamenum]);
zeromemory(@used,sizeof(used));
zeromemory(@playercards,sizeof(playercards));
zeromemory(@computercards,sizeof(computercards));
for i:=1to playerpos do playercards[i]:=drawcard;
for i:=1to computerpos do computercards[i]:= drawcard;
if allused then reshuffle;
discard.Add(pointer(drawcard));
addcardtolistbox(discard.Last,0,nil);
garbagegame.Image11.Enabled:=false;
playermoveenable;
garbagegame.Button1.visible:=true;
end;

function pccard(i,j:integer):pchar;
begin
result:=stralloc(8);
strfmt(result,'CARD%d%x',[j,i]);
end;

function pcback(index:integer):pchar;
begin
result:=stralloc(8);
strfmt(result,'BACK%d',[index]);
end;

procedure updatecards;
var p:pointer;
c:tplayingcard;
i,j:integer;
pc:pchar;
nocard:tbitmap;
begin
candraw:=not allused;
with garbagegame do begin
image1.Transparent:=(computercards[1].flags and card_dead=card_dead);
image2.Transparent:=(computercards[2].flags and card_dead=card_dead);
image3.Transparent:=(computercards[3].flags and card_dead=card_dead);
image4.Transparent:=(computercards[4].flags and card_dead=card_dead);
image5.Transparent:=(computercards[5].flags and card_dead=card_dead);
image6.Transparent:=(computercards[6].flags and card_dead=card_dead);
image7.Transparent:=(computercards[7].flags and card_dead=card_dead);
image8.Transparent:=(computercards[8].flags and card_dead=card_dead);
image9.Transparent:=(computercards[9].flags and card_dead=card_dead);
image10.Transparent:=(computercards[10].flags and card_dead=card_dead);
image13.Transparent:=(playercards[1].flags and card_dead=card_dead);
image14.Transparent:=(playercards[2].flags and card_dead=card_dead);
image15.Transparent:=(playercards[3].flags and card_dead=card_dead);
image16.Transparent:=(playercards[4].flags and card_dead=card_dead);
image17.Transparent:=(playercards[5].flags and card_dead=card_dead);
image18.Transparent:=(playercards[6].flags and card_dead=card_dead);
image19.Transparent:=(playercards[7].flags and card_dead=card_dead);
image20.Transparent:=(playercards[8].flags and card_dead=card_dead);
image21.Transparent:=(playercards[9].flags and card_dead=card_dead);
image22.Transparent:=(playercards[10].flags and card_dead=card_dead);

end;
for i:=0to 2do begin deleteobject(emptyslots[i]);pc:=pccard(i,0);emptyslots[i]:=loadbitmap(hdeck,pc);
strdispose(pc);end;
for i:=0to 11 do begin deleteobject(hbacks[i]);pc:=pcback(i);hbacks[i]:=loadbitmap(hdeck,pc);
strdispose(pc);end;
for i:=0 to 12do for j:=1to 4do begin deleteobject(deck_pics[i,j]);pc:=pccard(i,j);deck_pics[i,j]:=
loadbitmap(hdeck,pc);strdispose(pc);end;
if computercards[1].flags and card_flipped=0then
garbagegame.image1.picture.bitmap.handle:= hbacks[back] else
garbagegame.image1.picture.bitmap.handle:= deck_pics[computercards[1].face,
computercards[1].suit];
if computercards[2].flags and card_flipped=0then
garbagegame.image2.picture.bitmap.handle:= hbacks[back] else
garbagegame.image2.picture.bitmap.handle:= deck_pics[computercards[2].face,
computercards[2].suit];
if computercards[3].flags and card_flipped=0then
garbagegame.image3.picture.bitmap.handle:= hbacks[back] else
garbagegame.image3.picture.bitmap.handle:= deck_pics[computercards[3].face,
computercards[3].suit];
if computercards[4].flags and card_flipped=0then
garbagegame.image4.picture.bitmap.handle:= hbacks[back] else
garbagegame.image4.picture.bitmap.handle:= deck_pics[computercards[4].face,
computercards[4].suit];
if computercards[5].flags and card_flipped=0then
garbagegame.image5.picture.bitmap.handle:= hbacks[back] else
garbagegame.image5.picture.bitmap.handle:= deck_pics[computercards[5].face,
computercards[5].suit];
if computercards[6].flags and card_flipped=0then
garbagegame.image6.picture.bitmap.handle:= hbacks[back] else
garbagegame.image6.picture.bitmap.handle:= deck_pics[computercards[6].face,
computercards[6].suit];
if computercards[7].flags and card_flipped=0then
garbagegame.image7.picture.bitmap.handle:= hbacks[back] else
garbagegame.image7.picture.bitmap.handle:= deck_pics[computercards[7].face,
computercards[7].suit];
if computercards[8].flags and card_flipped=0then
garbagegame.image8.picture.bitmap.handle:= hbacks[back] else
garbagegame.image8.picture.bitmap.handle:= deck_pics[computercards[8].face,
computercards[8].suit];
if computercards[9].flags and card_flipped=0then
garbagegame.image9.picture.bitmap.handle:= hbacks[back] else
garbagegame.image9.picture.bitmap.handle:= deck_pics[computercards[9].face,
computercards[9].suit];
if computercards[10].flags and card_flipped=0then
garbagegame.image10.picture.bitmap.handle:= hbacks[back] else
garbagegame.image10.picture.bitmap.handle:= deck_pics[computercards[10].face,
computercards[10].suit];
if discard.Count=0 then garbagegame.Image12.Picture.Bitmap.Handle:=emptyslots[0]
else begin p:=discard.Last;Copymemory(@c,@p,4);
garbagegame.Image12.Picture.Bitmap.handle:=deck_pics[c.face,c.suit];
end;
if playercards[1].flags and card_flipped=0then
garbagegame.image13.picture.bitmap.handle:= hbacks[back] else
garbagegame.image13.picture.bitmap.handle:= deck_pics[playercards[1].face,
playercards[1].suit];
if playercards[2].flags and card_flipped=0then
garbagegame.image14.picture.bitmap.handle:= hbacks[back] else
garbagegame.image14.picture.bitmap.handle:= deck_pics[playercards[2].face,
playercards[2].suit];
if playercards[3].flags and card_flipped=0then
garbagegame.image15.picture.bitmap.handle:= hbacks[back] else
garbagegame.image15.picture.bitmap.handle:= deck_pics[playercards[3].face,
playercards[3].suit];
if playercards[4].flags and card_flipped=0then
garbagegame.image16.picture.bitmap.handle:= hbacks[back] else
garbagegame.image16.picture.bitmap.handle:= deck_pics[playercards[4].face,
playercards[4].suit];
if playercards[5].flags and card_flipped=0then
garbagegame.image17.picture.bitmap.handle:= hbacks[back] else
garbagegame.image17.picture.bitmap.handle:= deck_pics[playercards[5].face,
playercards[5].suit];
if playercards[6].flags and card_flipped=0then
garbagegame.image18.picture.bitmap.handle:= hbacks[back] else
garbagegame.image18.picture.bitmap.handle:= deck_pics[playercards[6].face,
playercards[6].suit];
if playercards[7].flags and card_flipped=0then
garbagegame.image19.picture.bitmap.handle:= hbacks[back] else
garbagegame.image19.picture.bitmap.handle:= deck_pics[playercards[7].face,
playercards[7].suit];
if playercards[8].flags and card_flipped=0then
garbagegame.image20.Picture.bitmap.handle:= hbacks[back] else
garbagegame.image20.picture.bitmap.handle:= deck_pics[playercards[8].face,
playercards[8].suit];
if playercards[9].flags and card_flipped=0then
garbagegame.image21.picture.bitmap.handle:= hbacks[back] else
garbagegame.image21.picture.bitmap.handle:= deck_pics[playercards[9].face,
playercards[9].suit];
if playercards[10].flags and card_flipped=0then
garbagegame.image22.picture.bitmap.handle:= hbacks[back] else
garbagegame.image22.picture.bitmap.handle:= deck_pics[playercards[10].face,
playercards[10].suit];
if allused then garbagegame.Image11.Picture.Bitmap.Handle:=emptyslots[2]
else garbagegame.Image11.Picture.Bitmap.handle:=hbacks[back];
end;


function computerthread(dummy:pointer):dword;stdcall;
var p:pointer;
c,cd:tplayingcard;
drawused:boolean;
i,kingpos:integer;
label draw,discard0,endturn,ktry;
begin
inc(whoseturn);
cturn:=0;
pturn:=0;
garbagegame.Button1.Visible:=false;
drawused:=false;
discard0:
p:=discard.Last;
copymemory(@c,@p,4);
if(c.face=12)and(kingswild=1)then begin
ktry:kingpos:=random(computerpos)+1;
if(computercards[kingpos].flags and card_flipped>0)then goto ktry;
i:=strtoint(garbagegame.statusbar1.panels[3].text)+1;
garbagegame.StatusBar1.Panels[3].text:=inttostr(i);
discard[discard.Count-1]:=pointer(computercards[kingpos]);
c.flags:=c.flags or card_flipped;
computercards[kingpos]:=c;
addcardtolistbox(discard.last,3,@cturn);
drawused:=true;
updatecards;
if i=computerpos then begin endround;exit;end;
goto discard0;
end;
if c.face+1>computerpos then goto draw;
if computercards[c.face+1].flags and card_flipped>0then goto draw;
i:=strtoint(garbagegame.statusbar1.panels[3].text)+1;
garbagegame.StatusBar1.Panels[3].text:=inttostr(i);
discard[discard.Count-1]:=pointer(computercards[c.face+1]);
c.flags:=c.flags or card_flipped;
computercards[c.face+1]:=c;
addcardtolistbox(discard.last,3,@cturn);
drawused:=true;
updatecards;
if i=computerpos then begin endround;exit;end;
goto discard0;
draw:
sleep(1000);
if drawused then goto endturn;
drawused:=true;
if allused then reshuffle;
discard.Add(pointer(drawcard));
addcardtolistbox(discard.last,2,nil);
goto discard0;
endturn:garbagegame.Button1.Visible:=true;
updatecards;
playermoveenable;
garbagegame.Image11.Enabled:=true;
end;

procedure Tgarbagegame.FormCreate(Sender: TObject);
var i,j:integer;
pc:pchar;
hk:hkey;
tid,rs:dword;
deckdll:array[0..max_path]of char;
begin
randomize;
candraw:=true;
discard:=tlist.Create;
regcreatekey(hkey_current_User,'Software\Justin\Garbage',hk);
if regqueryvalueex(hk,'DeckDLL',nil,nil,@deckdll,@rs)=error_success then
hdeck:=loadlibrary(deckdll)else hdeck:=hinstance;cardback;
rs:=4;
regqueryvalueex(hk,'KingsWild',nil,nil,@kingswild,@rs);
kingsarewild1.checked:=(kingswild=1);
playerpos:=strtointdef(paramstr(1),10);
computerpos:=strtointdef(paramstr(2),10);
gamenum:=strtointdef(paramstr(3),0);
regclosekey(hk);
whoseturn:=strtointdef(paramstr(4),0);
image1.Visible:=true;
image2.Visible:=(computerpos>1);
image3.Visible:=(computerpos>2);
image4.Visible:=(computerpos>3);
image5.Visible:=(computerpos>4);
image6.Visible:=(computerpos>5);
image7.Visible:=(computerpos>6);
image8.Visible:=(computerpos>7);
image9.Visible:=(computerpos>8);
image10.Visible:=(computerpos>9);
image13.Visible:=true;
image14.Visible:=(playerpos>1);
image15.Visible:=(playerpos>2);
image16.Visible:=(playerpos>3);
image17.Visible:=(playerpos>4);
image18.Visible:=(playerpos>5);
image19.Visible:=(playerpos>6);
image20.Visible:=(playerpos>7);
image21.Visible:=(playerpos>8);
image22.Visible:=(playerpos>9);
pturn:=0;
 newgame;
updatecards;

end;

procedure Tgarbagegame.ChangeBack1Click(Sender: TObject);
begin
changebackwnd.Visible:=true;
changebackwnd.BringToFront;
visible:=false;
end;

procedure Tgarbagegame.Button1Click(Sender: TObject);
var tid:dword;
begin
createthread(nil,0,@computerthread,nil,0,tid);
end;

procedure Tgarbagegame.Image13Click(Sender: TObject);
var p:pointer;
c,cd:tplayingcard;
i:integer;
begin
inc(whoseturn);
p:=discard.Last;
copymemory(@c,@p,4);
if kingswild=0 then
if TImage(sender).tag<>c.face then exit;
cd:=playercards[TImage(sender).tag+1];
discard[discard.Count-1]:=pointer(cd);
addcardtolistbox(discard.last,1,@pturn);
playercards[timage(sender).tag+1]:=c;
playercards[timage(sender).tag+1].flags:=c.flags or card_flipped;
playermoveenable;
garbagegame.Image11.Enabled:=false;
updatecards;
i:=strtoint(statusbar1.panels[2].text)+1;
statusbar1.Panels[2].text:=inttostr(i);
if i=playerpos then begin endround;exit;end;
end;
procedure Tgarbagegame.Image11Click(Sender: TObject);
begin
if allused then reshuffle;
discard.add(pointer(drawcard));
addcardtolistbox(discard.last,0,nil);
updatecards;
image11.Enabled:=false;
playermoveenable;
end;

procedure Tgarbagegame.AboutGarbage1Click(Sender: TObject);
var aboutt:array[0..1024]of char;
begin
messagebox(handle,strfmt(aboutt,
'Garbage v%d.%d by Justin Roeder.'#13#10'Special thanks goes to Camp CILCA'#13#10'Website: https://delphijustin.biz',[
hibyte(version),lobyte(version)]),'About Garbage',0);
end;

procedure Tgarbagegame.ListBox1DblClick(Sender: TObject);
begin
messagebox(handle,PChar(Listbox1.items[listbox1.itemindex]),'Garbage',0);
end;

procedure Tgarbagegame.Rules1Click(Sender: TObject);
begin
shellexecute(handle,nil,'http://www.gathertogethergames.com/garbage',nil,nil,
sw_show);
end;

procedure Tgarbagegame.KingsAreWild1Click(Sender: TObject);
var hk:hkey;
begin
kingsarewild1.Checked:=not kingsarewild1.Checked;
if kingsarewild1.Checked then kingswild:=1 else kingswild:=0;
regcreatekey(hkey_current_user,'Software\Justin\Garbage',hk);
regsetvalueex(hk,'KingsWild',0,reg_dword,@kingswild,4);
regclosekey(hk);
end;

end.

unit garbage2;
//Change CardDeck Unit
interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls, ExtDlgs,Shellapi;

type
  Tchangebackwnd = class(TForm)
    ScrollBar1: TScrollBar;
    Button1: TButton;
    Button2: TButton;
    CheckBox1: TCheckBox;
    Button3: TButton;
    Button4: TButton;
    OpenDialog1: TOpenDialog;
    Button5: TButton;
    procedure Button1Click(Sender: TObject);
    procedure ScrollBar1Change(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Button4Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  changebackwnd: Tchangebackwnd;

implementation

{$R *.DFM}
uses garbage1;

procedure Tchangebackwnd.Button1Click(Sender: TObject);
var hk:hkey;
ba:dword;
begin
regcreatekey(hkey_current_user,'software\Justin\Garbage',hk);
if checkbox1.checked then ba:=255 else ba:=scrollbar1.Position;
Regsetvalueex(hk,'CardBack',0,reg_dword,@ba,4);
regclosekey(hk);
if ba=255then back:=random(12)else back:=ba;
updatecards;
close;
end;

procedure Tchangebackwnd.ScrollBar1Change(Sender: TObject);
begin
formpaint(nil);
end;

procedure Tchangebackwnd.Button2Click(Sender: TObject);
begin
close;
end;

procedure Tchangebackwnd.FormPaint(Sender: TObject);
var bmp:tbitmap;
backst:array[0..8]of char;
begin
bmp:=tbitmap.Create;
bmp.Handle:=loadbitmap(hdeck,strfmt(backst,'BACK%d',[scrollbar1.position]));
canvas.Draw(0,0,bmp);
bmp.FreeImage;
bmp.Free;
end;

procedure Tchangebackwnd.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
garbagegame.Visible:=true;
end;

procedure Tchangebackwnd.Button4Click(Sender: TObject);
var hk:hkey;
begin
regcreatekey(hkey_current_user,'Software\Justin\Garbage',hk);
regdeletevalue(hk,'DeckDLL');
Regdeletevalue(hk,'CardBack');
regclosekey(hk);
end;

procedure Tchangebackwnd.Button3Click(Sender: TObject);
var hk:hkey;
hdec:hmodule;
buff:array[0..max_path]of char;
begin
if not opendialog1.Execute then exit;
hdec:=loadlibrary(pchar(opendialog1.filename));
if hdec=0 then begin messagebox(handle,pchar(syserrormessage(getlasterror)),
'delphijustin Card Deck',mb_iconerror);exit;end;
hdeck:=hdec;
regcreatekey(hkey_current_user,'Software\Justin\Garbage',hk);
regsetvalueex(hk,'DeckDLL',0,reg_sz,strpcopy(buff,opendialog1.filename),length(
opendialog1.filename)+1);
Regclosekey(hk);
repaint;
end;

procedure Tchangebackwnd.Button5Click(Sender: TObject);
begin
shellexecute(handle,nil,'https://delphijustin.biz/bin/carddecks/',nil,nil,sw_show);

end;

end.
Trash
 
 
Error
Unable to connect to backend.
HTTP error 0

All programs are virus free. Some antivirus software might say its "suspicious" or a "Potentionaly Unwanted Program". Some of them rate them on what there code looks like no matter if theres a definition in the virus database. If any of them are detected any Antivirus I will zip the software with the password "justin" j is lowercase

NEW HTML Version is available

Published by Justin Roeder

I am an electronics engineer and computer programmer that has autism. I learned by myself

delphijustin Industries is an Autism Supported Business
Social Media Auto Publish Powered By : XYZScripts.com
All in one
Start
Amazon.com OH Columbus
Your cart is empty.
There are 165 days, 9 hours, 19 minutes and 49 seconds left until Halloween

You can use the keyboard arrows to navigate between the component buttons
",e=e.removeChild(e.firstChild)):"string"==typeof o.is?e=l.createElement(a,{is:o.is}):(e=l.createElement(a),"select"===a&&(l=e,o.multiple?l.multiple=!0:o.size&&(l.size=o.size))):e=l.createElementNS(e,a),e[Ni]=t,e[Pi]=o,Pl(e,t,!1,!1),t.stateNode=e,l=Ae(a,o),a){case"iframe":case"object":case"embed":Te("load",e),u=o;break;case"video":case"audio":for(u=0;u<$a.length;u++)Te($a[u],e);u=o;break;case"source":Te("error",e),u=o;break;case"img":case"image":case"link":Te("error",e),Te("load",e),u=o;break;case"form":Te("reset",e),Te("submit",e),u=o;break;case"details":Te("toggle",e),u=o;break;case"input":A(e,o),u=M(e,o),Te("invalid",e),Ie(n,"onChange");break;case"option":u=B(e,o);break;case"select":e._wrapperState={wasMultiple:!!o.multiple},u=Uo({},o,{value:void 0}),Te("invalid",e),Ie(n,"onChange");break;case"textarea":V(e,o),u=H(e,o),Te("invalid",e),Ie(n,"onChange");break;default:u=o}Me(a,u);var s=u;for(i in s)if(s.hasOwnProperty(i)){var c=s[i];"style"===i?ze(e,c):"dangerouslySetInnerHTML"===i?(c=c?c.__html:void 0,null!=c&&Aa(e,c)):"children"===i?"string"==typeof c?("textarea"!==a||""!==c)&&X(e,c):"number"==typeof c&&X(e,""+c):"suppressContentEditableWarning"!==i&&"suppressHydrationWarning"!==i&&"autoFocus"!==i&&(ea.hasOwnProperty(i)?null!=c&&Ie(n,i):null!=c&&x(e,i,c,l))}switch(a){case"input":L(e),j(e,o,!1);break;case"textarea":L(e),$(e);break;case"option":null!=o.value&&e.setAttribute("value",""+P(o.value));break;case"select":e.multiple=!!o.multiple,n=o.value,null!=n?q(e,!!o.multiple,n,!1):null!=o.defaultValue&&q(e,!!o.multiple,o.defaultValue,!0);break;default:"function"==typeof u.onClick&&(e.onclick=Fe)}Ve(a,o)&&(t.effectTag|=4)}null!==t.ref&&(t.effectTag|=128)}return null;case 6:if(e&&null!=t.stateNode)Ll(e,t,e.memoizedProps,o);else{if("string"!=typeof o&&null===t.stateNode)throw Error(r(166));n=yn(yu.current),yn(bu.current),Jn(t)?(n=t.stateNode,o=t.memoizedProps,n[Ni]=t,n.nodeValue!==o&&(t.effectTag|=4)):(n=(9===n.nodeType?n:n.ownerDocument).createTextNode(o),n[Ni]=t,t.stateNode=n)}return null;case 13:return zt(vu),o=t.memoizedState,0!==(64&t.effectTag)?(t.expirationTime=n,t):(n=null!==o,o=!1,null===e?void 0!==t.memoizedProps.fallback&&Jn(t):(a=e.memoizedState,o=null!==a,n||null===a||(a=e.child.sibling,null!==a&&(i=t.firstEffect,null!==i?(t.firstEffect=a,a.nextEffect=i):(t.firstEffect=t.lastEffect=a,a.nextEffect=null),a.effectTag=8))),n&&!o&&0!==(2&t.mode)&&(null===e&&!0!==t.memoizedProps.unstable_avoidThisFallback||0!==(1&vu.current)?rs===Qu&&(rs=Yu):(rs!==Qu&&rs!==Yu||(rs=Gu),0!==us&&null!==es&&(To(es,ns),Co(es,us)))),(n||o)&&(t.effectTag|=4),null);case 4:return wn(),Ol(t),null;case 10:return Zt(t),null;case 17:return It(t.type)&&Ft(),null;case 19:if(zt(vu),o=t.memoizedState,null===o)return null;if(a=0!==(64&t.effectTag),i=o.rendering,null===i){if(a)mr(o,!1);else if(rs!==Qu||null!==e&&0!==(64&e.effectTag))for(i=t.child;null!==i;){if(e=_n(i),null!==e){for(t.effectTag|=64,mr(o,!1),a=e.updateQueue,null!==a&&(t.updateQueue=a,t.effectTag|=4),null===o.lastEffect&&(t.firstEffect=null),t.lastEffect=o.lastEffect,o=t.child;null!==o;)a=o,i=n,a.effectTag&=2,a.nextEffect=null,a.firstEffect=null,a.lastEffect=null,e=a.alternate,null===e?(a.childExpirationTime=0,a.expirationTime=i,a.child=null,a.memoizedProps=null,a.memoizedState=null,a.updateQueue=null,a.dependencies=null):(a.childExpirationTime=e.childExpirationTime,a.expirationTime=e.expirationTime,a.child=e.child,a.memoizedProps=e.memoizedProps,a.memoizedState=e.memoizedState,a.updateQueue=e.updateQueue,i=e.dependencies,a.dependencies=null===i?null:{expirationTime:i.expirationTime,firstContext:i.firstContext,responders:i.responders}),o=o.sibling;return Mt(vu,1&vu.current|2),t.child}i=i.sibling}}else{if(!a)if(e=_n(i),null!==e){if(t.effectTag|=64,a=!0,n=e.updateQueue,null!==n&&(t.updateQueue=n,t.effectTag|=4),mr(o,!0),null===o.tail&&"hidden"===o.tailMode&&!i.alternate)return t=t.lastEffect=o.lastEffect,null!==t&&(t.nextEffect=null),null}else 2*ru()-o.renderingStartTime>o.tailExpiration&&1t)&&vs.set(e,t)))}}function Ur(e,t){e.expirationTimee?n:e,2>=e&&t!==e?0:e}function qr(e){if(0!==e.lastExpiredTime)e.callbackExpirationTime=1073741823,e.callbackPriority=99,e.callbackNode=$t(Vr.bind(null,e));else{var t=Br(e),n=e.callbackNode;if(0===t)null!==n&&(e.callbackNode=null,e.callbackExpirationTime=0,e.callbackPriority=90);else{var r=Fr();if(1073741823===t?r=99:1===t||2===t?r=95:(r=10*(1073741821-t)-10*(1073741821-r),r=0>=r?99:250>=r?98:5250>=r?97:95),null!==n){var o=e.callbackPriority;if(e.callbackExpirationTime===t&&o>=r)return;n!==Yl&&Bl(n)}e.callbackExpirationTime=t,e.callbackPriority=r,t=1073741823===t?$t(Vr.bind(null,e)):Wt(r,Hr.bind(null,e),{timeout:10*(1073741821-t)-ru()}),e.callbackNode=t}}}function Hr(e,t){if(ks=0,t)return t=Fr(),No(e,t),qr(e),null;var n=Br(e);if(0!==n){if(t=e.callbackNode,(Ju&(Wu|$u))!==Hu)throw Error(r(327));if(lo(),e===es&&n===ns||Kr(e,n),null!==ts){var o=Ju;Ju|=Wu;for(var a=Yr();;)try{eo();break}catch(t){Xr(e,t)}if(Gt(),Ju=o,Bu.current=a,rs===Ku)throw t=os,Kr(e,n),To(e,n),qr(e),t;if(null===ts)switch(a=e.finishedWork=e.current.alternate,e.finishedExpirationTime=n,o=rs,es=null,o){case Qu:case Ku:throw Error(r(345));case Xu:No(e,2=n){e.lastPingedTime=n,Kr(e,n);break}}if(i=Br(e),0!==i&&i!==n)break;if(0!==o&&o!==n){e.lastPingedTime=o;break}e.timeoutHandle=Si(oo.bind(null,e),a);break}oo(e);break;case Gu:if(To(e,n),o=e.lastSuspendedTime,n===o&&(e.nextKnownPendingLevel=ro(a)),ss&&(a=e.lastPingedTime,0===a||a>=n)){e.lastPingedTime=n,Kr(e,n);break}if(a=Br(e),0!==a&&a!==n)break;if(0!==o&&o!==n){e.lastPingedTime=o;break}if(1073741823!==is?o=10*(1073741821-is)-ru():1073741823===as?o=0:(o=10*(1073741821-as)-5e3,a=ru(),n=10*(1073741821-n)-a,o=a-o,0>o&&(o=0),o=(120>o?120:480>o?480:1080>o?1080:1920>o?1920:3e3>o?3e3:4320>o?4320:1960*Uu(o/1960))-o,n=o?o=0:(a=0|l.busyDelayMs,i=ru()-(10*(1073741821-i)-(0|l.timeoutMs||5e3)),o=i<=a?0:a+o-i),10 component higher in the tree to provide a loading indicator or placeholder to display."+N(i))}rs!==Zu&&(rs=Xu),l=yr(l,i),f=a;do{switch(f.tag){case 3:u=l,f.effectTag|=4096,f.expirationTime=t;var w=Ar(f,u,t);ln(f,w); break e;case 1:u=l;var E=f.type,k=f.stateNode;if(0===(64&f.effectTag)&&("function"==typeof E.getDerivedStateFromError||null!==k&&"function"==typeof k.componentDidCatch&&(null===ms||!ms.has(k)))){f.effectTag|=4096,f.expirationTime=t;var _=Ir(f,u,t);ln(f,_);break e}}f=f.return}while(null!==f)}ts=no(ts)}catch(e){t=e;continue}break}}function Yr(){var e=Bu.current;return Bu.current=Cu,null===e?Cu:e}function Gr(e,t){eus&&(us=e)}function Jr(){for(;null!==ts;)ts=to(ts)}function eo(){for(;null!==ts&&!Gl();)ts=to(ts)}function to(e){var t=Fu(e.alternate,e,ns);return e.memoizedProps=e.pendingProps,null===t&&(t=no(e)),qu.current=null,t}function no(e){ts=e;do{var t=ts.alternate;if(e=ts.return,0===(2048&ts.effectTag)){if(t=br(t,ts,ns),1===ns||1!==ts.childExpirationTime){for(var n=0,r=ts.child;null!==r;){var o=r.expirationTime,a=r.childExpirationTime;o>n&&(n=o),a>n&&(n=a),r=r.sibling}ts.childExpirationTime=n}if(null!==t)return t;null!==e&&0===(2048&e.effectTag)&&(null===e.firstEffect&&(e.firstEffect=ts.firstEffect),null!==ts.lastEffect&&(null!==e.lastEffect&&(e.lastEffect.nextEffect=ts.firstEffect),e.lastEffect=ts.lastEffect),1e?t:e}function oo(e){var t=qt();return Vt(99,ao.bind(null,e,t)),null}function ao(e,t){do lo();while(null!==gs);if((Ju&(Wu|$u))!==Hu)throw Error(r(327));var n=e.finishedWork,o=e.finishedExpirationTime;if(null===n)return null;if(e.finishedWork=null,e.finishedExpirationTime=0,n===e.current)throw Error(r(177));e.callbackNode=null,e.callbackExpirationTime=0,e.callbackPriority=90,e.nextKnownPendingLevel=0;var a=ro(n);if(e.firstPendingTime=a,o<=e.lastSuspendedTime?e.firstSuspendedTime=e.lastSuspendedTime=e.nextKnownPendingLevel=0:o<=e.firstSuspendedTime&&(e.firstSuspendedTime=o-1),o<=e.lastPingedTime&&(e.lastPingedTime=0),o<=e.lastExpiredTime&&(e.lastExpiredTime=0),e===es&&(ts=es=null,ns=0),1u&&(c=u,u=l,l=c),c=Ue(w,l),f=Ue(w,u),c&&f&&(1!==k.rangeCount||k.anchorNode!==c.node||k.anchorOffset!==c.offset||k.focusNode!==f.node||k.focusOffset!==f.offset)&&(E=E.createRange(),E.setStart(c.node,c.offset),k.removeAllRanges(),l>u?(k.addRange(E),k.extend(f.node,f.offset)):(E.setEnd(f.node,f.offset),k.addRange(E)))))),E=[];for(k=w;k=k.parentNode;)1===k.nodeType&&E.push({element:k,left:k.scrollLeft,top:k.scrollTop});for("function"==typeof w.focus&&w.focus(),w=0;w=t&&e<=t}function To(e,t){var n=e.firstSuspendedTime,r=e.lastSuspendedTime;nt||0===n)&&(e.lastSuspendedTime=t),t<=e.lastPingedTime&&(e.lastPingedTime=0),t<=e.lastExpiredTime&&(e.lastExpiredTime=0)}function Co(e,t){t>e.firstPendingTime&&(e.firstPendingTime=t);var n=e.firstSuspendedTime;0!==n&&(t>=n?e.firstSuspendedTime=e.lastSuspendedTime=e.nextKnownPendingLevel=0:t>=e.lastSuspendedTime&&(e.lastSuspendedTime=t+1),t>e.nextKnownPendingLevel&&(e.nextKnownPendingLevel=t))}function No(e,t){var n=e.lastExpiredTime;(0===n||n>t)&&(e.lastExpiredTime=t)}function Po(e,t,n,o){var a=t.current,i=Fr(),l=su.suspense;i=jr(i,a,l);e:if(n){n=n._reactInternalFiber;t:{if(J(n)!==n||1!==n.tag)throw Error(r(170));var u=n;do{switch(u.tag){case 3:u=u.stateNode.context;break t;case 1:if(It(u.type)){u=u.stateNode.__reactInternalMemoizedMergedChildContext;break t}}u=u.return}while(null!==u);throw Error(r(171))}if(1===n.tag){var s=n.type;if(It(s)){n=Dt(n,s,u);break e}}n=u}else n=Al;return null===t.context?t.context=n:t.pendingContext=n,t=on(i,l),t.payload={element:e},o=void 0===o?null:o,null!==o&&(t.callback=o),an(a,t),Dr(a,i),i}function Oo(e){if(e=e.current,!e.child)return null;switch(e.child.tag){case 5:return e.child.stateNode;default:return e.child.stateNode}}function Ro(e,t){e=e.memoizedState,null!==e&&null!==e.dehydrated&&e.retryTime