DEFINE_ACTION(ContextNpcMgr, SPIREGRP) { CMgrNpc* mgr = CWorkPtr::mgrNpc(); if (!mgr) return; uint32 alias; string spireName; if (!getArgs(args, name(), alias, spireName)) return; string grpName = "spire_group_"+spireName; CGroupNpc* grp = new CGroupNpc(mgr, alias, grpName, RYAI_MAP_CRUNCH::Nothing); grp->setAutoSpawn(false); mgr->groups().addChild(grp); CWorkPtr::grp(grp); if (!CWorkPtr::grpNpc()) { nlwarning("Failed to select spire group %s as not found in manager: %s", grpName.c_str(), CWorkPtr::mgrNpc()->getName().c_str()); return; } CStateMachine* stateMachine = CWorkPtr::eventReactionContainer(); if (stateMachine) grp->setStartState(stateMachine->cstStates()[0]); CContextStack::setContext(ContextNpcGrp); }
DEFINE_ACTION(ContextNpcGrp, SPIREBOT) { CGroupNpc* grp = CWorkPtr::grpNpc(); if (!grp) return; uint32 alias; string spireName; if (!getArgs(args, name(), alias, spireName)) return; string botName = "spire_bot_"+spireName; CBotNpc* bot = new CBotNpc(grp, alias, botName); grp->bots().addChild(bot); CWorkPtr::bot(bot); if (!CWorkPtr::botNpc()) { nlwarning("Failed to select spire bot %s as not found in group: %s", botName.c_str(), CWorkPtr::grpNpc()->getName().c_str()); return; } if (bot->getChat().isNull()) bot->newChat(); bot->getChat()->add(bot->getAIInstance(), "op:spire"); bot->setStuck(true); // set workptr state to this state CContextStack::setContext(ContextNpcBot); }
DEFINE_ACTION(ContextNpcBot, SPIRSHTS) { CGroupNpc* grp = CWorkPtr::grpNpc(); if (!grp) return; CBotNpc* bot = CWorkPtr::botNpc(); if (!bot) return; FOREACHC(itArg, std::vector<CAIActions::CArg>, args) { string str, name, sheet; itArg->get(str); AI_SHARE::stringToKeywordAndTail(str, name, sheet); grp->setStrLogicVar(NLMISC::CStringMapper::map("$sheet_spire_"+name), sheet); }
COutpost::COutpost(CContinent* owner, uint32 alias, std::string const& name, std::string const& filename) : CAliasChild<CContinent>(owner, alias, name) , CAliasTreeRoot(filename) , _OwnerAllianceId(InvalidAllianceId) , _AttackerAllianceId(InvalidAllianceId) , _State(OUTPOSTENUMS::UnknownOutpostState) { static bool logInitDone = false; if ( ! logInitDone ) { OutpostDbgLog.addDisplayer( &OutpostDisplayer ); OutpostInfLog.addDisplayer( &OutpostDisplayer ); OutpostWrnLog.addDisplayer( &OutpostDisplayer ); logInitDone = true; } OUTPOST_DBG("Creating outpost %s' (%s)", name.c_str(), getAliasFullName().c_str()); if (LogOutpostDebug) OUTPOST_DBG("Creating outpost '%s'", getAliasFullName().c_str()); _OutpostName = getName(); COutpostManager* manager = NULL; // Create default squad manager manager = new COutpostSquadManager(this, 0, "default_squad_manager", filename); if (manager) { _Managers.addChild(manager); manager->init(); } // Create default building manager manager = new COutpostManager(this, 0, "default_building_manager", filename); if (manager) { _Managers.addChild(manager); manager->init(); CGroupNpc* group = new CGroupNpc(manager, NULL, /*AStarFlag*/RYAI_MAP_CRUNCH::Nothing); if (group) { manager->groups().addAliasChild(group); group->setAutoSpawn(false); group->setName("default_building_group"); group->clearParameters(); group->setPlayerAttackable(false); group->setBotAttackable(false); group->setBotsAreNamedFlag(); } } }