aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Tatham <anakin@pobox.com>2005-06-04 12:32:40 +0000
committerSimon Tatham <anakin@pobox.com>2005-06-04 12:32:40 +0000
commit852bddabbb2bc94c83cff0a6e4dd91a915e3a0a8 (patch)
tree7a2d9e53b802f83a13d3baf0ff150b8922c686cf
parent454e566df616ad3f9ed644e8c51526f1da0d8202 (diff)
downloadpuzzles-852bddabbb2bc94c83cff0a6e4dd91a915e3a0a8.zip
puzzles-852bddabbb2bc94c83cff0a6e4dd91a915e3a0a8.tar.gz
puzzles-852bddabbb2bc94c83cff0a6e4dd91a915e3a0a8.tar.bz2
puzzles-852bddabbb2bc94c83cff0a6e4dd91a915e3a0a8.tar.xz
Revamp pencil mark placement and sizing. Pencil marks are now sized
and positioned according to how many there are in the cell, rather than how many distinct digits there are in the entire puzzle. This means that 4x4 Solo can now be played with pencil marks without _too_ much difficulty; the marks will still get a bit crowded if you have more than 12 in the same square, but with luck that shouldn't happen often, and as long as you're down in the 2-9 range things should be entirely legible. [originally from svn r5909]
-rw-r--r--solo.c34
1 files changed, 27 insertions, 7 deletions
diff --git a/solo.c b/solo.c
index 134331e..97acf76 100644
--- a/solo.c
+++ b/solo.c
@@ -2027,7 +2027,6 @@ static game_drawstate *game_new_drawstate(game_state *state)
ds->hl = snewn(cr*cr, unsigned char);
memset(ds->hl, 0, cr*cr);
ds->entered_items = snewn(cr*cr, int);
-
return ds;
}
@@ -2097,19 +2096,40 @@ static void draw_number(frontend *fe, game_drawstate *ds, game_state *state,
FONT_VARIABLE, TILE_SIZE/2, ALIGN_VCENTRE | ALIGN_HCENTRE,
state->immutable[y*cr+x] ? COL_CLUE : (hl & 16) ? COL_ERROR : COL_USER, str);
} else {
- /* pencil marks required? */
- int i, j;
+ int i, j, npencil;
+ int pw, ph, pmax, fontsize;
+
+ /* count the pencil marks required */
+ for (i = npencil = 0; i < cr; i++)
+ if (state->pencil[(y*cr+x)*cr+i])
+ npencil++;
+
+ /*
+ * It's not sensible to arrange pencil marks in the same
+ * layout as the squares within a block, because this leads
+ * to the font being too small. Instead, we arrange pencil
+ * marks in the nearest thing we can to a square layout,
+ * and we adjust the square layout depending on the number
+ * of pencil marks in the square.
+ */
+ for (pw = 1; pw * pw < npencil; pw++);
+ if (pw < 3) pw = 3; /* otherwise it just looks _silly_ */
+ ph = (npencil + pw - 1) / pw;
+ if (ph < 2) ph = 2; /* likewise */
+ pmax = max(pw, ph);
+ fontsize = TILE_SIZE/(pmax*(11-pmax)/8);
for (i = j = 0; i < cr; i++)
if (state->pencil[(y*cr+x)*cr+i]) {
- int dx = j % r, dy = j / r, crm = max(c, r);
+ int dx = j % pw, dy = j / pw;
+
str[1] = '\0';
str[0] = i + '1';
if (str[0] > '9')
str[0] += 'a' - ('9'+1);
- draw_text(fe, tx + (4*dx+3) * TILE_SIZE / (4*r+2),
- ty + (4*dy+3) * TILE_SIZE / (4*c+2),
- FONT_VARIABLE, TILE_SIZE/(crm*5/4),
+ draw_text(fe, tx + (4*dx+3) * TILE_SIZE / (4*pw+2),
+ ty + (4*dy+3) * TILE_SIZE / (4*ph+2),
+ FONT_VARIABLE, fontsize,
ALIGN_VCENTRE | ALIGN_HCENTRE, COL_PENCIL, str);
j++;
}