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