Interesting, and potentially useful as well. (at the least, on a dual monitor, it can function as a log reader! LOL)
Just a thought, using the log reader as a core, it could potentially be redesigned as a general framework log reader, which parses the log messages back into events, and allow other modules to add resource actions (like playsound, run an indepedent hack util to pause game, or run a special script that sends out analog system via the old serial port pins which will make your coffee-maker brew a new cup of code-fuel).
Then a settings profile is a map of certain events to certain actions, where a general interface (even edit text file will do) could be provided to allow user to easily add/modify hookups (a single event could invoke multiple actions, just as different events could invoke the same action)
It definitely has potential
following is an example of what I meant.... (via mock ups)
And event file describes the parsing of messages into events. This is large static for common events(but can have user-customized events)
<events>
<event>
<id>RAIN_START</id>
<pattern>It has started raining.</pattern>
</event>
<event>
<id>KITTEN BORN</id>
<name>Cat multiplies</name><!--optional-->
<desc>Time to pack-cage for export before it mind-controls dwarves</desc><!--optional-->
<pattern>(?:.)+ has given birth to (?:a )?kitten(?:s)?.</pattern>
</event>
<event>
<id>TASK_COMPLETED</id>
<pattern="([^(])+ \((\d+)\) has been completed.">
<param name="task">$1</param> <!-- put the task type into event param "task" -->
<param name="number">$2</param> <!-- put the task number into param "number" -->
</pattern>
</event>
</events>
Event mappings maps events to actions, with potential advance conditions, or just a simply just a event vs action matrix of checkbox
<eventmappings>
<eventmapping>
<desc>Raining or kittens or both</desc>
<cond event="RAIN_START" />
<cond event="KITTEN_BORN" />
<!-- changes the background sound loop -->
<action command="playsound" channel="background" loop="yes" src="raining_cats_and_dogs.mp3" fadein="true" fadetime="2s" />
<!-- and the same time, play another sound in a channel designated "main", interrupting any presently playing sound -->
<action command="playsound" channel="main" src="cat_mew.mp3" />
</eventmapping>
<mapping>
<desc>Adamantine task completed</name>
<cond event="TASK_COMPLETED" check="contains(param['task'],'adamantine')"/>
<action command="pausegame"/> <!-- uses a fake module that can pause DF-->
<!-- the following will play a sound without stopping other sound channels -->
<action command="playsound" src="fanfare.mp3"/>
</eventmapping>
</eventmappings>
actions e.g. "playsound" or "pausegame" are either supplied by the core app, or potentially via external "plugins" or even just via executing system commands directly to hack-utils that have command-line mode