DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: T d

⟦1f7770878⟧ TextFile

    Length: 2848 (0xb20)
    Types: TextFile
    Names: »drop_block.c«

Derivation

└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
    └─⟦this⟧ »EUUGD18/General/Tetris/drop_block.c« 

TextFile

/*
** 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: drop_block()                                                 */
/*                                                                      */
/* This function calls check_block() to make sure that the block        */
/* can drop down the screen. If so it increments the current y          */
/* position and calls print_shape() with a "color" of ' '. This         */
/* erases the shape. If the player has not requested                    */
/* a "fast drop" or the block has reached the bottom then the           */
/* function draws the shape with a call to print_shape() and returns.   */
/*                                                                      */
/* If check_block() shows that the shape has been blocked then it gets  */
/* trickier. If the current y position is too high then the game is     */
/* over (i.e. the player has not successfully negotiated the block      */
/* past the top of the screen). A call to score() updates the score     */
/* and a call to end_game() terminates the program.                     */
/*                                                                        */
/* If the above is false then the program knows that the block has      */
/* successfully come to rest. The call to score() is made to record     */
/* the score and check_horiz() is called to clear any complete horiz    */
/* lines then setup_next() is called to ready the next block.           */
#include "tetris.h"
#include <sys/ioctl.h>

void drop_block()
{
    void end_game(), check_horiz();
	int num_char_pend;

	ioctl(1, TIOCOUTQ, &num_char_pend); /* this checks the number of characters
										   pending on the terminal */

	if (num_char_pend != 0)
		return;

    if (check_block()) {
        cury++;
        print_shape(current->shape, curx, cury-1, current->rot, ' ');
        if (!fast_drop || (cury + current->height == 22)) 
            print_shape(current->shape, curx, cury, current->rot,
                            current->color);
    }
    else {
        if (cury < 2) {
            if (fast_drop)
                print_shape(current->shape, curx, cury, current->rot,
                            current->color);
            score(cury + current->height - 1);
            end_game();
        }
        else {
            if (fast_drop)
                print_shape(current->shape, curx, cury, current->rot,
                            current->color);
            score(cury + current->height - 1);
            check_horiz();
            setup_next();
        }
    }

}