mirror of
				https://github.com/coop-deluxe/sm64coopdx.git
				synced 2025-10-30 08:01:01 +00:00 
			
		
		
		
	Improve mod storage & hopefully fix Cookie mod
This commit is contained in:
		
							parent
							
								
									a15c36a968
								
							
						
					
					
						commit
						bcdb6be53a
					
				
					 4 changed files with 23 additions and 35 deletions
				
			
		|  | @ -1117,7 +1117,7 @@ | |||
| - `number` | ||||
| 
 | ||||
| ### C Prototype | ||||
| `double mod_storage_load_number(const char* key);` | ||||
| `f32 mod_storage_load_number(const char* key);` | ||||
| 
 | ||||
| [:arrow_up_small:](#) | ||||
| 
 | ||||
|  | @ -1200,7 +1200,7 @@ | |||
| - `boolean` | ||||
| 
 | ||||
| ### C Prototype | ||||
| `bool mod_storage_save_number(const char* key, double value);` | ||||
| `bool mod_storage_save_number(const char* key, f32 value);` | ||||
| 
 | ||||
| [:arrow_up_small:](#) | ||||
| 
 | ||||
|  |  | |||
|  | @ -94,8 +94,6 @@ | |||
| #include <sys/stat.h> | ||||
| #include <cctype> | ||||
| 
 | ||||
| #define MINI_CASE_SENSITIVE | ||||
| 
 | ||||
| namespace mINI | ||||
| { | ||||
| 	namespace INIStringUtil | ||||
|  | @ -106,14 +104,6 @@ namespace mINI | |||
| 			str.erase(str.find_last_not_of(whitespaceDelimiters) + 1); | ||||
| 			str.erase(0, str.find_first_not_of(whitespaceDelimiters)); | ||||
| 		} | ||||
| #ifndef MINI_CASE_SENSITIVE | ||||
| 		inline void toLower(std::string& str) | ||||
| 		{ | ||||
| 			std::transform(str.begin(), str.end(), str.begin(), [](const char c) { | ||||
| 				return static_cast<char>(std::tolower(c)); | ||||
| 			}); | ||||
| 		} | ||||
| #endif | ||||
| 		inline void replace(std::string& str, std::string const& a, std::string const& b) | ||||
| 		{ | ||||
| 			if (!a.empty()) | ||||
|  | @ -173,9 +163,6 @@ namespace mINI | |||
| 		T& operator[](std::string key) | ||||
| 		{ | ||||
| 			INIStringUtil::trim(key); | ||||
| #ifndef MINI_CASE_SENSITIVE | ||||
| 			INIStringUtil::toLower(key); | ||||
| #endif | ||||
| 			auto it = dataIndexMap.find(key); | ||||
| 			bool hasIt = (it != dataIndexMap.end()); | ||||
| 			std::size_t index = (hasIt) ? it->second : setEmpty(key); | ||||
|  | @ -184,9 +171,6 @@ namespace mINI | |||
| 		T get(std::string key) const | ||||
| 		{ | ||||
| 			INIStringUtil::trim(key); | ||||
| #ifndef MINI_CASE_SENSITIVE | ||||
| 			INIStringUtil::toLower(key); | ||||
| #endif | ||||
| 			auto it = dataIndexMap.find(key); | ||||
| 			if (it == dataIndexMap.end()) | ||||
| 			{ | ||||
|  | @ -197,17 +181,11 @@ namespace mINI | |||
| 		bool has(std::string key) const | ||||
| 		{ | ||||
| 			INIStringUtil::trim(key); | ||||
| #ifndef MINI_CASE_SENSITIVE | ||||
| 			INIStringUtil::toLower(key); | ||||
| #endif | ||||
| 			return (dataIndexMap.count(key) == 1); | ||||
| 		} | ||||
| 		void set(std::string key, T obj) | ||||
| 		{ | ||||
| 			INIStringUtil::trim(key); | ||||
| #ifndef MINI_CASE_SENSITIVE | ||||
| 			INIStringUtil::toLower(key); | ||||
| #endif | ||||
| 			auto it = dataIndexMap.find(key); | ||||
| 			if (it != dataIndexMap.end()) | ||||
| 			{ | ||||
|  | @ -231,9 +209,6 @@ namespace mINI | |||
| 		bool remove(std::string key) | ||||
| 		{ | ||||
| 			INIStringUtil::trim(key); | ||||
| #ifndef MINI_CASE_SENSITIVE | ||||
| 			INIStringUtil::toLower(key); | ||||
| #endif | ||||
| 			auto it = dataIndexMap.find(key); | ||||
| 			if (it != dataIndexMap.end()) | ||||
| 			{ | ||||
|  |  | |||
|  | @ -16,7 +16,7 @@ extern "C" { | |||
| 
 | ||||
| #define C_FIELD extern "C" | ||||
| 
 | ||||
| void strdelete(char string[], char substr[]) { | ||||
| void strdelete(char* string, const char* substr) { | ||||
|     // i is used to loop through the string
 | ||||
|     u16 i = 0; | ||||
| 
 | ||||
|  | @ -45,6 +45,7 @@ void strdelete(char string[], char substr[]) { | |||
| 
 | ||||
| bool char_valid(const char* buffer) { | ||||
|     if (buffer[0] == '\0') { return false; } | ||||
| 
 | ||||
|     while (*buffer != '\0') { | ||||
|         if ((*buffer >= 'a' && *buffer <= 'z') || (*buffer >= 'A' && *buffer <= 'Z') || (*buffer >= '0' && *buffer <= '9') || *buffer == '_' || *buffer == '.' || *buffer == '-') { | ||||
|             buffer++; | ||||
|  | @ -52,13 +53,14 @@ bool char_valid(const char* buffer) { | |||
|         } | ||||
|         return false; | ||||
|     } | ||||
| 
 | ||||
|     return true; | ||||
| } | ||||
| 
 | ||||
| void mod_storage_get_filename(char* dest) { | ||||
|     const char* path = fs_get_write_path(SAVE_DIRECTORY); // get user path
 | ||||
|     snprintf(dest, SYS_MAX_PATH - 1, "%s/%s", path, gLuaActiveMod->relativePath); // append sav folder
 | ||||
|     strdelete(dest, (char*)".lua"); // delete ".lua" from sav name
 | ||||
|     strdelete(dest, ".lua"); // delete ".lua" from sav name
 | ||||
|     strcat(dest, SAVE_EXTENSION); // append SAVE_EXTENSION
 | ||||
|     normalize_path(dest); // fix any out of place slashes
 | ||||
| } | ||||
|  | @ -89,8 +91,17 @@ C_FIELD bool mod_storage_save(const char* key, const char* value) { | |||
|     return true; | ||||
| } | ||||
| 
 | ||||
| C_FIELD bool mod_storage_save_number(const char* key, double value) { | ||||
|     return mod_storage_save(key, std::to_string(value).c_str()); | ||||
| C_FIELD bool mod_storage_save_number(const char* key, f32 value) { | ||||
|     // Store string results in a temporary buffer
 | ||||
|     // this assumes mod_storage_load will only ever be called by Lua
 | ||||
|     static char str[MAX_KEY_VALUE_LENGTH]; | ||||
|     if (floor(value) == value) { | ||||
|         snprintf(str, MAX_KEY_VALUE_LENGTH, "%d", (s64)value); | ||||
|     } else { | ||||
|         snprintf(str, MAX_KEY_VALUE_LENGTH, "%f", value); | ||||
|     } | ||||
| 
 | ||||
|     return mod_storage_save(key, str); | ||||
| } | ||||
| 
 | ||||
| C_FIELD bool mod_storage_save_bool(const char* key, bool value) { | ||||
|  | @ -120,11 +131,11 @@ C_FIELD const char* mod_storage_load(const char* key) { | |||
|     return value; | ||||
| } | ||||
| 
 | ||||
| C_FIELD double mod_storage_load_number(const char* key) { | ||||
| C_FIELD f32 mod_storage_load_number(const char* key) { | ||||
|     const char* value = mod_storage_load(key); | ||||
|     if (value == NULL) { return 0; } | ||||
| 
 | ||||
|     return std::strtod(value, nullptr); | ||||
|     return std::strtof(value, nullptr); | ||||
| } | ||||
| 
 | ||||
| C_FIELD bool mod_storage_load_bool(const char* key) { | ||||
|  |  | |||
|  | @ -1,6 +1,8 @@ | |||
| #ifndef MOD_STORAGE_H | ||||
| #define MOD_STORAGE_H | ||||
| 
 | ||||
| #include <PR/ultratypes.h> | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
|  | @ -11,11 +13,11 @@ extern "C" { | |||
| #define SAVE_EXTENSION ".sav" | ||||
| 
 | ||||
| bool mod_storage_save(const char* key, const char* value); | ||||
| bool mod_storage_save_number(const char* key, double value); | ||||
| bool mod_storage_save_number(const char* key, f32 value); | ||||
| bool mod_storage_save_bool(const char* key, bool value); | ||||
| 
 | ||||
| const char *mod_storage_load(const char* key); | ||||
| double mod_storage_load_number(const char* key); | ||||
| f32 mod_storage_load_number(const char* key); | ||||
| bool mod_storage_load_bool(const char* key); | ||||
| 
 | ||||
| bool mod_storage_remove(const char* key); | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 Agent X
						Agent X