View Issue Details

IDProjectCategoryView StatusLast Update
0000761FSSCPuser interfacepublic2014-06-27 14:00
ReporterCP5670 Assigned ToMageKing17  
PrioritynormalSeverityfeatureReproducibilityalways
Status resolvedResolutionfixed 
Target Version3.7.2 
Summary0000761: Text color tags don't work in debriefings
DescriptionThe color tags commonly used in briefings and command briefings to highlight certain words ($f, $b, $h, $n, etc.) don't work in debriefings. They haven't had any effect there since the retail FS2 days.
TagsNo tags attached.

Activities

thesource2

2006-01-30 16:32

reporter   ~0004564

Color tags in debriefing neither supported in FreeSpace 1, nor in FreeSpace2.
It always been that way, so I don't think it can be considered as a bug.

Goober5000

2006-01-30 20:36

administrator   ~0004568

thesource2: Which copy of Freespace have you been playing? O.o They're used all the time in the Volition missions.

CP: Make sure you're putting a space between the tag and the word. :p E.g. "The $f GTVA $f Colossus will face off against the $h SJ $h Sathanas." They worked in the CVS build I ran last night.

taylor

2006-01-30 20:58

administrator   ~0004572

@Goober: they are referring to debriefing, not briefing. The tags aren't supported in debriefings, though adding support for it wouldn't be too big of a deal.

Goober5000

2006-01-30 21:28

administrator   ~0004573

Oh, right. Sorry, I'll go and bone up on my reading comprehension now. :p

taylor

2006-01-30 22:16

administrator   ~0004575

Not a problem. I thought they were crazy at first too. ;)

CP5670

2006-01-31 05:29

reporter   ~0004580

Sorry, for some reason I thought I remembered the walkthrough saying they could be used in debriefings. My bad. I guess this isn't a bug. Would be nice to have support for it though.

Goober5000

2012-12-06 05:48

administrator   ~0014331

Deferring to 3.7.2.

MageKing17

2014-06-23 06:54

developer   ~0015905

I managed to make a patch to get this working: http://deviance.duckish.net/pictures/fs2_open_3_7_1_SSE2%202014-06-23%2000-07-25-63.png

It's a bit hackish, but probably less so than the original code...

MageKing17

2014-06-23 16:01

developer   ~0015906

Additional patch that combines this with the capability for color spans to work across linebreaks (these should not be done in the same commit, but this way people can test both changes at the same time).

Goober5000

2014-06-23 22:15

administrator   ~0015907

Um, wut? Do color spans work across line breaks in briefings?

MageKing17

2014-06-23 22:22

developer   ~0015908

They do with this patch; it's another new feature.

Goober5000

2014-06-26 01:46

administrator   ~0015913

Gotcha.

Well, this needs careful review, especially since you said it was hackish. I'm temporarily assigning it to... *scans list* z64555 for a second look.

MageKing17

2014-06-26 04:29

developer   ~0015917

Standalone patch for multiline color spans because it should probably be commited first to avoid having to add and then immediately remove an argument to brief_text_colorize().

MageKing17

2014-06-26 05:12

developer  

multiline spans.patch (2,582 bytes)   
Index: code/mission/missionbriefcommon.cpp
===================================================================
--- code/mission/missionbriefcommon.cpp	(revision 10838)
+++ code/mission/missionbriefcommon.cpp	(working copy)
@@ -136,6 +136,8 @@
 
 const char BRIEF_META_CHAR = '$';
 
+const int HIGHEST_COLOR_STACK_INDEX = 9;
+
 // camera related
 static vec3d	Current_cam_pos;		// current camera position
 static vec3d	Target_cam_pos;		// desired camera position
@@ -1556,23 +1558,19 @@
  *
  * @param src a not null pointer to a C string terminated by a /0 char.
  * @param instance index into Colored_stream where the result should be placed. Value is 0 unless multiple text streams are required.
+ * @param[in,out] default_color_stack pointer to an array containing a stack of default colors (for color spans)
+ * @param[in,out] color_stack_index pointer to the current index in the above stack
  * @return number of character of the resulting sequence.
  */
-int brief_text_colorize(char *src, int instance)
+int brief_text_colorize(char *src, int instance, ubyte default_color_stack[], int &color_stack_index)
 {
 	Assert(src);
 	Assert((0 <= instance) && (instance < (int)(sizeof(Colored_stream) / sizeof(*Colored_stream))));
 
-	// manage different default colors (don't use a SCP_ stack because eh)
-	const int HIGHEST_COLOR_STACK_INDEX = 9;
-	ubyte default_color_stack[10];
-	int color_stack_index = 0;
-
 	briefing_line dest_line;	//the resulting vector of colored character
 	ubyte active_color_index;	//the current drawing color
 
-	// start off with white
-	default_color_stack[0] = active_color_index = BRIEF_TEXT_WHITE;
+	active_color_index = default_color_stack[color_stack_index];
 
 	int src_len = strlen(src);
 	for (int i = 0; i < src_len; i++)
@@ -1652,6 +1650,13 @@
 	SCP_vector<const char*> p_str;
 	char brief_line[MAX_BRIEF_LINE_LEN];
 
+	// manage different default colors (don't use a SCP_ stack because eh)
+	ubyte default_color_stack[HIGHEST_COLOR_STACK_INDEX + 1];
+	int color_stack_index = 0;
+
+	// start off with white
+	default_color_stack[0] = BRIEF_TEXT_WHITE;
+
 	Assert(src != NULL);
 	n_lines = split_str(src, w, n_chars, p_str, BRIEF_META_CHAR);
 	Assert(n_lines >= 0);
@@ -1668,7 +1673,7 @@
 		strncpy(brief_line, p_str[i], n_chars[i]);
 		brief_line[n_chars[i]] = 0;
 		drop_leading_white_space(brief_line);
-		len = brief_text_colorize(&brief_line[0], instance);
+		len = brief_text_colorize(&brief_line[0], instance, default_color_stack, color_stack_index);
 		if (len > Max_briefing_line_len)
 			Max_briefing_line_len = len;
 	}
multiline spans.patch (2,582 bytes)   

The_E

2014-06-26 15:41

administrator   ~0015921

My only comment on this is that instead of commenting out code, it should be removed entirely. Functionally, this looks good to me.

MageKing17

2014-06-26 15:51

developer   ~0015922

New version of combined patch to delete unused code instead of commenting it out.

Zacam

2014-06-26 18:16

administrator  

761 + multiline spans.patch (13,163 bytes)   
Index: code/mission/missionbriefcommon.cpp
===================================================================
--- code/mission/missionbriefcommon.cpp	(revision 10840)
+++ code/mission/missionbriefcommon.cpp	(working copy)
@@ -136,6 +136,8 @@
 
 const char BRIEF_META_CHAR = '$';
 
+const int HIGHEST_COLOR_STACK_INDEX = 9;
+
 // camera related
 static vec3d	Current_cam_pos;		// current camera position
 static vec3d	Target_cam_pos;		// desired camera position
@@ -186,28 +188,6 @@
 typedef SCP_vector<briefing_line> briefing_stream; 
 static briefing_stream Colored_stream[MAX_TEXT_STREAMS];
 
-#define MAX_BRIEF_TEXT_COLORS		20
-#define BRIEF_TEXT_WHITE			0
-#define BRIEF_TEXT_BRIGHT_WHITE		1
-#define BRIEF_TEXT_RED				2
-#define BRIEF_TEXT_GREEN			3
-#define BRIEF_TEXT_YELLOW			4
-#define BRIEF_TEXT_BLUE				5
-#define BRIEF_TEXT_FRIENDLY			6
-#define BRIEF_TEXT_HOSTILE			7
-#define BRIEF_TEXT_NEUTRAL			8
-#define BRIEF_TEXT_BRIGHT_BLUE		9
-#define BRIEF_TEXT_BRIGHT_GREEN		10
-#define BRIEF_TEXT_BRIGHT_RED		11
-#define BRIEF_TEXT_BRIGHT_YELLOW	12
-#define BRIEF_TEXT_BLACK			13
-#define BRIEF_TEXT_GREY				14
-#define BRIEF_TEXT_SILVER			15
-#define BRIEF_TEXT_VIOLET_GRAY		16
-#define BRIEF_TEXT_VIOLET			17
-#define BRIEF_TEXT_PINK				18
-#define BRIEF_TEXT_LIGHT_PINK		19
-
 color Brief_color_red, Brief_color_green, Brief_color_legacy_neutral;
 
 color *Brief_text_colors[MAX_BRIEF_TEXT_COLORS] = 
@@ -242,7 +222,6 @@
 static int Voice_started_time;
 static int Voice_ended_time;
 
-const float		BRIEF_TEXT_WIPE_TIME	= 1.5f;		// time in seconds for wipe to occur
 static int		Brief_text_wipe_snd;					// sound handle of sound effect for text wipe
 static int		Play_brief_voice;
 
@@ -1556,23 +1535,19 @@
  *
  * @param src a not null pointer to a C string terminated by a /0 char.
  * @param instance index into Colored_stream where the result should be placed. Value is 0 unless multiple text streams are required.
+ * @param[in,out] default_color_stack pointer to an array containing a stack of default colors (for color spans)
+ * @param[in,out] color_stack_index pointer to the current index in the above stack
  * @return number of character of the resulting sequence.
  */
-int brief_text_colorize(char *src, int instance)
+int brief_text_colorize(char *src, int instance, ubyte default_color_stack[], int &color_stack_index)
 {
 	Assert(src);
 	Assert((0 <= instance) && (instance < (int)(sizeof(Colored_stream) / sizeof(*Colored_stream))));
 
-	// manage different default colors (don't use a SCP_ stack because eh)
-	const int HIGHEST_COLOR_STACK_INDEX = 9;
-	ubyte default_color_stack[10];
-	int color_stack_index = 0;
-
 	briefing_line dest_line;	//the resulting vector of colored character
 	ubyte active_color_index;	//the current drawing color
 
-	// start off with white
-	default_color_stack[0] = active_color_index = BRIEF_TEXT_WHITE;
+	active_color_index = default_color_stack[color_stack_index];
 
 	int src_len = strlen(src);
 	for (int i = 0; i < src_len; i++)
@@ -1644,8 +1619,10 @@
  * @param w	max width of line in pixels
  * @param instance optional parameter, used when multiple text streams are required (default value is 0)
  * @param max_lines maximum number of lines
+ * @param[in] default_color default color for this text (defaults to BRIEF_TEXT_WHITE)
+ * @param[in] append add on to the existing lines instead of replacing them (defaults to false)
  */
-int brief_color_text_init(const char* src, int w, int instance, int max_lines)
+int brief_color_text_init(const char* src, int w, int instance, int max_lines, const ubyte default_color, const bool append)
 {
 	int i, n_lines, len;
 	SCP_vector<int> n_chars;
@@ -1652,6 +1629,13 @@
 	SCP_vector<const char*> p_str;
 	char brief_line[MAX_BRIEF_LINE_LEN];
 
+	// manage different default colors (don't use a SCP_ stack because eh)
+	ubyte default_color_stack[HIGHEST_COLOR_STACK_INDEX + 1];
+	int color_stack_index = 0;
+
+	// start off with white, or whatever our default is
+	default_color_stack[0] = default_color;
+
 	Assert(src != NULL);
 	n_lines = split_str(src, w, n_chars, p_str, BRIEF_META_CHAR);
 	Assert(n_lines >= 0);
@@ -1661,14 +1645,20 @@
 		n_lines = max_lines; 
 	}
 
-	Max_briefing_line_len = 1;
-	Colored_stream[instance].clear();
+	if (!append) {
+		Max_briefing_line_len = 1;
+		Colored_stream[instance].clear();
+	} else if (n_lines == 0 && !strcmp(src, "\n")) {	// Silly hack to allow inserting blank lines for debriefings -MageKing17
+		n_lines = 1;
+		p_str.push_back(0);
+		n_chars.push_back(0);
+	}
 	for (i=0; i<n_lines; i++) {
 		Assert(n_chars[i] < MAX_BRIEF_LINE_LEN);
 		strncpy(brief_line, p_str[i], n_chars[i]);
 		brief_line[n_chars[i]] = 0;
 		drop_leading_white_space(brief_line);
-		len = brief_text_colorize(&brief_line[0], instance);
+		len = brief_text_colorize(&brief_line[0], instance, default_color_stack, color_stack_index);
 		if (len > Max_briefing_line_len)
 			Max_briefing_line_len = len;
 	}
@@ -1676,7 +1666,11 @@
 	Brief_text_wipe_time_elapsed = 0.0f;
 	Play_brief_voice = 0;
 
-	Num_brief_text_lines[instance] = n_lines;
+	if (append) {
+		Num_brief_text_lines[instance] += n_lines;
+	} else {
+		Num_brief_text_lines[instance] = n_lines;
+	}
 	return n_lines;
 }
 
Index: code/mission/missionbriefcommon.h
===================================================================
--- code/mission/missionbriefcommon.h	(revision 10840)
+++ code/mission/missionbriefcommon.h	(working copy)
@@ -72,6 +72,38 @@
 struct brief_icon;
 extern briefing_icon_info *brief_get_icon_info(brief_icon *bi);
 
+
+
+// Moving briefing color definitions out of missionbriefcommon.cpp so they can be referenced elsewhere -MageKing17
+
+enum
+{
+	BRIEF_TEXT_WHITE = 0,
+	BRIEF_TEXT_BRIGHT_WHITE,
+	BRIEF_TEXT_RED,
+	BRIEF_TEXT_GREEN,
+	BRIEF_TEXT_YELLOW,
+	BRIEF_TEXT_BLUE,
+	BRIEF_TEXT_FRIENDLY,
+	BRIEF_TEXT_HOSTILE,
+	BRIEF_TEXT_NEUTRAL,
+	BRIEF_TEXT_BRIGHT_BLUE,
+	BRIEF_TEXT_BRIGHT_GREEN,
+	BRIEF_TEXT_BRIGHT_RED,
+	BRIEF_TEXT_BRIGHT_YELLOW,
+	BRIEF_TEXT_BLACK,
+	BRIEF_TEXT_GREY,
+	BRIEF_TEXT_SILVER,
+	BRIEF_TEXT_VIOLET_GRAY,
+	BRIEF_TEXT_VIOLET,
+	BRIEF_TEXT_PINK,
+	BRIEF_TEXT_LIGHT_PINK,
+	MAX_BRIEF_TEXT_COLORS,
+};
+
+// And the same here
+const float		BRIEF_TEXT_WIPE_TIME	= 1.5f;		// time in seconds for wipe to occur
+
 // ------------------------------------------------------------------------
 // Structures to hold briefing data
 // ------------------------------------------------------------------------
@@ -303,7 +335,7 @@
 void brief_voice_unpause(int stage_num);
 
 // fancy briefing style text functions for use in other modules.
-int brief_color_text_init(const char *src, int w, int instance = 0, int max_lines = MAX_BRIEF_LINES);
+int brief_color_text_init(const char *src, int w, int instance = 0, int max_lines = MAX_BRIEF_LINES, const ubyte default_color = BRIEF_TEXT_WHITE, const bool append = false);
 int brief_render_text(int line_offset, int x, int y, int h, float frametime, int instance = 0, int line_spacing = 0);
 
 void cmd_brief_reset();
Index: code/missionui/missiondebrief.cpp
===================================================================
--- code/missionui/missiondebrief.cpp	(revision 10840)
+++ code/missionui/missiondebrief.cpp	(working copy)
@@ -61,6 +61,8 @@
 #define DEBRIEF_ALLTIME_STATS		2
 #define DEBRIEF_ALLTIME_KILLS		3
 
+extern float Brief_text_wipe_time_elapsed;
+
 // 3rd coord is max width in pixels
 int Debrief_title_coords[GR_NUM_RESOLUTIONS][3] = {
 	{ // GR_640
@@ -326,10 +328,6 @@
 static int Award_active;
 static int Text_offset;
 static int Num_text_lines = 0;
-static int Num_debrief_lines = 0;
-//static int Num_normal_debrief_lines = 0;
-static int Text_type[MAX_TOTAL_DEBRIEF_LINES];
-static char *Text[MAX_TOTAL_DEBRIEF_LINES];
 
 static int Debrief_inited = 0;
 static int New_stage;
@@ -1515,38 +1513,6 @@
 	gr_string(Debrief_text_x2[gr_screen.res], y_loc, time_str, GR_RESIZE_MENU);	
 }
 
-// render out the debriefing text to the scroll window
-void debrief_render()
-{
-	int y, z, font_height;
-
-	if ( Num_stages <= 0 )
-		return;
-
-	font_height = gr_get_font_height();
-
-	gr_set_clip(Debrief_text_wnd_coords[gr_screen.res][0], Debrief_text_wnd_coords[gr_screen.res][1], Debrief_text_wnd_coords[gr_screen.res][2], Debrief_text_wnd_coords[gr_screen.res][3], GR_RESIZE_MENU);
-	y = 0;
-	z = Text_offset;
-	while (y + font_height <= Debrief_text_wnd_coords[gr_screen.res][3]) {
-		if (z >= Num_text_lines)
-			break;
-
-		if (Text_type[z] == TEXT_TYPE_NORMAL)
-			gr_set_color_fast(&Color_white);
-		else
-			gr_set_color_fast(&Color_bright_red);
-
-		if (Text[z])
-			gr_string(0, y, Text[z], GR_RESIZE_MENU);
-
-		y += font_height;
-		z++;
-	}
-
-	gr_reset_clip();
-}
-
 // render out the stats info to the scroll window
 //
 void debrief_stats_render()
@@ -1856,44 +1822,6 @@
 	*/
 }
 
-void debrief_text_stage_init(const char *src, int type)
-{
-	int i, n_lines, n_chars[MAX_DEBRIEF_LINES];
-	char line[MAX_DEBRIEF_LINE_LEN];
-	const char *p_str[MAX_DEBRIEF_LINES];
-
-	n_lines = split_str(src, Debrief_text_wnd_coords[gr_screen.res][2], n_chars, p_str, MAX_DEBRIEF_LINES);
-	Assert(n_lines >= 0);
-
-	// if you hit this, you proba	
-	if(n_lines >= MAX_DEBRIEF_LINES){
-		Warning(LOCATION, "You have come close to the limit of debriefing lines, try adding more stages");	
-	}
-
-	for ( i=0; i<n_lines; i++ ) {
-		Assert(n_chars[i] < MAX_DEBRIEF_LINE_LEN);
-		Assert(Num_text_lines < MAX_TOTAL_DEBRIEF_LINES);
-		strncpy(line, p_str[i], n_chars[i]);
-		line[n_chars[i]] = 0;
-		drop_white_space(line);
-		Text_type[Num_text_lines] = type;
-		Text[Num_text_lines++] = vm_strdup(line);
-	}
-
-	return;
-}
-
-void debrief_free_text()
-{
-	int i;
-
-	for (i=0; i<Num_debrief_lines; i++)
-		if (Text[i])
-			vm_free(Text[i]);
-
-	Num_debrief_lines = 0;
-}
-
 // setup the debriefing text lines for rendering
 void debrief_text_init()
 {
@@ -1910,9 +1838,7 @@
 		}
 	}
 
-	// release old text lines first
-	debrief_free_text();
-	Num_text_lines = Text_offset = 0;
+	Num_text_lines = Text_offset = brief_color_text_init("", Debrief_text_wnd_coords[gr_screen.res][2], 0, 0);	// Initialize color stuff -MageKing17
 
 	fsspeech_start_buffer();
 
@@ -1919,12 +1845,13 @@
 	if (Current_mode == DEBRIEF_TAB) {
 		for (i=0; i<Num_debrief_stages; i++) {
 			if (i)
-				Text[Num_text_lines++] = NULL;  // add a blank line between stages
+				// add a blank line between stages
+				Num_text_lines += brief_color_text_init("\n", Debrief_text_wnd_coords[gr_screen.res][2], 0, MAX_DEBRIEF_LINES, BRIEF_TEXT_WHITE, true);
 
 			src = Debrief_stages[i]->text.c_str();
 
 			if (*src) {
-				debrief_text_stage_init(src, TEXT_TYPE_NORMAL);
+				Num_text_lines += brief_color_text_init(src, Debrief_text_wnd_coords[gr_screen.res][2], 0, MAX_DEBRIEF_LINES, BRIEF_TEXT_WHITE, true);
 
 				if (use_sim_speech && !Recommend_active) {
 					fsspeech_stuff_buffer(src);
@@ -1939,8 +1866,9 @@
 					src = XSTR( "We have no recommendations for you.", 1054);
 
 				if (*src) {
-					Text[Num_text_lines++] = NULL;
-					debrief_text_stage_init(src, TEXT_TYPE_RECOMMENDATION);
+					Num_text_lines += brief_color_text_init("\n", Debrief_text_wnd_coords[gr_screen.res][2], 0, MAX_DEBRIEF_LINES, BRIEF_TEXT_RED, true);
+
+					Num_text_lines += brief_color_text_init(src, Debrief_text_wnd_coords[gr_screen.res][2], 0, MAX_DEBRIEF_LINES, BRIEF_TEXT_RED, true);
 					r_count++;
 
 					if (use_sim_speech) {
@@ -1950,8 +1878,8 @@
 				}
 			}
 		}
+		Brief_text_wipe_time_elapsed = BRIEF_TEXT_WIPE_TIME;	// Skip the wipe effect
 
-		Num_debrief_lines = Num_text_lines;
 		if(use_sim_speech) {
 			fsspeech_play_buffer(FSSPEECH_FROM_BRIEFING);
 		}
@@ -2027,7 +1955,7 @@
 	Current_stage = -1;
 	New_stage = 0;
 	Debrief_cue_voice = 0;
-	Num_text_lines = Num_debrief_lines = 0;
+	Num_text_lines = 0;
 	Debrief_first_voice_flag = 1;
 
 	Debrief_multi_voice_loaded = 0;
@@ -2092,6 +2020,9 @@
 	}
 	*/
 
+	// Just calculate this once instead of every frame. -MageKing17
+	Max_debrief_Lines = Debrief_text_wnd_coords[gr_screen.res][3]/gr_get_font_height(); //Make the max number of lines dependent on the font height.
+
 	// start up the appropriate music
 	debrief_init_music();
 
@@ -2171,14 +2102,6 @@
 		Player->show_skip_popup = 1;
 	}
 
-	if (Num_debrief_lines) {
-		for (i=0; i<Num_debrief_lines; i++){
-			if (Text[i]){
-				vm_free(Text[i]);
-			}
-		}
-	}
-
 	// clear out debrief info parsed from mission file - taylor
 	mission_debrief_common_reset();
 
@@ -2556,7 +2479,7 @@
 				gr_printf_menu(Debrief_text_wnd_coords[gr_screen.res][0], Debrief_text_wnd_coords[gr_screen.res][1], XSTR( "No Debriefing for mission: %s", 458), Game_current_mission_filename);
 
 			} else {
-				debrief_render();
+				brief_render_text(Text_offset, Debrief_text_wnd_coords[gr_screen.res][0], Debrief_text_wnd_coords[gr_screen.res][1], Debrief_text_wnd_coords[gr_screen.res][3], frametime);
 			}
 
 			break;
@@ -2566,8 +2489,6 @@
 			break;
 	} // end switch
 
-	Max_debrief_Lines = Debrief_text_wnd_coords[gr_screen.res][3]/gr_get_font_height(); //Make the max number of lines dependent on the font height.
-
 	if ( (Max_debrief_Lines + Text_offset) < Num_text_lines ) {
 		int w;
 
761 + multiline spans.patch (13,163 bytes)   

Zacam

2014-06-26 18:16

administrator   ~0015924

Corrected .patch to have LF in headers instead of CRLF.

MageKing17

2014-06-26 19:10

developer  

colored_debrief.fs2 (2,747 bytes)

MageKing17

2014-06-26 19:11

developer   ~0015925

Uploaded my test mission so you don't have to make your own.

z64555

2014-06-27 09:06

developer   ~0015928

Last edited: 2014-06-27 09:08

Patch looks good as of latest flavor, does exactly as it says on the label.

Commit when ready. :P

The_E

2014-06-27 14:00

administrator   ~0015930

Patch committed to trunk in revision 10846

Issue History

Date Modified Username Field Change
2006-01-30 08:10 CP5670 New Issue
2006-01-30 16:32 thesource2 Note Added: 0004564
2006-01-30 20:36 Goober5000 Note Added: 0004568
2006-01-30 20:58 taylor Note Added: 0004572
2006-01-30 21:28 Goober5000 Note Added: 0004573
2006-01-30 22:16 taylor Note Added: 0004575
2006-01-31 05:29 CP5670 Note Added: 0004580
2006-02-01 06:06 Goober5000 Status new => assigned
2006-02-01 06:06 Goober5000 Assigned To => Goober5000
2009-11-10 17:29 Zacam Assigned To Goober5000 => Zacam
2012-12-06 05:48 Goober5000 Note Added: 0014331
2012-12-06 05:48 Goober5000 Target Version => 3.7.2
2014-06-23 06:53 MageKing17 File Added: 761.patch
2014-06-23 06:53 MageKing17 Assigned To Zacam => MageKing17
2014-06-23 06:53 MageKing17 Severity trivial => feature
2014-06-23 06:53 MageKing17 Status assigned => code review
2014-06-23 06:54 MageKing17 Note Added: 0015905
2014-06-23 16:00 MageKing17 File Added: 761 + multiline spans.patch
2014-06-23 16:01 MageKing17 Note Added: 0015906
2014-06-23 22:15 Goober5000 Note Added: 0015907
2014-06-23 22:22 MageKing17 Note Added: 0015908
2014-06-26 01:46 Goober5000 Note Added: 0015913
2014-06-26 01:46 Goober5000 Assigned To MageKing17 => z64555
2014-06-26 04:22 MageKing17 File Added: multiline spans.patch
2014-06-26 04:29 MageKing17 Note Added: 0015917
2014-06-26 04:29 MageKing17 File Deleted: 761 + multiline spans.patch
2014-06-26 04:29 MageKing17 File Deleted: 761.patch
2014-06-26 04:56 MageKing17 File Deleted: multiline spans.patch
2014-06-26 04:56 MageKing17 File Added: multiline spans.patch
2014-06-26 05:12 MageKing17 File Deleted: multiline spans.patch
2014-06-26 05:12 MageKing17 File Added: multiline spans.patch
2014-06-26 05:31 MageKing17 File Added: 761 + multiline spans.patch
2014-06-26 05:55 MageKing17 File Deleted: 761 + multiline spans.patch
2014-06-26 05:55 MageKing17 File Added: 761 + multiline spans.patch
2014-06-26 15:41 The_E Note Added: 0015921
2014-06-26 15:50 MageKing17 File Deleted: 761 + multiline spans.patch
2014-06-26 15:50 MageKing17 File Added: 761 + multiline spans.patch
2014-06-26 15:51 MageKing17 Note Added: 0015922
2014-06-26 18:15 Zacam File Deleted: 761 + multiline spans.patch
2014-06-26 18:16 Zacam File Added: 761 + multiline spans.patch
2014-06-26 18:16 Zacam Note Added: 0015924
2014-06-26 19:10 MageKing17 File Added: colored_debrief.fs2
2014-06-26 19:11 MageKing17 Note Added: 0015925
2014-06-27 09:06 z64555 Note Added: 0015928
2014-06-27 09:07 z64555 Assigned To z64555 => MageKing17
2014-06-27 09:07 z64555 Status code review => assigned
2014-06-27 09:08 z64555 Status assigned => code review
2014-06-27 09:08 z64555 Note Edited: 0015928
2014-06-27 14:00 The_E Note Added: 0015930
2014-06-27 14:00 The_E Status code review => resolved
2014-06-27 14:00 The_E Resolution open => fixed