ref: a30a2d56716a064c1867b6bd1b89088403f11d3c
dir: /math.c/
#include <u.h> #include <libc.h> #include <draw.h> #include "klondike.h" void stackmath(Cardstack *cs) { int i, y; Card *c; y = cs->p.y; for(i = 0; i < cs->n; i++){ c = cs->c[i]; c->p = Pt(cs->p.x, y); if(c->up) y += cs->upad; else y += cs->dpad; } } void tablemath() { int i, x, y; stock->p.x = Xpad; stock->p.y = Ypad; stock->p = addpt(screen->r.min, stock->p); stackmath(stock); waste->p.x = Cwid+Xpad*2; waste->p.y = Ypad; waste->p = addpt(screen->r.min, waste->p); stackmath(waste); x = Xpad; y = Cht+Ypad*2; for(i = 0; i < nelem(tableau); i++){ tableau[i]->p.x = x; tableau[i]->p.y = y; tableau[i]->p = addpt(screen->r.min, tableau[i]->p); stackmath(tableau[i]); x += Cwid+Xpad; } x = tableau[3]->p.x - screen->r.min.x; y = Ypad; for(i = 0; i < nelem(foundation); i++){ foundation[i]->p.x = x; foundation[i]->p.y = y; foundation[i]->p = addpt(screen->r.min, foundation[i]->p); stackmath(foundation[i]); x += Cwid+Xpad; } } int stackinarray(Cardstack *cs, Cardstack *csa[], int n) { int i; for(i = 0; i < n; i++) if(cs == csa[i]) return 1; return 0; } int ptinstack(Point xy, Cardstack *cs) { return ptinrect(xy, stackrect(cs)); } Rectangle cardrect(Card *c) { return rectaddpt(Rect(0, 0, Cwid, Cht), c->p); } Rectangle stackrect(Cardstack *cs) { int i; Card *c; Rectangle sr; sr = Rpt(ZP, ZP); for(i = 0; i < cs->n-1; i++){ c = cs->c[i]; if(c->up) sr.max.y += cs->upad; else sr.max.y += cs->dpad; } sr.max.x += Cwid; sr.max.y += Cht; return rectaddpt(sr, cs->p); } Cardstack* chosenstack(Point xy) { int i; if(ptinstack(xy, stock)) return stock; if(ptinstack(xy, waste)) return waste; for(i = 0; i < nelem(foundation); i++) if(ptinstack(xy, foundation[i])) return foundation[i]; for(i = 0; i < nelem(tableau); i++) if(ptinstack(xy, tableau[i])) return tableau[i]; return nil; } Cardstack* droptarget(Card *c) { int i; for(i = 0; i < nelem(foundation); i++) if(candrop(c, foundation[i])) return foundation[i]; for(i = 0; i < nelem(tableau); i++) if(candrop(c, tableau[i])) return tableau[i]; return nil; } int movpilesize(Point xy, Cardstack *cs) { Card *c; Rectangle cr; int i; if(cs->n == 0) return 0; cr = cardrect(top(cs)); i = cs->n - 1; while(!ptinrect(xy, cr)){ c = cs->c[--i]; if(c->up) cr.min.y -= cs->upad; else return 0; } return cs->n - i; }