From 8c4afe748eb0a5fedc3e5239a5b0507499c75c11 Mon Sep 17 00:00:00 2001 From: Jeremy Rand Date: Wed, 19 Aug 2015 00:35:18 -0400 Subject: [PATCH] Add support for printing the time to solve the puzzle if there is a real time clock in the system. --- a2sudoku/game.c | 24 ++++++++++++++++++ a2sudoku/game.h | 3 +++ a2sudoku/make/prodos_template.dsk | Bin 143360 -> 143360 bytes a2sudoku/ui.c | 39 +++++++++++++++++++++++------- 4 files changed, 57 insertions(+), 9 deletions(-) diff --git a/a2sudoku/game.c b/a2sudoku/game.c index e0d672e..23d3b29 100644 --- a/a2sudoku/game.c +++ b/a2sudoku/game.c @@ -38,6 +38,7 @@ typedef struct tGame { struct tPuzzle *puzzle; tUpdatePosCallback callback; bool undoValid; + time_t startTime; } tGame; @@ -85,6 +86,7 @@ void restartGame(void) } theGame.undoValid = false; + theGame.startTime = _systime(); } @@ -107,6 +109,8 @@ void startGame(tDifficulty difficulty, tUpdatePosCallback callback) } } } + + theGame.startTime = _systime(); } @@ -116,6 +120,12 @@ void saveGame(void) if (saveFile != NULL) { bool isValid = true; fwrite(&isValid, sizeof(isValid), 1, saveFile); + + // Change the start time into an elapsed time before saving... + + if (theGame.startTime != 0xffffffff) { + theGame.startTime = _systime() - theGame.startTime; + } fwrite(&theGame, sizeof(theGame), 1, saveFile); savePuzzle(theGame.puzzle, saveFile); fclose(saveFile); @@ -176,6 +186,11 @@ bool loadGame(tUpdatePosCallback callback) theGame.callback = callback; + // The saved start time is an elapsed time. Convert it back into a start time relative to now. + if (theGame.startTime != 0xffffffff) { + theGame.startTime = _systime() - theGame.startTime; + } + theGame.puzzle = loadPuzzle(saveFile); fclose(saveFile); @@ -219,6 +234,15 @@ bool isPuzzleSolved(void) } +time_t timeToSolve(void) +{ + if (theGame.startTime == 0xffffffff) + return theGame.startTime; + + return _systime() - theGame.startTime; +} + + bool isSquareInvalid(tPos col, tPos row) { tSquareVal value = SQUARE_XY(col, row).value; diff --git a/a2sudoku/game.h b/a2sudoku/game.h index b07133e..732f343 100644 --- a/a2sudoku/game.h +++ b/a2sudoku/game.h @@ -7,6 +7,7 @@ // +#include #include "puzzles.h" #ifndef __a2sudoku__game__ @@ -34,6 +35,8 @@ extern void refreshPos(tPos x, tPos y); extern bool isPuzzleSolved(void); +extern time_t timeToSolve(void); + // Returns false if unable to set the value for some reason extern bool setValueAtPos(tPos x, tPos y, tSquareVal val); diff --git a/a2sudoku/make/prodos_template.dsk b/a2sudoku/make/prodos_template.dsk index d5c3b28050b28f2af61639c00d56bcb8c57f1cea..7973ad774f7e4391480a7b4e31b24364968f45ec 100644 GIT binary patch delta 1312 zcmZWoUrbw77(e&k0;LSvatbRClba0Z+QHz(Wd4cKESfUAk;on}kfjgK6c(QpL}P5T z*jSOX6sp;9kQ_TN^pYLCgco@rw+UcqgK#5TBE~=9Xfw9jHniPX7+lYl4vl`f_nhxL z=O(}J_xpX7^o$;iihYT0Nr+9xJP_YdqI_^0c$%^y?>E-)ueq>RI&!&;d{k zDr?IQ>%kqs(`2frtj`gw?zuPEUG13->1W)QQ(X=b*u&Fc)_q3F#gt@7kM%@1+x4-^ z_>~7UDszTLI8#A0o6*{7@GCnbDic#yiH=1s*!eCFe=Z7(z*i6RpI0E&i2muk(4&9v{(Cri4zEQ;xT@P>#?U4U-Hz6o& zVibc(LAfW4It0Pt3Q18zpk&idRZa_9df$W6 zaTn(TR#qz)mON0ZAuABwhO~^`f>IgX7k_~g=LEciuYm}m@o|jjHnaEf{MJ@_3x5OL z{Lj1e3ghwrb1{CZw{>M&zFHx5r2+Vqj&ThBcjQmSb{8nq-R(p`r zguk*YcAzazgec233n<5tCK+`@{t_fdt;ka6ICN|Eu6i6?x5X!VU^)1(kpl?F{G zTT|v~x*C1qaHx1v`1LoaRQY43{LMI=3o9>A3ag$tRGy=gAqdvaXM93{3Y-`d#-inc z?+9x}y^wHL^Z_jIg_&n5s0b*KZXd|mQaRyeGi9-ie#Xl-HyV^Y1`Bs5g%K}17Y^jF zcvdLM88w|^Ew)%!CrbuOiZ2O+aX3W$@ z%O#!!WLs^fCdx}yBq&F%QUw{5qc2J&OV`cHVx~JaY$n6zs6IfHBVq(sp+~TP8{!hQ z3;Q2KKYH8Jf6*c?C_&6kUo{T}WWVVl-}YE*YAH=t7SlOAn@r!ikC$lneLA1om_TSY z>3MP#O=WZI$z*)v>rWAI)>dj`!~s$w`>0;;BAtckW#4EgKt&evd4xXrqv<>x5d5ZX za!oE}&^1|fqGFjZmg_G^{)L=8Kt6!L7?1(E%RxDN9QIQZS9&xMD#BnI@I%0~pgc?+ zGNp{BScY>NOw@?5rv6ij@IU%zHT|gIO#sSY`zP#| KFN|Jbe*6m=p=9C! delta 1635 zcmY*ZYi!$86n2uPv7IGxjvLWY5LfJ3){Y8(Q1}H%NUdb?5I;7AHY`D<4#qa|9PCFz zS4U1-dkIU^bYqfbEmd93CDDFW+MxS0>Y`0|fDqCKbfC4Hpv8Ty4<6y(bVI|k&ppTY z-0$3b&Ua5@l1)sqCBM(}+Syv)L#)Sld~2|2Gt>5*B)!1=_tfrS0*n%5A`d{-A*)Xbw+o~SNWrBl2HqQz*UC~I}1qUtd*nKC?Owb6rvRscN^ zLb-^P63CAlyl60G)nw2v!QjwA!3a>np_36b7MWyl*kLel_=#=s(xwQCaFZ2W?^JM| zT^A?Vc1%>N*j!Ck#X}T^I-_HPl#3`C6ptusGNp7Sk5VoEoE9FpnhhqaPN~>Cl`5v&EA{(4O1jw7UfIVe@tz{M zwY_UFy9x%6UgV{78=M0;hAwb4C^=XmtBzAaQsNxM+tBCSnK^LpYfEPQ8Go1mXlMyS zw+V*Tf`WXf!QR0*ghM8yFT+iJ4y?m?oAWN-KtQ#ys7FK^{v89kV;E38Eeq?e(3+MwZ}rL9}nf z&`eY;)#`%S8x>pa1(*@UVS5qiU!TPcw^y{qIFN*_$j%nbmGe}hBOFpV0&X#8@YF0! z2y0}b8T)lYjg8I@qWl4_;2@&7;0Bycm?K9d%cO^cCURPE?JzOQd3_$7N7nH!aMD{r zbcrKe(-)z433_h>0o{okP@KBn%lPS| zEx|J@snVsQI+&8rtWqKjtbuH;nNa`sDr7u2rCma?FgQR4)Wyv%0A8701iT=lO?NA> zORxoTBq|c>N(Z1@MMDu3WUO{Wnqy zxdZMN^iIU^7YDKlwOF7cMTJU54;ATb0v!PKAvcVJX4rpz8v1e*LSs|&&PQ9$da{3c zk9%MJCyoR5B#c}KS(;$c6}Gfzc(ef;z3$8Dmd#Xq+KuT~!Mb94(Nj=**1Ei|JUMzl z7+*`ju!H1=>64&c2ePFG+8`Vrd#wq-Peh2Uc8UT=x>asi zE$3u|=~lZ_<$UX{mQ0hwm$nn0w9#_cs#~jHhpMRQj+9b0I;oY3Uzsv1Cz?JPBd?_z zqH?nPv+9`d?zb4@J0;iMhw|TA=M4DY)HHEjpF$0yDO)T$#x`}0p;sby3|#JV9U$h* zXX?Q8p8p&rmRHNJVQhHICG^cW|%gn|}e!wx #include #include +#include #include #include @@ -45,9 +46,6 @@ extern char a2e_hi; ((BOARD_SIZE + 1) * THIN_LINE_HEIGHT) + \ (((BOARD_SIZE / SUBSQUARE_SIZE) + 1) * (THICK_LINE_HEIGHT - THIN_LINE_HEIGHT))) -#define WON_WIDTH 100 -#define WON_HEIGHT 55 - #define SCRATCH_WIDTH 9 #define SCRATCH_HEIGHT 6 @@ -497,18 +495,41 @@ void updatePos(tPos x, tPos y, tSquareVal val, tScratchValues scratch, bool corr void youWon(void) { - int wonX = (TOTAL_WIDTH - WON_WIDTH) / 2; - int wonY = (TOTAL_HEIGHT - WON_HEIGHT) / 2; - char *line1 = "You solved it!"; + int line1Width; + int line2Width; + int wonWidth; + int wonHeight; + int wonX; + int wonY; + static char line1[80]; char *line2 = "Press any key"; + time_t solutionTime = timeToSolve(); int textHeight = tgi_textheight(line1); + if (solutionTime == 0xffffffff) { + snprintf(line1, sizeof(line1), "You solved it!"); + } else { + snprintf(line1, sizeof(line1), "You solved it in %lu minutes!", solutionTime / 60); + } + + line1Width = strlen(line1) * 6; + line2Width = strlen(line2) * 6; + + wonHeight = textHeight * 7; + wonWidth = line1Width; + if (wonWidth < line2Width) + wonWidth = line2Width; + wonWidth += 20; + + wonX = (TOTAL_WIDTH - wonWidth) / 2; + wonY = (TOTAL_HEIGHT - wonHeight) / 2; + tgi_setcolor(COLOR_BLACK); - tgi_bar(wonX, wonY, wonX + WON_WIDTH, wonY + WON_HEIGHT); + tgi_bar(wonX, wonY, wonX + wonWidth, wonY + wonHeight); tgi_setcolor(COLOR_WHITE); - tgi_outtextxy(wonX + 10, wonY + (textHeight * 2), line1); - tgi_outtextxy(wonX + 7, wonY + (textHeight * 4), line2); + tgi_outtextxy((TOTAL_WIDTH - line1Width) / 2, wonY + (textHeight * 2), line1); + tgi_outtextxy((TOTAL_WIDTH - line2Width) / 2, wonY + (textHeight * 4), line2); cgetc(); }