[Ohrrpgce] Script fibres/multitasking (again)

James Paige Bob at hamsterrepublic.com
Sun Sep 4 09:21:49 PDT 2016


I read this all, but I am going to have to read it all again later when I
don't have anyone shouting and poking me with lego giraffes ;)

I think before I will be able to provide helpful feedback, I will need to
internalize all this enough that I can understand now the implementation
can be broken into the smallest possible discreet steps. (A must be done
before we can do B, B must be done before we can do C and D, etc.)

I am excited about script multitasking. :)

---
James


On Sat, Sep 3, 2016 at 10:56 AM, Ralph Versteegen <teeemcee at gmail.com>
wrote:

>
> I was working on the new script intepreter, but got distracted and
> have now resumed work on script fibres/multitasking (turns out it's
> related to script profiling).  However the roadblock to working on this is
> that it requires making tricky decisions about how fibres will act, so
> prepare for rambling without concluding anything.
>
> [To recap: There will be multiple lists of script fibres
> (coroutines/green threads, each of which is a stack of called scripts
> that can 'wait' independently). Each group is ordered (the fibres run
> in a certain order until hitting a wait). There are at least two lists
> of fibres: the existing main group that runs before the game logic
> (hero, NPC movement, etc), and the "per-frame" group that runs
> immediately before drawing the screen (where you should put scripts
> for parallax and so forth). Battles will effectively also have
> separate fibre groups, though it would be equivalent to just suspend
> all out-of-battle fibres.]
>
> The big undecided issue is determining the order in which fibres execute
> and other issues with suspending them.
>
> Currently:
> 1) Newly triggered scripts pause all existing ones
> 2) Multiple scripts triggered on the same tick run in some order
>    according to historical accident, which is sometimes weird, like
>    on-keypress scripts running before the new game script, and the
>    priority of a map autorun script depends on how it is triggered
>    (new game, stepping on a door, use door textbox conditional,
>    "teleport to map" are all different!)
> 3) If a script is triggered due to something another does, like "use
>    menu item" or "advance textbox", then that script runs immediately.
> 4) But a script triggered while not already inside the script
>    interpreter doesn't run until the *next* tick, unless it's either
>    an on-keypress, menu item, or menu close script, which get
>    triggered early so run the same tick.
>
> In practice 2) and 4) don't seem to be that much of a problem, except
> for map autorun scripts.  The fact that those are delayed for a tick
> means we had to add the hacks of delaying music changes and screen
> fade ins by an extra tick to let the script run first, and made the
> queued fades cancellable.)  I also hate the fact that some game logic
> (that for user-editable menus) happens before the script interpreter,
> and everything else happens afterwards, which causes 4). Maybe that
> can be fixed at the same time.
>
> Translating behaviours 1) to 4) to fibres would mean that new fibres
> always get inserted at the front of the fibre group, and also that
> when a script gets triggered while inside the interpreter, the
> interpreter temporarily switches to that fibre until it waits before
> resuming the normal order. This would probably slightly reduce the
> difficulty of translating existing scripts to multitasking, because at
> least the order doesn't change.
>
> But since multitasking is a major change, it's an opportunity to
> switch to something more organised.  Since there will eventually be
> commands for reordering fibres anyway, we don't need to do more than
> provide a sane default.  The scheduling behaviours you might expect:
> - a script triggered to initialise something like a map or the game
>   should run before other scripts for that map.
> - if you have a whole lot of npc movement (AI) scripts, you probably
>   want them to all run together, rather than possibly some before and
>   some after a main logic loop script.  For example, the "create NPC"
>   command might start a new npc AI fibre, and you probably don't want
>   that to suspend your current script before you can even call "set
>   NPC position".
>   (In reality, it seems best if NPC scripts aren't started until the
>   engine does NPC movement processing)
> - a lot of scripts will be cutscenes, and want top priority, so they
>   can pause other fibres as needed
> - most scripts will just have an immediate effect, like incrementing a
>   global, and these should also have priority over already running
>   scripts like your main loop
>
> One solution might be to let you optionally assign numerical
> priorities to fibres, or otherwise (the default) it is set to always
> run before anything else. This could be an option in Custom next to
> every script trigger. Then, when a script is triggered:
> - if it has a numerical priority, insert it in the list of fibres in
>   the right spot.
> - if it doesn't, put it in the front
> - if we're already in the script interpreter, and it's ahead of the
>   current script, then as a special case this tick, immediately
>   execute it instead of delaying it for a tick.  Otherwise, we wait
>   until it gets its normal turn.
>
> Or maybe when a script is triggered, e.g. by a textbox, it should be
> run immediately instead of inserted into a fibre group to be run after
> the engine has finished its logic. If it waits rather than returning,
> it can go to the front of the main fibre group, to run before the
> engine logic next tick. This also gives the script 1 tick to place
> itself in some other fibre group or some other position in the order,
> and matches how you would expect an event-based game engine to
> work.
>
> But then there's the need to provide a way to transition an existing
> game with a lot of scripts depending on the current suspension
> behaviour to multitasking.  The solution I wrote on the wiki long ago
> (that page needs a major overhaul) is to add "blocking script" as an
> alternative to "plotscript". Only one blocking script can be active at
> a time.  And I guess only a blocking script would be delayed a tick
> instead of running immediately.
>
> And what about commands that cause implicit waits? It seems dubious to
> make them suspend all other script fibres too. It would be possible to
> add a backcompat bit to remove implicit waits (or combine it with
> the bit to enable multitasking, if any).
>
>
>
> _______________________________________________
> Ohrrpgce mailing list
> ohrrpgce at lists.motherhamster.org
> http://lists.motherhamster.org/listinfo.cgi/ohrrpgce-motherhamster.org
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.motherhamster.org/pipermail/ohrrpgce-motherhamster.org/attachments/20160904/3bbdc00d/attachment.htm>


More information about the Ohrrpgce mailing list