📄 gtask.cc
字号:
//GTask.cc
/*/////////////////////////////////////////////////////////////////
李亦
liease@163.com 4040719
2006-8-12
/*/////////////////////////////////////////////////////////////////
#include "rpg/gobjects/GTask.h"
#include "rpg/gobjects/GPlayer.h"
#include "rpg/gobjects/GNpc.h"
#include "rpg/RPGChat.h"
namespace RPG
{
GTask* g_pGTask = NULL;
IMPLEMENT_CONOBJECT(GTask);
GTaskBase::GTaskBase()
{
m_dwTaskType = GTB_NONE;
m_pGoal = NULL;
m_pRequire = NULL;
m_pPremium = NULL;
m_pFromNpc = NULL;
m_pToNpc = NULL;
m_pFromNpc = NULL;
//m_pOwnerNpc = NULL;
m_pGoalObject = NULL;
//m_pGoalResult = NULL;
dMemset(&m_data0,0,sizeof(m_data0));
}
BOOL GTaskBase::ExecuteGoalNpc(GNpc* pToNpc,GPlayer* pPlayer,EGTaskStates nState)
{
//GoalNpc有以下处理
// 1.Npc为空,则不作处理
// 2.GoalObject为NULL,则作Npc访问处理
// 3.Goal为NULL,奖励在此Npc处理(不检测Goal了)
// 4.否则 失去GoalObject,生成Goal,玩家再找源Npc即可
if(!pToNpc || !pPlayer)
return FALSE;
GGOODSREF ref(pPlayer,pToNpc,this);
if(nState == GTS_RUNNING2)
{
if(HasGoalObject())
{
ref.bCreateGoods = FALSE;
if(!CheckOutGoalObject(ref))
return FALSE;
TakeOutGoalObject(ref);
}
//生成目标结果
if(HasGoal())
{
CreateGoal(ref);
}
}//if
else if(nState == GTS_PREMIUM)
{
//在ExecuteTask 中执行了
//if(HasPremium())
//{
// //if(!CheckPremium(ref))
// // return FALSE;
// ExecutePremium(ref);
//}
}
return TRUE;
}
//BOOL GTaskBase::ExecuteTask(GNpc* pNpc,GPlayer* pPlayer,EGTaskStates nState)
//{
// //如果存在 GoalResult的话,先检测GoalResult且执行
// /// 1.
// if(!pNpc || !pPlayer)
// return FALSE;
//
//#ifdef TGE_RPGCLIENT
// EGameTipTexts nTip = TIP_NULL;
// if(nState == GTS_FREE2)
// nTip = TIP_TASK_ACCEPT;
// else if(nState == GTS_RUNNING2)
// nTip = TIP_TASK_FINISHED;
// else if(nState == GTS_OUTDATE)
// nTip = TIP_TASK_OUTDATE;
//
// if(nTip != TIP_NULL)
// RPGChat::OutputTipF(nTip, GetTaskName());
//#endif
// return TRUE;
//}
EGTaskStates GTaskBase::UpdateTaskState(GPlayer* pChar,GNpc* pNpc,EGTaskStates nState)
{
//已完成状态
if(nState >= GTS_FINISHED)
return nState;
if(nState == GTS_PREMIUM)
{
if(IsToNpcRunning2() )
{
if(!IsToNpc(pNpc) )/*IsOwnerNpc(pNpc)*/
nState = GTS_IDLE;
}
return nState;
}
//已接受,但未完成状态
else if(nState >= GTS_RUNNING)
{
if(pChar->IsTaskFinished(this))
return GTS_FINISHED;
if(IsToNpcRunning2())
{
if(IsToNpc(pNpc))
nState = GTS_RUNNING2;
else//if(IsOwnerNpc(pNpc))
nState = GTS_RUNNING;
}
else
{
if(IsTask())
{
if(pChar->IsAllPieceFinished((GTask*)this ) && CheckGoal(pChar))
nState = GTS_RUNNING2;
else
nState = GTS_RUNNING;
}
else
{
if(CheckGoal(pChar))
nState = GTS_RUNNING2;
else
nState = GTS_RUNNING;
}//else
}
return nState;
}
//未接受状态
else if(IsFitRequire(pChar))
return GTS_FREE2;
return GTS_FREE;
////已完成状态
//if(nState >= GTS_FINISHED)
//{
// return nState;
//}
////已接受,但未完成状态
//else if(nState > GTS_FREE2)
//{
// if(CheckGoal(pChar))
// return GTS_RUNNING2;
// return GTS_RUNNING;
//}
////未接受状态
//if(IsFitRequire(pChar))
// return GTS_FREE2;
//return GTS_FREE;
}
//EGTaskStates GTaskBase::GetTaskState(GPlayer* pChar,EGTaskStates nState)
//{
// //已完成状态
// if(nState >= GTS_FINISHED)
// {
// return nState;
// }
//
// //已接受,但未完成状态
// else if(nState > GTS_FREE2)
// {
// if(CheckGoal(pChar))
// return GTS_RUNNING2;
// return GTS_RUNNING;
// }
//
// //未接受状态
// if(IsFitRequire(pChar))
// return GTS_FREE2;
// return GTS_FREE;
//}
GDialog* GTaskBase::GetStateDialog(EGTaskStates nState)
{
if(nState >= GTS_AMOUNT || nState < GTS_IDLE)
return NULL;
if(m_arStateDialogs[nState] == NULL)
nState = GTS_IDLE;
return m_arStateDialogs[nState];
}
#ifdef TGE_RPGCLIENT
void GTaskBase::UpdateToNpcState(EGTaskStates nState)
{
if(!m_pToNpc)
return;
if(/*nState <= GTS_FREE2 ||*/ nState >= GTS_FINISHED)
{
m_pToNpc->SetTaskLock(FALSE);
//m_pToNpc->UpdateAllTaskNpc(pPlayer);
}
else if(nState > GTS_RUNNING)
{
m_pToNpc->SetTaskLock(TRUE);
}
}
#endif
GTaskPiece::GTaskPiece()
{
m_dwTaskType = GTB_PIECE;
//m_nOrder = -1;
dMemset(m_arStateDialogs,0,sizeof(m_arStateDialogs));
m_pOwnerTask = NULL;
m_nIndex = -1;
}
BOOL GTaskPiece::ExecuteTask(GNpc* pNpc,GPlayer* pPlayer,EGTaskStates nState)
{
//如果存在 GoalResult的话,先检测GoalResult且执行
/// 1.在完成任务片段时,执行后面尽可能的任务片段
BOOL bRet = FALSE;
if(!m_pOwnerTask && !pNpc || !pPlayer)
return FALSE;
GGOODSREF ref(pPlayer,pNpc,this);
switch(nState)
{
//未接受任务,且满足条件
case GTS_FREE:
if(IsFitRequire(pPlayer))
{
bRet = pPlayer->ReadyAcceptTask(m_pOwnerTask, pNpc, m_nIndex);
if(bRet && m_pToNpc)
m_pToNpc->SetTaskLock(TRUE);
}
break;
case GTS_FREE2:
bRet = pPlayer->AcceptTask(m_pOwnerTask, pNpc, m_nIndex);
if(bRet)
{
#ifdef TGE_RPGCLIENT
RPGChat::OutputTipF(TIP_TPIECE_ACCEPT, GetTaskName());
#endif
//生成GoalObject
if(HasGoalObject())
CreateGoalObject(ref);
if(m_pToNpc)
m_pToNpc->SetTaskLock(TRUE);
}//if
//if(bRet && m_pToNpc)
// m_pToNpc->SetTaskLock(TRUE);
break;
case GTS_RUNNING:
if(CheckGoal(pPlayer))
bRet = pPlayer->ReadyGoalTask(m_pOwnerTask, pNpc, m_nIndex);
break;
//任务已接受,满足目标要求,
case GTS_RUNNING2:
if(ExecuteGoal(pPlayer))
{
bRet = pPlayer->GoalTask(m_pOwnerTask, pNpc, m_nIndex);
if(bRet)
{
if(!HasPremium())
bRet = pPlayer->PremiumTask(m_pOwnerTask, pNpc, m_nIndex);
//执行下1尽可能多的任务片段
//ExecuteAllPiecePossible(pNpc,pPlayer,m_nIndex+1);
if(m_pToNpc)
{
m_pToNpc->SetTaskLock(FALSE);
m_pToNpc->UpdateAllTaskNpc(pPlayer);
}
}
}
break;
case GTS_PREMIUM:
if(HasPremium())
{
bRet = ExecutePremium(pPlayer);
if(bRet)
{
#ifdef TGE_RPGCLIENT
RPGChat::OutputTipF(TIP_TPIECE_FINISHED, GetTaskName());
#endif
pPlayer->PremiumTask(m_pOwnerTask, pNpc, m_nIndex);
if(m_pToNpc)
{
m_pToNpc->SetTaskLock(FALSE);
m_pToNpc->UpdateAllTaskNpc(pPlayer);
}
}//if
}//if
break;
}
//#ifdef TGE_RPGCLIENT
// RPGChat::OutputTipF(TIP_TPIECE_OUTDATE, GetTaskName());
//#endif
return bRet;
}
/////////////////////////////////////////////////////////////////
// class GTask 构造函数 /析构函数
GTask::GTask()
{
m_dwTaskType = GTB_TASK;
}
GTask::~GTask()
{
}
//EGTaskStates GTask::UpdateTaskState(GPlayer* pChar,GNpc* pNpc,EGTaskStates nState)
//{
// //已完成状态
// if(nState >= GTS_FINISHED)
// return nState;
//
// if(nState == GTS_PREMIUM)
// {
// if(IsOwnerNpc(pNpc) && IsToNpcRunning2())
// {
// state = GTS_IDLE;
// }
// return nState;
// }
//
//
// //已接受,但未完成状态
// else if(nState >= GTS_RUNNING)
// {
// if(pChar->IsTaskFinished(this))
// return GTS_FINISHED;
//
// if(IsToNpc(pNpc))
// {
// nState = GTS_RUNNING2;
// }
// else
// {
// if(CheckGoal(pChar))
// nState = GTS_RUNNING2;
// else
// nState = GTS_RUNNING;
// }
// return nState;
// }
//
// //未接受状态
// else if(IsFitRequire(pChar))
// return GTS_FREE2;
//
//
// return GTS_FREE;
//}
BOOL GTask::IsToNpcOfPiece(GNpc* pNpc)
{
U32 n;
GTaskPiece* pPiece;
for(n=0;n<m_arTaskPieces.size(); n++)
{
pPiece = m_arTaskPieces[n];
if(pPiece==NULL)
continue;
if(pPiece->IsToNpc(pNpc))
return TRUE;
}//for
return FALSE;
}
BOOL GTask::ExecuteTask(GNpc* pNpc,GPlayer* pPlayer,EGTaskStates nState)
{
//如果存在 GoalResult的话,先检测GoalResult且执行
/// 1.
BOOL bRet = FALSE;
if(!pNpc || !pPlayer)
return FALSE;
GGOODSREF ref(pPlayer,pNpc,this);
switch(nState)
{
//未接受任务,且满足条件
case GTS_FREE:
if(IsFitRequire(pPlayer))
{
bRet = pPlayer->ReadyAcceptTask(this,pNpc);
if(bRet && m_pToNpc)
m_pToNpc->SetTaskLock(TRUE);
}
break;
case GTS_FREE2:
bRet = pPlayer->AcceptTask(this,pNpc);
if(bRet)
{
#ifdef TGE_RPGCLIENT
RPGChat::OutputTipF(TIP_TASK_ACCEPT, GetTaskName());
#endif
//生成GoalObject
if(HasGoalObject())
CreateGoalObject(ref);
if(m_pToNpc)
m_pToNpc->SetTaskLock(TRUE);
if(m_pOwnerNpc)
{
m_pOwnerNpc->SetRunningTask(TRUE);
m_pOwnerNpc->SetTaskNpc(TRUE);
}
}//if
break;
case GTS_RUNNING:
//if(pPlayer->IsAllPieceFinished(this))
{
if(CheckGoal(pPlayer))
bRet = pPlayer->ReadyGoalTask(this,pNpc);
}//if(pPlayer->IsAllPieceFinished(this))
break;
//任务已接受,满足目标要求,
case GTS_RUNNING2:
//if(pPlayer->IsAllPieceFinished(this))
{
//if(ExecuteGoal(pPlayer))
if(TakeOutGoal(pPlayer))
{
bRet = pPlayer->GoalTask(this,pNpc);
if(!HasPremium())
{
bRet = pPlayer->PremiumTask(this,pNpc);
if(m_pOwnerNpc)
{
//m_pOwnerNpc->SetTaskNpc(FALSE);
m_pOwnerNpc->SetRunningTask(FALSE);
m_pOwnerNpc->UpdateAllTaskNpc(pPlayer);
}
if(m_pToNpc)
{
m_pToNpc->SetTaskLock(FALSE);
m_pToNpc->UpdateAllTaskNpc(pPlayer);
}
}
}//if(ExecuteGoal(pPlayer))
}//if(pPlayer->IsAllPieceFinished(this))
break;
case GTS_PREMIUM:
if(HasPremium())
{
bRet = ExecutePremium(pPlayer);
if(bRet)
{
#ifdef TGE_RPGCLIENT
RPGChat::OutputTipF(TIP_TASK_FINISHED, GetTaskName());
#endif
pPlayer->PremiumTask(this,pNpc);
if(m_pToNpc)
{
m_pToNpc->SetTaskLock(FALSE);
m_pToNpc->UpdateAllTaskNpc(pPlayer);
}
if(m_pOwnerNpc)
{
//m_pOwnerNpc->SetTaskNpc(FALSE);
m_pOwnerNpc->SetRunningTask(FALSE);
m_pOwnerNpc->UpdateAllTaskNpc(pPlayer);
}
}//if(ExecutePremium(pPlayer))
}//if(HasPremium())
break;
}
//#ifdef TGE_RPGCLIENT
// RPGChat::OutputTipF(TIP_TASK_OUTDATE, GetTaskName());
//#endif
return bRet;
}
void GTask::initPersistFields()
{
Parent::initPersistFields();
}
//void GTask::consoleInit()
//{
//}
};//namespace RPG
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -