khanat-code-old/code/ryzom/tools/leveldesign/mission_compiler_lib/step_content.cpp

3557 lines
82 KiB
C++
Raw Normal View History

2016-01-24 16:08:32 +00:00
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "mission_compiler.h"
#include "step.h"
#include "nel/ligo/primitive_utils.h"
using namespace std;
using namespace NLMISC;
using namespace NLLIGO;
// ************
// IStepContent
// ************
IStepContent *IStepContent::createStepContent(CMissionData &md, NLLIGO::IPrimitive *prim)
{
string className;
prim->getPropertyByName("class", className);
IStepContentFactory *factory = CFactoryIndirect<IStepContentFactory, string>::instance().getFactory(className);
if (factory == NULL)
{
string err = toString("Can't find factory for class '%s'", className.c_str());
throw EParseException(prim, err.c_str());
}
IStepContent *content = factory->createStepContent(md, prim);
return content;
}
void IStepContent::init(CMissionData &md, NLLIGO::IPrimitive *prim)
{
prim->getPropertyByName("name", _ContentName);
// parse the post actions
for (uint i=0; i<prim->getNumChildren(); ++i)
{
IPrimitive *child;
prim->getChild(child, i);
if (child)
{
// ok, we got one
IStepContent *sc = IStepContent::createStepContent(md, child);
if (sc)
_PostActions.push_back(sc);
}
}
}
std::string IStepContent::genStepContentCode(CMissionData &md)
{
string ret;
// call the derived class code generation
ret += genCode(md);
// generate the code for the post action
for (uint i=0; i<_PostActions.size(); ++i)
{
ret += _PostActions[i]->genCode(md);
}
return ret;
}
std::string IStepContent::genStepContentPhrase()
{
string ret;
// call ther derived class phrase generation
ret += genPhrase();
// generate the phrase for the post action
for (uint i=0; i<_PostActions.size(); ++i)
{
ret += _PostActions[i]->genPhrase();
}
return ret;
}
void IStepContent::fillJump(CMissionData &md, std::set<TJumpInfo> &jumpPoints)
{
for (uint i=0; i<_PostActions.size(); ++i)
{
_PostActions[i]->fillJump(md, jumpPoints);
}
}
////////////////////// Actions and objectives /////////////////////
class CActionJumpTo : public IStepContent
{
string _JumpTo;
void getPredefParam(uint32 &numEntry, CPhrase::TPredefParams &predef)
{
numEntry = 0;
}
public:
void init(CMissionData &md, IPrimitive *prim)
{
IStepContent::init(md, prim);
_JumpTo = md.getProperty(prim, "target", true, false);
}
string genCode(CMissionData &md)
{
if (!_JumpTo.empty())
return "jump : "+_JumpTo+NL;
else
return string();
}
void fillJump(CMissionData &md, std::set<TJumpInfo> &jumpPoints)
{
IStepContent::fillJump(md, jumpPoints);
jumpPoints.insert(TJumpInfo(_JumpTo, "", false));
}
};
REGISTER_STEP_CONTENT(CActionJumpTo, "jump_to");
// ---------------------------------------------------------------------------
class CActionRecvMoney : public IStepContent
{
string _Amount;
bool _Guild;
void getPredefParam(uint32 &numEntry, CPhrase::TPredefParams &predef)
{
numEntry = 0;
}
public:
void init(CMissionData &md, IPrimitive *prim)
{
IStepContent::init(md, prim);
_Amount = md.getProperty(prim, "amount", true, false);
_Guild = md.getProperty(prim, "guild", false, true) == "true";
// Check: if _Guild is true then check if we are in a guild mission
if (_Guild && !md.isGuildMission())
{
string err = toString("primitive(%s): 'guild' option true 1 for non guild mission.", prim->getName().c_str());
throw EParseException(prim, err.c_str());
}
}
string genCode(CMissionData &md)
{
if (!_Amount.empty())
{
string ret;
ret = "recv_money : "+_Amount;
if (_Guild)
ret += ": guild";
ret += NL;
return ret;
}
else
return string();
}
};
REGISTER_STEP_CONTENT(CActionRecvMoney, "recv_money");
// ---------------------------------------------------------------------------
class CActionRecvChargePoint : public IStepContent
{
string _Amount;
void getPredefParam(uint32 &numEntry, CPhrase::TPredefParams &predef)
{
numEntry = 0;
}
public:
void init(CMissionData &md, IPrimitive *prim)
{
IStepContent::init(md, prim);
_Amount = md.getProperty(prim, "charge_points", true, false);
}
string genCode(CMissionData &md)
{
if (!_Amount.empty())
{
string ret;
ret = "recv_charge_point : "+_Amount;
ret += NL;
return ret;
}
else
return string();
}
};
REGISTER_STEP_CONTENT(CActionRecvChargePoint, "recv_charge_point");
// ---------------------------------------------------------------------------
class CActionGiveOutpostControl : public IStepContent
{
string _OutpostName;
void getPredefParam(uint32 &numEntry, CPhrase::TPredefParams &predef)
{
numEntry = 0;
}
public:
void init(CMissionData &md, IPrimitive *prim)
{
IStepContent::init(md, prim);
_OutpostName = md.getProperty(prim, "outpost_name", true, false);
}
string genCode(CMissionData &md)
{
if (!_OutpostName.empty())
{
string ret;
ret = "give_control : "+_OutpostName;
ret += NL;
return ret;
}
else
return string();
}
};
REGISTER_STEP_CONTENT(CActionGiveOutpostControl, "give_control");
// ---------------------------------------------------------------------------
class CActionSpawnMission : public IStepContent
{
protected:
string _MissionName;
string _GiverName;
bool _Guild;
private:
void getPredefParam(uint32 &numEntry, CPhrase::TPredefParams &predef)
{
numEntry = 0;
}
public:
void init(CMissionData &md, IPrimitive *prim)
{
IStepContent::init(md, prim);
_MissionName = md.getProperty(prim, "mission_name", true, false);
_GiverName = md.getProperty(prim, "giver_name", true, false);
if (_GiverName.empty())
{
throw EParseException(prim, "giver_name is empty !");
}
_Guild = md.getProperty(prim, "guild", false, true) == "true";
// Check: if _Guild is true then check if we are in a guild mission
if (_Guild && !md.isGuildMission())
{
string err = toString("primitive(%s): 'guild' option true 1 for non guild mission.", prim->getName().c_str());
throw EParseException(prim, err.c_str());
}
}
string genCode(CMissionData &md)
{
string ret;
if (!_MissionName.empty())
{
ret = "spawn_mission : " + _MissionName + " : " + _GiverName;
if (_Guild)
ret += " : guild";
ret += NL;
}
return ret;
}
};
REGISTER_STEP_CONTENT(CActionSpawnMission, "spawn_mission");
// ---------------------------------------------------------------------------
class CActionChainMission : public CActionSpawnMission
{
public:
string genCode(CMissionData &md)
{
if (!_MissionName.empty())
{
return "chain_mission : " + _MissionName + " : " + _GiverName + NL;
}
else
return string();
}
};
REGISTER_STEP_CONTENT(CActionChainMission, "chain_mission");
// ---------------------------------------------------------------------------
class CActionEncycloUnlock : public IStepContent
{
string _AlbumThema;
void getPredefParam(uint32 &numEntry, CPhrase::TPredefParams &predef)
{
numEntry = 0;
}
public:
void init(CMissionData &md, IPrimitive *prim)
{
IStepContent::init(md, prim);
_AlbumThema = md.getProperty(prim, "album_thema", true, false);
}
string genCode(CMissionData &md)
{
if (!_AlbumThema.empty())
return "encyclo_unlock : " + _AlbumThema + NL;
else
return string();
}
};
REGISTER_STEP_CONTENT(CActionEncycloUnlock, "encyclo_unlock");
// ---------------------------------------------------------------------------
class CActionHandleCreate : public IStepContent
{
protected:
string _Group;
string _DespawnTimer;
private:
void getPredefParam(uint32 &numEntry, CPhrase::TPredefParams &predef)
{
numEntry = 0;
}
public:
void init(CMissionData &md, IPrimitive *prim)
{
IStepContent::init(md, prim);
_Group = md.getProperty(prim, "group", true, false);
_DespawnTimer = md.getProperty(prim, "despawn_timer", true, false);
}
string genCode(CMissionData &md)
{
if (!_Group.empty())
{
if (!_DespawnTimer.empty())
return "handle_create : " + _Group + " : " + _DespawnTimer + NL;
else
return "handle_create : " + _Group + NL;
}
else
return string();
}
};
REGISTER_STEP_CONTENT(CActionHandleCreate, "handle_create");
// ---------------------------------------------------------------------------
class CActionHandleRelease : public IStepContent
{
protected:
string _Group;
private:
void getPredefParam(uint32 &numEntry, CPhrase::TPredefParams &predef)
{
numEntry = 0;
}
public:
void init(CMissionData &md, IPrimitive *prim)
{
IStepContent::init(md, prim);
_Group = md.getProperty(prim, "group", true, false);
}
string genCode(CMissionData &md)
{
if (!_Group.empty())
return "handle_release : " + _Group + NL;
else
return string();
}
};
REGISTER_STEP_CONTENT(CActionHandleRelease, "handle_release");
// ---------------------------------------------------------------------------
class CActionSetEventFaction : public IStepContent
{
string _EventFaction;
void getPredefParam(uint32 &numEntry, CPhrase::TPredefParams &predef)
{
numEntry = 0;
}
public:
void init(CMissionData &md, IPrimitive *prim)
{
IStepContent::init(md, prim);
_EventFaction = md.getProperty(prim, "event_faction", true, false);
}
string genCode(CMissionData &md)
{
if (!_EventFaction.empty())
return "set_event_faction : " + _EventFaction + NL;
else
return string();
}
};
REGISTER_STEP_CONTENT(CActionSetEventFaction, "set_event_faction");
// ---------------------------------------------------------------------------
class CActionSetRespawnPoints : public IStepContent
{
string _Continent;
vector<string> _RespawnPoints;
bool _HideOthers;
void getPredefParam(uint32 &numEntry, CPhrase::TPredefParams &predef)
{
numEntry = 0;
}
public:
void init(CMissionData &md, IPrimitive *prim)
{
IStepContent::init(md, prim);
_Continent = md.getProperty(prim, "continent", true, false);
vector<string> vs;
vs = md.getPropertyArray(prim, "respawn_points", true, false);
for (uint i=0; i<vs.size(); ++i)
{
if (!vs[i].empty())
_RespawnPoints.push_back(vs[i]);
}
string s;
s = md.getProperty(prim, "hide_others", true, false);
_HideOthers = (NLMISC::toLower(s) == "true");
}
string genCode(CMissionData &md)
{
string ret;
if (_Continent.empty() || _RespawnPoints.empty())
return ret;
ret = "set_respawn_points : " + _Continent + " : ";
for (uint i = 0; i < _RespawnPoints.size(); i++)
{
ret += _RespawnPoints[i];
if (i < _RespawnPoints.size() - 1)
ret += "; ";
}
ret += string(" : ") + (_HideOthers?"true":"false");
ret += NL;
return ret;
}
};
REGISTER_STEP_CONTENT(CActionSetRespawnPoints, "set_respawn_points");
// ---------------------------------------------------------------------------
class CActionRecvFactionPoint : public IStepContent
{
string _Faction;
string _Point;
void getPredefParam(uint32 &numEntry, CPhrase::TPredefParams &predef)
{
numEntry = 0;
}
public:
void init(CMissionData &md, IPrimitive *prim)
{
IStepContent::init(md, prim);
_Faction = md.getProperty(prim, "faction", true, false);
_Point = md.getProperty(prim, "point", true, false);
}
string genCode(CMissionData &md)
{
if (!_Faction.empty() && !_Point.empty())
return string("recv_faction_point : ")+_Faction+" "+_Point+NL;
else
return string();
}
};
REGISTER_STEP_CONTENT(CActionRecvFactionPoint, "recv_faction_point");
// ---------------------------------------------------------------------------
class CActionSDBSet : public IStepContent
{
string _SDBPath;
string _SDBValue;
void getPredefParam(uint32 &numEntry, CPhrase::TPredefParams &predef)
{
numEntry = 0;
}
public:
void init(CMissionData &md, IPrimitive *prim)
{
IStepContent::init(md, prim);
_SDBPath = md.getProperty(prim, "sdb_path", true, false);
_SDBValue = md.getProperty(prim, "sdb_value", true, false);
}
string genCode(CMissionData &md)
{
string ret;
if (_SDBPath.empty() || _SDBValue.empty())
return ret;
ret = "sdb_set : " + _SDBPath + " : " + _SDBValue + NL;
return ret;
}
};
REGISTER_STEP_CONTENT(CActionSDBSet, "sdb_set");
// ---------------------------------------------------------------------------
class CActionSDBAdd : public IStepContent
{
string _SDBPath;
string _SDBValue;
void getPredefParam(uint32 &numEntry, CPhrase::TPredefParams &predef)
{
numEntry = 0;
}
public:
void init(CMissionData &md, IPrimitive *prim)
{
IStepContent::init(md, prim);
_SDBPath = md.getProperty(prim, "sdb_path", true, false);
_SDBValue = md.getProperty(prim, "sdb_value", true, false);
}
string genCode(CMissionData &md)
{
string ret;
if (_SDBPath.empty() || _SDBValue.empty())
return ret;
ret = "sdb_add : " + _SDBPath + " : " + _SDBValue + NL;
return ret;
}
};
REGISTER_STEP_CONTENT(CActionSDBAdd, "sdb_add");
// ---------------------------------------------------------------------------
class CActionSDBPlayerAdd : public IStepContent
{
string _SDBPath;
string _SDBValue;
void getPredefParam(uint32 &numEntry, CPhrase::TPredefParams &predef)
{
numEntry = 0;
}
public:
void init(CMissionData &md, IPrimitive *prim)
{
IStepContent::init(md, prim);
_SDBPath = md.getProperty(prim, "sdb_path", true, false);
_SDBValue = md.getProperty(prim, "sdb_value", true, false);
}
string genCode(CMissionData &md)
{
string ret;
if (_SDBPath.empty() || _SDBValue.empty())
return ret;
ret = "sdb_player_add : " + _SDBPath + " : " + _SDBValue + NL;
return ret;
}
};
REGISTER_STEP_CONTENT(CActionSDBPlayerAdd, "sdb_player_add");
// ---------------------------------------------------------------------------
class CActionSDBSetPvPPath : public IStepContent
{
string _SDBPath;
void getPredefParam(uint32 &numEntry, CPhrase::TPredefParams &predef)
{
numEntry = 0;
}
public:
void init(CMissionData &md, IPrimitive *prim)
{
IStepContent::init(md, prim);
_SDBPath = md.getProperty(prim, "sdb_path", true, false);
}
string genCode(CMissionData &md)
{
string ret;
if (_SDBPath.empty())
return ret;
ret = "sdb_set_pvp_path : " + _SDBPath + NL;
return ret;
}
};
REGISTER_STEP_CONTENT(CActionSDBSetPvPPath, "sdb_set_pvp_path");
// ---------------------------------------------------------------------------
class CActionSDBClearPvPPath : public IStepContent
{
void getPredefParam(uint32 &numEntry, CPhrase::TPredefParams &predef)
{
numEntry = 0;
}
public:
void init(CMissionData &md, IPrimitive *prim)
{
IStepContent::init(md, prim);
}
string genCode(CMissionData &md)
{
string ret = "sdb_clear_pvp_path" + NL;
return ret;
}
};
REGISTER_STEP_CONTENT(CActionSDBClearPvPPath, "sdb_clear_pvp_path");
// ---------------------------------------------------------------------------
class CActionRecvFame : public IStepContent
{
string _Faction;
string _Fame;
bool _Guild;
void getPredefParam(uint32 &numEntry, CPhrase::TPredefParams &predef)
{
numEntry = 0;
}
public:
void init(CMissionData &md, IPrimitive *prim)
{
IStepContent::init(md, prim);
_Faction = md.getProperty(prim, "faction", true, false);
_Fame = md.getProperty(prim, "value", true, false);
_Guild = md.getProperty(prim, "guild", false, true) == "true";
// Check: if _Guild is true then check if we are in a guild mission
if (_Guild && !md.isGuildMission())
{
string err = toString("primitive(%s): 'guild' option true 1 for non guild mission.", prim->getName().c_str());
throw EParseException(prim, err.c_str());
}
}
string genCode(CMissionData &md)
{
if (!_Faction.empty() && !_Fame.empty())
{
string ret;
ret = "recv_fame : "+_Faction+" "+_Fame;
if (_Guild)
ret += ": guild";
ret += NL;
return ret;
}
else
return string();
}
};
REGISTER_STEP_CONTENT(CActionRecvFame, "recv_fame");
// ---------------------------------------------------------------------------
struct TItemDesc
{
string ItemName;
string ItemQuant;
string ItemQual;
};
class CActionRecvItem : public IStepContent
{
string _BotGiver;
vector<TItemDesc> _Items;
bool _QualSpec;
bool _Group;
bool _Guild;
void getPredefParam(uint32 &numEntry, CPhrase::TPredefParams &predef)
{
numEntry = 0;
}
public:
void init(CMissionData &md, IPrimitive *prim)
{
_BotGiver =md.getProperty(prim, "npc_name", true, false);
vector<string> vs;
vs = md.getPropertyArray(prim, "item/quantity/quality", true, false);
for (uint i=0; i<vs.size(); ++i)
{
vector<string> args;
if (!vs[i].empty())
{
explode(vs[i], string(" "), args, false);
if (args.size() != 3 && args.size() != 2)
{
string err = toString("can't find 2 or 3 part (<item> <quant> [<qual>]) in item line '%s', found %u instead", vs[i].c_str(), args.size());
throw EParseException(prim, err.c_str());
}
if (i == 0)
{
_QualSpec = (args.size() == 3);
}
else if (args.size() == 3 && !_QualSpec)
{
string err = toString("can't mix item with quality and item without quality in item line '%s'", vs[i].c_str());
throw EParseException(prim, err.c_str());
}
TItemDesc item;
item.ItemName = args[0];
item.ItemQuant = args[1];
if (_QualSpec)
item.ItemQual = args[2];
_Items.push_back(item);
}
}
string s;
s = md.getProperty(prim, "group", true, false);
_Group = (NLMISC::toLower(s) == "true");
_Guild = md.getProperty(prim, "guild", false, true) == "true";
// Check: if _Guild is true then check if we are in a guild mission
if (_Guild && !md.isGuildMission())
{
string err = toString("primitive(%s): 'guild' option true 1 for non guild mission.", prim->getName().c_str());
throw EParseException(prim, err.c_str());
}
IStepContent::init(md, prim);
}
string genCode(CMissionData &md)
{
string ret;
for (uint i=0; i<_Items.size(); ++i)
{
TItemDesc &item = _Items[i];
ret += "recv_item : "+item.ItemName+" "+item.ItemQuant;
if (_QualSpec)
ret +=" "+item.ItemQual;
if (!_BotGiver.empty())
ret += " : "+_BotGiver;
if (_Group)
ret += " : group";
if (_Guild)
ret += ": guild";
ret += NL;
}
return ret;
}
};
REGISTER_STEP_CONTENT(CActionRecvItem, "recv_item");
// ---------------------------------------------------------------------------
class CActionRecvNamedItem : public IStepContent
{
vector<TItemDesc> _Items;
bool _Group;
bool _Guild;
void getPredefParam(uint32 &numEntry, CPhrase::TPredefParams &predef)
{
numEntry = 0;
}
public:
void init(CMissionData &md, IPrimitive *prim)
{
vector<string> vs;
vs = md.getPropertyArray(prim, "item/quantity", true, false);
for (uint i=0; i<vs.size(); ++i)
{
vector<string> args;
if (!vs[i].empty())
{
explode(vs[i], string(" "), args, false);
if (args.size() != 1 && args.size() != 2)
{
string err = toString("can't find 1 or 2 part (<item> [<quant>]) in item line '%s', found %u instead", vs[i].c_str(), args.size());
throw EParseException(prim, err.c_str());
}
TItemDesc item;
item.ItemName = args[0];
item.ItemQuant = "1";
if(args.size()>=2 && atoi(args[1].c_str())>0)
item.ItemQuant = args[1];
_Items.push_back(item);
}
}
string s;
s = md.getProperty(prim, "group", true, false);
_Group = (NLMISC::toLower(s) == "true");
_Guild = md.getProperty(prim, "guild", false, true) == "true";
// Check: if _Guild is true then check if we are in a guild mission
if (_Guild && !md.isGuildMission())
{
string err = toString("primitive(%s): 'guild' option true 1 for non guild mission.", prim->getName().c_str());
throw EParseException(prim, err.c_str());
}
IStepContent::init(md, prim);
}
string genCode(CMissionData &md)
{
string ret;
for (uint i=0; i<_Items.size(); ++i)
{
TItemDesc &item = _Items[i];
ret += "recv_named_item : "+item.ItemName+" "+item.ItemQuant;
if (_Group)
ret += " : group";
if (_Guild)
ret += ": guild";
ret += NL;
}
return ret;
}
};
REGISTER_STEP_CONTENT(CActionRecvNamedItem, "recv_named_item");
// ---------------------------------------------------------------------------
class CActionDestroyItem : public IStepContent
{
struct CItemDesc
{
TItemDesc Desc;
bool QuantSpec;
bool QualSpec;
};
string _BotDestroyer;
vector<CItemDesc> _Items;
bool _Guild;
void getPredefParam(uint32 &numEntry, CPhrase::TPredefParams &predef)
{
numEntry = 0;
}
public:
void init(CMissionData &md, IPrimitive *prim)
{
// get the bot who destroys the item
_BotDestroyer =md.getProperty(prim, "npc_name", true, false);
// read list of items to destroy
vector<string> vs;
vs = md.getPropertyArray(prim, "item/quantity/quality", true, false);
for (uint i=0; i<vs.size(); ++i)
{
vector<string> args;
if (!vs[i].empty())
{
// parse
explode(vs[i], string(" "), args, false);
if (args.size()<1 || args.size()>3)
{
string err = toString("can't find 1, 2 or 3 part (<item> [<quant>] [<qual>]) in item line '%s', found %u instead", vs[i].c_str(), args.size());
throw EParseException(prim, err.c_str());
}
// add the item in desc
CItemDesc item;
item.Desc.ItemName = args[0];
if(args.size()>=2)
{
item.QuantSpec= true;
item.Desc.ItemQuant = args[1];
}
if(args.size()>=3)
{
item.QualSpec= true;
item.Desc.ItemQual = args[2];
}
_Items.push_back(item);
}
}
_Guild = md.getProperty(prim, "guild", false, true) == "true";
// Check: if _Guild is true then check if we are in a guild mission
if (_Guild && !md.isGuildMission())
{
string err = toString("primitive(%s): 'guild' option true 1 for non guild mission.", prim->getName().c_str());
throw EParseException(prim, err.c_str());
}
IStepContent::init(md, prim);
}
string genCode(CMissionData &md)
{
string ret;
for (uint i=0; i<_Items.size(); ++i)
{
CItemDesc &item = _Items[i];
ret += "destroy_item : "+item.Desc.ItemName;
if (item.QuantSpec)
ret +=" "+item.Desc.ItemQuant;
if (item.QualSpec)
ret +=" "+item.Desc.ItemQual;
if (!_BotDestroyer.empty())
ret += " : "+_BotDestroyer;
if (_Guild)
ret += ": guild";
ret += NL;
}
return ret;
}
};
REGISTER_STEP_CONTENT(CActionDestroyItem, "destroy_item");
// ---------------------------------------------------------------------------
class CActionRecvXp : public IStepContent
{
string _Skill;
sint32 _Value;
void getPredefParam(uint32 &numEntry, CPhrase::TPredefParams &predef)
{
numEntry = 0;
}
public:
void init(CMissionData &md, IPrimitive *prim)
{
IStepContent::init(md, prim);
_Skill = md.getProperty(prim, "skill", true, false);
_Value = atoi(md.getProperty(prim, "value", true, false).c_str());
if(_Skill.empty() || tolower(_Skill[0])!='s' || _Value<=0)
{
string err = toString("Bad skill name or value: '%s' '%d' ", _Skill.c_str(), _Value);
throw EParseException(prim, err.c_str());
}
}
string genCode(CMissionData &md)
{
if (!_Skill.empty())
return toString("recv_xp : %s %d", _Skill.c_str(), _Value) + NL;
else
return string();
}
};
REGISTER_STEP_CONTENT(CActionRecvXp, "recv_xp");
// ---------------------------------------------------------------------------
class CActionLearnAction : public IStepContent
{
string _BotGiver;
vector<string> _Actions;
bool _Group;
void getPredefParam(uint32 &numEntry, CPhrase::TPredefParams &predef)
{
numEntry = 0;
}
public:
void init(CMissionData &md, IPrimitive *prim)
{
_BotGiver = md.getProperty(prim, "npc_name", true, false);
vector<string> vs;
vs = md.getPropertyArray(prim, "actions", true, false);
for (uint i=0; i<vs.size(); ++i)
{
if (!vs[i].empty())
_Actions.push_back(vs[i]);
}
string s;
s = md.getProperty(prim, "group", true, false);
_Group = (NLMISC::toLower(s) == "true");
IStepContent::init(md, prim);
}
string genCode(CMissionData &md)
{
string ret;
if (_Actions.empty())
return ret;
ret = "learn_action : ";
for (uint i=0; i<_Actions.size(); ++i)
{
ret += _Actions[i];
if (i < _Actions.size()-1)
ret += "; ";
}
if (!_BotGiver.empty())
ret += " : "+_BotGiver;
if (_Group)
ret += " : group";
ret += NL;
return ret;
}
};
REGISTER_STEP_CONTENT(CActionLearnAction, "learn_action");
// ---------------------------------------------------------------------------
class CActionLearnBrick : public IStepContent
{
string _BotGiver;
vector<string> _Bricks;
bool _Group;
void getPredefParam(uint32 &numEntry, CPhrase::TPredefParams &predef)
{
numEntry = 0;
}
public:
void init(CMissionData &md, IPrimitive *prim)
{
_BotGiver = md.getProperty(prim, "npc_name", true, false);
vector<string> vs;
vs = md.getPropertyArray(prim, "bricks", true, false);
for (uint i=0; i<vs.size(); ++i)
{
if (!vs[i].empty())
_Bricks.push_back(vs[i]);
}
string s;
s = md.getProperty(prim, "group", true, false);
_Group = (NLMISC::toLower(s) == "true");
IStepContent::init(md, prim);
}
string genCode(CMissionData &md)
{
string ret;
// if (_Bricks.empty())
// return ret;
ret = "learn_brick : ";
for (uint i=0; i<_Bricks.size(); ++i)
{
ret += _Bricks[i];
if (i < _Bricks.size()-1)
ret += "; ";
}
if (!_BotGiver.empty())
ret += " : "+_BotGiver;
if (_Group)
ret += " : group";
ret += NL;
return ret;
}
};
REGISTER_STEP_CONTENT(CActionLearnBrick, "learn_brick");
// ---------------------------------------------------------------------------
class CActionBotChat : public IStepContent
{
protected:
string _BotName;
CPhrase _Phrase;
string _ChatMode;
void getPredefParam(uint32 &numEntry, CPhrase::TPredefParams &predef)
{
numEntry = 0;
}
public:
void init(CMissionData &md, IPrimitive *prim)
{
IStepContent::init(md, prim);
_BotName = md.getProperty(prim, "npc_name", true, false);
if (_BotName.empty())
throw EParseException(prim, "npc_name is empty !");
vector<string> vs;
vs = md.getPropertyArray(prim, "phrase", false, false);
_Phrase.initPhrase(md, prim, vs);
_ChatMode = md.getProperty(prim, "chat_type", true, false);
}
string genCode(CMissionData &md)
{
string ret;
ret = "bot_chat : "+_ChatMode+" : "+_BotName+" : "+_Phrase.genScript(md)+NL;
return ret;
}
string genPhrase()
{
return _Phrase.genPhrase();
}
};
REGISTER_STEP_CONTENT(CActionBotChat, "bot_chat");
// ---------------------------------------------------------------------------
class CActionBotEmote : public IStepContent
{
string _BotName;
string _Emote;
void getPredefParam(uint32 &numEntry, CPhrase::TPredefParams &predef)
{
numEntry = 0;
}
public:
void init(CMissionData &md, IPrimitive *prim)
{
IStepContent::init(md, prim);
_BotName = md.getProperty(prim, "npc_name", true, false);
_Emote = md.getProperty(prim, "emote", true, false);
}
string genCode(CMissionData &md)
{
string ret;
ret = "bot_emot : "+_BotName+" "+_Emote+NL;
return ret;
}
};
REGISTER_STEP_CONTENT(CActionBotEmote, "bot_emote");
// ---------------------------------------------------------------------------
class CActionAIEvent : public IStepContent
{
string _GroupName;
string _EventNumber;
void getPredefParam(uint32 &numEntry, CPhrase::TPredefParams &predef)
{
numEntry = 0;
}
public:
void init(CMissionData &md, IPrimitive *prim)
{
IStepContent::init(md, prim);
_GroupName = md.getProperty(prim, "group_name", true, false);
_EventNumber = md.getProperty(prim, "event_number", true, false);
}
string genCode(CMissionData &md)
{
string ret;
ret = "ai_event : "+_GroupName+"; "+_EventNumber+NL;
return ret;
}
};
REGISTER_STEP_CONTENT(CActionAIEvent, "ai_event");
// ---------------------------------------------------------------------------
class CActionSetTeleport : public CActionBotChat
{
string _WorldPosition;
bool _Once;
void getPredefParam(uint32 &numEntry, CPhrase::TPredefParams &predef)
{
numEntry = 0;
}
public:
void init(CMissionData &md, IPrimitive *prim)
{
CActionBotChat::init(md, prim);
_WorldPosition = md.getProperty(prim, "world_position", true, false);
string s;
prim->getPropertyByName("once", s);
_Once = (NLMISC::toLower(s) == "true");
}
string genCode(CMissionData &md)
{
string ret;
ret = "set_teleport : "+_BotName+" : "+_WorldPosition+" : ";
if (_Once)
ret += "once : ";
ret += _Phrase.genScript(md) + NL;
return ret;
}
};
REGISTER_STEP_CONTENT(CActionSetTeleport, "set_teleport");
// ---------------------------------------------------------------------------
class CActionTeleport : public IStepContent
{
string _WorldPosition;
void getPredefParam(uint32 &numEntry, CPhrase::TPredefParams &predef)
{
numEntry = 0;
}
public:
void init(CMissionData &md, IPrimitive *prim)
{
IStepContent::init(md, prim);
_WorldPosition = md.getProperty(prim, "world_position", true, false);
}
string genCode(CMissionData &md)
{
string ret;
ret = "teleport : "+_WorldPosition+NL;
return ret;
}
};
REGISTER_STEP_CONTENT(CActionTeleport, "teleport");
// ---------------------------------------------------------------------------
class CActionSetCult : public IStepContent
{
string _Cult;
void getPredefParam(uint32 &numEntry, CPhrase::TPredefParams &predef)
{
numEntry = 0;
}
public:
void init(CMissionData &md, IPrimitive *prim)
{
IStepContent::init(md, prim);
_Cult = md.getProperty(prim, "cult", true, false);
}
string genCode(CMissionData &md)
{
string ret;
ret = "set_cult : " + _Cult + NL;
return ret;
}
};
REGISTER_STEP_CONTENT(CActionSetCult, "set_cult");
// ---------------------------------------------------------------------------
class CActionSetCiv : public IStepContent
{
string _Civ;
void getPredefParam(uint32 &numEntry, CPhrase::TPredefParams &predef)
{
numEntry = 0;
}
public:
void init(CMissionData &md, IPrimitive *prim)
{
IStepContent::init(md, prim);
_Civ = md.getProperty(prim, "civ", true, false);
}
string genCode(CMissionData &md)
{
string ret;
ret = "set_civ : " + _Civ + NL;
return ret;
}
};
REGISTER_STEP_CONTENT(CActionSetCiv, "set_civ");
// ---------------------------------------------------------------------------
class CActionSetGuildCult : public IStepContent
{
string _Cult;
void getPredefParam(uint32 &numEntry, CPhrase::TPredefParams &predef)
{
numEntry = 0;
}
public:
void init(CMissionData &md, IPrimitive *prim)
{
IStepContent::init(md, prim);
_Cult = md.getProperty(prim, "cult", true, false);
}
string genCode(CMissionData &md)
{
string ret;
ret = "set_guild_cult : " + _Cult + NL;
return ret;
}
};
REGISTER_STEP_CONTENT(CActionSetGuildCult, "set_guild_cult");
// ---------------------------------------------------------------------------
class CActionSetGuildCiv : public IStepContent
{
string _Civ;
void getPredefParam(uint32 &numEntry, CPhrase::TPredefParams &predef)
{
numEntry = 0;
}
public:
void init(CMissionData &md, IPrimitive *prim)
{
IStepContent::init(md, prim);
_Civ = md.getProperty(prim, "civ", true, false);
}
string genCode(CMissionData &md)
{
string ret;
ret = "set_guild_civ : " + _Civ + NL;
return ret;
}
};
REGISTER_STEP_CONTENT(CActionSetGuildCiv, "set_guild_civ");
// ---------------------------------------------------------------------------
class CActionAddCompass : public IStepContent
{
string _NpcName;
string _PlaceName;
void getPredefParam(uint32 &numEntry, CPhrase::TPredefParams &predef)
{
numEntry = 0;
}
public:
void init(CMissionData &md, IPrimitive *prim)
{
IStepContent::init(md, prim);
_NpcName = md.getProperty(prim, "npc_to_add", true, false);
_PlaceName = md.getProperty(prim, "place_to_add", true, false);
}
string genCode(CMissionData &md)
{
string ret;
if (!_NpcName.empty())
ret = "add_compass_npc : "+_NpcName+NL;
if (!_PlaceName.empty())
ret += "add_compass_place : "+_PlaceName+NL;
return ret;
}
};
REGISTER_STEP_CONTENT(CActionAddCompass, "add_compass");
// ---------------------------------------------------------------------------
class CActionRemoveCompass : public IStepContent
{
string _NpcName;
string _PlaceName;
void getPredefParam(uint32 &numEntry, CPhrase::TPredefParams &predef)
{
numEntry = 0;
}
public:
void init(CMissionData &md, IPrimitive *prim)
{
IStepContent::init(md, prim);
_NpcName = md.getProperty(prim, "npc_to_remove", true, false);
_PlaceName = md.getProperty(prim, "place_to_remove", true, false);
}
string genCode(CMissionData &md)
{
string ret;
if (!_NpcName.empty())
ret = "remove_compass_npc : "+_NpcName+NL;
if (!_PlaceName.empty())
ret += "remove_compass_place : "+_PlaceName+NL;
return ret;
}
};
REGISTER_STEP_CONTENT(CActionRemoveCompass, "remove_compass");
// ---------------------------------------------------------------------------
class CActionFail : public IStepContent
{
void getPredefParam(uint32 &numEntry, CPhrase::TPredefParams &predef)
{
numEntry = 0;
}
public:
void init(CMissionData &md, IPrimitive *prim)
{
IStepContent::init(md, prim);
}
string genCode(CMissionData &md)
{
return string("fail")+NL;
}
};
REGISTER_STEP_CONTENT(CActionFail, "fail");
// ---------------------------------------------------------------------------
class CActionFailIfSDB : public IStepContent
{
string _Condition;
void getPredefParam(uint32 &numEntry, CPhrase::TPredefParams &predef)
{
numEntry = 0;
}
public:
void init(CMissionData &md, IPrimitive *prim)
{
IStepContent::init(md, prim);
_Condition = md.getProperty(prim, "condition", true, false);
}
string genCode(CMissionData &md)
{
return string("fail_if_sdb : ")+_Condition+NL;
}
};
REGISTER_STEP_CONTENT(CActionFailIfSDB, "fail_if_sdb");
// ---------------------------------------------------------------------------
class CActionFailMissionCat : public IStepContent
{
string _MissionCategory;
void getPredefParam(uint32 &numEntry, CPhrase::TPredefParams &predef)
{
numEntry = 0;
}
public:
void init(CMissionData &md, IPrimitive *prim)
{
IStepContent::init(md, prim);
_MissionCategory = md.getProperty(prim, "category", true, false);
}
string genCode(CMissionData &md)
{
return string("fail_mission_cat : ")+_MissionCategory+NL;
}
};
REGISTER_STEP_CONTENT(CActionFailMissionCat, "fail_mission_cat");
// ---------------------------------------------------------------------------
class CActionSystemMsg : public IStepContent
{
CPhrase _Message;
void getPredefParam(uint32 &numEntry, CPhrase::TPredefParams &predef)
{
numEntry = 0;
}
public:
void init(CMissionData &md, IPrimitive *prim)
{
IStepContent::init(md, prim);
vector<string> vs = md.getPropertyArray(prim, "msg_to_display", false, false);
_Message.initPhrase(md, prim, vs);
}
string genCode(CMissionData &md)
{
string ret;
ret = "system_msg : "+_Message.genScript(md)+NL;
return ret;
}
string genPhrase()
{
return _Message.genPhrase();
}
};
REGISTER_STEP_CONTENT(CActionSystemMsg, "system_msg");
// ---------------------------------------------------------------------------
class CActionPopupMsg : public IStepContent
{
CPhrase _Title;
CPhrase _Message;
void getPredefParam(uint32 &numEntry, CPhrase::TPredefParams &predef)
{
numEntry = 0;
}
public:
void init(CMissionData &md, IPrimitive *prim)
{
IStepContent::init(md, prim);
vector<string> vst = md.getPropertyArray(prim, "title_to_display", false, false);
vector<string> vsm = md.getPropertyArray(prim, "msg_to_display", false, false);
_Title.initPhrase(md, prim, vst);
_Message.initPhrase(md, prim, vsm);
}
string genCode(CMissionData &md)
{
string ret;
ret = "popup_msg : " + _Title.genScript(md) + " : " + _Message.genScript(md) + NL;
return ret;
}
string genPhrase()
{
return _Title.genPhrase() + _Message.genPhrase();
}
};
REGISTER_STEP_CONTENT(CActionPopupMsg, "popup_msg");
// ---------------------------------------------------------------------------
class CActionDeclareWar : public IStepContent
{
void getPredefParam(uint32 &numEntry, CPhrase::TPredefParams &predef)
{
numEntry = 0;
}
public:
void init(CMissionData &md, IPrimitive *prim)
{
IStepContent::init(md, prim);
}
string genCode(CMissionData &md)
{
return string("declare_war")+NL;
}
};
REGISTER_STEP_CONTENT(CActionDeclareWar, "declare_war");
// ---------------------------------------------------------------------------
class CActionSetConstrains : public IStepContent
{
string _Timer;
string _TimePeriod;
string _InsidePlace;
string _InsidePlaceDelay;
string _OutsidePlace;
string _OutsidePlaceDelay;
vector<string> _Wears;
void getPredefParam(uint32 &numEntry, CPhrase::TPredefParams &predef)
{
numEntry = 0;
}
public:
void init(CMissionData &md, IPrimitive *prim)
{
IStepContent::init(md, prim);
_Timer = md.getProperty(prim, "timer", true, false);
_TimePeriod = md.getProperty(prim, "time_period", true, false);
_InsidePlace = md.getProperty(prim, "inside_place", true, false);
_InsidePlaceDelay = md.getProperty(prim, "inside_place_delay", true, false);
_OutsidePlace = md.getProperty(prim, "outside_place", true, false);
_OutsidePlaceDelay = md.getProperty(prim, "outside_place_delay", true, false);
_Wears = md.getPropertyArray(prim, "wear", true, false);
}
string genCode(CMissionData &md)
{
string ret;
if (!_Timer.empty())
ret += "timer : "+_Timer+NL;
if (!_TimePeriod.empty())
{
if ( _TimePeriod == "winter"
|| _TimePeriod == "spring"
|| _TimePeriod == "summer"
|| _TimePeriod == "autumn"
|| _TimePeriod == "none")
{
ret += "season : "+_TimePeriod+NL;
}
else
ret += "day_period : "+_TimePeriod+NL;
}
if (!_InsidePlace.empty())
{
if (_InsidePlace != "none")
{
ret += "inside : "+_InsidePlace;
if (!_InsidePlaceDelay.empty())
ret += " : "+_InsidePlaceDelay;
}
else
ret += "inside";
ret += NL;
}
if (!_OutsidePlace.empty())
{
if (_OutsidePlace != "none")
{
ret += "outside : "+_OutsidePlace;
if (!_OutsidePlaceDelay.empty())
ret += " : "+_OutsidePlaceDelay;
}
else
ret += "outside";
ret += NL;
}
if (!_Wears.empty())
nlwarning("wear constraint not implemented yet");
return ret;
}
};
REGISTER_STEP_CONTENT(CActionSetConstrains, "set_constrains");
// ---------------------------------------------------------------------------
class CActionSetDesc : public IStepContent
{
CPhrase _Description;
void getPredefParam(uint32 &numEntry, CPhrase::TPredefParams &predef)
{
numEntry = 0;
}
public:
void init(CMissionData &md, IPrimitive *prim)
{
IStepContent::init(md, prim);
std::vector<string> vs = md.getPropertyArray(prim, "mission_description", false, false);
_Description.initPhrase(md, prim, vs);
}
string genCode(CMissionData &md)
{
string ret;
ret = "set_desc : "+_Description.genScript(md)+NL;
return ret;
}
string genPhrase()
{
return _Description.genPhrase();
}
};
REGISTER_STEP_CONTENT(CActionSetDesc, "set_desc");
// *****************
// CContentObjective
// *****************
// base class for step content objectives
// ---------------------------------------------------------------------------
void CContentObjective::init(CMissionData &md, IPrimitive *prim)
{
IStepContent::init(md, prim);
_HideObj = md.getProperty(prim, "hide_obj", true, false) == "true";
_OverloadObj = md.getPropertyArray(prim, "overload_objective", false, false);
_RoleplayObj = md.getPropertyArray(prim, "roleplay_objective", false, false);
uint32 numEntry;
CPhrase::TPredefParams params;
// ask derived class for predefined params
getPredefParam(numEntry, params);
// init the overload phrase
_OverloadPhrase.initPhrase(md, prim, _OverloadObj, numEntry, params);
// init the roleplay phrase
_RoleplayPhrase.initPhrase(md, prim, _RoleplayObj, numEntry, params);
// check for the 'nb_guild_members_needed' option and see if it's correct for this mission
/*string nbGuildMembersNeeded = md.getProperty(prim, "nb_guild_members_needed", false, true);
if (nbGuildMembersNeeded.empty())
nbGuildMembersNeeded = "1";
if (!fromString(nbGuildMembersNeeded.c_str(), _NbGuildMembersNeeded))
_NbGuildMembersNeeded = 1;
// Check:
if (!md.isGuildMission() && _NbGuildMembersNeeded != 1)
{
string err = toString("primitive(%s): nb_guild_members_needed != 1 for non guild mission.", prim->getName().c_str());
throw EParseException(prim, err.c_str());
}*/
}
// ---------------------------------------------------------------------------
string CContentObjective::genCode(CMissionData &md)
{
string ret;
if (_HideObj)
ret = "hide_obj"+NL;
if (!_OverloadObj.empty())
{
ret += "set_obj : " + _OverloadPhrase.genScript(md)+NL;
}
if (!_RoleplayObj.empty())
{
ret += "set_obj_rp : " + _RoleplayPhrase.genScript(md)+NL;
}
return ret;
}
// ---------------------------------------------------------------------------
/*std::string CContentObjective::genNbGuildMembersNeededOption(CMissionData &md)
{
string ret;
// If we are in a guild mission we add the 'nb_guild_members_needed' option to the script
if (md.isGuildMission())
{
ret = ": nb_guild_members_needed ";
ret += toString(_NbGuildMembersNeeded);
}
return ret;
}*/
// ---------------------------------------------------------------------------
string CContentObjective::genPhrase()
{
if (!_OverloadObj.empty())
return _OverloadPhrase.genPhrase();
else
return _RoleplayPhrase.genPhrase();
}
// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
struct TKillFaunaInfo
{
TCompilerVarName SheetName;
TCompilerVarName Quantity;
};
struct TKillRaceInfo
{
TCompilerVarName RaceName;
TCompilerVarName Quantity;
};
struct TKillPlayerInfo
{
TCompilerVarName ClanName;
TCompilerVarName MinLevel;
TCompilerVarName MaxLevel;
TCompilerVarName Quantity;
};
class CContentKill : public CContentObjective
{
vector<TKillFaunaInfo> _KillFaunas;
vector<TKillRaceInfo> _KillRaces;
TCompilerVarName _KillGroup;
vector<TCompilerVarName> _KillNpcs;
TCompilerVarName _KillNpcByNames;
TCompilerVarName _KillNpcByNamesQuantity;
TCompilerVarName _KillFactionName;
TCompilerVarName _KillFactionQuantity;
vector<string> _PredefVarName;
vector<TKillPlayerInfo> _KillPlayers;
TCompilerVarName _Place;
void getPredefParam(uint32 &numEntry, CPhrase::TPredefParams &predef)
{
if (!_KillFaunas.empty())
{
numEntry = (uint32)_KillFaunas.size();
predef.resize(numEntry);
for (uint i=0; i<_KillFaunas.size(); ++i)
{
predef[i].resize(2*(i+1));
for (uint j=0; j<i+1; ++j)
{
predef[i][2*j] = _KillFaunas[j].SheetName;
predef[i][2*j+1] = _KillFaunas[j].Quantity;
}
}
}
else if (!_KillRaces.empty())
{
numEntry = (uint32)_KillRaces.size();
predef.resize(numEntry);
for (uint i=0; i<_KillRaces.size(); ++i)
{
predef[i].resize(2*(i+1));
for (uint j=0; j<i+1; ++j)
{
predef[i][2*j] = _KillRaces[j].RaceName;
predef[i][2*j+1] = _KillRaces[j].Quantity;
}
}
}
else if (!_KillGroup.empty())
{
numEntry = 0;
predef.resize(1);
predef[0].resize(1);
predef[0][0] = _KillGroup;
}
else if (!_KillNpcs.empty())
{
numEntry = (uint32)_KillNpcs.size();
predef.resize(numEntry);
for (uint i=0; i<_KillNpcs.size(); ++i)
{
predef[i].resize(i+1);
for (uint j=0; j<i+1; ++j)
{
predef[i][j] = _KillNpcs[j];
}
}
}
else if (!_KillNpcByNames._VarValue.empty())
{
numEntry = 0;
predef.resize(1);
predef[0].resize(2);
predef[0][0] = _KillNpcByNames;
predef[0][1] =_KillNpcByNamesQuantity;
}
else if (!_KillFactionName._VarValue.empty())
{
numEntry = 0;
predef.resize(1);
predef[0].resize(2);
predef[0][0] = _KillFactionName;
predef[0][1] = _KillFactionQuantity;
}
else if(!_KillPlayers.empty())
{
numEntry = _KillPlayers.size();
predef.resize(numEntry);
for (uint i=0; i<numEntry; ++i)
{
predef[i].resize(4*(i+1));
for (uint j=0; j<i+1; ++j)
{
predef[i][j*4] = _KillPlayers[j].ClanName;
predef[i][j*4+1] = _KillPlayers[j].MinLevel;
predef[i][j*4+2] = _KillPlayers[j].MaxLevel;
predef[i][j*4+3] = _KillPlayers[j].Quantity;
}
}
}
// add optional place
if (!_Place._VarValue.empty())
{
for (uint i=0; i<predef.size(); ++i)
{
predef[i].push_back(_Place);
}
}
}
public:
void init(CMissionData &md, IPrimitive *prim)
{
vector<string> vs;
vs = md.getPropertyArray(prim, "fauna/quantity", false, false);
for (uint i=0; i<vs.size(); ++i)
{
vector<string> args;
explode(vs[i], string(" "), args, true);
if (args.size() != 2)
{
string err = toString("Syntax error in kill fauna : '%s', need <fauna_sheet_name> <quantity>", vs[i].c_str());
throw EParseException (prim, err.c_str());
}
TKillFaunaInfo kfi;
kfi.SheetName.initWithText(toString("c%u", i+1), STRING_MANAGER::creature_model, md, prim, args[0]);
kfi.Quantity.initWithText(toString("q%u", i+1), STRING_MANAGER::integer, md, prim, args[1]);
_KillFaunas.push_back(kfi);
}
vs = md.getPropertyArray(prim, "race/quantity", false, false);
for (uint i=0; i<vs.size(); ++i)
{
vector<string> args;
explode(vs[i], string(" "), args, true);
if (args.size() != 2)
{
string err = toString("Syntax error in kill race : '%s', need <race_name> <quantity>", vs[i].c_str());
throw EParseException (prim, err.c_str());
}
TKillRaceInfo kri;
kri.RaceName.initWithText(toString("r%u", i+1), STRING_MANAGER::creature_model, md, prim, args[0]);
kri.Quantity.initWithText(toString("q%u", i+1), STRING_MANAGER::integer, md, prim, args[1]);
_KillRaces.push_back(kri);
}
string s;
//s = md.getProperty(prim, "group", false, true);
vs = md.getPropertyArray(prim, "group", false, false);
if (!vs.empty())
{
if (vs.size() != 1)
{
string err = "Syntax error in kill group";
throw EParseException (prim, err.c_str());
}
_KillGroup.initWithText("group_name", STRING_MANAGER::bot_name, md, prim, vs[0] );
}
vs = md.getPropertyArray(prim, "npc", false, false);
for (uint i=0; i<vs.size(); ++i)
{
TCompilerVarName npcname;
npcname.initWithText(toString("npc%u", i+1), STRING_MANAGER::bot, md, prim, vs[i]);
_KillNpcs.push_back(npcname);
}
vs = md.getPropertyArray(prim, "clan_name/min_level/max_level/quantity", true, false);
for (uint i=0; i<vs.size(); ++i)
{
vector<string> args;
explode(vs[i], string(" "), args, true);
if (args.size() != 4)
{
string err = toString("Invalid player clan infos in '%s', need <clan_name> <min_level> <max_level> <quantity>", vs[i].c_str());
throw EParseException(prim, err.c_str());
}
if (atoi(args[1].c_str()) >= atoi(args[2].c_str()))
{
string err = toString("Invalid player clan infos in '%s', need <min_level> lower than <max_level>", vs[i].c_str());
throw EParseException(prim, err.c_str());
}
if (atoi(args[3].c_str()) <= 0)
{
string err = toString("Invalid player clan infos in '%s', need <quantity> upper than 0", vs[i].c_str());
throw EParseException(prim, err.c_str());
}
TKillPlayerInfo kp;
kp.ClanName.initWithText(toString("clan%u", i+1), STRING_MANAGER::clan, md, prim, args[0]);
kp.MinLevel.initWithText(toString("minlvl%u", i+1), STRING_MANAGER::integer, md, prim, args[1]);
kp.MaxLevel.initWithText(toString("maxlvl%u", i+1), STRING_MANAGER::integer, md, prim, args[2]);
kp.Quantity.initWithText(toString("quantity%u", i+1), STRING_MANAGER::integer, md, prim, args[3]);
_KillPlayers.push_back(kp);
}
s = md.getProperty(prim, "npc_by_name/quantity", false, false);
if (!s.empty())
{
vector<string> args;
explode(s, string(" "), args, true);
if (args.size() != 2)
{
string err = toString("Syntax error in kill npc by name : '%s', need <npc_name> <quantity>", s.c_str());
throw EParseException(prim, err.c_str());
}
_KillNpcByNames.initWithText("npc", STRING_MANAGER::bot_name, md, prim, args[0]);
_KillNpcByNamesQuantity.initWithText("qt", STRING_MANAGER::integer, md, prim, args[1]);
}
s = md.getProperty(prim, "faction/quantity", false, false);
if (!s.empty())
{
vector<string> args;
explode(s, string(" "), args, true);
if (args.size() != 2)
{
string err = toString("Syntax error in kill faction : '%s', need <faction_name> <quantity>", s.c_str());
throw EParseException (prim, err.c_str());
}
_KillFactionName.initWithText("faction", STRING_MANAGER::faction, md, prim, args[0]);
_KillFactionQuantity.initWithText("qt", STRING_MANAGER::integer, md, prim, args[1]);
}
bool check = false;
if (!_KillFaunas.empty())
check = true;
if (!_KillRaces.empty())
{
if (check)
throw EParseException(prim, "Merging of multiple kill mode is forbidden !");
check = true;
}
if (!_KillGroup.empty())
{
if (check)
throw EParseException(prim, "Merging of multiple kill mode is forbidden !");
check = true;
}
if (!_KillNpcs.empty())
{
if (check)
throw EParseException(prim, "Merging of multiple kill mode is forbidden !");
check = true;
}
if (!_KillNpcByNames._VarValue.empty())
{
if (check)
throw EParseException(prim, "Merging of multiple kill mode is forbidden !");
check = true;
}
if (!_KillFactionName.empty())
{
if (check)
throw EParseException(prim, "Merging of multiple kill mode is forbidden !");
check = true;
}
if (!_KillPlayers.empty())
{
if (check)
throw EParseException(prim, "Merging of multiple kill mode is forbidden !");
check = true;
}
_Place.init("p", STRING_MANAGER::place, md, prim, "place");
if (!_Place.empty() && !_KillGroup.empty())
{
throw EParseException(prim, "Using location with kill group instruction is forbidden!");
}
// init base class
CContentObjective::init(md, prim);
}
string genCode(CMissionData &md)
{
string ret;
ret = CContentObjective::genCode(md);
if (!_KillFaunas.empty())
{
ret += "kill_fauna : ";
for (uint i=0; i<_KillFaunas.size(); ++i)
{
ret += _KillFaunas[i].SheetName+" "+_KillFaunas[i].Quantity;
if (i < _KillFaunas.size()-1)
ret += "; ";
}
}
else if (!_KillRaces.empty())
{
ret += "kill_race : ";
for (uint i=0; i<_KillRaces.size(); ++i)
{
ret += _KillRaces[i].RaceName+" "+_KillRaces[i].Quantity;
if (i < _KillRaces.size()-1)
ret += "; ";
}
}
else if (!_KillGroup.empty())
{
ret += "kill_group : " + _KillGroup;
}
else if (!_KillNpcs.empty())
{
ret += "kill_npc : ";
for (uint i=0; i<_KillNpcs.size(); ++i)
{
ret += _KillNpcs[i];
if (i < _KillNpcs.size()-1)
ret += "; ";
}
}
else if (!_KillNpcByNames.empty())
{
ret += "kill_npc_by_name : "+_KillNpcByNames+" "+_KillNpcByNamesQuantity;
}
else if (!_KillFactionName.empty())
{
ret += "kill_faction : "+_KillFactionName+" "+_KillFactionQuantity;
}
else if (!_KillPlayers.empty())
{
ret += "kill_player : ";
for (uint i=0; i<_KillPlayers.size(); ++i)
{
ret += _KillPlayers[i].ClanName+" "+_KillPlayers[i].MinLevel+" "+_KillPlayers[i].MaxLevel+" "+_KillPlayers[i].Quantity;
if (i < _KillPlayers.size()-1)
{ret += "; ";}
}
}
if (!_Place.empty())
ret += " : "+_Place;
// Add the 'nb_guild_members_needed' parameter if needed
//ret += CContentObjective::genNbGuildMembersNeededOption(md);
ret += NL;
return ret;
}
};
REGISTER_STEP_CONTENT(CContentKill, "kill");
/*
class CContentKillFamedPlayer : public CContentObjective
{
vector<TKillFamedPlayerInfo> _Clans;
virtual void getPredefParam(uint32 &numEntry, CPhrase::TPredefParams &predef)
{
numEntry = _Clans.size();
predef.resize(numEntry);
for (uint i=0; i<numEntry; ++i)
{
predef[i].resize(4*(i+1));
for (uint j=0; j<i+1; ++j)
{
predef[i][j*4] = _Clans[j].ClanName;
predef[i][j*4+1] = _Clans[j].MinLevel;
predef[i][j*4+2] = _Clans[j].MaxLevel;
predef[i][j*4+3] = _Clans[j].Quantity;
}
}
}
*/
class CContentTalkTo : public CContentObjective
{
TCompilerVarName _BotName;
CPhrase _Phrase;
void getPredefParam(uint32 &numEntry, CPhrase::TPredefParams &predef)
{
numEntry = 0;
predef.resize(1);
predef[0].resize(1);
predef[0][0] = _BotName;
}
public:
void init(CMissionData &md, IPrimitive *prim)
{
_BotName.init("npc", STRING_MANAGER::bot, md, prim, "npc_name" );
CPhrase::TPredefParams pp(1);
pp[0].push_back(_BotName.getParamInfo());
vector<string> vs;
vs = md.getPropertyArray(prim, "phrase", false, false);
_Phrase.initPhrase(md, prim, vs, 0, pp);
// _Phrase.initPhrase(md, prim, vs);
// if (_Phrase.asAdditionnalParams())
// {
// // we need to remove the default 'npc' parameter if add params are found
// CPhrase temp;
// temp.initPhrase(md, prim, vs);
//
// _Phrase = temp;
// }
CContentObjective::init(md, prim);
}
string genCode(CMissionData &md)
{
string ret;
ret = CContentObjective::genCode(md);
ret += "talk_to : "+_BotName;
if (!_Phrase.isEmpty())
ret += " : "+_Phrase.genScript(md);
// Add the 'nb_guild_members_needed' parameter if needed
//ret += CContentObjective::genNbGuildMembersNeededOption(md);
ret += NL;
return ret;
}
string genPhrase()
{
string ret;
ret = CContentObjective::genPhrase();
ret += _Phrase.genPhrase();
return ret;
}
};
REGISTER_STEP_CONTENT(CContentTalkTo, "talk_to");
class CContentCast : public CContentObjective
{
vector<TCompilerVarName> _Actions;
TCompilerVarName _Place;
void getPredefParam(uint32 &numEntry, CPhrase::TPredefParams &predef)
{
numEntry = (uint32)_Actions.size();
predef.resize(numEntry);
for (uint i=0; i<numEntry; ++i)
{
predef[i].resize(i+1);
for (uint j=0; j<i+1; ++j)
{
predef[i][j] = _Actions[j];
}
}
if (!_Place.empty())
{
for (uint i=0; i<_Actions.size(); ++i)
{
predef[i].push_back(_Place);
}
}
}
public:
void init(CMissionData &md, IPrimitive *prim)
{
_Actions=TCompilerVarName::getPropertyArrayWithTextStaticDefaultName("action", STRING_MANAGER::sphrase, md, prim, "action");
_Place.init("p", STRING_MANAGER::place, md, prim, "place");
CContentObjective::init(md, prim);
}
string genCode(CMissionData &md)
{
string ret;
ret = CContentObjective::genCode(md);
ret += "cast : ";
for (uint i=0; i<_Actions.size(); ++i)
{
ret += _Actions[i];
if (i < _Actions.size()-1)
ret += "; ";
}
if (!_Place.empty())
{
ret += ": "+_Place;
}
// Add the 'nb_guild_members_needed' parameter if needed
//ret += CContentObjective::genNbGuildMembersNeededOption(md);
ret += NL;
return ret;
}
};
REGISTER_STEP_CONTENT(CContentCast, "cast");
struct TForageInfo
{
TCompilerVarName Item;
TCompilerVarName Qt;
TCompilerVarName Ql;
};
class CContentForage : public CContentObjective
{
vector<TForageInfo> _Mps;
virtual void getPredefParam(uint32 &numEntry, CPhrase::TPredefParams &predef)
{
numEntry = (uint32)_Mps.size();
predef.resize(numEntry);
for (uint i=0; i<numEntry; ++i)
{
predef[i].resize(3*(i+1));
for (uint j=0; j<i+1; ++j)
{
predef[i][j*3] = _Mps[j].Item;
predef[i][j*3+1] = _Mps[j].Qt;
predef[i][j*3+2] = _Mps[j].Ql;
}
}
}
public:
void init(CMissionData &md, IPrimitive *prim)
{
vector<string> vs;
vs = md.getPropertyArray(prim, "item/quantity/quality", true, false);
for (uint i=0; i<vs.size(); ++i)
{
vector<string> args;
explode(vs[i], string(" "), args, true);
if (args.size() != 3)
{
string err = toString("Invalid forage item in '%s', need <item> <quantity> <quality>", vs[i].c_str());
throw EParseException(prim, err.c_str());
}
TForageInfo fi;
fi.Item.initWithText(toString("i%u", i+1), STRING_MANAGER::item, md, prim, args[0]);
fi.Qt.initWithText(toString("qt%u", i+1), STRING_MANAGER::integer, md, prim, args[1]);
fi.Ql.initWithText(toString("qual%u", i+1), STRING_MANAGER::integer, md, prim, args[2]);
_Mps.push_back(fi);
}
CContentObjective::init(md, prim);
}
string genCode(CMissionData &md)
{
string ret;
ret = CContentObjective::genCode(md);
ret += "forage : ";
for (uint i=0; i<_Mps.size(); ++i)
{
ret += _Mps[i].Item+" "+_Mps[i].Qt+" "+_Mps[i].Ql;
if (i < _Mps.size()-1)
ret += "; ";
}
// Add the 'nb_guild_members_needed' parameter if needed
//ret += CContentObjective::genNbGuildMembersNeededOption(md);
ret += NL;
return ret;
}
};
REGISTER_STEP_CONTENT(CContentForage, "forage");
struct TLootInfo
{
TCompilerVarName Item;
TCompilerVarName Qt;
TCompilerVarName Ql;
};
class CContentLoot : public CContentObjective
{
enum TLootMode
{
lm_unknown,
lm_item,
lm_mp
};
TLootMode _Mode;
vector<TLootInfo> _Items;
virtual void getPredefParam(uint32 &numEntry, CPhrase::TPredefParams &predef)
{
if (_Mode == lm_item)
{
numEntry = (uint32)_Items.size();
predef.resize(numEntry);
for (uint i=0; i<numEntry; ++i)
{
predef[i].resize(i+1);
for (uint j=0; j<i+1; ++j)
{
predef[i][j] = _Items[j].Item;
}
}
}
else if (_Mode == lm_mp)
{
numEntry = (uint32)_Items.size();
predef.resize(numEntry);
for (uint i=0; i<numEntry; ++i)
{
predef[i].resize(3*(i+1));
for (uint j=0; j<i+1; ++j)
{
predef[i][j*3] = _Items[j].Item;
predef[i][j*3+1] = _Items[j].Qt;
predef[i][j*3+2] = _Items[j].Ql;
}
}
}
else
numEntry = 0;
}
public:
void init(CMissionData &md, IPrimitive *prim)
{
_Mode = lm_unknown;
vector<string> vs;
vs = md.getPropertyArray(prim, "item/quantity/quality", true, false);
for (uint i=0; i<vs.size(); ++i)
{
vector<string> args;
explode(vs[i], string(" "), args, true);
if (args.size() != 1 && args.size() != 3)
{
string err = toString("Invalid loot item in '%s', need <item> or <item> <quantity> <quality>", vs[i].c_str());
throw EParseException(prim, err.c_str());
}
if (args.size() == 1)
{
if (_Mode == lm_mp)
throw EParseException(prim, "Can't mix item and mps loot");
_Mode = lm_item;
}
else if (args.size() == 3)
{
if (_Mode == lm_item)
throw EParseException(prim, "Can't mix item and mps loot");
_Mode = lm_mp;
}
TLootInfo li;
li.Item.initWithText(toString("i%u", i+1), STRING_MANAGER::item, md, prim, args[0]);
if (args.size() > 1)
{
li.Qt.initWithText(toString("qt%u", i+1), STRING_MANAGER::integer, md, prim, args[1]);
li.Ql.initWithText(toString("qual%u", i+1), STRING_MANAGER::integer, md, prim, args[2]);
}
_Items.push_back(li);
}
CContentObjective::init(md, prim);
}
string genCode(CMissionData &md)
{
string ret;
ret = CContentObjective::genCode(md);
if (_Mode == lm_item)
ret += "loot_item : ";
else
ret += "loot_mp : ";
for (uint i=0; i<_Items.size(); ++i)
{
ret += _Items[i].Item;
if (_Mode == lm_mp)
ret += " "+_Items[i].Qt+" "+_Items[i].Ql;
if (i < _Items.size()-1)
ret += "; ";
}
// Add the 'nb_guild_members_needed' parameter if needed
//ret += CContentObjective::genNbGuildMembersNeededOption(md);
ret += NL;
return ret;
}
};
REGISTER_STEP_CONTENT(CContentLoot, "loot");
struct TCraftInfo
{
TCompilerVarName Item;
TCompilerVarName Qt;
TCompilerVarName Ql;
};
class CContentCraft : public CContentObjective
{
vector<TCraftInfo> _Items;
virtual void getPredefParam(uint32 &numEntry, CPhrase::TPredefParams &predef)
{
numEntry = (uint32)_Items.size();
predef.resize(numEntry);
for (uint i=0; i<numEntry; ++i)
{
predef[i].resize(3*(i+1));
for (uint j=0; j<i+1; ++j)
{
predef[i][j*3] = _Items[j].Item;
predef[i][j*3+1] = _Items[j].Qt;
predef[i][j*3+2] = _Items[j].Ql;
}
}
}
public:
void init(CMissionData &md, IPrimitive *prim)
{
vector<string> vs;
vs = md.getPropertyArray(prim, "item/quantity/quality", true, false);
for (uint i=0; i<vs.size(); ++i)
{
vector<string> args;
explode(vs[i], string(" "), args, true);
if (args.size() != 3)
{
string err = toString("Invalid craft item in '%s', need <item> <quantity> <quality>", vs[i].c_str());
throw EParseException(prim, err.c_str());
}
TCraftInfo ci;
ci.Item.initWithText(toString("i%u", i+1), STRING_MANAGER::item, md, prim, args[0]);
ci.Qt.initWithText(toString("qt%u", i+1), STRING_MANAGER::integer, md, prim, args[1]);
ci.Ql.initWithText(toString("qual%u", i+1), STRING_MANAGER::integer, md, prim, args[2]);
_Items.push_back(ci);
}
CContentObjective::init(md, prim);
}
string genCode(CMissionData &md)
{
string ret;
ret = CContentObjective::genCode(md);
ret += "craft : ";
for (uint i=0; i<_Items.size(); ++i)
{
ret += _Items[i].Item+" "+_Items[i].Qt+" "+_Items[i].Ql;
if (i < _Items.size()-1)
ret += "; ";
}
// Add the 'nb_guild_members_needed' parameter if needed
//ret += CContentObjective::genNbGuildMembersNeededOption(md);
ret += NL;
return ret;
}
};
REGISTER_STEP_CONTENT(CContentCraft, "craft");
class CContentTarget : public CContentObjective
{
vector<TCompilerVarName> _Npcs;
vector<TCompilerVarName> _Faunas;
vector<TCompilerVarName> _Races;
TCompilerVarName _Place;
virtual void getPredefParam(uint32 &numEntry, CPhrase::TPredefParams &predef)
{
// phrase 0 - 1 parameter
// phrase 1 - 2 parameters
// etc ... as many (bots,faunas,race) as specified
if (!_Npcs.empty())
{
numEntry = (uint32)_Npcs.size();
predef.resize(numEntry);
for (uint i=0; i<numEntry; ++i)
{
predef[i].resize(1*(i+1));
for (uint j=0; j<i+1; ++j)
{
predef[i][j] = _Npcs[j];
}
}
}
else if (!_Faunas.empty())
{
numEntry = (uint32)_Faunas.size();
predef.resize(numEntry);
for (uint i=0; i<numEntry; ++i)
{
predef[i].resize(1*(i+1));
for (uint j=0; j<i+1; ++j)
{
predef[i][j] = _Faunas[j];
}
}
}
else if (!_Races.empty())
{
numEntry = (uint32)_Races.size();
predef.resize(numEntry);
for (uint i=0; i<numEntry; ++i)
{
predef[i].resize(1*(i+1));
for (uint j=0; j<i+1; ++j)
{
predef[i][j] = _Races[j];
}
}
}
// If there is a place add the param for text to all phrases (predef[x] is a phrase)
if (!_Place.empty())
{
for (uint i= 0; i < predef.size(); ++i)
{
predef[i].push_back( _Place );
}
}
}
public:
void init(CMissionData &md, IPrimitive *prim)
{
_Npcs = TCompilerVarName::getPropertyArrayWithText("npc", STRING_MANAGER::bot, md, prim, "npcs_to_target");
_Faunas = TCompilerVarName::getPropertyArrayWithText("fauna", STRING_MANAGER::creature_model, md, prim, "faunas_to_target" );
_Races = TCompilerVarName::getPropertyArrayWithText("race", STRING_MANAGER::race, md, prim, "races_to_target" );
_Place.init("place", STRING_MANAGER::place, md, prim, "place" );
if (!_Npcs.empty() && !_Faunas.empty())
throw EParseException(prim, "Can't mix npc and fauna target");
if (!_Npcs.empty() && !_Races.empty())
throw EParseException(prim, "Can't mix npc and race target");
if (!_Faunas.empty() && !_Races.empty())
throw EParseException(prim, "Can't mix fauna and race target");
CContentObjective::init(md, prim);
}
string genCode(CMissionData &md)
{
string ret;
ret = CContentObjective::genCode(md);
if (!_Npcs.empty())
{
ret += "target_npc : ";
for (uint i=0; i<_Npcs.size(); ++i)
{
ret += _Npcs[i];
if (i < _Npcs.size()-1)
ret += "; ";
}
}
else if (!_Faunas.empty())
{
ret += "target_fauna : ";
for (uint i=0; i<_Faunas.size(); ++i)
{
ret += _Faunas[i];
if (i < _Faunas.size()-1)
ret += "; ";
}
}
else if (!_Races.empty())
{
ret += "target_race : ";
for (uint i=0; i<_Races.size(); ++i)
{
ret += _Races[i];
if (i < _Races.size()-1)
ret += "; ";
}
}
if (!_Place.empty())
ret += " : " + _Place;
// Add the 'nb_guild_members_needed' parameter if needed
//ret += CContentObjective::genNbGuildMembersNeededOption(md);
ret += NL;
return ret;
}
};
REGISTER_STEP_CONTENT(CContentTarget, "target");
struct TSellInfo
{
TCompilerVarName Item;
TCompilerVarName Qt;
TCompilerVarName Ql;
};
class CContentSell : public CContentObjective
{
vector<TSellInfo> _Items;
TCompilerVarName _Npc;
virtual void getPredefParam(uint32 &numEntry, CPhrase::TPredefParams &predef)
{
numEntry = (uint32)_Items.size();
predef.resize(numEntry);
for (uint i=0; i<numEntry; ++i)
{
predef[i].resize(3*(i+1));
for (uint j=0; j<i+1; ++j)
{
predef[i][j*3] = _Items[j].Item;
predef[i][j*3+1] = _Items[j].Qt;
predef[i][j*3+2] = _Items[j].Ql;
}
if (!_Npc.empty())
{
predef[i].push_back(_Npc);
}
}
}
public:
void init(CMissionData &md, IPrimitive *prim)
{
vector<string> vs;
vs = md.getPropertyArray(prim, "item/quantity/quality", true, false);
for (uint i=0; i<vs.size(); ++i)
{
vector<string> args;
explode(vs[i], string(" "), args, true);
if (args.size() != 3)
{
string err = toString("Invalid sell item in '%s', need <item> <quantity> <quality>", vs[i].c_str());
throw EParseException(prim, err.c_str());
}
TSellInfo si;
si.Item.initWithText(toString("i%u", i+1), STRING_MANAGER::item, md, prim, args[0]);
si.Qt.initWithText(toString("qt%u", i+1), STRING_MANAGER::integer, md, prim, args[1]);
si.Ql.initWithText(toString("qual%u", i+1), STRING_MANAGER::integer, md, prim, args[2]);
_Items.push_back(si);
}
_Npc.init("npc", STRING_MANAGER::bot, md, prim, "npc_name");
CContentObjective::init(md, prim);
}
string genCode(CMissionData &md)
{
string ret;
ret = CContentObjective::genCode(md);
ret += "sell : ";
for (uint i=0; i<_Items.size(); ++i)
{
ret += _Items[i].Item+" "+_Items[i].Qt+" "+_Items[i].Ql;
if (i < _Items.size()-1)
ret += "; ";
};
if (!_Npc.empty())
{
ret += " : "+_Npc;
}
// Add the 'nb_guild_members_needed' parameter if needed
//ret += CContentObjective::genNbGuildMembersNeededOption(md);
ret += NL;
return ret;
}
};
REGISTER_STEP_CONTENT(CContentSell, "sell");
struct TBuyInfo
{
TCompilerVarName Item;
TCompilerVarName Qt;
TCompilerVarName Ql;
};
class CContentBuy : public CContentObjective
{
vector<TBuyInfo> _Items;
TCompilerVarName _Npc;
virtual void getPredefParam(uint32 &numEntry, CPhrase::TPredefParams &predef)
{
numEntry = (uint32)_Items.size();
predef.resize(numEntry);
for (uint i=0; i<numEntry; ++i)
{
predef[i].resize(3*(i+1));
for (uint j=0; j<i+1; ++j)
{
predef[i][j*3] = _Items[j].Item;
predef[i][j*3+1] = _Items[j].Qt;
predef[i][j*3+2] = _Items[j].Ql;
}
predef[i].push_back(_Npc);
}
}
public:
void init(CMissionData &md, IPrimitive *prim)
{
vector<string> vs;
vs = md.getPropertyArray(prim, "item/quantity/quality", true, false);
for (uint i=0; i<vs.size(); ++i)
{
vector<string> args;
explode(vs[i], string(" "), args, true);
if (args.size() != 3)
{
string err = toString("Invalid buy item in '%s', need <item> <quantity> <quality>", vs[i].c_str());
throw EParseException(prim, err.c_str());
}
TBuyInfo bi;
bi.Item.initWithText(toString("i%u", i+1), STRING_MANAGER::item, md, prim, args[0]);
bi.Qt.initWithText(toString("qt%u", i+1), STRING_MANAGER::integer, md, prim, args[1]);
bi.Ql.initWithText(toString("qual%u", i+1), STRING_MANAGER::integer, md, prim, args[2]);
_Items.push_back(bi);
}
_Npc.init("npc", STRING_MANAGER::bot, md, prim, "npc_name");
CContentObjective::init(md, prim);
}
string genCode(CMissionData &md)
{
string ret;
ret = CContentObjective::genCode(md);
ret += "buy : ";
for (uint i=0; i<_Items.size(); ++i)
{
ret += _Items[i].Item+" "+_Items[i].Qt+" "+_Items[i].Ql;
if (i < _Items.size()-1)
ret += "; ";
};
if (!_Npc.empty())
{
ret += " : "+_Npc;
}
// Add the 'nb_guild_members_needed' parameter if needed
//ret += CContentObjective::genNbGuildMembersNeededOption(md);
ret += NL;
return ret;
}
};
REGISTER_STEP_CONTENT(CContentBuy, "buy");
struct TGiveInfo
{
TCompilerVarName Item;
TCompilerVarName Qt;
TCompilerVarName Ql;
};
class CContentGive : public CContentObjective
{
vector<TGiveInfo> _Items;
TCompilerVarName _Npc;
bool _QualSpec;
virtual void getPredefParam(uint32 &numEntry, CPhrase::TPredefParams &predef)
{
numEntry = (uint32)_Items.size();
predef.resize(numEntry);
for (uint i=0; i<numEntry; ++i)
{
if (_QualSpec)
{
predef[i].resize(3*(i+1));
for (uint j=0; j<i+1; ++j)
{
predef[i][j*3] = _Items[j].Item;
predef[i][j*3+1] = _Items[j].Qt;
predef[i][j*3+2] = _Items[j].Ql;
}
}
else
{
predef[i].resize(2*(i+1));
for (uint j=0; j<i+1; ++j)
{
predef[i][j*2] = _Items[j].Item;
predef[i][j*2+1] = _Items[j].Qt;
}
}
predef[i].push_back(_Npc);
}
}
public:
void init(CMissionData &md, IPrimitive *prim)
{
vector<string> vs;
vs = md.getPropertyArray(prim, "item/quantity/quality", true, false);
for (uint i=0; i<vs.size(); ++i)
{
vector<string> args;
explode(vs[i], string(" "), args, true);
if (args.size() != 3 && args.size() != 2)
{
string err = toString("Invalid give item in '%s', need <item> <quantity> [<quality>]", vs[i].c_str());
throw EParseException(prim, err.c_str());
}
if (i == 0)
{
_QualSpec = args.size() == 3;
}
else
{
if (_QualSpec && args.size() == 2)
{
string err = toString("Invalid give item in '%s', mixing of item with quality and item without quality is not supported", vs[i].c_str());
throw EParseException(prim, err.c_str());
}
}
TGiveInfo gi;
gi.Item.initWithText(toString("i%u", i+1), STRING_MANAGER::item, md, prim, args[0]);
gi.Qt.initWithText(toString("qt%u", i+1), STRING_MANAGER::integer, md, prim, args[1]);
if (_QualSpec)
gi.Ql.initWithText(toString("qual%u", i+1), STRING_MANAGER::integer, md, prim, args[2]);
_Items.push_back(gi);
}
_Npc.init("npc", STRING_MANAGER::bot, md, prim, "npc_name");
CContentObjective::init(md, prim);
}
string genCode(CMissionData &md)
{
string ret;
ret = CContentObjective::genCode(md);
ret += "give_item : ";
for (uint i=0; i<_Items.size(); ++i)
{
ret += _Items[i].Item+" "+_Items[i].Qt;
if (_QualSpec)
ret += " "+_Items[i].Ql;
if (i < _Items.size()-1)
ret += "; ";
};
ret += " : "+_Npc;
// Add the 'nb_guild_members_needed' parameter if needed
//ret += CContentObjective::genNbGuildMembersNeededOption(md);
ret += NL;
return ret;
}
};
REGISTER_STEP_CONTENT(CContentGive, "give_item");
class CContentGiveMoney : public CContentObjective
{
TCompilerVarName _Amount;
TCompilerVarName _Npc;
virtual void getPredefParam(uint32 &numEntry, CPhrase::TPredefParams &predef)
{
numEntry = 0;
predef.resize(1);
predef[0].resize(2);
predef[0][0] = _Amount;
predef[0][1] = _Npc;
}
public:
void init(CMissionData &md, IPrimitive *prim)
{
_Amount.init("amount", STRING_MANAGER::integer, md, prim, "amount");
_Npc.init("npc", STRING_MANAGER::bot, md, prim, "npc_name");
CContentObjective::init(md, prim);
}
string genCode(CMissionData &md)
{
string ret;
ret = CContentObjective::genCode(md);
ret += "give_money : "+_Amount+" : "+_Npc;
// Add the 'nb_guild_members_needed' parameter if needed
//ret += CContentObjective::genNbGuildMembersNeededOption(md);
ret += NL;
return ret;
}
};
REGISTER_STEP_CONTENT(CContentGiveMoney, "give_money");
class CContentVisit : public CContentObjective
{
TCompilerVarName _Place;
TCompilerVarName _PlaceVar;
vector<TCompilerVarName> _Items;
virtual void getPredefParam(uint32 &numEntry, CPhrase::TPredefParams &predef)
{
numEntry = 0;
predef.resize(1);
predef[0].resize(1+_Items.size());
predef[0][0] = _Place;
for (uint i=0; i<_Items.size(); ++i)
predef[0][i+1] = _Items[i];
}
public:
void init(CMissionData &md, IPrimitive *prim)
{
_Place.init("place", STRING_MANAGER::place, md, prim, "place");
_Items = TCompilerVarName::getPropertyArrayWithText("i", STRING_MANAGER::item, md, prim, "items_worn" );
CContentObjective::init(md, prim);
}
string genCode(CMissionData &md)
{
string ret;
ret = CContentObjective::genCode(md);
ret += "visit : "+_Place;
if (!_Items.empty())
{
ret += " : ";
for (uint i=0; i<_Items.size(); ++i)
{
ret += _Items[i];
if (i < _Items.size()-1)
ret += "; ";
}
}
// Add the 'nb_guild_members_needed' parameter if needed
//ret += CContentObjective::genNbGuildMembersNeededOption(md);
ret += NL;
return ret;
}
};
REGISTER_STEP_CONTENT(CContentVisit, "visit");
class CContentEscort : public CContentObjective
{
string _GroupName;
bool _SaveAll;
virtual void getPredefParam(uint32 &numEntry, CPhrase::TPredefParams &predef)
{
numEntry = 0;
}
public:
void init (CMissionData &md, IPrimitive *prim)
{
_GroupName = md.getProperty(prim, "group_to_escort", true, false);
string s = md.getProperty(prim, "save_all", true, false);
_SaveAll = (NLMISC::toLower(s) == "true");
CContentObjective::init(md, prim);
}
string genCode(CMissionData &md)
{
string ret;
ret = CContentObjective::genCode(md);
ret += "escort : "+_GroupName;
if (_SaveAll)
ret += " : save_all";
// Add the 'nb_guild_members_needed' parameter if needed
//ret += CContentObjective::genNbGuildMembersNeededOption(md);
ret += NL;
return ret;
}
};
REGISTER_STEP_CONTENT(CContentEscort, "escort");
struct TSkillInfo
{
TCompilerVarName _SkillName;
TCompilerVarName _Level;
};
class CContentSkill: public CContentObjective
{
vector<TSkillInfo> _Skills;
virtual void getPredefParam(uint32 &numEntry, CPhrase::TPredefParams &predef)
{
numEntry = (uint32)_Skills.size();
predef.resize(numEntry);
for (uint i=0; i<numEntry; ++i)
{
predef[i].resize(2*(i+1));
for (uint j=0; j<i+1; ++j)
{
predef[i][j*2] = _Skills[j]._SkillName;
predef[i][j*2+1] = _Skills[j]._Level;
}
}
}
public:
void init(CMissionData &md, IPrimitive *prim)
{
vector<string> vs;
vs = md.getPropertyArray(prim, "skill_name/level", true, false);
for (uint i=0; i<vs.size(); ++i)
{
vector<string> args;
explode(vs[i], string(" "), args, true);
if (args.size() != 2)
{
string err = toString("Invalid skill in '%s', need <skill_name> <skill_level>", vs[i].c_str());
throw EParseException(prim, err.c_str());
}
TSkillInfo si;
si._SkillName.initWithText(toString("s%u", i+1), STRING_MANAGER::skill, md, prim, args[0]);
si._Level.initWithText(toString("level%u", i+1), STRING_MANAGER::integer, md, prim, args[1]);
_Skills.push_back(si);
}
CContentObjective::init(md, prim);
}
string genCode(CMissionData &md)
{
string ret;
ret = CContentObjective::genCode(md);
ret += "skill : ";
for (uint i=0; i<_Skills.size(); ++i)
{
ret += _Skills[i]._SkillName+" "+_Skills[i]._Level;
if (i < _Skills.size()-1)
ret += "; ";
}
// Add the 'nb_guild_members_needed' parameter if needed
//ret += CContentObjective::genNbGuildMembersNeededOption(md);
ret += NL;
return ret;
}
};
REGISTER_STEP_CONTENT(CContentSkill, "skill");
class CContentMission: public CContentObjective
{
vector<string> _Missions;
virtual void getPredefParam(uint32 &numEntry, CPhrase::TPredefParams &predef)
{
numEntry = 0;
}
public:
CContentMission(): _Prim(0) {}
void init(CMissionData &md, IPrimitive *prim)
{
_Missions = md.getPropertyArray(prim, "mission_names", true, false);
_Prim = prim;
CContentObjective::init(md, prim);
}
string genCode(CMissionData &md)
{
string ret;
ret = CContentObjective::genCode(md);
ret += "mission : ";
for (uint i=0; i<_Missions.size(); ++i)
{
ret += _Missions[i];
if (i < _Missions.size()-1)
ret += "; ";
// We check to see if we specified a number after the mission name. If so, we check if it's a guild mission
std::size_t pos = _Missions[i].find_first_of(" \t");
if (pos != std::string::npos && !md.isGuildMission())
{
string err = toString("primitive(%s): CContentMission: Number of members needed to complete the mission specified but the mission is not a guild mission.", _Prim->getName().c_str());
throw EParseException(_Prim, err.c_str());
}
}
// Add the 'nb_guild_members_needed' parameter if needed
//ret += CContentObjective::genNbGuildMembersNeededOption(md);
ret += NL;
return ret;
}
IPrimitive *_Prim;
};
REGISTER_STEP_CONTENT(CContentMission, "do_mission");
class CContentWaitAIMsg : public CContentObjective
{
vector<string> _MsgContent;
virtual void getPredefParam(uint32 &numEntry, CPhrase::TPredefParams &predef)
{
numEntry = 0;
}
public:
void init(CMissionData &md, IPrimitive *prim)
{
_MsgContent = md.getPropertyArray(prim, "msg_content", true, false);
CContentObjective::init(md, prim);
}
string genCode(CMissionData &md)
{
string ret;
ret = CContentObjective::genCode(md);
ret += "wait_msg : ";
for (uint i=0; i<_MsgContent.size(); ++i)
{
ret += _MsgContent[i];
if (i < _MsgContent.size()-1)
ret += " ";
}
// Add the 'nb_guild_members_needed' parameter if needed
//ret += CContentObjective::genNbGuildMembersNeededOption(md);
ret += NL;
return ret;
}
};
REGISTER_STEP_CONTENT(CContentWaitAIMsg, "wait_ai_msg");
// ***********
// queue_start
// ***********
class CContentQueueStart : public CContentObjective
{
string _StepName;
string _QueueName;
string _Timer;
vector<string> _AIInstances;
vector<string> _GroupsToSpawn;
virtual void getPredefParam(uint32 &numEntry, CPhrase::TPredefParams &predef)
{
numEntry = 0;
}
public:
void init(CMissionData &md, IPrimitive *prim)
{
_StepName = md.getProperty(prim, "step_name", true, true);
_QueueName = md.getProperty(prim, "queue_name", true, false);
if (_StepName.empty())
_StepName = "queue_start_" + _QueueName;
_Timer = md.getProperty(prim, "timer", true, false);
_GroupsToSpawn = md.getPropertyArray(prim, "groups_to_spawn", true, true);
if (_GroupsToSpawn.empty())
_AIInstances = md.getPropertyArray(prim, "ai_instances", true, true);
else
_AIInstances = md.getPropertyArray(prim, "ai_instances", true, false);
CContentObjective::init(md, prim);
}
string genCode(CMissionData &md)
{
uint32 i;
string ret;
ret = CContentObjective::genCode(md);
ret += "jump_point : " + _StepName + NL;
ret += "queue_start : " + _QueueName + " : " + _Timer + NL;
ret += NL;
if (!_GroupsToSpawn.empty())
{
// crash : ai_instance_1 : ai_instance_2 : ...
ret += "crash";
nlassert(_AIInstances.size() > 0);
for (i = 0; i < _AIInstances.size(); ++i)
ret += " : " + _AIInstances[i];
ret += NL;
for (i = 0; i < _GroupsToSpawn.size(); ++i)
ret += "handle_release : " + _GroupsToSpawn[i] + NL;
ret += "/crash" + NL;
ret += NL;
ret += "failure" + NL;
for (i = 0; i < _GroupsToSpawn.size(); ++i)
ret += "handle_release : " + _GroupsToSpawn[i] + NL;
ret += "/failure" + NL;
ret += NL;
}
ret += "player_reconnect" + NL;
for (i = 0; i < _GroupsToSpawn.size(); ++i)
ret += "handle_release : " + _GroupsToSpawn[i] + NL;
ret += "jump : " + _StepName + NL;
ret += "/player_reconnect" + NL;
ret += NL;
for (i = 0; i < _GroupsToSpawn.size(); ++i)
ret += "handle_create : " + _GroupsToSpawn[i] + NL;
return ret;
}
};
REGISTER_STEP_CONTENT(CContentQueueStart, "queue_start");
// *********
// queue_end
// *********
class CActionQueueEnd : public IStepContent
{
string _ActionName;
string _QueueName;
// Find the following info in the queue_start node
vector<string> _AIInstances;
vector<string> _GroupsToSpawn;
void getPredefParam(uint32 &numEntry, CPhrase::TPredefParams &predef)
{
numEntry = 0;
}
public:
void init(CMissionData &md, IPrimitive *prim)
{
IStepContent::init(md, prim);
_ActionName = md.getProperty(prim, "action_name", true, true);
_QueueName = md.getProperty(prim, "queue_name", true, false);
if (_ActionName.empty())
_ActionName = "queue_end_" + _QueueName;
// Search in the queue_start node
IPrimitive *primParent = prim;
while (primParent->getParent() != NULL)
{
string className;
if (primParent->getPropertyByName("class", className))
if (className == "mission_tree")
break;
primParent = primParent->getParent();
}
TPrimitiveClassPredicate condClass("queue_start");
CPrimitiveSet<TPrimitiveClassPredicate> s;
TPrimitiveSet ps;
s.buildSet(primParent, condClass, ps);
TPrimitivePropertyPredicate condProp("queue_name", _QueueName);
CPrimitiveSetFilter<TPrimitivePropertyPredicate> filter;
TPrimitiveSet psFinal;
filter.filterSet(ps, condProp, psFinal);
if (psFinal.size() == 0)
{
string err = toString("Can't find queue_start for queue_end : '%s'", _QueueName.c_str());
throw EParseException(prim, err.c_str());
}
if (psFinal.size() > 1)
{
string err = toString("More than 1 queue_start for queue_end : '%s'", _QueueName.c_str());
throw EParseException(prim, err.c_str());
}
_GroupsToSpawn = md.getPropertyArray(psFinal[0], "groups_to_spawn", true, true);
if (_GroupsToSpawn.empty())
_AIInstances = md.getPropertyArray(psFinal[0], "ai_instances", true, true);
else
_AIInstances = md.getPropertyArray(psFinal[0], "ai_instances", true, false);
}
string genCode(CMissionData &md)
{
uint32 i;
string ret;
if (_GroupsToSpawn.size() > 0)
{
for (i = 0; i < _GroupsToSpawn.size(); ++i)
ret += "handle_release : " + _GroupsToSpawn[i] + NL;
ret += NL;
}
if (_AIInstances.size() > 0)
{
ret += "crash";
for (i = 0; i < _AIInstances.size(); ++i)
ret += " : " + _AIInstances[i];
ret += NL;
ret += "/crash" + NL;
ret += NL;
}
ret += "failure" + NL;
ret += "/failure" + NL;
ret += NL;
ret += "player_reconnect" + NL;
ret += "/player_reconnect" + NL;
ret += NL;
ret += "queue_end : " +_QueueName + NL;
return ret;
}
};
REGISTER_STEP_CONTENT(CActionQueueEnd, "queue_end");
class CContentRingScenario: public CContentObjective
{
string _ScenarioTag;
virtual void getPredefParam(uint32 &numEntry, CPhrase::TPredefParams &predef)
{
numEntry = 0;
}
public:
void init(CMissionData &md, IPrimitive *prim)
{
_ScenarioTag = md.getProperty(prim, "scenario_tag", true, false);
CContentObjective::init(md, prim);
}
string genCode(CMissionData &md)
{
string ret;
ret = CContentObjective::genCode(md);
ret += "ring_scenario : ";
ret += _ScenarioTag;
// Add the 'nb_guild_members_needed' parameter if needed
//ret += CContentObjective::genNbGuildMembersNeededOption(md);
ret += NL;
return ret;
}
};
REGISTER_STEP_CONTENT(CContentRingScenario, "ring_scenario");