static void set_global_variable(persist_context &ctx, const vconfig &pcfg) { if (pcfg["from_local"].empty()) { clear_global_variable(ctx, pcfg); } else { std::string global = pcfg["to_global"]; std::string local = pcfg["from_local"]; config val; const config &vars = resources::gamedata->get_variables(); size_t arraylen = vars.child_count(local); if (arraylen == 0) { try { val = pack_scalar(global,resources::gamedata->get_variable(local)); } catch(const invalid_variablename_exception&) { val = config(); } } else { for (size_t i = 0; i < arraylen; i++) val.add_child(global,vars.child(local,i)); } ctx.set_var(global, val, pcfg["immediate"].to_bool()); } }
void verify_and_clear_global_variable(const vconfig &pcfg) { bool valid = true; if (!pcfg.has_attribute("global")) { LOG_PERSIST << "Error: [clear_global_variable] missing required attribute \"from_global\""; valid = false; } if (!pcfg.has_attribute("namespace")) { LOG_PERSIST << "Error: [clear_global_variable] missing attribute \"namespace\" and no global namespace provided."; valid = false; } if (network::nconnections() != 0) { if (!pcfg.has_attribute("side")) { LOG_PERSIST << "Error: [set_global_variable] missing attribute \"side\" required in multiplayer context."; valid = false; } else { config::attribute_value pcfg_side = pcfg["side"]; int side = pcfg_side; //Check side matching only if the side is not "global". if (pcfg_side.str() != "global") { //Ensure that the side is valid. if (unsigned(side-1) > resources::teams->size()) { LOG_PERSIST << "Error: [clear_global_variable] attribute \"side\" specifies invalid side number."; valid = false; } else { //Clear the variable only if it is meant for a side we control valid = (*resources::teams)[side - 1].is_local(); } } } } if (valid) { persist_context &ctx = resources::persist->get_context((pcfg["namespace"])); if (ctx.valid()) { clear_global_variable(ctx,pcfg); } else { LOG_PERSIST << "Error: [clear_global_variable] attribute \"namespace\" is not valid."; } } }
void verify_and_clear_global_variable(const vconfig &pcfg) { bool valid = true; if (!pcfg.has_attribute("global")) { ERR_PERSIST << "[clear_global_variable] missing required attribute \"from_global\""; valid = false; } if (!pcfg.has_attribute("namespace")) { ERR_PERSIST << "[clear_global_variable] missing attribute \"namespace\" and no global namespace provided."; valid = false; } if (resources::controller->is_networked_mp()) { config::attribute_value pcfg_side = pcfg["side"]; const int side = pcfg_side.to_int(); //Check side matching only if the side is not "global" or empty. if (pcfg_side.str() != "global" && !pcfg_side.empty()) { //Ensure that the side is valid. if (unsigned(side-1) > resources::gameboard->teams().size()) { ERR_PERSIST << "[clear_global_variable] attribute \"side\" specifies invalid side number."; valid = false; } else if (resources::gameboard->teams()[side - 1].is_empty()) { LOG_PERSIST << "[clear_global_variable] attribute \"side\" specifies a null-controlled side number."; valid = false; } else { //Clear the variable only if it is meant for a side we control valid = resources::gameboard->teams()[side - 1].is_local(); } } } if (valid) { persist_context &ctx = resources::persist->get_context((pcfg["namespace"])); if (ctx.valid()) { clear_global_variable(ctx,pcfg); } else { LOG_PERSIST << "Error: [clear_global_variable] attribute \"namespace\" is not valid."; } } }