📄 cbctrl.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 + -