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 s

⟦743d56f44⟧ TextFile

    Length: 7000 (0x1b58)
    Types: TextFile
    Names: »support.c«

Derivation

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

TextFile

#include "defs.h"

block_can_drop(shape_no, xpos, ypos, rot)
        int     shape_no, xpos, ypos, rot;
{
        int     y1, c;

        c = 3;

        while ((c >= 0) && ((shape[shape_no].table[c][rot] & 8) == 0))
                c--;
        y1 = ypos + c + 1;
        if ((c != -1) && (y1 >= 0))
                if ((y1 == UHEIGHT) || (grid[xpos][y1] != 0))
                        return (FALSE);

        c = 3;
        while ((c >= 0) && ((shape[shape_no].table[c][rot] & 4) == 0))
                c--;
        y1 = ypos + c + 1;
        if ((c != -1) && (y1 >= 0))
                if ((y1 == UHEIGHT) || (grid[xpos + 1][y1] != 0))
                        return (FALSE);

        c = 3;
        while ((c >= 0) && ((shape[shape_no].table[c][rot] & 2) == 0))
                c--;
        y1 = ypos + c + 1;
        if ((c != -1) && (y1 >= 0))
                if ((y1 == UHEIGHT) || (grid[xpos + 2][y1] != 0))
                        return (FALSE);

        c = 3;
        while ((c >= 0) && ((shape[shape_no].table[c][rot] & 1) == 0))
                c--;
        y1 = ypos + c + 1;
        if ((c != -1) && (y1 >= 0))
                if ((y1 == UHEIGHT) || (grid[xpos + 3][y1] != 0))
                        return (FALSE);

        return TRUE;
}

block_can_left(shape_no, xpos, ypos, rot)
        int     shape_no, xpos, ypos, rot;
{
        int     x1, c;
        int     y0, y1, y2, y3;
        int     t0, t1, t2, t3;

        t0 = shape[shape_no].table[0][rot];     /* Bit map of 1st Row */
        t1 = shape[shape_no].table[1][rot];     /* Bit map of 2nd Row */
        t2 = shape[shape_no].table[2][rot];     /* Bit map of 3rd Row */
        t3 = shape[shape_no].table[3][rot];     /* Bit map of 4th Row */

        y0 = ypos;
        y1 = ypos + 1;
        y2 = ypos + 2;
        y3 = ypos + 3;

        c = 3;
        while ((c >= 0) && ((t0 & (1 << c)) == 0))
                c--;
        x1 = xpos - 1 + (3 - c);
        if (c != -1)
                if ((x1 < 0) || ((y0 >= 0) && (grid[x1][y0] != 0)))
                        return (FALSE);

        c = 3;
        while ((c >= 0) && ((t1 & (1 << c)) == 0))
                c--;
        x1 = xpos - 1 + (3 - c);
        if (c != -1)
                if ((x1 < 0) || ((y1 >= 0) && (grid[x1][y1] != 0)))
                        return (FALSE);

        c = 3;
        while ((c >= 0) && ((t2 & (1 << c)) == 0))
                c--;
        x1 = xpos - 1 + (3 - c);
        if (c != -1)
                if ((x1 < 0) || ((y2 >= 0) && (grid[x1][y2] != 0)))
                        return (FALSE);

        c = 3;
        while ((c >= 0) && ((t3 & (1 << c)) == 0))
                c--;
        x1 = xpos - 1 + (3 - c);
        if (c != -1)
                if ((x1 < 0) || ((y3 >= 0) && (grid[x1][y3] != 0)))
                        return (FALSE);

        return TRUE;
}

block_can_right(shape_no, xpos, ypos, rot)
        int     shape_no, xpos, ypos, rot;
{
        int     x1, c;
        int     y0, y1, y2, y3;
        int     t0, t1, t2, t3;

        t0 = shape[shape_no].table[0][rot];     /* Bit map of 1st Row */
        t1 = shape[shape_no].table[1][rot];     /* Bit map of 2nd Row */
        t2 = shape[shape_no].table[2][rot];     /* Bit map of 3rd Row */
        t3 = shape[shape_no].table[3][rot];     /* Bit map of 4th Row */

        y0 = ypos;
        y1 = ypos + 1;
        y2 = ypos + 2;
        y3 = ypos + 3;

        c = 0;
        while ((c < 4) && ((t0 & (1 << c)) == 0))
                c++;
        x1 = xpos + 1 + (3 - c);
        if ((c != 4) && (x1 >= 0))
                if ((x1 == UWIDTH) || ((y0 >= 0) && (grid[x1][y0] != 0)))
                        return (FALSE);

        c = 0;
        while ((c < 4) && ((t1 & (1 << c)) == 0))
                c++;
        x1 = xpos + 1 + (3 - c);
        if ((c != 4) && (x1 >= 0))
                if ((x1 == UWIDTH) || ((y1 >= 0) && (grid[x1][y1] != 0)))
                        return (FALSE);

        c = 0;
        while ((c < 4) && ((t2 & (1 << c)) == 0))
                c++;
        x1 = xpos + 1 + (3 - c);
        if ((c != 4) && (x1 >= 0))
                if ((x1 == UWIDTH) || ((y2 >= 0) && (grid[x1][y2] != 0)))
                        return (FALSE);

        c = 0;
        while ((c < 4) && ((t3 & (1 << c)) == 0))
                c++;
        x1 = xpos + 1 + (3 - c);
        if ((c != 4) && (x1 >= 0))
                if ((x1 == UWIDTH) || ((y3 >= 0) && (grid[x1][y3] != 0)))
                        return (FALSE);

        return TRUE;
}

remove_full_lines(y)
        int     y;
{
        int     y1, y2, full_flag, x;
        int     xsize, ysize;

        xsize = UNIT * UWIDTH;
        pw_batch_on(pw);
        for (y1 = y; y1 < y + 4 && y1 < UHEIGHT; y1++) {
                full_flag = TRUE;
                for (x = 0; x < UWIDTH; x++)
                        if (grid[x][y1] == 0) {
                                full_flag = FALSE;
                                break;
                        }
                if (full_flag) {
                        ysize = y1 * UNIT;
                        for (y2 = y1; y2 > 0; y2--)
                                for (x = 0; x < UWIDTH; x++)
                                        grid[x][y2] = grid[x][y2 - 1];
                        for (x = 0; x < UWIDTH; x++)
                                grid[x][0] = 0;
                        pr_rop(pr, 0, 0, xsize, ysize, PIX_SRC, pw->pw_prretained, 0, 0);
                        pw_rop(pw, 0, UNIT, xsize, ysize, PIX_SRC, NULL, 0, 0);
                        pw_rop(pw, 0, UNIT, xsize, ysize, PIX_SRC, pr, 0, 0);
                        pw_rop(pw, 0, 0, xsize, UNIT, CLR, NULL, 0, 0);
                        rows++;
                }
        }
        pw_batch_off(pw);
}

check_rot(shape_no, xpos, ypos, newrot)
        int     shape_no, xpos, ypos, newrot;
{
        int     i;
        int     ti;             /* Bit map of i'th row    */
        int     yi;             /* Y position on i'th row */
        int     x0, x1, x2, x3;

        x0 = xpos;
        x1 = xpos + 1;
        x2 = xpos + 2;
        x3 = xpos + 3;
        yi = ypos;

        for (i = 0; i < 4; yi++, i++) {
                if ((yi) >= 0) {
                        ti = shape[shape_no].table[i][newrot];
                        if (ti & 8)
                                if ((x0 < 0) || (x0 >= UWIDTH) || (grid[x0][yi] == 1))
                                        return FALSE;
                        if (ti & 4)
                                if ((x1 < 0) || (x1 >= UWIDTH) || (grid[x1][yi] == 1))
                                        return FALSE;
                        if (ti & 2)
                                if ((x2 < 0) || (x2 >= UWIDTH) || (grid[x2][yi] == 1))
                                        return FALSE;
                        if (ti & 1)
                                if ((x3 < 0) || (x3 >= UWIDTH) || (grid[x3][yi] == 1))
                                        return FALSE;
                }
        }
        return TRUE;
}