This patch is not required to compile/run golddig. Its only purpose is to improve the game (IMHO) --jmz *** golddig.c~ Thu Dec 14 20:41:03 1989 --- golddig.c Sun Nov 20 01:23:40 1994 *************** *** 29,34 **** --- 29,38 ---- #define EVMASK KeyPressMask | ExposureMask | ButtonPressMask | FocusChangeMask + int x_lives, x_initial_score; + #define TURBO 15 + int x_turbo = TURBO; + int newlevel = 0; /* Non-zero if a new level was just drawn */ struct itimerval cycletime; /* Structure used when setting up timer */ /* These are the graphics cursors used for drawing the player at */ *************** *** 167,177 **** puts("z,<,q,u,R13 - make hole left"); puts("x,>,e,o,R15 - make hole right"); puts("r,y,R7 - put down any held item"); ! puts("1-9 - change the game speed"); puts("\n^S,^Z - pause the game"); puts("^Q,^Y - reactivate the game"); puts("^C - kill the game"); puts("^R - redraw the screen"); break; /* A space bar changes the command to STAND */ case XK_space: case XK_R11: --- 171,182 ---- puts("z,<,q,u,R13 - make hole left"); puts("x,>,e,o,R15 - make hole right"); puts("r,y,R7 - put down any held item"); ! puts("0-9 - change the game speed (0 is *very* fast)"); puts("\n^S,^Z - pause the game"); puts("^Q,^Y - reactivate the game"); puts("^C - kill the game"); puts("^R - redraw the screen"); + puts("^A - restart the level"); break; /* A space bar changes the command to STAND */ case XK_space: case XK_R11: *************** *** 251,256 **** --- 256,262 ---- regen_tree(); /* Freeze action until a key is pressed */ newlevel = 1; + x_initial_score = score; } /* Move player one movement */ *************** *** 299,304 **** --- 305,311 ---- ((code & UPLEVEL) && ! (code & INACTIVE))) { /* Increment the level number */ levelnum ++; + x_lives++; /* Load the next level in if the current one is done */ init_level(); /* Redraw the level */ *************** *** 309,316 **** return; } /* If the block is a killer block, kill the player */ ! if(code & KILLIN) died("was crushed"); } /* Do not let PUTDOWN order stay after movement has started */ else if(curorder == PUTDOWN) --- 316,332 ---- return; } /* If the block is a killer block, kill the player */ ! if(code & KILLIN) { ! if(--x_lives) { /* restart level */ ! goldleft = 0; player.ypos = 0; code |= UPLEVEL; code |= INACTIVE; ! score = x_initial_score; ! init_level(); ! redrawall(); ! XFlush(disp); ! return; ! } died("was crushed"); + } } /* Do not let PUTDOWN order stay after movement has started */ else if(curorder == PUTDOWN) *************** *** 350,357 **** /* Check if the player is overlapping one of the bad guys while not */ /* holding armor. */ if(! (fast_lookup[player.hold].code & ARMOR) && ! overlap_badguy(player.xpos,player.ypos,-1)) died("was eaten"); /* Redraw player if he moved. Redraw occasionally anyway. */ if(player.xpos != player.xold || player.ypos != player.yold || (curtick & 0xf) == 0) --- 366,382 ---- /* Check if the player is overlapping one of the bad guys while not */ /* holding armor. */ if(! (fast_lookup[player.hold].code & ARMOR) && ! overlap_badguy(player.xpos,player.ypos,-1)) { ! if(--x_lives) { /* restart level */ ! goldleft = 0; player.ypos = 0; ! score = x_initial_score; ! init_level(); ! redrawall(); ! XFlush(disp); ! return; ! } died("was eaten"); + } /* Redraw player if he moved. Redraw occasionally anyway. */ if(player.xpos != player.xold || player.ypos != player.yold || (curtick & 0xf) == 0) *************** *** 422,428 **** sscanf(argv[i]+2,"%d",&speed); } else { ! printf("usage: golddig [-l ] [-s ] []\n"); exit(1); } } --- 447,453 ---- sscanf(argv[i]+2,"%d",&speed); } else { ! printf("usage: golddig [-l ] [-s ] []\n"); exit(1); } } *************** *** 434,440 **** } /* remember what the starting level was */ levelstart = levelnum; ! /* start up x windows and all graphics cursors for drawing level */ xstart(EVMASK); /* reassemble the graphics cursors to prepare for actual play */ --- 459,467 ---- } /* remember what the starting level was */ levelstart = levelnum; ! x_lives = 6 - levelnum; ! if (x_lives < 1) ! x_lives = 1; /* start up x windows and all graphics cursors for drawing level */ xstart(EVMASK); /* reassemble the graphics cursors to prepare for actual play */ *************** *** 467,475 **** init_level(); /* initialize timer structure according to speed */ ! if(speed <= 0) speed = 1; ! if(speed <= 5) cycletime.it_interval.tv_usec = (5-speed) * 50000 + 125000; else cycletime.it_interval.tv_usec = 625000 / speed; --- 494,504 ---- init_level(); /* initialize timer structure according to speed */ ! if(speed < 0) speed = 1; ! if(speed == 0) ! cycletime.it_interval.tv_usec = 625000 / x_turbo; ! else if(speed <= 5) cycletime.it_interval.tv_usec = (5-speed) * 50000 + 125000; else cycletime.it_interval.tv_usec = 625000 / speed; *************** *** 517,528 **** case XK_R: case XK_r: redrawall(); break; } /* Pressing a number changes the game speed */ ! else if(keyhit >= XK_1 && keyhit <= XK_9) { speed = (int) (keyhit - XK_0); /* Compute new cycle delay */ ! if(speed <= 5) cycletime.it_interval.tv_usec = (5-speed) * 50000 + 125000; else cycletime.it_interval.tv_usec = 625000 / speed; --- 546,569 ---- case XK_R: case XK_r: redrawall(); break; + /* ^A restarts the current level */ + case XK_A: case XK_a: + if(--x_lives) { /* restart level */ + goldleft = 0; player.ypos = 0; + score = x_initial_score; + init_level(); + redrawall(); + } else + died("was abandoned"); + break; } /* Pressing a number changes the game speed */ ! else if(keyhit >= XK_0 && keyhit <= XK_9) { speed = (int) (keyhit - XK_0); /* Compute new cycle delay */ ! if(speed == 0) ! cycletime.it_interval.tv_usec = 625000 / x_turbo; ! else if(speed <= 5) cycletime.it_interval.tv_usec = (5-speed) * 50000 + 125000; else cycletime.it_interval.tv_usec = 625000 / speed; *** shared.c~ Sun Nov 20 00:59:30 1994 --- shared.c Sun Nov 20 01:25:00 1994 *************** *** 279,287 **** void draw_score() { char buf[50]; /* Build the output string */ ! sprintf(buf,"score: %d level: %d speed: %d",score,levelnum,speed); /* Clear the current score line */ XFillRectangle(disp,wind,blackgc,0,ysize << 4,xsize << 4,SCORESIZE); /* Actually draw the text */ --- 279,288 ---- void draw_score() { char buf[50]; + extern int x_lives; /* Build the output string */ ! sprintf(buf,"score: %d level: %d speed: %d lives: %d",score,levelnum,speed,x_lives); /* Clear the current score line */ XFillRectangle(disp,wind,blackgc,0,ysize << 4,xsize << 4,SCORESIZE); /* Actually draw the text */ *** makelev.c~ Thu Dec 14 20:40:34 1989 --- makelev.c Sun Nov 20 01:54:47 1994 *************** *** 1,3 **** --- 1,4 ---- + int x_lives; /* This program was written by Alexander Siegel in September of 1989 */ /* at Cornell University. It may may copied freely for private use or */ /* public dispersion provided that this comment is not removed. This */