145 lines
3.7 KiB
C++
145 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
|