📄 cbrun.cpp
字号:
}
}
if( bChangeDir )
{ // 方向改变了
pUnit->StepNum--;
pDraw->nX = pDraw->nXLast;
pDraw->nY = pDraw->nYLast;
pDraw->ptOff.x = pDraw->ptOffLast.x;
pDraw->ptOff.y = pDraw->ptOffLast.y;
// Dong Hai
if(pUnit->MarchTrack[pUnit->StepNum-1]==8)
{
pUnit->StepNum--;
pDraw->nLayer--;
}
if(pUnit->MarchTrack[pUnit->StepNum-1]==9)
{
pUnit->StepNum--;
pDraw->nLayer++;
}
// Dong Hai
#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
#ifdef _DEBUG_OFFSET_
TestOff( pUnit, "AAA2\n" );
#endif //_DEBUG_OFFSET_
pUnit->Status.nTaskID = DUSE; // 被档住了,堵塞
pUnit->nCounter = 0;
return TRUE;
}
}
#ifdef _DEBUG
if( pUnit->StepNum > 0 )
{
Assert( pUnit->MarchTrack[pUnit->StepNum-1] == pDraw->nDir );
if( pUnit->MarchTrack[pUnit->StepNum-1] != pDraw->nDir )
{
pDraw->nDir = pUnit->MarchTrack[pUnit->StepNum-1];
// WriteLogFile( "off.log", "Dir\n" );
}
}
#endif
Assert( abs(pDraw->ptOff.x)==abs(pDraw->ptOff.y)*2
|| pDraw->ptOff.x==0 || pDraw->ptOff.y==0 );
#ifdef _DEBUG_OFFSET_
if( !(abs(pDraw->ptOff.x)==abs(pDraw->ptOff.y)*2
|| pDraw->ptOff.x==0 || pDraw->ptOff.y==0) )
{
// WriteLogFile( "off.log", "abs\n" );
}
#endif // _DEBUG_OFFSET_
// move 1
// if( pUnit->bSlow == FALSE
int bFast = -1;
if( EYE_IfUnitIsCavalry( pUnit ) )
bFast = 2;
else
bFast = 1;
if( CTRL_GetSTG( &pUnit->Draw, ZHAOZE ) == TRUE )
{
bFast--;
}
if( CTRL_GetSTG( &pUnit->Draw, JIANSU ) == TRUE )
bFast = 0;
else if( CTRL_GetSTG( &pUnit->Draw, JIASU ) == TRUE )
bFast = 2;
if( bFast != 0 || ((pUnit->nCounter&1) == 1 && bFast == 0) )
{
if( bFast == 2 )
{
if( pDraw->ptOff.x == 2 || pDraw->ptOff.x == -2
|| pDraw->ptOff.y == 1 || pDraw->ptOff.y == -1 )
{
pDraw->ptOff.x = 0, pDraw->ptOff.y = 0;
}
else
{
pDraw->ptOff.x += ptDD[pDraw->nDir].x<<1;
pDraw->ptOff.y += ptDD[pDraw->nDir].y<<1;
}
}
else
{
pDraw->ptOff.x += ptDD[pDraw->nDir].x;
pDraw->ptOff.y += ptDD[pDraw->nDir].y;
}
// Dong Hai
RUN_DrawUpAndDown(pDraw);
// Dong Hai
// change frame
if( MAP_Lib.AniSeq[pDraw->nFile].nMaxSequence[pDraw->nState] != 0
&& (pUnit->nCounter&1) == 1 )
pDraw->nFrame = ( nFrame+1 )%MAP_Lib.AniSeq[pDraw->nFile].nMaxSequence[pDraw->nState];
#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
}
Assert( pDraw->ptOff.x >= -44 && pDraw->ptOff.y <= 44
&& pDraw->ptOff.y >= -22 && pDraw->ptOff.y <= 22 );
#ifdef _DEBUG_OFFSET_
if( !(pDraw->ptOff.x >= -44 && pDraw->ptOff.y <= 44
&& pDraw->ptOff.y >= -22 && pDraw->ptOff.y <= 22) )
{
pUnit->Draw.ptOff.x = pUnit->Draw.ptOff.y = 0;
// WriteLogFile( "off.log", "Move\n" );
}
#endif //_DEBUG_OFFSET_
return bStep;
}
void RUN_MoveUnitTest( struct UNIT_STRUCT *pUnit )
{
}
///////////////////////////////
///////////////////////////////
// 当状态是JIANZAO时调用
// 主要步骤:
// 1,是否是第一次进入建造函数
// 1.1,判断是否有人已经建造该建筑了
// 1.1.1,否,建造该建筑,并将同部队的所有士兵(将领)都置位
// 1.1.2,是,判断是否已经在该建筑内部了
// 1.1.2.1,否,隐藏自己
// 2,给建筑增加血点
// 3,该建筑的血格是否已满
// 3.1,是,则结束状态
// 4,计数器增加1
// 注意:1.1.1修改了本部队所有士兵和将领的任务及其参数
void RUN_CreateBuild( struct UNIT_STRUCT *pUnit )
{
WORD arTroop[GENERAL_TROOP_MAX];
int nTrp;
struct UNIT_STRUCT *pU=NULL; // 被建造的建筑的指针,本部队其他士兵的指针,将领指针
int i, j;
//added by tian yue
int nJingYanGrade[10]={200,500,1000,1800,3000,5000,8000,12000,18000,27000};
Assert( EYE_IfUnitIsWorker( pUnit )
|| EYE_IfUnitIsWorkerGen( pUnit ) );
// 1,是否是第一次进入建造函数
if( pUnit->nCounter == 0 )
{ // 第一次时,要创建该单元
// 对于工人部队,只有第一个到达目的地的人才能创建该单元
// 1.1,判断是否有人已经建造该建筑了
if( pUnit->Task.nTaskIDEx == 1 )
{
if( !RUN_CREATE_IfEnoughMoney( pUnit->Draw.nPlayer, pUnit->Status.nTaskIDEx2 ) )
{ // 钱不够了,结束
pUnit->Status.bDone = TRUE;
return;
}
if( EYE_GetGeneral( pUnit ) == NULL )
{ // 没有将领带着了,结束
pUnit->Status.bDone = TRUE;
return;
}
if( pUnit->Status.nParam2 != pUnit->Draw.nX
|| pUnit->Status.nParam3 != pUnit->Draw.nY )
{
#ifdef _DEBUG
for( int x=0; x<PLAYER_UNIT_MAX; x++ )
{
struct UNIT_STRUCT *pUB = &GAME.Players[pUnit->Draw.nPlayer].Unit[x];
Assert( pUB->Draw.nFile != pUnit->Task.nTaskIDEx2
|| pUB->Status.nTaskID != JIANZAOZHONG
|| pUnit->Status.nParam2 != pUB->Draw.nX
|| pUnit->Status.nParam3 != pUB->Draw.nY );
}
#endif
//pUnit->Status.bDone = TRUE;
// 设置堵塞
#ifdef _DEBUG_OFFSET_
TestOff( pUnit, "Build\n" );
#endif //_DEBUG_OFFSET_
pUnit->Status.nTaskID = DUSE; // 堵塞
pUnit->nCounter = 0;
return;
}
// 1.1.1,否,建造该建筑,并将同部队的所有士兵(将领)都置位
// 真正走到了目的地,表示还没有人抢先
// set player
// 给要被建造的建筑设置游戏君主
DWORD codeU = MAP_Lib.Unit[pUnit->Status.nTaskIDEx2].nItems[0];
struct MAP_UNIT_CODE_STRUCT stctU;
MAP_UnitDeCode( codeU, &stctU );
stctU.nPlayer = pUnit->Draw.nPlayer;
codeU = MAP_UnitEnCode( stctU );
if( EYE_IfUnitIsSoldier( pUnit ) )
{
pU = MAP_GetUnit( pUnit->Soldier.nGenID );
if( pU == NULL || EYE_IfUnitIsDead( pU ) ) // 没将了,结束
{
pUnit->Status.bDone = TRUE;
return;
}
}
// 得到与同一个部队的其他单元
nTrp = GENERAL_TROOP_MAX;
EYE_GetUnitInGroup( 1, pUnit->nID, arTroop, &nTrp );
Assert( nTrp >= 0 );
// 检测此处是否能够建造建筑
int nXNext, nYNext;
BOOL bOdd = pUnit->Draw.nY&1;
BOOL bSame = TRUE;
WORD codeUEx;
for( i=0; i< MAP_nLocationNum[MAP_Lib.Unit[stctU.nFile].nLocationSize]; i++ )
{
nXNext = pUnit->Draw.nX + MAP_ptLocation[bOdd][i].x;
nYNext = pUnit->Draw.nY + MAP_ptLocation[bOdd][i].y;
codeUEx = MAP_GetUnitDataEx( nXNext, nYNext );
if( codeUEx != MAP_DATA_NONE )
{ // 发现在应该建造建筑的位置上有其它单元
bSame = FALSE;
if( codeUEx == pUnit->nID )
{
bSame = TRUE; // 是自己
}
// 得到将领
else if( EYE_IfUnitIsSoldier( pUnit )
&& codeUEx == pUnit->Soldier.nGenID )
{ // 这个单元是本部队的将领
bSame = TRUE; // 是自己的将领
}
else
{
for( j=0; j<nTrp; j++ )
{
if( codeUEx == arTroop[j] )
{ // 这个单元是本部队的,可以忽略
bSame = TRUE; break;
}
}
}
if( !bSame ) break;
// 如果本部队的其他士兵走到建筑区域里来了,
// 则强行命令其终止移动,进入建造状态
pU = MAP_GetUnit( codeUEx );
Assert( pU );
Assert( !EYE_IfUnitIsDead( pU ) );
if( pU->Task.nTaskID != JIANZAO )
{
bSame = FALSE;
break; // 不是建造任务,则不算
}
// 在这里不包括自己
if( pU->Status.nTaskID != JIANZAO )
{
Assert( pU->Task.bIRQ == FALSE );
Assert( pU->Status.bIRQ == FALSE );
//pU->Status.bDone = TRUE;
// 必须这样设置才行
// pU->Task.bIRQ = TRUE; // 给未来的状态设置不可中断
pU->Draw.ptOff.x = pU->Draw.ptOff.y = 0;
// 对应于 AAA
//---
// 走进建筑
CTRL_UNIT_InUnit( pU );
// 不可中断
pU->Status.bIRQ = TRUE;
//---
}
}
}
if( !bSame )
{ // 在应该建造建筑的位置上有非本部队的其它单元,建造失败
OutputDebugString( "RUN_CreateUnit Error(5): cannot build here!\n" );
pUnit->Status.bDone = TRUE;
goto CREATE_FAILED;
}
pU->Draw.ptOff.x = pU->Draw.ptOff.y = 0;
//---
// 自己走进建筑
CTRL_UNIT_InUnit( pUnit );
// 设置自己的任务为不可中断
pUnit->Status.bIRQ = TRUE;
//---
// create
// 创建单元
Assert( pUnit->Status.nParam1 != MAP_DATA_NONE );
int ret = CTRL_UNIT_Create( pUnit->Status.nParam1, pUnit->Status.nParam2, pUnit->Status.nParam3, codeU, FALSE );
//BOOL ret = CTRL_UNIT_Create( pUnit->Draw.nLayer, pUnit->Draw.nX, pUnit->Draw.nY, codeU, FALSE );
if( ret == MAP_DATA_NONE ) goto CREATE_FAILED; // 创建失败
// 花钱
if( !RUN_CREATE_Consume( stctU.nPlayer, stctU.nFile ) )
{
Assert( 1==0 ); // 不可能没钱
goto CREATE_FAILED; // 没钱了
}
// 重新设置该建筑单元的血格
// Warning : 在这里定义一个与外部同名的变量,有错。
// 起码看起来是这样。
//struct UNIT_STRUCT *pU = MAP_GetUnit( ret );
pU = MAP_GetUnit( ret );
Assert( pU );
Assert( EYE_IfUnitIsBuild( pU ) );
pU->nLife = 0;
pU->Draw.nCol = 1 + MAP_Lib.AniSeq[26].nOffset; // 设置初始动画帧
pU->Draw.nRow = 0;
// 设置该建筑的任务
struct CTRL_TASK_STRUCT Task;
CTRL_TASK_Clear( &Task );
Task.nID = pU->nID;
Task.nTaskID = JIANZAOZHONG;
Task.nTaskIDEx = pUnit->nID;
Task.bIRQ = TRUE;
Task.bDone = TRUE;
CTRL_TASK_DeployByComputer( pUnit->Draw.nPlayer, &Task );
// Aug.8, 先暂停一轮,为了修改一个提前完工的Bug
pU->bPause = TRUE;
// 成功的话,将领要把他手下的士兵的nTaskIDEx都设置为该单元的ID
// 非常不结构化的地方,不应该在此处修改单元的任务结构
// 士兵则要先找到将领,在将部队内所有士兵的nTaskIDEx设置为该单元的ID
for( i=0; i<nTrp; i++ )
{
pU = MAP_GetUnit( arTroop[i] );
Assert( pU );
Assert( EYE_IfUnitIsSoldier( pU ) );
// 对尚未到达目的地的单元设置新的命令
// nTaskIDEx中存放的是移动方式,目的地是单元,
// nParam1中存放的是新建的建筑ID
// 如果本单元的状态是移动,可以判断出是否走到新建的建筑附近,结束移动状态
// 如果状态已经是建造了,则nTaskIDEx无用,而根据nParam1可以直接知道新建的建筑,为其加血点
// 注意:
// 只有该单元也是建造任务,而且尚未进入建筑时有效,否则有Bug
if( pU->Task.nTaskID == JIANZAO )
{
if( pU->Status.bIRQ == FALSE )
{
//pU->Status.nTaskID = DUSE;
//pU->nCounter = 0;
pU->bPause = 1; // 本轮暂停
//pU->Draw.ptOff.x = pU->Draw.ptOff.y = 0;
//pU->Status.nTaskID = JIANZAO;
//pU->Status.bDone = TRUE; // 结束当前任务
struct CTRL_TASK_STRUCT task;
CTRL_TASK_Clear( &task );
task.nID = pU->nID;
task.nTaskID = JIANZAO;
task.nTaskIDEx = 2; // MOUSE_HITRESULT_UNIT
task.nParam1 = ret;
task.bDone = TRUE;
CTRL_TASK_DeployByComputer( pUnit->Draw.nPlayer, &task );
}
else if( pU->Status.nTaskIDEx == 1 ) // 已经在建筑内部的
{// 包括自己
pU->Status.nTaskID = JIANZAO;
pU->Task.nTaskIDEx = 2;
pU->Status.nTaskIDEx = 2;
pU->Task.nParam1 = ret;
pU->Status.nParam1 = ret;
pU->nCounter = 0;
pU->Task.bDone = 0;
Assert( pU->Status.bDone == FALSE );
}
}
else
{
OutputDebugString( "c" );
}
}
// 得到本单元的将领
pU = EYE_GetGeneral( pUnit );
Assert( pU );
Assert( EYE_IfUnitIsWorkerGen( pU ) );
// 在创建建筑之后,nTaskIDEx的内容存放该单元的ID
// 非常不结构化的地方,不应该在此处修改单元的任务结构
// nTaskIDEx中存放的是移动方式,目的地是单元,
// nParam1中存放的是新建的建筑ID
// 如果本单元的状态是移动,可以判断出是否走到新建的建筑附近,结束移动状态
// 如果状态已经是建造了,则nTaskIDEx无用,而根据nParam1可以直接知道新建的建筑,为其加血点
// 注意:
// 只有该单元也是建造任务,而且尚未进入建筑时有效,否则有Bug
if( pU->Task.nTaskID == JIANZAO )
{
if( pU->Status.bIRQ == FALSE )
{
//pU->Status.nTaskID = DUSE;
//pU->nCounter = 0;
pU->bPause = 1; // 本轮暂停
//pU->Draw.ptOff.x = pU->Draw.ptOff.y = 0;
//pU->Status.nTaskID = JIANZAO;
//pU->Status.bDone = TRUE; // 结束当前任务
struct CTRL_TASK_STRUCT task;
CTRL_TASK_Clear( &task );
task.nID = pU->nID;
task.nTaskID = JIANZAO;
task.nTaskIDEx = 2; // MOUSE_HITRESULT_UNIT
task.nParam1 = ret;
task.bDone = TRUE;
CTRL_TASK_DeployByComputer( pUnit->Draw.nPlayer, &task );
}
else if( pU->Status.nTaskIDEx == 1 ) // 已经在建筑内部的
{ // 包括自己
pU->Status.nTaskID = JIANZAO;
pU->Task.nTaskIDEx = 2;
pU->Status.nTaskIDEx = 2;
pU->Task.nParam1 = ret;
pU->Status.nParam1 = ret;
pU->nCounter = 0;
pU->Task.bDone = 0;
Assert( pU->Status.bDone == FALSE );
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -