/* @(#) icon.c version 2.1 (Blit) of 9/13/83 12:57:16 Last Delta: 7/22/83 14:07:27 to /usr/jerq/sccs/src/maze/s.icon.c */ #include "maze.h" int grey[] = { 0xAAAA, 0x5555, 0xAAAA, 0x5555, 0xAAAA, 0x5555, 0xAAAA, 0x5555, 0xAAAA, 0x5555, 0xAAAA, 0x5555, 0xAAAA, 0x5555, 0xAAAA, 0x5555, }; Bitmap *icon[WID][4]; /* WID depths, 4 viewing angles */ Rectangle brect; Bitmap *mask, *lastb; Point ibb[WID], *lastibb, center; extern float sqrt(); iconclean() { int i,j; for (i = 0; i < WID; i++) for (j = 0; j < 4; j++) bfree(icon[i][j]); } danger(him) register State *him; { register char *pos = him->pos, dir = him->dir; for (; (*pos & forw[dir]) == 0;) { pos += inc[dir]; if (pos == me->pos) return(1); } return(0); } showem(self) State *self; { register int i,j,y; register char *pos = self->pos, dir = self->dir; Bitmap *b; register State *p; y = 0; for (p = player, i = 0; i < N; i++, p++) { p->ovis = p->vis; p->vis = 0; } for (i = 0; (*pos & forw[dir]) == 0; i++) { pos += inc[dir]; y += dy[i]; for (p = player, j = 0; j < N; j++, p++) if (p->id >= 0 && p->pos == pos) { p->vis = 1; b = icon[i][(dir-p->dir+2)&3]; lastb = icon[i][2]; lastibb = &ibb[i]; bitblt(lastb,&brect,&Dblock,lastibb,F_CLR); bitblt(b,&brect,&Dblock,lastibb,F_XOR); } } y += dy[i]; /* jsegment(LEFT+y,DOWN-y,RIGHT-y,DOWN-y,F_STORE); */ for (p = player, i = 0; i < N; i++, p++) if (p->id >= 0 && p->vis != p->ovis) showscore(p); } Bitmap * frontview(r) { register int diag; Bitmap *b; b = balloc(&brect); rectf(b, &brect, F_CLR); texture(b,brect.origin.x,brect.origin.y,brect.corner.x,brect.corner.y, grey,15,F_STORE); rectf(mask, &brect, F_STORE); disc(mask, center.x, center.y, r/3, F_CLR); bitblt(mask, &brect, b, &brect.origin, F_CLR); rectf(b, &brect, F_XOR); disc(b, center.x, center.y, r, F_XOR); diag = ((float)r) * sqrt(2.0); /* WAS: norm(r,r,0); */ disc(b, center.x, center.y - r, diag, F_XOR); disc(b, center.x, center.y + r, diag, F_XOR); circle(b, center.x, center.y, r/3, F_STORE); disc(b, center.x, center.y, r/6, F_STORE); rectf(mask, &brect, F_STORE); disc(mask, center.x, center.y, r, F_CLR); bitblt(mask, &brect, b, &brect.origin, F_CLR); circle(b, center.x, center.y, r, F_STORE); /* bitblt(b,&brect,&Dblock,&brect.origin,F_STORE); Crawcin(); */ return(b); } Bitmap * rside(r) { register int diag; Bitmap *b; Rectangle r1; b = balloc(&brect); rectf(mask, &brect, F_STORE); disc(mask,center.x,center.y,r,F_CLR); rectf(b,&brect,F_CLR); diag = ((float)r) * sqrt(2.0); /* WAS: norm(r,r,0); */ disc(b,center.x - r,center.y - r,diag,F_XOR); disc(b,center.x - r,center.y + r,diag,F_XOR); Pt(r1.origin, center.x, 0); Assign(r1.corner,brect.corner); rectf(b,&r1,F_STORE); disc(b,center.x - (9*r)/5, center.y, r, F_STORE); bitblt(mask,&brect,b,&brect.origin,F_CLR); circle(b,center.x,center.y,r,F_STORE); /* bitblt(b,&brect,&Dblock,&brect.origin,F_STORE); Crawcin(); */ return(b); } Bitmap * backview(r) { Bitmap *b; b = balloc(&brect); rectf(b,&brect,F_CLR); disc(b,center.x,center.y,r,F_STORE); circle(b, center.x, center.y, r, F_STORE); /* bitblt(b,&brect,&Dblock,&brect.origin,F_STORE); Crawcin(); */ return(b); } Bitmap * lside(r) { register int diag; Bitmap *b; Rectangle r1; b = balloc(&brect); rectf(mask, &brect, F_STORE); disc(mask,center.x,center.y,r,F_CLR); rectf(b,&brect,F_CLR); diag = ((float)r) * sqrt(2.0); /* WAS: norm(r,r,0); */ disc(b,center.x + r,center.y-r,diag,F_XOR); disc(b,center.x + r,center.y+r,diag,F_XOR); Assign(r1.origin, brect.origin); Pt(r1.corner, center.x, brect.corner.y); rectf(b,&r1,F_STORE); disc(b,center.x + (9*r)/5,center.y,r,F_STORE); bitblt(mask,&brect,b,&brect.origin,F_CLR); circle(b,center.x,center.y,r,F_STORE); /* bitblt(b,&brect,&Dblock,&brect.origin,F_STORE); Crawcin(); */ return(b); } iconinit() /* make four kinds of icon */ { int i, dh; dh = dreal[0] | 1; /* make sure pos has odd size */ Rect(brect,0,0,dh,dh); Pt(center, (brect.corner.x - brect.origin.x) >> 1, (brect.corner.y - brect.origin.y) >> 1); mask = balloc(&brect); for (i = 0; i < WID; i++) { dh = dreal[i] >> 1; icon[i][0] = frontview(dh); icon[i][1] = rside(dh); icon[i][2] = backview(dh); icon[i][3] = lside(dh); Pt(ibb[i], MIDDLE - (dreal[0] >> 1), Drect.origin.y + (((int)muldiv(DOWN,YSIZE,YMAX) - dreal[0])>>1)); } lastb = icon[0][0]; lastibb = &ibb[0]; }