This script can turn a list of individual lines of text into a left or right aligned floating text display.
// V1 //
// SetTextAlign // Begin //
// Thank you to Silicon Plunkett for the "samples" the script uses to measure the width of the strings.
// He made a great effort to work these values out and I would have been at a massive disadvantage without them.
// This may never have existed.
string SetTextAlign(integer A, integer D, list S)
{
list samples = [" ", "![]{}|:;'.,ijlIJ", "\/<>`()rtf", "*#\"yszxcvETYLZ", "_?upahkbnRPAFKCV", "~$^+qeodgmDB", "w=QUOSGHXN", "%WM", "@"];
list result = [];
string separate = "";
if(A)
{
list scores = [];
list scores_max = [];
string line = "";
string sample = "";
string letter = "";
string spaces = "";
string to_pad = "";
float score = 0.0;
float max_score = 0.0;
float next = 0.0;
integer length = 0;
integer s_length = 0;
integer count = 0;
integer count_a = 0;
integer count_b = 0;
integer count_c = 0;
integer ssi = 0;
integer padem = 0;
integer space_count = 0;
separate = "\n";
length = llGetListLength(S);
do
{
line = llList2String(S, count);
s_length = llStringLength(line);
count_a = 0;
score = 0.0;
do
{
letter = llGetSubString(line, count_a, count_a);
count_b = 0;
do
{
count_c = 0;
do
{
sample = llList2String(samples, count_c);
ssi = llSubStringIndex(sample, letter);
if(ssi != -1)
{
if(count_c == 0)
score += 1.0;
else if(count_c == 1)
score += 1.5;
else if(count_c == 2)
score += 2.0;
else if(count_c == 3)
score += 2.5;
else if(count_c == 4) // Thanx to some advice from a veritable genius ( Xzaviar Qarnac ) -
score += 3.0; // - I have realised something very important about loops.
else if(count_c == 5) // Since this realization I have cut out alot of potential drag.
score += 3.5; // Thank you Xzaviar.
else if(count_c == 6)
score += 4.0;
else if(count_c == 7)
score += 4.5;
else
score += 5.0;
count_c = 9; // This line is what I realized was needed.
}
}
while((++count_c) < 9);
}
while((++count_b) < 1);
}
while((++count_a) < s_length);
scores += [score];
}
while((++count) < length);
scores_max = llListSort(scores, 1, FALSE);
max_score = llList2Float(scores_max, padem);
scores_max = [];
do
{
next = llList2Float(scores, padem);
spaces = "";
space_count = 0;
do
{
spaces += " ";
}
while((((float)(++space_count)) + next) < max_score);
to_pad = llList2String(S, padem);
if(D)
result += [(to_pad + spaces)];
else
result += [(spaces + to_pad)];
}
while((++padem) < length);
scores = [];
}
else
result = S;
return llDumpList2String(result, separate);
}
// SetTetAlign // End //
default
{
state_entry()
{
float alpha = 1.0;
vector color = <0.0,1.0,1.0>; // Turquoise!
// The text to display must be fed to the function as a list of strings each being one line (as below).
list source = ["Hello there, Avatar!", "My script can align your text to the left or right.", "Touch me for a copy of it."];
llSetText(SetTextAlign(TRUE, TRUE, source), color, alpha);
// SetTextAlign(Align (TRUE or FALSE), Direction (TRUE = left : FALSE = right), source).
}
touch_start(integer nd)
{
integer countnd = 0;
do
{
key toucher = llDetectedKey(countnd);
llGiveInventory(toucher, llGetScriptName()); // FREE!!! Enjoy.
}
while((++countnd) < nd);
}
}