1 #ifndef _ScriptingContext_h_ 2 #define _ScriptingContext_h_ 3 4 #include "Universe.h" 5 #include "../util/AppInterface.h" 6 7 #include <boost/any.hpp> 8 9 #include <memory> 10 11 class UniverseObject; 12 13 /** combat/CombatInfo extends this ScriptingCombatInfo in order 14 * to give Conditions and ValueRefs access to combat related data */ 15 struct FO_COMMON_API ScriptingCombatInfo { ScriptingCombatInfoScriptingCombatInfo16 ScriptingCombatInfo() {} ScriptingCombatInfoScriptingCombatInfo17 ScriptingCombatInfo(int bout_, const Universe::EmpireObjectVisibilityMap& vis) : 18 bout(bout_), 19 empire_object_visibility(vis) 20 {} 21 22 int bout = 0; ///< current combat bout, used with CombatBout ValueRef for implementing bout dependent targeting. First combat bout is 1 23 ObjectMap objects; ///< actual state of objects relevant to combat 24 Universe::EmpireObjectVisibilityMap empire_object_visibility; ///< indexed by empire id and object id, the visibility level the empire has of each object. may be increased during battle 25 }; 26 const ScriptingCombatInfo EMPTY_COMBAT_INFO{}; 27 28 struct ScriptingContext { ScriptingContextScriptingContext29 explicit ScriptingContext() : 30 objects(Objects()), 31 const_objects(Objects()) 32 {} 33 ScriptingContextScriptingContext34 explicit ScriptingContext(const ObjectMap& const_objects_) : 35 objects(Objects()), 36 const_objects(const_objects_) 37 {} 38 ScriptingContextScriptingContext39 explicit ScriptingContext(ObjectMap& objects_) : 40 objects(objects_), 41 const_objects(objects_) 42 {} 43 44 explicit ScriptingContext(std::shared_ptr<const UniverseObject> source_, 45 const ObjectMap& const_objects_ = Objects()) : sourceScriptingContext46 source(source_), 47 objects(Objects()), 48 const_objects(const_objects_) 49 {} 50 ScriptingContextScriptingContext51 ScriptingContext(std::shared_ptr<const UniverseObject> source_, 52 const ScriptingContext& parent_context) : 53 source( source_), 54 effect_target( parent_context.effect_target), 55 condition_root_candidate( parent_context.condition_root_candidate), 56 condition_local_candidate( parent_context.condition_local_candidate), 57 current_value( parent_context.current_value), 58 combat_info( parent_context.combat_info), 59 objects( parent_context.objects), 60 const_objects( parent_context.const_objects) 61 {} 62 ScriptingContextScriptingContext63 ScriptingContext(std::shared_ptr<const UniverseObject> source_, 64 ScriptingCombatInfo& combat_info_) : 65 source(source_), 66 combat_info(combat_info_), 67 objects(combat_info_.objects), 68 const_objects(combat_info_.objects) 69 {} 70 71 ScriptingContext(std::shared_ptr<const UniverseObject> source_, 72 std::shared_ptr<UniverseObject> target_, 73 ObjectMap& objects_ = Objects()) : sourceScriptingContext74 source(source_), 75 effect_target(target_), 76 objects(objects_), 77 const_objects(objects_) 78 {} 79 ScriptingContextScriptingContext80 ScriptingContext(const ScriptingContext& parent_context, 81 std::shared_ptr<UniverseObject> target_, 82 const boost::any& current_value_) : // TODO: Rework this so only specific types are accepted 83 source( parent_context.source), 84 effect_target( target_), 85 condition_root_candidate( parent_context.condition_root_candidate), 86 condition_local_candidate( parent_context.condition_local_candidate), 87 current_value( current_value_), 88 combat_info( parent_context.combat_info), 89 objects( parent_context.objects), 90 const_objects( parent_context.const_objects) 91 {} 92 ScriptingContextScriptingContext93 ScriptingContext(const ScriptingContext& parent_context, 94 const boost::any& current_value_) : // TODO: Rework this so only specific types are accepted 95 source( parent_context.source), 96 effect_target( parent_context.effect_target), 97 condition_root_candidate( parent_context.condition_root_candidate), 98 condition_local_candidate( parent_context.condition_local_candidate), 99 current_value( current_value_), 100 combat_info( parent_context.combat_info), 101 objects( parent_context.objects), 102 const_objects( parent_context.const_objects) 103 {} 104 ScriptingContextScriptingContext105 ScriptingContext(const ScriptingContext& parent_context, 106 std::shared_ptr<const UniverseObject> condition_local_candidate_) : 107 source( parent_context.source), 108 effect_target( parent_context.effect_target), 109 condition_root_candidate( parent_context.condition_root_candidate ? 110 parent_context.condition_root_candidate : 111 condition_local_candidate_), // if parent context doesn't already have a root candidate, the new local candidate is the root 112 condition_local_candidate( condition_local_candidate_), // new local candidate 113 current_value( parent_context.current_value), 114 combat_info( parent_context.combat_info), 115 objects( parent_context.objects), 116 const_objects( parent_context.const_objects) 117 {} 118 119 ScriptingContext(std::shared_ptr<const UniverseObject> source_, 120 std::shared_ptr<UniverseObject> target_, 121 const boost::any& current_value_, // TODO: Rework this so only specific types are accepted 122 std::shared_ptr<const UniverseObject> condition_root_candidate_ = nullptr, 123 std::shared_ptr<const UniverseObject> condition_local_candidate_ = nullptr, 124 ObjectMap& objects_ = Objects()) : sourceScriptingContext125 source(source_), 126 condition_root_candidate(condition_root_candidate_), 127 condition_local_candidate(condition_local_candidate_), 128 current_value(current_value_), 129 objects(objects_), 130 const_objects(objects_) 131 {} 132 ContextObjectsScriptingContext133 const ObjectMap& ContextObjects() const { return const_objects; } ContextObjectsScriptingContext134 ObjectMap& ContextObjects() { return objects; } 135 136 std::shared_ptr<const UniverseObject> source; 137 std::shared_ptr<UniverseObject> effect_target; 138 std::shared_ptr<const UniverseObject> condition_root_candidate; 139 std::shared_ptr<const UniverseObject> condition_local_candidate; 140 const boost::any current_value; 141 const ScriptingCombatInfo& combat_info = EMPTY_COMBAT_INFO; 142 143 private: 144 ObjectMap& objects; 145 const ObjectMap& const_objects; 146 }; 147 148 #endif // _ScriptingContext_h_ 149