billr@saab.CNA.TEK.COM (Bill Randle) (08/10/89)
Submitted-by: Biancardi Roberto <tmpmbx!deejay!i2ack!usixth!bob> Posting-number: Volume 8, Issue 5 Archive-name: tetris-v/Part01 #! /bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh <file", e.g.. If this archive is complete, you # will see the following message at the end: # "End of archive 1 (of 1)." # Contents: README COPYRIGHT Makefile defs.h main.c polluser.c score.c # shape.c support.c tetris.6 # Wrapped by billr@saab on Thu Aug 10 08:04:33 1989 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'README' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'README'\" else echo shar: Extracting \"'README'\" \(511 characters\) sed "s/^X//" >'README' <<'END_OF_FILE' X XThis version on tetris should run on any system V and xenix system Xwhich supports the curses library. XCarefully look at the begging of the Makefile, then make and run. X XI used the game-logic of the version posted to the net by Phill Everson X<everson@cs.bris.ac.uk> and Martyn Shortley <shortley@cs.bris.ac.uk>_ X XLet bob@usixth know about any bug, fixes, enhancements and so on. XIf you have curses which support colors, it should be easy Xto modify set1pixel in main.c to attrset, depending on the value of col. END_OF_FILE if test 511 -ne `wc -c <'README'`; then echo shar: \"'README'\" unpacked with wrong size! fi # end of 'README' fi if test -f 'COPYRIGHT' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'COPYRIGHT'\" else echo shar: Extracting \"'COPYRIGHT'\" \(1295 characters\) sed "s/^X//" >'COPYRIGHT' <<'END_OF_FILE' XCopyright 1989 Phill Everson & Martyn Shortley XCopyright 1989 Roberto Biancardi X XThis notice and any statement of authorship must be reproduced Xon all copies. The authors do not make any warranty expressed Xor implied, or assume any liability or responsiblity for the Xuse of this software. X XAny distributor of copies of this software shall grant the Xrecipient permission for further redistribution as permitted Xby this notice. Any distributor must distribute this software Xwithout any fee or other monetary gains, unless expressed written Xpermission is granted by the authors. X XThis software or its use shall not be: sold, rented, leased, Xtraded, or otherwise marketed without the expressed written Xpermission of the authors. X XIf the software is modified in a manner creating derivative Xcopyrights, appropriate legends may be placed on derivative Xwork in addition to that set forth above. X XPermission is hereby granted to copy, reproduce, redistribute or Xotherwise use this software as long as the conditions above Xare met. X XAll rights not granted by this notice are reserved. X XAuthors: Phill Everson <everson@cs.bris.ac.uk> X Martyn Shortley <shortley@cs.bris.ac.uk> X Biancardi Roberto tmpmbx!deejay!i2ack!usixth!bob X (on EUcon, the FREE European Connection for UUCP) X END_OF_FILE if test 1295 -ne `wc -c <'COPYRIGHT'`; then echo shar: \"'COPYRIGHT'\" unpacked with wrong size! fi # end of 'COPYRIGHT' fi if test -f 'Makefile' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'Makefile'\" else echo shar: Extracting \"'Makefile'\" \(2306 characters\) sed "s/^X//" >'Makefile' <<'END_OF_FILE' X########################################################################### X# Define this line, if you are using Xenix. X#XENLIB=-ltermlib -lx X########################################################################### X# Define this if you have an old version of curses. X#XENFLAGS=-DOLDCURSES X########################################################################### X# Define this if you have the nap call, probably your xenix has X# but it seem to do not work at all. To test this, try: X# X# #include <sys/param.h> X# main() { nap(HZ); } X# X# Then: X# X# /bin/time a.out X# X# If nap works, real execution time of this test program should X# be about one second. Else, your nap don't work at all. X# X#POLLFLAGS=-DUSENAP X########################################################################### X# Define this if you have the poll system call (not tested). X#POLLFLAGS=-DUSEPOLL X########################################################################### X# Define this if you don't have poll() or nap() and you don't X# want to consume cpu time for games. That's because on poor 2.0 X# to perform delay with a better resolution than 1/10 secs X# tetris busy wait on times(). This does not seem to be a super-hogger, X# because busy-wating is done only when the player reach higher X# levels, but if you see your response time going down because of X# tetris, use this. X#POLLFLAGS=-DDONTHOG X########################################################################### X# My keyboard seems to have some problems with the space bar, X# particularly generating two space instead of one, causing two X# consecutive fast drop to be executed. If you esperience something X# of similar use this. X#KEYBDFLAGS=-DKEYBDKLUDGE X########################################################################### X XCFLAGS=-O $(POLLFLAGS) $(XENFLAGS) $(KEYBDFLAGS) XLIBES=-lcurses $(XENLIB) XBINDIR=/usr/games XPROG=tetris XCFILES=main.c shape.c support.c score.c polluser.c XOFILES=main.o shape.o support.o score.o polluser.o X X$(PROG): $(OFILES) X cc $(CFLAGS) -o $(PROG) $(OFILES) $(LIBES) X X$(OFILES): defs.h X Xinstall: $(PROG) X strip $(PROG) X install -s $(PROG) $(BINDIR) X Xclean: X rm -f *.o core X Xshar : X shar -a README \ X COPYRIGHT \ X Makefile \ X tetris.6 \ X defs.h \ X main.c \ X polluser.c \ X score.c \ X shape.c \ X support.c \ X >tetris.shar END_OF_FILE if test 2306 -ne `wc -c <'Makefile'`; then echo shar: \"'Makefile'\" unpacked with wrong size! fi # end of 'Makefile' fi if test -f 'defs.h' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'defs.h'\" else echo shar: Extracting \"'defs.h'\" \(1166 characters\) sed "s/^X//" >'defs.h' <<'END_OF_FILE' X#include <stdio.h> X X#define UWIDTH 10 X#define UHEIGHT 22 X X#define WHITE 1 X#define BLACK 2 X#define RED 3 X#define ORANGE 4 X#define YELLOW 5 X#define GREEN 6 X#define BLUE 7 X#define CYAN 8 X#define VIOLET 9 X#define LSIDE 10 X#define RSIDE 11 X#define BOTTOM 12 X#define SHADOW 13 X#define ULCORN 14 X#define URCORN 15 X#define BLCORN 16 X#define BRCORN 17 X Xint score_position; /* position of this game in the hiscore tab */ Xint shape_no; /* the dripping shape */ Xint xpos, ypos, rot; /* x, y, rotation of shape_no */ Xint score; /* current score */ Xint rows; /* number of rows deleted */ Xint next_no; /* next shape */ Xint next_rot; /* rotation of next shape */ Xchar *name; /* username */ X Xunsigned char grid[UWIDTH][UHEIGHT]; X Xstruct shape_table { X int table[4][4]; X int width; X int height; X int offset; X int pointv[4]; X char color; X} shape[7]; X Xstruct shape { X int shape; X int rot; X int width; X int height; X int offset; X int pointv; X char color; X int was_shown; X int was_shadowed; X} ; END_OF_FILE if test 1166 -ne `wc -c <'defs.h'`; then echo shar: \"'defs.h'\" unpacked with wrong size! fi # end of 'defs.h' fi if test -f 'main.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'main.c'\" else echo shar: Extracting \"'main.c'\" \(12065 characters\) sed "s/^X//" >'main.c' <<'END_OF_FILE' X#include "defs.h" X X#include <sys/types.h> X#include <setjmp.h> X#include <pwd.h> X#include <curses.h> X#include <term.h> X X#define VUNIT 1 /* ver unit */ X#define HUNIT 2 /* hor unit */ X#define NORM_OFFSET 15 /* x offset for blocks */ X#define NEXT_HEIGHT (VUNIT*5) /* Height for next block */ X Xstatic char *blostr = " "; /* char used to draw blocks */ Xstatic jmp_buf rest; /* to restart the game */ Xstatic int beep = 1; Xstatic int beginlev = 0; X Xmain(argc, argv) X int argc; X char **argv; X{ X int i, c; X X for ( i=1; i < argc; i++ ) { X if ( argv[i][0] == '-' ) switch ( argv[i][1] ) { X case 's' : X beep = 0; X break; X case 'l' : X if ( argv[i][2] ) X beginlev = atoi(argv[i]+2); X else X beginlev = atoi(argv[++i]); X if ( beginlev < 0 ) X beginlev = 0; X break; X case 'b' : X if ( argv[i][2] ) X c = argv[i][2]; X else X c = argv[++i][0]; X blostr[0] = blostr[1] = c; X break; X } X } X initialise(); X setjmp(rest); X init_all(); X main_loop(); X exit(0); X} X Xinitialise() X{ X struct passwd *who; X char *getenv(); X int end_proc(); X X print_authors(); X srand((unsigned) time((time_t *) 0)); X define_shapes(); X who = (struct passwd *)getpwuid(getuid()); X name = who->pw_name; X init_tty(); X read_high_scores(); X#ifndef OLDCURSES X if ( enter_reverse_mode ) X enter_standout_mode = enter_reverse_mode; X else if ( blostr[0] == ' ' ) X blostr[0] = blostr[1] = '#'; X#endif X} X Xinit_all() X{ X int i, j; X X score_position = -1; X rows = score = shape_no = rot = xpos = ypos = 0; X for (i = 0; i < UWIDTH; i++) X for (j = 0; j < UHEIGHT; j++) X grid[i][j] = 0; X create_shape(); /* Set up 1st shape */ X create_shape(); /* Set up next shape */ X clear(); X setpixels(NORM_OFFSET-1, 0, 1, UHEIGHT , LSIDE); X set1pixel(NORM_OFFSET-1, UHEIGHT, BLCORN); X setpixels(NORM_OFFSET+UWIDTH, 0, 1, UHEIGHT , RSIDE); X set1pixel(NORM_OFFSET+UWIDTH, UHEIGHT, BRCORN); X show_score(1); X show_next(1); X draw_shadow(shape_no, xpos + NORM_OFFSET, ypos, rot, shape[shape_no].color); X setuptty(); X} X Xinit_tty() { X initscr(); X leaveok(stdscr,FALSE); X raw(); X noecho(); X nonl(); X} X Xmain_loop() X{ X register char *p; X register int nc; X#ifdef KEYBDKLUDGE X register prevop; X register int lastop = 0; X#endif X char buf[16]; X X for ( setlevel(beginlev); ; ) { X refresh(); X nc = polluser(buf,sizeof(buf)); X for ( p = buf; nc-- > 0; ) { X#ifdef KEYBDKLUDGE X prevop = lastop; X lastop = 0; X#endif X switch ( *p++ ) { X case 0 : X drop_block(); X#ifdef KEYBDKLUDGE X lastop = prevop; X#endif X break; X case '8' : X anti_proc(); X break; X case '7' : X left_proc(); X break; X case '*' : X clock_proc(); X break; X case '9' : X right_proc(); X break; X case ' ' : X#ifdef KEYBDKLUDGE X if ( prevop != ' ' ) { X fast_proc(); X lastop = ' '; X } X#else X fast_proc(); X#endif X break; X case 'q' : X case 'Q' : X closeuptty(); X end_proc(); X break; X } X } X } X} X Xdrop_block() X{ X register int orows; X X if (block_can_drop(shape_no, xpos, ypos, rot)) X print_shape(shape_no, xpos + NORM_OFFSET, ypos++, rot, WHITE); X else { X if (ypos < 0) X end_game(); X else { X orows = rows; X score += shape[shape_no].pointv[rot]; X store_shape(shape_no, xpos, ypos, rot); X remove_full_lines(ypos); X create_shape(); X show_score(1); X show_next(1); X if ( orows != rows ) { X scbeep(); X setlevel(beginlev + (rows/10)); X } X } X } X print_shape(shape_no, xpos + NORM_OFFSET, ypos, rot, shape[shape_no].color); X draw_shadow(shape_no, xpos + NORM_OFFSET, ypos, rot, shape[shape_no].color); X} X Xstatic show_score(on) X{ X register int y, x; X char b1[32], b2[32], b3[32]; X char *p1, *p2, *p3; X X if ( on ) { X sprintf(p1 = b1, "S C O R E : %d", score); X sprintf(p2 = b2, "L e v e l : %d", beginlev + (rows/10) ); X sprintf(p3 = b3, "R o w s : %d", rows); X } else X p1 = p2 = p3 = " "; X x = NORM_OFFSET + UWIDTH + 5; X y = 1; X wtext(x, y , p1, 0); X wtext(x, y + 2, p2, 0); X wtext(x, y + 4, p3, 0); X} X Xint waituser(echon) { X int c; X X refresh(); X if ( echon ) X echo(); X else X noecho(); X c = getch(); X return c; X} X Xend_game() { X int c; X X closeuptty(); X setpixels(9, 6, 22 , 10, WHITE); X set1pixel(9,6,ULCORN); X setpixels(10, 6, 20 , 1, BOTTOM); X set1pixel(30,6,URCORN); X setpixels(9, 7, 1 , 9, LSIDE); X setpixels(30, 7, 1 , 9, RSIDE); X set1pixel(9,16,BLCORN); X setpixels(10, 16, 20 , 1, BOTTOM); X set1pixel(30,16,BRCORN); X wtext(15,11," G A M E O V E R ", 1); X scbeep(); X while ( waituser(0) != ' ' ) X ; X update_highscore_table(); X print_high_scores(); X wtext(15,20," Another game ? ", 0); X c = waituser(1); X if ( c == 'n' || c == 'N' || c == 'q' || c == 'Q' ) X end_proc(); X longjmp(rest,1); X} X Xend_proc() X{ X wtext(15,LINES-6," ",1); X wtext(15,LINES-5," Play Tetris! ",1); X wtext(15,LINES-4," ",1); X move(LINES-1,0); X refresh(); X endwin(); X exit(0); X} X Xleft_proc() X{ X if (block_can_left(shape_no, xpos, ypos, rot)) { X print_shape(shape_no, xpos + NORM_OFFSET, ypos, rot, WHITE); X xpos--; X print_shape(shape_no, xpos + NORM_OFFSET, ypos, rot, shape[shape_no].color); X draw_shadow(shape_no, xpos + NORM_OFFSET, ypos, rot, shape[shape_no].color); X } X} X Xright_proc() X{ X if (block_can_right(shape_no, xpos, ypos, rot)) { X print_shape(shape_no, xpos + NORM_OFFSET, ypos, rot, WHITE); X xpos++; X print_shape(shape_no, xpos + NORM_OFFSET, ypos, rot, shape[shape_no].color); X draw_shadow(shape_no, xpos + NORM_OFFSET, ypos, rot, shape[shape_no].color); X } X} X Xanti_proc() X{ X int newrot; X X newrot = (rot + 3) % 4; X if (check_rot(shape_no, xpos, ypos, newrot)) { X print_shape(shape_no, xpos + NORM_OFFSET, ypos, rot, WHITE); X rot = newrot; X print_shape(shape_no, xpos + NORM_OFFSET, ypos, rot, shape[shape_no].color); X draw_shadow(shape_no, xpos + NORM_OFFSET, ypos, rot, shape[shape_no].color); X } X} X Xclock_proc() X{ X int newrot; X X newrot = (rot + 1) % 4; X if (check_rot(shape_no, xpos, ypos, newrot)) { X print_shape(shape_no, xpos + NORM_OFFSET, ypos, rot, WHITE); X rot = newrot; X print_shape(shape_no, xpos + NORM_OFFSET, ypos, rot, shape[shape_no].color); X draw_shadow(shape_no, xpos + NORM_OFFSET, ypos, rot, shape[shape_no].color); X } X} X Xfast_proc() X{ X while (block_can_drop(shape_no, xpos, ypos, rot)) { X print_shape(shape_no, xpos + NORM_OFFSET, ypos, rot, WHITE); X ypos++; X print_shape(shape_no, xpos + NORM_OFFSET, ypos, rot, shape[shape_no].color); X } X} X X/* Drawing primitives X */ Xdraw_shadow(shape_no, xpos, ypos, rot, col) X int shape_no, xpos, ypos, rot, col; X{ X int y1; X int x1, x2, x3, x4; X int t0, t1, t2, t3; X X t0 = shape[shape_no].table[0][rot]; /* Bit map of 1st Row */ X t1 = shape[shape_no].table[1][rot]; /* Bit map of 2nd Row */ X t2 = shape[shape_no].table[2][rot]; /* Bit map of 3rd Row */ X t3 = shape[shape_no].table[3][rot]; /* Bit map of 4th Row */ X X x1 = xpos; /* Position of 1st column of block grid */ X x2 = x1+1; /* Position of 2nd column of block grid */ X x3 = x2+1; /* Position of 3rd column of block grid */ X x4 = x3+1; /* Position of 4th column of block grid */ X X y1 = UHEIGHT; X X setpixels(NORM_OFFSET, y1, UWIDTH, 1, BOTTOM); X if (t0 & 8 || t1 & 8 || t2 & 8 || t3 & 8) X set1pixel(x1, y1, SHADOW); X if (t0 & 4 || t1 & 4 || t2 & 4 || t3 & 4) X set1pixel(x2, y1, SHADOW); X if (t0 & 2 || t1 & 2 || t2 & 2 || t3 & 2) X set1pixel(x3, y1, SHADOW); X if (t0 & 1 || t1 & 1 || t2 & 1 || t3 & 1) X set1pixel(x4, y1, SHADOW); X} X Xshow_next(on) X{ X int y; X X y = 1; X setpixels(0, y , UWIDTH, NEXT_HEIGHT - 1, WHITE); X if ( on ) { X wtext(0, y , " N e x t : ", 0); X print_shape(next_no, 6, y, next_rot, shape[next_no].color); X } X} X Xprint_shape(shape_no, x, y, rot, col) X int shape_no, x, y, rot, col; X{ X int x1, x2, x3, x4, y1; X int t0, t1, t2, t3; X X t0 = shape[shape_no].table[0][rot]; /* Bit map of 1st Row */ X t1 = shape[shape_no].table[1][rot]; /* Bit map of 2nd Row */ X t2 = shape[shape_no].table[2][rot]; /* Bit map of 3rd Row */ X t3 = shape[shape_no].table[3][rot]; /* Bit map of 4th Row */ X X x1 = x; /* Position of 1st column of block grid */ X x2 = x1 + 1; /* Position of 2nd column of block grid */ X x3 = x2 + 1; /* Position of 3rd column of block grid */ X x4 = x3 + 1; /* Position of 4th column of block grid */ X y1 = y; /* Position of 1st row of block grid */ X X if (y > -1) { X if (t0 & 8) X set1pixel(x1, y1, col); X if (t0 & 4) X set1pixel(x2, y1, col); X if (t0 & 2) X set1pixel(x3, y1, col); X if (t0 & 1) X set1pixel(x4, y1, col); X } X y1 += 1; /* Position of next row */ X if (y > -2) { X if (t1 & 8) X set1pixel(x1, y1, col); X if (t1 & 4) X set1pixel(x2, y1, col); X if (t1 & 2) X set1pixel(x3, y1, col); X if (t1 & 1) X set1pixel(x4, y1, col); X } X y1 += 1; /* Position of next row */ X if (y > -3) { X if (t2 & 8) X set1pixel(x1, y1, col); X if (t2 & 4) X set1pixel(x2, y1, col); X if (t2 & 2) X set1pixel(x3, y1, col); X if (t2 & 1) X set1pixel(x4, y1, col); X } X y1 += 1; /* Position of next row */ X if (y > -4) { X if (t3 & 8) X set1pixel(x1, y1, col); X if (t3 & 4) X set1pixel(x2, y1, col); X if (t3 & 2) X set1pixel(x3, y1, col); X if (t3 & 1) X set1pixel(x4, y1, col); X } X} X X/* Term routines X */ X Xwtext(x,y,text,bold) Xchar *text; X{ X scmove(x,y); X if ( bold ) { X standout(); X addstr(text); X standend(); X } else X addstr(text); X} X Xstatic setpixels(x,y,xsize,ysize,col) X{ X int yy; X int xx; X X for ( yy=y; yy < y+ysize; yy++ ) { X for ( xx=x; xx < x+xsize; xx++ ) { X set1pixel(xx,yy,col); X } X } X} X Xstatic int set1pixel(x,y,col) { X scmove(x,y); X switch ( col ) { X case WHITE : X addstr(" "); X break; X case RSIDE : X addstr("||"); X break; X case LSIDE : X addstr("||"); X break; X case BOTTOM : X addstr("--"); X break; X case ULCORN : X case BLCORN : X addstr("+-"); X break; X case URCORN : X case BRCORN : X addstr("-+"); X break; X case SHADOW : X addstr("=="); X break; X default : X standout(); X addstr(blostr); X standend(); X break; X } X} X Xscinsert(y) X{ X scmove(0,y); X insertln(); X set1pixel(NORM_OFFSET-1, 0, LSIDE); X set1pixel(NORM_OFFSET+UWIDTH, 0, RSIDE); X} X Xscdelete(y) X{ X show_score(0); X show_next(0); X scmove(0,y); X deleteln(); X} X Xstatic scmove(x,y) X{ X move(y*VUNIT,x*HUNIT); X} X Xstatic int scbeep() { X int c = 7; X X if ( beep ) { X refresh(); X write(2,&c,1); X } X} X END_OF_FILE if test 12065 -ne `wc -c <'main.c'`; then echo shar: \"'main.c'\" unpacked with wrong size! fi # end of 'main.c' fi if test -f 'polluser.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'polluser.c'\" else echo shar: Extracting \"'polluser.c'\" \(1643 characters\) sed "s/^X//" >'polluser.c' <<'END_OF_FILE' X X#include <termio.h> X#include <fcntl.h> X#include <sys/param.h> X#include <sys/types.h> X X#ifndef USENAP X#ifdef USEPOLL X#include <sys/poll.h> X#else X#define USETIMES 1 X#include <sys/times.h> X#endif X#endif X Xstatic struct termio orig; X X#ifdef DONTHOG Xstatic char timings[] = { 30, 20, 20, 20, 10, 10 }; X#else Xstatic char timings[] = { 30, 25, 20, 15, 10, 8 }; X#endif Xstatic int currtim; X Xsetuptty() { X struct termio tt; X static int getdone = 0; X X if ( !getdone ) { X ioctl(0,TCGETA,&orig); X getdone = 1; X } X memcpy( (char*)&tt, (char*)&orig, sizeof(orig) ); X tt.c_cc[VMIN] = 0; X tt.c_cc[VTIME] = 1; X ioctl(0,TCSETA,&tt); X} X Xcloseuptty() { X ioctl(0,TCSETA,&orig); X} X Xsetlevel(level) X{ X if ( level >= sizeof(timings) ) X level = sizeof(timings) - 1; X currtim = timings[level]; X} X Xpolluser(buf,sizebuf) Xchar *buf; Xint sizebuf; X{ X static int timeleft = 0; X int nc; X X if ( timeleft <= 0 ) X timeleft = currtim; X if ( timeleft < 10 ) { X wait_ms(timeleft*10); X fcntl(0,F_SETFL,O_NDELAY); X nc = read(0,buf,sizebuf); X fcntl(0,F_SETFL,0); X timeleft = 0; X } else { X#ifdef USETIMES X nc = read(0,buf,sizebuf); X#else X wait_ms(100); X fcntl(0,F_SETFL,O_NDELAY); X nc = read(0,buf,sizebuf); X fcntl(0,F_SETFL,0); X#endif X timeleft -= 10; X } X if ( timeleft <= 0 ) X buf[nc++] = 0; /* not an eos but the signal to drop */ X return nc; X} X Xstatic wait_ms( msecs ) X{ X#ifdef USETIMES X register time_t etime; X long times(); X struct tms junk; X X etime = times(&junk) + ((HZ * msecs) + 999) / 1000; X while ( times(&junk) <= etime ) X ; X#endif X#ifdef USEPOLL X poll( (struct pollfd *)0, 0L, msecs ); X#endif X#ifdef USENAP X nap( ((HZ * msecs) + 999) / 1000 ) ; X#endif X} END_OF_FILE if test 1643 -ne `wc -c <'polluser.c'`; then echo shar: \"'polluser.c'\" unpacked with wrong size! fi # end of 'polluser.c' fi if test -f 'score.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'score.c'\" else echo shar: Extracting \"'score.c'\" \(5638 characters\) sed "s/^X//" >'score.c' <<'END_OF_FILE' X#include "defs.h" X#include <curses.h> X#include <sys/utsname.h> X X#define HIGH_SCORE_TABLE "/usr/games/lib/Tetris_scores" X X#define HIGH_TABLE_SIZE 10 X Xstatic struct score_table { X char name[BUFSIZ]; X int score; X int rows; X int level; X char hostname[BUFSIZ]; X char date[BUFSIZ]; X} high_scores[HIGH_TABLE_SIZE]; X Xupdate_highscore_table() X{ X int i, j; X long when; X extern char *ctime(); X extern long time(); X char buf[BUFSIZ]; X struct utsname utsname; X X /* re-read high-score table in case someone else on the network is X * playing at the same time */ X read_high_scores(); X X /* Next line finds score greater than current one */ X for (i = 0; ((i < HIGH_TABLE_SIZE) && (score >= high_scores[i].score)); i++); X i--; X score_position = i; X if (i >= 0) { X for (j = 0; j < i; j++) X high_scores[j] = high_scores[j + 1]; X strcpy(high_scores[i].name, name); X high_scores[i].score = score; X high_scores[i].rows = rows; X high_scores[i].level = rows / 10; X if ( uname(&utsname) < 0 ) X strcpy(high_scores[i].hostname, "unknown-host"); X else X strcpy(high_scores[i].hostname, utsname.nodename); X time(&when); X strcpy(buf, ctime(&when)); /* ctime() adds a newline X * char */ X strip_eoln(buf);/* so remove it */ X strcpy(high_scores[i].date, buf); X write_high_scores(); X } X} X Xread_high_scores() X{ X FILE *fp; X int i; X char buf[BUFSIZ]; X X for (i = 0; i < HIGH_TABLE_SIZE; i++) { X strcpy(high_scores[i].name, " "); X high_scores[i].score = 0; X high_scores[i].rows = 0; X high_scores[i].level = 0; X strcpy(high_scores[i].hostname, " "); X strcpy(high_scores[i].date, " "); X } X if ((fp = fopen(HIGH_SCORE_TABLE, "r")) == NULL) { X fprintf(stderr, "tetris: No High score file\n"); X return; X } X for (i = 0; i < HIGH_TABLE_SIZE; i++) { X fgets(buf, BUFSIZ, fp); X strip_eoln(buf); X strcpy(high_scores[i].name, buf); X fgets(buf, BUFSIZ, fp); X strip_eoln(buf); X high_scores[i].score = atoi(buf); X fgets(buf, BUFSIZ, fp); X strip_eoln(buf); X high_scores[i].rows = atoi(buf); X fgets(buf, BUFSIZ, fp); X strip_eoln(buf); X high_scores[i].level = atoi(buf); X fgets(buf, BUFSIZ, fp); X strip_eoln(buf); X strcpy(high_scores[i].hostname, buf); X fgets(buf, BUFSIZ, fp); X strip_eoln(buf); X strcpy(high_scores[i].date, buf); X } X fclose(fp); X} X Xstrip_eoln(s) X char *s; X{ X char *s1; X X while (*s != '\0') { X if (*s == '\n') { /* End of line char */ X s1 = s; X do { X *s1 = *(s1 + 1); /* Copy rest of string */ X s1++; X } while (*s1 != '\0'); X } else X s++; X } X} X Xwrite_high_scores() X{ X FILE *fp; X int i; X X if ((fp = fopen(HIGH_SCORE_TABLE, "w")) == NULL) { X fprintf(stderr, "tetris: Couldn't open high score file %s\n", HIGH_SCORE_TABLE); X return; X } X for (i = 0; i < HIGH_TABLE_SIZE; i++) X fprintf(fp, "%s\n%d\n%d\n%d\n%s\n%s\n", X high_scores[i].name, X high_scores[i].score, X high_scores[i].rows, X high_scores[i].level, X high_scores[i].hostname, X high_scores[i].date); X fclose(fp); X} X Xvoid print_high_scores() X{ X int i; X char buf[BUFSIZ]; X X /* re-read high-score table in case someone else on the network is X * playing at the same time */ X read_high_scores(); X X clear(); X wtext(10,1,"T e t r i s H i g h e s t r e s u l t s", 0); X X wtext(4,3,"Pos Name Score Rows Lev When", 0); X wtext(4,4,"=== ==== ===== ==== === ====", 0); X for ( i = 0; i < HIGH_TABLE_SIZE; i++ ) { X sprintf(buf, "%3d) %-15s %6d %5d %3d %s\n", X HIGH_TABLE_SIZE - i, X high_scores[i].name, X high_scores[i].score, X high_scores[i].rows, X high_scores[i].level, X high_scores[i].date); X wtext(4,14-i,buf, score_position == i); X } X} X Xprint_authors() X{ X int i; X static char *au[] = { X"\n", X" Tetris Version 1.0\n\n", X"This version of tetris was modified to run on ascii terminals by:\n", X" Roberto Biancardi <..!unido!tmpmbx!deejay!i2ack!usixth!bob>\n", X"Based on the version posted by Phill Everson <everson@cs.bris.ac.uk>\n", X"and Martyn Shortley <shortley@cs.bris.ac.uk>, based on the version posted\n", X"to comp.sources.games by Adam Marguilies <vespa@ssyx.ucsc.edu>\n", X"\n", X"Wed Jun 21 22:35:52 ITA 1989\n", XNULL X}; X X for ( i=0; au[i] != NULL; i++ ) X write(1,au[i],strlen(au[i])); X sleep(2); X} END_OF_FILE if test 5638 -ne `wc -c <'score.c'`; then echo shar: \"'score.c'\" unpacked with wrong size! fi # end of 'score.c' fi if test -f 'shape.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'shape.c'\" else echo shar: Extracting \"'shape.c'\" \(7330 characters\) sed "s/^X//" >'shape.c' <<'END_OF_FILE' X#include "defs.h" X Xvoid define_shapes() X{ X X /* begin shape 0 definition, four rotations */ X X shape[0].table[0][0] = 0; X shape[0].table[1][0] = 15; /* #### */ X shape[0].table[2][0] = 0; X shape[0].table[3][0] = 0; X shape[0].pointv[0] = 5; X X shape[0].table[0][1] = 4; /* # */ X shape[0].table[1][1] = 4; /* # */ X shape[0].table[2][1] = 4; /* # */ X shape[0].table[3][1] = 4; /* # */ X shape[0].pointv[1] = 8; X X shape[0].table[0][2] = 0; X shape[0].table[1][2] = 15; /* #### */ X shape[0].table[2][2] = 0; X shape[0].table[3][2] = 0; X shape[0].pointv[2] = 5; X X shape[0].table[0][3] = 4; /* # */ X shape[0].table[1][3] = 4; /* # */ X shape[0].table[2][3] = 4; /* # */ X shape[0].table[3][3] = 4; /* # */ X shape[0].pointv[2] = 8; X X shape[0].width = 4; X shape[0].height = 1; X shape[0].offset = 153; X shape[0].color = RED; X X /* begin shape 1 definition, four rotations */ X X shape[1].table[0][0] = 12; /* ## */ X shape[1].table[1][0] = 12; /* ## */ X shape[1].table[2][0] = 0; /* */ X shape[1].table[3][0] = 0; /* */ X shape[1].pointv[0] = 6; X X shape[1].table[0][1] = 12; /* ## */ X shape[1].table[1][1] = 12; /* ## */ X shape[1].table[2][1] = 0; /* */ X shape[1].table[3][1] = 0; /* */ X shape[1].pointv[1] = 6; X X shape[1].table[0][2] = 12; /* ## */ X shape[1].table[1][2] = 12; /* ## */ X shape[1].table[2][2] = 0; /* */ X shape[1].table[3][2] = 0; /* */ X shape[1].pointv[2] = 6; X X shape[1].table[0][3] = 12; /* ## */ X shape[1].table[1][3] = 12; /* ## */ X shape[1].table[2][3] = 0; /* */ X shape[1].table[3][3] = 0; /* */ X shape[1].pointv[3] = 6; X X shape[1].width = 2; X shape[1].height = 2; X shape[1].offset = 0; X shape[1].color = ORANGE; X X /* begin shape 2 definition, four rotations */ X X shape[2].table[0][0] = 4; /* # */ X shape[2].table[1][0] = 14; /* ### */ X shape[2].table[2][0] = 0; /* */ X shape[2].table[3][0] = 0; /* */ X shape[2].pointv[0] = 5; X X shape[2].table[0][1] = 4; /* # */ X shape[2].table[1][1] = 6; /* ## */ X shape[2].table[2][1] = 4; /* # */ X shape[2].table[3][1] = 0; /* */ X shape[2].pointv[0] = 5; X X shape[2].table[0][2] = 0; /* */ X shape[2].table[1][2] = 14; /* ### */ X shape[2].table[2][2] = 4; /* # */ X shape[2].table[3][2] = 0; /* */ X shape[2].pointv[2] = 6; X X shape[2].table[0][3] = 4; /* # */ X shape[2].table[1][3] = 12; /* ## */ X shape[2].table[2][3] = 4; /* # */ X shape[2].table[3][3] = 0; /* */ X shape[2].pointv[3] = 5; X X shape[2].width = 3; X shape[2].height = 2; X shape[2].offset = 24; X shape[2].color = YELLOW; X X /* begin shape 3 definition, four rotations */ X X shape[3].table[0][0] = 12; /* ## */ X shape[3].table[1][0] = 6; /* ## */ X shape[3].table[2][0] = 0; /* */ X shape[3].table[3][0] = 0; /* */ X shape[3].pointv[0] = 6; X X shape[3].table[0][1] = 4; /* # */ X shape[3].table[1][1] = 12; /* ## */ X shape[3].table[2][1] = 8; /* # */ X shape[3].table[3][1] = 0; /* */ X shape[3].pointv[1] = 7; X X shape[3].table[0][2] = 12; /* ## */ X shape[3].table[1][2] = 6; /* ## */ X shape[3].table[2][2] = 0; /* */ X shape[3].table[3][2] = 0; /* */ X shape[3].pointv[2] = 6; X X shape[3].table[0][3] = 4; /* # */ X shape[3].table[1][3] = 12; /* ## */ X shape[3].table[2][3] = 8; /* # */ X shape[3].table[3][3] = 0; /* */ X shape[3].pointv[3] = 7; X X shape[3].width = 3; X shape[3].height = 2; X shape[3].offset = 0; X shape[3].color = GREEN; X X /* begin shape 4 definition, four rotations */ X X shape[4].table[0][0] = 6; /* ## */ X shape[4].table[1][0] = 12; /* ## */ X shape[4].table[2][0] = 0; /* */ X shape[4].table[3][0] = 0; /* */ X shape[4].pointv[0] = 6; X X shape[4].table[0][1] = 8; /* # */ X shape[4].table[1][1] = 12; /* ## */ X shape[4].table[2][1] = 4; /* # */ X shape[4].table[3][1] = 0; /* */ X shape[4].pointv[1] = 7; X X shape[4].table[0][2] = 6; /* ## */ X shape[4].table[1][2] = 12; /* ## */ X shape[4].table[2][2] = 0; /* */ X shape[4].table[3][2] = 0; /* */ X shape[4].pointv[2] = 6; X X shape[4].table[0][3] = 8; /* # */ X shape[4].table[1][3] = 12; /* ## */ X shape[4].table[2][3] = 4; /* # */ X shape[4].table[3][3] = 0; /* */ X shape[4].pointv[3] = 7; X X shape[4].width = 3; X shape[4].height = 2; X shape[4].offset = 0; X shape[4].color = BLUE; X X /* begin shape 5 definition, four rotations */ X X shape[5].table[0][0] = 2; /* # */ X shape[5].table[1][0] = 14; /* ### */ X shape[5].table[2][0] = 0; /* */ X shape[5].table[3][0] = 0; /* */ X shape[5].pointv[0] = 6; X X shape[5].table[0][1] = 8; /* # */ X shape[5].table[1][1] = 8; /* # */ X shape[5].table[2][1] = 12; /* ## */ X shape[5].table[3][1] = 0; /* */ X shape[5].pointv[1] = 7; X X shape[5].table[0][2] = 14; /* ### */ X shape[5].table[1][2] = 8; /* # */ X shape[5].table[2][2] = 0; /* */ X shape[5].table[3][2] = 0; /* */ X shape[5].pointv[2] = 6; X X shape[5].table[0][3] = 12; /* ## */ X shape[5].table[1][3] = 4; /* # */ X shape[5].table[2][3] = 4; /* # */ X shape[5].table[3][3] = 0; /* */ X shape[5].pointv[3] = 7; X X shape[5].width = 3; X shape[5].height = 2; X shape[5].offset = 0; X shape[5].color = CYAN; X X /* begin shape 6 definition, four rotations */ X X shape[6].table[0][0] = 14; /* ### */ X shape[6].table[1][0] = 2; /* # */ X shape[6].table[2][0] = 0; /* */ X shape[6].table[3][0] = 0; /* */ X shape[6].pointv[0] = 6; X X shape[6].table[0][1] = 4; /* # */ X shape[6].table[1][1] = 4; /* # */ X shape[6].table[2][1] = 12; /* ## */ X shape[6].table[3][1] = 0; /* */ X shape[6].pointv[1] = 7; X X shape[6].table[0][2] = 8; /* # */ X shape[6].table[1][2] = 14; /* ### */ X shape[6].table[2][2] = 0; /* */ X shape[6].table[3][2] = 0; /* */ X shape[6].pointv[2] = 6; X X shape[6].table[0][3] = 12; /* ## */ X shape[6].table[1][3] = 8; /* # */ X shape[6].table[2][3] = 8; /* # */ X shape[6].table[3][3] = 0; /* */ X shape[6].pointv[3] = 7; X X shape[6].width = 3; X shape[6].height = 2; X shape[6].offset = 0; X shape[6].color = VIOLET; X} X Xstore_shape(shape_no, xpos, ypos, rot) X int shape_no, xpos, ypos, rot; X{ X int i; X X for (i = 0; i < 4; i++) { X if (shape[shape_no].table[i][rot] & 8) X grid[xpos][ypos + i] = 1; X if (shape[shape_no].table[i][rot] & 4) X grid[xpos + 1][ypos + i] = 1; X if (shape[shape_no].table[i][rot] & 2) X grid[xpos + 2][ypos + i] = 1; X if (shape[shape_no].table[i][rot] & 1) X grid[xpos + 3][ypos + i] = 1; X } X} X Xcreate_shape() X{ X shape_no = next_no; X rot = next_rot; X next_no = rand() % 7; X next_rot = rand() % 4; X xpos = (UWIDTH / 2) - 1; X ypos = -4; X} X END_OF_FILE if test 7330 -ne `wc -c <'shape.c'`; then echo shar: \"'shape.c'\" unpacked with wrong size! fi # end of 'shape.c' fi if test -f 'support.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'support.c'\" else echo shar: Extracting \"'support.c'\" \(6362 characters\) sed "s/^X//" >'support.c' <<'END_OF_FILE' X#include "defs.h" X Xblock_can_drop(shape_no, xpos, ypos, rot) X int shape_no, xpos, ypos, rot; X{ X int y1, c; X X c = 3; X X while ((c >= 0) && ((shape[shape_no].table[c][rot] & 8) == 0)) X c--; X y1 = ypos + c + 1; X if ((c != -1) && (y1 >= 0)) X if ((y1 == UHEIGHT) || (grid[xpos][y1] != 0)) X return (0); X X c = 3; X while ((c >= 0) && ((shape[shape_no].table[c][rot] & 4) == 0)) X c--; X y1 = ypos + c + 1; X if ((c != -1) && (y1 >= 0)) X if ((y1 == UHEIGHT) || (grid[xpos + 1][y1] != 0)) X return (0); X X c = 3; X while ((c >= 0) && ((shape[shape_no].table[c][rot] & 2) == 0)) X c--; X y1 = ypos + c + 1; X if ((c != -1) && (y1 >= 0)) X if ((y1 == UHEIGHT) || (grid[xpos + 2][y1] != 0)) X return (0); X X c = 3; X while ((c >= 0) && ((shape[shape_no].table[c][rot] & 1) == 0)) X c--; X y1 = ypos + c + 1; X if ((c != -1) && (y1 >= 0)) X if ((y1 == UHEIGHT) || (grid[xpos + 3][y1] != 0)) X return (0); X X return 1; X} X Xblock_can_left(shape_no, xpos, ypos, rot) X int shape_no, xpos, ypos, rot; X{ X int x1, c; X int y0, y1, y2, y3; X int t0, t1, t2, t3; X X t0 = shape[shape_no].table[0][rot]; /* Bit map of 1st Row */ X t1 = shape[shape_no].table[1][rot]; /* Bit map of 2nd Row */ X t2 = shape[shape_no].table[2][rot]; /* Bit map of 3rd Row */ X t3 = shape[shape_no].table[3][rot]; /* Bit map of 4th Row */ X X y0 = ypos; X y1 = ypos + 1; X y2 = ypos + 2; X y3 = ypos + 3; X X c = 3; X while ((c >= 0) && ((t0 & (1 << c)) == 0)) X c--; X x1 = xpos - 1 + (3 - c); X if (c != -1) X if ((x1 < 0) || ((y0 >= 0) && (grid[x1][y0] != 0))) X return (0); X X c = 3; X while ((c >= 0) && ((t1 & (1 << c)) == 0)) X c--; X x1 = xpos - 1 + (3 - c); X if (c != -1) X if ((x1 < 0) || ((y1 >= 0) && (grid[x1][y1] != 0))) X return (0); X X c = 3; X while ((c >= 0) && ((t2 & (1 << c)) == 0)) X c--; X x1 = xpos - 1 + (3 - c); X if (c != -1) X if ((x1 < 0) || ((y2 >= 0) && (grid[x1][y2] != 0))) X return (0); X X c = 3; X while ((c >= 0) && ((t3 & (1 << c)) == 0)) X c--; X x1 = xpos - 1 + (3 - c); X if (c != -1) X if ((x1 < 0) || ((y3 >= 0) && (grid[x1][y3] != 0))) X return (0); X X return 1; X} X Xblock_can_right(shape_no, xpos, ypos, rot) X int shape_no, xpos, ypos, rot; X{ X int x1, c; X int y0, y1, y2, y3; X int t0, t1, t2, t3; X X t0 = shape[shape_no].table[0][rot]; /* Bit map of 1st Row */ X t1 = shape[shape_no].table[1][rot]; /* Bit map of 2nd Row */ X t2 = shape[shape_no].table[2][rot]; /* Bit map of 3rd Row */ X t3 = shape[shape_no].table[3][rot]; /* Bit map of 4th Row */ X X y0 = ypos; X y1 = ypos + 1; X y2 = ypos + 2; X y3 = ypos + 3; X X c = 0; X while ((c < 4) && ((t0 & (1 << c)) == 0)) X c++; X x1 = xpos + 1 + (3 - c); X if ((c != 4) && (x1 >= 0)) X if ((x1 == UWIDTH) || ((y0 >= 0) && (grid[x1][y0] != 0))) X return (0); X X c = 0; X while ((c < 4) && ((t1 & (1 << c)) == 0)) X c++; X x1 = xpos + 1 + (3 - c); X if ((c != 4) && (x1 >= 0)) X if ((x1 == UWIDTH) || ((y1 >= 0) && (grid[x1][y1] != 0))) X return (0); X X c = 0; X while ((c < 4) && ((t2 & (1 << c)) == 0)) X c++; X x1 = xpos + 1 + (3 - c); X if ((c != 4) && (x1 >= 0)) X if ((x1 == UWIDTH) || ((y2 >= 0) && (grid[x1][y2] != 0))) X return (0); X X c = 0; X while ((c < 4) && ((t3 & (1 << c)) == 0)) X c++; X x1 = xpos + 1 + (3 - c); X if ((c != 4) && (x1 >= 0)) X if ((x1 == UWIDTH) || ((y3 >= 0) && (grid[x1][y3] != 0))) X return (0); X X return 1; X} X Xremove_full_lines(y) X int y; X{ X int y1, y2, x; X X for (y1 = y; y1 < y + 4 && y1 < UHEIGHT; y1++) { X for (x = 0; x < UWIDTH; x++) X if (grid[x][y1] == 0) X break; X if ( x == UWIDTH ) { X for (y2 = y1; y2 > 0; y2--) X for (x = 0; x < UWIDTH; x++) X grid[x][y2] = grid[x][y2 - 1]; X for (x = 0; x < UWIDTH; x++) X grid[x][0] = 0; X scdelete(y1); X scinsert(0); X rows++; X } X } X} X Xcheck_rot(shape_no, xpos, ypos, newrot) X int shape_no, xpos, ypos, newrot; X{ X int i; X int ti; /* Bit map of i'th row */ X int yi; /* Y position on i'th row */ X int x0, x1, x2, x3; X X x0 = xpos; X x1 = xpos + 1; X x2 = xpos + 2; X x3 = xpos + 3; X yi = ypos; X X for (i = 0; i < 4; yi++, i++) { X if ((yi) >= 0) { X ti = shape[shape_no].table[i][newrot]; X if (ti & 8) X if ((x0 < 0) || (x0 >= UWIDTH) || (grid[x0][yi] == 1)) X return 0; X if (ti & 4) X if ((x1 < 0) || (x1 >= UWIDTH) || (grid[x1][yi] == 1)) X return 0; X if (ti & 2) X if ((x2 < 0) || (x2 >= UWIDTH) || (grid[x2][yi] == 1)) X return 0; X if (ti & 1) X if ((x3 < 0) || (x3 >= UWIDTH) || (grid[x3][yi] == 1)) X return 0; X } X } X return 1; X} END_OF_FILE if test 6362 -ne `wc -c <'support.c'`; then echo shar: \"'support.c'\" unpacked with wrong size! fi # end of 'support.c' fi if test -f 'tetris.6' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'tetris.6'\" else echo shar: Extracting \"'tetris.6'\" \(1537 characters\) sed "s/^X//" >'tetris.6' <<'END_OF_FILE' X.TH TETRIS 6 "Jun 21 ITA 1989" X.SH NAME Xtetris \- block dropping game X.SH SYNOPSIS X.B tetris X[ X.B \-s X] X[ X.B \-l<level> X] X[ X.B \-b<blochar> X] X.SH DESCRIPTION X.I Tetris Xis a game involving dropping blocks. As they drop you can move them to Xthe left or to the right using '7' and '9' respectively. X XPressing the '8' key causes the falling shape to rotate anti-clockwise. XPressing the space bar causes the shape to quickly drop. X XPressing the '*' key causes the shape to rotate Xclockwise. XPressing the 'q' or 'Q' key causes Tetris to exit immediately. X.PP XPoints are scored for each block that comes to rest on the gradually Xbuilding up pile of blocks. Different blocks in different orientations Xhave different point values. When the pile reaches the top of the Xscreen and no further blocks can be dropped the game ends. Whenever a Xfull row of blocks across the screen is all completely filled in that Xrow is removed and all the blocks above it drop down a further row. XAs more rows are deleted the blocks drop faster. X.PP XA high score table is kept which is retained between separate executions Xof the game. X.SH OPTIONS X.I Tetris Xtakes the X.B \-s Xoption to suppress the sound beep which may be executed Xslowly on strange videoterminal thus causing blocks to stop for Xa while. X XThe X.B \-l<level> Xoption will make Tetris start each game at level <level>. X X.B \-b<blochar> Xis to change the character used to draw blocks. Use X.B \-b# Xif your tty does not support inverse video. X.SH FILES X.PP X/usr/games/lib/Tetris_scores : Top 10 high scores. END_OF_FILE if test 1537 -ne `wc -c <'tetris.6'`; then echo shar: \"'tetris.6'\" unpacked with wrong size! fi # end of 'tetris.6' fi echo shar: End of archive 1 \(of 1\). cp /dev/null ark1isdone MISSING="" for I in 1 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have the archive. rm -f ark[1-9]isdone else echo You still need to unpack the following archives: echo " " ${MISSING} fi ## End of shell archive. exit 0