mirror of
https://github.com/amyinspace/MagicSetEditor2.git
synced 2026-06-11 05:07:00 -04:00
cards dependencies, clearing order cache
git-svn-id: svn://svn.code.sf.net/p/magicseteditor/code/trunk@134 0fc631ac-6414-0410-93d0-97cfa31319b6
This commit is contained in:
@@ -33,6 +33,11 @@ class Dependency {
|
||||
DependencyType type : 5; ///< Type of the dependent script
|
||||
size_t index : 27; ///< index into an IndexMap
|
||||
void* data; ///< Extra pointer data
|
||||
|
||||
/// This dependency, but dependent on all cards instead of just one
|
||||
inline Dependency makeCardIndependend() const {
|
||||
return Dependency(type == DEP_CARD_FIELD ? DEP_CARDS_FIELD : type, index, data);
|
||||
}
|
||||
};
|
||||
|
||||
// ----------------------------------------------------------------------------- : EOF
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
|
||||
#include <script/value.hpp>
|
||||
#include <script/context.hpp>
|
||||
#include <script/dependency.hpp>
|
||||
#include <util/tagged_string.hpp>
|
||||
#include <data/set.hpp>
|
||||
#include <wx/regex.h>
|
||||
@@ -421,18 +422,37 @@ int position_in_vector(const ScriptValueP& of, const ScriptValueP& in, const Scr
|
||||
}
|
||||
|
||||
// finding positions, also of substrings
|
||||
SCRIPT_FUNCTION(position_of) {
|
||||
SCRIPT_FUNCTION_DEP(position_of) {
|
||||
ScriptValueP of = ctx.getVariable(_("of"));
|
||||
ScriptValueP in = ctx.getVariable(_("in"));
|
||||
ScriptValueP order_by = ctx.getVariableOpt(_("order by"));
|
||||
SCRIPT_RETURN(position_in_vector(of, in, order_by));
|
||||
}
|
||||
|
||||
ScriptValueP ScriptBuildin_position_of::dependencies(Context& ctx, const Dependency& dep) const {
|
||||
ScriptValueP of = ctx.getVariable(_("of"));
|
||||
ScriptValueP in = ctx.getVariable(_("in"));
|
||||
ScriptValueP order_by = ctx.getVariableOpt(_("order by"));
|
||||
ScriptObject<Set*>* s = dynamic_cast<ScriptObject<Set*>* >(in.get());
|
||||
ScriptObject<CardP>* c = dynamic_cast<ScriptObject<CardP>*>(of.get());
|
||||
if (s && c) {
|
||||
// dependency on cards
|
||||
mark_dependency_member(s->getValue(), _("cards"), dep);
|
||||
if (order_by) {
|
||||
// dependency on order_by function
|
||||
order_by->dependencies(ctx, dep.makeCardIndependend());
|
||||
}
|
||||
}
|
||||
return dependency_dummy;
|
||||
};
|
||||
|
||||
|
||||
// finding sizes
|
||||
SCRIPT_FUNCTION(number_of_items) {
|
||||
SCRIPT_RETURN(ctx.getVariable(_("in"))->itemCount());
|
||||
}
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------- : Initialize functions
|
||||
|
||||
void init_script_functions(Context& ctx) {
|
||||
|
||||
@@ -99,6 +99,7 @@ void SetScriptManager::onInit(const StyleSheetP& stylesheet, Context* ctx) {
|
||||
initDependencies(*ctx, *set.game);
|
||||
initDependencies(*ctx, *stylesheet);
|
||||
// apply scripts to everything
|
||||
// TODO : don't updateAll here, it will be done repeatedly
|
||||
updateAll();
|
||||
} catch (Error e) {
|
||||
handle_error(e, false, false);
|
||||
@@ -195,7 +196,7 @@ void SetScriptManager::updateAllDependend(const vector<Dependency>& dependent_sc
|
||||
}
|
||||
|
||||
void SetScriptManager::updateRecursive(deque<ToUpdate>& to_update, Age starting_age) {
|
||||
// set->order_cache.clear(); // clear caches before evaluating a round of scripts
|
||||
set.clearOrderCache(); // clear caches before evaluating a round of scripts
|
||||
while (!to_update.empty()) {
|
||||
updateToUpdate(to_update.front(), to_update, starting_age);
|
||||
to_update.pop_front();
|
||||
@@ -226,8 +227,10 @@ void SetScriptManager::alsoUpdate(deque<ToUpdate>& to_update, const vector<Depen
|
||||
if (card) {
|
||||
ValueP value = card->data.at(d.index);
|
||||
to_update.push_back(ToUpdate(value.get(), card));
|
||||
break;
|
||||
} else {
|
||||
// There is no card, so the update should affect all cards (fall through).
|
||||
}
|
||||
break;
|
||||
} case DEP_CARDS_FIELD: {
|
||||
// something invalidates a card value for all cards, so all cards need updating
|
||||
FOR_EACH(card, set.cards) {
|
||||
|
||||
@@ -314,16 +314,16 @@ inline ScriptValueP toScript(const shared_ptr<T>& v) { return new_intrusive1<Scr
|
||||
* context.setVariable("my_function", script_my_function);
|
||||
* @endcode
|
||||
*/
|
||||
#define SCRIPT_FUNCTION(name) SCRIPT_FUNCTION_AUX(name,virtual)
|
||||
#define SCRIPT_FUNCTION(name) SCRIPT_FUNCTION_AUX(name,;)
|
||||
|
||||
/// Macro to declare a new script function with custom dependency handling
|
||||
#define SCRIPT_FUNCTION_DEP(name) SCRIPT_FUNCTION_AUX(name,virtual) //TODO
|
||||
#define SCRIPT_FUNCTION_DEP(name) SCRIPT_FUNCTION_AUX(name, virtual ScriptValueP dependencies(Context&, const Dependency&) const;)
|
||||
|
||||
// helper for SCRIPT_FUNCTION and SCRIPT_FUNCTION_DEP
|
||||
#define SCRIPT_FUNCTION_AUX(name,dep) \
|
||||
class ScriptBuildin_##name : public ScriptValue { \
|
||||
dep \
|
||||
/* virtual */ ScriptType type() const \
|
||||
virtual ScriptType type() const \
|
||||
{ return SCRIPT_FUNCTION; } \
|
||||
virtual String typeName() const \
|
||||
{ return _("build in function '") _(#name) _("'"); } \
|
||||
|
||||
Reference in New Issue
Block a user