khanat-opennel-code/code/ryzom/server/src/ags_test/actor_group.cpp
2014-09-09 17:20:23 -07:00

144 lines
3.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/>.
// Nel Misc
#include "nel/misc/command.h"
#include "nel/misc/path.h"
#include "nel/net/message.h"
#include "nel/net/unified_network.h"
// Game share
#include "game_share/tick_event_handler.h"
//#include "game_share/msg_brick_service.h"
// Local includes
#include "actor.h"
#include "actor_group.h"
#include "actor_manager.h"
#include "sheets.h"
using namespace NLMISC;
using namespace NLNET;
using namespace std;
namespace AGS_TEST
{
//----------------------------------------------------------------------------------
void CActorGroup::removeActor(CActor *actor)
{
if (this==0) return;
for (int i=_actors.size();i--;)
if (_actors[i]==actor)
{
_actors[i]=_actors[_actors.size()-1];
_actors.pop_back();
}
}
//----------------------------------------------------------------------------------
// displaying the actor's current state
void CActorGroup::display()
{
if (this==0) return;
nlinfo("");
nlinfo("ActorGroup: %s",_name.c_str());
// diaply the group's actors' stats
for (int i=_actors.size();i--;)
_actors[i]->display();
}
void CActorGroup::doFight(CActorGroup *target)
{
if (this==0) return;
if (target->actorCount()==0) return;
// tell each actor in the group to fight the opposing group member with matching ID
for (int i=_actors.size();i--;)
_actors[i]->doFight((*target)[i%target->actorCount()]);
}
void CActorGroup::doFight(CActor *target)
{
if (this==0) return;
// tell all the actors in the group to attack the target chap
for (int i=_actors.size();i--;)
_actors[i]->doFight(target);
}
void CActorGroup::stopFight()
{
if (this==0) return;
for (int i=_actors.size();i--;)
_actors[i]->stopFight();
}
//----------------------------------------------------------------------------------
// magnet state control
void CActorGroup::fadeMagnet(const NLMISC::CVector &pos, float distance, float decay, NLMISC::TGameCycle endTime)
{
_ToStartMagnet = _Magnet;
_ToStartMagnetDistance = _MagnetDistance;
_ToStartMagnetDecay = _MagnetDecay;
_ToStopMagnet = pos;
_ToStopMagnetDistance = distance;
_ToStopMagnetDecay= decay;
_ToStartCycle = CTickEventHandler::getGameCycle();
_ToStopCycle = endTime;
_ToFade = true;
}
//----------------------------------------------------------------------------------
// overall actors update
void CActorGroup::update()
{
if (_ToFade)
{
TGameCycle cycle = CTickEventHandler::getGameCycle();
if (cycle > _ToStopCycle)
{
cycle = _ToStopCycle;
_ToFade = false;
}
float ratio = (float)(cycle-_ToStartCycle)/(float)(_ToStopCycle-_ToStartCycle);
_Magnet = _ToStartMagnet*(1.0f-ratio) + _ToStopMagnet*ratio;
_MagnetDistance = _ToStartMagnetDistance*(1.0f-ratio) + _ToStopMagnetDistance*ratio;
_MagnetDecay = _ToStartMagnetDecay*(1.0f-ratio) + _ToStopMagnetDecay*ratio;
}
if (_MagnetActors)
{
uint i;
for (i=0; i<_actors.size(); ++i)
{
_actors[i]->setMagnetPos(_Magnet);
_actors[i]->setMagnetRange(_MagnetDistance, _MagnetDecay);
}
}
}
} // end of namespace AGS_TEST