); \
}while(0)
-#define ADJUST_BOX(search,insidechrs,want, lim,LIMIT_MUST, TLBR,XY,increm) \
- for (;;) { \
- LIMIT_MUST( (search).tl.XY != (search).br.XY && \
- (search).tl.XY != (lim), \
- MR((search));MSB(#TLBR);MSB(#XY) ); \
- int got=0; \
- Point p=(search).tl; \
- for (p.XY=(search).TLBR.XY; \
- p.OTHERCOORD_##XY <= (search).br.OTHERCOORD_##XY; \
- p.OTHERCOORD_##XY++) \
- got += !!strchr(insidechrs, get_p(p)); \
- if (got >= (want)) \
- break; \
- (search).TLBR.XY += increm; \
+#define ADJUST_BOX(search,insidechrs,OP,want, lim,LIMIT_MUST, TLBR,XY,increm) \
+ for (;;) { \
+ LIMIT_MUST( (search).tl.XY != (search).br.XY && \
+ (search).tl.XY != (lim), \
+ MR((search));MSB(#TLBR);MSB(#XY) ); \
+ int got=0; \
+ Point p=(search).tl; \
+ for (p.XY=(search).TLBR.XY; \
+ p.OTHERCOORD_##XY <= (search).br.OTHERCOORD_##XY; \
+ p.OTHERCOORD_##XY++) \
+ got += !!strchr(insidechrs, get_p(p)); \
+ if ((got) OP (want)) \
+ break; \
+ (search).TLBR.XY += increm; \
}
void find_structure(CanonImage *im, int *max_relevant_y_r) {
void check_correct_commodities(void) {
Rect search= { { 50,39 }, { 130,59 } };
- ADJUST_BOX(search,"_",10, cim->h, MUST, tl,y,+1);
- ADJUST_BOX(search,"_",10, 0, MUST, br,y,-1);
+ ADJUST_BOX(search,"_",>=,10, cim->h, MUST, tl,y,+1);
+ ADJUST_BOX(search,"_",>=,10, 0, MUST, br,y,-1);
debug_rect("commodselr",1, search);
sunshiner.tl.y= 227;
sunshiner.br.y= 228;
- ADJUST_BOX(sunshiner,"o*",30, 100,MUST, tl,y,-1);
- ADJUST_BOX(sunshiner,"o*",30, 100,MUST, br,y,+1);
+ ADJUST_BOX(sunshiner,"o*",>=,30, 100,MUST, tl,y,-1);
+ ADJUST_BOX(sunshiner,"o*",>=,30, 100,MUST, br,y,+1);
debug_rect("sunshiner",0, sunshiner);
MUST(sunshiner.br.y - sunshiner.tl.y > 20, MR(sunshiner));
sunshiner.br.y--;
- ADJUST_BOX(sunshiner,"o",20, (cim->w - 1034 + 700), MUST, tl,x,-1);
- ADJUST_BOX(sunshiner,"o",20, cim->w, MUST, br,x,+1);
+ ADJUST_BOX(sunshiner,"o",>=,20, (cim->w - 1034 + 700), MUST, tl,x,-1);
+ ADJUST_BOX(sunshiner,"o",>=,20, cim->w, MUST, br,x,+1);
debug_rect("sunshiner",1, sunshiner);
return sunshiner;
}
islandnamer.tl.y= 128;
islandnamer.br.y= 156;
- ADJUST_BOX(islandnamer,"o",5, 0, MUST, tl,y,+1);
- ADJUST_BOX(islandnamer,"o",5, cim->h, MUST, br,y,-1);
+ ADJUST_BOX(islandnamer,"o",>=,5, 0, MUST, tl,y,+1);
+ ADJUST_BOX(islandnamer,"o",>=,5, cim->h, MUST, br,y,-1);
- ADJUST_BOX(islandnamer,"o",1, 0, MUST, tl,x,+1);
- ADJUST_BOX(islandnamer,"o",1, cim->w, MUST, br,x,-1);
+ ADJUST_BOX(islandnamer,"o",>=,1, 0, MUST, tl,x,+1);
+ ADJUST_BOX(islandnamer,"o",>=,1, cim->w, MUST, br,x,-1);
debug_rect("islandnamer",0, islandnamer);
// int larger_islandnamebry= islandnamer.tl.y + 25;
}
identify_rgbimage(ri, islandnamer, archisland, "island");
- } else if (!strcmp(sunshine,"Land - Ahoy")) {
+ } else if (!strcmp(sunshine,"Land - Ahoy!")) {
Rect islandnamer;
islandnamer.tl.x= (sunshiner.tl.x + sunshiner.br.x) / 2;
WALK_UNTIL_MUST(islandnamer.br,x, +1, cim->w, 'o');
debug_rect("islandnamer",__LINE__, islandnamer);
- require_rectangle_r(islandnamer, "O*", __LINE__);
+#define RW (RECT_W(islandnamer))
+#define RH (RECT_H(islandnamer))
- int rw= RECT_W(islandnamer);
- ADJUST_BOX(islandnamer,"O",rw-4, cim->h, MUST,br,y,+1);
+ ADJUST_BOX(islandnamer,"O",>=,RW-4, cim->h, MUST,br,y,+1);
debug_rect("islandnamer",__LINE__, islandnamer);
islandnamer.br.y += 2;
- ADJUST_BOX(islandnamer,"O",1, cim->h, MUST,br,y,+1);
+
+ ADJUST_BOX(islandnamer,"*",<,RW, cim->h, MUST,br,y,+1);
debug_rect("islandnamer",__LINE__, islandnamer);
islandnamer.tl.y= islandnamer.br.y-1;
islandnamer.br.y= islandnamer.br.y+1;
- ADJUST_BOX(islandnamer,"*",rw, cim->h, MUST,br,y,+1);
- ADJUST_BOX(islandnamer,"O",1, cim->w, MUST,tl,x,+1);
debug_rect("islandnamer",__LINE__, islandnamer);
- MUST( RECT_H(islandnamer) <= 31, MR(islandnamer));
+ ADJUST_BOX(islandnamer,"*",>=,RW, cim->h, MUST,br,y,+1);
+ debug_rect("islandnamer",__LINE__, islandnamer);
+
+ ADJUST_BOX(islandnamer,"*",<, RH, cim->w, MUST,tl,x,+1);
+ debug_rect("islandnamer",__LINE__, islandnamer);
+
+ MUST( RECT_H(islandnamer) <= 30, MR(islandnamer));
Point p;
int nspaces=1, might_be_colon=0;
for (p.y=islandnamer.tl.y; p.y<=islandnamer.br.y; p.y++) {
pattern <<= 1;
switch (get_p(p)) {
- case 'O': runs[nruns]++; pattern |= 1u; break;
case '*': if (runs[nruns]) { nruns++; runs[nruns]=0; } break;
- default: abort();
+ case 'O': runs[nruns]++; pattern |= 1u; break;
+ default: pattern |= 1UL<<31; break;
}
}
nspaces++;
might_be_colon=0;
} else {
- if (nruns==2 && runs[1]==runs[0]) {
+ if (!(pattern & 1UL<<31) && nruns==2 && runs[1]==runs[0]) {
if (!nspaces) {
if (pattern==colon_pattern)
goto ok_might_be_colon;