21static std::list<RegisteredMod> s_registered_mods;
26static void append_to_buffer(
char *buffer,
size_t buffer_size,
const char *format, va_list args)
28 size_t used = strnlen(buffer, buffer_size);
29 if (used + 1 >= buffer_size)
34 vsnprintf(buffer + used, buffer_size - used, format, args);
35 buffer[buffer_size - 1] =
'\0';
38static std::string make_key(
const char *key)
40 std::string lowered(key != NULL ? key :
"");
41 std::transform(lowered.begin(), lowered.end(), lowered.begin(),
42 [](
unsigned char c) { return (char)tolower(c); });
54 va_start(args, format);
64 va_start(args, format);
65 vsnprintf(message,
sizeof(message), format, args);
85 va_start(args, format);
86 vsnprintf(message,
sizeof(message), format, args);
99 va_start(args, format);
100 vsnprintf(message,
sizeof(message), format, args);
115 uint32_t vanilla_max,
const char *id_label)
122 std::map<uint32_t, SFMod *> &claims = s_numeric_claims[domain];
123 std::map<uint32_t, SFMod *>::iterator existing = claims.find(
id);
124 bool was_free = (existing == claims.end());
128 SFMod *previous_owner = existing->second;
130 if (
id < vanilla_max)
133 "%s has Overwritten a vanilla %s [%u], this was previously registered by [%s]",
138 log_error(
"| - Mod Conflict Detected [%s]: %s [%u] is already registered by [%s]",
143 id_label,
id, mod->
mod_id);
154 const char *id_label)
161 std::map<std::string, SFMod *> &claims = s_string_claims[domain];
162 std::string lookup = make_key(key);
163 std::map<std::string, SFMod *>::iterator existing = claims.find(lookup);
164 bool was_free = (existing == claims.end());
168 SFMod *previous_owner = existing->second;
170 log_error(
"| - Mod Conflict Detected [%s]: %s [%s] is already registered by [%s]",
174 id_label, key, mod->
mod_id);
179 claims[lookup] = mod;
187 s_numeric_claims[domain].clear();
188 s_string_claims[domain].clear();
197 return "[ FRAMEWORK ]";
199 return "[ CORE MODULE ]";
214 if (known.mod == mod)
227 std::list<RegisteredMod>::iterator position = s_registered_mods.begin();
228 while (position != s_registered_mods.end() && position->type <= type)
233 s_registered_mods.insert(position, entry);
238 return s_registered_mods;
const char * get_mod_type_label(ModType type)
Tag rendered next to a mod in the list. Empty for external mods.
bool claim_numeric_id(ConflictDomain domain, uint32_t id, SFMod *mod, uint32_t vanilla_max, const char *id_label)
Claims a numeric ID within a domain for a mod.
void clear_mod_errors(SFMod *mod)
Empties a mod's error buffer.
void register_mod_for_listing(SFMod *mod, ModType type)
Adds a mod to the list rendered by the in-game mod list screen.
bool claim_string_id(ConflictDomain domain, const char *key, SFMod *mod, const char *id_label)
Claims a string key within a domain for a mod. Comparison is case-insensitive, since the keys are Win...
void append_mod_error(SFMod *mod, const char *format,...)
Appends a line to a mod's error buffer without logging it.
const std::list< RegisteredMod > & get_registered_mods()
The mods known to the framework, grouped framework -> core -> external.
void report_mod_warning(SFMod *mod, const char *format,...)
Logs a warning against a mod at DEBUG_INFO, i.e. always shown.
ConflictDomain
Namespaces for conflict checking.
ModType
What sort of mod an entry in the mod list is.
void reset_conflict_domain(ConflictDomain domain)
Drops every claim in a domain. Intended for reloads and tests.
void report_mod_error(SFMod *mod, const char *format,...)
Logs an error, appends it to the mod's error buffer and counts it.
void log_error(const char *format,...)
void log_warning_level(DebugLevel level, const char *format,...)
Logs a warning that is only shown once the log level reaches level.
A mod as shown in the in-game mod list.