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:
parent
7cc3f65571
commit
26534d2a37
8 changed files with 134 additions and 94 deletions
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 )
|
||||
|
|
|
@ -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 ) )
|
||||
|
|
|
@ -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
|
|
@ -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 );
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
Loading…
Add table
Reference in a new issue