Alright, I have tweaked the code such that there are no timers. It kind of freezes the gameplay while the String is being processed (moreso if it's a big string), but it doesn't crash.

INIT

You can change CHARACTER_Player1 to whichever character you want to be displaying the text.
There needs to be Localization files that have each letter defined as itself.

Code
DB_MainCharacter(CHARACTER_Player1);


DB_SingleLetter("A", 1);
DB_SingleLetter("B", 2);
DB_SingleLetter("C", 3);
DB_SingleLetter("D", 4);
DB_SingleLetter("E", 5);
DB_SingleLetter("F", 6);
DB_SingleLetter("G", 7);
DB_SingleLetter("H", 8);
DB_SingleLetter("I", 9);
DB_SingleLetter("J", 10);
DB_SingleLetter("K", 11);
DB_SingleLetter("L", 12);
DB_SingleLetter("M", 13);
DB_SingleLetter("N", 14);
DB_SingleLetter("O", 15);
DB_SingleLetter("P", 16);
DB_SingleLetter("Q", 17);
DB_SingleLetter("R", 18);
DB_SingleLetter("S", 19);
DB_SingleLetter("T", 20);
DB_SingleLetter("U", 21);
DB_SingleLetter("V", 22);
DB_SingleLetter("W", 23);
DB_SingleLetter("X", 24);
DB_SingleLetter("Y", 25);
DB_SingleLetter("Z", 26);

DB_SingleLetter("a",27);
DB_SingleLetter("b",28);
DB_SingleLetter("c",29);
DB_SingleLetter("d",30);
DB_SingleLetter("e",31);
DB_SingleLetter("f",32);
DB_SingleLetter("g",33);
DB_SingleLetter("h",34);
DB_SingleLetter("i",35);
DB_SingleLetter("j",36);
DB_SingleLetter("k",37);
DB_SingleLetter("l",38);
DB_SingleLetter("m",39);
DB_SingleLetter("n",40);
DB_SingleLetter("o",41);
DB_SingleLetter("p",42);
DB_SingleLetter("q",43);
DB_SingleLetter("r",44);
DB_SingleLetter("s",45);
DB_SingleLetter("t",46);
DB_SingleLetter("u",47);
DB_SingleLetter("v",48);
DB_SingleLetter("w",49);
DB_SingleLetter("x",50);
DB_SingleLetter("y",51);
DB_SingleLetter("z",52);

DB_SingleLetter(" ",53);
DB_SingleLetter("1",54);
DB_SingleLetter("2",55);
DB_SingleLetter("3",56);
DB_SingleLetter("4",57);
DB_SingleLetter("5",58);
DB_SingleLetter("6",59);
DB_SingleLetter("7",60);
DB_SingleLetter("8",61);
DB_SingleLetter("9",62);
DB_SingleLetter("0",63);
DB_SingleLetter(".",64);
DB_SingleLetter(",",65);
DB_SingleLetter("?",66);
DB_SingleLetter("!",67);



KB Section

Code
PROC
StringSplit((STRING)_string)
THEN
ClearResults();
ClearSynchro();
ClearCurrent();
SS_ClearCounter();
SS_Current("");
SS_MinCounter(0);
SS_Forward(_string, 0);
SS_Backward(_string, -1);
DisplayResult();

PROC
DisplayResult()
AND
SS_MinCounter(_counter)
THEN
SS_DisplayResult(_counter);

PROC
SS_DisplayResult((INTEGER)_counter)
AND
DB_MainCharacter(_player)
AND
DB_Result(_str, _counter)
AND
IntegerSum(_counter, 1, _nextCounter)
THEN
CharacterDisplayText(_player, _str);
SS_DisplayResult(_nextCounter);


PROC
ClearResults()
AND
DB_Result(_char, _counter)
THEN
NOT DB_Result(_char, _counter);

PROC
SS_ClearCounter()
AND
SS_MinCounter(_counter)
THEN
NOT SS_MinCounter(_counter);


PROC
ClearSynchro()
AND
SS_Synchro(_val)
THEN
NOT SS_Synchro(_val);

PROC
ClearCurrent()
AND
SS_Current(_str)
THEN
NOT SS_Current(_str);

PROC
SS_Forward((STRING)_string, (INTEGER)_counter)
AND
NOT SS_Synchro(_counter)
AND
DB_SingleLetter(_char, _)
AND
SS_Current(_current)
AND
StringConcatenate(_current, _char, _test)
AND
StringContains(_string, _test, _result)
AND
_result > 0
AND
IntegerSum(_counter, 1, _nextCounter)
AND
DB_MainCharacter(_player)
THEN
SS_Synchro(_counter);
ClearCurrent();
SS_Current(_test);
DB_Result(_char, _counter);
SS_Forward(_string, _nextCounter);


PROC
SS_Backward((STRING)_string, (INTEGER)_counter)
AND
NOT SS_Synchro(_counter)
AND
SS_Current(_current)
AND
DB_SingleLetter(_char, _)
AND
StringConcatenate(_char, _current, _test)
AND
StringContains(_string, _test, _result)
AND
_result > 0
AND
IntegerSubtract(_counter, 1, _nextCounter)
AND
DB_MainCharacter(_player)
THEN
SS_Synchro(_counter);
ClearCurrent();
SS_Current(_test);
DB_Result(_char, _counter);
SS_ClearCounter();
SS_MinCounter(_counter);
SS_Backward(_string, _nextCounter);



Just call the function StringSplit((STRING)_str) and it'll output the String, one letter per line.

--------

I have also created a Utility script that converts Integers into Strings. I'm not completely sure where this could be useful yet, but it works.


Code
INIT

DB_Digit(1, "1");
DB_Digit(2, "2");
DB_Digit(3, "3");
DB_Digit(4, "4");
DB_Digit(5, "5");
DB_Digit(6, "6");
DB_Digit(7, "7");
DB_Digit(8, "8");
DB_Digit(9, "9");
DB_Digit(0, "0");


KB

PROC
ITS_MakeResult((STRING)_val)
THEN
ClearResults();
DB_Result(_val);

PROC
ClearResults()
AND
DB_Result(_val)
THEN
NOT DB_Result(_val);

PROC
IntegerToString((INTEGER)_int)
THEN
ITS_DivideByTen(_int, "");

PROC
ITS_DivideByTen((INTEGER)_int,(STRING)_str)
AND
IntegerDivide(_int, 10, _quot)
AND
_quot < 1
THEN
ITS_GetDigit(_int, _str);

PROC
ITS_DivideByTen((INTEGER)_int,(STRING)_str)
AND
IntegerDivide(_int, 10, _quot)
AND
_quot > 0
AND
IntegerModulo(_int, 10, _ret)
AND
DB_Digit(_ret, _aStr)
AND
StringConcatenate(_aStr, _str, _nStr)
THEN
ITS_DivideByTen(_quot, _nStr);

PROC
ITS_GetDigit((INTEGER)_int, (STRING)_str)
AND
DB_Digit(_int, _ITS)
AND
StringConcatenate(_ITS, _str, _finalString)
THEN
ITS_MakeResult(_finalString);



For this one you need to call IntegerToString((INTEGER)_int), and it will store the result into DB_Result((STRING)_num). I used this code to test it out, for example:

Code
IF
CharacterUsedSkill(CHARACTER_Player1, _, _)
THEN
IntegerToString(9001);
CheckResult();


PROC
CheckResult()
AND
DB_Result("9001")
THEN
PartyAddExperience(9001);



Edit:
You can combine the two scripts to output unknown Integer variables, with the result of the IntegerToString function being passed into the StringSplit function.