you could just add a single object to each scene containing the speech bubble image inside of an animation with infinite loop set. you can then reposition & fade in the animation as needed. it will bypass the cuts scene issue that way.
As for characters you can store the owner of the text into a variable which can then be included inside of the getObject characters square brackets thing like so...
char = text:getLink(VTextOwner):getName() -- get name of text owner
char = getObject("Characters[" .. char .. "]") -- replace char with getObject Character instead.
As for all of your local variables... you either want to define them outside of the function or create a temporary table instead as each time you call local variable inside of a function you are creating a new table as opposed to overwriting the old one.
here is a temporary table example...
-- incrementing table
table_name = {}
table_name["_temporary_"] = ""
table_name[1] = getObject("Characters[hero]")
table_name[2] = {x = 300, y = 500}
-- example on how you would include this data in something.
table_name[1]:setValue(VCharacterPosition, table_name[2])
-- or
table_name[1]:setValue(VCharacterPosition, {x = table_name[2].x, y = table_name[2].y})
-- key_name table
table_name = {}
table_name["_temporary_"] = ""
table_name["char"] = game:getLink(VGameCurrentCharacter)
table_name["a"] = ...
-- example on how you would include this data in something
print("name of current character: " .. table_name["char"]:getName())
the other thing I was talking about would be done by setting up the variables that will contain data that will always be the same at the beginning of your script, above the function & anything that will contain data that gets updated as an empty variable.
you can define blank variables like so...
local var, char, a, b, etc -- these are empty but can now be used inside of functions
Hopefully some of this will help you a little bit.
& about the character scaling thing. you can not access the VCharacterSize data entry until you have upgraded to V4.0 & it will be accessed like so...
getObject("Characters[name]"):getFloat(VCharacterSize) -- returns character size including .decimal value - you would need to use the Lua string function to trim out the decimal point & characters after it - if required.