📄 cbattle.cpp
字号:
m_pGame->GetDisplay()->Clear();
m_pRender->Render();
m_pGame->ShowFPS();
m_pGame->GetDisplay()->Present();
}
else
WaitMessage();
}
_out:
return 1;
}
int CBattle::EnemyTurn()
{
MSG msg;
BOOL bEnemyAction[LOA_MAX_BATTLE_ENEMY];
int i;
for(i=0;i<LOA_MAX_BATTLE_ENEMY;i++)
bEnemyAction[i]=false;
int index=0;
while(m_pGame->IsPlayGame())
{
if(PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
{
if(!GetMessage(&msg, NULL,0,0))
return msg.wParam;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else if(m_pGame->IsActive())
{
while(1)
{
if(!m_pEnemy[index]->bShow ||(m_pEnemy[index]->pRole!=NULL && m_pEnemy[index]->pRole->bDead==TRUE))
{
index++;
if(index>=LOA_MAX_BATTLE_ENEMY)
break;
}
else
break;
}
if(index>=LOA_MAX_BATTLE_ENEMY)
{
BOOL bCanReturn=true;
for(int i=0;i<LOA_MAX_BATTLE_ENEMY;i++)
{
if(m_pEnemy[i]->bShow && m_pEnemy[i]->nCurrentState!=LOA_BATTLE_STATE_WAIT)
{
bCanReturn=false;
break;
}
}
if(bCanReturn)
return 1;
else
goto _next;
}
if(!bEnemyAction[index])
{
if(m_pEnemy[index]->bShow)
{
EnemyAI(index);
if(m_pEnemy[index]->m_RoleCmd.iCmd==LOA_CMD_NORMAL_ATTACK || m_pEnemy[index]->m_RoleCmd.iCmd==LOA_CMD_ATTACK_2)
{
m_pEnemy[index]->nCurrentState=LOA_BATTLE_STATE_ATTACK;
}
else if(m_pEnemy[index]->m_RoleCmd.iCmd==LOA_CMD_DEFEND)
{
m_pEnemy[index]->nCurrentState=LOA_BATTLE_STATE_DEFEND;
}
else if(m_pEnemy[index]->m_RoleCmd.iCmd==LOA_CMD_USE_GOOD)
{
m_pEnemy[index]->nCurrentState=LOA_BATTLE_STATE_DEFEND;
STGood*pGood;
if(m_pGame->GetGoodsDataBase()->FindData( m_pEnemy[index]->pRole->GoodsData[ m_pEnemy[index]->m_RoleCmd.iCmdParam ],&pGood ))
{
m_pEnemy[index]->pRole->DelGoods(m_pEnemy[index]->m_RoleCmd.iCmdParam);
m_pEnemy[index]->pRole->UseGood(pGood);
CRenderBattleText*pText=new CRenderBattleText;
pText->CreateTask();
pText->InitRender(m_pGame,80,m_nPosY[index],RGB(0,255,0),2,500,"HP+%d MP+",pGood->AddHp,pGood->AddMp);
m_pRender->AddTask(pText);
}
}
else if(m_pEnemy[index]->m_RoleCmd.iCmd==LOA_CMD_MAGIC)
{
m_pEnemy[index]->nCurrentState=LOA_BATTLE_STATE_DEFEND;
STMagic*pMagic;
if(m_pGame->GetMagicDataBase()->FindData( m_pEnemy[index]->pRole->MagicData[ m_pEnemy[index]->m_RoleCmd.iCmdParam ],&pMagic ))
{
m_pEnemy[index]->pRole->Mp-=abs(pMagic->nChangeMp);
if(pMagic->nChangeHp>0)
{
CMagic*pRenderMagic=new CMagic;
pRenderMagic->InitMagic(m_pGame,pMagic,450,180);
pRenderMagic->CreateTask();
m_pRender->AddTask(pRenderMagic);
CRenderBattleText*pText=new CRenderBattleText;
pText->CreateTask();
pText->InitRender(m_pGame,80,m_nPosY[index],RGB(0,255,0),2,500,"HP+%d",pMagic->nChangeHp);
m_pRender->AddTask(pText);
m_pEnemy[index]->pRole->Hp+=pMagic->nChangeHp;
if(m_pEnemy[index]->pRole->Hp>m_pEnemy[index]->pRole->MaxHp)
m_pEnemy[index]->pRole->Hp=m_pEnemy[index]->pRole->MaxHp;
}
else
{
CMagic*pRenderMagic=new CMagic;
pRenderMagic->InitMagic(m_pGame,pMagic,450,180);
pRenderMagic->CreateTask();
m_pRender->AddTask(pRenderMagic);
int RealAttack=abs(pMagic->nChangeHp)-m_pPlayer->pRole->Defend-rand()%m_pPlayer->pRole->Level+rand()%m_pEnemy[index]->pRole->Level;
if(RealAttack<0)
RealAttack=5;
if(m_pPlayer->pRole->Level<8)
{
if(RealAttack>m_pPlayer->pRole->MaxHp/6)
RealAttack=m_pPlayer->pRole->MaxHp/6;
}
CRenderBattleText*pText=new CRenderBattleText;
pText->CreateTask();
pText->InitRender(m_pGame,450,180,RGB(255,0,0),2,500,"HP-%d",RealAttack);
m_pRender->AddTask(pText);
m_pPlayer->pRole->Hp-=RealAttack;
if(m_pPlayer->pRole->Hp<=0)
{
m_pPlayer->pRole->bDead=true;
m_pPlayer->pRole->Hp=0;
}
}
}
}
else
{
CRenderBattleText*pText=new CRenderBattleText;
pText->CreateTask();
pText->InitRender(m_pGame,80,m_nPosY[index],RGB(255,255,255),2,1000,"%s逃跑了",m_pEnemy[index]->pRole->szName);
m_pRender->AddTask(pText);
m_pEnemy[index]->bShow=false;
}
}
else
{
m_pEnemy[index]->nCurrentState=LOA_BATTLE_STATE_WAIT;
}
bEnemyAction[index]=true;
}
else
{
if(m_pEnemy[index]->bShow && m_pEnemy[index]->nCurrentState==LOA_BATTLE_STATE_WAIT)
{
index++;
continue;
}
}
_next:
m_pGame->GetMapSurface()->ShowAniTileToAniSurface(); //更新动态图块
m_pGame->GetDisplay()->Clear();
m_pRender->Render();
m_pGame->ShowFPS();
m_pGame->GetDisplay()->Present();
}
else
WaitMessage();
}
return 1;
}
int CBattle::BattleLoop()
{
MSG msg;
m_pGame->FadeIn();
while(m_pGame->IsPlayGame())
{
if(PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
{
if(!GetMessage(&msg, NULL,0,0))
return msg.wParam;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else if(m_pGame->IsActive())
{
BOOL bBattleOk=true;
for(int i=0;i<LOA_MAX_BATTLE_ENEMY;i++)
{
if(m_pEnemy[i]->bShow==TRUE)
bBattleOk=false;
}
if(bBattleOk)
{
int exp=0;
int money=0;
for(int i=0;i<LOA_MAX_BATTLE_ENEMY;i++)
{
if(m_pEnemy[i]->pRole)
{
money+=m_pEnemy[i]->pRole->Money;
exp+=m_pEnemy[i]->pRole->Exp;
}
}
m_pPlayer->pRole->AddMoney(money);
int level=m_pPlayer->pRole->Level;
m_pPlayer->pRole->AddWeaponExp(exp/2);
m_pPlayer->pRole->AddDefendExp(exp/2);
CMessageBox msgbox;
msgbox.ShowMessageBox(m_pGame,LOA_MSG_BOX_OK,"战斗胜利!获得经验值%d",exp);
msgbox.ShowMessageBox(m_pGame,LOA_MSG_BOX_OK,"战斗胜利!获得金钱%d",money);
m_pPlayer->pRole->AddExp(exp);
if(m_pPlayer->pRole->Level!=level)
{
msgbox.ShowMessageBox(m_pGame,LOA_MSG_BOX_OK,"升级到%d级",m_pPlayer->pRole->Level);
}
break;
}
m_pBattleMenu->EnableMenu(true);
PlayerTurn();
EnemyTurn();
if(m_pPlayer->pRole->bDead)//dead
{
if(bNeedBattleWin)
{
GameOver();
return -1;
}
else
break;
}
}
else
WaitMessage();
}
return 1;
}
BOOL CRenderBattleRole::InitRender(CGame*pGame,CBattle*pBattle,STBattleRole*pPlayer,STBattleRole*pEnemy[],int nPosY[])
{
LOA_ASSERT(pGame);
LOA_ASSERT(pPlayer);
LOA_ASSERT(pEnemy);
LOA_ASSERT(pBattle);
m_pGame=pGame;
m_pPlayer=pPlayer;
m_pBattle=pBattle;
m_pEnemy[0]=pEnemy[0];
m_pEnemy[1]=pEnemy[1];
m_pEnemy[2]=pEnemy[2];
m_nPosY[0]=nPosY[0];
m_nPosY[1]=nPosY[1];
m_nPosY[2]=nPosY[2];
return true;
}
BOOL CRenderBattleRole::IsRenderComplete()
{
return false;
}
void CRenderBattleRole::Release()
{
}
void CRenderBattleRole::RenderRole(STBattleRole*pRole)
{
switch(pRole->nCurrentState)
{
case LOA_BATTLE_STATE_WAIT:
{
if(!pRole->pStayAni)
break;
m_pGame->GetDisplay()->ColorKeyBlt(pRole->CurPosX,
pRole->CurPosY,
pRole->pStayAni->pSurface->GetDDrawSurface(),
&pRole->pStayAni->aRect[pRole->pStayAni->nCurrentFrame]);
if(pRole->pStayAni->pEffect)
{
if(pRole->pStayAni->nKeyFrame==pRole->pStayAni->nCurrentFrame)
{
CRenderEffect*pRenderEffect=new CRenderEffect;
pRenderEffect->InitEffect(m_pGame,pRole->pStayAni->xEffectShow,pRole->pStayAni->yEffectShow,pRole->pStayAni->pEffect);
pRenderEffect->CreateTask();
m_pBattle->GetRender()->AddTask(pRenderEffect);
}
}
if(timeGetTime() - pRole->pStayAni->dwOldTime > pRole->pStayAni->dwDelay)
{
pRole->pStayAni->dwOldTime=timeGetTime();
pRole->CurPosX+=pRole->pStayAni->aXOffsite[pRole->pStayAni->nCurrentFrame];
pRole->CurPosY+=pRole->pStayAni->aYOffsite[pRole->pStayAni->nCurrentFrame];
pRole->pStayAni->nCurrentFrame++;
if(pRole->pStayAni->nCurrentFrame>=pRole->pStayAni->nFrames)
{
pRole->pStayAni->nCurrentFrame=0;
pRole->CurPosX=pRole->ShowPosX;
pRole->CurPosY=pRole->ShowPosY;
}
}
}
break;
case LOA_BATTLE_STATE_ATTACK:
{
if(!pRole->pAttackAni)
break;
if(pRole->pAttackAni->nCurrentFrame==0)
{
if(pRole->m_RoleCmd.bToPlayer)
{
pRole->CurPosY=180+m_pPlayer->pAttackAni->Height-pRole->pAttackAni->Height;
}
else
{
if(pRole->m_RoleCmd.nObject!=-1)
{
pRole->CurPosY=m_nPosY[pRole->m_RoleCmd.nObject]+m_pEnemy[pRole->m_RoleCmd.nObject]->pAttackAni->Height-pRole->pAttackAni->Height;
}
}
}
m_pGame->GetDisplay()->ColorKeyBlt(pRole->CurPosX,
pRole->CurPosY,
pRole->pAttackAni->pSurface->GetDDrawSurface(),
&pRole->pAttackAni->aRect[pRole->pAttackAni->nCurrentFrame]);
if(pRole->pAttackAni->nKeyFrame==pRole->pAttackAni->nCurrentFrame)
{
CRenderBattleText*pText=new CRenderBattleText;
if(pRole!=m_pPlayer) //攻击玩家
{
if(rand()%5==0) //1/5的几率自动防御
{
pText->InitRender(m_pGame,450,180,RGB(255,0,0),2,500,"HP-%d",m_pPlayer->pRole->DefendRole(pRole->pRole));
m_pPlayer->nCurrentState=LOA_BATTLE_STATE_DEFEND;
}
else
{
pText->InitRender(m_pGame,450,180,RGB(255,0,0),2,500,"HP-%d",pRole->pRole->AttackRole(m_pPlayer->pRole));
m_pPlayer->nCurrentState=LOA_BATTLE_STATE_BE_ATTACK;
}
}
else
{
if(pRole->m_RoleCmd.nObject==-1)
{
for(int i=0;i<LOA_MAX_BATTLE_ENEMY;i++)
{
if(m_pEnemy[i]->bShow)
{
m_pEnemy[i]->nCurrentState=LOA_BATTLE_STATE_BE_ATTACK;
}
}
}
else
{
pText->InitRender(m_pGame,80,m_nPosY[pRole->m_RoleCmd.nObject],RGB(255,0,0),2,500,"HP -%d",m_pPlayer->pRole->AttackRole(m_pEnemy[m_pPlayer->m_RoleCmd.nObject]->pRole));
if(m_pEnemy[pRole->m_RoleCmd.nObject]->pRole->bDead)
{
m_pEnemy[pRole->m_RoleCmd.nObject]->nCurrentState=LOA_BATTLE_STATE_DEAD;
}
else if(m_pEnemy[pRole->m_RoleCmd.nObject]->bShow)
{
m_pEnemy[pRole->m_RoleCmd.nObject]->nCurrentState=LOA_BATTLE_STATE_BE_ATTACK;
}
}
}
pText->CreateTask();
m_pBattle->GetRender()->AddTask(pText);
}
if(pRole->pAttackAni->pEffect)
{
if(pRole->pAttackAni->nKeyFrame==pRole->pAttackAni->nCurrentFrame)
{
CRenderEffect*pRenderEffect=new CRenderEffect;
if(pRole->m_RoleCmd.bToPlayer)
{
pRenderEffect->InitEffect(m_pGame,pRole->pAttackAni->xEffectShow,pRole->pAttackAni->yEffectShow,pRole->pAttackAni->pEffect);
}
else
{
pRenderEffect->InitEffect(m_pGame,80,m_nPosY[pRole->m_RoleCmd.nObject],pRole->pAttackAni->pEffect);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -