diff --git a/include/light/light.h b/include/light/light.h index bf56f004..529d7a2c 100644 --- a/include/light/light.h +++ b/include/light/light.h @@ -150,6 +150,7 @@ extern int oversample; extern qboolean write_litfile; extern qboolean write_luxfile; extern qboolean onlyents; +extern qboolean parse_escape_sequences; void SetupDirt(); diff --git a/light/entities.c b/light/entities.c index 1eb0cac1..d6075138 100644 --- a/light/entities.c +++ b/light/entities.c @@ -940,6 +940,29 @@ Get_EntityStringSize(const entity_t *entities) return size; } +const char * +CopyValueWithEscapeSequencesParsed(const char *value) +{ + char *result = copystring(value); + const char *inptr = value; + char *outptr = result; + qboolean bold = false; + + for ( ; *inptr; inptr++) { + if (inptr[0] == '\\' && inptr[1] == 'b') { + bold = !bold; // Toggle bold + inptr++; + continue; + } else { + int mask = bold ? 128 : 0; + *(outptr++) = *inptr | mask; + } + } + *outptr = 0; + + return result; +} + /* * ================ * WriteEntitiesToString @@ -979,8 +1002,20 @@ WriteEntitiesToString(bsp2_t *bsp) space -= length; for (epair = entity->epairs; epair; epair = epair->next) { + const char *value; + if (parse_escape_sequences) { + value = CopyValueWithEscapeSequencesParsed(epair->value); + } else { + value = epair->value; + } + length = snprintf(pos, space, "\"%s\" \"%s\"\n", - epair->key, epair->value); + epair->key, value); + + if (parse_escape_sequences) { + free(value); + } + pos += length; space -= length; } diff --git a/light/light.c b/light/light.c index 75738094..65e1161c 100644 --- a/light/light.c +++ b/light/light.c @@ -78,6 +78,7 @@ int oversample = 1; qboolean write_litfile = false; qboolean write_luxfile = false; qboolean onlyents = false; +qboolean parse_escape_sequences = false; void GetFileSpace(byte **lightdata, byte **colordata, byte **deluxdata, int size) @@ -376,6 +377,9 @@ main(int argc, const char **argv) } else if ( !strcmp( argv[ i ], "-onlyents" ) ) { onlyents = true; logprint( "Onlyents mode enabled\n" ); + } else if ( !strcmp( argv[ i ], "-parse_escape_sequences" ) ) { + parse_escape_sequences = true; + logprint( "Parsing escape sequences enabled\n" ); } else if (argv[i][0] == '-') Error("Unknown option \"%s\"", argv[i]); else @@ -387,7 +391,7 @@ main(int argc, const char **argv) " [-light num] [-addmin] [-anglescale|-anglesense]\n" " [-dist n] [-range n] [-gate n] [-lit] [-lux]\n" " [-dirt] [-dirtdebug] [-dirtmode n] [-dirtdepth n] [-dirtscale n] [-dirtgain n] [-dirtangle n]\n" - " [-soft [n]] [-fence] [-gamma n] [-surflight_subdivide n] [-onlyents] [-sunsamples n] bspfile\n"); + " [-soft [n]] [-fence] [-gamma n] [-surflight_subdivide n] [-onlyents] [-sunsamples n] [-parse_escape_sequences] bspfile\n"); exit(1); }