⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cbctrl.h

📁 网页游戏赤壁
💻 H
字号:
/////////////////
// CBCtrl.h		:	《赤壁》全局控制数据结构
// CBCtrl.h		:	<< chibi >> global contral data structure
//
// v0010		:	Oct.3.1996
// v0011		:	Oct.18.1996
// v0012		:	Jan.25.1997
// v0013		:	Feb.5.1997
// v0014		:	Feb.15.1997, add CTRL_UNIT_Create(), CTRL_UNIT_Destroy(), 
//								changed some TASK_List functions
// v0020		:	Mar.29.1997, add most controls
// v0021		:	Apr.2.1997, add deploy asserts
// v0030		:	May.16.1997, add Block(), OpenDoor(), etc. changed a lot
//
// 编写			:	刘刚
// written by	:	Liu Gang
//
// 编译器		:	Visual C++ 4.2
// Compiler		:	Visual C++ 4.2
//
// 版权			:	北京前导软件有限公司	1996-1997
// Copyright	:	WayAhead Co.Ltd.		1996-1997
/////////////////
// 此文件包含游戏的控制结构(命令,状态,步,帧)和对控制的处理。

#ifndef	__CBCTRL_H__
#define	__CBCTRL_H__

#define	CTRL_ERROR_ID	600

//- Tian Yue
#define NDBUG

/////////////////
// 任务和状态
// 结束,堵塞,取消
// 攻击,移动,防御,休息,计谋,
// 解散,运送,建造,修理,阵型,
// 单挑,运载,卸载,组建,加入,
// 生产,提升,删除,
// 建造中,生产中,提升中,
// 取消建造,取消生产,取消提升
// 回送,开门,混乱,埋伏
enum	CTRL_TASK	{
	JIESHU=200,DUSE=255,QUXIAO=0,
	GONGJI,YIDONG,FANGYU,XIUXI,JIMOU,
	JIESAN,YUNSONG,JIANZAO,XIULI,ZHENXING,
	DANTIAO,YUNZAI,XIEZAI,ZUJIAN,JIARU,
	SHENGCHAN,TISHENG,SHANCHU,
	JIANZAOZHONG, SHENGCHANZHONG, TISHENGZHONG,
	QXJIANZAO, QXSHENGCHAN,QXTISHENG,
	HUISONG,KAIMEN,HLUAN,MFU
};
/////////////////

/////////////////
// 计谋
#define	CTRL_JIMOU_MAX	12
// 计谋取消,
// 激励,加速,减速,远视,混乱,
// 滚木,埋伏,恢复,火攻,
// 沼泽
enum	CTRL_JIMOU	{
	JIMOUQUXIAO=0,
	JILI,JIASU,JIANSU,YUANSHI,HUNLUAN,
	GUNMU,MAIFU,HUIFU,HUOGONG,
	ZHAOZE,
};
/////////////////

/////////////////
//	提升种类
//	主帅帐——升级1,升级2,升级3
//	木材场——改造弓箭1,改造弓箭2,改造弓箭3
//	武器场——改造兵器1,改造兵器2,改造兵器3
//	     改造护甲1,改造护甲2,改造护甲3			
//	钱 庄——卖木材1,卖粮食1,卖铁矿1
//	     卖木材2,卖粮食2,卖铁矿2
//	车兵所——改造投石车1,改造投石车2
//	船 坞——改造小战船,改造大战船,改造船体
enum	CTRL_TISHENG	{
	TISHENGQUXIAO=255,
	SHENGJI1=0,SHENGJI2,SHENGJI3,
	GONGJIAN1,GONGJIAN2,GONGJIAN3,
	BINGQI1,BINGQI2,BINGQI3,
	HUJIA1,HUJIA2,HUJIA3,
	MUCAI1,LIANGSHI1,TIEKUANG1,
	MUCAI2,LIANGSHI2,TIEKUANG2,
	TOUSHICHE1,TOUSHICHE2,
	XIAOCHUAN,DACHUAN,CHUANTI
};
/////////////////

/////////////////
// 阵型
#define	CTRL_ZHENXING_MAX	10
// 阵型取消
// 一字长蛇阵,二龙出水阵,三才天地阵,四象奇门阵,五行梅花阵,
// 六合连环阵,七星北斗阵,八门金锁阵,九宫八卦阵,十面埋伏阵
enum	CTRL_ZHENXING	{
	ZHENXINGQUXIAO=0,
	YIZI, ERLONG, SANCAI, SIXIANG, WUXING, 
	LIUHE, QIXING, BAMEN, JIUGONG, SHIMIAN
};
/////////////////

/////////////////
// 命令目的地类型
// 将领,士兵,建筑,地形,
// 将领种类,士兵种类,建筑种类,
// 计谋种类,阵型种类,提升种类
enum	CTRL_TASKEX	{
	JIANGLING, SHBING, JIANZHU, DIXING, 
	JIANGLINGZL, SHIBINGZL, JIANZHUZL, 
	JIMOUZL, ZHENXINGZL, TISHENGZL
};
/////////////////

/////////////////
// 运送的资源类型
// 资源取消,
// 树林,麦田,铁矿,民居,粮仓,
// 所有资源
enum	CTRL_RESOURCE {
	QXZIYUAN=65535,
	SHULIN=0, MAITIAN, TIEKUANG, MINJU, LIANGCANG, 
	SUOYOUZY
};
/////////////////

/////////////////
// 帧Frame
//#define	CTRL_FRAME_MAX	16
#define	CTRL_FRAME_NONE	65535
// 无效时,nPlayer的值为CTRL_FRAME_NONE
struct	CTRL_FRAME_STRUCT
{
	// flag
	WORD	bUpdate;	// TRUE时为可以显示本单元

	// nearly same as MAP_UNIT_CODE_STRUCT
	WORD	nPlayer;	// 游戏者
	WORD	nFile;		// 文件号
	WORD	nLayer;		// 所在图层
	WORD	nFrame;		// 当前帧
	WORD	nState;		// 当前状态
	WORD	nDir;		// 当前方向
	WORD	nX;			// 在原始地图中的位置(行、列)
	WORD	nY;
	WORD	nDrawX;			// 在原始地图中的显示位置(行、列)
	WORD	nDrawY;

	// for animation
	WORD	nCol;	// 在图素库中的位置(行、列)
	WORD	nRow;
//	WORD	nMaxFrame;				// 最大帧
	int		nLocationSize;			// 单元图素的大小,与CTRL_ptLocations配合使用
	POINT	ptOff;					// 相对于格子的位置(点)

//由于行军算法需要的变量	
	int		nOff_Z;					// 用于当上山时,Y轴的偏移量
	int		Status;
/////////////////////////

	// saved values
	WORD	nXLast;		// 在原始地图中的上一个位置(行、列)
	WORD	nYLast;
	POINT	ptOffLast;	// 相对于格子的上一个位置(点)

	//计谋
	WORD  wSTGCounter[CTRL_JIMOU_MAX];	// 计谋的记时器
	BYTE  nSTG[CTRL_JIMOU_MAX];			// 计谋变量,某位为1时为中某计

	// 在沼泽地移动速度要减慢
};
/////////////////

/////////////////
// 任务Task
// 任务队列的大小,实际只能存储 n-1个内容
// size of Task List
#define		CTRL_TASK_LIST_MAX			65

struct CTRL_TASK_STRUCT
{
	BOOL	bDone;			// 在产生任务时,当该结构所有内容都合法时,为真
							// 在执行任务时,完成任务为真
	WORD	nID;			// 发出命令的单元ID
	WORD	nLevel;			// 该命令的级别,0 is the highest, 5 is the lowest
	BOOL	bIRQ;			// 是否可以被中断

	CTRL_TASK	nTaskID;	// 任务
	DWORD	nTaskIDEx;		// 任务的类型,多为存放目的单元或事物的ID
	DWORD	nTaskIDEx2;		// 任务的类型的附加型,YUNSONG和HUISONG时使用

	WORD	nParam1;		// 因为任务的不同有不同的意义
	WORD	nParam2;
	WORD	nParam3;
	WORD	nParam4;		// 只有YUNSONG和HUISONG任务时有效
};

struct CTRL_TASK_SAVE_CMDUNIT
{
	DWORD Cmd;
	DWORD Ex;
	DWORD Busy;
};
/////////////////

#ifndef	TNEBUG

/////////////////
// 构造命令,命令的产生

// clear assembling parameters
// 清除CTRL_hitSrc的内容
// bForce	:	强迫清除所有内容
void CTRL_TASK_ClearAssembleSrc( BOOL bForce = FALSE );
// 清除CTRL_hitDest的内容,并且重新设置命令组
void CTRL_TASK_ClearAssembleDest();

// 检测鼠标拖出的框内是否包含单元(命令主体)
// 只设置CTRL_hitSrc的内容nID, nLevel
// 检测步骤:
// 1:是否是自己的部队
// 2:该部队是否还活着
// 3:如果选中将领,则该将领的所有下属士兵都被选中
// 4:如果有未整编的部队,则只有未整编的部队被选中
// 5:如果都是整编的部队,则被选中
// 6:如果是建筑,则最后一个建筑被选中
// detect if mouse dragging rectangle contains units
// prcHit		:	rectangle mouse dragging
// wParam		:	当响应时,用来查看是否Ctrl或Shift键被按下了
// return value	:	TRUE if hit something
BOOL CTRL_TASK_AssembleSrc( CONST RECT *prcHit, WORD wParam );

// 检测鼠标发出的命令
// 只设置CTRL_hitDest的内容nTaskID, nTaskIDEx, (nParam1)
// detect command message
// dwMessage	:	message ID
// return value	:	TRUE if detect it, and it is valid
BOOL CTRL_TASK_AssembleCmd( DWORD dwMessage, UINT lParam );

// 检测鼠标点击的目的单元(命令客体)
// detect single unit to be target
// nPosX, nPosY	:	mouse hit position in pixel
// return value	:	TRUE if detected, FALSE if cancel the command, -1 if need try again
int CTRL_TASK_AssembleDest( int nPosX, int nPosY );

// 当鼠标右键按下时,根据当前选中的单元组,制定相应的命令,选中目标
// nPosX, nPosY :	mouse hit position in pixel
// return value	:	TRUE if detected, FALSE if cancel the command, -1 if need try again
// 具体步骤:
// 1,如果已经有了命令,取消该命令
// 2.1,如果主体是建筑则退出
// 2.2,如果主体不是自己人则退出
// 3,检测鼠标点击位置
// 4,如果目标是地形,
//		4.1,主体是工人部队,而且目标是地形型资源,为运送,目标为地形类型
//		4.2,为移动,目标为地形类型
// 6,如果目标是建筑单元,主体是工人部队,
//		6.1,目标为资源建筑,为运送,目标为单元类型
//		6.2,为修理
// 5,如果目标是敌人的单元,
//		5.1,主体是攻击部队,为攻击
//		5.2,退出
// 7,为移动,目标为单元类型
BOOL CTRL_TASK_AssembleCmdDest( int nPosX, int nPosY );

// 如果鼠标点击屏幕左方的部队按钮
BOOL CTRL_TASK_NumberButton( WORD wParam, UINT lParam );

// send the whole command set to TASK Current List
// also send this command to all the players over the network
// 下达命令,重新设置命令组
// must be send by human player, computer uses another function
void CTRL_TASK_DeployByHuman();

// send the whole command set to TASK List
// do not spread this command to other computers
// only used by computer
// nPlayer		:	player's ID, 0-4 are player  0-4
// pTask		:	the Task you want to send
// return vlaue	:	TRUE if there is room for the Task
void CTRL_TASK_DeployByComputer( int nPlayer, CONST struct CTRL_TASK_STRUCT *pTask );
/////////////////


/////////////////
//命令的执行
/////////////////

// 初始化
// initialize
void CTRL_InitCtrl();

// copy from source task to destination task
// pTo		:	Task to be copied to
// pFrom	:	Task to copying from
extern void CTRL_TASK_Copy( struct CTRL_TASK_STRUCT *pTo, CONST struct CTRL_TASK_STRUCT *pFrom );

// clear Task
// pTask	:	Task to be cleared
extern void CTRL_TASK_Clear( struct CTRL_TASK_STRUCT *pTask );

// read Task from Task List, and set it to unit
// 从任务队列中读取命令,并下达给相应单元
extern void CTRL_TASK_Main();
/////////////////


/////////////////
// 以下函数定义在CBCTRLS.cpp中
// defined in CBCTRLS.cpp
/////////////////
// 状态处理
// check each unit if should change Status
void CTRL_STATUS_Main();

// change the Status of the unit
// pUnit	:	the unit to be changed to
extern void CTRL_STATUS_Change( struct UNIT_STRUCT *pUnit );
/////////////////

/////////////////
// basic functions
// 基本函数

// 产生单元,对阴影有特殊处理
// codeU		:	unit code to identifies the type of the unit
// nZ, nX, nY	:	position to locate,产生的位置
// return		:	unit ID extended code if successful,
//					MAP_DATA_NONE if failed
WORD CTRL_UNIT_Create( int nZ, int nX, int nY, DWORD codeU, BOOL bFind = TRUE );

// 删除单元,对阴影有特殊处理
// pUnit	:	unit pointer to be destroyed
// return	:	TRUE if successful
BOOL CTRL_UNIT_Destroy( struct UNIT_STRUCT *pUnit );

// 移动单元
// pDraw	:	unit to be moved
// nType	:	type of unit
// 返回	0,被堵住;1,可以走;2,沼泽;>2,遇到城门,返回城门的ID
int CTRL_UNIT_Move( struct CTRL_FRAME_STRUCT *pDraw, int nType );

// only used by CTRL_UNIT_Move()
void CTRL_UNIT_MoveShadow( struct CTRL_FRAME_STRUCT *pDraw );

// 判断是否该将领应该撤离战场,在解散部队后发生
//BOOL CTRL_UNIT_ToDisapear( struct UNIT_STRUCT *pUnitG );
/////////////////

/////////////////
// 部队函数
// 根据将领的编号产生部队
// nZ, nX, nY	:	position to locate,产生的位置
// nGenNum		:	general index number in DATA_Lib
// nPlayer		:	player to be added to
// nType		:	troop type
// return		:	general ID extended code if successful,
//					MAP_DATA_NONE if failed
WORD CTRL_GROUP_Create( int nZ, int nX, int nY, DWORD nGenNum, int nPlayer, int nType );

// 删除部队:解散部队,并删除将领单元
// pUnit	:	unit pointer to be destroyed
// return	:	TRUE if successful
BOOL CTRL_GROUP_Destroy( struct UNIT_STRUCT *pUnit );

// 通过将领的编号寻找将领的ID
// nPlayer	:	player to search in
// nGenNum	:	Index number of general in DATA_Lib,将领的编号
// return	:	general ID extended code if successful,
//				MAP_DATA_NONE if failed
WORD CTRL_GROUP_Find( int nPlayer, WORD nGenNum );

// 把单元直接加入到部队中
// pUnitG	:	pointer of the general to be added to
// pUnit	:	unit pointer to be added
// return	:	TRUE if successful
BOOL CTRL_GROUP_Add( struct UNIT_STRUCT *pUnitG, struct UNIT_STRUCT *pUnit );

// 从部队中删除单元
// 从部队中直接解散单元
// pUnit	:	unit pointer to be subed
// return	:	TRUE if successful
BOOL CTRL_GROUP_Sub( struct UNIT_STRUCT *pUnit );

// 从部队中解散手下的所有士兵
// pUnit	:	general pointer to sub soldiers from
// return	:	TRUE if successful
void CTRL_GROUP_ToSubAll( struct UNIT_STRUCT *pUnit );
/////////////////

// 其它
/////////////////
// 一个单元走进建筑或上船
// bCheck	:	为真时,要检测地面上是否有自己,否则,直接把地面清干净
void CTRL_UNIT_InUnit( struct UNIT_STRUCT *pUnit, BOOL bCheck = FALSE );

// 一个单元从建筑或船中走出来
// return	:	TRUE if successful
BOOL CTRL_UNIT_OutUnit( struct UNIT_STRUCT *pUnit );

// get soldier number that focus on 
// 得到处于焦点状态的士兵的数量
// return	:	soldier number, in person
int CTRL_GetFocusSoldierNumber();
//////////////////////

//////////////////////
// 计谋用
// 对某个单元设置计谋值,使该单元中计
// pDraw	:	单元的控制结构
// JiMou	:	计谋ID
// bSet		:	TRUE为设置,FALSE为清除
extern void CTRL_SetSTG( CTRL_FRAME_STRUCT *pDraw, CTRL_JIMOU JiMou, BOOL bSet=TRUE );
// 取得某个单元是否中某个计谋
// pDraw	:	单元的控制结构
// JiMou	:	计谋ID
extern BOOL CTRL_GetSTG( CTRL_FRAME_STRUCT *pDraw, CTRL_JIMOU JiMou );
/////////////////
#endif	// TNEBUG
#endif	// __CBCTRL_H__

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -