mirror of
https://github.com/SapphireServer/Sapphire.git
synced 2025-05-08 03:37:45 +00:00
refactor timeline stuff, implement selectors
This commit is contained in:
parent
7cc3f65571
commit
26534d2a37
8 changed files with 134 additions and 94 deletions
|
@ -255,7 +255,7 @@ namespace Sapphire::World::AI
|
||||||
return m_results;
|
return m_results;
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::vector< uint32_t > Snapshot::getTargetIds() const
|
const std::vector< uint32_t >& Snapshot::getTargetIds() const
|
||||||
{
|
{
|
||||||
return m_targetIds;
|
return m_targetIds;
|
||||||
}
|
}
|
||||||
|
|
|
@ -241,7 +241,7 @@ namespace Sapphire::World::AI
|
||||||
|
|
||||||
// returns actors sorted by distance
|
// returns actors sorted by distance
|
||||||
const std::vector< CharaEntry >& getResults() const;
|
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 >;
|
using SnapshotPtr = std::shared_ptr< Snapshot >;
|
||||||
}// namespace Sapphire::World::AI
|
}// namespace Sapphire::World::AI
|
||||||
|
|
|
@ -298,16 +298,18 @@ namespace Sapphire::Encounter
|
||||||
|
|
||||||
const World::AI::Snapshot::Results& TimelinePack::getSnapshotResults( const std::string& selectorName )
|
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() )
|
if( auto it = m_selectors.find( selectorName ); it != m_selectors.end() )
|
||||||
return it->second.getResults();
|
return it->second.getResults();
|
||||||
return {};
|
return empty;
|
||||||
}
|
}
|
||||||
|
|
||||||
const World::AI::Snapshot::TargetIds& TimelinePack::getSnapshotTargetIds( const std::string& selectorName )
|
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() )
|
if( auto it = m_selectors.find( selectorName ); it != m_selectors.end() )
|
||||||
return it->second.getTargetIds();
|
return it->second.getTargetIds();
|
||||||
return {};
|
return empty;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TimelinePack::addTimelineActor( const TimelineActor& actor )
|
void TimelinePack::addTimelineActor( const TimelineActor& actor )
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
|
|
||||||
namespace Sapphire::Encounter
|
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 );
|
auto pBNpc = pTeri->getActiveBNpcByLayoutId( layoutId );
|
||||||
if( !pBNpc )
|
if( !pBNpc )
|
||||||
|
@ -35,7 +35,7 @@ namespace Sapphire::Encounter
|
||||||
return false;
|
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();
|
Event::DirectorPtr pDirector = pTeri->getAsInstanceContent();
|
||||||
|
@ -60,7 +60,7 @@ namespace Sapphire::Encounter
|
||||||
return false;
|
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 );
|
auto pBattleNpc = pTeri->getActiveBNpcByLayoutId( this->layoutId );
|
||||||
|
|
||||||
|
@ -85,14 +85,14 @@ namespace Sapphire::Encounter
|
||||||
return false;
|
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();
|
auto elapsed = time - pack.getStartTime();
|
||||||
// todo: check encounter time
|
// todo: check encounter time
|
||||||
return elapsed >= this->duration;
|
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 );
|
auto pBNpc = pTeri->getActiveBNpcByLayoutId( this->layoutId );
|
||||||
return pBNpc && pBNpc->hasFlag( this->flags );
|
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
|
// 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 )
|
if( state.m_startTime == 0 )
|
||||||
{
|
{
|
||||||
|
@ -232,12 +232,12 @@ namespace Sapphire::Encounter
|
||||||
|
|
||||||
if( timepoint.canExecute( tpState, timepointElapsed ) )
|
if( timepoint.canExecute( tpState, timepointElapsed ) )
|
||||||
{
|
{
|
||||||
timepoint.execute( tpState, self, pTeri, time );
|
timepoint.execute( tpState, self, pack, pTeri, time );
|
||||||
state.m_phaseInfo.m_lastTimepointTime = time;
|
state.m_phaseInfo.m_lastTimepointTime = time;
|
||||||
}
|
}
|
||||||
else if( !timepoint.finished( tpState, timepointElapsed ) )
|
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 ) )
|
if( timepoint.durationElapsed( timepointElapsed ) && timepoint.finished( tpState, timepointElapsed ) )
|
||||||
|
|
|
@ -2,11 +2,12 @@
|
||||||
|
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
|
|
||||||
#include "Timepoint.h"
|
|
||||||
#include "TimelineActorState.h"
|
#include "TimelineActorState.h"
|
||||||
|
#include "Timepoint.h"
|
||||||
|
|
||||||
namespace Sapphire::Encounter
|
namespace Sapphire::Encounter
|
||||||
{
|
{
|
||||||
|
// todo: just use the actual combat state return type
|
||||||
enum class CombatStateType
|
enum class CombatStateType
|
||||||
{
|
{
|
||||||
Idle,
|
Idle,
|
||||||
|
@ -34,18 +35,14 @@ namespace Sapphire::Encounter
|
||||||
BNpcHasFlags
|
BNpcHasFlags
|
||||||
};
|
};
|
||||||
|
|
||||||
class Phase :
|
class Phase : public std::enable_shared_from_this< Phase >
|
||||||
public std::enable_shared_from_this< Phase >
|
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
// todo: getters/setters
|
||||||
// todo: allow callbacks to push timepoints
|
|
||||||
|
|
||||||
std::string m_name;
|
std::string m_name;
|
||||||
std::vector< Timepoint > m_timepoints;
|
std::vector< Timepoint > m_timepoints;
|
||||||
|
|
||||||
// todo: i wrote this very sleep deprived, ensure it is actually sane
|
void execute( ConditionState& state, TimelineActor& self, TimelinePack& pack, TerritoryPtr pTeri, uint64_t time ) const;
|
||||||
void execute( ConditionState& state, TimelineActor& self, TerritoryPtr pTeri, uint64_t time ) const;
|
|
||||||
|
|
||||||
void reset( ConditionState& state ) const;
|
void reset( ConditionState& state ) const;
|
||||||
|
|
||||||
|
@ -79,15 +76,15 @@ namespace Sapphire::Encounter
|
||||||
this->m_id = json.at( "id" ).get< uint32_t >();
|
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;
|
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 )
|
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 );
|
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;
|
return false;
|
||||||
};
|
};
|
||||||
|
@ -164,7 +161,7 @@ namespace Sapphire::Encounter
|
||||||
void from_json( nlohmann::json& json, Phase& phase, ConditionType condition,
|
void from_json( nlohmann::json& json, Phase& phase, ConditionType condition,
|
||||||
const std::unordered_map< std::string, TimelineActor >& actors );
|
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
|
class ConditionDirectorVar : PhaseCondition
|
||||||
|
@ -182,7 +179,7 @@ namespace Sapphire::Encounter
|
||||||
} param;
|
} param;
|
||||||
|
|
||||||
void from_json( nlohmann::json& json, Phase& phase, ConditionType condition );
|
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
|
class ConditionEncounterTimeElapsed : PhaseCondition
|
||||||
|
@ -191,7 +188,7 @@ namespace Sapphire::Encounter
|
||||||
uint64_t duration;
|
uint64_t duration;
|
||||||
|
|
||||||
void from_json( nlohmann::json& json, Phase& phase, ConditionType condition );
|
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
|
class ConditionCombatState : PhaseCondition
|
||||||
|
@ -201,7 +198,7 @@ namespace Sapphire::Encounter
|
||||||
CombatStateType combatState;
|
CombatStateType combatState;
|
||||||
|
|
||||||
void from_json( nlohmann::json& json, Phase& phase, ConditionType condition, const std::unordered_map< std::string, TimelineActor >& actors );
|
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
|
class ConditionBNpcFlags : PhaseCondition
|
||||||
|
@ -211,7 +208,7 @@ namespace Sapphire::Encounter
|
||||||
uint32_t flags;
|
uint32_t flags;
|
||||||
|
|
||||||
void from_json( nlohmann::json& json, Phase& phase, ConditionType condition, const std::unordered_map< std::string, TimelineActor >& actors );
|
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
|
}// namespace Sapphire::Encounter
|
|
@ -37,11 +37,11 @@ namespace Sapphire::Encounter
|
||||||
}
|
}
|
||||||
else if( pCondition->inProgress( state ) )
|
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 )
|
if( pack.getStartTime() == 0 )
|
||||||
pack.setStartTime( state.m_startTime );
|
pack.setStartTime( state.m_startTime );
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
#include "Timepoint.h"
|
#include "Timepoint.h"
|
||||||
#include "TimelineActor.h"
|
#include "TimelineActor.h"
|
||||||
|
#include "EncounterTimeline.h"
|
||||||
|
|
||||||
#include <Action/Action.h>
|
#include <Action/Action.h>
|
||||||
|
|
||||||
|
@ -53,17 +54,19 @@ namespace Sapphire::Encounter
|
||||||
{
|
{
|
||||||
{ "idle", TimepointDataType::Idle },
|
{ "idle", TimepointDataType::Idle },
|
||||||
{ "castAction", TimepointDataType::CastAction },
|
{ "castAction", TimepointDataType::CastAction },
|
||||||
{ "moveTo", TimepointDataType::MoveTo },
|
{ "setPos", TimepointDataType::SetPos },
|
||||||
|
|
||||||
{ "logMessage", TimepointDataType::LogMessage },
|
{ "logMessage", TimepointDataType::LogMessage },
|
||||||
{ "battleTalk", TimepointDataType::BattleTalk },
|
{ "battleTalk", TimepointDataType::BattleTalk },
|
||||||
|
|
||||||
{ "directorVar", TimepointDataType::DirectorVar },
|
{ "directorVar", TimepointDataType::DirectorVar },
|
||||||
{ "directorSeq", TimepointDataType::DirectorSeq },
|
{ "directorSeq", TimepointDataType::DirectorSeq },
|
||||||
{ "directorFlags", TimepointDataType::DirectorFlags },
|
{ "directorFlags", TimepointDataType::DirectorFlags },
|
||||||
{ "addStatusEffect", TimepointDataType::AddStatusEffect },
|
|
||||||
{ "removeStatusEffect", TimepointDataType::RemoveStatusEffect },
|
|
||||||
{ "spawnBNpc", TimepointDataType::SpawnBNpc },
|
{ "spawnBNpc", TimepointDataType::SpawnBNpc },
|
||||||
{ "bNpcFlags", TimepointDataType::SetBNpcFlags },
|
{ "bNpcFlags", TimepointDataType::SetBNpcFlags },
|
||||||
{ "setEObjState", TimepointDataType::SetEObjState },
|
{ "setEObjState", TimepointDataType::SetEObjState },
|
||||||
|
|
||||||
{ "setCondition", TimepointDataType::SetCondition },
|
{ "setCondition", TimepointDataType::SetCondition },
|
||||||
{ "snapshot", TimepointDataType::Snapshot }
|
{ "snapshot", TimepointDataType::Snapshot }
|
||||||
};
|
};
|
||||||
|
@ -132,15 +135,15 @@ namespace Sapphire::Encounter
|
||||||
selectorRef, selectorIndex );
|
selectorRef, selectorIndex );
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case TimepointDataType::MoveTo:
|
case TimepointDataType::SetPos:
|
||||||
{
|
{
|
||||||
auto& dataJ = json.at( "data" );
|
auto& dataJ = json.at( "data" );
|
||||||
auto pos = dataJ.at( "pos" ).get< std::vector< float > >();
|
auto pos = dataJ.at( "pos" ).get< std::vector< float > >();
|
||||||
auto rot = dataJ.at( "rot" ).get< float >();
|
auto rot = dataJ.at( "rot" ).get< float >();
|
||||||
auto pathReq = dataJ.at( "pathRequested" ).get< bool >() ? MoveType::WalkPath : MoveType::Teleport;
|
auto actorRef = dataJ.at( "actorName" ).get< std::string >();
|
||||||
|
|
||||||
// todo: moveTo
|
|
||||||
|
|
||||||
|
m_pData = std::make_shared< TimepointDataSetPos >( actorRef, MoveType::SetPos,
|
||||||
|
pos[ 0 ], pos[ 1 ], pos[ 2 ], rot );
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case TimepointDataType::LogMessage:
|
case TimepointDataType::LogMessage:
|
||||||
|
@ -305,23 +308,24 @@ namespace Sapphire::Encounter
|
||||||
auto& dataJ = json.at( "data" );
|
auto& dataJ = json.at( "data" );
|
||||||
auto selectorName = dataJ.at( "selectorName" ).get< std::string >();
|
auto selectorName = dataJ.at( "selectorName" ).get< std::string >();
|
||||||
auto actorRef = dataJ.at( "sourceActor" ).get< std::string >();
|
auto actorRef = dataJ.at( "sourceActor" ).get< std::string >();
|
||||||
|
// auto excludeSelector = dataJ.at( "excludeSelector" ).get< std::string >();
|
||||||
// todo:
|
// todo:
|
||||||
|
|
||||||
m_pData = std::make_shared< TimepointDataSnapshot >( selectorName, actorRef );
|
m_pData = std::make_shared< TimepointDataSnapshot >( selectorName, actorRef, "" );
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
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;
|
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;
|
state.m_lastTick = time;
|
||||||
|
|
||||||
|
@ -338,7 +342,7 @@ namespace Sapphire::Encounter
|
||||||
break;
|
break;
|
||||||
case TimepointDataType::CastAction:
|
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 );
|
auto pBNpc = self.getBNpcByRef( pActionData->m_sourceRef, pTeri );
|
||||||
// todo: filter the correct target
|
// todo: filter the correct target
|
||||||
// todo: tie to mechanic script?
|
// todo: tie to mechanic script?
|
||||||
|
@ -349,17 +353,20 @@ namespace Sapphire::Encounter
|
||||||
switch( pActionData->m_targetType )
|
switch( pActionData->m_targetType )
|
||||||
{
|
{
|
||||||
case ActionTargetType::Target:
|
case ActionTargetType::Target:
|
||||||
targetId = pBNpc->getTargetId();
|
targetId = static_cast< uint32_t >( pBNpc->getTargetId() );
|
||||||
break;
|
break;
|
||||||
case ActionTargetType::Selector:
|
case ActionTargetType::Selector:
|
||||||
{
|
{
|
||||||
// todo: selector
|
// todo: selector
|
||||||
|
const auto& results = pack.getSnapshotTargetIds( pActionData->m_selectorRef );
|
||||||
|
if( pActionData->m_selectorIndex < results.size() )
|
||||||
|
targetId = results[ pActionData->m_selectorIndex ];
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
auto actionMgr = Common::Service< Sapphire::World::Manager::ActionMgr >::ref();
|
auto& actionMgr = Common::Service< Sapphire::World::Manager::ActionMgr >::ref();
|
||||||
|
|
||||||
// todo: this is probably wrong
|
// todo: this is probably wrong
|
||||||
if( pBNpc->getCurrentAction() && pBNpc->getCurrentAction()->getId() != pActionData->m_actionId )
|
if( pBNpc->getCurrentAction() && pBNpc->getCurrentAction()->getId() != pActionData->m_actionId )
|
||||||
|
@ -367,9 +374,24 @@ namespace Sapphire::Encounter
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
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:
|
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 );
|
auto pBNpc = self.getBNpcByRef( pMoveToData->m_actorRef, pTeri );
|
||||||
|
|
||||||
if( pBNpc )
|
if( pBNpc )
|
||||||
|
@ -394,9 +416,10 @@ namespace Sapphire::Encounter
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
*/
|
||||||
case TimepointDataType::LogMessage:
|
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;
|
auto params = pLogMessage->m_params;
|
||||||
|
|
||||||
// todo: probably should use ContentDirector
|
// todo: probably should use ContentDirector
|
||||||
|
@ -416,7 +439,7 @@ namespace Sapphire::Encounter
|
||||||
case TimepointDataType::BattleTalk:
|
case TimepointDataType::BattleTalk:
|
||||||
{
|
{
|
||||||
// todo: 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;
|
auto params = pBtData->m_params;
|
||||||
|
|
||||||
|
|
||||||
|
@ -437,7 +460,7 @@ namespace Sapphire::Encounter
|
||||||
case TimepointDataType::DirectorVarLR:
|
case TimepointDataType::DirectorVarLR:
|
||||||
case TimepointDataType::DirectorFlags:
|
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 val = 0;
|
||||||
uint32_t param = 0;
|
uint32_t param = 0;
|
||||||
|
@ -541,7 +564,7 @@ namespace Sapphire::Encounter
|
||||||
break;
|
break;
|
||||||
case TimepointDataType::SpawnBNpc:
|
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 );
|
auto pBNpc = pTeri->getActiveBNpcByLayoutId( pSpawnData->m_layoutId );
|
||||||
|
|
||||||
if( pBNpc )
|
if( pBNpc )
|
||||||
|
@ -554,7 +577,7 @@ namespace Sapphire::Encounter
|
||||||
break;
|
break;
|
||||||
case TimepointDataType::SetBNpcFlags:
|
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 );
|
auto pBNpc = pTeri->getActiveBNpcByLayoutId( pBNpcFlagData->m_layoutId );
|
||||||
|
|
||||||
if( pBNpc )
|
if( pBNpc )
|
||||||
|
@ -567,7 +590,7 @@ namespace Sapphire::Encounter
|
||||||
break;
|
break;
|
||||||
case TimepointDataType::SetEObjState:
|
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 pInstance = pTeri->getAsInstanceContent();
|
||||||
auto pQBattle = pTeri->getAsQuestBattle();
|
auto pQBattle = pTeri->getAsQuestBattle();
|
||||||
|
@ -588,7 +611,7 @@ namespace Sapphire::Encounter
|
||||||
break;
|
break;
|
||||||
case TimepointDataType::SetBgm:
|
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 pInstance = pTeri->getAsInstanceContent();
|
||||||
auto pQBattle = pTeri->getAsQuestBattle();
|
auto pQBattle = pTeri->getAsQuestBattle();
|
||||||
|
|
||||||
|
@ -601,15 +624,30 @@ namespace Sapphire::Encounter
|
||||||
break;
|
break;
|
||||||
case TimepointDataType::SetCondition:
|
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
|
// todo: dont reset so things can resume? idk
|
||||||
self.resetConditionState( pConditionData->m_conditionId );
|
self.resetConditionState( pConditionData->m_conditionId );
|
||||||
self.setConditionStateEnabled( pConditionData->m_conditionId, pConditionData->m_enabled );
|
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 = true;
|
||||||
|
|
||||||
state.m_finished = state.m_finished || state.m_startTime + m_duration <= time;
|
state.m_finished = state.m_finished || state.m_startTime + m_duration <= time;
|
||||||
|
|
|
@ -17,7 +17,7 @@ namespace Sapphire::Encounter
|
||||||
{
|
{
|
||||||
Idle,
|
Idle,
|
||||||
CastAction,
|
CastAction,
|
||||||
MoveTo,
|
SetPos,
|
||||||
|
|
||||||
LogMessage,
|
LogMessage,
|
||||||
BattleTalk,
|
BattleTalk,
|
||||||
|
@ -51,7 +51,8 @@ namespace Sapphire::Encounter
|
||||||
enum class MoveType : uint32_t
|
enum class MoveType : uint32_t
|
||||||
{
|
{
|
||||||
WalkPath,
|
WalkPath,
|
||||||
Teleport
|
Teleport,
|
||||||
|
SetPos
|
||||||
};
|
};
|
||||||
|
|
||||||
enum class DirectorOpId
|
enum class DirectorOpId
|
||||||
|
@ -111,15 +112,15 @@ namespace Sapphire::Encounter
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
struct TimepointDataMoveTo : public TimepointData {
|
struct TimepointDataSetPos : public TimepointData {
|
||||||
// todo: use internal id
|
// todo: use internal id
|
||||||
std::string m_actorRef;
|
std::string m_actorRef;
|
||||||
MoveType m_moveType;
|
MoveType m_moveType;
|
||||||
float m_x, m_y, m_z, m_rot;
|
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 ) :
|
float x, float y, float z, float rot ) :
|
||||||
TimepointData( TimepointDataType::MoveTo ),
|
TimepointData( TimepointDataType::SetPos ),
|
||||||
m_actorRef( actorRef ),
|
m_actorRef( actorRef ),
|
||||||
m_moveType( moveType ),
|
m_moveType( moveType ),
|
||||||
m_x( x ), m_y( y ), m_z( z ), m_rot( rot )
|
m_x( x ), m_y( y ), m_z( z ), m_rot( rot )
|
||||||
|
@ -255,13 +256,15 @@ namespace Sapphire::Encounter
|
||||||
struct TimepointDataSnapshot : public TimepointData
|
struct TimepointDataSnapshot : public TimepointData
|
||||||
{
|
{
|
||||||
// todo: rng?
|
// todo: rng?
|
||||||
std::string m_name;
|
std::string m_selector;
|
||||||
std::string m_actorRef;
|
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 ),
|
TimepointData( TimepointDataType::Snapshot ),
|
||||||
m_name( name ),
|
m_selector( selector ),
|
||||||
m_actorRef( actorRef )
|
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 );
|
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?
|
// todo: separate execute/update into onStart and onTick?
|
||||||
void update( 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, TerritoryPtr pTeri, uint64_t time ) const;
|
void execute( TimepointState& state, TimelineActor& self, TimelinePack& pack, TerritoryPtr pTeri, uint64_t time ) const;
|
||||||
};
|
};
|
||||||
}// namespace Sapphire::Encounter
|
}// namespace Sapphire::Encounter
|
Loading…
Add table
Reference in a new issue