Category : A Collection of Games for DOS and Windows
Archive   : SOT.ZIP
Filename : SOTV.C

 
Output of file : SOTV.C contained in archive : SOT.ZIP
/********** The Son of Tetris Project ************/

/************ VIDEO/DISPLAY functions ***********/


#include
#include
#include
#include

#include "sot.h"

#define COFF 28 /* Column offset main display */
#define LOFF 0 /* Line offset */

#define SCOR_COFF 55
#define SCOR_LOFF 5
#define CRIB_COFF 3
#define CRIB_LOFF 3

#define HOT_CHAR '°'

static unsigned vseg; /* Video segment */
static void *screen_buf; /* Screen held here */
static int x_cur_pos, y_cur_pos; /* Initial cursor position */
static int cursor_val = FALSE;

const unsigned char FILL_CHAR = 'ù';

#define vpoke(adr, chr) poke(vseg, adr, chr)



static int vmode(void)
{
union REGS rg;

rg.h.ah = 15;
int86(0x10,&rg, &rg);
return rg.h.al;
} /* vmode */



static int get_cursor_state(void)
{
union REGS rg;

rg.h.ah = 15;
int86(0x10,&rg, &rg); /* get current display page to bh */
rg.h.ah = 3;
int86(0x10,&rg, &rg); /* get current display page to bh */
return rg.x.cx;
} /* get_cursor_state */



static void set_cursor_state(int state)
{
union REGS rg;

rg.h.ah = 1;
rg.x.cx = state;
int86(0x10,&rg, &rg);
} /* set_cursor_state */



void cursor_off(void)
{
if (!cursor_val)
cursor_val = get_cursor_state();
set_cursor_state(cursor_val | 0x2000);
}


void cursor_on(void)
{
set_cursor_state(cursor_val);
}



void p_arena(int left,int top,int right,int bottom)
{
static unsigned start_offset = ((SCRW * (LOFF - 1)) + COFF) * 2;
register unsigned x, col_offset, row_offset;
long attribute;

left = (left > 0) ? left : 1; /* Force display only within boundaries */
right = (right < BLW-1) ? right : BLW-2;
top = (top > 0) ? top : 1;
bottom = (bottom < BLH-1) ? bottom : BLH-2;

for (row_offset = start_offset + 2 * SCRW * top + 4 * left;
top <= bottom;
top++, row_offset += 2 * SCRW)
{
for (col_offset = row_offset, x = left;
x <= right;
x++,col_offset +=4)
{
switch(arena[x][top])
{
case CLEAR:
attribute = (x & 1) ? ' ': FILL_CHAR;
attribute |= ((BLACK << 4) + WHITE) << 8;
vpoke(col_offset,attribute);
vpoke(col_offset+2,attribute & 0xFF00);
break;

case BORDER:
attribute = '?';
attribute |= ((BLACK << 4) + WHITE) << 8;
break;

default:
if (arena[x][top] > BLINK)
{
attribute = HOT_CHAR;
attribute |= ((arena[x][top] << 4) + (arena[x][top] | DARKGRAY))
<< 8;
} /* hot object */
else
{
attribute = ' ';
attribute |= ((arena[x][top] << 4) + BLACK) << 8;
}
vpoke(col_offset,attribute);
vpoke(col_offset+2,attribute);
break;

} /* switch */
} /* for each column */
} /* for each row */

} /* p_arena */



void v_kill_row(int t_row)
{
window(COFF+ 3, LOFF + 1, COFF + (BLW-1) * 2, LOFF + t_row);
gotoxy(1,1);
insline();
window(1,1,80,25);
p_arena(1,1,BLW-2,1);
} /* v_kill_row */



static void p_surround(void)
{
int i;
for (i = (LOFF - 1) + 2; i < (LOFF - 1) + BLH; i++)
{
gotoxy(COFF + 2,i); putch('º');
gotoxy(COFF+ 2 * BLW-1,i); putch('º');
}
gotoxy(COFF + 3, (LOFF - 1) + BLH);
for (i = 0; i < 2 * (BLW - 2); i++)
putch('Í');
gotoxy(COFF + 2, (LOFF - 1) + BLH); putch('È');
gotoxy(COFF + 2 * BLW - 1, (LOFF - 1) + BLH); putch('¼');

} /* p_surround */


void init_video(void)
{
screen_buf = malloc(80 * 25 * 2);
gettext(1,1,80,25,screen_buf);
x_cur_pos = wherex();
y_cur_pos = wherey();
cursor_off();
clrscr(); /* Clear screen */
vseg = (vmode() == 7) ? 0xB000:0xB800; /* Set monochrome/colour segment */

p_surround();
gotoxy(SCOR_COFF,SCOR_LOFF);
cprintf("Level :");
gotoxy(SCOR_COFF,SCOR_LOFF+1);
cprintf("Score :");
gotoxy(SCOR_COFF,SCOR_LOFF+2);
cprintf("Lines :");
gotoxy(SCOR_COFF,SCOR_LOFF+4);
cprintf("Next shape :");

gotoxy(CRIB_COFF,CRIB_LOFF);
cprintf(" SOT Crib");
gotoxy(CRIB_COFF,CRIB_LOFF+2);
cprintf("7: Left P: Pause");
gotoxy(CRIB_COFF,CRIB_LOFF+3);
cprintf("8: Rotate S: Sound");
gotoxy(CRIB_COFF,CRIB_LOFF+4);
cprintf("9: Right ESC: Abort");
gotoxy(CRIB_COFF,CRIB_LOFF+5);
cprintf("4: Drop SPACE: Drop");
gotoxy(CRIB_COFF,CRIB_LOFF+6);
cprintf("6: Level ");


} /* init_video */


void end_video(void)
{
puttext(1,1,80,25,screen_buf);
gotoxy(x_cur_pos,y_cur_pos);
cursor_on();
} /* end_video */


void update_score(unsigned level,
long score,
unsigned lines_del,
SHP_TYPE *next_sh,
int show_shape)
{
int x,y, *map_ptr;
gotoxy(SCOR_COFF + 8,SCOR_LOFF);
cprintf("%7u",level);
gotoxy(SCOR_COFF + 8,SCOR_LOFF+1);
cprintf("%7ld",score);
gotoxy(SCOR_COFF + 8,SCOR_LOFF+2);
cprintf("%7u",lines_del);

window(SCOR_COFF, SCOR_LOFF + 6,SCOR_COFF + 15, SCOR_LOFF + 10);
clrscr();
window(1,1,80,25);
if (show_shape)
{
map_ptr = next_sh -> map[0];
for (y = 0; y < next_sh ->ht; y++)
{
gotoxy(SCOR_COFF, SCOR_LOFF + 6 + y);
for (x = 0; x < next_sh ->wd; x++,map_ptr++)
{
if (*map_ptr)
textattr((next_sh ->col << 4) + BLACK);
else
textattr((BLACK << 4) + BLACK);

putch(' '); putch(' ');
} /* for x */
} /* for y */
} /* if show_shape */
textattr((BLACK << 4) + LIGHTGRAY);

} /* update_score */


  3 Responses to “Category : A Collection of Games for DOS and Windows
Archive   : SOT.ZIP
Filename : SOTV.C

  1. Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!

  2. This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.

  3. But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/