void killline(Line * l) { l->on=false; l->dead=false; // FIX: Make bang noise here? switch (l->dir) { case DOWN: // falls through. case UP: markgrid(l->geom.x,l->geom.y,l->geom.w,l->geom.h,' '); //SDL_FillRect(screen,&l->geom,SDL_MapRGB(screen->format, 0xFF, 0xFF, 0xFF)); SDL_BlitSurface(screensave,&l->geom, screen, &l->geom); soil(l->geom); break; case RIGHT: // falls through case LEFT: markgrid(l->geom.x,l->geom.y,l->geom.w,l->geom.h,' '); //SDL_FillRect(screen,&l->geom,SDL_MapRGB(screen->format, 0xFF, 0xFF, 0xFF)); SDL_BlitSurface(screensave,&l->geom, screen, &l->geom); soil(l->geom); break; } }
void squarefill(int x, int y) { // x and y must be the top left corner of a square, or else this // will look silly. and there's no bounds checking! if (grid[x][y]==' ' || grid[x][y]=='1' || grid[x][y]=='2' || grid[x][y]=='w') { markgrid(x,y,BLOCKWIDTH,BLOCKHEIGHT,'.'); squarefill(x+BLOCKWIDTH, y); squarefill(x-BLOCKWIDTH, y); squarefill(x, y+BLOCKHEIGHT); squarefill(x, y-BLOCKHEIGHT); } }
int moveline(Line * l) { int finish=false; char check1; char check2; markgrid(l->mark.x,l->mark.y,l->mark.w,l->mark.h,l->id); SDL_FillRect(screen,&(l->mark),l->color); soil(l->mark); switch (l->dir) { case UP: check1=grid[l->geom.x][l->geom.y-1]; check2=grid[l->geom.x+BLOCKWIDTH-1][l->geom.y-1]; break; case DOWN: check1=grid[l->geom.x][l->geom.y+l->geom.h]; check2=grid[l->geom.x+BLOCKWIDTH-1][l->geom.y+l->geom.h]; break; case LEFT: check1=grid[l->geom.x-1][l->geom.y]; check2=grid[l->geom.x-1][l->geom.y+BLOCKHEIGHT-1]; break; case RIGHT: check1=grid[l->geom.x+l->geom.w][l->geom.y]; check2=grid[l->geom.x+l->geom.w][l->geom.y+BLOCKHEIGHT-1]; break; default: // this will never happen. really. fprintf(stderr,"Line has no direction. That shouldn't have happened.\n"); check1='!'; check2='!'; break; } if (check1 == ' ' && check2 == ' ') { // next space is empty switch (l->dir) { case UP: l->geom.y--; l->geom.h++; l->mark.y--; l->mark.h=1; break; case DOWN: l->geom.h++; // increase length of line -- top stays same l->mark.y+=l->mark.h; l->mark.h=1; break; case LEFT: l->geom.x--; l->geom.w++; l->mark.x--; l->mark.w=1; break; case RIGHT: l->geom.w++; // increase width of line -- left side stays same l->mark.x+=l->mark.w; l->mark.w=1; break; } } else if (check1 == '*' || check2 == '*') { // hit a penguin. kills line. l->dead=true; } else if (check1 == '1' || check2 == '1' || check1 == '2' || check2 == '2') { if (l->stuckcount>LINEMAXSTUCK) { finish=true; } else { l->stuckcount++; // FIX: kludge-o-rama!! // this could work around the irratating thing where // a line gets started 'on top' of another line. but it // is totally repairing the symptom, not the bug. *sigh* //if (l->geom.w==1 || l->geom.h==1) finish=true; } } else { // hit something else finish=true; } if (finish) { markgrid(l->mark.x,l->mark.y,l->mark.w,l->mark.h,l->id); SDL_FillRect(screen,&(l->mark),l->color); soil(l->mark); finishline(l); return(1); } return(0); }
void finishline(Line * l) { int i; int quick1=false; int quick2=false; l->on=false; //printwholegrid(); switch (l->dir) { case DOWN: // falls through. case UP: markgrid(l->geom.x,l->geom.y,l->geom.w,l->geom.h,'|'); SDL_FillRect(screen,&l->geom,SDL_MapRGB(screen->format, 0x00, 0x40, 0x80)); soil(l->geom); // scan along edges to quickly determine if this // is going to be complicated. quick1=true; quick2=true; for (i=l->geom.y+BLOCKHEIGHT/2;i<l->geom.y+l->geom.h;i++) { if (grid[l->geom.x-1][i] != ' ' && grid[l->geom.x-1][i] != '*') quick1=false; if (grid[l->geom.x+BLOCKWIDTH][i] != ' ' && grid[l->geom.x+BLOCKWIDTH][i] != '*') quick2=false; } checkempty(l->geom.x-BLOCKWIDTH/2,l->geom.y+BLOCKHEIGHT/2); checkempty(l->geom.x+BLOCKWIDTH+BLOCKWIDTH/2/2,l->geom.y+BLOCKHEIGHT/2); if (!quick1) for (i=l->geom.y+BLOCKHEIGHT/2+BLOCKHEIGHT;i<l->geom.y+l->geom.h;i+=BLOCKHEIGHT) checkempty(l->geom.x-BLOCKWIDTH/2,i); if (!quick2) for (i=l->geom.y+BLOCKHEIGHT/2+BLOCKHEIGHT;i<l->geom.y+l->geom.h;i+=BLOCKHEIGHT) checkempty(l->geom.x+BLOCKWIDTH+BLOCKWIDTH/2,i); break; case RIGHT: // falls through case LEFT: markgrid(l->geom.x,l->geom.y,l->geom.w,l->geom.h,'-'); SDL_FillRect(screen,&l->geom,SDL_MapRGB(screen->format, 0x00, 0x40, 0x80)); soil(l->geom); // scan along edges to quickly determine if this // is going to be complicated. quick1=true; quick2=true; for (i=l->geom.x+BLOCKWIDTH/2;i<l->geom.x+l->geom.w;i++) { if (grid[i][l->geom.y-1] != ' ' && grid[i][l->geom.y-1] != '*') quick1=false; if (grid[i][l->geom.y+BLOCKHEIGHT] != ' ' && grid[i][l->geom.y+BLOCKHEIGHT] != '*') quick2=false; } checkempty(l->geom.x+BLOCKWIDTH/2,l->geom.y-BLOCKHEIGHT/2); checkempty(l->geom.x+BLOCKWIDTH/2,l->geom.y+BLOCKHEIGHT+BLOCKHEIGHT/2); if (!quick1) for (i=l->geom.x+BLOCKWIDTH/2+BLOCKWIDTH;i<l->geom.x+l->geom.w;i+=BLOCKWIDTH) checkempty(i,l->geom.y-BLOCKHEIGHT/2); if (!quick2) for (i=l->geom.x+BLOCKWIDTH/2+BLOCKWIDTH;i<l->geom.x+l->geom.w;i+=BLOCKWIDTH) checkempty(i,l->geom.y+BLOCKHEIGHT+BLOCKHEIGHT/2); break; } }