📄 cbrun.cpp
字号:
}
if( nEnd != -1 )
RUN_EndGame( nEnd ); // 可以结束了,0时是输了,1或2是赢了
}
// debug for dead lock
/* if( nCounter%1000 == 0 )
{
GAME_Save( 19 );
}
*/
if( RUN_nCounter%RUN_SOUND_ATTACKDELAY == 0 )
{
RUN_SOUND_bWeAreUnderAttack = TRUE; // 开关打开
}
if( RUN_nCounter%RUN_MOULUE_DELAY == 0 )
{
// 自动增加谋略值,一次加五,只有场上的加
// 自动增加生命值,一次加十,只有场外的加
RUN_MOULUE_Add();
// 更新当前选中将领的谋略值
if( CTRL_nHitCounter > 0 )
{
Assert( CTRL_hitSrc[0].nID != MAP_DATA_NONE );
struct UNIT_STRUCT *pUnit = MAP_GetUnit( CTRL_hitSrc[0].nID );
Assert( pUnit );
// 处于焦点状态时更新谋略值
if( EYE_IfFocusOnUnit( pUnit )
&& EYE_IfUnitIsGen( pUnit ) )
{
FACE_UpdateRuse( DATA_Lib.Gen[pUnit->Gen.nID].nMouLue );
}
}
}
RUN_nCounter++;
}
// 每隔X轮所有将领的谋略值增加五
void RUN_MOULUE_Add()
{
int nGenFile[4]={35,31,33,29};
for( int i=0; i<DATA_UNIT_GENERAL_MAX; i++ )
{
if( DATA_Lib.Gen[i].nID == 0 ) continue;
// 将领谋略值增加一
if( DATA_Lib.Gen[i].bOnBattle == TRUE )
{ // 在战场上的将领才增加计谋值
//if( DATA_Lib.Gen[i].nMouLue < DATA_MOULUE_MAX )
// 计谋最大值是该将领智力值乘2加15
if( DATA_Lib.Gen[i].nMouLue < (DATA_Lib.Gen[i].nZhiLi<<1)+15 )
{
DATA_Lib.Gen[i].nMouLue+=5;
}
}
else
{ // 增加将领生命值,只增加在战场以外的将领的
if( DATA_Lib.Gen[i].dwLife
< DWORD(EYE_GetFullLife( -1, nGenFile[DATA_Lib.Gen[i].nType-1] )) )
{
DATA_Lib.Gen[i].dwLife+=10;
}
}
}
}
void RUN_EndGame( int bWin )
{
BOOL FadeFlag = FALSE;
FACE_SetProgramState( PROGRAM_STATE_NONE );
MOUSE_SetState( MOUSE_STATE_NONE, TRUE );
if( GAME_bNetwork )
PostMessage(hwndGame, WM_COMMAND, SHOW_BATTLE_RESULT, bWin );
else
PostMessage( hwndGame, WM_GAME_END, GAME.nID, bWin );
}
///////////////////////////////
///////////////////////////////
#define RUN_CLOCK_CIRCLE 20
BOOL RUN_RunUnit( int nPlayer, int nUnit )
{
struct UNIT_STRUCT *pUnit = &GAME.Players[nPlayer].Unit[nUnit];
if( pUnit->nType == MAP_UNIT_TYPE_NONE ) return FALSE;
if( pUnit->bPause == TRUE )
{
pUnit->bPause = FALSE; return FALSE;
}
switch( pUnit->Status.nTaskID )
{
case YIDONG: // 移动
RUN_MoveUnit( pUnit );
break;
case SHENGCHAN: // 生产
#ifdef _DEBUG_OFFSET_
TestOff( pUnit, "R_ShengChan\n" );
#endif //_DEBUG_OFFSET_
RUN_CreateSoldier( pUnit );
break;
case JIANZAO: // 建造
#ifdef _DEBUG_OFFSET_
TestOff( pUnit, "R_JianZao\n" );
#endif //_DEBUG_OFFSET_
RUN_CreateBuild( pUnit );
break;
case SHANCHU: // 删除
#ifdef _DEBUG_OFFSET_
TestOff( pUnit, "R_ShanChu\n" );
#endif //_DEBUG_OFFSET_
RUN_DestroyUnit( pUnit );
break;
case GONGJI: // 攻击
#ifdef _DEBUG_OFFSET_
TestOff( pUnit, "R_Gongji\n" );
#endif //_DEBUG_OFFSET_
RUN_FightUnit( pUnit );
break;
case ZUJIAN: // 组建
#ifdef _DEBUG_OFFSET_
TestOff( pUnit, "R_ZuJian\n" );
#endif //_DEBUG_OFFSET_
RUN_GroupUnit( pUnit );
break;
case JIARU: // 加入
#ifdef _DEBUG_OFFSET_
TestOff( pUnit, "R_JiaRu\n" );
#endif //_DEBUG_OFFSET_
RUN_GroupAdd( pUnit );
break;
case JIESAN: // 解散
#ifdef _DEBUG_OFFSET_
TestOff( pUnit, "R_JieSan\n" );
#endif //_DEBUG_OFFSET_
RUN_GroupSub( pUnit );
break;
case XIULI: // 修理
#ifdef _DEBUG_OFFSET_
TestOff( pUnit, "R_XiuLi\n" );
#endif //_DEBUG_OFFSET_
RUN_RepairBuild( pUnit );
break;
case QXSHENGCHAN:// 取消生产
#ifdef _DEBUG_OFFSET_
TestOff( pUnit, "R_QXShengChan\n" );
#endif //_DEBUG_OFFSET_
RUN_QXCreateSoldier( pUnit );
break;
case QXJIANZAO: // 取消建造
#ifdef _DEBUG_OFFSET_
TestOff( pUnit, "R_QXJianZao\n" );
#endif //_DEBUG_OFFSET_
RUN_QXCreateBuild( pUnit );
break;
case JIANZAOZHONG:// 建造中
#ifdef _DEBUG_OFFSET_
TestOff( pUnit, "R_JianZaoZhong\n" );
#endif //_DEBUG_OFFSET_
RUN_CreatingBuild( pUnit );
break;
case YUNSONG: // 运送,采集
#ifdef _DEBUG_OFFSET_
TestOff( pUnit, "R_Harvest\n" );
#endif //_DEBUG_OFFSET_
RUN_Harvest( pUnit );
break;
case HUISONG: // 回送,采集完毕后,回到家中
#ifdef _DEBUG_OFFSET_
TestOff( pUnit, "R_Harvest\n" );
#endif //_DEBUG_OFFSET_
RUN_ReturnOfTheJedi( pUnit );
break;
case TISHENG: // 提升
#ifdef _DEBUG_OFFSET_
TestOff( pUnit, "R_TiSheng\n" );
#endif //_DEBUG_OFFSET_
RUN_Upgrade( pUnit );
break;
case QXTISHENG: // 取消提升
#ifdef _DEBUG_OFFSET_
TestOff( pUnit, "R_QXTiSheng\n" );
#endif //_DEBUG_OFFSET_
RUN_QxUpgrade( pUnit );
break;
case DUSE: // 堵塞
#ifdef _DEBUG_OFFSET_
TestOff( pUnit, "R_DuSe\n" );
#endif //_DEBUG_OFFSET_
RUN_Blocked( pUnit );
break;
case YUNZAI: // 运载
#ifdef _DEBUG_OFFSET_
TestOff( pUnit, "R_YunZai\n" );
#endif //_DEBUG_OFFSET_
RUN_OnShip( pUnit );
break;
case XIEZAI: // 卸载
#ifdef _DEBUG_OFFSET_
TestOff( pUnit, "R_XieZai\n" );
#endif //_DEBUG_OFFSET_
RUN_OffShip( pUnit );
break;
case ZHENXING: // 阵型
RUN_LineUp( pUnit );
break;
case KAIMEN: // 开门
#ifdef _DEBUG_OFFSET_
TestOff( pUnit, "R_Door\n" );
#endif //_DEBUG_OFFSET_
RUN_OpenDoor( pUnit );
break;
case QUXIAO: // 取消
#ifdef _DEBUG_OFFSET_
TestOff( pUnit, "Quxiao\n" );
#endif //_DEBUG_OFFSET_
break;
case JIMOU: // 计谋
// 当状态是JIMOU时调用
RUN_Strategy( pUnit );
break;
case HLUAN: // 混乱
RUN_HLuan( pUnit );
break;
case MFU: // 埋伏
RUN_MFu( pUnit );
break;
case DANTIAO: // 单挑
RUN_FightSingle( pUnit );
break;
case XIUXI:
RUN_Rest( pUnit );
break;
}
//- TianYue
// 本能策略,执行一个人的本能策略
//#define __TY_AI__
#ifdef __TY_AI__
TY_InstanceAI_ForStruct( pUnit );
GuardTowerProcess(pUnit);
#endif
// 计谋,计谋记数器自动加一
if( !EYE_IfUnitIsBuild( pUnit ) )
{
for( int i=0; i<CTRL_JIMOU_MAX; i++ )
{
if( pUnit->Draw.nSTG[i] == 1 )
{
pUnit->Draw.wSTGCounter[i]++;
if( pUnit->Draw.wSTGCounter[i] >= RUN_TIMEDELAY_STG )
{
if( i == YUANSHI )
{ // 擦去阴影
// 只有我方才有阴影改变的问题
if( GAME.nMe == pUnit->Draw.nPlayer )
{
//lwc
// 消失
int nVRange = EYE_GetViewRange( &pUnit->Draw );
Assert( pUnit->nHasShadow == 1 );
SHADOW_death (pUnit->Draw.nX,pUnit->Draw.nY,nVRange);
//lwc
}
pUnit->nHasShadow--;
}
CTRL_SetSTG( &pUnit->Draw, (CTRL_JIMOU)i, FALSE );
if( i == YUANSHI )
{ // 重现阴影
if( GAME.nMe == pUnit->Draw.nPlayer )
{
int nSight = EYE_GetViewRange( &pUnit->Draw );
Assert( pUnit->nHasShadow == 0 );
SHADOW_existent( pUnit->Draw.nX, pUnit->Draw.nY, nSight );
}
pUnit->nHasShadow++;
// draw to minimap
MINI_SetUnitData( pUnit->Draw.nX, pUnit->Draw.nY, pUnit->Draw.nPlayer, pUnit->Draw.nLocationSize ); // for minimap
}
else if( i == JILI
&& EYE_IfFocusOnUnit( pUnit )
&& EYE_IfUnitIsGen( pUnit ) )
{
FACE_UpdateMorale( EYE_GetMorale( pUnit ) );
}
}
}
}
}
// RUN_MoveUnitTest( pUnit );
// if( nPlayer == 3 )
// OutputDebugString( "f" );
// 对城门认为没有
// July 31, 1997, Liu Gang
if( EYE_IfUnitIsDoor( pUnit ) )
return FALSE;
if( EYE_IfUnitIsBuild( pUnit ) )
return TRUE;// 只有建筑返回真值
return FALSE;
}
///////////////////////////////
///////////////////////////////
// 当状态是YIDONG时调用
BOOL RUN_MoveUnit( struct UNIT_STRUCT *pUnit )
{
BOOL bStep = FALSE;
#ifdef _DEBUG
if( pUnit->Status.nTaskID == QUXIAO )
{
OutputDebugString( "RUN_MoveUnit Error(1): no task but still move!\n" );
return FALSE;
}
#endif
if( EYE_IfUnitIsBuild( pUnit )
|| EYE_IfUnitIsSpec( pUnit ) )
{ // 建筑或特殊
OutputDebugString( "RUN_MoveUnit Error(2): this unit should not move!\n" );
return FALSE;
}
struct CTRL_FRAME_STRUCT *pDraw = &pUnit->Draw;
// move soldiers
pUnit->nCounter++;
// save old 1
pDraw->nXLast = pDraw->nX;
pDraw->nYLast = pDraw->nY;
pDraw->ptOffLast.x = pDraw->ptOff.x;
pDraw->ptOffLast.y = pDraw->ptOff.y;
int nFrame = pDraw->nFrame;
POINT ptDD[8] = {{0,-1},{2,-1},{2,0},{2,1},{0,1},{-2,1},{-2,0},{-2,-1}};
POINT ptDDD[8] = {{0,-2},{1,-1},{2,0},{1,1},{0,2},{-1,1},{-2,0},{-1,-1}};
int nDirState[8] = {0,1,2,3,4,3,2,1};
if( pDraw->ptOff.x == 0 && pDraw->ptOff.y == 0 )
{
Assert( pUnit->nID == MAP_GetUnitDataEx( pDraw->nX, pDraw->nY )
|| pUnit->nHasShadow == 0 );
// move 2
BOOL bChangeDir = FALSE;
int nDir;
nDir = RUN_MOVE_IfArrived( pUnit );
if( nDir != -1 )
{ // 到达目的地了
pUnit->Draw.nDir = nDir;
if( pUnit->Status.nParam4 == DUSE ) // 预设堵塞
{
#ifdef _DEBUG_OFFSET_
TestOff( pUnit, "AAA1\n" );
#endif //_DEBUG_OFFSET_
pUnit->Status.nTaskID = DUSE; // 堵塞
pUnit->nCounter = 0;
}
else
{
pUnit->Status.bDone = TRUE;
}
return TRUE;
}
else
{
// set dir
int nState = pDraw->nState-pDraw->nDir;
pDraw->nDir = pUnit->MarchTrack[pUnit->StepNum];
// Dong Hai
if(RUN_GetNextForward(pDraw,pUnit)==TRUE){return TRUE;}
// Dong Hai
// Assert(pDraw->nDir==255);
pUnit->StepNum++;
// set state
//pDraw->nState = nDirState[pDraw->nDir];
pDraw->nState = pDraw->nDir+nState;
// set current position
//BOOL bOdd = pDraw->nYLast%2;
BOOL bOdd = pDraw->nY&1;
pDraw->nX = (WORD)(pDraw->nX+MAP_ptSenser[bOdd][0][pDraw->nDir].x);
pDraw->nY = (WORD)(pDraw->nY+MAP_ptSenser[bOdd][0][pDraw->nDir].y);
// set offset
pDraw->ptOff.x -= MAP_Lib.szItem.cx*ptDDD[pDraw->nDir].x>>1;
pDraw->ptOff.y -= MAP_Lib.szItem.cy*ptDDD[pDraw->nDir].y>>1;
// set move flag
bStep = TRUE;
}
// move data
if( !bChangeDir )
{
int bMove = CTRL_UNIT_Move( pDraw, pUnit->nType );
if( bMove == 0 )
{ // 被堵住
bChangeDir = TRUE;
}
else if( bMove == 1 )
{
//pUnit->bSlow = FALSE;
CTRL_SetSTG( &pUnit->Draw, ZHAOZE, FALSE );
}
else if( bMove == 2 )
{
//pUnit->bSlow = TRUE; // 遇到沼泽地
CTRL_SetSTG( &pUnit->Draw, ZHAOZE, TRUE );
}
else if( bMove > 2 )
{ // 遇到自己的城门
// 给城门发开门的命令
struct CTRL_TASK_STRUCT Task;
CTRL_TASK_Clear( &Task );
Task.nID = bMove; // 城门的ID
Task.nTaskID = KAIMEN;
Task.bDone = TRUE;
CTRL_TASK_DeployByComputer( pUnit->Draw.nPlayer, &Task );
pUnit->StepNum--;
pDraw->nX = pDraw->nXLast;
pDraw->nY = pDraw->nYLast;
pDraw->ptOff.x = pDraw->ptOffLast.x;
pDraw->ptOff.y = pDraw->ptOffLast.y;
#ifdef _MAP_COMPRESS_
pDraw->nCol = MAP_Lib.AniSeq[pDraw->nFile].nAniSeq[pDraw->nState][pDraw->nFrame]+MAP_Lib.AniSeq[pDraw->nFile].nOffset;
pDraw->nRow = 0;//(WORD)MAP_Lib.AniSeq[pDraw->nFile].ptAniSeq[pDraw->nState][pDraw->nFrame].y;
#else
pDraw->nCol = (WORD)MAP_Lib.AniSeq[pDraw->nFile].ptAniSeq[pDraw->nState][pDraw->nFrame].x;
pDraw->nRow = (WORD)MAP_Lib.AniSeq[pDraw->nFile].ptAniSeq[pDraw->nState][pDraw->nFrame].y;
#endif
return FALSE;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -