khanat-opennel-code/code/ryzom/server/src/ags_test/commands.cpp

1335 lines
36 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/>.
// Nel Misc
#include "nel/misc/command.h"
#include "nel/misc/variable.h"
#include "nel/misc/file.h"
#include "nel/misc/i_xml.h"
#include "nel/misc/path.h"
#include "nel/misc/algo.h"
// Local includes
#include "ags_test.h"
#include "actor.h"
#include "actor_manager.h"
#include "macro_manager.h"
#include "position_generator.h"
#include "sheets.h"
#include "mirrors.h"
#include "ai_mgr.h"
#include "nel/ligo/primitive.h"
using namespace NLMISC;
using namespace NLNET;
using namespace std;
namespace AGS_TEST
{
//-------------------------------------------------------------------------
// Some global variables
uint32 GlobalActorCount=0;
uint32 GlobalActorUpdates=0;
uint32 GlobalActorMoves=0;
NLMISC_VARIABLE(uint32, GlobalActorCount, "actors");
NLMISC_VARIABLE(uint32, GlobalActorUpdates, "updates");
NLMISC_VARIABLE(uint32, GlobalActorMoves, "moves");
//-------------------------------------------------------------------------
// some globals local to this file
static CActor::EActivity DefaultActivity = CActor::SQUARE;
static NLLIGO::CPrimZone * DefaultPatatEvolution = 0;
static float DefaultOrientation = 0.0f;
static float DefaultMagnetRange = 50.0f;
static float DefaultMagnetDecay = 10.0f;
static float DefaultAttackDistance = 0.0f;
static std::string DefaultBehaviour;
static int DefaultDialogue = 0;
static float DefaultMinSpawnTime = 25.0f;
static float DefaultMaxSpawnTime = 25.0f;
static map<string,string> PrimOrigin; // map of prim points and zones to prim filename
static std::string SpawnName; // name or coordinates of the spawn point
static CAiMgrFile * AIFile=0; // the file to which ai managers are to be added
static CAiMgrInstance * AIManager=0; // the ai manager to which entities are to be added
static CAiMgrPopulation * AIPopulation=0; // the ai manager to which entities are to be added
//-------------------------------------------------------------------------
// some stuff for manageing the output of AI_MANAGER files
CAiMgrFile *CurrentAiMgrFile;
CAiMgrInstance *CurrentAiMgrInstance;
//-------------------------------------------------------------------------
// CLEANING AND INITIALISING THE SYSTEM
// Command for resetting the system
NLMISC_COMMAND(actorReset,"Remove all actors and reset the actor system","")
{
COMMAND_MACRO_RECORD_TEST
CActorManager::release();
CActorManager::init();
GlobalActorCount = 0;
return true;
}
/*
// Command for removing actors
NLMISC_COMMAND(actorRemove,"Kill one or more actors","<actor name> [<actor name>...]")
{
if(args.size() <1) return false;
COMMAND_MACRO_RECORD_TEST
// iterate through the actor names
for (unsigned i=0;i<args.size();i++)
CActorManager::killActor(args[i]);
return true;
}
*/
// Command for loading .prim file
NLMISC_COMMAND(loadPrim,"load a .prim file","<file name>")
{
if(args.size() !=1) return false;
CIFile f(CPath::lookup(args[0]));
NLLIGO::CPrimRegion region;
CIXml xml;
xml.init(f);
region.serial(xml);
uint i;
// adding zones to move manager
for (i=0; i<region.VZones.size(); ++i)
CMoveManager::addPrimZone(region.VZones[i]);
// adding points and zones to the position generator
for (i=0; i<region.VZones.size(); ++i)
CPositionGenerator::addSpawnZone(region.VZones[i]);
for (i=0; i<region.VPoints.size(); ++i)
CPositionGenerator::addSpawnPoint(region.VPoints[i]);
// creating a map of point and zone names -> prim file
for (i=0; i<region.VZones.size(); ++i)
PrimOrigin[region.VZones[i].getName()]=args[0];
for (i=0; i<region.VPoints.size(); ++i)
PrimOrigin[region.VPoints[i].getName()]=args[0];
return true;
}
//-------------------------------------------------------------------------
// ACTOR CREATION POSITION GENERATOR
// Command for configuring how actors are placed on landscape
NLMISC_COMMAND(actorCreatePattern,"Setup pattern for new actors","<pattern> [...]")
{
if(args.size() <1) return false;
COMMAND_MACRO_RECORD_TEST
if (args[0]==std::string("grid") && args.size()==1)
{}
else if (args[0]==std::string("line") && args.size()==1)
{}
else if (args[0]==std::string("line") && args.size()==2)
CPositionGenerator::setSpacing(atoi(args[0].c_str()));
else
return false;
CPositionGenerator::setPattern(args[0]);
return true;
}
// Command for configuring how actors are placed on landscape
NLMISC_COMMAND(actorCreateSpacing,"Setup spacing for new actors","<spacing>")
{
if(args.size() !=1) return false;
COMMAND_MACRO_RECORD_TEST
CPositionGenerator::setSpacing(atoi(args[0].c_str()));
return true;
}
// Command for configuring how actors are placed on landscape
NLMISC_COMMAND(actorCreatePosition,"Setup start position for new actors","<x> <y> [<spacing>]")
{
COMMAND_MACRO_RECORD_TEST
switch(args.size())
{
case 0:
return false;
case 1:
CPositionGenerator::setPosition(args[0].c_str());
SpawnName=args[0];
break;
case 3:
CPositionGenerator::setSpacing(atoi(args[2].c_str()));
// no break - drop through!
case 2:
CPositionGenerator::setPosition(atoi(args[0].c_str()), atoi(args[1].c_str()));
SpawnName=args[0]+" "+args[1];
break;
default:
return false;
}
return true;
}
//-------------------------------------------------------------------------
// CREATING ACTORS
static CActor *createActor(std::string type,std::string name)
{
CActor *theNewActor=CActorManager::newActor(type,name);
if (theNewActor)
{
theNewActor->setActivity (DefaultActivity);
theNewActor->setPrimZone (DefaultPatatEvolution);
theNewActor->setAngle (DefaultOrientation);
theNewActor->setMagnetRange (DefaultMagnetRange,DefaultMagnetDecay);
theNewActor->setBehaviour (DefaultBehaviour);
theNewActor->setAttackDistance (DefaultAttackDistance);
theNewActor->setChatSet (DefaultDialogue);
}
return theNewActor;
}
void addPopulation(std::string type,std::string name,uint count)
{
// if no file has been opened yet then create one
if (AIFile==0)
{
AIFile=new CAiMgrFile;
AIFile->setName(std::string("ags_test.ai_manager"));
CAiMgr::addFile(AIFile);
}
// create a new ai_manager instance
AIManager= new CAiMgrInstance;
AIFile->addChild(AIManager);
AIManager->setName(name);
AIManager->setCreatureLimit(count);
if (DefaultPatatEvolution!=0)
AIManager->setBoundary(DefaultPatatEvolution->getName());
// add a population record
AIPopulation=new CAiMgrPopulation;
AIManager->addPopulation(AIPopulation);
AIPopulation->setName(name);
AIPopulation->setOrientation(DefaultOrientation);
AIPopulation->setQuantity(count);
AIPopulation->setSpawnRate(int(DefaultMinSpawnTime*1000.0),int(DefaultMaxSpawnTime*1000.0));
AIPopulation->setType(NLMISC::CSheetId(type));
// add a spawn location
CAiMgrSpawn *spawn=new CAiMgrSpawn;
AIManager->addSpawn(spawn);
spawn->setPlace(SpawnName);
// check whether the spawn or evolution patats are in an unrefferenced prim file
if (PrimOrigin.find(CPositionGenerator::getSpawnName())!=PrimOrigin.end())
{
if (AIFile->getPrim().empty())
AIFile->setPrim(PrimOrigin[CPositionGenerator::getSpawnName()]);
else
if (AIFile->getPrim()!=PrimOrigin[CPositionGenerator::getSpawnName()])
nlwarning("WARNING: Can only apply one prim file per AI manager - spawn '%s' in '%s' NOT '%s'",
CPositionGenerator::getSpawnName().c_str(),
PrimOrigin[CPositionGenerator::getSpawnName()].c_str(),
AIFile->getPrim().c_str() );
}
if (DefaultPatatEvolution!=0)
if (PrimOrigin.find(DefaultPatatEvolution->getName())!=PrimOrigin.end())
{
if (AIFile->getPrim().empty())
AIFile->setPrim(PrimOrigin[DefaultPatatEvolution->getName()]);
else
if (AIFile->getPrim()!=PrimOrigin[DefaultPatatEvolution->getName()])
nlwarning("WARNING: Can only apply one prim file per AI manager - spawn '%s' in '%s' NOT '%s'",
DefaultPatatEvolution->getName().c_str(),
PrimOrigin[DefaultPatatEvolution->getName()].c_str(),
AIFile->getPrim().c_str() );
}
}
// Command for creating actors
NLMISC_COMMAND(actorCreate,"Add one or more moving actors","<actor type> <actor name> [<actor name>...]")
{
if(args.size() <2) return false;
COMMAND_MACRO_RECORD_TEST
// store the population information in an AI_MGR file record
addPopulation(args[0],args[1],args.size()-1);
// iterate through the actor names
for (unsigned i=1;i<args.size();i++)
{
// create the named actor and add them to the GPMS and other services
/*
CActor *theNewActor=CActorManager::newActor(args[0],args[i]);
theNewActor->setActivity (DefaultActivity);
theNewActor->setPrimZone (DefaultPatatEvolution);
theNewActor->setAngle (DefaultOrientation);
theNewActor->setMagnetRange (DefaultMagnetRange,DefaultMagnetDecay);
theNewActor->setBehaviour (DefaultBehaviour);
theNewActor->setAttackDistance (DefaultAttackDistance);
theNewActor->setChatSet (DefaultDialogue);
*/
CActor *theNewActor=createActor(args[0],args[i]);
}
return true;
}
// Command for creating actors
NLMISC_COMMAND(actorCreateCustom,"Add one or more moving actors","<actor type> [ [-act <activity>] [-pos <posx> <posy>] [-ctop <color>] [-cbot <color>] [-chair <color>] [-rhand <int>] [-lhand <int>] ] <actor name> [<actor name>...]")
{
if(args.size() <2) return false;
COMMAND_MACRO_RECORD_TEST
/*
uint i;
for (i=1; i<args.size(); ++i)
{
}
// store the population information in an AI_MGR file record
addPopulation(args[0],args[1],args.size()-1);
// iterate through the actor names
for (unsigned i=1;i<args.size();i++)
{
// create the named actor and add them to the GPMS and other services
CActor *theNewActor=createActor(args[0],args[i]);
}
*/
return true;
}
// Command for creating actors
NLMISC_COMMAND(actorCreateGroup,"Add a group of actors all at once","<actor type> <group name> <count>")
{
if(args.size()!=3 || atoi(args[2].c_str())<=0 || atoi(args[2].c_str())>1024) return false;
COMMAND_MACRO_RECORD_TEST
CActorGroup *theNewGroup=CActorManager::newActorGroup(args[1]);
// store the population information in an AI_MGR file record
addPopulation(args[0],args[1],atoi(args[2].c_str()));
// iterate through the actor names
for (int i=0;i<atoi(args[2].c_str());i++)
{
// create the named actor and add them to the GPMS and other services
/*
CActor *theNewActor=CActorManager::newActor(args[0],args[1]+toString(theNewGroup->actorCount()));
theNewActor->setActivity (DefaultActivity);
theNewActor->setPrimZone (DefaultPatatEvolution);
theNewActor->setAngle (DefaultOrientation);
theNewActor->setMagnetRange (DefaultMagnetRange,DefaultMagnetDecay);
theNewActor->setBehaviour (DefaultBehaviour);
theNewActor->setAttackDistance (DefaultAttackDistance);
theNewActor->setChatSet (DefaultDialogue);
*/
CActor *theNewActor=createActor(args[0],args[1]+toString(theNewGroup->actorCount()));
if (theNewActor)
theNewGroup->addActor(theNewActor);
}
return true;
}
// Command for creating actors
NLMISC_COMMAND(actorCreateMoving,"Add one or more static actors","<actor type> <actor name> [<actor name>...]")
{
if(args.size() ==1) return false;
COMMAND_MACRO_RECORD_TEST
if (args.size()==0)
{
// no actor names specified so setup the default value to apply to new actors
DefaultActivity = CActor::SQUARE;
}
else
{
// store the population information in an AI_MGR file record
addPopulation(args[0],args[1],args.size()-1);
// iterate through the actor names
for (unsigned i=1;i<args.size();i++)
{
// create the named actor and add them to the GPMS and other services
/*
CActor *theNewActor= CActorManager::newActor(args[0],args[i]);
theNewActor->setPrimZone (DefaultPatatEvolution);
theNewActor->setAngle (DefaultOrientation);
theNewActor->setMagnetRange (DefaultMagnetRange,DefaultMagnetDecay);
theNewActor->setBehaviour (DefaultBehaviour);
theNewActor->setAttackDistance (DefaultAttackDistance);
theNewActor->setChatSet (DefaultDialogue);
*/
CActor *theNewActor=createActor(args[0],args[i]);
if (theNewActor)
{
theNewActor->doSquare();
theNewActor->setActivity(CActor::SQUARE);
}
}
}
return true;
}
// Command for creating actors
NLMISC_COMMAND(actorCreateStationary,"Add one or more static actors","<actor type> [<actor name>...]")
{
if(args.size() ==1) return false;
COMMAND_MACRO_RECORD_TEST
if (args.size()==0)
{
// no actor names specified so setup the default value to apply to new actors
DefaultActivity = CActor::NOTHING;
}
else
{
// store the population information in an AI_MGR file record
addPopulation(args[0],args[1],args.size()-1);
// iterate through the actor names
for (unsigned i=1;i<args.size();i++)
{
// create the named actor and add them to the GPMS and other services
/*
CActor *theNewActor= CActorManager::newActor(args[0],args[i]);
theNewActor->setPrimZone (DefaultPatatEvolution);
theNewActor->setAngle (DefaultOrientation);
theNewActor->setMagnetRange (DefaultMagnetRange,DefaultMagnetDecay);
theNewActor->setBehaviour (DefaultBehaviour);
theNewActor->setAttackDistance (DefaultAttackDistance);
theNewActor->setChatSet (DefaultDialogue);
*/
CActor *theNewActor=createActor(args[0],args[i]);
if (theNewActor)
{
theNewActor->doNothing();
theNewActor->setActivity(CActor::NOTHING);
}
}
}
return true;
}
// Command for creating actors
NLMISC_COMMAND(actorCreateWandering,"Add one or more static actors","<actor type> <actor name> [<actor name>...]")
{
if(args.size() ==1) return false;
COMMAND_MACRO_RECORD_TEST
if (args.size()==0)
{
// no actor names specified so setup the default value to apply to new actors
DefaultActivity = CActor::WANDER;
}
else
{
// store the population information in an AI_MGR file record
addPopulation(args[0],args[1],args.size()-1);
// iterate through the actor names
for (unsigned i=1;i<args.size();i++)
{
// create the named actor and add them to the GPMS and other services
/*
CActor *theNewActor= CActorManager::newActor(args[0],args[i]);
theNewActor->setPrimZone (DefaultPatatEvolution);
theNewActor->setAngle (DefaultOrientation);
theNewActor->setMagnetRange (DefaultMagnetRange,DefaultMagnetDecay);
theNewActor->setBehaviour (DefaultBehaviour);
theNewActor->setAttackDistance (DefaultAttackDistance);
theNewActor->setChatSet (DefaultDialogue);
*/
CActor *theNewActor=createActor(args[0],args[i]);
if (theNewActor)
{
theNewActor->doWander();
theNewActor->setActivity(CActor::WANDER);
}
}
}
return true;
}
// Command for moving actor from a group to another
NLMISC_COMMAND(moveActorsToGroup,"Move actors from a group to another (source group is emptied). If no source specified, all actors from defaultGroup assumed.","[<source group>] <dest group>")
{
COMMAND_MACRO_RECORD_TEST
if (args.size() < 1)
return false;
if (args.size() > 2)
return false;
if (args.size() == 1)
CActorManager::setActorsToGroup("defaultGroup", args[0]);
else
CActorManager::setActorsToGroup(args[0], args[1]);
return true;
}
//-------------------------------------------------------------------------
// MANAGING EXISTING ACTORS
// Command for setting an actor PrimZone
NLMISC_COMMAND(actorSetPatatEvolution,"Set actor patat evolution","<patat name> [<actor name>...]")
{
if(args.size() <1) return false;
COMMAND_MACRO_RECORD_TEST
NLLIGO::CPrimZone *primZone = CMoveManager::getPrimZone(args[0]);
if (primZone == NULL)
{
nlwarning("Can't find prim zone '%s'", args[0].c_str());
return false;
}
if (args.size()==1)
{
// no actor names specified so setup the default value to apply to new actors
DefaultPatatEvolution = primZone;
}
else
{
// apply this evolution patat to the last manager stored in ai manager
if (AIManager)
AIManager->setBoundary(args[0]);
// iterate through the actor names
uint i;
for (i=1;i<args.size();i++)
{
CActor *actor=CActorManager::getActor(args[i]);
if (actor==0)
nlinfo("Unknown actor: '%s'",args[i].c_str());
else
actor->setPrimZone(primZone);
}
}
return true;
}
// Command for setting actor orientations
NLMISC_COMMAND(actorSetOrientation,"Add one or more static actors","<direction> [<actor name>...]")
{
if(args.size() <1) return false;
COMMAND_MACRO_RECORD_TEST
const char *angleNames[]= {"E", "ENE", "NE", "NNE", "N","NNW","NW","WNW","W","WSW","SW","SSW","S","SSE","SE","ESE"};
unsigned i;
float theta;
#ifndef NL_OS_WINDOWS
#define stricmp strcasecmp
#endif
for (i=0; i<sizeof(angleNames)/sizeof(angleNames[0]) &&
stricmp(args[0].c_str(),angleNames[i]); i++)
;
if (i<(sizeof(angleNames)/sizeof(angleNames[0])))
theta=3.14159265359f*2.0f*(float)i/(float)(sizeof(angleNames)/sizeof(angleNames[0]));
else
theta=(float)atof(args[0].c_str())/360.0f*2.0f*3.14159265359f;
if (args.size()==1)
{
// no actor names specified so setup the default value to apply to new actors
DefaultOrientation = theta;
}
else
{
// apply this orientation to the last manager stored in ai manager
if (AIPopulation)
AIPopulation->setOrientation(theta);
// iterate through the actor names
for (i=1;i<args.size();i++)
{
CActor *actor=CActorManager::getActor(args[i]);
if (actor==0)
nlinfo("Unknown actor: '%s'",args[i].c_str());
else
actor->setAngle(theta);
}
}
return true;
}
// Command for setting actor magnet range
NLMISC_COMMAND(actorSetMagnetRange,"Set the magnet properties for wandering behaviour","<range> [<decay>] [<actor name>...]")
{
if(args.size() <1) return false;
COMMAND_MACRO_RECORD_TEST
float range=(float)atof(args[0].c_str());
if (range<=0.0f) return false;
unsigned start;
float decay=(float)atof(args[0].c_str());
if (decay<0.0f) return false;
if (decay==0.0f)
{
decay=10.0f;
start=1;
}
else
start=2;
if((sint)args.size() <(start+1)) return false;
if (args.size()<start)
{
// no actor names specified so setup the default value to apply to new actors
DefaultMagnetRange = range;
if (start>1)
DefaultMagnetDecay = decay;
}
else
{
// iterate through the actor names
for (unsigned i=start;i<args.size();i++)
{
CActor *actor=CActorManager::getActor(args[i]);
if (actor==0)
nlinfo("Unknown actor: '%s'",args[i].c_str());
else
actor->setMagnetRange(range,decay);
}
}
return true;
}
// Command for setting actor attack distance
NLMISC_COMMAND(actorSetAttackDistance,"set actor attack distance","<distance> [<actor name>...]")
{
if(args.size() <1) return false;
COMMAND_MACRO_RECORD_TEST
float distance=(float)atof(args[0].c_str());
// if (distance<=0.0f) return false;
if (args.size()<2)
{
// no actor names specified so setup the default value to apply to new actors
DefaultAttackDistance = distance;
}
else
{
// iterate through the actor names
for (unsigned i=1;i<args.size();i++)
{
CActor *actor=CActorManager::getActor(args[i]);
if (actor==0)
nlinfo("Unknown actor: '%s'",args[i].c_str());
else
actor->setAttackDistance(distance);
}
}
return true;
}
// Command for setting actor mode
/*NLMISC_COMMAND(actorSetMode,"Set actor mode","<mode> <actor name>[...]")
{
if(args.size() <2) return false;
COMMAND_MACRO_RECORD_TEST
// iterate through the named actors setting their mode
for (unsigned i=1;i<args.size();i++)
{
CActor *actor=CActorManager::getActor(args[i]);
if (actor==0)
nlinfo("Unknown actor: '%s'",args[i].c_str());
else
actor->setMode(args[0]);
}
return true;
}*/
// Command for setting actor behaviour
NLMISC_COMMAND(actorSetBehaviour,"Set actor behaviour","<behaviour> [<actor name>...]")
{
if(args.size() <1) return false;
COMMAND_MACRO_RECORD_TEST
if (args.size()<2)
{
// no actor names specified so setup the default value to apply to new actors
DefaultBehaviour = args[0];
}
else if (args.size() == 2 && args[1] == "all")
{
uint num = CActorManager::numActors();
uint i;
for (i=0; i<num; ++i)
{
CActor *actor=CActorManager::getActor(i);
if (actor != NULL)
actor->setBehaviour(args[0]);
}
}
else
{
// iterate through the named actors setting their behaviour
for (unsigned i=1;i<args.size();i++)
{
CActor *actor=CActorManager::getActor(args[i]);
if (actor==0)
nlinfo("Unknown actor: '%s'",args[i].c_str());
else
actor->setBehaviour(args[0]);
}
}
return true;
}
// Command for setting actor dialogue for bot chat
NLMISC_COMMAND(actorSetDialogue,"Set actor bot-chat dialogue","<dialogue set> [<actor name>...]")
{
if(args.size() <1) return false;
COMMAND_MACRO_RECORD_TEST
int dialogue=atoi(args[0].c_str());
if (args.size()<2)
{
// no actor names specified so setup the default value to apply to new actors
DefaultDialogue = dialogue;
}
else
{
// iterate through the named actors setting their behaviour
for (unsigned i=1;i<args.size();i++)
{
CActor *actor=CActorManager::getActor(args[i]);
if (actor==0)
nlinfo("Unknown actor: '%s'",args[i].c_str());
else
actor->setChatSet(dialogue);
}
}
return true;
}
// Command for setting actor respawn time (when dead)
NLMISC_COMMAND(actorSetRespawnDelay,"set actor respawn delay","<min time> [<max time>] [<actor name>...]")
{
if(args.size() <1) return false;
COMMAND_MACRO_RECORD_TEST
float min=(float)atof(args[0].c_str());
if (min<=0.0f) return false;
unsigned start;
float max=(float)atof(args[0].c_str());
if (max==0.0f)
{
max=min;
start=1;
}
else
{
if (max<min)
return false;
start=2;
}
if((sint)args.size() <(start+1)) return false;
if (args.size()<start)
{
// no actor names specified so setup the default value to apply to new actors
DefaultMinSpawnTime = min;
if (start>1)
DefaultMaxSpawnTime = max;
}
else
{
// apply this orientation to the last manager stored in ai manager
if (AIPopulation)
AIPopulation->setSpawnRate(int(1000.0*min),int(1000.0*max));
// iterate through the actor names
for (unsigned i=start;i<args.size();i++)
{
CActor *actor=CActorManager::getActor(args[i]);
if (actor==0)
nlinfo("Unknown actor: '%s'",args[i].c_str());
else
actor->setSpawnTime(min,max);
}
}
return true;
}
// Command for making actors walk in a square pattern
NLMISC_COMMAND(actorSetActivitySquare,"Make actors walk in a square shape","[<actor name>...]")
{
if(args.size() <1) return false;
COMMAND_MACRO_RECORD_TEST
if (args.size()==0)
{
// no actor names specified so setup the default value to apply to new actors
DefaultActivity = CActor::SQUARE;
}
else if (args.size() == 1 && args[0] == "all")
{
uint num = CActorManager::numActors();
uint i;
for (i=0; i<num; ++i)
{
CActor *actor=CActorManager::getActor(i);
if (actor != NULL)
actor->setActivity(CActor::SQUARE);
}
}
else
{
// iterate through the actor names
for (unsigned i=0;i<args.size();i++)
{
CActor *actor=CActorManager::getActor(args[i]);
if (actor==0)
nlinfo("Unknown actor: '%s'",args[i].c_str());
else
CActorManager::getActor(args[i])->setActivity(CActor::SQUARE);
}
}
return true;
}
// Command for making actor(s) wander about randomly
NLMISC_COMMAND(actorSetActivityWander,"Make actors walk in a square shape","[<actor name>...]")
{
if(args.size() <1) return false;
COMMAND_MACRO_RECORD_TEST
if (args.size()==0)
{
// no actor names specified so setup the default value to apply to new actors
DefaultActivity = CActor::WANDER;
}
else if (args.size() == 1 && args[0] == "all")
{
uint num = CActorManager::numActors();
uint i;
for (i=0; i<num; ++i)
{
CActor *actor=CActorManager::getActor(i);
if (actor != NULL)
actor->setActivity(CActor::WANDER);
}
}
else
{
// iterate through the actor names
for (unsigned i=0;i<args.size();i++)
{
CActor *actor=CActorManager::getActor(args[i]);
if (actor==0)
nlinfo("Unknown actor: '%s'",args[i].c_str());
else
CActorManager::getActor(args[i])->setActivity(CActor::WANDER);
}
}
return true;
}
// Command for making actor(s) stand still
NLMISC_COMMAND(actorSetActivityStationary,"Make actors stop walking/ fighting","[<actor name>...]")
{
if(args.size() <1) return false;
COMMAND_MACRO_RECORD_TEST
if (args.size()==0)
{
// no actor names specified so setup the default value to apply to new actors
DefaultActivity = CActor::NOTHING;
}
else if (args.size() == 1 && args[0] == "all")
{
uint num = CActorManager::numActors();
uint i;
for (i=0; i<num; ++i)
{
CActor *actor=CActorManager::getActor(i);
if (actor != NULL)
actor->setActivity(CActor::NOTHING);
}
}
else
{
// iterate through the actor names
for (unsigned i=0;i<args.size();i++)
{
CActor *actor=CActorManager::getActor(args[i]);
if (actor==0)
nlinfo("Unknown actor: '%s'",args[i].c_str());
else
CActorManager::getActor(args[i])->setActivity(CActor::NOTHING);
}
}
return true;
}
// Command for making actors attack entities
NLMISC_COMMAND(actorFight,"Make actors fight eachother","<actor or group name> <actor or group name>")
{
if(args.size()!=2) return false;
COMMAND_MACRO_RECORD_TEST
CActor *actor0=CActorManager::getActor(args[0]);
CActor *actor1=CActorManager::getActor(args[1]);
CActorGroup *group0=CActorManager::getActorGroup(args[0]);
CActorGroup *group1=CActorManager::getActorGroup(args[1]);
if (actor0)
{
if (actor1)
{
actor0->doFight(actor1);
nlinfo("ACTOR %s Attacking ACTOR: %s",args[0].c_str(),args[1].c_str());
// actor1->doFight(actor0);
}
else if (group1)
{
actor0->doFight(group1);
nlinfo("ACTOR %s Attacking GROUP: %s",args[0].c_str(),args[1].c_str());
// group1->doFight(actor0);
}
else
{
CEntityId id;
id.fromString( args[1].c_str() );
actor0->doFight(id);
nlinfo("ACTOR %s Attacking entity with SID: %s",args[0].c_str(),args[1].c_str());
}
}
else if (group0)
{
if (actor1)
{
group0->doFight(actor1);
nlinfo("GROUP %s Attacking ACTOR: %s",args[0].c_str(),args[1].c_str());
// actor1->doFight(group0);
}
else if (group1)
{
group0->doFight(group1);
nlinfo("GROUP %s Attacking GROUP: %s",args[0].c_str(),args[1].c_str());
// group1->doFight(group0);
}
else
{
CEntityId id;
id.fromString( args[1].c_str() );
//group0->doFight(id);
nlinfo("GROUP %s Cannot attack: %s (no actor or group of this name found in this service)",args[0].c_str(),args[1].c_str());
}
}
else nlinfo("Actor or group doesn't exist: %s",args[0].c_str());
return true;
}
// Command for displaying all of or named actors
NLMISC_COMMAND(actorDisplay,"List the actors","[<actor name>...]")
{
COMMAND_MACRO_RECORD_TEST
if(args.size() <1)
{
// list all the actors' stats
for (unsigned i=0;i<CActorManager::numActors();++i)
CActorManager::getActor(i)->display();
}
else
{
// iterate through the named actors listing their stats
for (unsigned i=0;i<args.size();i++)
{
CActor *actor=CActorManager::getActor(args[i]);
if (actor==0)
log.displayNL("Unknown actor: '%s'",args[i].c_str());
else
actor->display(&log);
}
}
return true;
}
//-------------------------------------------------------------------------
// MANAGING AI FILES
// command to display ai manager hierachy
NLMISC_COMMAND(aiDisplay,"Display the ai manager hierachy","")
{
if(args.size()!=0) return false;
COMMAND_MACRO_RECORD_TEST
CAiMgr::display(0, &log);
return true;
}
// command to set the output file for ai populations
NLMISC_COMMAND(aiFile,"Set the file name for the following ai populations","<file name>")
{
if(args.size()!=1) return false;
COMMAND_MACRO_RECORD_TEST
AIFile=new CAiMgrFile;
AIFile->setName(args[0]+std::string(".ai_manager"));
CAiMgr::addFile(AIFile);
return true;
}
// command to write ai manager hierachy to files
NLMISC_COMMAND(aiWrite,"Write the ai manager hierachy to disk","")
{
if(args.size()!=0) return false;
COMMAND_MACRO_RECORD_TEST
CAiMgr::write();
return true;
}
// command to read ai manager hierachy from files
NLMISC_COMMAND(aiRead,"Read the ai manager hierachy from disk","<path>")
{
if(args.size()!=1) return false;
COMMAND_MACRO_RECORD_TEST
CAiMgr::read(args[0],true);
return true;
}
//-------------------------------------------------------------------------
// MANAGING MACROS
// Command for creating a new macro
NLMISC_COMMAND(macroRecord,"Start recording a new macro","<macro name>")
{
if(args.size() !=1)
return false;
CMacroManager::recordMacro(args[0]);
return true;
}
// Command for adding a line to a macro
NLMISC_COMMAND(macroStopRecord,"stop macro recording","")
{
if(args.size() !=0)
return false;
CMacroManager::stopRecord();
return true;
}
// Command for executing a macro
NLMISC_COMMAND(macroExecute,"Execute one or more macros","<macro name> [<macro name>...]")
{
if(args.size() <1)
return false;
for (unsigned i=0;i<args.size();++i)
CMacroManager::execute(args[i],log);
return true;
}
// Command for executing a macro
NLMISC_COMMAND(macroDisplay,"Display list of macros or contents of the given macros","")
{
if(args.size()==0)
CMacroManager::listMacros(&log);
else
for (unsigned i=0;i<args.size();++i)
CMacroManager::displayMacro(args[i], &log);
return true;
}
// Command for executing a macro
NLMISC_COMMAND(sheetDisplay,"Display list of sheets read","")
{
CSheets::display(&log);
return true;
}
//
NLMISC_COMMAND(generateScript, "Generate a sript that spawn a given type of creature", "<script_name> <spawn x> <spawn y> <spacing> <width> <extension> [<filter> ...]")
{
if (args.size() < 6)
return false;
const string &scriptName = args[0];
double spawnX = atof(args[1].c_str());
double spawnY = atof(args[2].c_str());
double spacing = atof(args[3].c_str());
uint width = atoi(args[4].c_str());
const string &extension = args[5];
vector<string> filters;
uint i;
for (i=6; i<args.size(); ++i)
filters.push_back(args[i]);
vector<string> files;
CPath::getFileList(extension, files);
if (!filters.empty())
{
vector<string>::iterator itr;
for (itr=files.begin(); itr!=files.end(); )
{
bool match = false;
if (files[i][0] != '_')
{
for (i=0; !match && i<filters.size(); ++i)
if (testWildCard(*itr, filters[i]))
match = true;
}
if (match)
++itr;
else
itr = files.erase(itr);
}
}
if (files.empty())
return false;
char buffer[2048];
COFile script;
if (!script.open(scriptName))
return false;
smprintf(buffer, 2048, "! %s\n", scriptName.c_str());
script.serialBuffer((uint8*)buffer, strlen(buffer));
smprintf(buffer, 2048, "! Generated using args: %s %g %g %g %d %s\n\n", scriptName.c_str(), spawnX, spawnY, spacing, width, extension.c_str());
script.serialBuffer((uint8*)buffer, strlen(buffer));
if (!filters.empty())
{
smprintf(buffer, 2048, "! Filters are:");
script.serialBuffer((uint8*)buffer, strlen(buffer));
for (i=0; i<filters.size(); ++i)
{
smprintf(buffer, 2048, " %s", filters[i].c_str());
script.serialBuffer((uint8*)buffer, strlen(buffer));
}
smprintf(buffer, 2048, "\n\n");
script.serialBuffer((uint8*)buffer, strlen(buffer));
}
smprintf(buffer, 2048, "! %d actor sheets found\n\n", files.size());
script.serialBuffer((uint8*)buffer, strlen(buffer));
smprintf(buffer, 2048, "cmd actorCreateStationary\ncmd actorSetOrientation 0\n\n");
script.serialBuffer((uint8*)buffer, strlen(buffer));
double cx = spawnX, cy = spawnY;
uint inLine = 0;
for (i=0; i<files.size(); ++i)
{
string fileName = CFile::getFilename(files[i]);
string name = CFile::getFilenameWithoutExtension(fileName);
smprintf(buffer, 2048, "cmd actorCreatePosition %d %d\ncmd actorCreate %s %s\n", (int)cx, (int)cy, fileName.c_str(), name.c_str());
script.serialBuffer((uint8*)buffer, strlen(buffer));
++inLine;
cx += spacing;
if (inLine >= width)
{
cx = spawnX;
cy += spacing;
inLine = 0;
}
}
script.close();
return true;
}
//
NLMISC_COMMAND(generateAndRun, "Generate and run a sript that spawn a given type of creature", "<spawn x> <spawn y> <spacing> <width> <extension> [<filter> ...]")
{
string scriptfile = IService::getInstance()->WriteFilesDirectory.toString()+"ags_generated.script";
string commandLine = "generateScript "+scriptfile;
uint i;
for (i=0; i<args.size(); ++i)
commandLine += string(" ")+args[i];
// remove file first
CFile::deleteFile(scriptfile);
// generate script
ICommand::execute(commandLine, log);
// run script
ICommand::execute("runScript ags_generated "+scriptfile, log);
return true;
}
//
NLMISC_COMMAND(checkGenerateAndRun, "Generate and run a sript that spawn a given type of creature", "<script_name> <spawn x> <spawn y> <spacing> <width> <extension> [<filter> ...]")
{
if (args.size() < 6)
return false;
string scriptName = args[0];
string filename = scriptName+".script";
string scriptfile = CPath::lookup(filename, false, false);
if (scriptfile.empty())
{
if (!CFile::isExists("data_shard/"))
CFile::createDirectory("data_shard/");
if (!CFile::isExists("data_shard/ags_script/"))
CFile::createDirectory("data_shard/ags_script/");
scriptfile = string("data_shard/ags_script/")+filename;
string commandLine = "generateScript "+scriptfile;
uint i;
for (i=1; i<args.size(); ++i)
commandLine += string(" ")+args[i];
// generate script
ICommand::execute(commandLine, log);
}
// run script
ICommand::execute("runScript "+scriptName+" "+scriptfile, log);
return true;
}
//
//NLMISC_COMMAND
NLMISC_COMMAND(setTargets, "set targets for a multi cast", "<caster entityId> <cast_time> [<target1 entityId> ...]")
{
if (args.size() < 2)
return false;
CEntityId caster;
list<CEntityId> targets;
caster.fromString(args[0].c_str());
CMirrorPropValueList<TDataSetRow> targetList(TheDataset, caster, "TargetList");
targetList.clear();
uint i;
for (i=args.size()-1; i>=2; --i)
{
CEntityId target;
target.fromString(args[i].c_str());
TDataSetRow targetIndex = CMirrors::DataSet->getDataSetRow(target);
targetList.push_front(targetIndex);
}
TGameCycle castTime = CTickEventHandler::getGameCycle() + atoi(args[1].c_str());
targetList.push_front(*((TDataSetRow*)(&castTime)));
return true;
}
//-------------------------------------------------------------------------
} // end of namespace AGS_TEST