View Issue Details
| Category | |||||
|---|---|---|---|---|---|
| SSPBT:本体(SSP) | |||||
| Severity | minor | Reproducibility | always | ||
| Status | new | ||||
| Summary | 0000790: Odd behavior of \c[char] tag | ||||
| Description | I 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 | 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] | ||||
| 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 |