|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T p
Length: 8156 (0x1fdc)
Types: TextFile
Names: »process_input.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
└─⟦this⟧ »EUUGD18/General/Tetris/process_input.c«
/*
** written by adam margulies vespa@ssyx.ucsc.edu
** {...}!ucbvax!ucscc!ssyx!vespa
**
** permission is granted to freely distribute this code provided that you:
**
** 1) don't charge for it
** 2) leave my name and header on it
** 3) clearly document your changes and place your name on them
**
*/
/* Tetris: process_input.c */
/* */
/* This reads user input and calls funtions accordingly. */
/* I used a series of if statements because case statements seemed */
/* too unwieldy for entries with long lists of code. */
/* */
/* This function is also where all collision detection is done. */
/* The collision detection is quite ugly, but fast. */
#include "tetris.h"
process_input(input)
char input;
{
void bfill(), redefine();
FILE *fp, *fopen();
int i=0,j=0,tmp_int = 0;
char tmp[81],c;
SIGHOLD(14);
if (input == 'S') /* save game */
save_game();
if (input == 'D') {
redefine();
return;
}
if (input == key->togdisp) { /* toggle next block display */
print_shape(next->shape, 17, 6, next->rot,
(disp_next ? ' ' : next->color));
csr_draw(6,17,9,20);
disp_next = !disp_next;
if (disp_next)
next->was_shown = 1;
SIGRELSE(14);
return;
}
if (input == key->togshad) { /* toggle shadowing */
shadow *= -1;
if (shadow == -1) {
mvaddstr(22,35,"----------");
csr_draw(22,35,22,45);
}
else {
draw_shadow();
current->was_shadowed = 0;
}
return;
}
if (input == '?') { /* info */
save_screen(0,0,23,79);
clear(0,0,23,79);
if ((fp = fopen(HELPFILE, "r")) == NULL){
SIGHOLD(14);
cls();
csr(23,0);
resetty();
fprintf(stderr, "%s\n", HELPFILE);
perror("opening help file");
exit(3);
}
flock(fileno(fp), LOCK_EX);
for(i=2;i<22;i++) {
while((c = fgetc(fp)) != '\n')
tmp[j++]= c;
tmp[j] = '\0';
move(i,0);
printc("%s",tmp);
j = 0;
}
csr_draw(0,0,23,79);
csr(0,0);
getchar();
clear(2,0,22,79);
for(i=2;i<22;i++) {
while((c = fgetc(fp)) != '\n')
tmp[j++]= c;
tmp[j] = '\0';
move(i,0);
printc("%s",tmp);
j = 0;
}
flock(fileno(fp), LOCK_UN);
fclose(fp);
csr_draw(2,0,22,79);
csr(0,0);
getchar();
restore_screen(0,0,23,79);
csr_draw(0,0,23,79);
SIGRELSE(14);
return;
}
if (input == 'P') { /* pause */
save_screen(2,35,21,44);
for(i=2;i<13;i++){
move(i,35);
printc("||||||||||");
csr_draw(i,35,i,44);
move(23-i,35);
printc("||||||||||");
csr_draw(23-i,35,23-i,44);
}
csr(12,35);
printf(" PAUSED ");
csr(0,0);
getchar();
restore_screen(2,35,21,44);
csr_draw(2,35,21,44);
SIGRELSE(14);
return;
}
if (input == key->left && /* move block left, horiz collision detect */
( cury < 2 ||
!(shape[current->shape].table[0][current->rot] & (xoffset ? 4 : 8)
&& (window0[cury][curx-(xoffset ? 0 : 1)] != ' '))) &&
( cury < 1 ||
!(shape[current->shape].table[1][current->rot] & (xoffset ? 4 : 8)
&& (window0[cury+1][curx-(xoffset ? 0 : 1)] != ' '))) &&
( cury < 0 ||
!(shape[current->shape].table[2][current->rot] & (xoffset ? 4 : 8)
&& (window0[cury+2][curx-(xoffset ? 0 : 1)] != ' '))))
if(( cury < -1 ||
!(shape[current->shape].table[3][current->rot] & (xoffset ? 4 : 8)
&& (window0[cury+3][curx-(xoffset ? 0 : 1)] != ' '))))
if (curx + ( xoffset ? 1 : 0)
> 35 ) {
print_shape(current->shape,curx--, cury, current->rot, ' ');
print_shape(current->shape, curx, cury, current->rot,
current->color);
if (shadow == 1)
draw_shadow();
SIGRELSE(14);
return;
}
/* move block right, collision detect */
/* this collision detection is more complex */
if (input == key->right && ((cury < 2) ||
(!(shape[current->shape].table[0][current->rot] & 1
&& (window0[cury][curx+4] != ' ')) &&
!((shape[current->shape].table[0][current->rot] & 8 &&
!(shape[current->shape].table[0][current->rot] & 4)
&& (window0[cury][curx+1] != ' '))) &&
!((shape[current->shape].table[0][current->rot] & 2 &&
!(shape[current->shape].table[0][current->rot] & 1)
&& (window0[cury][curx+3] != ' '))) &&
!((shape[current->shape].table[0][current->rot] & 4 &&
!(shape[current->shape].table[0][current->rot] & 2)
&& (window0[cury][curx+2] != ' '))))))
if ((cury < 1) ||
(!(shape[current->shape].table[1][current->rot] & 1
&& (window0[cury+1][curx+4] != ' ')) &&
!((shape[current->shape].table[1][current->rot] & 4 &&
!(shape[current->shape].table[1][current->rot] & 2)
&& (window0[cury+1][curx+2] != ' '))) &&
!((shape[current->shape].table[1][current->rot] & 8 &&
!(shape[current->shape].table[1][current->rot] & 4)
&& (window0[cury+1][curx+1] != ' '))) &&
!((shape[current->shape].table[1][current->rot] & 2 &&
!(shape[current->shape].table[1][current->rot] & 1)
&& (window0[cury+1][curx+3] != ' ')))))
if ((cury < 0) ||
(!(shape[current->shape].table[2][current->rot] & 1
&& (window0[cury+2][curx+4] != ' ')) &&
!((shape[current->shape].table[2][current->rot] & 8 &&
!(shape[current->shape].table[2][current->rot] & 4)
&& (window0[cury+2][curx+1] != ' '))) &&
!((shape[current->shape].table[2][current->rot] & 2 &&
!(shape[current->shape].table[2][current->rot] & 1)
&& (window0[cury+2][curx+3] != ' '))) &&
!((shape[current->shape].table[2][current->rot] & 4 &&
!(shape[current->shape].table[2][current->rot] & 2)
&& (window0[cury+2][curx+2] != ' ')))))
if ((cury < -1) ||
(!(shape[current->shape].table[3][current->rot] & 1
&& (window0[cury+3][curx+4] != ' ')) &&
!((shape[current->shape].table[3][current->rot] & 2 &&
!(shape[current->shape].table[3][current->rot] & 1)
&& (window0[cury+3][curx+3] != ' '))) &&
!((shape[current->shape].table[3][current->rot] & 4 &&
!(shape[current->shape].table[3][current->rot] & 2)
&& (window0[cury+3][curx+2] != ' '))) &&
!((shape[current->shape].table[3][current->rot] & 8 &&
!(shape[current->shape].table[3][current->rot] & 4)
&& (window0[cury+3][curx+1] != ' ')))))
if (curx + current->width < 45) {
print_shape(current->shape,curx++, cury, current->rot, ' ');
print_shape(current->shape, curx, cury, current->rot,
current->color);
if (shadow == 1)
draw_shadow();
SIGRELSE(14);
return;
}
if (input == key->rotright && /* rotate shape clockwise */
(curx + current->height < 46) &&
!(xoffset && curx < 36) &&
(cury + current->width < 22)
)
{
print_shape(current->shape, curx, cury, current->rot, ' ');
current->rot = ++current->rot % 4;
print_shape(current->shape, curx, cury, current->rot,
current->color);
tmp_int = current->height;
current->height = current->width;
current->width = tmp_int;
if (shadow == 1)
draw_shadow();
SIGRELSE(14);
return;
}
if (input == key->rotleft && /* rotate shape clockwise */
(curx + current->height < 46) &&
!(xoffset && curx < 35) &&
(cury + current->width < 22)
)
{
print_shape(current->shape, curx, cury, current->rot, ' ');
current->rot = (current->rot + 3) % 4;
print_shape(current->shape, curx, cury, current->rot,
current->color);
tmp_int = current->height;
current->height = current->width;
current->width = tmp_int;
if (shadow == 1)
draw_shadow();
SIGRELSE(14);
return;
}
if (input == key->drop) { /* drop shape as fast as possible */
dropped_from = cury + current->height -1;
fast_drop = 1;
while (cury < 3)
drop_block();
while(cury > 2)
drop_block();
dropped_from = 0;
fast_drop = 0;
SIGRELSE(14);
return;
}
if (input == 'Q') { /* quit */
current->shape = 7;
end_game();
}
/* changed '^R' to '\022'; billr@saab.CNA.TEK.COM */
if (input == '\022' || input == '\014') {
cls();
bfill(window0, sizeof(window0), ' ');
refresh();
SIGRELSE(14);
return;
}
}