-
-#define WALK_UNTIL_MUST(point,coord,increm,last,edge) \
- do { \
- WALK_UNTIL(point,coord,increm,last,edge); \
- eassert((point).coord != (last)+(increm)); \
- } while(0)
-
-static void find_structure(void) {
- Rect whole = { {0,0}, {width-1,height-1} };
-
- WALK_UNTIL_MUST(mainr.tl, x,-1, whole.tl.x, '*');
- WALK_UNTIL_MUST(mainr.tl, y,-1, whole.tl.y, '*');
- WALK_UNTIL_MUST(mainr.br, x,+1, whole.br.x, '*');
- WALK_UNTIL_MUST(mainr.br, y,+1, whole.br.y, '*');
-
- require_rectangle(mainr.tl.x-1, mainr.tl.y, mainr.tl.x-1, mainr.br.y, "*");
- require_rectangle(mainr.br.x+1, mainr.tl.y, mainr.br.x+1, mainr.br.y, "*");
- require_rectangle(mainr.tl.x, mainr.tl.y-1, mainr.br.x, mainr.tl.y-1, "*");
- require_rectangle(mainr.tl.x, mainr.br.y+1, mainr.br.x, mainr.br.y+1, "*");
-
-#define CHECK_STRIP_BORDER(tlbr,xy,increm) \
- do { \
- Point csb_p; \
- Rect csb_r; \
- csb_p= mainr.tl; \
- csb_p.xy= mainr.tlbr.xy; \
- if (get_p(csb_p)=='+') { \
- csb_r= mainr; \
- csb_r.tl.xy= csb_p.xy; \
- csb_r.br.xy= csb_p.xy; \
- require_rectangle_r(csb_r, "+"); \
- mainr.tlbr.xy += increm; \
- } \
- } while(0)
-
- debug_rect("mainr",0, mainr);
-
- CHECK_STRIP_BORDER(tl,x,+1);
- CHECK_STRIP_BORDER(tl,y,+1);
- CHECK_STRIP_BORDER(br,x,-1);
- CHECK_STRIP_BORDER(br,y,-1);
-
- debug_rect("mainr",1, mainr);
-
- Point up = START_MAIN;
- WALK_UNTIL_MUST(up, y,-1, mainr.tl.y, '+');
-
- Point down = START_MAIN;
- down.y++;
- WALK_UNTIL_MUST(down, y,+1, mainr.br.y, '+');
-
- int xscaleunit, y,x;
- for (y=0, xscaleunit=1; y<4; y++, xscaleunit*=10) {
- fprintf(debug," ");
- for (x=0; x<=width; x++) {
- if (x % xscaleunit) fputc(' ',debug);
- else fprintf(debug,"%d",(x / xscaleunit)%10);
- }
- fputc('\n',debug);
- }
-
- commbasey= up.y;
- comminty= down.y - up.y + 2;
- fprintf(debug, "up.y=%d down.y=%d commbasey=%d comminty=%d\n",
- up.y,down.y, commbasey,comminty);
-
- Point across= { mainr.tl.x, commbasey };
- int colno=0;
- for (;;) {
- eassert(get_p(across) != '+');
- WALK_UNTIL(across, x,+1, mainr.br.x, '+');
- eassert(colno < MAX_COLUMNS);
- int colrx= across.x;
- if (colrx > mainr.br.x) colrx= mainr.br.x;
- if (colno < INTERESTING_COLUMNS) {
- colrightx[colno]= colrx;
- fprintf(debug,"colrightx[%d]= %d\n",colno,colrx);
- } else {
- fprintf(debug,"extra colr %d %d\n",colno,colrx);
- }
-
- colno++;
-
- if (across.x >= mainr.br.x-1)
- break;
-
- across.x++;
- require_rectangle(across.x,mainr.tl.y, across.x,mainr.br.y, "+");
- across.x++;
- }
- eassert(colno >= MIN_COLUMNS);
-}
-
-static void find_commodity(int offset, Rect *rr) {
- /* rr->tl.x==-1 if offset out of range */
- rr->tl.y= commbasey - offset*comminty;
- rr->br.y= rr->tl.y + comminty-2;
- if (rr->tl.y < mainr.tl.y || rr->br.y > mainr.br.y) { rr->tl.x=-1; return; }
- if (rr->tl.y > mainr.tl.y)
- require_rectangle(rr->tl.x,rr->tl.y-1, rr->br.x,rr->tl.y-1, "+");
- if (rr->br.y < mainr.tl.y)
- require_rectangle(rr->tl.x,rr->br.y+1, rr->br.x,rr->br.y+1, "+");