Nice to see an online community with an actual sense of community, not just snark and backbiting.

WARNING! Long post ahead hope it makes sense.
[edit]
Also, with AGS's new ability to render dialog lines totally customized, one could script up something?
Yeah, I think that's how you'd have to do it, unless there's a custom dialog system out there you could adapt. There's two stages, as I see it, colouring the options differntly if they've been read (pretty easy), and KNOWING if they've been read or not (not so).
Firstly copy all the
custom dialog rendering functions from the manual, and change the colour/size/position/etc settings to suit. Then change a few lines in
dialog_options_render[code]
if (info.ActiveOptionID == i) info.Surface.DrawingColor = 13;
else info.Surface.DrawingColor = 4;
[/code]
to
[code]
if (info.ActiveOptionID == i) info.Surface.DrawingColor = 13;
else if (info.DialogToRender.HasOptionBeenChosen(i)) info.Surface.DrawingColor = game.read_dialog_option_color ;
else info.Surface.DrawingColor = 4;
[/code]
(Or the colours you actually want.)
HasOptionBeenChosen looks to be read only, so you'd need someway to get AND set the state.
[code]
bool OptRead[50000]; // Random number, based on 500 Dialogs (maximum) @ 100 topics each. Probably overkill.
bool SetUnread(this Dialog*, int Option) {
int optAbs = this.ID*100 + Option;
OptRead[optAbs] = false;
}
bool IsRead(this Dialog*, int Option) {
int optAbs = this.ID*100 + Option;
return OptRead[optAbs];
}
[/code]
Then you call
dTest.IsRead(1) instead of
dTest.HasOptionBeenChosen(1), and
dTest.SetUnread(1) to refresh it. The downside is keeping track of when options are clicked...
According to the manual the custom dialog rendering stuff is advanced scripting, so this probly doesn't belong here, but: How does AGS determine which option was actually clicked on?
dialog_options_get_active shows where the mouse is but not if it's been clicked, and
dialog_options_mouse_click seems to only deal with clicks NOT on any option (which sounds wrong for its name).
If you knew this, it'd be easy enough to automate setting whether an option is read or not. Without it, you might have to MANUALLY set each option to read in dialog script.
[edit]:
Thinking about it, you're probly not going to want to refresh ALL the topics in the game, are you? So manually setting refreshed topics back to read shouldn't be as much work as
manually setting EVERY topic to read, every time.
So what if you had three states, for unread/read/refreshed, instead of just read/unread. Make
OptRead an int and
setUnread/IsRead into functions (
SetUnread will also need to set the option AS read, or make another function for that) and it should be possible. Maybe set up an enum to make it easier to tell what the values mean. Then you add a check to the dialog rendering functions that sets the option as read if
HasOptionBeenChosen is true, and it's not marked unread.
[code]
if (info.DialogToRender.HasOptionBeenChosen(i) && info.DialogToRender.IsRead(i) != eOptMarkUnread) info.DialogToRender.SetUnread(i, eOptRead);
[/code]
Check
IsRead when you're setting the colours of the options. You'll also need to call
SetUnread in the refreshed option's dialog script to mark it as read again.