diff --git a/src/world/AI/TargetHelper.cpp b/src/world/AI/TargetHelper.cpp index 9e53bd5b..7a38e388 100644 --- a/src/world/AI/TargetHelper.cpp +++ b/src/world/AI/TargetHelper.cpp @@ -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; } diff --git a/src/world/AI/TargetHelper.h b/src/world/AI/TargetHelper.h index b86e232d..10246367 100644 --- a/src/world/AI/TargetHelper.h +++ b/src/world/AI/TargetHelper.h @@ -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 diff --git a/src/world/Encounter/EncounterTimeline.cpp b/src/world/Encounter/EncounterTimeline.cpp index 33cb9938..1b50851b 100644 --- a/src/world/Encounter/EncounterTimeline.cpp +++ b/src/world/Encounter/EncounterTimeline.cpp @@ -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 ) diff --git a/src/world/Encounter/PhaseCondition.cpp b/src/world/Encounter/PhaseCondition.cpp index 03292059..0a1f4ec5 100644 --- a/src/world/Encounter/PhaseCondition.cpp +++ b/src/world/Encounter/PhaseCondition.cpp @@ -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 ) ) diff --git a/src/world/Encounter/PhaseCondition.h b/src/world/Encounter/PhaseCondition.h index 8ee4ec63..371aea3c 100644 --- a/src/world/Encounter/PhaseCondition.h +++ b/src/world/Encounter/PhaseCondition.h @@ -2,11 +2,12 @@ #include -#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 \ No newline at end of file diff --git a/src/world/Encounter/TimelineActor.cpp b/src/world/Encounter/TimelineActor.cpp index d7fa1a7a..9aa201b8 100644 --- a/src/world/Encounter/TimelineActor.cpp +++ b/src/world/Encounter/TimelineActor.cpp @@ -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 ); diff --git a/src/world/Encounter/Timepoint.cpp b/src/world/Encounter/Timepoint.cpp index 332a7b38..9b6fc70a 100644 --- a/src/world/Encounter/Timepoint.cpp +++ b/src/world/Encounter/Timepoint.cpp @@ -1,5 +1,6 @@ #include "Timepoint.h" #include "TimelineActor.h" +#include "EncounterTimeline.h" #include @@ -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; diff --git a/src/world/Encounter/Timepoint.h b/src/world/Encounter/Timepoint.h index e9c162e4..07fe7506 100644 --- a/src/world/Encounter/Timepoint.h +++ b/src/world/Encounter/Timepoint.h @@ -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 \ No newline at end of file