Code:
// FlowNode - Dialog
// Created for "CRYTHIC" by Simon Mahalsky
//
// Dialog-Node for Crythic. It manages a conversation with NPCs
#include "StdAfx.h"
#include "Game.h"
#include "GameCVars.h"
#include "GameActions.h"
#include "HUD/HUD.h"
#include "IHardwareMouse.h"
#include "Nodes/G2FlowBaseNode.h"
#include <IActorSystem.h>
#include <StringUtils.h>
class CFlowNode_Dialog:public CFlowBaseNode, public IHardwareMouseEventListener, public IInputEventListener
{
private:
SActivationInfo* m_actInfo;
unsigned int m_iCursorCounter;
bool b_active;
bool b_select;
bool b_button;
string m_key;
Vec2i i_mPos;
public:
CFlowNode_Dialog::CFlowNode_Dialog(SActivationInfo* pActInfo)
{
b_active=false;
b_select=false;
b_button=false;
}
~CFlowNode_Dialog()
{
if(gEnv->pHardwareMouse)
{
gEnv->pHardwareMouse->RemoveListener(this);
}
if(GetISystem() && GetISystem()->GetIInput())
{
GetISystem()->GetIInput()->RemoveEventListener(this);
}
}
enum EInputPorts
{
EIP_Activate=0,
EIP_Deactivate,
// Messages:
EIP_MsgOne,
EIP_MsgTwo,
EIP_MsgThree,
EIP_MsgFour,
EIP_MsgFive,
};
enum EOutputPorts
{
EOP_Message,
EOP_Done,
};
virtual void GetMemoryStatistics(ICrySizer *s)
{
s->Add(*this);
}
virtual void GetConfiguration(SFlowNodeConfig& config)
{
static const SInputPortConfig in_ports[]=
{
InputPortConfig_Void("Activate", _HELP("Activate")),
InputPortConfig_Void("Deactivate", _HELP("Deactivate")),
InputPortConfig<string>("MsgOne", _HELP("MsgOne"), 0, _UICONFIG("dt=text")),
InputPortConfig<string>("MsgTwo", _HELP("MsgTwo"), 0, _UICONFIG("dt=text")),
InputPortConfig<string>("MsgThree", _HELP("MsgThree"), 0, _UICONFIG("dt=text")),
InputPortConfig<string>("MsgFour", _HELP("MsgFour"), 0, _UICONFIG("dt=text")),
InputPortConfig<string>("MsgFive", _HELP("MsgFive"), 0, _UICONFIG("dt=text")),
{0}
};
static const SOutputPortConfig out_ports[]=
{
OutputPortConfig_Void("Message", _HELP("Message")),
OutputPortConfig_Void("Done", _HELP("Done")),
{0}
};
config.pInputPorts=in_ports;
config.pOutputPorts=out_ports;
config.sDescription=_HELP("Dialog");
config.SetCategory(EFLN_WIP);
}
virtual void ProcessEvent(EFlowEvent event, SActivationInfo* pActInfo)
{
switch(event)
{
case eFE_Initialize:
{
if(gEnv->pHardwareMouse)
{
gEnv->pHardwareMouse->AddListener(this);
}
if(GetISystem()&&GetISystem()->GetIInput())
{
GetISystem()->GetIInput()->AddEventListener(this);
}
b_active=false;
b_button=false;
b_select=false;
Movement(true);
Mouse(false);
break;
}
case eFE_Activate:
{
if(IsPortActive(pActInfo, EIP_Activate))
{
b_active=true;
CHUD* pHUD=g_pGame->GetHUD();
if(pHUD==0)
{
return;
}
const string msgOne=GetPortString(pActInfo, EIP_MsgOne);
const string msgTwo=GetPortString(pActInfo, EIP_MsgTwo);
const string msgThree=GetPortString(pActInfo, EIP_MsgThree);
const string msgFour=GetPortString(pActInfo, EIP_MsgFour);
const string msgFive=GetPortString(pActInfo, EIP_MsgFive);
pHUD->DisplayCrythicDialog(msgOne, msgTwo, msgThree, msgFour, msgFive);
Movement(false);
Mouse(true);
// Hier das Dialog-Menü ausblenden
}
break;
}
}
}
virtual bool OnInputEventUI( const SInputEvent &event )
{
return false;
}
virtual bool OnInputEvent(const SInputEvent &rInputEvent)
{
if(!b_active)
{
return false;
}
if(rInputEvent.keyId==GetKeyID(m_key) && rInputEvent.state==eIS_Pressed)
{
b_button=!b_button;
if(b_button)
{
Movement(false);
Mouse(true);
}
else
{
Movement(true);
Mouse(false);
}
}
else if(rInputEvent.keyId==eKI_Mouse1 && rInputEvent.state==eIS_Pressed && b_button)
{
// Code fehlt
}
return false;
}
virtual void OnHardwareMouseEvent(int iX,int iY,EHARDWAREMOUSEEVENT eHardwareMouseEvent)
{
if(b_active)
{
if(eHardwareMouseEvent==HARDWAREMOUSEEVENT_LBUTTONDOWN)
{
b_select=true;
}
else if(eHardwareMouseEvent==HARDWAREMOUSEEVENT_LBUTTONUP)
{
b_select=false;
i_mPos=Vec2i(iX, iY);
}
//const string g_message=FCom(return_command, return_value);
const string g_message="#TEST-VALUE#";
ActivateOutput(m_actInfo, EOP_Done, true);
ActivateOutput(m_actInfo, EOP_Message, g_message);
}
}
private:
void CFlowNode_Dialog::Movement(bool enable)
{
IActionMapManager *pActionMapManager=gEnv->pGame->GetIGameFramework()->GetIActionMapManager();
if(enable)
{
if(pActionMapManager)
{
pActionMapManager->EnableFilter("no_move", false);
pActionMapManager->EnableFilter("no_mouse", false);
}
}
else
{
if(pActionMapManager)
{
pActionMapManager->EnableFilter("no_move", true);
pActionMapManager->EnableFilter("no_mouse", true);
}
}
}
void CFlowNode_Dialog::Mouse(bool enable)
{
if(enable)
{
gEnv->pHardwareMouse->IncrementCounter();
++m_iCursorCounter;
}
else
{
while(m_iCursorCounter>0)
{
gEnv->pHardwareMouse->DecrementCounter();
m_iCursorCounter--;
}
}
}
string CFlowNode_Dialog::FCom(const char *command, const char *value)
{
string ret;
if(strcmp(command, "returnMessage"))
{
return ret=value;
}
else
{
return ret="";
}
}
EKeyId CFlowNode_Dialog::GetKeyID(string sKey)
{
if(!strcmpi(sKey, "0"))
return eKI_0;
else if(!strcmpi(sKey, "1"))
return eKI_1;
else if(!strcmpi(sKey, "2"))
return eKI_2;
else if(!strcmpi(sKey, "3"))
return eKI_3;
else if(!strcmpi(sKey, "4"))
return eKI_4;
else if(!strcmpi(sKey, "5"))
return eKI_5;
else if(!strcmpi(sKey, "6"))
return eKI_6;
else if(!strcmpi(sKey, "7"))
return eKI_7;
else if(!strcmpi(sKey, "8"))
return eKI_8;
else if(!strcmpi(sKey, "9"))
return eKI_9;
else if(!strcmpi(sKey, "F1"))
return eKI_F1;
else if(!strcmpi(sKey, "F2"))
return eKI_F2;
else if(!strcmpi(sKey, "F3"))
return eKI_F3;
else if(!strcmpi(sKey, "F4"))
return eKI_F4;
else if(!strcmpi(sKey, "F5"))
return eKI_F5;
else if(!strcmpi(sKey, "F6"))
return eKI_F6;
else if(!strcmpi(sKey, "F7"))
return eKI_F7;
else if(!strcmpi(sKey, "F8"))
return eKI_F8;
else if(!strcmpi(sKey, "F9"))
return eKI_F9;
else if(!strcmpi(sKey, "F10"))
return eKI_F10;
else if(!strcmpi(sKey, "NUM0"))
return eKI_NP_0;
else if(!strcmpi(sKey, "NUM1"))
return eKI_NP_1;
else if(!strcmpi(sKey, "NUM2"))
return eKI_NP_2;
else if(!strcmpi(sKey, "NUM3"))
return eKI_NP_3;
else if(!strcmpi(sKey, "NUM4"))
return eKI_NP_4;
else if(!strcmpi(sKey, "NUM5"))
return eKI_NP_5;
else if(!strcmpi(sKey, "NUM6"))
return eKI_NP_6;
else if(!strcmpi(sKey, "NUM7"))
return eKI_NP_7;
else if(!strcmpi(sKey, "NUM8"))
return eKI_NP_8;
else if(!strcmpi(sKey, "NUM9"))
return eKI_NP_9;
else if(!strcmpi(sKey, "NUMENTER"))
return eKI_NP_Enter;
else if(!strcmpi(sKey, "MOUSE1"))
return eKI_Mouse1;
else if(!strcmpi(sKey, "MOUSE2"))
return eKI_Mouse2;
else if(!strcmpi(sKey, "MOUSE3"))
return eKI_Mouse3;
else if(!strcmpi(sKey, "MOUSE4"))
return eKI_Mouse4;
else if(!strcmpi(sKey, "MOUSE5"))
return eKI_Mouse5;
else if(!strcmpi(sKey, "MOUSE6"))
return eKI_Mouse6;
else if(!strcmpi(sKey, "MOUSE7"))
return eKI_Mouse7;
else if(!strcmpi(sKey, "MOUSE8"))
return eKI_Mouse8;
else if(!strcmpi(sKey, "DOWN"))
return eKI_Down;
else if(!strcmpi(sKey, "UP"))
return eKI_Up;
else if(!strcmpi(sKey, "LEFT"))
return eKI_Left;
else if(!strcmpi(sKey, "RIGHT"))
return eKI_Right;
else if(!strcmpi(sKey, "A"))
return eKI_A;
else if(!strcmpi(sKey, "B"))
return eKI_B;
else if(!strcmpi(sKey, "C"))
return eKI_C;
else if(!strcmpi(sKey, "D"))
return eKI_D;
else if(!strcmpi(sKey, "E"))
return eKI_E;
else if(!strcmpi(sKey, "F"))
return eKI_F;
else if(!strcmpi(sKey, "G"))
return eKI_G;
else if(!strcmpi(sKey, "H"))
return eKI_H;
else if(!strcmpi(sKey, "I"))
return eKI_I;
else if(!strcmpi(sKey, "J"))
return eKI_J;
else if(!strcmpi(sKey, "K"))
return eKI_K;
else if(!strcmpi(sKey, "L"))
return eKI_L;
else if(!strcmpi(sKey, "M"))
return eKI_M;
else if(!strcmpi(sKey, "N"))
return eKI_N;
else if(!strcmpi(sKey, "O"))
return eKI_O;
else if(!strcmpi(sKey, "P"))
return eKI_P;
else if(!strcmpi(sKey, "Q"))
return eKI_Q;
else if(!strcmpi(sKey, "R"))
return eKI_R;
else if(!strcmpi(sKey, "S"))
return eKI_S;
else if(!strcmpi(sKey, "T"))
return eKI_T;
else if(!strcmpi(sKey, "U"))
return eKI_U;
else if(!strcmpi(sKey, "V"))
return eKI_V;
else if(!strcmpi(sKey, "W"))
return eKI_W;
else if(!strcmpi(sKey, "X"))
return eKI_X;
else if(!strcmpi(sKey, "Y"))
return eKI_Y;
else if(!strcmpi(sKey, "Z"))
return eKI_Z;
else
return eKI_NP_0;
}
};
REGISTER_FLOW_NODE("Crythic:Dialog", CFlowNode_Dialog);