This is a great module. I wanted think bubble to work also so I looked at how this was working and you had "//TODO" with no code for the thinkBubble function so I added the following code into the think bubble routine and it worked great.
It is basically calling the say bubble function but passing a false to the renderBubble32 function to change the tail.
// TODO
void ThinkBubble(this Character*, String message, GUI* bubbleGui)
{
if(message == null) return;
if(!game.bgspeech_stay_on_display)
_stopAllBackgroundBubbles();
if((Speech.VoiceMode == eSpeechVoiceOnly && hasVoiceClip(message)) || message == "...")
this.SB_sayImpl(message);
else
{
DynamicSprite* bubbleSprite = this.renderBubble32(message, false);
// Position bubble over character head
int x = this.x - GetViewportX() - bubbleSprite.Width/2;
x = _clampInt(x, 0, System.ViewportWidth - bubbleSprite.Width);
int y = this.y - GetViewportY() - bubbleSprite.Height - this.GetHeight() - (_heightOverHead - _talkTailHeight + 1);
y = _clampInt(y, 0, System.ViewportHeight - bubbleSprite.Height);
this.realSayAtBubble(x, y, message, bubbleGui, bubbleSprite);
}
}
I also wanted the think bubble to be a different color so I set the _backgroundColor at the top of the function to a different color then set it back at the bottom of the function.
Snarky, if you add this to your module as an enhancement make it where there is another property for Think Background Color.