ref: 84d012998fc5c82ff32c85243f8e0f6e9b1e003d
parent: dfb8fa2e928e86f647373814997ee5123740f427
author: Simon Tatham <anakin@pobox.com>
date: Sun Sep 13 10:43:21 EDT 2009
Error-highlighted trees look nicer with a different-coloured trunk. Also added a comment worrying about the universality of my error highlighting mechanism. [originally from svn r8647]
--- a/tents.c
+++ b/tents.c
@@ -3,7 +3,38 @@
* some confusing conditions.
*
* TODO:
+ *
+ * - my technique for highlighting errors in the tent/tree matching
+ * is not perfect. It currently works by finding the connected
+ * components of the bipartite adjacency graph between tents and
+ * trees, and highlighting red all the tents in such a component
+ * if they outnumber the trees (the red meaning "these tents have
+ * too few trees between them") and vice versa if the trees
+ * outnumber the tents (but this time considering BLANKs as
+ * potential tents as yet unplaced, to avoid highlighting
+ * 'errors' from the word go before the player has actually made
+ * any mistake). However, something more subtle can go wrong
+ * within a component: consider, for instance, the setup
*
+ * T
+ * tTtT
+ * t
+ *
+ * in which there is one connected component containing equal
+ * numbers of trees and tents, but nonetheless there is no
+ * perfect matching that can link the two sensibly. This will be
+ * rejected by the rigorous solution checker, but the error
+ * highlighter won't currently spot it.
+ *
+ * Well, the _matching_ error highlighter won't spot it, anyway.
+ * In that diagram, there are two pairs of diagonally adjacent
+ * tents, which will be flagged as erroneous because that's much
+ * easier. So if I could prove that _all_ such setups require
+ * diagonally adjacent tents, I could safely ignore this problem.
+ * If not, however, then a proper treatment will require running
+ * the maxflow matcher over each component once I've identified
+ * them.
+ *
* - it might be nice to make setter-provided tent/nontent clues
* inviolable?
* * on the other hand, this would introduce considerable extra
@@ -259,6 +290,7 @@
COL_TENT,
COL_ERROR,
COL_ERRTEXT,
+ COL_ERRTRUNK,
NCOLOURS
};
@@ -1879,6 +1911,10 @@
ret[COL_ERRTEXT * 3 + 1] = 1.0F;
ret[COL_ERRTEXT * 3 + 2] = 1.0F;
+ ret[COL_ERRTRUNK * 3 + 0] = 0.6F;
+ ret[COL_ERRTRUNK * 3 + 1] = 0.0F;
+ ret[COL_ERRTRUNK * 3 + 2] = 0.0F;
+
*ncolours = NCOLOURS;
return ret;
}
@@ -2140,7 +2176,7 @@
(printing ? draw_rect_outline : draw_rect)
(dr, cx-TILESIZE/15, ty+TILESIZE*3/10,
2*(TILESIZE/15)+1, (TILESIZE*9/10 - TILESIZE*3/10),
- (err & (1<<ERR_OVERCOMMITTED) ? COL_ERROR : COL_TREETRUNK));
+ (err & (1<<ERR_OVERCOMMITTED) ? COL_ERRTRUNK : COL_TREETRUNK));
for (i = 0; i < (printing ? 2 : 1); i++) {
int col = (i == 1 ? COL_BACKGROUND :