diff --git a/projects/jigsaw/game.c b/projects/jigsaw/game.c index 863cc28..c1fc98f 100644 --- a/projects/jigsaw/game.c +++ b/projects/jigsaw/game.c @@ -76,7 +76,10 @@ int gameSave(Game *gm) { // <[img-file]> // // [ ]... - fprintf(f, "puzzle1.0\n[%s]\n%d %d %d %d %d\n", gm->imgname, gm->pz.rows, gm->pz.cols, !!gm->pz.turn, gm->pz.groups, gm->seed); + fprintf(f, "puzzle1.1\n[%s]\n%d %d %d %d %d\n%g %g\n", + gm->imgname, + gm->pz.rows, gm->pz.cols, !!gm->pz.turn, gm->pz.groups, gm->seed, + gm->pz.ph.b1.x*2, gm->pz.ph.b1.y*2 ); Chunk *chunks = gm->pz.chunks[0]; int cnt = gm->pz.rows * gm->pz.cols; @@ -114,7 +117,7 @@ static FILE* internalLoadGameInfo(GameInfo *gi, const char *path) { } char *l = trim(readline(f)); - if (strcmp(l, "puzzle1.0")) { + if (strcmp(l, "puzzle1.1")) { ERR("loadGameInfo: wrong file version (expected: puzzle1): %s", l); free(l); fclose(f); return NULL; } @@ -165,6 +168,11 @@ int gameLoad(Game *gm, const char *path) { return 0; } + Vec s = {}; + fscanf(f, "%lg%lg", &s.x, &s.y); + gm->pz.ph.b1 = vdiv(s, 2); + gm->pz.ph.b0 = vneg(gm->pz.ph.b1); + int cnt = gm->pz.rows * gm->pz.cols; Chunk *chunks = gm->pz.chunks[0]; int *orders = (int*)alloc(2*cnt*ASIZEOF(int)); diff --git a/projects/jigsaw/menu.c b/projects/jigsaw/menu.c index d617fb6..8fec71c 100644 --- a/projects/jigsaw/menu.c +++ b/projects/jigsaw/menu.c @@ -3,6 +3,21 @@ #include "icons.h" +static int parseImgName(const char *imgname, int *rows, int *cols) { + if (rows) *rows = 0; + if (cols) *cols = 0; + char* p = strrchr(imgname, '.'); + if (!p) return 0; + int r = 0, c = 0; + if ( 2 != sscanf(p, ".pz%dx%d", &c, &r) + || r > 100 || c > 100 || r*c > 200 + || r < 1 || c < 1 || r*c < 2 ) return 0; + if (rows) *rows = r; + if (cols) *cols = c; + return 1; +} + + static Animation loadThumb(const char *imgname, Framebuffer fb, int w, int h) { char *imgpath = findImage(imgname); if (!imgpath) @@ -100,6 +115,7 @@ int menuItemInit(MenuItem *mi, const char *path, const char *imgname, Vec p0, Ve mi->image = loadThumb(imgname, fb, w, h); if (!mi->image) return 0; mi->imgname = strprintf("%s", imgname); + parseImgName(mi->imgname, &mi->rows, &mi->cols); } else { return 0; } @@ -352,15 +368,19 @@ void menuChooseItem(Menu *m, MenuItem *mi) { gameLoad(&m->gm, mi->path); return; } - + int cnt = m->countMode == 0 ? 12 : m->countMode == 1 ? 24 : m->countMode == 2 ? 48 : 96; + int rows = mi->rows; + int cols = mi->cols; + if (!mi->rows || !mi->cols) { mi->rows = cnt; mi->cols = 0; } + char *path = NULL; for(int j = 0; j < 10000; ++j) { path = strprintf("%s/%s_%04d.puzzle", savesPath(), mi->imgname, j); if (fileExists(path)) { free(path); continue; } - gameCreate(&m->gm, path, mi->imgname, cnt, 0, m->turnMode, 0); + gameCreate(&m->gm, path, mi->imgname, rows, cols, m->turnMode, 0); free(path); break; } diff --git a/projects/jigsaw/menu.h b/projects/jigsaw/menu.h index 48e7728..d339c30 100644 --- a/projects/jigsaw/menu.h +++ b/projects/jigsaw/menu.h @@ -13,6 +13,7 @@ typedef struct { double percent; Animation image; Vec p0, p1; + int rows, cols; time_t t; } MenuItem; diff --git a/projects/jigsaw/puzzle.c b/projects/jigsaw/puzzle.c index ea8170f..1802acc 100644 --- a/projects/jigsaw/puzzle.c +++ b/projects/jigsaw/puzzle.c @@ -173,10 +173,10 @@ void puzzleUpdate(Puzzle *pz, Vec hs, Vec mouse) { Vec bmax = vmulv(vec(pz->ph.hw, pz->ph.hh), pz->cs); Vec b1 = vec( maxd(mmin.x, mind(hs.x, bmax.x)), maxd(mmin.y, mind(hs.y, bmax.y)) ); - - if ( (b1.x != pz->ph.b1.x || b1.y != pz->ph.b1.y) - && b1.x > PRECISION && pz->ph.b1.x > PRECISION - && b1.y > PRECISION && pz->ph.b1.y > PRECISION ) + Vec d1 = vabs(vsub(b1, pz->ph.b1)); + if ( b1.x > PRECISION && pz->ph.b1.x > PRECISION + && b1.y > PRECISION && pz->ph.b1.y > PRECISION + && !(d1.x <= PRECISION && d1.y <= PRECISION) ) { Vec k = vdivv(b1, pz->ph.b1); for(PhGroup *g = pz->ph.first; g; g = g->next) {