// Ryzom - MMORPG Framework // 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 . //---------------------------------------------------------------------------- #include "stdpch.h" #include "ais_actions.h" #include "ai_grp_fauna.h" #include "continent_inline.h" using namespace NLMISC; using namespace NLNET; using namespace std; using namespace CAISActionEnums; using namespace AITYPES; //--------------------------------------------------------------------------------------- // Stuff used for management of log messages static bool VerboseLog=false; #define LOG if (!VerboseLog) {} else nlinfo //---------------------------------------------------------------------------- // The FAUNA_MGR context //---------------------------------------------------------------------------- // DEFINE_ACTION(ContextFaunaMgr,PLACEXYR) DEFINE_ACTION(ContextFaunaGrp,PLACEXYR) { // set the working place slot // args: string name float x, float y, sint r if (!CWorkPtr::grpFauna()) return; // get hold of the parameters and check their validity float x,y; sint32 r; uint32 alias; uint32 verticalPos; if (!getArgs(args,name(), alias, x, y, r, verticalPos)) return; // try to get a pointer to the place and create a new place if need be CAIPlaceXYR *const place=dynamic_cast(CWorkPtr::grpFauna()->places().getChildByAlias(alias)); if (!place) { nlwarning("Unable to set placeXYR coords (%.3f,%.3f,%d) as place alias %u not found in manager",x,y,r,alias); return; } // set the place coordinates place->setPosAndRadius((TVerticalPos)verticalPos, CAIPos(x,y,0,0.0f),r); } // faune places specifics DEFINE_ACTION(ContextFaunaGrp,PLXYRFAF) { // set the working place slot // args: string name float x, float y, sint r if (!CWorkPtr::grpFauna()) return; // get hold of the parameters and check their validity uint32 alias; bool flagSpawn; bool flagRest; bool flagFood; if (!getArgs(args,name(), alias, flagSpawn, flagRest, flagFood)) return; // try to get a pointer to the place and create a new place if need be CAIPlaceXYRFauna *const place=dynamic_cast(CWorkPtr::grpFauna()->places().getChildByAlias(alias)); if (!place) { nlwarning("Unable to set placeXYRFauna flags as place alias %u not found in manager", alias); return; } // set the place coordinates place->setFlag(CAIPlaceXYRFauna::FLAG_SPAWN, flagSpawn); place->setFlag(CAIPlaceXYRFauna::FLAG_REST, flagRest); place->setFlag(CAIPlaceXYRFauna::FLAG_EAT, flagFood); } DEFINE_ACTION(ContextFaunaGrp,PLXYRFAS) { // set the working place slot // args: string name float x, float y, sint r if (!CWorkPtr::grpFauna()) return; // get hold of the parameters and check their validity uint32 alias; uint32 stayTimeMin, stayTimeMax; if (!getArgs(args,name(), alias, stayTimeMin, stayTimeMax)) return; // try to get a pointer to the place and create a new place if need be CAIPlaceXYRFauna *const place=dynamic_cast(CWorkPtr::grpFauna()->places().getChildByAlias(alias)); if (!place) { nlwarning("Unable to set placeXYRFauna stay times as place alias %u not found in manager", alias); return; } // set the place coordinates place->setMinStayTime(stayTimeMin); place->setMaxStayTime(stayTimeMax); } DEFINE_ACTION(ContextFaunaGrp,PLXYRFAI) { // set the working place slot // args: string name float x, float y, sint r if (!CWorkPtr::grpFauna()) return; // get hold of the parameters and check their validity uint32 alias; uint32 index; std::string indexNext; if (!getArgs(args,name(), alias, index, indexNext)) return; // try to get a pointer to the place and create a new place if need be CAIPlaceXYRFauna *place = dynamic_cast(CWorkPtr::grpFauna()->places().getChildByAlias(alias)); if (!place) { nlwarning("Unable to set placeXYRFauna arcs as place alias %u not found in manager", alias); return; } std::vector reachableIndicesStr; NLMISC::explode(indexNext, string(","), reachableIndicesStr); std::set arcs; for(uint k = 0; k < reachableIndicesStr.size(); ++k) { if (NLMISC::nlstricmp(reachableIndicesStr[k], "next") == 0) { place->setReachNext(true); } int currentIndex; if (sscanf(reachableIndicesStr[k].c_str(), "%d", ¤tIndex) != 1) continue; arcs.insert((sint32) currentIndex); } std::vector arcVect(arcs.begin(), arcs.end()); place->setIndex(index); place->setArcs(arcVect); } // activation related parameters DEFINE_ACTION(ContextFaunaGrp,PLXYRFAA) { // set the working place slot // args: string name float x, float y, sint r if (!CWorkPtr::grpFauna()) return; // get hold of the parameters and check their validity uint32 alias; bool active; bool timeDriven; std::string timeInterval; std::string dayInterval; if (!getArgs(args,name(), alias, active, timeDriven, timeInterval, dayInterval)) return; // try to get a pointer to the place and create a new place if need be CAIPlaceXYRFauna *const place=dynamic_cast(CWorkPtr::grpFauna()->places().getChildByAlias(alias)); if (!place) { nlwarning("Unable to set placeXYRFauna stay times as place alias %u not found in manager", alias); return; } // set activation parameters place->setTimeDriven(timeDriven); if (!timeDriven) { place->setActive(active); } else { place->setTimeInterval(timeInterval); place->setDayInterval(dayInterval); } } DEFINE_ACTION(ContextFaunaMgr,GRPFAUNA) { // set the working grp // args: uint slot_in_manager [, string name [, string type]] if (!CWorkPtr::mgrFauna()) return; // get hold of the parameters and check their validity uint32 alias; std::string type; if (!getArgs(args,name(),alias)) return; // scan the manager for a group with the right alias for (uint i=0;igroups().size();++i) { CGroup*const grp = CWorkPtr::mgrFauna()->groups()[i]; //getGrpFauna(i); if (grp->getAlias()!=alias) continue; // setup the working group pointer and exit CWorkPtr::grp(grp); // push the group context onto the context stack CContextStack::setContext(ContextFaunaGrp); return; } // no match found so throw a warning and invalidate grp pointer nlwarning("GRPFAUNA failed because no group with alias %u found in manager",alias); CWorkPtr::grp(NULL); } //---------------------------------------------------------------------------- // The FAUNA_GRP context //---------------------------------------------------------------------------- DEFINE_ACTION(ContextFaunaGrp,AUTOSPWN) { // set the feed and rest times // args: float time0, float time1 if(!CWorkPtr::grpFauna()) return; uint32 autoSpawn; if (!getArgs(args, name(), autoSpawn)) return; CWorkPtr::grpFauna()->setAutoSpawn(autoSpawn != 0); LOG("AutoSpawn : %s", autoSpawn ? "true" : "false"); } DEFINE_ACTION(ContextFaunaGrp,SETTIMES) { // set the feed and rest times // args: float time0, float time1 if(!CWorkPtr::grpFauna()) return; // get hold of the parameters and check their validity double time0, time1; if (!getArgs(args,name(),time0,time1)) return; time0*=10; // quick hack ! time1*=10; // quick hack ! CWorkPtr::grpFauna()->setTimer (CGrpFauna::EAT_TIME, (uint32) time0); CWorkPtr::grpFauna()->setTimer (CGrpFauna::REST_TIME, (uint32) time1); LOG("Set timers: eat=%i sleep=%i",(uint32) time0, (uint32) time1); } DEFINE_ACTION(ContextFaunaGrp, ASSIST) { // set the assist mode for the group // args: bool assist if(!CWorkPtr::grpFauna()) return; // get hold of the parameters and check their validity uint32 assist; if (!getArgs(args,name(),assist)) return; // CWorkPtr::grpFauna()->setSolidarity(assist!=0); } DEFINE_ACTION(ContextFaunaGrp, STCYCLES) { // set the respawn and corpse time // args: float time0, float time1 if (!CWorkPtr::grpFauna()) return; // get hold of the parameters and check their validity std::string cycles; if (!getArgs(args,name(),cycles)) return; CWorkPtr::grpFauna()->setCyles(cycles); LOG("Set Cycles: %s", cycles.c_str()); } DEFINE_ACTION(ContextFaunaGrp, SPAWTIME) { // set the respawn and corpse time // args: float time0, float time1 if(!CWorkPtr::grpFauna()) return; // get hold of the parameters and check their validity double time0, time1, time2= -1; if(args.size()>=3) { if (!getArgs(args,name(),time0,time1,time2)) return; } else { if (!getArgs(args,name(),time0,time1)) return; } CWorkPtr::grpFauna()->setTimer ( CGrpFauna::SPAWN_TIME, (uint32) time0); CWorkPtr::grpFauna()->setTimer ( CGrpFauna::CORPSE_TIME, (uint32) time1); // If the LevelDesigner has specified a correct respawn time if(time2>=0) { CWorkPtr::grpFauna()->setTimer ( CGrpFauna::RESPAWN_TIME, (uint32) time2); LOG("Set spawn timers: spawn=%i corpse=%i respawn=%i",(uint32) time0, (uint32) time1, (uint32) time2); } else { LOG("Set spawn timers: spawn=%i corpse=%i respawn=45",(uint32) time0, (uint32) time1); } } DEFINE_ACTION(ContextFaunaGrp,POPVER) { // add a population version for a group // args: uint32 alias, string spawn_type, uint weight, (string sheet, uint32 count)+ if(!CWorkPtr::grpFauna()) return; const uint32 fixedArgsCount=3; if (args.size()setSpawnType(spawntype); pop->setWeight(weight); // get hold of the parameters and check their validity for (uint i=fixedArgsCount;i+1lookup(sheetId); if (!sheetPtr) { nlwarning("POPVER Add Record Invalid sheet: %s",sheet.c_str()); continue; } pop->addPopRecord(CPopulationRecord(sheetPtr,count)); } // create the population CWorkPtr::grpFauna()->setPopulation(pop); } //--------------------------------------------------------------------------------------- // Control over verbose nature of logging //--------------------------------------------------------------------------------------- NLMISC_COMMAND(verboseFaunaParseLog,"Turn on or off or check the state of verbose parser activity logging","") { if(args.size()>1) return false; if(args.size()==1) { if(args[0]==string("on")||args[0]==string("ON")||args[0]==string("true")||args[0]==string("TRUE")||args[0]==string("1")) VerboseLog=true; if(args[0]==string("off")||args[0]==string("OFF")||args[0]==string("false")||args[0]==string("FALSE")||args[0]==string("0")) VerboseLog=false; } nlinfo("verboseLogging is %s",VerboseLog?"ON":"OFF"); return true; } //---------------------------------------------------------------------------------------