/***********************************************************************
*Copyright (c)2012 , 天际边工作室
*All rights reserved.
**
文件名称：	GameMenu.cpp
*摘要：		游戏主地图类
**
*修改历史：
*	版本    日期     作者     改动内容和原因
*   ----------------------------------------------------
*	1.0    2012-10-5  wstjb     基本的功能完成
***********************************************************************/

#include "GameMenu.h"
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>

using namespace std;

extern  PAINTSTRUCT ps;
extern 	HDC hdc;
extern 	HBITMAP hbmp; 
extern 	HBITMAP hbmp2; 
extern 	BITMAP bmp;
extern 	HDC hdcMem;
extern 	HDC hdcTmp;
extern 	RECT rect;
extern 	HWND hwnd;
extern  int color;
extern  int flag;

extern int KeyReturn;
extern int KeyEsc;
extern int KeyHome;
extern int KeySpace;
extern int KeyLeft0;
extern int KeyUp0;
extern int KeyRight0;
extern int KeyDown0;

extern byte resByte[2731][16384];//存储lib资源
extern int resByteLen[2731];
extern int resPos[2731][6];//存储lib地址和编号 第六位为长度
extern int resCount;


/***********************************************************************
 * 说明:     GameMenu类初始化函数
 * 输入参数: int num——用于设定君主等信息，由君主选择传值过来
 * 返回值  : 无
 * 功能	   : 初始化
 * 修改历史:
 *               姓名            日期             说明
 *             ------          ----------      -------------
 *             wstjb          2012-10-5       完成基本功能
***********************************************************************/
void GameMenu::Init(int x,int y,int u,int v,int maxline,char *text,int vauleNo)
{
	keyflag = 0;
	stat= 0;
	ux=u;
	uy=v;
	posx=x;
	posy=y;
	flagu = 0;
	flagd = 0;
	pos = 0;
	startline = 0;

	type = 0;
	if(uy < 0)
	{
		type = 1;
		maxline = -uy+1;
	}
	uy = abs(uy);
	this->menuno = menuno;
	this->money = money;
	sprintf_s(this->text,"%s",text);
	this->vauleNo = vauleNo;
	//拆分text
	memset(showedText,0,sizeof(showedText));
	SpiltMenuText();
	

}

/***********************************************************************
 * 说明:     GameMenu类显示函数
 * 输入参数: WPARAM KeyCode——按键信息，用于控制地图移动与对应的显示
 * 返回值  : 无
 * 功能	   : 显示地图及相关界面
 * 修改历史:
 *               姓名            日期             说明
 *             ------          ----------      -------------
 *             wstjb          2012-10-5       完成基本功能
***********************************************************************/
void GameMenu::Show(WPARAM KeyCode)
{
	HPEN hpen=CreatePen(PS_SOLID,1, RGB(0,0,0));
	HPEN oldhpen=(HPEN)SelectObject(hdcTmp,hpen);

	//根据keycode判断显示
	if(KeyCode == KeyDown0 && flagd == 1)
	{
		startline ++;
		if(startline > maxline - 5)
		{
			startline = maxline - 5;
		}
	}
	else if(KeyCode == KeyUp0 && flagu == 1)
	{
		startline --;
		if(startline < 0)
		{
			startline = 0;
		}
	}
	else if(KeyCode == KeyDown0 && flagu == 1)
	{
		startline = 0;
	}
	else if(KeyCode == KeyUp0 && flagd == 1)
	{
		startline = maxline - uy1;
	}
	
	//BitBlt(hdcMem,0,0,800,600,hdcTmp,0,0,SRCCOPY);
	BitBlt(hdcTmp,posx-1,posy-1,ux*16+5+2,uy1*16+5+2,hdcMem,0,0,WHITENESS);
	Rectangle(hdcTmp,posx,posy,posx+ux*16+5,posy+uy1*16+5); 

	for(int i = 0; i< uy1 ; i ++)
	{
		ShowText(showedText[i+startline],posx + 2,posy+2 + 16*i);
		
	}
	
	SelectObject(hdcTmp,oldhpen);
	DeleteObject(hpen);

	BitBlt(hdcTmp,posx+2,posy+2+pos*16,16 * ux + 1 ,16,hdcTmp,posx+2,posy+2+pos*16,DSTINVERT);//反色

}

/***********************************************************************
 * 说明:     GameMenu类按键函数
 * 输入参数: WPARAM KeyCode——按键信息，用于确定当前的城市
 * 返回值  : 无
 * 功能	   : 处理当前类的按键信息
 * 修改历史:
 *               姓名            日期             说明
 *             ------          ----------      -------------
 *             wstjb          2012-10-5       完成基本功能
 *			   wstjb			2012-10-20		增加功能
***********************************************************************/
int GameMenu::KeyDown(WPARAM KeyCode)
{
	
	if(KeyCode == KeyEsc)
	{
		return -1;
			
	}
	else if(KeyCode == KeyReturn)
	{
		return stat + 1;
	}
	else if(KeyCode == KeyUp0)
	{
		stat --;
		if(stat < 0)stat = maxline-1;
		
		pos --;
		//20160901增加flagd消去处理
		if(pos < (uy1-1))
		{
			flagd = 0;
		}
		if(pos<0 && stat!=(maxline-1))
		{
			pos = 0;
			flagu = 1;
		}
		else if(pos<0)//回到最后行
		{
			pos = uy1-1;
			flagu = 0;
			flagd = 1;
		}
		Show(KeyCode);
	}
	else if(KeyCode == KeyDown0)
	{
		stat ++;
		if(stat >(maxline -1))stat = 0;
		pos ++;
		//20160901增加flagu消去处理
		if(pos > 0)
		{
			flagu = 0;
		}
		if(pos>uy1-1 && stat!=0)
		{
			pos = uy1-1;
			flagd = 1;
		}
		else if(pos>uy1-1)//回到第一行
		{
			pos = 0;
			flagd = 0;
			flagu = 1;
		}

		Show(KeyCode);
	}
	
	return 0;
}

void GameMenu::SpiltMenuText()
{
	
	const char * split = " "; 
	char * p; 
	p = strtok (text,split); 
	for(int i = 0;p!=NULL;i ++) 
	{ 
		if(strlen(p)>16)
		{
			p[16]='\0';
		}
		sprintf_s (showedText[i],"%s",p); 
		p = strtok(NULL,split); 
		maxline = i + 1;
		if((strlen(showedText[i])/2)>ux)
		{
			ux = strlen(showedText[i])/2;
		}
	}
	
	uy = maxline;
	uy1 = uy>5?5:uy;

	posx = 80-ux*16/2;
	posy = (48-uy1*16/2-16)>0?(48-uy1*16/2-16):8;
}
