00001 /* $Id: ai_error.cpp 15299 2009-01-31 20:16:06Z smatz $ */ 00002 00005 #include "ai_error.hpp" 00006 #include "../../core/bitmath_func.hpp" 00007 00008 AIError::AIErrorMap AIError::error_map = AIError::AIErrorMap(); 00009 AIError::AIErrorMapString AIError::error_map_string = AIError::AIErrorMapString(); 00010 00011 /* static */ AIErrorType AIError::GetLastError() 00012 { 00013 return AIObject::GetLastError(); 00014 } 00015 00016 /* static */ char *AIError::GetLastErrorString() 00017 { 00018 return strdup((*error_map_string.find(AIError::GetLastError())).second); 00019 } 00020 00021 /* static */ AIErrorType AIError::StringToError(StringID internal_string_id) 00022 { 00023 uint index = GB(internal_string_id, 11, 5); 00024 switch (GB(internal_string_id, 11, 5)) { 00025 case 26: case 28: case 29: case 30: // NewGRF strings. 00026 return ERR_NEWGRF_SUPPLIED_ERROR; 00027 00028 /* DO NOT SWAP case 14 and 4 because that will break StringToError due 00029 * to the index dependency that relies on FALL THROUGHs. */ 00030 case 14: if (index < 0xE4) break; // Player name 00031 case 4: if (index < 0xC0) break; // Town name 00032 case 15: // Custom name 00033 case 31: // Dynamic strings 00034 /* These strings are 'random' and have no meaning. 00035 * They actually shouldn't even be returned as error messages. */ 00036 return ERR_UNKNOWN; 00037 00038 default: 00039 break; 00040 } 00041 00042 AIErrorMap::iterator it = error_map.find(internal_string_id); 00043 if (it == error_map.end()) return ERR_UNKNOWN; 00044 return (*it).second; 00045 } 00046 00047 /* static */ void AIError::RegisterErrorMap(StringID internal_string_id, AIErrorType ai_error_msg) 00048 { 00049 error_map[internal_string_id] = ai_error_msg; 00050 } 00051 00052 /* static */ void AIError::RegisterErrorMapString(AIErrorType ai_error_msg, const char *message) 00053 { 00054 error_map_string[ai_error_msg] = message; 00055 } 00056 00057 /* static */ AIError::ErrorCategories AIError::GetErrorCategory() { 00058 return (AIError::ErrorCategories)(GetLastError() >> (uint)ERR_CAT_BIT_SIZE); 00059 }