|
|
@@ -1,11 +1,6 @@ |
|
|
|
/* |
|
|
|
* $Id$ |
|
|
|
* |
|
|
|
* This program is free software; you can redistribute it and/or modify |
|
|
|
* it under the terms of the GNU General Public License as published by |
|
|
|
* the Free Software Foundation; either version 2 of the License, or |
|
|
|
* (at your option) any later version. |
|
|
|
* |
|
|
|
* This program is free software; you can redistribute it and/or |
|
|
|
* modify it under the terms of the Do What The Fuck You Want To |
|
|
|
* Public License, Version 2, as published by Sam Hocevar. See |
|
|
@@ -20,7 +15,7 @@ int main(int argc, char *argv[]) |
|
|
|
static caca_display_t *dp; |
|
|
|
signed int x=(FIELD_WIDTH/2)-1, y=0, rotation=0, old_x=0, old_y=0, old_rotation=0; |
|
|
|
unsigned int current_piece, next_piece, baseTime = 0; |
|
|
|
unsigned char last_has_landed = 0; |
|
|
|
unsigned char last_has_landed = 1; |
|
|
|
unsigned char left = 0, right = 0, down = 0; |
|
|
|
unsigned long long int curTime = 0; |
|
|
|
unsigned int speed = 32; |
|
|
@@ -54,23 +49,23 @@ int main(int argc, char *argv[]) |
|
|
|
caca_event_t ev; |
|
|
|
left = 0; right = 0; down = 0; |
|
|
|
|
|
|
|
printf("%llu\n", curTime); |
|
|
|
|
|
|
|
/* Handle events */ |
|
|
|
|
|
|
|
while(caca_get_event(dp, CACA_EVENT_KEY_PRESS |
|
|
|
| CACA_EVENT_QUIT, &ev, 0)) |
|
|
|
{ |
|
|
|
if(ev.type == CACA_EVENT_QUIT) |
|
|
|
goto end; |
|
|
|
switch(ev.data.key.ch) |
|
|
|
switch(ev.data.key.ch) |
|
|
|
{ |
|
|
|
case CACA_KEY_ESCAPE: |
|
|
|
goto end; |
|
|
|
break; |
|
|
|
case CACA_KEY_UP: |
|
|
|
rotation++; |
|
|
|
rotation = rotation&0x03; |
|
|
|
if(movable(current_piece, x, y, (rotation+1)&0x03)) |
|
|
|
{ |
|
|
|
rotation++; |
|
|
|
rotation = rotation&0x03; |
|
|
|
} |
|
|
|
break; |
|
|
|
case CACA_KEY_DOWN: |
|
|
|
down = 1; |
|
|
@@ -87,24 +82,23 @@ int main(int argc, char *argv[]) |
|
|
|
if(left) |
|
|
|
{ |
|
|
|
if(movable(current_piece, x-1, y, rotation)) |
|
|
|
x--; |
|
|
|
x--; |
|
|
|
} |
|
|
|
if(right) |
|
|
|
{ |
|
|
|
if(movable(current_piece, x+1, y, rotation)) |
|
|
|
x++; |
|
|
|
x++; |
|
|
|
} |
|
|
|
|
|
|
|
if(!last_has_landed) |
|
|
|
{ |
|
|
|
remove_piece(current_piece, old_x ,old_y, old_rotation); |
|
|
|
last_has_landed = 0; |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
last_has_landed = 0; |
|
|
|
} |
|
|
|
|
|
|
|
put_piece(current_piece, x ,y, rotation); |
|
|
|
|
|
|
|
old_x = x; |
|
|
|
old_y = y; |
|
|
@@ -114,22 +108,13 @@ int main(int argc, char *argv[]) |
|
|
|
y = fixed_y>>8; |
|
|
|
|
|
|
|
|
|
|
|
if(y==(FIELD_HEIGHT-4)) |
|
|
|
{ |
|
|
|
fixed_y = 0; |
|
|
|
x = (FIELD_WIDTH/2)-1; |
|
|
|
current_piece = next_piece; |
|
|
|
rotation = 0; |
|
|
|
next_piece = cucul_rand(0, 6); |
|
|
|
last_has_landed = 1; |
|
|
|
old_x = x; |
|
|
|
old_y = 0; |
|
|
|
} |
|
|
|
|
|
|
|
/* Populate info canvas */ |
|
|
|
infos_populate(infos); |
|
|
|
/* Draw everything on playfield */ |
|
|
|
put_piece(current_piece, x ,y, rotation); |
|
|
|
playfield_draw(field); |
|
|
|
remove_piece(current_piece, x ,y, rotation); |
|
|
|
/* blit infos canvas into general one */ |
|
|
|
cucul_blit(screen, (cucul_get_canvas_width(screen)) - INFO_WIDTH, 0, infos, NULL); |
|
|
|
/* blit playfield canvas into general one */ |
|
|
@@ -138,12 +123,27 @@ int main(int argc, char *argv[]) |
|
|
|
caca_refresh_display(dp); |
|
|
|
|
|
|
|
|
|
|
|
if(has_landed(current_piece, x ,y, rotation)) |
|
|
|
{ |
|
|
|
put_piece(current_piece, x ,y, rotation); |
|
|
|
fixed_y = 0; |
|
|
|
x = (FIELD_WIDTH/2)-1; |
|
|
|
current_piece = next_piece; |
|
|
|
rotation = 0; |
|
|
|
next_piece = cucul_rand(0, 6); |
|
|
|
last_has_landed = 1; |
|
|
|
old_x = x; |
|
|
|
old_y = 0; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
maybe_remove_line(); |
|
|
|
|
|
|
|
if(!baseTime) |
|
|
|
{ |
|
|
|
baseTime = caca_get_display_time(dp); |
|
|
|
} |
|
|
|
curTime+=caca_get_display_time(dp); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
end: |
|
|
@@ -205,7 +205,6 @@ void playfield_draw(cucul_canvas_t *canvas) |
|
|
|
void put_piece(unsigned int id, unsigned int x, unsigned int y, unsigned int rot) |
|
|
|
{ |
|
|
|
unsigned int ix, iy; |
|
|
|
printf("rotation %d\n", rot); |
|
|
|
piece_t *p = &pieces[(id*4)+rot]; |
|
|
|
|
|
|
|
for(iy = 0; iy < p->h; iy++) |
|
|
@@ -217,29 +216,83 @@ void put_piece(unsigned int id, unsigned int x, unsigned int y, unsigned int rot |
|
|
|
void remove_piece(unsigned int id, unsigned int x, unsigned int y, unsigned int rot) |
|
|
|
{ |
|
|
|
unsigned int ix, iy; |
|
|
|
printf("rotation %d\n", rot); |
|
|
|
piece_t *p = &pieces[(id*4)+rot]; |
|
|
|
|
|
|
|
for(iy = 0; iy < p->h; iy++) |
|
|
|
for(ix = 0; ix < p->w; ix++) |
|
|
|
if(ix<p->w && iy<p->h) |
|
|
|
if(p->data[ix+iy*4]) |
|
|
|
playfield[(ix+x)+(iy+y)*FIELD_WIDTH] = 0; |
|
|
|
if(p->data[ix+iy*4]) |
|
|
|
playfield[(ix+x)+(iy+y)*FIELD_WIDTH] = 0; |
|
|
|
} |
|
|
|
|
|
|
|
unsigned char movable(unsigned int id, int x, int y, unsigned int rot) |
|
|
|
{ |
|
|
|
piece_t *p = &pieces[(id*4)+rot]; |
|
|
|
unsigned int ix, iy; |
|
|
|
int w, h; |
|
|
|
|
|
|
|
w = p->w; |
|
|
|
h = p->h; |
|
|
|
|
|
|
|
|
|
|
|
if(y>=(signed)(FIELD_HEIGHT-p->h)) { |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if(x>=0 && (x+w<=FIELD_WIDTH) && y<(FIELD_HEIGHT-(signed)h)) |
|
|
|
{ |
|
|
|
for(iy = 0; iy < p->h; iy++) |
|
|
|
for(ix = 0; ix < p->w; ix++) |
|
|
|
if((p->data[ix+iy*4]!=0) && (playfield[(ix+x)+(iy+y)*FIELD_WIDTH]!=0)) { |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
return 1; |
|
|
|
} |
|
|
|
|
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
unsigned char has_landed(unsigned int id, unsigned int x, unsigned int y, unsigned int rot) |
|
|
|
{ |
|
|
|
piece_t *p = &pieces[(id*4)+rot]; |
|
|
|
unsigned int ix, iy; |
|
|
|
unsigned int w, h; |
|
|
|
|
|
|
|
w = p->w; |
|
|
|
h = p->h; |
|
|
|
|
|
|
|
if(y>=(FIELD_HEIGHT-p->h)) { |
|
|
|
return 1; |
|
|
|
} |
|
|
|
y++; |
|
|
|
if(x>=0 && (x+w<=FIELD_WIDTH) && y<=(FIELD_HEIGHT-h)) |
|
|
|
{ |
|
|
|
for(iy = 0; iy < p->h && (iy+y<FIELD_HEIGHT) ; iy++) |
|
|
|
for(ix = 0; (ix < p->w) && (ix+x<FIELD_WIDTH); ix++) |
|
|
|
if((p->data[ix+iy*4]!=0) && (playfield[(ix+x)+(iy+y)*FIELD_WIDTH]!=0)) { |
|
|
|
return 1; |
|
|
|
} |
|
|
|
|
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
return 1; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
unsigned char maybe_remove_line(void) |
|
|
|
{ |
|
|
|
int x, v=0; |
|
|
|
unsigned char *p = &playfield[(FIELD_HEIGHT-1)*FIELD_WIDTH]; |
|
|
|
for(x = 0; x < FIELD_WIDTH ; x++) |
|
|
|
if(*p++) |
|
|
|
v++; |
|
|
|
|
|
|
|
if(v==FIELD_WIDTH) { |
|
|
|
memmove(&playfield[FIELD_WIDTH], playfield, (FIELD_HEIGHT-1)*FIELD_WIDTH); |
|
|
|
return 1; |
|
|
|
} |
|
|
|
return 0; |
|
|
|
} |