1
Fork 0
mirror of https://github.com/SapphireServer/Sapphire.git synced 2025-05-02 00:47:45 +00:00

wip: timeline refactor to use condition's ui assigned id

This commit is contained in:
Tahir 2024-05-28 12:32:53 +01:00
parent b29971b9a3
commit 8ce3dece5e
2 changed files with 123 additions and 124 deletions

View file

@ -27,11 +27,11 @@ namespace Sapphire
// todo: check time elapsed // todo: check time elapsed
switch( m_conditionId ) switch( m_conditionType )
{ {
case ConditionId::HpPctLessThan: case ConditionType::HpPctLessThan:
return pBNpc->getHpPercent() < hp.val; return pBNpc->getHpPercent() < hp.val;
case ConditionId::HpPctBetween: case ConditionType::HpPctBetween:
{ {
auto hpPct = pBNpc->getHpPercent(); auto hpPct = pBNpc->getHpPercent();
return hpPct >= hp.min && hpPct <= hp.max; return hpPct >= hp.min && hpPct <= hp.max;
@ -47,19 +47,19 @@ namespace Sapphire
if( pDirector == nullptr ) if( pDirector == nullptr )
pDirector = pTeri->getAsQuestBattle(); pDirector = pTeri->getAsQuestBattle();
switch( m_conditionId ) switch( m_conditionType )
{ {
case ConditionId::DirectorVarEquals: case ConditionType::DirectorVarEquals:
return pDirector->getDirectorVar( param.index ) == param.value; return pDirector->getDirectorVar( param.index ) == param.value;
case ConditionId::DirectorVarGreaterThan: case ConditionType::DirectorVarGreaterThan:
return pDirector->getDirectorVar( param.index ) > param.value; return pDirector->getDirectorVar( param.index ) > param.value;
case ConditionId::DirectorFlagsEquals: case ConditionType::DirectorFlagsEquals:
return pDirector->getFlags() == param.flags; return pDirector->getFlags() == param.flags;
case ConditionId::DirectorFlagsGreaterThan: case ConditionType::DirectorFlagsGreaterThan:
return pDirector->getFlags() > param.flags; return pDirector->getFlags() > param.flags;
case ConditionId::DirectorSeqEquals: case ConditionType::DirectorSeqEquals:
return pDirector->getSequence() == param.seq; return pDirector->getSequence() == param.seq;
case ConditionId::DirectorSeqGreaterThan: case ConditionType::DirectorSeqGreaterThan:
return pDirector->getSequence() > param.seq; return pDirector->getSequence() > param.seq;
} }
return false; return false;
@ -354,8 +354,8 @@ namespace Sapphire
auto pConditionData = std::dynamic_pointer_cast< TimepointDataCondition, TimepointData >( getData() ); auto pConditionData = std::dynamic_pointer_cast< TimepointDataCondition, TimepointData >( getData() );
// todo: dont reset so things can resume? idk // todo: dont reset so things can resume? idk
self.resetConditionState( pConditionData->m_index ); self.resetConditionState( pConditionData->m_conditionId );
self.setConditionStateEnabled( pConditionData->m_index, pConditionData->m_enabled ); self.setConditionStateEnabled( pConditionData->m_conditionId, pConditionData->m_enabled );
} }
} }
@ -368,15 +368,15 @@ namespace Sapphire
/* /*
class RngCondition : TimepointCondition class RngCondition : TimepointCondition
{ {
EncounterTimepointConditionId m_type; EncounterTimepointcondition m_type;
std::vector< uint32_t > m_params 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 ) bool isConditionMet( uint32_t shit )
{ {
switch( m_type ) switch( m_type )
{ {
case EncounterTimepointConditionId::RngMinMax: case EncounterTimepointcondition::RngMinMax:
return RNGMgr::generate( params[0], params[1] ) == params[2]; return RNGMgr::generate( params[0], params[1] ) == params[2];
} }
return false; return false;
@ -437,10 +437,10 @@ namespace Sapphire
// parsing stuff below // 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 ) 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 paramData = json.at( "paramData" );
auto actorRef = paramData.at( "sourceActor" ).get< std::string >(); auto actorRef = paramData.at( "sourceActor" ).get< std::string >();
@ -451,12 +451,12 @@ namespace Sapphire
else else
throw std::runtime_error( fmt::format( std::string( "EncounterTimeline::ConditionHp::from_json unable to find actor by name: %s" ), actorRef ) ); 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 >(); this->hp.val = paramData.at( "hp" ).get< uint32_t >();
break; break;
case ConditionId::HpPctBetween: case ConditionType::HpPctBetween:
this->hp.min = paramData.at( "hpMin" ).get< uint32_t >(), this->hp.min = paramData.at( "hpMin" ).get< uint32_t >(),
this->hp.max = paramData.at( "hpMax" ).get< uint32_t >(); this->hp.max = paramData.at( "hpMax" ).get< uint32_t >();
break; 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" ); auto paramData = json.at( "paramData" );
switch( conditionId ) switch( condition )
{ {
case ConditionId::DirectorVarEquals: case ConditionType::DirectorVarEquals:
case ConditionId::DirectorVarGreaterThan: case ConditionType::DirectorVarGreaterThan:
{ {
param.index = paramData.at( "idx" ).get< uint32_t >(); param.index = paramData.at( "idx" ).get< uint32_t >();
param.value = paramData.at( "val" ).get< uint32_t >(); param.value = paramData.at( "val" ).get< uint32_t >();
} }
break; break;
case ConditionId::DirectorFlagsEquals: case ConditionType::DirectorFlagsEquals:
case ConditionId::DirectorFlagsGreaterThan: case ConditionType::DirectorFlagsGreaterThan:
{ {
param.flags = paramData.at( "flags" ).get< uint32_t >(); param.flags = paramData.at( "flags" ).get< uint32_t >();
} }
break; break;
case ConditionId::DirectorSeqEquals: case ConditionType::DirectorSeqEquals:
case ConditionId::DirectorSeqGreaterThan: case ConditionType::DirectorSeqGreaterThan:
{ {
param.seq = paramData.at( "seq" ).get< uint32_t >(); 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 ) 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 paramData = json.at( "paramData" );
auto actorRef = paramData.at( "sourceActor" ).get< std::string >(); auto actorRef = paramData.at( "sourceActor" ).get< std::string >();
@ -514,9 +514,9 @@ namespace Sapphire
this->combatState = paramData.at( "combatState" ).get< CombatStateType >(); 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 paramData = json.at( "paramData" );
auto duration = paramData.at( "duration" ).get< uint64_t >(); auto duration = paramData.at( "duration" ).get< uint64_t >();
@ -524,10 +524,10 @@ namespace Sapphire
this->duration = duration; 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 ) 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 >(); auto actorRef = json.at( "actor" ).get< std::string >();
// resolve the actor whose name we are checking // resolve the actor whose name we are checking
@ -625,7 +625,7 @@ namespace Sapphire
{ {
// todo: CastAction // todo: CastAction
// todo: parse and build callback funcs // 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 actorRef = json.at( "sourceActor" ).get< std::string >();
auto actionId = json.at( "actionId" ).get< uint32_t >(); auto actionId = json.at( "actionId" ).get< uint32_t >();
@ -640,7 +640,7 @@ namespace Sapphire
break; break;
case TimepointDataType::MoveTo: case TimepointDataType::MoveTo:
{ {
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 pathReq = dataJ.at( "pathRequested" ).get< bool >() ? MoveType::WalkPath : MoveType::Teleport;
@ -650,7 +650,7 @@ namespace Sapphire
break; break;
case TimepointDataType::LogMessage: case TimepointDataType::LogMessage:
{ {
auto dataJ = json.at( "data" ); auto& dataJ = json.at( "data" );
auto messageId = dataJ.at( "messageId" ).get< uint32_t >(); auto messageId = dataJ.at( "messageId" ).get< uint32_t >();
auto params = dataJ.at( "params" ).get< std::vector< uint32_t > >(); auto params = dataJ.at( "params" ).get< std::vector< uint32_t > >();
@ -659,7 +659,7 @@ namespace Sapphire
break; break;
case TimepointDataType::BattleTalk: case TimepointDataType::BattleTalk:
{ {
auto dataJ = json.at( "data" ); auto& dataJ = json.at( "data" );
auto params = dataJ.at( "params" ).get< std::vector< uint32_t > >(); auto params = dataJ.at( "params" ).get< std::vector< uint32_t > >();
auto pBattleTalkData = std::make_shared< TimepointDataBattleTalk >( params ); auto pBattleTalkData = std::make_shared< TimepointDataBattleTalk >( params );
@ -679,7 +679,7 @@ namespace Sapphire
// //
case TimepointDataType::DirectorVar: case TimepointDataType::DirectorVar:
{ {
auto dataJ = json.at( "data" ); auto& dataJ = json.at( "data" );
auto index = dataJ.at( "idx" ).get< uint32_t >(); auto index = dataJ.at( "idx" ).get< uint32_t >();
auto val = dataJ.at( "val" ).get< uint32_t >(); auto val = dataJ.at( "val" ).get< uint32_t >();
auto opStr = dataJ.at( "opc" ).get< std::string >(); auto opStr = dataJ.at( "opc" ).get< std::string >();
@ -694,7 +694,7 @@ namespace Sapphire
break; break;
case TimepointDataType::DirectorVarLR: case TimepointDataType::DirectorVarLR:
{ {
auto dataJ = json.at( "data" ); auto& dataJ = json.at( "data" );
auto index = dataJ.at( "idx" ).get< uint32_t >(); auto index = dataJ.at( "idx" ).get< uint32_t >();
auto left = dataJ.at( "left" ).get< uint32_t >(); auto left = dataJ.at( "left" ).get< uint32_t >();
auto right = dataJ.at( "right" ).get< uint32_t >(); auto right = dataJ.at( "right" ).get< uint32_t >();
@ -711,7 +711,7 @@ namespace Sapphire
break; break;
case TimepointDataType::DirectorSeq: case TimepointDataType::DirectorSeq:
{ {
auto dataJ = json.at( "data" ); auto& dataJ = json.at( "data" );
auto seq = dataJ.at( "val" ).get< uint32_t >(); auto seq = dataJ.at( "val" ).get< uint32_t >();
auto opStr = dataJ.at( "opc" ).get< std::string >(); auto opStr = dataJ.at( "opc" ).get< std::string >();
DirectorOpId op = directorOpMap.find( opStr )->second; DirectorOpId op = directorOpMap.find( opStr )->second;
@ -724,7 +724,7 @@ namespace Sapphire
break; break;
case TimepointDataType::DirectorFlags: case TimepointDataType::DirectorFlags:
{ {
auto dataJ = json.at( "data" ); auto& dataJ = json.at( "data" );
auto flags = dataJ.at( "val" ).get< uint32_t >(); auto flags = dataJ.at( "val" ).get< uint32_t >();
auto opStr = dataJ.at( "opc" ).get< std::string >(); auto opStr = dataJ.at( "opc" ).get< std::string >();
DirectorOpId op = directorOpMap.find( opStr )->second; DirectorOpId op = directorOpMap.find( opStr )->second;
@ -749,7 +749,7 @@ namespace Sapphire
case TimepointDataType::SpawnBNpc: case TimepointDataType::SpawnBNpc:
{ {
auto dataJ = json.at( "data" ); auto& dataJ = json.at( "data" );
auto hateSrcJ = dataJ.at( "hateSrc" ); auto hateSrcJ = dataJ.at( "hateSrc" );
auto actorRef = dataJ.at( "spawnActor" ).get< std::string >(); auto actorRef = dataJ.at( "spawnActor" ).get< std::string >();
auto flags = dataJ.at( "flags" ).get< uint32_t >(); auto flags = dataJ.at( "flags" ).get< uint32_t >();
@ -767,7 +767,7 @@ namespace Sapphire
break; break;
case TimepointDataType::SetBNpcFlags: case TimepointDataType::SetBNpcFlags:
{ {
auto dataJ = json.at( "data" ); auto& dataJ = json.at( "data" );
auto actorRef = dataJ.at( "spawnActor" ).get< std::string >(); auto actorRef = dataJ.at( "spawnActor" ).get< std::string >();
auto flags = dataJ.at( "flags" ).get< uint32_t >(); auto flags = dataJ.at( "flags" ).get< uint32_t >();
@ -786,7 +786,7 @@ namespace Sapphire
case TimepointDataType::SetEObjState: case TimepointDataType::SetEObjState:
{ {
auto dataJ = json.at( "data" ); auto& dataJ = json.at( "data" );
// todo: SetEObjState // todo: SetEObjState
} }
@ -794,11 +794,11 @@ namespace Sapphire
case TimepointDataType::SetCondition: case TimepointDataType::SetCondition:
{ {
auto dataJ = json.at( "data" ); auto& dataJ = json.at( "data" );
auto index = dataJ.at( "conditionId" ).get< uint32_t >(); auto conditionId = dataJ.at( "conditionId" ).get< uint32_t >();
auto enabled = dataJ.at( "enabled" ).get< bool >(); 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; break;
@ -810,24 +810,24 @@ namespace Sapphire
EncounterTimeline::TimelinePack EncounterTimeline::getEncounterPack( const std::string& name, bool reload ) EncounterTimeline::TimelinePack EncounterTimeline::getEncounterPack( const std::string& name, bool reload )
{ {
static std::map< std::string, TimelinePack > cache = {}; 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 }, { "hpPctLessThan", ConditionType::HpPctLessThan },
{ "hpPctBetween", ConditionId::HpPctBetween }, { "hpPctBetween", ConditionType::HpPctBetween },
{ "directorVarEquals", ConditionId::DirectorVarEquals }, { "directorVarEquals", ConditionType::DirectorVarEquals },
{ "directorVarGreaterThan", ConditionId::DirectorVarGreaterThan }, { "directorVarGreaterThan", ConditionType::DirectorVarGreaterThan },
{ "directorSeqEquals", ConditionId::DirectorSeqEquals }, { "directorSeqEquals", ConditionType::DirectorSeqEquals },
{ "directorSeqGreaterThan", ConditionId::DirectorSeqGreaterThan }, { "directorSeqGreaterThan", ConditionType::DirectorSeqGreaterThan },
{ "directorFlagsEquals", ConditionId::DirectorFlagsEquals }, { "directorFlagsEquals", ConditionType::DirectorFlagsEquals },
{ "directorFlagsGreaterThan", ConditionId::DirectorFlagsGreaterThan }, { "directorFlagsGreaterThan", ConditionType::DirectorFlagsGreaterThan },
{ "encounterTimeElapsed", ConditionId::EncounterTimeElapsed }, { "encounterTimeElapsed", ConditionType::EncounterTimeElapsed },
{ "combatState", ConditionId::CombatState }, { "combatState", ConditionType::CombatState },
{ "bnpcHasFlags", ConditionId::BNpcHasFlags } { "bnpcHasFlags", ConditionType::BNpcHasFlags }
}; };
TimelinePack pack; TimelinePack pack;
@ -903,16 +903,14 @@ namespace Sapphire
{ {
auto& pcV = pcJ.value(); auto& pcV = pcJ.value();
auto conditionName = pcV.at( "condition" ).get< std::string >(); 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 phaseRef = pcV.at( "targetPhase" ).get< std::string >();
auto actorRef = pcV.at( "targetActor" ).get< std::string >(); auto actorRef = pcV.at( "targetActor" ).get< std::string >();
ConditionId conditionId; ConditionType condition;
// make sure condition exists // make sure condition exists
if( auto it = conditionIdMap.find( conditionName ); it != conditionIdMap.end() ) if( auto it = conditionMap.find( conditionName ); it != conditionMap.end() )
conditionId = it->second; condition = it->second;
else else
throw std::runtime_error( fmt::format( std::string( "EncounterTimeline::buildEncounterTimeline - no condition id found by name: %s" ), conditionName ) ); 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 // build the condition
PhaseConditionPtr pCondition; PhaseConditionPtr pCondition;
switch( conditionId ) switch( condition )
{ {
case ConditionId::HpPctLessThan: case ConditionType::HpPctLessThan:
case ConditionId::HpPctBetween: case ConditionType::HpPctBetween:
{ {
auto pHpCondition = std::make_shared< ConditionHp >(); auto pHpCondition = std::make_shared< ConditionHp >();
pHpCondition->from_json( pcV, phase, conditionId, actorNameMap ); pHpCondition->from_json( pcV, phase, condition, actorNameMap );
} }
break; break;
case ConditionId::DirectorVarEquals: case ConditionType::DirectorVarEquals:
case ConditionId::DirectorVarGreaterThan: case ConditionType::DirectorVarGreaterThan:
case ConditionId::DirectorFlagsEquals: case ConditionType::DirectorFlagsEquals:
case ConditionId::DirectorFlagsGreaterThan: case ConditionType::DirectorFlagsGreaterThan:
case ConditionId::DirectorSeqEquals: case ConditionType::DirectorSeqEquals:
case ConditionId::DirectorSeqGreaterThan: case ConditionType::DirectorSeqGreaterThan:
{ {
auto pDirectorCondition = std::make_shared< ConditionDirectorVar >(); auto pDirectorCondition = std::make_shared< ConditionDirectorVar >();
pDirectorCondition->from_json( pcV, phase, conditionId ); pDirectorCondition->from_json( pcV, phase, condition );
} }
break; break;
case ConditionId::EncounterTimeElapsed: case ConditionType::EncounterTimeElapsed:
{ {
auto pEncounterCondition = std::make_shared< ConditionEncounterTimeElapsed >(); auto pEncounterCondition = std::make_shared< ConditionEncounterTimeElapsed >();
pEncounterCondition->from_json( pcV, phase, conditionId ); pEncounterCondition->from_json( pcV, phase, condition );
} }
break; break;
case ConditionId::CombatState: case ConditionType::CombatState:
{ {
auto pCombatStateCondition = std::make_shared< ConditionCombatState >(); auto pCombatStateCondition = std::make_shared< ConditionCombatState >();
pCombatStateCondition->from_json( pcV, phase, conditionId, actorNameMap ); pCombatStateCondition->from_json( pcV, phase, condition, actorNameMap );
} }
break; break;
default: default:

View file

@ -53,8 +53,8 @@ namespace Sapphire
// //
// Enums // Enums
// //
// EncounterFight::OnTick() { switch EncounterTimepointConditionId } // EncounterFight::OnTick() { switch EncounterTimepointcondition }
enum class ConditionId : uint32_t enum class ConditionType : uint32_t
{ {
HpPctLessThan, HpPctLessThan,
HpPctBetween, HpPctBetween,
@ -391,12 +391,12 @@ namespace Sapphire
struct TimepointDataCondition : public TimepointData struct TimepointDataCondition : public TimepointData
{ {
// todo: rng? // todo: rng?
uint32_t m_index; uint32_t m_conditionId;
bool m_enabled; bool m_enabled;
TimepointDataCondition( uint32_t index, bool enabled ) : TimepointDataCondition( uint32_t conditionId, bool enabled ) :
TimepointData( TimepointDataType::SetCondition ), TimepointData( TimepointDataType::SetCondition ),
m_index( index ), m_conditionId( conditionId ),
m_enabled( enabled ) m_enabled( enabled )
{ {
} }
@ -493,7 +493,7 @@ namespace Sapphire
if( timepoint.durationElapsed( timepointElapsed ) && timepoint.finished( tpState, timepointElapsed ) ) if( timepoint.durationElapsed( timepointElapsed ) && timepoint.finished( tpState, timepointElapsed ) )
{ {
timepoint.reset( tpState ); // timepoint.reset( tpState );
// make sure this timepoint isnt run again unless phase loops // make sure this timepoint isnt run again unless phase loops
++i; ++i;
state.m_phaseInfo.m_lastTimepointIndex = i; state.m_phaseInfo.m_lastTimepointIndex = i;
@ -513,9 +513,6 @@ namespace Sapphire
state.m_phaseInfo.m_startTime = 0; state.m_phaseInfo.m_startTime = 0;
state.m_phaseInfo.m_lastTimepointIndex = 0; state.m_phaseInfo.m_lastTimepointIndex = 0;
state.m_phaseInfo.m_lastTimepointTime = 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 bool completed( const ConditionState& state ) const
@ -529,25 +526,27 @@ namespace Sapphire
public std::enable_shared_from_this< PhaseCondition > public std::enable_shared_from_this< PhaseCondition >
{ {
protected: protected:
ConditionId m_conditionId{ 0 }; ConditionType m_conditionType{ 0 };
Phase m_phase; Phase m_phase;
std::string m_description; std::string m_description;
uint32_t m_cooldown{ 0 }; uint32_t m_cooldown{ 0 };
bool m_loop{ false }; bool m_loop{ false };
bool m_enabled{ true }; bool m_enabled{ true };
uint32_t m_id{ 0 };
public: public:
PhaseCondition() {} PhaseCondition() {}
~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_loop = json.at( "loop" ).get< bool >();
//this->m_cooldown = json.at( "cooldown" ).get< uint32_t >(); //this->m_cooldown = json.at( "cooldown" ).get< uint32_t >();
this->m_phase = phase; this->m_phase = phase;
this->m_description = json.at( "description" ).get< std::string >(); this->m_description = json.at( "description" ).get< std::string >();
this->m_enabled = json.at( "enabled" ).get< bool >(); 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 void execute( ConditionState& state, TimelineActor& self, TerritoryPtr pTeri, TimelinePack& pack, uint64_t time ) const
@ -609,15 +608,18 @@ namespace Sapphire
return false; return false;
}; };
uint32_t getId() const
{
return m_id;
}
}; };
using PhaseConditionPtr = std::shared_ptr< PhaseCondition >; using PhaseConditionPtr = std::shared_ptr< PhaseCondition >;
class TimelineActor class TimelineActor
{ {
protected: protected:
std::vector< PhaseConditionPtr > m_phaseConditions; std::unordered_map< uint32_t, PhaseConditionPtr > m_phaseConditions;
std::queue< PhaseConditionPtr > m_phaseHistory; std::unordered_map< uint32_t, ConditionState > m_conditionStates;
std::vector< ConditionState > m_conditionStates;
// PARENTNAME_SUBACTOR_1, ..., PARENTNAME_SUBACTOR_69 // PARENTNAME_SUBACTOR_1, ..., PARENTNAME_SUBACTOR_69
std::map< std::string, Entity::BNpcPtr > m_subActors; std::map< std::string, Entity::BNpcPtr > m_subActors;
public: public:
@ -638,19 +640,19 @@ namespace Sapphire
void addPhaseCondition( PhaseConditionPtr pCondition ) void addPhaseCondition( PhaseConditionPtr pCondition )
{ {
m_phaseConditions.push_back( pCondition ); m_phaseConditions.emplace( std::make_pair( pCondition->getId(), pCondition ) );
m_conditionStates.push_back( {} ); m_conditionStates[ pCondition->getId() ] = {};
m_conditionStates[ m_conditionStates.size() - 1 ].m_enabled = pCondition->isDefaultEnabled(); m_conditionStates[ pCondition->getId() ].m_enabled = pCondition->isDefaultEnabled();
} }
// todo: make this sane // todo: make this sane
void update( TerritoryPtr pTeri, TimelinePack& pack, uint64_t time ) void update( TerritoryPtr pTeri, TimelinePack& pack, uint64_t time )
{ {
// todo: handle interrupts // todo: handle interrupts
for( auto i = 0; i < m_phaseConditions.size(); ++i ) for( const auto& condition : m_phaseConditions)
{ {
const auto& pCondition = m_phaseConditions[ i ]; const auto& pCondition = condition.second;
auto& state = m_conditionStates[ i ]; auto& state = m_conditionStates[ pCondition->getId() ];
// ignore if not enabled, unless overriden to enable // ignore if not enabled, unless overriden to enable
if( !pCondition->isStateEnabled( state ) ) if( !pCondition->isStateEnabled( state ) )
@ -671,7 +673,6 @@ namespace Sapphire
else if( pCondition->isConditionMet( state, pTeri, pack, time ) ) else if( pCondition->isConditionMet( state, pTeri, pack, time ) )
{ {
pCondition->execute( state, *this, pTeri, pack, time ); pCondition->execute( state, *this, pTeri, pack, time );
m_phaseHistory.push( pCondition );
if( pack.getStartTime() == 0 ) if( pack.getStartTime() == 0 )
pack.setStartTime( state.m_startTime ); 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() ); if( auto it = m_phaseConditions.find( conditionId ); it != m_phaseConditions.end() )
{
const auto& pCondition = m_phaseConditions[ conditionIdx ]; auto& state = m_conditionStates.at( it->first );
auto& state = m_conditionStates[ conditionIdx ]; it->second->reset( state );
}
pCondition->reset( state );
} }
void setConditionStateEnabled( uint32_t conditionIdx, bool enabled ) void setConditionStateEnabled( uint32_t conditionId, bool enabled )
{ {
assert( conditionIdx < m_conditionStates.size() ); if( auto it = m_conditionStates.find( conditionId ); it != m_conditionStates.end() )
{
auto& state = m_conditionStates[ conditionIdx ]; auto& state = m_conditionStates.at( it->first );
state.m_enabled = enabled; state.m_enabled = enabled;
}
} }
void resetAllConditionStates() void resetAllConditionStates()
{ {
for( auto i = 0; i < m_phaseConditions.size(); ++i ) for( const auto& condition : m_phaseConditions )
{ {
const auto& pCondition = m_phaseConditions[ i ]; const auto& pCondition = condition.second;
auto& state = m_conditionStates[ i ]; auto& state = m_conditionStates.at( condition.first );
pCondition->reset( state ); pCondition->reset( state );
} }
@ -776,7 +777,7 @@ namespace Sapphire
}; };
} hp; } 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 ); 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, TerritoryPtr pTeri, TimelinePack& pack, uint64_t time ) const override;
@ -796,7 +797,7 @@ namespace Sapphire
uint8_t flags; uint8_t flags;
} param; } 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; bool isConditionMet( ConditionState& state, TerritoryPtr pTeri, TimelinePack& pack, uint64_t time ) const override;
}; };
@ -805,7 +806,7 @@ namespace Sapphire
public: public:
uint64_t duration; 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; bool isConditionMet( ConditionState& state, TerritoryPtr pTeri, TimelinePack& pack, uint64_t time ) const override;
}; };
@ -815,7 +816,7 @@ namespace Sapphire
uint32_t layoutId; uint32_t layoutId;
CombatStateType combatState; 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; bool isConditionMet( ConditionState& state, TerritoryPtr pTeri, TimelinePack& pack, uint64_t time ) const override;
}; };
@ -825,7 +826,7 @@ namespace Sapphire
uint32_t layoutId; uint32_t layoutId;
uint32_t flags; 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; bool isConditionMet( ConditionState& state, TerritoryPtr pTeri, TimelinePack& pack, uint64_t time ) const override;
}; };