/*****************************************************************************/
/* TEXT-VRAM target area move system */
/*****************************************************************************/
/* '94/02/21 操作キー設定機能削除 */

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iocslib.h>
#include "defines.h"
#include "menu.h"
#include "aigtext.h"
#include "ascreen.h"
#include "akey.h"
#include "amouse.h"
#include "skey.h"

extern	int	_gmmode_;		/* サーチモード */

/*****************************************************************************/

static int key_play(ky,ax,ay,wx,wy,STARTX,STARTY,ENDX,ENDY)
int ky,*ax,*ay,wx,wy,STARTX,STARTY,ENDX,ENDY;
{
	switch (ky) {
	    case SKup:
	    case SKt8: /* up */
		if (*ay>STARTY) {
			(*ay)--;
			return(1);
		}
		break;
	
	    case SKdown:
	    case SKt2: /* down */
		if (*ay+wy<=ENDY) {
			(*ay)++;
			return(1);
		}
		break;
	
	    case SKright:
	    case SKt6: /* right */
		if (*ax+wx<=ENDX) {
			(*ax)++;
			return(1);
		}
		break;
	
	    case SKleft:
	    case SKt4: /* left */
		if (*ax>STARTX) {
			(*ax)--;
			return(1);
		}
		break;
	}
	return(0); /* not move */
}

/****************************************************************************/

int move_area(ssx,ssy,eex,eey,wget,fmouse,STARTX,STARTY,ENDX,ENDY)
/* return : >0:ok & return key code  , -1:move disable */
int *ssx,*ssy,*eex,*eey; // アドレス渡しなので注意
unchar *(*wget); /* ==NULLの時は下画面情報無し */
int fmouse,STARTX,STARTY,ENDX,ENDY;
{
int c,cx,cy,wx,wy,sx,sy,msx,msy,mex,mey,fc=0,cur,msc,mcx,mcy,fmc=0;
int x,y,rsx,rsy,rex,rey,gm,btn=0;
int tm0,t;
unchar *wget1;
#define MPTRN	0xcccc
#define RPTRN	0x3333

	gm=_gmmode_;
	_gmmode_=-1; /* inkey with mouse-key disable */
	
	sx=*ssx;
	sy=*ssy;
	
	/* 移動する領域内を取り込む */
	wget1=gettext2(sx,sy,*eex,*eey);
	if (wget1==NULL) return(-1); /* memory can't get -> move disable */
	
	wx=*eex-sx+1;	/* 領域横幅 */
	wy=*eey-sy+1;	/* 領域縦幅 */
	
	cursor(&cx,&cy); /* cursor position */
	if (cx>=sx && cx<=*eex && cy>=sy && cy<=*eey) {
		/* カーソルは領域内にある：カーソルも移動する */
		fc=1;
		cx-=sx; /* 領域内カーソル位置オフセット */
		cy-=sy;
	}
	cur=curmode(0); /* cursor off */
	
	rsx=sx*8;	rsy=sy*16;
	rex=*eex*8+7;	rey=*eey*16+15;
	msx=rsx;	msy=rsy;
	mex=rex;	mey=rey;
	/* 移動先枠を少しずらして表示するための処理 */
	if (mex+2<(ENDX-wx+1)*8) {
		msx+=2;
		mex+=2;
	}
	if (mey+2<(ENDY-wy+1)*16) {
		msy+=2;
		mey+=2;
	}
	msc=MS_STAT();
	MS_CUROF(); /* マウスカーソルは消す */
	if (fmouse) { /* マウス設定 */
		/* テキストプレーン２に枠を描いてこれを動かす */
		/* マウスと枠は重ねてはいけない（やればわかる）*/
		/* マウスカーソル位置退避 */
		mcx=MS_CURGT();
		mcy=mcx&0xffff;
		mcx=mcx>>16;
		MS_CURST(msx,msy);
		if (mcx>=rsx && mcx<=rex && mcy>=rsy && mcy<=rey) {
			/* マウスカーソルは領域内にある：マウスカーソルも移動する */
			fmc=1;
			mcx-=rsx; /* 領域内マウスカーソル位置オフセット */
			mcy-=rsy;
		}
	}
	waku2(msx,msy,mex,mey,2,MPTRN); /* 初期枠：移動 */
	waku2(rsx,rsy,rex,rey,1,RPTRN); /* 初期枠：元 */
	
	/* move main */
	tm0=ONTIME();
	while (1) {
		t=ONTIME();
		if (t-tm0>17) { /* 枠点滅（1/6sec）*/
			rev_waku2(msx,msy,mex,mey,2); /* 移動先 */
			rev_waku2(rsx,rsy,rex,rey,1); /* 移動元 */
			tm0=t;
		}
		
		if (fmouse) btn=mson();
		c=inkey2(1,btn);
		if (c!=0) { /* キー入力有 */
			if ((c&0xff)==ESC || c==SKbrk) { /* ESC-end */
				c=ESC;
				break;
			}
			if ((c&0xff)==CR || c==SKtou) break; /* end */
			
			if (key_play(c,&sx,&sy,wx,wy,STARTX,STARTY,ENDX,ENDY)) {
				/* 移動 */
				/* erase waku */
				waku2(msx,msy,mex,mey,2,0x0000);
				
				/* move */
				msx=sx*8;
				msy=sy*16;
				mex=msx+wx*8-1;
				mey=msy+wy*16-1;
				
				/* draw waku */
				MS_CURST(msx,msy); /* マウスカーソル設定 */
				waku2(msx,msy,mex,mey,2,MPTRN);
				continue;
			}
		}
		if (fmouse) { /* マウス処理 */
			/* ボタン状態把握 */
			if (btn&0x0000ffff) { /* 右ボタン */
				c=ESC;
				break;
			}
			if (btn&0xffff0000) { /* 左ボタン */
				c=CR;
				break;
			}
			
			/* カーソル移動 */
			if (MS_GETDT()&0xffff0000) {
				/* erase waku */
				c=MS_CURGT(); /* カーソル位置取得 */
				waku2(msx,msy,mex,mey,2,0x0000);
				
				/* move (msx,msy) with limit area */
				x=(c>>16);
				y=(c&0xffff);
				if (x+wx*8<=ENDX*8) {
					msx=x;
					mex=msx+wx*8-1;
					sx=msx/8;
				}
				if (y+wy*16<=ENDY*16) {
					msy=y;
					mey=msy+wy*16-1;
					sy=msy/16;
				}
				
				/* draw waku */
				waku2(msx,msy,mex,mey,2,MPTRN);
			}
		}
	}
	/* 一応移動終了 */
	
	/* 枠消去 */
	waku2(msx,msy,mex,mey,2,0x0000);
	
	if (c!=ESC) { /* 移動処理 */
		/* 領域下復帰->本体移動あたりの関係で、textcopy()が使えない。残念。*/
		
		if (wget!=NULL) { /* 領域下復帰 */
			puttext(*ssx,*ssy,*wget);
		}
		
		/* move */
		*ssx=sx;
		*ssy=sy;
		*eex=sx+wx-1;
		*eey=sy+wy-1;
		
		if (wget!=NULL) { /* 領域内本体移動 */
			gettext(sx,sy,*eex,*eey,*wget);
		}
		/* カーソル位置設定 */
		if (fc) B_LOCATE(sx+cx,sy+cy);
	} else {/* ESCのときは動かさない（もとに戻る）*/
		sx=*ssx;
		sy=*ssy;
		/* テキストカーソルは移動していない */
	}
	/* 後処理 */
	puttext(sx,sy,wget1);
	free(wget1);
	if (fmouse) { /* マウス後処理 */
		if (fmc) {
			mcx+=(sx*8);
			mcy+=(sy*16);
		}
		MS_CURST(mcx,mcy);
	}
	if (msc) MS_CURON(); else MS_CUROF();
	curmode(cur); /* cursor on */
	_gmmode_=gm;
	
	return(c&0xff); /* with return key code (scan codeは外す) */
}

/****************************************************************************/
