View Issue Details

Category
SSPBT:本体(SSP)
SeverityminorReproducibilityalways 
Status new 
Summary0000790: Odd behavior of \c[char] tag
DescriptionI encountered some strange behavior with \c[char]. It seems that if \c[char] is followed immediately by a \f[] tag, a gap will be left where the characters were erased. This results in an unexpected display. Example script:

ABCDE\c[char,4]\f[strike,1]12345

It is possible to mitigate this somewhat by placing a space before the \f[] tag, but then the space will be left over, leaving behind a smaller gap.
(Note: I tried this with strike and underline, but haven't tested other styles.)

Additionally, I'm not sure if it's the same issue or a different one, but it seems like \c[char] behaves oddly when the text wraps. Sometimes instead of erasing characters as expected, it leaves some behind. I'm having some trouble figuring out a specific minimal script to reproduce this, but it seems like a combination of \c[char], an automatic line break, and maybe text styling, causes an issue. (I also tried placing \n tags before the line wrap point to avoid the automatic line breaks, but that tag got erased too, so it had the same issue in the end...)

I provided several scripts I used to test in testing_scripts.txt. I also provided the Aosora code I used to generate the longer scripts.

SSP/2.8.32 (20260619-1; Windows NT 10.0.26100)
Attached Files
shortscript_no_gap.gif (19,267 bytes)   
shortscript_no_gap.gif (19,267 bytes)   
shortscript_big_gap.gif (18,200 bytes)   
shortscript_big_gap.gif (18,200 bytes)   
shortscript_small_gap.gif (17,287 bytes)   
shortscript_small_gap.gif (17,287 bytes)   
longscript_big_gap.gif (21,820 bytes)   
longscript_big_gap.gif (21,820 bytes)   
longscript_small_gap.gif (20,232 bytes)   
longscript_small_gap.gif (20,232 bytes)   
testing_scripts.txt (12,570 bytes)   
Large gap:

ABCDE\c[char,4]\f[strike,1]12345

Small gap:

ABCDE\c[char,4] \f[strike,1]12345

No gap:

ABCDE\c[char,4]12345




Large gaps, very broken as it repeatedly crosses the word wrap point:

\0\f[name,MS Gothic]We should get pizza for dinner\![quicksection,1]\_w[2000]\c[char,16]\f[strike,1]p\f[strike,0]izza for dinner\_w[100]\c[char,16]\f[strike,1]pi\f[strike,0]zza for dinner\_w[100]\c[char,16]\f[strike,1]piz\f[strike,0]za for dinner\_w[100]\c[char,16]\f[strike,1]pizz\f[strike,0]a for dinner\_w[100]\c[char,16]\f[strike,1]pizza\f[strike,0] for dinner\_w[100]\c[char,16]\f[strike,1]pizza \f[strike,0]for dinner\_w[100]\c[char,16]\f[strike,1]pizza f\f[strike,0]or dinner\_w[100]\c[char,16]\f[strike,1]pizza fo\f[strike,0]r dinner\_w[100]\c[char,16]\f[strike,1]pizza for\f[strike,0] dinner\_w[100]\c[char,16]\f[strike,1]pizza for \f[strike,0]dinner\_w[100]\c[char,16]\f[strike,1]pizza for d\f[strike,0]inner\_w[100]\c[char,16]\f[strike,1]pizza for di\f[strike,0]nner\_w[100]\c[char,16]\f[strike,1]pizza for din\f[strike,0]ner\_w[100]\c[char,16]\f[strike,1]pizza for dinn\f[strike,0]er\_w[100]\c[char,16]\f[strike,1]pizza for dinne\f[strike,0]r\_w[100]\c[char,16]\f[strike,1]pizza for dinner\f[strike,0]\_w[100]\_w[500]\![quicksection,0] hotdogs for dinner\![quicksection,1]\_w[2000]\c[char,18]\f[strike,1]h\f[strike,0]otdogs for dinner\_w[100]\c[char,18]\f[strike,1]ho\f[strike,0]tdogs for dinner\_w[100]\c[char,18]\f[strike,1]hot\f[strike,0]dogs for dinner\_w[100]\c[char,18]\f[strike,1]hotd\f[strike,0]ogs for dinner\_w[100]\c[char,18]\f[strike,1]hotdo\f[strike,0]gs for dinner\_w[100]\c[char,18]\f[strike,1]hotdog\f[strike,0]s for dinner\_w[100]\c[char,18]\f[strike,1]hotdogs\f[strike,0] for dinner\_w[100]\c[char,18]\f[strike,1]hotdogs \f[strike,0]for dinner\_w[100]\c[char,18]\f[strike,1]hotdogs f\f[strike,0]or dinner\_w[100]\c[char,18]\f[strike,1]hotdogs fo\f[strike,0]r dinner\_w[100]\c[char,18]\f[strike,1]hotdogs for\f[strike,0] dinner\_w[100]\c[char,18]\f[strike,1]hotdogs for \f[strike,0]dinner\_w[100]\c[char,18]\f[strike,1]hotdogs for d\f[strike,0]inner\_w[100]\c[char,18]\f[strike,1]hotdogs for di\f[strike,0]nner\_w[100]\c[char,18]\f[strike,1]hotdogs for din\f[strike,0]ner\_w[100]\c[char,18]\f[strike,1]hotdogs for dinn\f[strike,0]er\_w[100]\c[char,18]\f[strike,1]hotdogs for dinne\f[strike,0]r\_w[100]\c[char,18]\f[strike,1]hotdogs for dinner\f[strike,0]\_w[100]\_w[500]\![quicksection,0] chicken for dinner.\![quicksection,1]\_w[2000]\c[char,19]\f[underline,1]c\f[underline,0]hicken for dinner.\_w[100]\c[char,19]\f[underline,1]ch\f[underline,0]icken for dinner.\_w[100]\c[char,19]\f[underline,1]chi\f[underline,0]cken for dinner.\_w[100]\c[char,19]\f[underline,1]chic\f[underline,0]ken for dinner.\_w[100]\c[char,19]\f[underline,1]chick\f[underline,0]en for dinner.\_w[100]\c[char,19]\f[underline,1]chicke\f[underline,0]n for dinner.\_w[100]\c[char,19]\f[underline,1]chicken\f[underline,0] for dinner.\_w[100]\c[char,19]\f[underline,1]chicken \f[underline,0]for dinner.\_w[100]\c[char,19]\f[underline,1]chicken f\f[underline,0]or dinner.\_w[100]\c[char,19]\f[underline,1]chicken fo\f[underline,0]r dinner.\_w[100]\c[char,19]\f[underline,1]chicken for\f[underline,0] dinner.\_w[100]\c[char,19]\f[underline,1]chicken for \f[underline,0]dinner.\_w[100]\c[char,19]\f[underline,1]chicken for d\f[underline,0]inner.\_w[100]\c[char,19]\f[underline,1]chicken for di\f[underline,0]nner.\_w[100]\c[char,19]\f[underline,1]chicken for din\f[underline,0]ner.\_w[100]\c[char,19]\f[underline,1]chicken for dinn\f[underline,0]er.\_w[100]\c[char,19]\f[underline,1]chicken for dinne\f[underline,0]r.\_w[100]\c[char,19]\f[underline,1]chicken for dinner\f[underline,0].\_w[100]\c[char,19]\f[underline,1]chicken for dinner.\f[underline,0]\_w[100]\_w[500]\![quicksection,0]



Small gap, again gets very broken as it crosses the word wrap point:

\0\f[name,MS Gothic]We should get pizza for dinner\![quicksection,1]\_w[2000]\c[char,16] \f[strike,1]p\f[strike,0]izza for dinner\_w[100]\c[char,16]\f[strike,1]pi\f[strike,0]zza for dinner\_w[100]\c[char,16]\f[strike,1]piz\f[strike,0]za for dinner\_w[100]\c[char,16]\f[strike,1]pizz\f[strike,0]a for dinner\_w[100]\c[char,16]\f[strike,1]pizza\f[strike,0] for dinner\_w[100]\c[char,16]\f[strike,1]pizza \f[strike,0]for dinner\_w[100]\c[char,16]\f[strike,1]pizza f\f[strike,0]or dinner\_w[100]\c[char,16]\f[strike,1]pizza fo\f[strike,0]r dinner\_w[100]\c[char,16]\f[strike,1]pizza for\f[strike,0] dinner\_w[100]\c[char,16]\f[strike,1]pizza for \f[strike,0]dinner\_w[100]\c[char,16]\f[strike,1]pizza for d\f[strike,0]inner\_w[100]\c[char,16]\f[strike,1]pizza for di\f[strike,0]nner\_w[100]\c[char,16]\f[strike,1]pizza for din\f[strike,0]ner\_w[100]\c[char,16]\f[strike,1]pizza for dinn\f[strike,0]er\_w[100]\c[char,16]\f[strike,1]pizza for dinne\f[strike,0]r\_w[100]\c[char,16]\f[strike,1]pizza for dinner\f[strike,0]\_w[100]\_w[500]\![quicksection,0] hotdogs for dinner\![quicksection,1]\_w[2000]\c[char,18] \f[strike,1]h\f[strike,0]otdogs for dinner\_w[100]\c[char,18]\f[strike,1]ho\f[strike,0]tdogs for dinner\_w[100]\c[char,18]\f[strike,1]hot\f[strike,0]dogs for dinner\_w[100]\c[char,18]\f[strike,1]hotd\f[strike,0]ogs for dinner\_w[100]\c[char,18]\f[strike,1]hotdo\f[strike,0]gs for dinner\_w[100]\c[char,18]\f[strike,1]hotdog\f[strike,0]s for dinner\_w[100]\c[char,18]\f[strike,1]hotdogs\f[strike,0] for dinner\_w[100]\c[char,18]\f[strike,1]hotdogs \f[strike,0]for dinner\_w[100]\c[char,18]\f[strike,1]hotdogs f\f[strike,0]or dinner\_w[100]\c[char,18]\f[strike,1]hotdogs fo\f[strike,0]r dinner\_w[100]\c[char,18]\f[strike,1]hotdogs for\f[strike,0] dinner\_w[100]\c[char,18]\f[strike,1]hotdogs for \f[strike,0]dinner\_w[100]\c[char,18]\f[strike,1]hotdogs for d\f[strike,0]inner\_w[100]\c[char,18]\f[strike,1]hotdogs for di\f[strike,0]nner\_w[100]\c[char,18]\f[strike,1]hotdogs for din\f[strike,0]ner\_w[100]\c[char,18]\f[strike,1]hotdogs for dinn\f[strike,0]er\_w[100]\c[char,18]\f[strike,1]hotdogs for dinne\f[strike,0]r\_w[100]\c[char,18]\f[strike,1]hotdogs for dinner\f[strike,0]\_w[100]\_w[500]\![quicksection,0] chicken for dinner.\![quicksection,1]\_w[2000]\c[char,19] \f[underline,1]c\f[underline,0]hicken for dinner.\_w[100]\c[char,19]\f[underline,1]ch\f[underline,0]icken for dinner.\_w[100]\c[char,19]\f[underline,1]chi\f[underline,0]cken for dinner.\_w[100]\c[char,19]\f[underline,1]chic\f[underline,0]ken for dinner.\_w[100]\c[char,19]\f[underline,1]chick\f[underline,0]en for dinner.\_w[100]\c[char,19]\f[underline,1]chicke\f[underline,0]n for dinner.\_w[100]\c[char,19]\f[underline,1]chicken\f[underline,0] for dinner.\_w[100]\c[char,19]\f[underline,1]chicken \f[underline,0]for dinner.\_w[100]\c[char,19]\f[underline,1]chicken f\f[underline,0]or dinner.\_w[100]\c[char,19]\f[underline,1]chicken fo\f[underline,0]r dinner.\_w[100]\c[char,19]\f[underline,1]chicken for\f[underline,0] dinner.\_w[100]\c[char,19]\f[underline,1]chicken for \f[underline,0]dinner.\_w[100]\c[char,19]\f[underline,1]chicken for d\f[underline,0]inner.\_w[100]\c[char,19]\f[underline,1]chicken for di\f[underline,0]nner.\_w[100]\c[char,19]\f[underline,1]chicken for din\f[underline,0]ner.\_w[100]\c[char,19]\f[underline,1]chicken for dinn\f[underline,0]er.\_w[100]\c[char,19]\f[underline,1]chicken for dinne\f[underline,0]r.\_w[100]\c[char,19]\f[underline,1]chicken for dinner\f[underline,0].\_w[100]\c[char,19]\f[underline,1]chicken for dinner.\f[underline,0]\_w[100]\_w[500]\![quicksection,0]




Aosora code that makes the above (note the commented section which can be uncommented to get the second result):

talk OnTest
{
	\f[name,MS Gothic]We should get {style("strike","pizza for dinner")} {style("strike","hotdogs for dinner")} {style("underline","chicken for dinner.")}
}

function style(type, word, wait, strokewait, newwait)
{
	if (type.IsNull()) return;
	if (word.IsNull()) return;
	
	local pause = "\_w[2000]";
	if (!wait.IsNull()) pause = "\_w[{wait}]";
	
	local strokepause = "\_w[100]";
	if (!strokewait.IsNull()) strokepause = "\_w[{strokewait}]";
	
	local newpause = "\_w[500]";
	if (!newwait.IsNull()) newpause = "\_w[{newwait}]";
	
	local len = word.length;
	local erase = "\c[char,{len}]";
	
	local output = "";
	
	output += word;
	output += "\![quicksection,1]";
	output += pause;
	
	for (local i = 0; i < len; i++)
	{
		output += erase;
		//if (i == 0) output += " "; //Uncomment to get the small gaps version
		output += "\f[{type},1]";
		output += word.Substring(0,i + 1);
		output += "\f[{type},0]";
		output += word.Substring(i + 1);
		output += strokepause;
	}
	output += newpause;
	output += "\![quicksection,0]";
	
	
	return output;
}



Alternate version of the tester script with \n tags, which get erased when they shouldn't:

talk OnTest
{
	\f[name,MS Gothic]We should get {style("strike","pizza for dinner")}\n{style("strike","hotdogs for dinner")}\n{style("underline","chicken for dinner.")}
}

Which produces this:

\0\f[name,MS Gothic]We should get pizza for dinner\![quicksection,1]\_w[2000]\c[char,16] \f[strike,1]p\f[strike,0]izza for dinner\_w[100]\c[char,16]\f[strike,1]pi\f[strike,0]zza for dinner\_w[100]\c[char,16]\f[strike,1]piz\f[strike,0]za for dinner\_w[100]\c[char,16]\f[strike,1]pizz\f[strike,0]a for dinner\_w[100]\c[char,16]\f[strike,1]pizza\f[strike,0] for dinner\_w[100]\c[char,16]\f[strike,1]pizza \f[strike,0]for dinner\_w[100]\c[char,16]\f[strike,1]pizza f\f[strike,0]or dinner\_w[100]\c[char,16]\f[strike,1]pizza fo\f[strike,0]r dinner\_w[100]\c[char,16]\f[strike,1]pizza for\f[strike,0] dinner\_w[100]\c[char,16]\f[strike,1]pizza for \f[strike,0]dinner\_w[100]\c[char,16]\f[strike,1]pizza for d\f[strike,0]inner\_w[100]\c[char,16]\f[strike,1]pizza for di\f[strike,0]nner\_w[100]\c[char,16]\f[strike,1]pizza for din\f[strike,0]ner\_w[100]\c[char,16]\f[strike,1]pizza for dinn\f[strike,0]er\_w[100]\c[char,16]\f[strike,1]pizza for dinne\f[strike,0]r\_w[100]\c[char,16]\f[strike,1]pizza for dinner\f[strike,0]\_w[100]\_w[500]\![quicksection,0] hotdogs for dinner\![quicksection,1]\_w[2000]\c[char,18] \f[strike,1]h\f[strike,0]otdogs for dinner\_w[100]\c[char,18]\f[strike,1]ho\f[strike,0]tdogs for dinner\_w[100]\c[char,18]\f[strike,1]hot\f[strike,0]dogs for dinner\_w[100]\c[char,18]\f[strike,1]hotd\f[strike,0]ogs for dinner\_w[100]\c[char,18]\f[strike,1]hotdo\f[strike,0]gs for dinner\_w[100]\c[char,18]\f[strike,1]hotdog\f[strike,0]s for dinner\_w[100]\c[char,18]\f[strike,1]hotdogs\f[strike,0] for dinner\_w[100]\c[char,18]\f[strike,1]hotdogs \f[strike,0]for dinner\_w[100]\c[char,18]\f[strike,1]hotdogs f\f[strike,0]or dinner\_w[100]\c[char,18]\f[strike,1]hotdogs fo\f[strike,0]r dinner\_w[100]\c[char,18]\f[strike,1]hotdogs for\f[strike,0] dinner\_w[100]\c[char,18]\f[strike,1]hotdogs for \f[strike,0]dinner\_w[100]\c[char,18]\f[strike,1]hotdogs for d\f[strike,0]inner\_w[100]\c[char,18]\f[strike,1]hotdogs for di\f[strike,0]nner\_w[100]\c[char,18]\f[strike,1]hotdogs for din\f[strike,0]ner\_w[100]\c[char,18]\f[strike,1]hotdogs for dinn\f[strike,0]er\_w[100]\c[char,18]\f[strike,1]hotdogs for dinne\f[strike,0]r\_w[100]\c[char,18]\f[strike,1]hotdogs for dinner\f[strike,0]\_w[100]\_w[500]\![quicksection,0]\nchicken for dinner.\![quicksection,1]\_w[2000]\c[char,19] \f[underline,1]c\f[underline,0]hicken for dinner.\_w[100]\c[char,19]\f[underline,1]ch\f[underline,0]icken for dinner.\_w[100]\c[char,19]\f[underline,1]chi\f[underline,0]cken for dinner.\_w[100]\c[char,19]\f[underline,1]chic\f[underline,0]ken for dinner.\_w[100]\c[char,19]\f[underline,1]chick\f[underline,0]en for dinner.\_w[100]\c[char,19]\f[underline,1]chicke\f[underline,0]n for dinner.\_w[100]\c[char,19]\f[underline,1]chicken\f[underline,0] for dinner.\_w[100]\c[char,19]\f[underline,1]chicken \f[underline,0]for dinner.\_w[100]\c[char,19]\f[underline,1]chicken f\f[underline,0]or dinner.\_w[100]\c[char,19]\f[underline,1]chicken fo\f[underline,0]r dinner.\_w[100]\c[char,19]\f[underline,1]chicken for\f[underline,0] dinner.\_w[100]\c[char,19]\f[underline,1]chicken for \f[underline,0]dinner.\_w[100]\c[char,19]\f[underline,1]chicken for d\f[underline,0]inner.\_w[100]\c[char,19]\f[underline,1]chicken for di\f[underline,0]nner.\_w[100]\c[char,19]\f[underline,1]chicken for din\f[underline,0]ner.\_w[100]\c[char,19]\f[underline,1]chicken for dinn\f[underline,0]er.\_w[100]\c[char,19]\f[underline,1]chicken for dinne\f[underline,0]r.\_w[100]\c[char,19]\f[underline,1]chicken for dinner\f[underline,0].\_w[100]\c[char,19]\f[underline,1]chicken for dinner.\f[underline,0]\_w[100]\_w[500]\![quicksection,0]
testing_scripts.txt (12,570 bytes)   

Activities

Add Note

View Status
Note
Upload Files
Maximum size: 1,953 KiB

Attach files by dragging & dropping, selecting or pasting them.

送信ボタンを押す前に / Before pushing "Send" button

  • スパム避けのためにパスワードが必要です。送信ボタンを押すとユーザー名とパスワードを聞かれますので、それぞれ "bts" と入力してください。
  • To send report, please input "bts" into username and password box in popup dialog.

Issue History

Date Modified Username Field Change
2026-06-22 01:11 guest New Issue
2026-06-22 01:11 guest File Added: shortscript_no_gap.gif
2026-06-22 01:11 guest File Added: shortscript_big_gap.gif
2026-06-22 01:11 guest File Added: shortscript_small_gap.gif
2026-06-22 01:11 guest File Added: longscript_big_gap.gif
2026-06-22 01:11 guest File Added: longscript_small_gap.gif
2026-06-22 01:11 guest File Added: testing_scripts.txt