mirror of
https://github.com/SapphireServer/Sapphire.git
synced 2025-05-01 08:27:46 +00:00
wip: timeline refactor to use condition's ui assigned id
This commit is contained in:
parent
b29971b9a3
commit
8ce3dece5e
2 changed files with 123 additions and 124 deletions
|
@ -27,11 +27,11 @@ namespace Sapphire
|
|||
|
||||
// todo: check time elapsed
|
||||
|
||||
switch( m_conditionId )
|
||||
switch( m_conditionType )
|
||||
{
|
||||
case ConditionId::HpPctLessThan:
|
||||
case ConditionType::HpPctLessThan:
|
||||
return pBNpc->getHpPercent() < hp.val;
|
||||
case ConditionId::HpPctBetween:
|
||||
case ConditionType::HpPctBetween:
|
||||
{
|
||||
auto hpPct = pBNpc->getHpPercent();
|
||||
return hpPct >= hp.min && hpPct <= hp.max;
|
||||
|
@ -47,19 +47,19 @@ namespace Sapphire
|
|||
if( pDirector == nullptr )
|
||||
pDirector = pTeri->getAsQuestBattle();
|
||||
|
||||
switch( m_conditionId )
|
||||
switch( m_conditionType )
|
||||
{
|
||||
case ConditionId::DirectorVarEquals:
|
||||
case ConditionType::DirectorVarEquals:
|
||||
return pDirector->getDirectorVar( param.index ) == param.value;
|
||||
case ConditionId::DirectorVarGreaterThan:
|
||||
case ConditionType::DirectorVarGreaterThan:
|
||||
return pDirector->getDirectorVar( param.index ) > param.value;
|
||||
case ConditionId::DirectorFlagsEquals:
|
||||
case ConditionType::DirectorFlagsEquals:
|
||||
return pDirector->getFlags() == param.flags;
|
||||
case ConditionId::DirectorFlagsGreaterThan:
|
||||
case ConditionType::DirectorFlagsGreaterThan:
|
||||
return pDirector->getFlags() > param.flags;
|
||||
case ConditionId::DirectorSeqEquals:
|
||||
case ConditionType::DirectorSeqEquals:
|
||||
return pDirector->getSequence() == param.seq;
|
||||
case ConditionId::DirectorSeqGreaterThan:
|
||||
case ConditionType::DirectorSeqGreaterThan:
|
||||
return pDirector->getSequence() > param.seq;
|
||||
}
|
||||
return false;
|
||||
|
@ -354,8 +354,8 @@ namespace Sapphire
|
|||
auto pConditionData = std::dynamic_pointer_cast< TimepointDataCondition, TimepointData >( getData() );
|
||||
|
||||
// todo: dont reset so things can resume? idk
|
||||
self.resetConditionState( pConditionData->m_index );
|
||||
self.setConditionStateEnabled( pConditionData->m_index, pConditionData->m_enabled );
|
||||
self.resetConditionState( pConditionData->m_conditionId );
|
||||
self.setConditionStateEnabled( pConditionData->m_conditionId, pConditionData->m_enabled );
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -368,15 +368,15 @@ namespace Sapphire
|
|||
/*
|
||||
class RngCondition : TimepointCondition
|
||||
{
|
||||
EncounterTimepointConditionId m_type;
|
||||
EncounterTimepointcondition m_type;
|
||||
std::vector< uint32_t > m_params
|
||||
|
||||
RngCondition( EncounterTimepointConditionId conditionId std::vector< uint32_t params ) : m_type( conditionId ), m_params( params ){}
|
||||
RngCondition( EncounterTimepointcondition condition std::vector< uint32_t params ) : m_type( condition ), m_params( params ){}
|
||||
bool isConditionMet( uint32_t shit )
|
||||
{
|
||||
switch( m_type )
|
||||
{
|
||||
case EncounterTimepointConditionId::RngMinMax:
|
||||
case EncounterTimepointcondition::RngMinMax:
|
||||
return RNGMgr::generate( params[0], params[1] ) == params[2];
|
||||
}
|
||||
return false;
|
||||
|
@ -437,10 +437,10 @@ namespace Sapphire
|
|||
// parsing stuff below
|
||||
//
|
||||
|
||||
void EncounterTimeline::ConditionHp::from_json( nlohmann::json& json, Phase& phase, ConditionId conditionId,
|
||||
void EncounterTimeline::ConditionHp::from_json( nlohmann::json& json, Phase& phase, ConditionType condition,
|
||||
const std::unordered_map< std::string, TimelineActor >& actors )
|
||||
{
|
||||
PhaseCondition::from_json( json, phase, conditionId );
|
||||
PhaseCondition::from_json( json, phase, condition );
|
||||
|
||||
auto paramData = json.at( "paramData" );
|
||||
auto actorRef = paramData.at( "sourceActor" ).get< std::string >();
|
||||
|
@ -451,12 +451,12 @@ namespace Sapphire
|
|||
else
|
||||
throw std::runtime_error( fmt::format( std::string( "EncounterTimeline::ConditionHp::from_json unable to find actor by name: %s" ), actorRef ) );
|
||||
|
||||
switch( conditionId )
|
||||
switch( condition )
|
||||
{
|
||||
case ConditionId::HpPctLessThan:
|
||||
case ConditionType::HpPctLessThan:
|
||||
this->hp.val = paramData.at( "hp" ).get< uint32_t >();
|
||||
break;
|
||||
case ConditionId::HpPctBetween:
|
||||
case ConditionType::HpPctBetween:
|
||||
this->hp.min = paramData.at( "hpMin" ).get< uint32_t >(),
|
||||
this->hp.max = paramData.at( "hpMax" ).get< uint32_t >();
|
||||
break;
|
||||
|
@ -465,29 +465,29 @@ namespace Sapphire
|
|||
}
|
||||
}
|
||||
|
||||
void EncounterTimeline::ConditionDirectorVar::from_json( nlohmann::json& json, Phase& phase, ConditionId conditionId )
|
||||
void EncounterTimeline::ConditionDirectorVar::from_json( nlohmann::json& json, Phase& phase, ConditionType condition )
|
||||
{
|
||||
PhaseCondition::from_json( json, phase, conditionId );
|
||||
PhaseCondition::from_json( json, phase, condition );
|
||||
|
||||
auto paramData = json.at( "paramData" );
|
||||
|
||||
switch( conditionId )
|
||||
switch( condition )
|
||||
{
|
||||
case ConditionId::DirectorVarEquals:
|
||||
case ConditionId::DirectorVarGreaterThan:
|
||||
case ConditionType::DirectorVarEquals:
|
||||
case ConditionType::DirectorVarGreaterThan:
|
||||
{
|
||||
param.index = paramData.at( "idx" ).get< uint32_t >();
|
||||
param.value = paramData.at( "val" ).get< uint32_t >();
|
||||
}
|
||||
break;
|
||||
case ConditionId::DirectorFlagsEquals:
|
||||
case ConditionId::DirectorFlagsGreaterThan:
|
||||
case ConditionType::DirectorFlagsEquals:
|
||||
case ConditionType::DirectorFlagsGreaterThan:
|
||||
{
|
||||
param.flags = paramData.at( "flags" ).get< uint32_t >();
|
||||
}
|
||||
break;
|
||||
case ConditionId::DirectorSeqEquals:
|
||||
case ConditionId::DirectorSeqGreaterThan:
|
||||
case ConditionType::DirectorSeqEquals:
|
||||
case ConditionType::DirectorSeqGreaterThan:
|
||||
{
|
||||
param.seq = paramData.at( "seq" ).get< uint32_t >();
|
||||
}
|
||||
|
@ -497,10 +497,10 @@ namespace Sapphire
|
|||
}
|
||||
}
|
||||
|
||||
void EncounterTimeline::ConditionCombatState::from_json( nlohmann::json& json, Phase& phase, ConditionId conditionId,
|
||||
void EncounterTimeline::ConditionCombatState::from_json( nlohmann::json& json, Phase& phase, ConditionType condition,
|
||||
const std::unordered_map< std::string, TimelineActor >& actors )
|
||||
{
|
||||
PhaseCondition::from_json( json, phase, conditionId );
|
||||
PhaseCondition::from_json( json, phase, condition );
|
||||
|
||||
auto paramData = json.at( "paramData" );
|
||||
auto actorRef = paramData.at( "sourceActor" ).get< std::string >();
|
||||
|
@ -514,9 +514,9 @@ namespace Sapphire
|
|||
this->combatState = paramData.at( "combatState" ).get< CombatStateType >();
|
||||
}
|
||||
|
||||
void EncounterTimeline::ConditionEncounterTimeElapsed::from_json( nlohmann::json& json, Phase& phase, ConditionId conditionId )
|
||||
void EncounterTimeline::ConditionEncounterTimeElapsed::from_json( nlohmann::json& json, Phase& phase, ConditionType condition )
|
||||
{
|
||||
PhaseCondition::from_json( json, phase, conditionId );
|
||||
PhaseCondition::from_json( json, phase, condition );
|
||||
|
||||
auto paramData = json.at( "paramData" );
|
||||
auto duration = paramData.at( "duration" ).get< uint64_t >();
|
||||
|
@ -524,10 +524,10 @@ namespace Sapphire
|
|||
this->duration = duration;
|
||||
}
|
||||
|
||||
void EncounterTimeline::ConditionBNpcFlags::from_json( nlohmann::json& json, Phase& phase, ConditionId conditionId,
|
||||
void EncounterTimeline::ConditionBNpcFlags::from_json( nlohmann::json& json, Phase& phase, ConditionType condition,
|
||||
const std::unordered_map< std::string, TimelineActor >& actors )
|
||||
{
|
||||
PhaseCondition::from_json( json, phase, conditionId );
|
||||
PhaseCondition::from_json( json, phase, condition );
|
||||
auto actorRef = json.at( "actor" ).get< std::string >();
|
||||
|
||||
// resolve the actor whose name we are checking
|
||||
|
@ -625,7 +625,7 @@ namespace Sapphire
|
|||
{
|
||||
// todo: CastAction
|
||||
// todo: parse and build callback funcs
|
||||
auto dataJ = json.at( "data" );
|
||||
auto& dataJ = json.at( "data" );
|
||||
auto actorRef = json.at( "sourceActor" ).get< std::string >();
|
||||
auto actionId = json.at( "actionId" ).get< uint32_t >();
|
||||
|
||||
|
@ -640,7 +640,7 @@ namespace Sapphire
|
|||
break;
|
||||
case TimepointDataType::MoveTo:
|
||||
{
|
||||
auto dataJ = json.at( "data" );
|
||||
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;
|
||||
|
@ -650,7 +650,7 @@ namespace Sapphire
|
|||
break;
|
||||
case TimepointDataType::LogMessage:
|
||||
{
|
||||
auto dataJ = json.at( "data" );
|
||||
auto& dataJ = json.at( "data" );
|
||||
auto messageId = dataJ.at( "messageId" ).get< uint32_t >();
|
||||
auto params = dataJ.at( "params" ).get< std::vector< uint32_t > >();
|
||||
|
||||
|
@ -659,7 +659,7 @@ namespace Sapphire
|
|||
break;
|
||||
case TimepointDataType::BattleTalk:
|
||||
{
|
||||
auto dataJ = json.at( "data" );
|
||||
auto& dataJ = json.at( "data" );
|
||||
auto params = dataJ.at( "params" ).get< std::vector< uint32_t > >();
|
||||
|
||||
auto pBattleTalkData = std::make_shared< TimepointDataBattleTalk >( params );
|
||||
|
@ -679,7 +679,7 @@ namespace Sapphire
|
|||
//
|
||||
case TimepointDataType::DirectorVar:
|
||||
{
|
||||
auto dataJ = json.at( "data" );
|
||||
auto& dataJ = json.at( "data" );
|
||||
auto index = dataJ.at( "idx" ).get< uint32_t >();
|
||||
auto val = dataJ.at( "val" ).get< uint32_t >();
|
||||
auto opStr = dataJ.at( "opc" ).get< std::string >();
|
||||
|
@ -694,7 +694,7 @@ namespace Sapphire
|
|||
break;
|
||||
case TimepointDataType::DirectorVarLR:
|
||||
{
|
||||
auto dataJ = json.at( "data" );
|
||||
auto& dataJ = json.at( "data" );
|
||||
auto index = dataJ.at( "idx" ).get< uint32_t >();
|
||||
auto left = dataJ.at( "left" ).get< uint32_t >();
|
||||
auto right = dataJ.at( "right" ).get< uint32_t >();
|
||||
|
@ -711,7 +711,7 @@ namespace Sapphire
|
|||
break;
|
||||
case TimepointDataType::DirectorSeq:
|
||||
{
|
||||
auto dataJ = json.at( "data" );
|
||||
auto& dataJ = json.at( "data" );
|
||||
auto seq = dataJ.at( "val" ).get< uint32_t >();
|
||||
auto opStr = dataJ.at( "opc" ).get< std::string >();
|
||||
DirectorOpId op = directorOpMap.find( opStr )->second;
|
||||
|
@ -724,7 +724,7 @@ namespace Sapphire
|
|||
break;
|
||||
case TimepointDataType::DirectorFlags:
|
||||
{
|
||||
auto dataJ = json.at( "data" );
|
||||
auto& dataJ = json.at( "data" );
|
||||
auto flags = dataJ.at( "val" ).get< uint32_t >();
|
||||
auto opStr = dataJ.at( "opc" ).get< std::string >();
|
||||
DirectorOpId op = directorOpMap.find( opStr )->second;
|
||||
|
@ -749,7 +749,7 @@ namespace Sapphire
|
|||
|
||||
case TimepointDataType::SpawnBNpc:
|
||||
{
|
||||
auto dataJ = json.at( "data" );
|
||||
auto& dataJ = json.at( "data" );
|
||||
auto hateSrcJ = dataJ.at( "hateSrc" );
|
||||
auto actorRef = dataJ.at( "spawnActor" ).get< std::string >();
|
||||
auto flags = dataJ.at( "flags" ).get< uint32_t >();
|
||||
|
@ -767,7 +767,7 @@ namespace Sapphire
|
|||
break;
|
||||
case TimepointDataType::SetBNpcFlags:
|
||||
{
|
||||
auto dataJ = json.at( "data" );
|
||||
auto& dataJ = json.at( "data" );
|
||||
auto actorRef = dataJ.at( "spawnActor" ).get< std::string >();
|
||||
auto flags = dataJ.at( "flags" ).get< uint32_t >();
|
||||
|
||||
|
@ -786,7 +786,7 @@ namespace Sapphire
|
|||
|
||||
case TimepointDataType::SetEObjState:
|
||||
{
|
||||
auto dataJ = json.at( "data" );
|
||||
auto& dataJ = json.at( "data" );
|
||||
|
||||
// todo: SetEObjState
|
||||
}
|
||||
|
@ -794,11 +794,11 @@ namespace Sapphire
|
|||
|
||||
case TimepointDataType::SetCondition:
|
||||
{
|
||||
auto dataJ = json.at( "data" );
|
||||
auto index = dataJ.at( "conditionId" ).get< uint32_t >();
|
||||
auto& dataJ = json.at( "data" );
|
||||
auto conditionId = dataJ.at( "conditionId" ).get< uint32_t >();
|
||||
auto enabled = dataJ.at( "enabled" ).get< bool >();
|
||||
|
||||
m_pData = std::make_shared< TimepointDataCondition >( index - 1, enabled );
|
||||
m_pData = std::make_shared< TimepointDataCondition >( conditionId, enabled );
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -810,24 +810,24 @@ namespace Sapphire
|
|||
EncounterTimeline::TimelinePack EncounterTimeline::getEncounterPack( const std::string& name, bool reload )
|
||||
{
|
||||
static std::map< std::string, TimelinePack > cache = {};
|
||||
const static std::unordered_map< std::string, ConditionId > conditionIdMap =
|
||||
const static std::unordered_map< std::string, ConditionType > conditionMap =
|
||||
{
|
||||
{ "hpPctLessThan", ConditionId::HpPctLessThan },
|
||||
{ "hpPctBetween", ConditionId::HpPctBetween },
|
||||
{ "hpPctLessThan", ConditionType::HpPctLessThan },
|
||||
{ "hpPctBetween", ConditionType::HpPctBetween },
|
||||
|
||||
{ "directorVarEquals", ConditionId::DirectorVarEquals },
|
||||
{ "directorVarGreaterThan", ConditionId::DirectorVarGreaterThan },
|
||||
{ "directorVarEquals", ConditionType::DirectorVarEquals },
|
||||
{ "directorVarGreaterThan", ConditionType::DirectorVarGreaterThan },
|
||||
|
||||
{ "directorSeqEquals", ConditionId::DirectorSeqEquals },
|
||||
{ "directorSeqGreaterThan", ConditionId::DirectorSeqGreaterThan },
|
||||
{ "directorSeqEquals", ConditionType::DirectorSeqEquals },
|
||||
{ "directorSeqGreaterThan", ConditionType::DirectorSeqGreaterThan },
|
||||
|
||||
{ "directorFlagsEquals", ConditionId::DirectorFlagsEquals },
|
||||
{ "directorFlagsGreaterThan", ConditionId::DirectorFlagsGreaterThan },
|
||||
{ "directorFlagsEquals", ConditionType::DirectorFlagsEquals },
|
||||
{ "directorFlagsGreaterThan", ConditionType::DirectorFlagsGreaterThan },
|
||||
|
||||
{ "encounterTimeElapsed", ConditionId::EncounterTimeElapsed },
|
||||
{ "encounterTimeElapsed", ConditionType::EncounterTimeElapsed },
|
||||
|
||||
{ "combatState", ConditionId::CombatState },
|
||||
{ "bnpcHasFlags", ConditionId::BNpcHasFlags }
|
||||
{ "combatState", ConditionType::CombatState },
|
||||
{ "bnpcHasFlags", ConditionType::BNpcHasFlags }
|
||||
};
|
||||
|
||||
TimelinePack pack;
|
||||
|
@ -903,16 +903,14 @@ namespace Sapphire
|
|||
{
|
||||
auto& pcV = pcJ.value();
|
||||
auto conditionName = pcV.at( "condition" ).get< std::string >();
|
||||
auto description = pcV.at( "description" ).get< std::string >();
|
||||
auto loop = pcV.at( "loop" ).get< bool >();
|
||||
auto phaseRef = pcV.at( "targetPhase" ).get< std::string >();
|
||||
auto actorRef = pcV.at( "targetActor" ).get< std::string >();
|
||||
|
||||
ConditionId conditionId;
|
||||
|
||||
ConditionType condition;
|
||||
|
||||
// make sure condition exists
|
||||
if( auto it = conditionIdMap.find( conditionName ); it != conditionIdMap.end() )
|
||||
conditionId = it->second;
|
||||
if( auto it = conditionMap.find( conditionName ); it != conditionMap.end() )
|
||||
condition = it->second;
|
||||
else
|
||||
throw std::runtime_error( fmt::format( std::string( "EncounterTimeline::buildEncounterTimeline - no condition id found by name: %s" ), conditionName ) );
|
||||
|
||||
|
@ -930,36 +928,36 @@ namespace Sapphire
|
|||
|
||||
// build the condition
|
||||
PhaseConditionPtr pCondition;
|
||||
switch( conditionId )
|
||||
switch( condition )
|
||||
{
|
||||
case ConditionId::HpPctLessThan:
|
||||
case ConditionId::HpPctBetween:
|
||||
case ConditionType::HpPctLessThan:
|
||||
case ConditionType::HpPctBetween:
|
||||
{
|
||||
auto pHpCondition = std::make_shared< ConditionHp >();
|
||||
pHpCondition->from_json( pcV, phase, conditionId, actorNameMap );
|
||||
pHpCondition->from_json( pcV, phase, condition, actorNameMap );
|
||||
}
|
||||
break;
|
||||
case ConditionId::DirectorVarEquals:
|
||||
case ConditionId::DirectorVarGreaterThan:
|
||||
case ConditionId::DirectorFlagsEquals:
|
||||
case ConditionId::DirectorFlagsGreaterThan:
|
||||
case ConditionId::DirectorSeqEquals:
|
||||
case ConditionId::DirectorSeqGreaterThan:
|
||||
case ConditionType::DirectorVarEquals:
|
||||
case ConditionType::DirectorVarGreaterThan:
|
||||
case ConditionType::DirectorFlagsEquals:
|
||||
case ConditionType::DirectorFlagsGreaterThan:
|
||||
case ConditionType::DirectorSeqEquals:
|
||||
case ConditionType::DirectorSeqGreaterThan:
|
||||
{
|
||||
auto pDirectorCondition = std::make_shared< ConditionDirectorVar >();
|
||||
pDirectorCondition->from_json( pcV, phase, conditionId );
|
||||
pDirectorCondition->from_json( pcV, phase, condition );
|
||||
}
|
||||
break;
|
||||
case ConditionId::EncounterTimeElapsed:
|
||||
case ConditionType::EncounterTimeElapsed:
|
||||
{
|
||||
auto pEncounterCondition = std::make_shared< ConditionEncounterTimeElapsed >();
|
||||
pEncounterCondition->from_json( pcV, phase, conditionId );
|
||||
pEncounterCondition->from_json( pcV, phase, condition );
|
||||
}
|
||||
break;
|
||||
case ConditionId::CombatState:
|
||||
case ConditionType::CombatState:
|
||||
{
|
||||
auto pCombatStateCondition = std::make_shared< ConditionCombatState >();
|
||||
pCombatStateCondition->from_json( pcV, phase, conditionId, actorNameMap );
|
||||
pCombatStateCondition->from_json( pcV, phase, condition, actorNameMap );
|
||||
}
|
||||
break;
|
||||
default:
|
||||
|
|
|
@ -53,8 +53,8 @@ namespace Sapphire
|
|||
//
|
||||
// Enums
|
||||
//
|
||||
// EncounterFight::OnTick() { switch EncounterTimepointConditionId }
|
||||
enum class ConditionId : uint32_t
|
||||
// EncounterFight::OnTick() { switch EncounterTimepointcondition }
|
||||
enum class ConditionType : uint32_t
|
||||
{
|
||||
HpPctLessThan,
|
||||
HpPctBetween,
|
||||
|
@ -391,12 +391,12 @@ namespace Sapphire
|
|||
struct TimepointDataCondition : public TimepointData
|
||||
{
|
||||
// todo: rng?
|
||||
uint32_t m_index;
|
||||
uint32_t m_conditionId;
|
||||
bool m_enabled;
|
||||
|
||||
TimepointDataCondition( uint32_t index, bool enabled ) :
|
||||
TimepointDataCondition( uint32_t conditionId, bool enabled ) :
|
||||
TimepointData( TimepointDataType::SetCondition ),
|
||||
m_index( index ),
|
||||
m_conditionId( conditionId ),
|
||||
m_enabled( enabled )
|
||||
{
|
||||
}
|
||||
|
@ -493,7 +493,7 @@ namespace Sapphire
|
|||
|
||||
if( timepoint.durationElapsed( timepointElapsed ) && timepoint.finished( tpState, timepointElapsed ) )
|
||||
{
|
||||
timepoint.reset( tpState );
|
||||
// timepoint.reset( tpState );
|
||||
// make sure this timepoint isnt run again unless phase loops
|
||||
++i;
|
||||
state.m_phaseInfo.m_lastTimepointIndex = i;
|
||||
|
@ -513,9 +513,6 @@ namespace Sapphire
|
|||
state.m_phaseInfo.m_startTime = 0;
|
||||
state.m_phaseInfo.m_lastTimepointIndex = 0;
|
||||
state.m_phaseInfo.m_lastTimepointTime = 0;
|
||||
|
||||
state.m_phaseInfo.m_timepointStates.clear();
|
||||
state.m_phaseInfo.m_timepointStates.resize( m_timepoints.size() );
|
||||
}
|
||||
|
||||
bool completed( const ConditionState& state ) const
|
||||
|
@ -529,25 +526,27 @@ namespace Sapphire
|
|||
public std::enable_shared_from_this< PhaseCondition >
|
||||
{
|
||||
protected:
|
||||
ConditionId m_conditionId{ 0 };
|
||||
ConditionType m_conditionType{ 0 };
|
||||
Phase m_phase;
|
||||
std::string m_description;
|
||||
uint32_t m_cooldown{ 0 };
|
||||
bool m_loop{ false };
|
||||
bool m_enabled{ true };
|
||||
uint32_t m_id{ 0 };
|
||||
|
||||
public:
|
||||
PhaseCondition() {}
|
||||
~PhaseCondition() {}
|
||||
|
||||
virtual void from_json( nlohmann::json& json, Phase& phase, ConditionId conditionId )
|
||||
virtual void from_json( nlohmann::json& json, Phase& phase, ConditionType condition )
|
||||
{
|
||||
this->m_conditionId = conditionId;
|
||||
this->m_conditionType = condition;
|
||||
this->m_loop = json.at( "loop" ).get< bool >();
|
||||
//this->m_cooldown = json.at( "cooldown" ).get< uint32_t >();
|
||||
this->m_phase = phase;
|
||||
this->m_description = json.at( "description" ).get< std::string >();
|
||||
this->m_enabled = json.at( "enabled" ).get< bool >();
|
||||
this->m_id = json.at( "id" ).get< uint32_t >();
|
||||
}
|
||||
|
||||
void execute( ConditionState& state, TimelineActor& self, TerritoryPtr pTeri, TimelinePack& pack, uint64_t time ) const
|
||||
|
@ -609,15 +608,18 @@ namespace Sapphire
|
|||
return false;
|
||||
};
|
||||
|
||||
uint32_t getId() const
|
||||
{
|
||||
return m_id;
|
||||
}
|
||||
};
|
||||
using PhaseConditionPtr = std::shared_ptr< PhaseCondition >;
|
||||
|
||||
class TimelineActor
|
||||
{
|
||||
protected:
|
||||
std::vector< PhaseConditionPtr > m_phaseConditions;
|
||||
std::queue< PhaseConditionPtr > m_phaseHistory;
|
||||
std::vector< ConditionState > m_conditionStates;
|
||||
std::unordered_map< uint32_t, PhaseConditionPtr > m_phaseConditions;
|
||||
std::unordered_map< uint32_t, ConditionState > m_conditionStates;
|
||||
// PARENTNAME_SUBACTOR_1, ..., PARENTNAME_SUBACTOR_69
|
||||
std::map< std::string, Entity::BNpcPtr > m_subActors;
|
||||
public:
|
||||
|
@ -638,19 +640,19 @@ namespace Sapphire
|
|||
|
||||
void addPhaseCondition( PhaseConditionPtr pCondition )
|
||||
{
|
||||
m_phaseConditions.push_back( pCondition );
|
||||
m_conditionStates.push_back( {} );
|
||||
m_conditionStates[ m_conditionStates.size() - 1 ].m_enabled = pCondition->isDefaultEnabled();
|
||||
m_phaseConditions.emplace( std::make_pair( pCondition->getId(), pCondition ) );
|
||||
m_conditionStates[ pCondition->getId() ] = {};
|
||||
m_conditionStates[ pCondition->getId() ].m_enabled = pCondition->isDefaultEnabled();
|
||||
}
|
||||
|
||||
// todo: make this sane
|
||||
void update( TerritoryPtr pTeri, TimelinePack& pack, uint64_t time )
|
||||
{
|
||||
// todo: handle interrupts
|
||||
for( auto i = 0; i < m_phaseConditions.size(); ++i )
|
||||
for( const auto& condition : m_phaseConditions)
|
||||
{
|
||||
const auto& pCondition = m_phaseConditions[ i ];
|
||||
auto& state = m_conditionStates[ i ];
|
||||
const auto& pCondition = condition.second;
|
||||
auto& state = m_conditionStates[ pCondition->getId() ];
|
||||
|
||||
// ignore if not enabled, unless overriden to enable
|
||||
if( !pCondition->isStateEnabled( state ) )
|
||||
|
@ -671,7 +673,6 @@ namespace Sapphire
|
|||
else if( pCondition->isConditionMet( state, pTeri, pack, time ) )
|
||||
{
|
||||
pCondition->execute( state, *this, pTeri, pack, time );
|
||||
m_phaseHistory.push( pCondition );
|
||||
|
||||
if( pack.getStartTime() == 0 )
|
||||
pack.setStartTime( state.m_startTime );
|
||||
|
@ -679,30 +680,30 @@ namespace Sapphire
|
|||
}
|
||||
}
|
||||
|
||||
void resetConditionState( uint32_t conditionIdx )
|
||||
void resetConditionState( uint32_t conditionId )
|
||||
{
|
||||
assert( conditionIdx < m_phaseConditions.size() );
|
||||
|
||||
const auto& pCondition = m_phaseConditions[ conditionIdx ];
|
||||
auto& state = m_conditionStates[ conditionIdx ];
|
||||
|
||||
pCondition->reset( state );
|
||||
if( auto it = m_phaseConditions.find( conditionId ); it != m_phaseConditions.end() )
|
||||
{
|
||||
auto& state = m_conditionStates.at( it->first );
|
||||
it->second->reset( state );
|
||||
}
|
||||
}
|
||||
|
||||
void setConditionStateEnabled( uint32_t conditionIdx, bool enabled )
|
||||
void setConditionStateEnabled( uint32_t conditionId, bool enabled )
|
||||
{
|
||||
assert( conditionIdx < m_conditionStates.size() );
|
||||
|
||||
auto& state = m_conditionStates[ conditionIdx ];
|
||||
state.m_enabled = enabled;
|
||||
if( auto it = m_conditionStates.find( conditionId ); it != m_conditionStates.end() )
|
||||
{
|
||||
auto& state = m_conditionStates.at( it->first );
|
||||
state.m_enabled = enabled;
|
||||
}
|
||||
}
|
||||
|
||||
void resetAllConditionStates()
|
||||
{
|
||||
for( auto i = 0; i < m_phaseConditions.size(); ++i )
|
||||
for( const auto& condition : m_phaseConditions )
|
||||
{
|
||||
const auto& pCondition = m_phaseConditions[ i ];
|
||||
auto& state = m_conditionStates[ i ];
|
||||
const auto& pCondition = condition.second;
|
||||
auto& state = m_conditionStates.at( condition.first );
|
||||
|
||||
pCondition->reset( state );
|
||||
}
|
||||
|
@ -776,7 +777,7 @@ namespace Sapphire
|
|||
};
|
||||
} hp;
|
||||
|
||||
void from_json( nlohmann::json& json, Phase& phase, ConditionId conditionId,
|
||||
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;
|
||||
|
@ -796,7 +797,7 @@ namespace Sapphire
|
|||
uint8_t flags;
|
||||
} param;
|
||||
|
||||
void from_json( nlohmann::json& json, Phase& phase, ConditionId conditionId );
|
||||
void from_json( nlohmann::json& json, Phase& phase, ConditionType condition );
|
||||
bool isConditionMet( ConditionState& state, TerritoryPtr pTeri, TimelinePack& pack, uint64_t time ) const override;
|
||||
};
|
||||
|
||||
|
@ -805,7 +806,7 @@ namespace Sapphire
|
|||
public:
|
||||
uint64_t duration;
|
||||
|
||||
void from_json( nlohmann::json& json, Phase& phase, ConditionId conditionId );
|
||||
void from_json( nlohmann::json& json, Phase& phase, ConditionType condition );
|
||||
bool isConditionMet( ConditionState& state, TerritoryPtr pTeri, TimelinePack& pack, uint64_t time ) const override;
|
||||
};
|
||||
|
||||
|
@ -815,7 +816,7 @@ namespace Sapphire
|
|||
uint32_t layoutId;
|
||||
CombatStateType combatState;
|
||||
|
||||
void from_json( nlohmann::json& json, Phase& phase, ConditionId conditionId, 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;
|
||||
};
|
||||
|
||||
|
@ -825,7 +826,7 @@ namespace Sapphire
|
|||
uint32_t layoutId;
|
||||
uint32_t flags;
|
||||
|
||||
void from_json( nlohmann::json& json, Phase& phase, ConditionId conditionId, 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;
|
||||
};
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue