ref: 47de140b5fbf8498bf8da6f43cbfd50227f04d7e
parent: ea2033bc08e7a9b5ab4e8afe0609a61fa4ff098c
author: Sigrid Solveig Haflínudóttir <[email protected]>
date: Thu Dec 13 17:13:14 EST 2012
games/cflood: print status and won/failed msg
--- a/games/cflood.c
+++ b/games/cflood.c
@@ -8,6 +8,10 @@
Snormal,
Slarge,
+ Tgame,
+ Twin,
+ Tfail,
+
Flood = 1<<7,
ColorMask = 0x0f,
@@ -34,7 +38,9 @@
0
};
+static int sid;
static int size;
+static int type;
static int wait4click;
static int turnsleft;
static uchar cells[28*28]; // enough for maximal size
@@ -49,13 +55,27 @@
Rectangle r = screen->r;
draw(screen, r, display->white, nil, ZP);
+ char s[64];
+ if(type == Tgame)
+ sprint(s, "%d", turnsleft);
+ else if(type == Twin)
+ sprint(s, "You won using %d turns (of %d)",
+ turns[sid]-turnsleft,
+ turns[sid]);
+ else if(type == Tfail)
+ sprint(s, "You failed");
+ Font *f = display->defaultfont;
+ Point strsize = stringsize(f, s);
+
const uchar *cell = &cells[0];
- int w = Dx(r), h = Dy(r) - ButtonSize - 2;
+ int w = Dx(r);
+ int h = Dy(r) - ButtonSize - 2 - strsize.y;
int c = (w < h ? w : h) / size;
w = c*size;
+ int left = r.min.x + (Dx(r) - w)/2;
// cells
- for(int x = r.min.x; x < r.min.x+size*c; x+=c) {
+ for(int x = left; x < left+size*c; x+=c) {
for(int y = r.min.y; y < r.min.y+size*c; y+=c) {
Rectangle r = Rect(x, y, x+c, y+c);
draw(screen, r, colors[*cell & ColorMask], nil, ZP);
@@ -64,13 +84,18 @@
}
// buttons
- int startx = r.min.x + (w/2) - NumColors*ButtonSize/2;
- int y = r.min.y + h;
- for(int i = 0, x = startx; i < NumColors; i++, x += ButtonSize) {
+ int x = left + (w/2) - NumColors*ButtonSize/2;
+ int y = r.min.y + h + strsize.y;
+ for(int i = 0; i < NumColors; i++, x += ButtonSize) {
buttons[i] = Rect(x, y, x+ButtonSize, y+ButtonSize);
draw(screen, buttons[i], colors[i], nil, ZP);
}
+ // caption
+ Point p = {left + w/2 - strsize.x/2, y - strsize.y};
+ Point sp = {0, 0};
+ string(screen, p, display->black, sp, f, s);
+
flushimage(display, 1);
}
@@ -119,20 +144,23 @@
if(!turnsleft)
return;
+ turnsleft--;
int n = reflood(color);
- redraw(screen);
if(n == size*size) {
- // win
+ type = Twin;
wait4click = 1;
- } else if(--turnsleft == 0) {
- // fail
+ } else if(!turnsleft) {
+ type = Tfail;
wait4click = 1;
}
+
+ redraw(screen);
}
static void
newgame(int sid) {
+ type = Tgame;
size = sizes[sid];
turnsleft = turns[sid];
@@ -151,7 +179,7 @@
eresized(int new)
{
if(new && getwindow(display, Refnone) < 0)
- fprint(2, "can't reattach to window");
+ sysfatal("can't reattach to window: %r");
redraw(screen);
}
@@ -162,9 +190,8 @@
sysfatal("initdraw failed");
Rectangle r = Rect(0, 0, 1, 1);
- for(int i = 0; i < NumColors; i++) {
+ for(int i = 0; i < NumColors; i++)
colors[i] = allocimage(display, r, CMAP8, 1, srccolors[i]);
- }
einit(Emouse);
menu.item = mstr;
@@ -171,7 +198,7 @@
menu.lasthit = 0;
srand(time(0));
- int sid = Snormal;
+ sid = Snormal;
newgame(sid);
for(int mold = 0;;) {