[quote="Ashley":ypm3073b]It's a tricky area... what do you think should happen? Do you think the current system (capped at once per tick) is OK?[/quote:ypm3073b]
I can't really think of any good way for Construct to try and handle such a situation, other than how it does now. Since it really depends upon what one is doing at each interval, I don't think that there can be a catch-all solution.
I would implement a variation of TimeDelta, as a function, which would report the time elapsed since the last call. Like so:
[code:ypm3073b]+ Function: On function "TimePeriodDelta"
+ System: Is global variable 'previousTime' Different to 0
-> System: Set global variable 'currentTime' to Timer
-> Function: Set return value to (global('currentTime') - global('previousTime')) / Function.Param(1)
-> System: Set global variable 'previousTime' to global('currentTime')
+ System: Else
-> System: Set global variable 'previousTime' to Timer
-> Function: Set return value to 0[/code:ypm3073b]
This uses two globals, though it would also be good enough without 'currentTime', and accessing the Timer twice instead of once. Anyway, the first time it's called, it returns zero and starts counting time, then every call after will return the difference since last call. It takes one parameter, which the difference in milliseconds is divided by. Pass it the value 1 and it will return milliseconds, or pass it the same interval as your 'every ... milliseconds' condition, and the desired result would be one.
For instance, for a '5 damage per 50ms' event, I pass the function 50, using it in expression form as a multiplier for the desired damage. Much like the TimeDelta.
[code:ypm3073b]+ System: Every 50 milliseconds
-> System: Subtract 5 * Function.TimePeriodDelta(50) from global variable 'Health'[/code:ypm3073b]
I think a built-in such as this could be useful, but it's not difficult to implement anyway.
I made a simple .cap to test this, which simply appends each result into an EditBox. I did get some odd intervals with low fixed frame rates.