/***********************************************************************
*Copyright (c)2012 , 天际边工作室
*All rights reserved.
**
文件名称：	Map.cpp
*摘要：		游戏主地图类
**
*修改历史：
*	版本    日期     作者     改动内容和原因
*   ----------------------------------------------------
*	1.0    2012-10-5  wstjb     基本的功能完成
***********************************************************************/
#define DEBUG_CLIENTBLOCK  new( _CLIENT_BLOCK, __FILE__, __LINE__)
#define _CRTDBG_MAP_ALLOC
#define new DEBUG_CLIENTBLOCK
#include "Map.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;

extern int mNCDebug;//20210816

/***********************************************************************
 * 说明:     Map类初始化函数
 * 输入参数: int num——用于设定君主等信息，由君主选择传值过来
 * 返回值  : 无
 * 功能	   : 初始化
 * 修改历史:
 *               姓名            日期             说明
 *             ------          ----------      -------------
 *             wstjb          2012-10-5       完成基本功能
***********************************************************************/
void Map::Init()
{
	
}

/***********************************************************************
 * 说明:     Map类初始化函数
 * 输入参数: int num——用于设定君主等信息，由君主选择传值过来
 * 返回值  : 无
 * 功能	   : 初始化
 * 修改历史:
 *               姓名            日期             说明
 *             ------          ----------      -------------
 *             wstjb          2012-10-5       完成基本功能
***********************************************************************/
void Map::InitMap(int type,int index,int x,int y)
{
	int resnum = GetResNum(RES_MAP,type,index);
	int j =0;
	tileType = resByte[resnum][2];
	memcpy(mapName,&resByte[resnum][3],8);
	width = resByte[resnum][16];
	height = resByte[resnum][17];
	dirction = 0;
	this->x = x;
	this->y = y;
	this->mapType = type;
	this->mapIdx = index;
	for(int i = 18; i < resByteLen[resnum] ; i++)
	{
		enableByte[j] = 0;
		if(resByte[resnum][i] >= 128)
		{
			enableByte[j] = 1;
		}
		eventByte[j] = resByte[resnum][i+1];
		i++;
		j++;
	}
	mapByteLen = j;
	for(int i = 0; i <256;i++)
	{
		for(int j = 0;j < 256;j++)
		{
			mapNpc[i][j] = 0;
		}
	}
}


void Map::InitMapNoEvent(int type,int index,int x,int y)
{
	int resnum = GetResNum(RES_MAP,type,index);
	int j =0;
	tileType = resByte[resnum][2];
	memcpy(mapName,&resByte[resnum][3],8);
	width = resByte[resnum][16];
	height = resByte[resnum][17];
	
	this->x = x;
	this->y = y;
	this->mapType = type;
	this->mapIdx = index;
	for(int i = 18; i < resByteLen[resnum] ; i++)
	{
		enableByte[j] = 0;
		if(resByte[resnum][i] >= 128)
		{
			enableByte[j] = 1;
		}
		eventByte[j] = resByte[resnum][i+1];
		i++;
		j++;
	}
	mapByteLen = j;
	
}


void Map::SetPos(int x,int y)
{
	this->x = x;
	this->y = y;
}

/***********************************************************************
 * 说明:     Map类显示函数
 * 输入参数: WPARAM KeyCode——按键信息，用于控制地图移动与对应的显示
 * 返回值  : 无
 * 功能	   : 显示地图及相关界面
 * 修改历史:
 *               姓名            日期             说明
 *             ------          ----------      -------------
 *             wstjb          2012-10-5       完成基本功能
***********************************************************************/
void Map::Show(WPARAM KeyCode)
{
	//loadmap 1 1 x y
	//类型，定位点x,y,9*6显示
	
	ClrScence();
	ShowMapPic(tileType,x,y,mapType,mapIdx);
	MoveToEx(hdcTmp,0,0,NULL);
    LineTo(hdcTmp,0,96);
    MoveToEx(hdcTmp,2,0,NULL);
    LineTo(hdcTmp,2,96);
    MoveToEx(hdcTmp,4,0,NULL);
    LineTo(hdcTmp,4,96);
	MoveToEx(hdcTmp,6,0,NULL);
    LineTo(hdcTmp,6,96);
    MoveToEx(hdcTmp,151,0,NULL);
    LineTo(hdcTmp,151,96);
    MoveToEx(hdcTmp,153,0,NULL);
    LineTo(hdcTmp,153,96);
	MoveToEx(hdcTmp,155,0,NULL);
    LineTo(hdcTmp,155,96);
	MoveToEx(hdcTmp,157,0,NULL);
    LineTo(hdcTmp,157,96);
	if(KeyCode == -1)
	{
		CopyToHdc();
	}
}

/***********************************************************************
 * 说明:     Map类按键函数
 * 输入参数: WPARAM KeyCode——按键信息，用于确定当前的城市
 * 返回值  : 无
 * 功能	   : 处理当前类的按键信息
 * 修改历史:
 *               姓名            日期             说明
 *             ------          ----------      -------------
 *             wstjb          2012-10-5       完成基本功能
 *			   wstjb			2012-10-20		增加功能
***********************************************************************/
int Map::KeyDown(WPARAM KeyCode)
{
	//wlogfile(1, __FUNCTION__ ,"KeyCode=",KeyCode);
	if(KeyCode == KeyUp0)
	{
		dirction = 1;
		if(y > 0 )
		{
			
			if(eventByte[width * (y + 3 - 1) + x + 4] != 0 && enableByte[width * (y + 3 - 1) + x + 4] && mapNpc[x + 4 - 1][y + 3 - 1 - 1] == 0)
			{
				y--;
				//Show(0);
				return eventByte[width * (y + 3) + x + 4];
			}
			else if(eventByte[width * (y + 3 - 1) + x + 4] != 0 )
			{
				//Show(0);
				return eventByte[width * (y + 3 - 1) + x + 4];
			}
			else if(enableByte[width * (y + 3 - 1) + x + 4]&& mapNpc[x + 4 - 1][y + 3 - 1 - 1] == 0)
			{
				y--;
				//Show(0);
			}
			else if(mNCDebug == 1)//20210816
			{
				y--;
			}
		}

		
	}
	else if(KeyCode == KeyDown0)
	{
		dirction = 3;
		if(y < (height - 6)   )
		{
			
			if(eventByte[width * (y + 3 + 1) + x + 4] != 0 && enableByte[width * (y + 3 + 1) + x + 4] && mapNpc[x + 4 - 1][y + 3 - 1 + 1] == 0)
			{
				y++;
				//Show(0);
				return eventByte[width * (y + 3) + x + 4];
			}
			else if(eventByte[width * (y + 3 + 1) + x + 4] != 0 )
			{
				//Show(0);
				return eventByte[width * (y + 3 + 1) + x + 4];
			}
			else if(enableByte[width * (y + 3 + 1) + x + 4]  && mapNpc[x + 4 - 1][y + 3 - 1 + 1] == 0)
			{
				y++;
				//Show(0);
			}
			else if(mNCDebug == 1)//20210816
			{
				y++;
			}
		}
		
	}
	else if(KeyCode == KeyLeft0)
	{
		dirction = 4;
		if(x > 0 )
		{
			
			if(eventByte[width * (y + 3 ) + x + 4 - 1] != 0 && enableByte[width * (y + 3) + x + 4 - 1] && mapNpc[x + 4 - 1 - 1][y + 3 - 1] == 0)
			{
				x--;
				//Show(0);
				return eventByte[width * (y + 3) + x + 4];
			}
			else if(eventByte[width * (y + 3 ) + x + 4 - 1] != 0 )
			{
				//Show(0);
				return eventByte[width * (y + 3 ) + x + 4 - 1];
			}
			else if(enableByte[width * (y + 3 ) + x + 4 - 1] && mapNpc[x + 4 - 1 - 1][y + 3 - 1] == 0)
			{
				x--;
				//Show(0);
			}
			else if(mNCDebug == 1)//20210816
			{
				x--;
			}
		}

		
	}
	else if(KeyCode == KeyRight0)
	{
		dirction = 2;
		if(x < (width-9)    )
		{
			
			if(eventByte[width * (y + 3 ) + x + 4 + 1] != 0 && enableByte[width * (y + 3) + x + 4 + 1] && mapNpc[x + 4 - 1 + 1][y + 3 - 1] == 0)
			{
				x++;
				//Show(0);
				return eventByte[width * (y + 3) + x + 4];
			}
			else if(eventByte[width * (y + 3 ) + x + 4 + 1] != 0 )
			{
				//Show(0);
				return eventByte[width * (y + 3 ) + x + 4 + 1];
			}
			else if(enableByte[width * (y + 3 ) + x + 4 + 1]   && mapNpc[x + 4 - 1 + 1][y + 3 - 1] == 0)
			{
				x++;
				//Show(0);
			}
			else if(mNCDebug == 1)//20210816
			{
				x++;
			}
		}
		
		
	}
	else if(KeyCode == KeyReturn)
	{
		int ret = 0;
		if(dirction == 1 )
		{
			ret = TestNpc(x + 4 - 1,y + 3 - 1 - 1);
			if(ret)//npc事件 负数返回
			{
				return -ret;
			}
			else//地图事件
			{
				return eventByte[width * (y + 3 - 1) + x + 4];
			}
		}
		else if(dirction == 2 )
		{
			ret = TestNpc(x + 4 - 1 + 1,y + 3 - 1);
			if(ret)//npc事件 负数返回
			{
				return -ret;
			}
			else//地图事件
			{
				return eventByte[width * (y + 3) + x + 1 + 4];
			}
		}
		else if(dirction == 3 )
		{
			ret = TestNpc(x + 4 - 1 ,y + 3 - 1 + 1);
			if(ret)//npc事件 负数返回
			{
				return -ret;
			}
			else//地图事件
			{
				return eventByte[width * (y + 3 + 1) + x + 4];
			}
		}
		else if(dirction == 4 )
		{
			ret = TestNpc(x + 4 - 1 - 1,y + 3 - 1);
			if(ret)//npc事件 负数返回
			{
				return -ret;
			}
			else//地图事件
			{
				return eventByte[width * (y + 3) + x - 1 + 4];
			}
		}
		else return 0;
	}
	//Show(0);
	
	return 0;
}


int Map::TestNpc(int inx,int iny)
{
	return mapNpc[inx][iny];
}