#define DEBUG 0
/* 
	TOWNS囲碁棋譜記録プログラム
	                                      1991/12/11  久保田俊也

	93/05/24  印刷 モジュールを本体より分離 


*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <egb.h>
#include <conio.h>
#include <msdos.cf>
#include <BPRDEV.H>
#include "igo.h"
#include "banx.h"
#include "kiffile.h"
#include "title.h"

#define WHITE_PRINT_COL 0
#define BLACK_PRINT_COL 1
#define WAKUX1 0
#define WAKUY1 0
#define ISHI_R 16

extern char *gwork;	/* グラフイックBIOSワーク */
extern 	char para[64] ;

static	BPR_Info	info;
static	BPR_Buff	buff;
static	BPR_Work	work;
static	char		work1[BPR_BUFFSIZE];

static int banx1, bany1, banx2, bany2, ishi_r, ishi_2r;
static int ban_length = 640, tate_bangai = 200;
static int left_mergin = 0;
static int type, bansize;
static char *ram;

void *my_malloc(size_t size);

int print_start()
{
int 		rc;

	ram = my_malloc( 640*840/8 );
	EGB_resolutionRam( gwork, 0x80, 1, 640, 840, ram) ; /* 仮想画面の設定 */
	EGB_writePage( gwork, 0x80) ;	/* 仮想画面に書き込み */

	info.BitType = BPR_MONO;
	info.Density = 90; 	/* 印刷画像の大きさの設定 */
	info.Width   = ban_length + left_mergin;
	info.Height  = ban_length + tate_bangai;
	info.Palette = NULL;
	info.ColorType = BPR_MONO;
	info.Reverse = BPR_NORMAL;
	info.TopSpace = 0;
	info.LeftSpace = 0;
	info.rsv[0] = info.rsv[1] = info.rsv[2] = info.rsv[3] = 0;
	
	buff.BuffSize = BPR_BUFFSIZE;
	buff.BuffAddr = work1;
	
	rc = BPR_Select( 0,&info,&buff );
	if( rc < 0 )
		{
		printf("--BPR_Select ERROR!!  %x--\n",BPRDEVERR);
		my_free(ram);
		EGB_writePage( gwork, 0) ;	/* ページ 0	 に */
		return	-1;
	}

	rc = BPR_GetSize( &work );
	if( rc < 0 )
		{
		printf("--BPR_GetSize  ERROR!! %x--\n",BPRDEVERR);
		my_free(ram);
		EGB_writePage( gwork, 0) ;	/* ページ 0	 に */
		return	-1;
	}

	if( work.Work1.BuffSize != 0 )
		work.Work1.BuffAddr = my_malloc( work.Work1.BuffSize );
	work.Work2.BuffAddr = my_malloc( work.Work2.BuffSize );
	work.Work3.BuffAddr = my_malloc( work.Work3.BuffSize );
	work.Work4.BuffAddr = my_malloc( work.Work4.BuffSize );
	work.Work5.BuffAddr = my_malloc( work.Work5.BuffSize );
	
	rc = BPR_Start( 0, 40, &work );
	if( rc < 0 )
		{
		printf("--BPR_Start ERROR!! %x--\n",BPRDEVERR);
		my_free(ram);
		if( work.Work1.BuffSize != 0 )
			my_free(work.Work1.BuffAddr);
		my_free(work.Work2.BuffAddr);
		my_free(work.Work3.BuffAddr);
		my_free(work.Work4.BuffAddr);
		my_free(work.Work5.BuffAddr);
	
		EGB_writePage( gwork, 0) ;	/* ページ 0	 に */
		return	-1;
	}
	
	EGB_writePage( gwork, 0) ;	/* ページ 0	 に */
	return 0;
}

int print_bangai( char *wstr, int start_te, int end_te)
{

	EGB_writePage( gwork, 0x80 ) ;	/* 仮想画面に設定 */
	
	print_do_bangai();
	print_do_title( start_te, end_te);
	print_do_kakusite( wstr);

	EGB_writePage( gwork, 0 ) ;	/* ページ 0 に */

	return 0;
}

static int print_do_bangai()
{

	EGB_color( gwork, 0, 1 /* BLACK_COL */) ;	
	EGB_color( gwork, 2, 0 /* WHITE_COL */) ;	
	EGB_paintMode( gwork, 0x022 ); 
	EGB_box( gwork, WAKUX1+left_mergin, 
		WAKUY1, WAKUX1+left_mergin+ban_length-1, 
		WAKUY1+tate_bangai); 	/* [46] 四角を描く */

	return 0;
}

static int print_do_title( int start_te, int end_te)
{
char disp_line[80];
char blackname[21], whitename[21];
char wstr[33];
char play_space[21];
int	komi_id, komi_number, hanmoku_id;
int	vicdef_id, vicdef_number;
char start_time[80], end_time[80];

	/* 1行目 */
	strcpy( disp_line, "対局日時  ");
	hyouji_start_end_time( start_time, end_time);
	strcat( disp_line, start_time);
	strcat( disp_line, "  ー  ");
	strcat( disp_line, end_time);
	gprint( disp_line, WAKUX1+left_mergin+5 , WAKUY1+5 + 1*16);

	/* 2行目 */
	strcpy( disp_line, "対局者    ");
	strcat( disp_line, "黒  ");
	title_blacknameread( blackname); 
	strcat( disp_line, blackname);
	strcat( disp_line, "  -  白  ");
	title_whitenameread( whitename);
	strcat( disp_line, whitename);
	gprint( disp_line, WAKUX1+left_mergin+5 , WAKUY1+5 + 2*16);

	/* 3行目 */
	strcpy( disp_line, "対局場所  ");
	title_playspaceread( play_space);
	strcat( disp_line, play_space);
	gprint( disp_line, WAKUX1+left_mergin+5 , WAKUY1+5 + 3*16);
	
	/* 4行目 */
	strcpy( disp_line, "手合い    ");
	strcat( disp_line, title_handy_wazenkaku_read());
	strcat( disp_line, "子局　");
	title_komiread( &komi_id, &komi_number, &hanmoku_id);
	switch(komi_id ){
		case 0: strcat(disp_line, "黒コミ出し");break;
		case 1: strcat(disp_line, "白コミ出し");break;
		case 2: strcat(disp_line, "コミなし  ");break;
		default: strcat(disp_line, "          ");break;
	}
	if(komi_id!=2 && komi_number > 0){
		strcat(disp_line, _itoa(komi_number, wstr, 10));
		strcat(disp_line, "目");
		switch(hanmoku_id ){
			case 0: strcat(disp_line, "半");break;
			case 1: strcat(disp_line, "  ");break;
			default:strcat(disp_line, "  ");break;
		}
	}
	gprint( disp_line, WAKUX1+left_mergin+5 , WAKUY1+5 + 4*16);

	/* 5行目 */
	title_issueread( &vicdef_id, &vicdef_number);
	strcpy( disp_line, "結果      ");
	switch(vicdef_id ){
		case 0: strcat( disp_line, "黒  ");break;
		case 1: strcat( disp_line, "白  ");break;
		case 2: strcat( disp_line, "ジゴ");break;
		default: strcat( disp_line, "    ");break;
	}
	switch(vicdef_id ){
		case 0: 
		case 1: 
			if(vicdef_number==-1){
				strcat(wstr, "中押し勝ち");
			}else if(vicdef_number==0){
				if(hanmoku_id == 0 && (komi_id == 0 || komi_id == 1)){
					strcat(wstr, "半目勝ち");
				}else{
					strcat(wstr, "中押し勝ち");
				}
			}else{
				strcat( disp_line, _itoa(vicdef_number, wstr, 10));
				strcat( disp_line, "目");
				if(hanmoku_id == 0 && (komi_id == 0 || komi_id == 1)){
					strcat( disp_line, "半勝ち");
				}else if(vicdef_id != 2){
					strcat( disp_line, "勝ち");
				}
			}
			break;
		default: break;
	}
	gprint( disp_line, WAKUX1+left_mergin+5 , WAKUY1+5 + 5*16);
	
	/* 6行目 */
	strcpy( disp_line, _itoa( start_te, wstr, 10));
	strcat( disp_line, "手から");
	strcat( disp_line, _itoa( end_te, wstr, 10));
	strcat( disp_line, "手まで表示");
	gprint( disp_line, WAKUX1+left_mergin+5 , WAKUY1+5 + 6*16);
	
	return 0;
}

static int print_do_kakusite( char *wstr)
{
char disp_line[80]; /* 80 は１行分の長さ */
int i,j,k;
int max_line;

	max_line = ((tate_bangai - 5)/16)-6;
	k=0;
	j=0;
	for(i=0;wstr[i]!='\0';i++){
		/* 行数のオーバーのチェック */
		if(k==max_line-1){
			strcpy( disp_line, "以下略");
			gprint( disp_line, WAKUX1+left_mergin+5, WAKUY1+5 + (7+k)*16);
			break;
		}
		
		disp_line[j] = wstr[i];
		j++;
		if((wstr[i] == ')' && j>60 ) || j>79 ){
			disp_line[j] = '\0';
		/* 7行目 から印刷 */
			gprint( disp_line, WAKUX1+left_mergin+5, WAKUY1+5 + (7+k)*16);
			k++;
			j=0;
			disp_line[0] = '\0';
			i++;
			for(;wstr[i]==' ';i++){
				;
			}
			i--;
		}
	}

	disp_line[j] = '\0';
	gprint( disp_line, WAKUX1+left_mergin+5, WAKUY1+5 + (7+k)*16);

	return 0;
}

int print_te( char ban[],int ex_ban[])
{
BAN_TYPE ban_type;

	ban_type = *title_bantype_read();
	if( ban_type.type == NORMAL){
		type = NORMAL;
		bansize = ban_type.size;
	}

	EGB_writePage( gwork, 0x80 ) ;	/* 仮想画面に設定 */

	EGB_color( gwork, 0, 1 /* BLACK_COL */ ) ;	
	EGB_color( gwork, 2, 0 /* WHITE_COL */ ) ;	
	EGB_paintMode( gwork, 0x022 ); 
	EGB_box( gwork, WAKUX1+left_mergin, 
		WAKUY1+tate_bangai, WAKUX1+left_mergin+ban_length-1, 
		WAKUY1+tate_bangai+ban_length-1); 	/* [46] 四角を描く */

	print_goban( WAKUX1+left_mergin, WAKUY1+tate_bangai, ISHI_R);
	print_do_te( ban, ex_ban);

	EGB_writePage( gwork, 0 ) ;	/* ページ 0 に */

	return 0;
}

static int print_goban(int x, int y, int z)
{
int i, j ;	

	banx1 = x;
	bany1 = y;
	ishi_r = z;
	ishi_2r = ishi_r * 2;
	banx2 = banx1 + (bansize+1)*ishi_2r-1;
	bany2 = bany1 + (bansize+1)*ishi_2r-1;

	EGB_color( gwork, 0, BLACK_PRINT_COL) ;
	EGB_color( gwork, 2, BLACK_PRINT_COL) ;
	for ( i = 0; i < bansize; i++){
		EGB_singleLine( gwork, (i+1)*ishi_2r+banx1, bany1+ishi_2r, 
							   (i+1)*ishi_2r+banx1, bany2-ishi_2r) ; 
		EGB_singleLine( gwork, banx1+ishi_2r, bany1+(i+1)*ishi_2r,
							   banx2-ishi_2r, bany1+(i+1)*ishi_2r) ; 
	}
	
	if( type==NORMAL && bansize == 19){
		for ( i = 0; i < 3; i++){
			for ( j = 0; j < 3; j++){
				WORD(para + 0) = 6*ishi_2r*i+banx1+4*ishi_2r;
				WORD(para + 2) = 6*ishi_2r*j+bany1+4*ishi_2r;
				WORD(para + 4) = 2;
				EGB_circle( gwork, para ) ;  /* その位置に点を描く */
			}
		}
	}

	return 0;
}

static int print_do_te(char ban[],int ex_ban[])
{
char s[4];
int stonex, stoney;
int ichi;

	for(stoney=1;stoney<(bansize+1);stoney++){
		for(stonex=1;stonex<(bansize+1);stonex++){
			ichi = henkan_disp_out( stonex, stoney);
			switch(ban[ichi]){
			case BLACK:
				EGB_color( gwork, 0, BLACK_PRINT_COL); 
				EGB_color( gwork, 2, BLACK_PRINT_COL);
				gcircle((stonex)*ishi_2r+banx1, (stoney)*ishi_2r+bany1, 
						ishi_r);
				break; 
			case WHITE:
				EGB_color( gwork, 0, BLACK_PRINT_COL) ; 
				EGB_color( gwork, 2, WHITE_PRINT_COL);
				gcircle((stonex)*ishi_2r+banx1, (stoney)*ishi_2r+bany1, 
						ishi_r);
				break; 
			case BLANK:
				break;
			}
		    
		    switch(ban[ichi]){
				case BLANK:
					break;
				case BLACK:
					EGB_color( gwork, 0, WHITE_PRINT_COL) ; 
					EGB_color( gwork, 2, WHITE_PRINT_COL) ; 
					break;
				case WHITE:
					EGB_color( gwork, 0, BLACK_PRINT_COL) ; 
					EGB_color( gwork, 2, BLACK_PRINT_COL) ; 
					break;
			}
			if(ban[ichi] != BLANK){
					if(ex_ban[ichi] >= 100){
						s[0] = '0' + ex_ban[ichi]/100;
						s[1] = '0' + (ex_ban[ichi]%100)/10;
						s[2] = '0' + (ex_ban[ichi]%10);
		    			s[3] = '\0';
				   		gprint(s, (stonex)*ishi_2r+banx1-12,
				   				  (stoney)*ishi_2r+bany1+8);
					}else if(ex_ban[ichi] >= 10){
						s[0] = '0' + ex_ban[ichi]/10;
						s[1] = '0' + (ex_ban[ichi]%10);
		    			s[2] = '\0';
				   		gprint(s, (stonex)*ishi_2r+banx1-8,
				   				  (stoney)*ishi_2r+bany1+8);
					}else if(ex_ban[ichi] >= 1){
						s[0] = '0' + (ex_ban[ichi]%10);
		    			s[1] = '\0';
				   		gprint(s, (stonex)*ishi_2r+banx1-4,
				   				  (stoney)*ishi_2r+bany1+8);
					}
				
		    }
		}
	}

	
	return 0;
}

int print_exec()
{

char		g_buf[640*40/8];
int			i, ystep;
int 		rc;

	EGB_writePage( gwork, 0x80 ) ;	/* 仮想画面に設定 */

	ystep = 40;
	for(i=0;i<ban_length+tate_bangai;i+=ystep){
		DWORD(para) = (int)g_buf;
		WORD(para+4) = getds();
		WORD(para+6) = left_mergin;
		WORD(para+8) = i;
		WORD(para+10) = ban_length+left_mergin-1;
		WORD(para+12) = i+ystep-1;
		EGB_getBlock(gwork, para);

		rc = BPR_Print( ystep, g_buf);
		if( rc < 0 ){
			printf("--BPR_Print ERROR!! %x--\n",BPRDEVERR);
			my_free(ram);
			if( work.Work1.BuffSize != 0 )
				my_free(work.Work1.BuffAddr);
			my_free(work.Work2.BuffAddr);
			my_free(work.Work3.BuffAddr);
			my_free(work.Work4.BuffAddr);
			my_free(work.Work5.BuffAddr);
			EGB_writePage( gwork, 0) ;	/* ページ 0	 に */
			return	-1;
		}
	}
	
	my_free(ram);
	if( work.Work1.BuffSize != 0 )
		my_free(work.Work1.BuffAddr);
	my_free(work.Work2.BuffAddr);
	my_free(work.Work3.BuffAddr);
	my_free(work.Work4.BuffAddr);
	my_free(work.Work5.BuffAddr);

	EGB_writePage( gwork, 0) ;	/* ページ 0	 に */

	return 0;

}
