To optimize this: Instead of constantly loading the scheme file, parse it once (cworld precache would be perfect) and set up a few global hudtextparms_t vars to hold each scheme's settings. ie in util.cpp hudtextparms_t g_SchemeOne; hudtextparms_t g_SchemeTwo; hudtextparms_t g_SchemeThree; and in util.h extern hudtextparms_t g_SchemeOne; extern hudtextparms_t g_SchemeTwo; extern hudtextparms_t g_SchemeThree; Then in CWorld::Precache: g_SchemeOne = UTIL_LoadScheme("SCHEME_ONE"); g_SchemeTwo = UTIL_LoadScheme("SCHEME_TWO"); g_SchemeThree = UTIL_LoadScheme("SCHEME_THREE"); Usage would then be: UTIL_HudMessageAll ( g_SchemeOne, "Scheme One" ); Another idea would be to make x/y an arg to hudmessage so that people cant move the text around the screen Usage: UTIL_HudMessageAll ( UTIL_LoadScheme( "SCHEME_ONE" ), "Test"); util.h: (under UTIL_HudMessageAll()) hudtextparms_t UTIL_LoadScheme ( char* scheme ) util.cpp: // test static char scheme_token[ 1500 ]; /* ============== Scheme_Parse Parse a token out of a string ============== */ char *Scheme_Parse (char *data) { int c; int len; len = 0; scheme_token[0] = 0; if (!data) return NULL; // skip whitespace skipwhite: while ( (c = *data) <= ' ') { if (c == 0) return NULL; // end of file; data++; } // skip // comments if (c=='/' && data[1] == '/') { while (*data && *data != '\n') data++; goto skipwhite; } // handle quoted strings specially if (c == '\"') { data++; while (1) { c = *data++; if (c=='\"' || !c) { scheme_token[len] = 0; return data; } scheme_token[len] = c; len++; } } // parse single characters if (c=='{' || c=='}'|| c==')'|| c=='(' || c=='\'' || c == ',' ) { scheme_token[len] = c; len++; scheme_token[len] = 0; return data+1; } // parse a regular word do { scheme_token[len] = c; data++; len++; c = *data; if (c=='{' || c=='}'|| c==')'|| c=='(' || c=='\'' || c == ',' ) break; } while (c>32); scheme_token[len] = 0; return data; } /* ============== Scheme_TokenWaiting Returns 1 if additional data is waiting to be processed on this line ============== */ int Scheme_TokenWaiting( char *buffer ) { char *p; p = buffer; while ( *p && *p!='\n') { if ( !isspace( *p ) || isalnum( *p ) ) return 1; p++; } return 0; } hudtextparms_t UTIL_LoadScheme ( char* scheme ) { char szBuffer[ 1024 ]; char szScheme[ 32 ]; int length; char *pFileList; char *aFileList = pFileList = (char*)LOAD_FILE_FOR_ME( "schemes.txt", &length ); int hasbuffer; bool foundscheme = false; hudtextparms_t hText; // load w/ default stuff memset(&hText, 0, sizeof(hText)); hText.channel = 1; hText.x = 0.5; hText.y = 0.5; hText.effect = 0; hText.r1 = hText.g1 = hText.b1 = 255; hText.a1 = 255; hText.r2 = hText.g2 = hText.b2 = 255; hText.a2 = 255; hText.fadeinTime = 0.2; hText.fadeoutTime = 1; hText.holdTime = 1.5; hText.fxTime = 0.5; if ( pFileList && length ) { while ( 1 ) { hasbuffer = 0; memset( szBuffer, 0, 1024 ); pFileList = Scheme_Parse( pFileList ); if ( strlen( scheme_token ) <= 0 ) break; strcpy( szScheme, scheme_token ); // Any more tokens on this line? if ( Scheme_TokenWaiting( pFileList ) ) { pFileList = Scheme_Parse( pFileList ); if ( strlen( scheme_token ) > 0 ) { hasbuffer = 1; strcpy( szBuffer, scheme_token ); } } // ALERT(at_console, "Scheme: %s\n", szScheme); // if (hasbuffer) // ALERT(at_console, "Buffer: %s\n", szBuffer); if (!foundscheme) { if (strcmp(szScheme, scheme)==0) { foundscheme = true; ALERT(at_console, "Scheme %s found.\n", scheme); } } else if (hasbuffer) // only do this once we've found our scheme & have a buffer { if (strcmp(szScheme, "x")==0) { hText.x = atof(szBuffer); } else if (strcmp(szScheme, "y")==0) { hText.y = atof(szBuffer); } else if (strcmp(szScheme, "effect")==0) { hText.effect = atoi(szBuffer); } else if (strcmp(szScheme, "channel")==0) { hText.channel = atoi(szBuffer); } else if (strcmp(szScheme, "fxtime")==0) { hText.fxTime = atof(szBuffer); } else if (strcmp(szScheme, "fadein")==0) { hText.fadeinTime = atof(szBuffer); } else if (strcmp(szScheme, "fadeout")==0) { hText.fadeoutTime = atof(szBuffer); } else if (strcmp(szScheme, "fxhold")==0) { hText.holdTime = atof(szBuffer); } else if (strcmp(szScheme, "r1")==0) { hText.r1 = atoi(szBuffer); } else if (strcmp(szScheme, "g1")==0) { hText.g1 = atoi(szBuffer); } else if (strcmp(szScheme, "b1")==0) { hText.b1 = atoi(szBuffer); } else if (strcmp(szScheme, "a1")==0) { hText.a1 = atoi(szBuffer); } else if (strcmp(szScheme, "r2")==0) { hText.r2 = atoi(szBuffer); } else if (strcmp(szScheme, "g2")==0) { hText.g2 = atoi(szBuffer); } else if (strcmp(szScheme, "b2")==0) { hText.b2 = atoi(szBuffer); } else if (strcmp(szScheme, "a2")==0) { hText.a2 = atoi(szBuffer); } else ALERT(at_console, "Unhandled: %s Buffer: %s\n", szScheme, szBuffer); } else ALERT(at_console, "Unhandled: %s\n", szScheme); } FREE_FILE( aFileList ); } return hText; }