1
Fork 0
mirror of https://github.com/SapphireServer/Sapphire.git synced 2025-05-07 11:17:46 +00:00

refactor timeline stuff, implement selectors

This commit is contained in:
Tahir 2024-06-21 19:46:14 +01:00
parent 7cc3f65571
commit 26534d2a37
8 changed files with 134 additions and 94 deletions

View file

@ -255,7 +255,7 @@ namespace Sapphire::World::AI
return m_results;
}
const std::vector< uint32_t > Snapshot::getTargetIds() const
const std::vector< uint32_t >& Snapshot::getTargetIds() const
{
return m_targetIds;
}

View file

@ -241,7 +241,7 @@ namespace Sapphire::World::AI
// returns actors sorted by distance
const std::vector< CharaEntry >& getResults() const;
const std::vector< uint32_t > getTargetIds() const;
const std::vector< uint32_t >& getTargetIds() const;
};
using SnapshotPtr = std::shared_ptr< Snapshot >;
}// namespace Sapphire::World::AI

View file

@ -298,16 +298,18 @@ namespace Sapphire::Encounter
const World::AI::Snapshot::Results& TimelinePack::getSnapshotResults( const std::string& selectorName )
{
static World::AI::Snapshot::Results empty;
if( auto it = m_selectors.find( selectorName ); it != m_selectors.end() )
return it->second.getResults();
return {};
return empty;
}
const World::AI::Snapshot::TargetIds& TimelinePack::getSnapshotTargetIds( const std::string& selectorName )
{
static World::AI::Snapshot::TargetIds empty;
if( auto it = m_selectors.find( selectorName ); it != m_selectors.end() )
return it->second.getTargetIds();
return {};
return empty;
}
void TimelinePack::addTimelineActor( const TimelineActor& actor )

View file

@ -14,7 +14,7 @@
namespace Sapphire::Encounter
{
bool ConditionHp::isConditionMet( ConditionState& state, TerritoryPtr pTeri, TimelinePack& pack, uint64_t time ) const
bool ConditionHp::isConditionMet( ConditionState& state, TimelinePack& pack, TerritoryPtr pTeri, uint64_t time ) const
{
auto pBNpc = pTeri->getActiveBNpcByLayoutId( layoutId );
if( !pBNpc )
@ -35,7 +35,7 @@ namespace Sapphire::Encounter
return false;
};
bool ConditionDirectorVar::isConditionMet( ConditionState& state, TerritoryPtr pTeri, TimelinePack& pack, uint64_t time ) const
bool ConditionDirectorVar::isConditionMet( ConditionState& state, TimelinePack& pack, TerritoryPtr pTeri, uint64_t time ) const
{
Event::DirectorPtr pDirector = pTeri->getAsInstanceContent();
@ -60,7 +60,7 @@ namespace Sapphire::Encounter
return false;
}
bool ConditionCombatState::isConditionMet( ConditionState& state, TerritoryPtr pTeri, TimelinePack& pack, uint64_t time ) const
bool ConditionCombatState::isConditionMet( ConditionState& state, TimelinePack& pack, TerritoryPtr pTeri, uint64_t time ) const
{
auto pBattleNpc = pTeri->getActiveBNpcByLayoutId( this->layoutId );
@ -85,14 +85,14 @@ namespace Sapphire::Encounter
return false;
}
bool ConditionEncounterTimeElapsed::isConditionMet( ConditionState& state, TerritoryPtr pTeri, TimelinePack& pack, uint64_t time ) const
bool ConditionEncounterTimeElapsed::isConditionMet( ConditionState& state, TimelinePack& pack, TerritoryPtr pTeri, uint64_t time ) const
{
auto elapsed = time - pack.getStartTime();
// todo: check encounter time
return elapsed >= this->duration;
}
bool ConditionBNpcFlags::isConditionMet( ConditionState& state, TerritoryPtr pTeri, TimelinePack& pack, uint64_t time ) const
bool ConditionBNpcFlags::isConditionMet( ConditionState& state, TimelinePack& pack, TerritoryPtr pTeri, uint64_t time ) const
{
auto pBNpc = pTeri->getActiveBNpcByLayoutId( this->layoutId );
return pBNpc && pBNpc->hasFlag( this->flags );
@ -204,7 +204,7 @@ namespace Sapphire::Encounter
// todo: i wrote this very sleep deprived, ensure it is actually sane
void Phase::execute( ConditionState& state, TimelineActor& self, TerritoryPtr pTeri, uint64_t time ) const
void Phase::execute( ConditionState& state, TimelineActor& self, TimelinePack& pack, TerritoryPtr pTeri, uint64_t time ) const
{
if( state.m_startTime == 0 )
{
@ -232,12 +232,12 @@ namespace Sapphire::Encounter
if( timepoint.canExecute( tpState, timepointElapsed ) )
{
timepoint.execute( tpState, self, pTeri, time );
timepoint.execute( tpState, self, pack, pTeri, time );
state.m_phaseInfo.m_lastTimepointTime = time;
}
else if( !timepoint.finished( tpState, timepointElapsed ) )
{
timepoint.update( tpState, self, pTeri, time );
timepoint.update( tpState, self, pack, pTeri, time );
}
if( timepoint.durationElapsed( timepointElapsed ) && timepoint.finished( tpState, timepointElapsed ) )

View file

@ -2,11 +2,12 @@
#include <cstdint>
#include "Timepoint.h"
#include "TimelineActorState.h"
#include "Timepoint.h"
namespace Sapphire::Encounter
{
// todo: just use the actual combat state return type
enum class CombatStateType
{
Idle,
@ -34,24 +35,20 @@ namespace Sapphire::Encounter
BNpcHasFlags
};
class Phase :
public std::enable_shared_from_this< Phase >
{
public:
class Phase : public std::enable_shared_from_this< Phase >
{
public:
// todo: getters/setters
std::string m_name;
std::vector< Timepoint > m_timepoints;
// todo: allow callbacks to push timepoints
void execute( ConditionState& state, TimelineActor& self, TimelinePack& pack, TerritoryPtr pTeri, uint64_t time ) const;
std::string m_name;
std::vector< Timepoint > m_timepoints;
void reset( ConditionState& state ) const;
// todo: i wrote this very sleep deprived, ensure it is actually sane
void execute( ConditionState& state, TimelineActor& self, TerritoryPtr pTeri, uint64_t time ) const;
void reset( ConditionState& state ) const;
bool completed( const ConditionState& state ) const;
};
using PhasePtr = std::shared_ptr< Phase >;
bool completed( const ConditionState& state ) const;
};
using PhasePtr = std::shared_ptr< Phase >;
class PhaseCondition : public std::enable_shared_from_this< PhaseCondition >
{
@ -79,15 +76,15 @@ namespace Sapphire::Encounter
this->m_id = json.at( "id" ).get< uint32_t >();
}
void execute( ConditionState& state, TimelineActor& self, TerritoryPtr pTeri, TimelinePack& pack, uint64_t time ) const
void execute( ConditionState& state, TimelineActor& self, TimelinePack& pack, TerritoryPtr pTeri, uint64_t time ) const
{
state.m_startTime = time;
m_phase.execute( state, self, pTeri, time );
m_phase.execute( state, self, pack, pTeri, time );
};
void update( ConditionState& state, TimelineActor& self, TerritoryPtr pTeri, TimelinePack& pack, uint64_t time ) const
void update( ConditionState& state, TimelineActor& self, TimelinePack& pack, TerritoryPtr pTeri, uint64_t time ) const
{
m_phase.execute( state, self, pTeri, time );
m_phase.execute( state, self, pack, pTeri, time );
}
void setEnabled( ConditionState& state, bool enabled )
@ -133,7 +130,7 @@ namespace Sapphire::Encounter
return m_phase.completed( state ) && m_loop && ( state.m_startTime + m_cooldown <= time );
}
virtual bool isConditionMet( ConditionState& state, TerritoryPtr pTeri, TimelinePack& pack, uint64_t time ) const
virtual bool isConditionMet( ConditionState& state, TimelinePack& pack, TerritoryPtr pTeri, uint64_t time ) const
{
return false;
};
@ -145,7 +142,7 @@ namespace Sapphire::Encounter
};
using PhaseConditionPtr = std::shared_ptr< PhaseCondition >;
//
//
// Conditions
//
class ConditionHp : PhaseCondition
@ -157,14 +154,14 @@ namespace Sapphire::Encounter
uint8_t val;
struct
{
uint8_t min, max;
uint8_t min, max;
};
} hp;
void from_json( nlohmann::json& json, Phase& phase, ConditionType condition,
const std::unordered_map< std::string, TimelineActor >& actors );
bool isConditionMet( ConditionState& state, TerritoryPtr pTeri, TimelinePack& pack, uint64_t time ) const override;
bool isConditionMet( ConditionState& state, TimelinePack& pack, TerritoryPtr pTeri, uint64_t time ) const override;
};
class ConditionDirectorVar : PhaseCondition
@ -174,15 +171,15 @@ namespace Sapphire::Encounter
{
struct
{
uint32_t index;
uint32_t value;
uint32_t index;
uint32_t value;
};
uint8_t seq;
uint8_t flags;
} param;
void from_json( nlohmann::json& json, Phase& phase, ConditionType condition );
bool isConditionMet( ConditionState& state, TerritoryPtr pTeri, TimelinePack& pack, uint64_t time ) const override;
bool isConditionMet( ConditionState& state, TimelinePack& pack, TerritoryPtr pTeri, uint64_t time ) const override;
};
class ConditionEncounterTimeElapsed : PhaseCondition
@ -191,7 +188,7 @@ namespace Sapphire::Encounter
uint64_t duration;
void from_json( nlohmann::json& json, Phase& phase, ConditionType condition );
bool isConditionMet( ConditionState& state, TerritoryPtr pTeri, TimelinePack& pack, uint64_t time ) const override;
bool isConditionMet( ConditionState& state, TimelinePack& pack, TerritoryPtr pTeri, uint64_t time ) const override;
};
class ConditionCombatState : PhaseCondition
@ -201,7 +198,7 @@ namespace Sapphire::Encounter
CombatStateType combatState;
void from_json( nlohmann::json& json, Phase& phase, ConditionType condition, const std::unordered_map< std::string, TimelineActor >& actors );
bool isConditionMet( ConditionState& state, TerritoryPtr pTeri, TimelinePack& pack, uint64_t time ) const override;
bool isConditionMet( ConditionState& state, TimelinePack& pack, TerritoryPtr pTeri, uint64_t time ) const override;
};
class ConditionBNpcFlags : PhaseCondition
@ -211,7 +208,7 @@ namespace Sapphire::Encounter
uint32_t flags;
void from_json( nlohmann::json& json, Phase& phase, ConditionType condition, const std::unordered_map< std::string, TimelineActor >& actors );
bool isConditionMet( ConditionState& state, TerritoryPtr pTeri, TimelinePack& pack, uint64_t time ) const override;
bool isConditionMet( ConditionState& state, TimelinePack& pack, TerritoryPtr pTeri, uint64_t time ) const override;
};
}// namespace Sapphire::Encounter

View file

@ -37,11 +37,11 @@ namespace Sapphire::Encounter
}
else if( pCondition->inProgress( state ) )
{
pCondition->update( state, *this, pTeri, pack, time );
pCondition->update( state, *this, pack, pTeri, time );
}
else if( pCondition->isConditionMet( state, pTeri, pack, time ) )
else if( pCondition->isConditionMet( state, pack, pTeri, time ) )
{
pCondition->execute( state, *this, pTeri, pack, time );
pCondition->execute( state, *this, pack, pTeri, time );
if( pack.getStartTime() == 0 )
pack.setStartTime( state.m_startTime );

View file

@ -1,5 +1,6 @@
#include "Timepoint.h"
#include "TimelineActor.h"
#include "EncounterTimeline.h"
#include <Action/Action.h>
@ -51,21 +52,23 @@ namespace Sapphire::Encounter
{
const static std::unordered_map< std::string, TimepointDataType > timepointTypeMap =
{
{ "idle", TimepointDataType::Idle },
{ "castAction", TimepointDataType::CastAction },
{ "moveTo", TimepointDataType::MoveTo },
{ "logMessage", TimepointDataType::LogMessage },
{ "battleTalk", TimepointDataType::BattleTalk },
{ "directorVar", TimepointDataType::DirectorVar },
{ "directorSeq", TimepointDataType::DirectorSeq },
{ "idle", TimepointDataType::Idle },
{ "castAction", TimepointDataType::CastAction },
{ "setPos", TimepointDataType::SetPos },
{ "logMessage", TimepointDataType::LogMessage },
{ "battleTalk", TimepointDataType::BattleTalk },
{ "directorVar", TimepointDataType::DirectorVar },
{ "directorSeq", TimepointDataType::DirectorSeq },
{ "directorFlags", TimepointDataType::DirectorFlags },
{ "addStatusEffect", TimepointDataType::AddStatusEffect },
{ "removeStatusEffect", TimepointDataType::RemoveStatusEffect },
{ "spawnBNpc", TimepointDataType::SpawnBNpc },
{ "bNpcFlags", TimepointDataType::SetBNpcFlags },
{ "spawnBNpc", TimepointDataType::SpawnBNpc },
{ "bNpcFlags", TimepointDataType::SetBNpcFlags },
{ "setEObjState", TimepointDataType::SetEObjState },
{ "setCondition", TimepointDataType::SetCondition },
{ "snapshot", TimepointDataType::Snapshot }
{ "snapshot", TimepointDataType::Snapshot }
};
const static std::unordered_map< std::string, DirectorOpId > directorOpMap =
@ -78,7 +81,7 @@ namespace Sapphire::Encounter
{ "mod", DirectorOpId::Mod },
{ "sll", DirectorOpId::Sll },
{ "srl", DirectorOpId::Srl },
{ "or", DirectorOpId::Or },
{ "or", DirectorOpId::Or },
{ "xor", DirectorOpId::Xor },
{ "nor", DirectorOpId::Nor },
{ "and", DirectorOpId::And }
@ -92,9 +95,9 @@ namespace Sapphire::Encounter
const static std::unordered_map< std::string, ActionTargetType > actionTypeMap =
{
{ "none", ActionTargetType::None },
{ "self", ActionTargetType::Self },
{ "target", ActionTargetType::Target },
{ "none", ActionTargetType::None },
{ "self", ActionTargetType::Self },
{ "target", ActionTargetType::Target },
{ "selector", ActionTargetType::Selector }
};
@ -132,15 +135,15 @@ namespace Sapphire::Encounter
selectorRef, selectorIndex );
}
break;
case TimepointDataType::MoveTo:
case TimepointDataType::SetPos:
{
auto& dataJ = json.at( "data" );
auto pos = dataJ.at( "pos" ).get< std::vector< float > >();
auto rot = dataJ.at( "rot" ).get< float >();
auto pathReq = dataJ.at( "pathRequested" ).get< bool >() ? MoveType::WalkPath : MoveType::Teleport;
// todo: moveTo
auto actorRef = dataJ.at( "actorName" ).get< std::string >();
m_pData = std::make_shared< TimepointDataSetPos >( actorRef, MoveType::SetPos,
pos[ 0 ], pos[ 1 ], pos[ 2 ], rot );
}
break;
case TimepointDataType::LogMessage:
@ -305,23 +308,24 @@ namespace Sapphire::Encounter
auto& dataJ = json.at( "data" );
auto selectorName = dataJ.at( "selectorName" ).get< std::string >();
auto actorRef = dataJ.at( "sourceActor" ).get< std::string >();
// auto excludeSelector = dataJ.at( "excludeSelector" ).get< std::string >();
// todo:
m_pData = std::make_shared< TimepointDataSnapshot >( selectorName, actorRef );
m_pData = std::make_shared< TimepointDataSnapshot >( selectorName, actorRef, "" );
}
break;
default:
break;
}
}
void Timepoint::execute( TimepointState& state, TimelineActor& self, TerritoryPtr pTeri, uint64_t time ) const
void Timepoint::execute( TimepointState& state, TimelineActor& self, TimelinePack& pack, TerritoryPtr pTeri, uint64_t time ) const
{
state.m_startTime = time;
update( state, self, pTeri, time );
update( state, self, pack, pTeri, time );
}
void Timepoint::update( TimepointState& state, TimelineActor& self, TerritoryPtr pTeri, uint64_t time ) const
void Timepoint::update( TimepointState& state, TimelineActor& self, TimelinePack& pack, TerritoryPtr pTeri, uint64_t time ) const
{
state.m_lastTick = time;
@ -338,7 +342,7 @@ namespace Sapphire::Encounter
break;
case TimepointDataType::CastAction:
{
auto pActionData = std::dynamic_pointer_cast< TimepointDataAction, TimepointData >( getData() );
auto pActionData = std::dynamic_pointer_cast< TimepointDataAction, TimepointData >( m_pData );
auto pBNpc = self.getBNpcByRef( pActionData->m_sourceRef, pTeri );
// todo: filter the correct target
// todo: tie to mechanic script?
@ -349,17 +353,20 @@ namespace Sapphire::Encounter
switch( pActionData->m_targetType )
{
case ActionTargetType::Target:
targetId = pBNpc->getTargetId();
targetId = static_cast< uint32_t >( pBNpc->getTargetId() );
break;
case ActionTargetType::Selector:
{
// todo: selector
const auto& results = pack.getSnapshotTargetIds( pActionData->m_selectorRef );
if( pActionData->m_selectorIndex < results.size() )
targetId = results[ pActionData->m_selectorIndex ];
}
break;
default:
break;
}
auto actionMgr = Common::Service< Sapphire::World::Manager::ActionMgr >::ref();
auto& actionMgr = Common::Service< Sapphire::World::Manager::ActionMgr >::ref();
// todo: this is probably wrong
if( pBNpc->getCurrentAction() && pBNpc->getCurrentAction()->getId() != pActionData->m_actionId )
@ -367,9 +374,24 @@ namespace Sapphire::Encounter
}
}
break;
case TimepointDataType::SetPos:
{
auto pSetPosData = std::dynamic_pointer_cast< TimepointDataSetPos, TimepointData >( m_pData );
auto pBNpc = self.getBNpcByRef( pSetPosData->m_actorRef, pTeri );
if( pBNpc )
{
auto currPos = pBNpc->getPos();
pBNpc->setPos( pSetPosData->m_x, pSetPosData->m_y, pSetPosData->m_z );
pBNpc->setRot( pSetPosData->m_rot );
}
}
break;
/*
case TimepointDataType::MoveTo:
{
auto pMoveToData = std::dynamic_pointer_cast< TimepointDataMoveTo, TimepointData >( getData() );
auto pMoveToData = std::dynamic_pointer_cast< TimepointDataMoveTo, TimepointData >( m_pData );
auto pBNpc = self.getBNpcByRef( pMoveToData->m_actorRef, pTeri );
if( pBNpc )
@ -394,9 +416,10 @@ namespace Sapphire::Encounter
}
}
break;
*/
case TimepointDataType::LogMessage:
{
auto pLogMessage = std::dynamic_pointer_cast< TimepointDataLogMessage, TimepointData >( getData() );
auto pLogMessage = std::dynamic_pointer_cast< TimepointDataLogMessage, TimepointData >( m_pData );
auto params = pLogMessage->m_params;
// todo: probably should use ContentDirector
@ -416,7 +439,7 @@ namespace Sapphire::Encounter
case TimepointDataType::BattleTalk:
{
// todo: BattleTalk
auto pBtData = std::dynamic_pointer_cast< TimepointDataBattleTalk, TimepointData >( getData() );
auto pBtData = std::dynamic_pointer_cast< TimepointDataBattleTalk, TimepointData >( m_pData );
auto params = pBtData->m_params;
@ -437,7 +460,7 @@ namespace Sapphire::Encounter
case TimepointDataType::DirectorVarLR:
case TimepointDataType::DirectorFlags:
{
auto pDirectorData = std::dynamic_pointer_cast< TimepointDataDirector, TimepointData >( getData() );
auto pDirectorData = std::dynamic_pointer_cast< TimepointDataDirector, TimepointData >( m_pData );
uint32_t val = 0;
uint32_t param = 0;
@ -541,7 +564,7 @@ namespace Sapphire::Encounter
break;
case TimepointDataType::SpawnBNpc:
{
auto pSpawnData = std::dynamic_pointer_cast< TimepointDataSpawnBNpc, TimepointData >( getData() );
auto pSpawnData = std::dynamic_pointer_cast< TimepointDataSpawnBNpc, TimepointData >( m_pData );
auto pBNpc = pTeri->getActiveBNpcByLayoutId( pSpawnData->m_layoutId );
if( pBNpc )
@ -554,7 +577,7 @@ namespace Sapphire::Encounter
break;
case TimepointDataType::SetBNpcFlags:
{
auto pBNpcFlagData = std::dynamic_pointer_cast< TimepointDataBNpcFlags, TimepointData >( getData() );
auto pBNpcFlagData = std::dynamic_pointer_cast< TimepointDataBNpcFlags, TimepointData >( m_pData );
auto pBNpc = pTeri->getActiveBNpcByLayoutId( pBNpcFlagData->m_layoutId );
if( pBNpc )
@ -567,7 +590,7 @@ namespace Sapphire::Encounter
break;
case TimepointDataType::SetEObjState:
{
auto pEObjData = std::dynamic_pointer_cast< TimepointDataEObjState, TimepointData >( getData() );
auto pEObjData = std::dynamic_pointer_cast< TimepointDataEObjState, TimepointData >( m_pData );
auto pInstance = pTeri->getAsInstanceContent();
auto pQBattle = pTeri->getAsQuestBattle();
@ -588,7 +611,7 @@ namespace Sapphire::Encounter
break;
case TimepointDataType::SetBgm:
{
auto pBgmData = std::dynamic_pointer_cast< TimepointDataBGM, TimepointData >( getData() );
auto pBgmData = std::dynamic_pointer_cast< TimepointDataBGM, TimepointData >( m_pData );
auto pInstance = pTeri->getAsInstanceContent();
auto pQBattle = pTeri->getAsQuestBattle();
@ -601,15 +624,30 @@ namespace Sapphire::Encounter
break;
case TimepointDataType::SetCondition:
{
auto pConditionData = std::dynamic_pointer_cast< TimepointDataCondition, TimepointData >( getData() );
auto pConditionData = std::dynamic_pointer_cast< TimepointDataCondition, TimepointData >( m_pData );
// todo: dont reset so things can resume? idk
self.resetConditionState( pConditionData->m_conditionId );
self.setConditionStateEnabled( pConditionData->m_conditionId, pConditionData->m_enabled );
}
break;
case TimepointDataType::Snapshot:
{
auto pSnapshotData = std::dynamic_pointer_cast< TimepointDataSnapshot, TimepointData >( m_pData );
auto pBNpc = self.getBNpcByRef( pSnapshotData->m_actorRef, pTeri );
if( pBNpc )
{
const auto& exclude = pack.getSnapshotTargetIds( pSnapshotData->m_excludeSelector );
pack.createSnapshot( pSnapshotData->m_selector, pBNpc, exclude );
}
}
break;
default:
break;
}
if( m_type != TimepointDataType::MoveTo && m_type != TimepointDataType::CastAction )
if( m_type != TimepointDataType::SetPos && m_type != TimepointDataType::CastAction )
state.m_finished = true;
state.m_finished = state.m_finished || state.m_startTime + m_duration <= time;

View file

@ -17,7 +17,7 @@ namespace Sapphire::Encounter
{
Idle,
CastAction,
MoveTo,
SetPos,
LogMessage,
BattleTalk,
@ -51,7 +51,8 @@ namespace Sapphire::Encounter
enum class MoveType : uint32_t
{
WalkPath,
Teleport
Teleport,
SetPos
};
enum class DirectorOpId
@ -111,15 +112,15 @@ namespace Sapphire::Encounter
}
};
struct TimepointDataMoveTo : public TimepointData {
struct TimepointDataSetPos : public TimepointData {
// todo: use internal id
std::string m_actorRef;
MoveType m_moveType;
float m_x, m_y, m_z, m_rot;
TimepointDataMoveTo( const std::string& actorRef, MoveType moveType,
TimepointDataSetPos( const std::string& actorRef, MoveType moveType,
float x, float y, float z, float rot ) :
TimepointData( TimepointDataType::MoveTo ),
TimepointData( TimepointDataType::SetPos ),
m_actorRef( actorRef ),
m_moveType( moveType ),
m_x( x ), m_y( y ), m_z( z ), m_rot( rot )
@ -255,13 +256,15 @@ namespace Sapphire::Encounter
struct TimepointDataSnapshot : public TimepointData
{
// todo: rng?
std::string m_name;
std::string m_selector;
std::string m_actorRef;
std::string m_excludeSelector;
TimepointDataSnapshot( const std::string& name, const std::string& actorRef ) :
TimepointDataSnapshot( const std::string& selector, const std::string& actorRef, const std::string& excludeSelector ) :
TimepointData( TimepointDataType::Snapshot ),
m_name( name ),
m_actorRef( actorRef )
m_selector( selector ),
m_actorRef( actorRef ),
m_excludeSelector( excludeSelector )
{
}
};
@ -289,7 +292,7 @@ namespace Sapphire::Encounter
void from_json( const nlohmann::json& json, const std::unordered_map< std::string, TimelineActor >& actors, uint32_t selfLayoutId );
// todo: separate execute/update into onStart and onTick?
void update( TimepointState& state, TimelineActor& self, TerritoryPtr pTeri, uint64_t time ) const;
void execute( TimepointState& state, TimelineActor& self, TerritoryPtr pTeri, uint64_t time ) const;
void update( TimepointState& state, TimelineActor& self, TimelinePack& pack, TerritoryPtr pTeri, uint64_t time ) const;
void execute( TimepointState& state, TimelineActor& self, TimelinePack& pack, TerritoryPtr pTeri, uint64_t time ) const;
};
}// namespace Sapphire::Encounter