khanat-opennel-code/code/ryzom/tools/leveldesign/mission_compiler_lib/step.h
2010-09-24 10:27:31 +02:00

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__