263 lines
No EOL
7 KiB
C++
263 lines
No EOL
7 KiB
C++
// 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 "nel/misc/types_nl.h"
|
|
#include "nel/ligo/primitive.h"
|
|
#include <string>
|
|
|
|
#ifndef __STEP_H__
|
|
#define __STEP_H__
|
|
|
|
|
|
/** Action and objective base class */
|
|
class IStepContent
|
|
{
|
|
public:
|
|
enum TStepContentType
|
|
{
|
|
objective,
|
|
action
|
|
};
|
|
protected:
|
|
std::string _ContentName;
|
|
TStepContentType _ContentType;
|
|
/// post action list
|
|
std::vector<IStepContent*> _PostActions;
|
|
|
|
// called by base class to retrieve the predefined parameters lists
|
|
virtual void getPredefParam(uint32 &numEntry, CPhrase::TPredefParams &predef) = 0;
|
|
public:
|
|
|
|
virtual void init(CMissionData &md, NLLIGO::IPrimitive *prim);
|
|
|
|
/// Generate the mission script code for this step content.
|
|
std::string genStepContentCode(CMissionData &md);
|
|
|
|
/// Generate the phrase string.
|
|
std::string genStepContentPhrase();
|
|
|
|
static IStepContent *createStepContent(CMissionData &md, NLLIGO::IPrimitive *prim);
|
|
|
|
virtual void fillJump(CMissionData &md, std::set<TJumpInfo> &jumpPoints);
|
|
|
|
protected:
|
|
/// Generate the mission script code for this step content.
|
|
virtual std::string genCode(CMissionData &md) = 0;
|
|
/// Generate the phrase string.
|
|
virtual std::string genPhrase() { return std::string();}
|
|
};
|
|
|
|
|
|
/** Step base class */
|
|
class IStep
|
|
{
|
|
protected:
|
|
/// The name of the step
|
|
std::string _StepName;
|
|
/// The type of the step
|
|
std::string _StepType;
|
|
/// Pointer on primitive that generate this step
|
|
NLLIGO::IPrimitive *_Primitive;
|
|
|
|
/// The list of pre-action
|
|
std::vector<IStepContent *> _PreActions;
|
|
/// The list of objectives
|
|
std::vector<IStepContent *> _Objectives;
|
|
/// The list of post action
|
|
std::vector<IStepContent *> _PostActions;
|
|
/// Substeps used for sequence interruption (like an if)
|
|
std::vector<IStep*> _SubSteps;
|
|
public:
|
|
/// Flag this step a last of a branch, the compiler will generate a fail after it.
|
|
bool EndOfBranch;
|
|
/// Flag this step as a jump point. This mean that there is a jump that jump on this step.
|
|
bool JumpPoint;
|
|
|
|
IStep(CMissionData &md, NLLIGO::IPrimitive *prim);
|
|
virtual ~IStep() {}
|
|
|
|
virtual void init(CMissionData &md, NLLIGO::IPrimitive *prim) {};
|
|
|
|
|
|
/// Get the step name
|
|
const std::string &getStepName()
|
|
{
|
|
return _StepName;
|
|
}
|
|
|
|
NLLIGO::IPrimitive *getPrimitive()
|
|
{
|
|
return _Primitive;
|
|
}
|
|
|
|
/// Return true if the step is an action step.
|
|
// virtual bool isAction() { return false; }
|
|
|
|
virtual bool isAJump() { return false; }
|
|
|
|
virtual bool isEnd() { return false; }
|
|
|
|
/// Return a set of primitive pointer on the sub branch of this step (if any)
|
|
virtual NLLIGO::TPrimitiveSet getSubBranchs() { return NLLIGO::TPrimitiveSet(); }
|
|
|
|
/// Fill a vector of step name where this step eventualy jump (if any)
|
|
void fillStepJump(CMissionData &md, std::set<TJumpInfo> &jumpPoints);
|
|
|
|
/// Generate the mission script code for this step.
|
|
virtual std::string genCode(CMissionData &md);
|
|
|
|
virtual std::string genCodePreActions(CMissionData &md);
|
|
virtual std::string genCodeObjectives(CMissionData &md);
|
|
virtual std::string genCodePostActions(CMissionData &md);
|
|
|
|
void addSubStep(IStep *s) { _SubSteps.push_back(s); }
|
|
|
|
|
|
/// Generate the string phrase text.
|
|
virtual std::string genPhrase();
|
|
|
|
/// Factory function to create a new step. The caller is responsible for deleting the allocated object.
|
|
static IStep *createStep(CMissionData &md, NLLIGO::IPrimitive *prim);
|
|
|
|
protected:
|
|
/// Fill a vector of step name where this step eventualy jump (if any)
|
|
virtual void fillJump(CMissionData &md, std::set<TJumpInfo> &jumpPoints);
|
|
|
|
};
|
|
|
|
|
|
/** StepContent FACTORY **/
|
|
class IStepContentFactory
|
|
{
|
|
public:
|
|
virtual IStepContent *createStepContent(CMissionData &md, NLLIGO::IPrimitive *prim) =0;
|
|
};
|
|
|
|
template <class contentClass>
|
|
class CStepContentFactory : public IStepContentFactory
|
|
{
|
|
public:
|
|
IStepContent *createStepContent(CMissionData &md, NLLIGO::IPrimitive *prim)
|
|
{
|
|
IStepContent *ret = new contentClass;
|
|
ret->init(md, prim);
|
|
return ret;
|
|
}
|
|
};
|
|
|
|
#define REGISTER_STEP_CONTENT(className, key) typedef CStepContentFactory<className> TStepContentFactory##className; \
|
|
NLMISC_REGISTER_OBJECT_INDIRECT(IStepContentFactory, TStepContentFactory##className, string, key)
|
|
|
|
|
|
|
|
/** Step FACTORY **/
|
|
class IStepFactory
|
|
{
|
|
public:
|
|
virtual IStep *createStep(CMissionData &md, NLLIGO::IPrimitive *prim) = 0;
|
|
};
|
|
|
|
template <class StepClass>
|
|
class CStepFactory : public IStepFactory
|
|
{
|
|
IStep *createStep(CMissionData &md, NLLIGO::IPrimitive *prim)
|
|
{
|
|
return new StepClass(md, prim);
|
|
}
|
|
};
|
|
|
|
#define REGISTER_STEP_INDIRECT(stepClass, key) typedef CStepFactory<stepClass> TStepFactory##stepClass; \
|
|
NLMISC_REGISTER_OBJECT_INDIRECT(IStepFactory, TStepFactory##stepClass, string, string(key));
|
|
|
|
|
|
/** objective base class **/
|
|
class CContentObjective : public IStepContent
|
|
{
|
|
protected:
|
|
std::vector<std::string> _OverloadObj;
|
|
CPhrase _OverloadPhrase;
|
|
std::vector<std::string> _RoleplayObj;
|
|
CPhrase _RoleplayPhrase;
|
|
bool _HideObj;
|
|
|
|
public:
|
|
void init(CMissionData &md, NLLIGO::IPrimitive *prim);
|
|
|
|
std::string genCode(CMissionData &md);
|
|
|
|
std::string genPhrase();
|
|
};
|
|
|
|
/** special case for step if **/
|
|
|
|
class CStepIf : public IStep
|
|
{
|
|
|
|
enum TIfType
|
|
{
|
|
it_mission_done,
|
|
it_skills,
|
|
it_bricks,
|
|
it_sdb,
|
|
it_race,
|
|
it_cult,
|
|
it_civ,
|
|
it_faction_point,
|
|
it_guild_cult,
|
|
it_guild_civ,
|
|
it_guild_fame,
|
|
it_no_trial,
|
|
it_item_in_inv,
|
|
};
|
|
|
|
public:
|
|
|
|
CStepIf(CMissionData &md, NLLIGO::IPrimitive *prim);
|
|
|
|
NLLIGO::TPrimitiveSet getSubBranchs();
|
|
|
|
void fillJump(CMissionData &md, std::set<TJumpInfo> &jumpPoints);
|
|
|
|
std::string genCode(CMissionData &md);
|
|
|
|
/// type of test
|
|
TIfType _IfType;
|
|
/// If parameters
|
|
std::vector<std::string> _IfParams;
|
|
/// the list of sub branch for the dyn chat.
|
|
NLLIGO::TPrimitiveSet _SubBranchs;
|
|
};
|
|
|
|
/** special case for step player reconnect **/
|
|
|
|
class CStepPlayerReconnect : public IStep
|
|
{
|
|
// Optional jump at end of failure
|
|
std::string _JumpTo;
|
|
/// the list of sub branch
|
|
NLLIGO::TPrimitiveSet _SubBranchs;
|
|
|
|
public:
|
|
CStepPlayerReconnect(CMissionData &md, NLLIGO::IPrimitive *prim);
|
|
|
|
NLLIGO::TPrimitiveSet getSubBranchs();
|
|
|
|
std::string genCode(CMissionData &md);
|
|
|
|
void fillJump(CMissionData &md, std::set<TJumpInfo> &jumpPoints);
|
|
};
|
|
|
|
#endif // __STEP_H__
|