FS2_Open
Open source remastering of the Freespace 2 engine
alphacolors.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (C) Volition, Inc. 1999. All rights reserved.
3  *
4  * All source code herein is the property of Volition, Inc. You may not sell
5  * or otherwise commercially exploit the source or things you created based on the
6  * source.
7  *
8 */
9 
10 #include "globalincs/alphacolors.h"
11 #include "globalincs/def_files.h"
12 #include "graphics/2d.h"
13 #include "parse/parselo.h"
14 
17 
21 
22 // -----------------------------------------------------------------------------------
23 // ALPHA DEFINES/VARS
24 //
25 
30 
37 
39 
47 
49  &Color_blue,
51  &Color_green,
53  &Color_black,
54  &Color_grey,
55  &Color_silver,
56  &Color_white,
59  &Color_violet,
61  &Color_red,
63  &Color_pink,
65  &Color_yellow,
71 };
72 
73 const char *COLOR_NAMES[TOTAL_COLORS] = {
74  "Blue",
75  "Bright Blue",
76  "Green",
77  "Bright Green",
78  "Black",
79  "Grey",
80  "Silver",
81  "White",
82  "Bright White",
83  "Violet Gray",
84  "Violet",
85  "Dim Red",
86  "Red",
87  "Bright Red",
88  "Pink",
89  "Light Pink",
90  "Yellow",
91  "Bright Yellow",
92  "UI Light Green",
93  "UI Green",
94  "UI Light Pink",
95  "UI Pink"
96 };
97 
98 const int rgba_defaults[TOTAL_COLORS][4] = {
99  {93, 93, 128, 255},
100  {185, 185, 255, 255},
101  {0, 120, 0, 255},
102  {50, 190, 50, 255},
103  {0, 0, 0, 255},
104  {65, 65, 65, 255},
105  {160, 160, 160, 255},
106  {105, 105, 105, 255},
107  {255, 255, 255 ,255},
108  {160, 144, 160, 255},
109  {192, 104, 192, 255},
110  {80, 6, 6, 255},
111  {126, 6, 6, 255},
112  {200, 0, 0, 255},
113  {185, 150, 150, 255},
114  {230, 190, 190, 255},
115  {255, 255, 122, 255},
116  {255, 255, 0, 255},
117  {161, 184, 161, 255},
118  {190, 228, 190, 255},
119  {184, 161, 161, 255},
120  {228, 190, 190, 255}
121 };
122 
134  &Color_bright,
135  &Color_normal,
137 };
138 
140  7, //"White"
141  0, //"Blue"
142  1, //"Bright Blue"
143  12, //"Red"
144  13, //"Bright Red"
145  8, //"Bright White"
146  8, //"Bright White"
147  9, //"Violet Gray"
148  12, //"Red"
149  13, //"Bright Red"
150  1, //"Bright Blue"
151  7, //"White"
152  5, //"Grey"
153 };
154 
155 #define DEFAULT_TAGS 20
156 
158  'w',
159  'W',
160  'r',
161  'g',
162  'y',
163  'b',
164  'f',
165  'h',
166  'n',
167  'B',
168  'G',
169  'R',
170  'Y',
171  'k',
172  'e',
173  'E',
174  'v',
175  'V',
176  'p',
177  'P',
178 };
179 
181  &Color_white,
183  &Color_red,
184  &Color_green,
185  &Color_yellow,
186  &Color_blue,
194  &Color_black,
195  &Color_grey,
196  &Color_silver,
198  &Color_violet,
199  &Color_pink,
201 };
202 
203 
204 // netplayer colors
206 
207  &Color_blue,
209  &Color_green,
211  &Color_pink,
212  &Color_grey,
213  &Color_silver,
214  &Color_white,
217  &Color_violet,
218  &Color_dim_red,
219  &Color_red,
221  &Color_yellow,
226  &Color_ui_pink,
227 };
228 
229 
230 void parse_colors(const char *filename);
231 void parse_everything_else(const char *filename); // needs a better name
232 
233 // -----------------------------------------------------------------------------------
234 // ALPHA FUNCTIONS
235 //
236 
242 {
243  // Set our default colors.
244  int i;
245  for (i = 0; i < TOTAL_COLORS; i++) {
246  gr_init_alphacolor(COLOR_LIST[i], rgba_defaults[i][0], rgba_defaults[i][1], rgba_defaults[i][2], rgba_defaults[i][3]);
247  }
248 
249  if (cf_exists_full("colors.tbl", CF_TYPE_TABLES)) {
250  mprintf(("TABLES => Starting parse of 'colors.tbl' (checking '#Start Colors' section only)...\n"));
251  parse_colors("colors.tbl");
252  }
253  parse_modular_table(NOX("*-clr.tbm"), parse_colors);
254 
255  // Set defaults for interface colors and color tags (must be done after the above because they're generally just copies of above-defined colors).
256  for (i = 0; i < INTERFACE_COLORS; i++) {
257  memcpy(interface_colors[i], COLOR_LIST[interface_defaults[i]], sizeof(color));
258  }
259 
260  for (i = 0; i < DEFAULT_TAGS; i++) {
261  Tagged_Colors[DEFAULT_TAG_LIST[i]] = DEFAULT_TAG_COLORS[i];
262  Color_Tags.push_back(DEFAULT_TAG_LIST[i]);
263  }
264 
265  if (cf_exists_full("colors.tbl", CF_TYPE_TABLES)) {
266  mprintf(("TABLES => Starting parse of 'colors.tbl' (skipping '#Start Colors' section)...\n"));
267  parse_everything_else("colors.tbl");
268  }
270 }
271 
272 void parse_colors(const char *filename)
273 {
274  Assertion(filename != NULL, "parse_colors() called on NULL; get a coder!\n");
275  read_file_text(filename, CF_TYPE_TABLES);
276 
277  try
278  {
279  reset_parse();
280 
281  // we search for the colors based on their order of definition above
282  // if the color isn't found, we just use default values
283  if (optional_string("#Start Colors"))
284  {
285  // vars for holding rgba values
286  int rgba[4] = { 0, 0, 0, 0 };
287  int i, j;
288 
289  char* color_names[TOTAL_COLORS] = {
290  "$Blue:",
291  "$Bright Blue:",
292  "$Green:",
293  "$Bright Green:",
294  "$Black:",
295  "$Grey:",
296  "$Silver:",
297  "$White:",
298  "$Bright White:",
299  "$Violet Gray:",
300  "$Violet:",
301  "$Dim Red:",
302  "$Red:",
303  "$Bright Red:",
304  "$Pink:",
305  "$Light Pink:",
306  "$Yellow:",
307  "$Bright Yellow:",
308  "$UI Light Green:",
309  "$UI Green:",
310  "$UI Light Pink:",
311  "$UI Pink:"
312  };
313 
314  // now for each color, check if it's corresponding string is there
315  for (i = 0; i < TOTAL_COLORS; i++) {
316  if (optional_string(color_names[i])) {
317  // if so, get its rgba values and initialise it using them
318  mprintf(("'%s' has been redefined.\n", color_names[i]));
319  //if (check_for_string("(")) {
321  for (j = 0; j < 4; j++) {
322  if (rgba[j] < 0) {
323  Warning(LOCATION, "RGBA value for '%s' in %s too low (%d), capping to 0.\n", color_names[i], filename, rgba[j]);
324  rgba[j] = 0;
325  }
326  else if (rgba[j] > 255) {
327  Warning(LOCATION, "RGBA value for '%s' in %s too high (%d), capping to 255.\n", color_names[i], filename, rgba[j]);
328  rgba[j] = 255;
329  }
330  }
331  //} else {
332  // stuff_hex_list(rgba, 4);
333  //}
334  gr_init_alphacolor(COLOR_LIST[i], rgba[0], rgba[1], rgba[2], rgba[3]);
335  }
336  }
337  required_string("#End");
338  }
339  }
340  catch (const parse::ParseException& e)
341  {
342  mprintf(("TABLES: Unable to parse '%s'! Error message = %s.\n", filename, e.what()));
343  return;
344  }
345 }
346 
348 {
349  Assertion(filename != NULL, "parse_everything_else() called on NULL; get a coder!\n");
350  read_file_text(filename, CF_TYPE_TABLES);
351 
352  try
353  {
354  reset_parse();
355 
356  int rgba[4] = { 0, 0, 0, 0 };
357 
358  // reusable temp vars
359  int i, j;
361 
362  if (optional_string("#Start Colors")) {
363  // Skip this section; we already parsed it in every file.
364  skip_to_string("#End", NULL);
365  }
366 
367  //Team coloring
368  if (optional_string("#Team Colors")) {
369 
370  while (required_string_either("#End", "$Team Name:")) {
371  required_string("$Team Name:"); // required to move the parse pointer forward
372  team_color temp_color;
373 
374  char temp2[NAME_LENGTH];
376  temp = temp2;
377 
378  if (!stricmp(temp2, "none")) {
379  Warning(LOCATION, "Team color in '%s' defined with a name of '%s'; this won't be usable due to 'None' being used for a lack of a team color by the engine.\n", filename, temp2);
380  }
381 
382  if (required_string("$Team Stripe Color:")) {
383  int rgb[3];
385  for (i = 0; i < 3; i++) {
386  CLAMP(rgb[i], 0, 255);
387  }
388 
389  temp_color.stripe.r = rgb[0] / 255.0f;
390  temp_color.stripe.g = rgb[1] / 255.0f;
391  temp_color.stripe.b = rgb[2] / 255.0f;
392  }
393 
394  if (required_string("$Team Base Color:")) {
395  int rgb[3];
397  for (i = 0; i < 3; i++) {
398  CLAMP(rgb[i], 0, 255);
399  }
400 
401  temp_color.base.r = rgb[0] / 255.0f;
402  temp_color.base.g = rgb[1] / 255.0f;
403  temp_color.base.b = rgb[2] / 255.0f;
404  }
405 
406  if (Team_Colors.find(temp) == Team_Colors.end()) { // Only push to the vector if the team isn't already defined.
407  Team_Names.push_back(temp);
408  }
409  Team_Colors[temp] = temp_color;
410  }
411  required_string("#End");
412  }
413 
414  // Previously-hardcoded interface colors
415  if (optional_string("#Interface Colors")) {
416  char *color_names[INTERFACE_COLORS] = {
417  "$Text Normal:",
418  "$Text Subselected:",
419  "$Text Selected:",
420  "$Text Error:",
421  "$Text Error Highlighted:",
422  "$Text Active:",
423  "$Text Active Highlighted:",
424  "$Text Heading:",
425  "$More Indicator:",
426  "$Bright More Indicator:",
427  "$Bright:",
428  "$Normal:",
429  "$Briefing Grid:",
430  };
431 
432  // now for each color, check if its corresponding string is there
433  for (i = 0; i < INTERFACE_COLORS; i++) {
434  if (optional_string(color_names[i])) {
435  // if so, get its rgba values and initialise it using them
436  mprintf(("'%s' has been redefined.\n", color_names[i]));
437  if (check_for_string("(")) {
438  // If we have a list of integers, use them.
440  for (j = 0; j < 4; j++) {
441  if (rgba[j] < 0)
442  {
443  Warning(LOCATION, "RGBA value for '%s' in %s too low (%d), capping to 0.\n", color_names[i], filename, rgba[j]);
444  rgba[j] = 0;
445  }
446  else if (rgba[j] > 255)
447  {
448  Warning(LOCATION, "RGBA value for '%s' in %s too high (%d), capping to 255.\n", color_names[i], filename, rgba[j]);
449  rgba[j] = 255;
450  }
451  }
452  gr_init_alphacolor(interface_colors[i], rgba[0], rgba[1], rgba[2], rgba[3]);
453  //} else if (check_for_string("#")) {
454  // stuff_hex_list(rgba, 4);
455  // gr_init_alphacolor(interface_colors[i], rgba[0], rgba[1], rgba[2], rgba[3]);
456  }
457  else {
458  // We have a string; it should be the name of a color to use.
459  stuff_string(temp, F_NAME);
460  for (j = 0; j < TOTAL_COLORS; j++) {
461  if (!temp.compare(COLOR_NAMES[j])) {
462  break;
463  }
464  }
465  if (j == TOTAL_COLORS) {
466  Warning(LOCATION, "Unknown color '%s' in %s, for definition of '%s'; using default ('%s').\n", temp.c_str(), filename, color_names[i], COLOR_NAMES[interface_defaults[i]]);
467  }
468  else {
469  Assertion(j >= 0 && j < TOTAL_COLORS, "Attempting to copy nonexistant color (%d out of 0-%d)!\n", j, TOTAL_COLORS - 1);
470  memcpy(interface_colors[i], COLOR_LIST[j], sizeof(color));
471  }
472  }
473  }
474  }
475  required_string("#End");
476  }
477 
478  // Text color tags; for briefings, command briefings, debriefings, and the fiction viewer
479  if (optional_string("#Color Tags")) {
480  while (required_string_either("$Tag:", "#End") < 1) {
481  required_string("$Tag:");
482  color temp_color;
483  char tag;
484 
485  stuff_string(temp, F_RAW);
486  if (temp[0] == '$') {
487  if (temp[1] == '\0') {
488  Error(LOCATION, "%s - found a '$Tag:' entry with a solitary '$'.\n", filename);
489  }
490  tag = temp[1];
491  if (temp[2] != '\0') {
492  Warning(LOCATION, "%s - tag '$%c' has extra text in its definition.\n", filename, tag);
493  }
494  }
495  else if (temp[0] == '\0') {
496  Error(LOCATION, "%s - found a '$Tag:' entry with no tag.\n", filename);
497  }
498  else {
499  tag = temp[0];
500  if (temp[1] != '\0') {
501  Warning(LOCATION, "%s - tag '$%c' has extra text in its definition.\n", filename, tag);
502  }
503  }
504 
505  if (Tagged_Colors.find(tag) == Tagged_Colors.end()) { // Only push the tag to our list of tags if it's actually new, not just a redefinition.
506  Color_Tags.push_back(tag);
507  }
508 
509  switch (required_string_one_of(4, "+Color:", "+Friendly", "+Hostile", "+Neutral")) {
510  case 0: // +Color
511  required_string("+Color:");
512 
513  rgba[0] = rgba[1] = rgba[2] = 0;
514  rgba[3] = 255; // Odds are pretty high you want it to have full alpha...
515 
516  if (check_for_string("(")) {
518  for (j = 0; j < 4; j++) {
519  if (rgba[j] < 0)
520  {
521  Warning(LOCATION, "RGBA value for '$%c' in %s too low (%d), capping to 0.\n", tag, filename, rgba[j]);
522  rgba[j] = 0;
523  }
524  else if (rgba[j] > 255)
525  {
526  Warning(LOCATION, "RGBA value for '$%c' in %s too high (%d), capping to 255.\n", tag, filename, rgba[j]);
527  rgba[j] = 255;
528  }
529  }
530  gr_init_alphacolor(&temp_color, rgba[0], rgba[1], rgba[2], rgba[3]);
531  Custom_Colors[tag] = temp_color;
532  Tagged_Colors[tag] = &Custom_Colors[tag];
533  //} else if ( check_for_string ("#") ) {
534  // stuff_hex_list(rgba, 4);
535  // gr_init_alphacolor(&temp_color, rgba[0], rgba[1], rgba[2], rgba[3]);
536  // Custom_Colors[tag] = temp_color;
537  // Tagged_Colors[tag] = &Custom_Colors[tag];
538  }
539  else {
540  // We have a string; it should be the name of a color to use.
541  stuff_string(temp, F_NAME);
542  for (j = 0; j < TOTAL_COLORS; j++) {
543  if (!temp.compare(COLOR_NAMES[j])) {
544  break;
545  }
546  }
547  if (j == TOTAL_COLORS) {
548  Error(LOCATION, "Unknown color '%s' in %s, for definition of tag '$%c'.\n", temp.c_str(), filename, tag);
549  }
550  Tagged_Colors[tag] = COLOR_LIST[j];
551  }
552  break;
553  case 1: // +Friendly
554  required_string("+Friendly");
555  Tagged_Colors[tag] = &Brief_color_green;
556  break;
557  case 2: // +Hostile
558  required_string("+Hostile");
559  Tagged_Colors[tag] = &Brief_color_red;
560  break;
561  case 3: // +Neutral
562  required_string("+Neutral");
563  Tagged_Colors[tag] = &Brief_color_legacy_neutral;
564  break;
565  case -1:
566  // -noparseerrors is set
567  if (Tagged_Colors.find(tag) == Tagged_Colors.end()) { // It was a new color, but since we haven't actually defined it...
568  Color_Tags.pop_back();
569  }
570  break;
571  default:
572  Assertion(false, "MageKing17 made a coding error somewhere, and you should laugh at him (and report this error).\n");
573  break;
574  }
575  }
576 
577  required_string("#End");
578  }
579  Assertion(Color_Tags.size() == Tagged_Colors.size(), "Color_Tags and Tagged_Colors size mismatch; get a coder!\n");
580 
581  if (optional_string("#Default Text Colors")) {
582 
583  char* color_names[MAX_DEFAULT_TEXT_COLORS] = {
584  "$Fiction Viewer:",
585  "$Command Briefing:",
586  "$Briefing:",
587  "$Redalert Briefing:",
588  "$Debriefing:",
589  "$Recommendation:",
590  "$Loop Briefing:",
591  };
592 
593  char *color_value[MAX_DEFAULT_TEXT_COLORS] = {
601  };
602 
603  for (i = 0; i < MAX_DEFAULT_TEXT_COLORS; i++) {
604  if (optional_string(color_names[i])) {
605  stuff_string(temp, F_RAW);
606  if (temp[0] == '$') {
607  if (temp[1] == '\0') {
608  Error(LOCATION, "%s - default text color '%s' entry with a solitary '$'.\n", filename, color_names[i]);
609  }
610  *color_value[i] = temp[1];
611  if (temp[2] != '\0') {
612  Warning(LOCATION, "%s - default text color '%s' has extra text after the tag '$%c'.\n", filename, color_names[i], *color_value[i]);
613  }
614  }
615  else if (temp[0] == '\0') {
616  Error(LOCATION, "%s - default text color '%s' entry with no tag.\n", filename, color_names[i]);
617  }
618  else {
619  *color_value[i] = temp[0];
620  if (temp[1] != '\0') {
621  Warning(LOCATION, "%s - default text color '%s' has extra text after the tag '$%c'.\n", filename, color_names[i], *color_value[i]);
622  }
623  }
624  if (Tagged_Colors.find(*color_value[i]) == Tagged_Colors.end()) {
625  // Just mprintf() this information instead of complaining with a Warning(); the tag might be defined in a later-loading TBM, and if it isn't, nothing too terrible will happen.
626  mprintf(("%s - default text color '%s' set to non-existant tag '$%c'.\n", filename, color_names[i], *color_value[i]));
627  }
628  }
629  }
630  required_string("#End");
631  }
632  }
633  catch (const parse::ParseException& e)
634  {
635  mprintf(("TABLES: Unable to parse '%s'! Error message = %s.\n", filename, e.what()));
636  return;
637  }
638 }
struct team_color::@238 stripe
const char * COLOR_NAMES[TOTAL_COLORS]
Definition: alphacolors.cpp:73
int i
Definition: multi_pxo.cpp:466
int check_for_string(const char *pstr)
Definition: parselo.cpp:517
#define INTERFACE_COLORS
Definition: alphacolors.h:24
color Brief_color_red
Definition: alphacolors.cpp:38
color Color_more_indicator
Definition: alphacolors.cpp:28
color Color_red
Definition: alphacolors.cpp:34
int required_string_one_of(int arg_count,...)
Checks for one of any of the given required strings.
Definition: parselo.cpp:708
#define DEFAULT_TAGS
color Color_dim_red
Definition: alphacolors.cpp:34
void _cdecl void void _cdecl void _cdecl Warning(char *filename, int line, SCP_FORMAT_STRING const char *format,...) SCP_FORMAT_STRING_ARGS(3
#define mprintf(args)
Definition: pstypes.h:238
void gr_init_alphacolor(color *clr, int r, int g, int b, int alpha, int type)
Definition: 2d.cpp:1173
Definition: 2d.h:95
color Color_light_pink
Definition: alphacolors.cpp:33
color Brief_color_legacy_neutral
Definition: alphacolors.cpp:38
char default_briefing_color
Definition: alphacolors.cpp:42
char default_loop_briefing_color
Definition: alphacolors.cpp:46
#define Assertion(expr, msg,...)
Definition: clang.h:41
color Color_text_active_hi
Definition: alphacolors.cpp:27
color Color_violet_gray
Definition: alphacolors.cpp:33
std::basic_string< char, std::char_traits< char >, std::allocator< char > > SCP_string
Definition: vmallocator.h:21
void alpha_colors_init()
color Color_ui_green
Definition: alphacolors.cpp:35
int required_string_either(char *str1, char *str2)
Checks for one of two required strings.
Definition: parselo.cpp:673
color Color_ui_pink
Definition: alphacolors.cpp:36
color Color_ui_light_green
Definition: alphacolors.cpp:35
color Color_blue
Definition: alphacolors.cpp:31
color Color_violet
Definition: alphacolors.cpp:33
#define CLAMP(x, min, max)
Definition: pstypes.h:488
color Color_text_error
Definition: alphacolors.cpp:27
color Color_pink
Definition: alphacolors.cpp:33
color Color_bright
Definition: alphacolors.cpp:28
color Color_bright_green
Definition: alphacolors.cpp:31
int cf_exists_full(const char *filename, int dir_type)
Definition: cfile.cpp:527
color Brief_color_green
Definition: alphacolors.cpp:38
char * filename
void stuff_string(char *outstr, int type, int len, char *terminators)
Definition: parselo.cpp:1189
char default_fiction_viewer_color
Definition: alphacolors.cpp:40
#define CF_TYPE_TABLES
Definition: cfile.h:50
float b
Definition: 2d.h:111
int required_string(const char *pstr)
Definition: parselo.cpp:468
int optional_string(const char *pstr)
Definition: parselo.cpp:539
void read_file_text(const char *filename, int mode, char *processed_text, char *raw_text)
Definition: parselo.cpp:1995
color * Color_netplayer[NETPLAYER_COLORS]
color Color_silver
Definition: alphacolors.cpp:32
color Color_bright_yellow
Definition: alphacolors.cpp:34
color Color_grey
Definition: alphacolors.cpp:32
#define NETPLAYER_COLORS
Definition: alphacolors.h:43
float r
Definition: 2d.h:111
color Color_yellow
Definition: alphacolors.cpp:34
color Color_bright_red
Definition: alphacolors.cpp:34
#define NOX(s)
Definition: pstypes.h:473
color * interface_colors[INTERFACE_COLORS]
void _cdecl void void _cdecl Error(const char *filename, int line, SCP_FORMAT_STRING const char *format,...) SCP_FORMAT_STRING_ARGS(3
color Color_text_error_hi
Definition: alphacolors.cpp:27
const int rgba_defaults[TOTAL_COLORS][4]
Definition: alphacolors.cpp:98
Definition: 2d.h:109
#define MAX_DEFAULT_TEXT_COLORS
Definition: alphacolors.h:53
char default_debriefing_color
Definition: alphacolors.cpp:44
void reset_parse(char *text)
Definition: parselo.cpp:3305
color Color_text_active
Definition: alphacolors.cpp:27
color Color_black
Definition: alphacolors.cpp:32
char default_recommendation_color
Definition: alphacolors.cpp:45
color Color_text_subselected
Definition: alphacolors.cpp:26
int stuff_int_list(int *ilp, int max_ints, int lookup_type)
Definition: parselo.cpp:2782
color Color_text_selected
Definition: alphacolors.cpp:26
color Color_green
Definition: alphacolors.cpp:31
color Color_bright_white
Definition: alphacolors.cpp:32
const int interface_defaults[INTERFACE_COLORS]
struct team_color::@237 base
color Color_white
Definition: alphacolors.cpp:32
SCP_vector< char > Color_Tags
Definition: alphacolors.cpp:20
#define NAME_LENGTH
Definition: globals.h:15
SCP_vector< SCP_string > Team_Names
Definition: alphacolors.cpp:16
color Color_briefing_grid
Definition: alphacolors.cpp:29
void parse_colors(const char *filename)
SCP_map< char, color > Custom_Colors
Definition: alphacolors.cpp:19
color * COLOR_LIST[TOTAL_COLORS]
Definition: alphacolors.cpp:48
float g
Definition: 2d.h:111
char default_redalert_briefing_color
Definition: alphacolors.cpp:43
#define F_NAME
Definition: parselo.h:34
#define LOCATION
Definition: pstypes.h:245
color Color_more_bright
Definition: alphacolors.cpp:28
#define TOTAL_COLORS
Definition: alphacolors.h:30
color Color_normal
Definition: alphacolors.cpp:28
char default_command_briefing_color
Definition: alphacolors.cpp:41
int parse_modular_table(const char *name_check, void(*parse_callback)(const char *filename), int path_type, int sort_type)
Definition: parselo.cpp:4205
color Color_text_normal
Definition: alphacolors.cpp:26
int temp
Definition: lua.cpp:4996
color Color_text_heading
Definition: alphacolors.cpp:28
SCP_map< SCP_string, team_color > Team_Colors
Definition: alphacolors.cpp:15
color Color_ui_light_pink
Definition: alphacolors.cpp:36
color * DEFAULT_TAG_COLORS[DEFAULT_TAGS]
color Color_bright_blue
Definition: alphacolors.cpp:31
void parse_everything_else(const char *filename)
const char DEFAULT_TAG_LIST[DEFAULT_TAGS]
SCP_map< char, color * > Tagged_Colors
Definition: alphacolors.cpp:18
#define stricmp(s1, s2)
Definition: config.h:271
int skip_to_string(char *pstr, char *end)
Definition: parselo.cpp:375
#define RAW_INTEGER_TYPE
Definition: parselo.h:52
#define F_RAW
Definition: parselo.h:44