Warning, /games/kmuddy/DESIGN is written in an unsupported language. File is not indexed.

0002 This document describes the architectural changes in KMuddy, that will be done
0003 after KMuddy 1.0 is out (though some of these might be implemented sooner).
0004 It is by no means complete, and it's also a bit disorganized, so be careful ;)
0006 Many parts of this are already completed, and some are obsolete.
0009 ------------------
0010 This is how things should work:
0011 - [ expression ] - evaluate expression, put result
0012 - /expression - evaluate expression, ignore result
0013 - allow indentation in front of /
0014 - also option of aliases/... to strip leading spaces to allow better indenting
0015 - change old syntax and perhaps provide converter ( /set name value becomes /set("name","value") )
0016 - unify functions and macros - everything will be a function, some may simply return nothing relevant
0017 - speedwalk: make it simply a substitution for a new /walk(path) command
0018 - repeater: substitution for a /rep command, /rep must also parse its parameter as cCommand etc
0019 - new class cCommand that holds the parsed command, so we don't need ugly tricks
0020 - make ""s optional for single-word strings
0021 - ability to send a cCommand through an event, and actually use this in the command processing code
0022 - ability to have a script wait for a condition - other things will be executed in the meantime, until the condition is met
0023 - conditions: expression is true, variable is set to something, some time has elapsed, some number of lines has been received, a particular line is received, etc.; and /wait commands to match
0024 - provide/consume commands, consume will halt execution until a resource becomes available
0025 - foreach loop
0026 - better support for lists and arrays and such in scripting syntax, the functions work but are not very intuitive
0027 - ability to declare sub-routines and call them
0028 - change aliases to be actual anonymous sub-routines instead of being expanded directly into the command list
0029 - get rid of pseudo-variables, they're confusing and stupid, having aliases as subroutines will allow us to do that
0030 - subroutines will of course halt execution of caller until they're done, and then caller will continue execution
0031 - Kross: ability to define sub-routines in various scripting languages - requires testing to see how slow/fast this would be; also need access to variables etc.
0036 Basic structure
0037 ---------------
0038 lib/ - classes that are shared by KMuddy core and plug-ins
0039 lib/widgets - some commonly used widgets
0040 kmuddy/ - the core functionality
0041 kmuddy/dialogs - core dialogs
0042 plugins/ - plug-ins
0044 The lib/ directory contains classes that can be manipulated by plug-ins - displayer,
0045 ANSI parser, status line, preferences and so on...
0047 There must NOT be any dependencies on core in lib.
0050 --------
0051 The following plug-ins are to be considered base plug-ins - will be distributed
0052 together with KMuddy, as they provide important functionality...
0054 MULTILINE - multi-line edit (the separate one)
0055 TRANSCRIPT - basic transcript
0056 VARIABLES - GUI and macros for manipulating variables (the storage classes are in
0057   core)
0058 COMMANDS - many useful commands (/disp, /sysmsg, /quit, /status, ...)
0059 SCRIPTING - external scripting, variable server, /exec command
0061 These plug-ins are not so important, they might be distributed with KMuddy or
0062 separately, as determined later.
0064 ADVTRANSCRIPT - advanced transcript (maybe merge with TRANSCRIPT?)
0065 TIMERS - timer support, /rep
0066 STATISTICS - connection statistics
0067 COLORS - expand some sequences in user commands into ANSI color codes
0068 VARTRIG - triggers reacting on variable changes
0069 MXPTRIG - MXP-related stuff, special triggers mostly (MXP support is in core
0070     and libmxp)
0071 MAPPER - the mapper
0072 MATH - many math functions usable in expressions
0073 STRINGS - functions/macros for string manipulation
0074 FILES - functions/macros for file manipulation
0075 DB - database support
0077 Handling of lists and groups
0078 ----------------------------
0079 - all objects organizable into groups
0080 - some object groups need priorities, others don't
0081 - each object belongs to exactly one group
0082 - the list editor should be able to modify the groups
0083 - cSaveableList should be modified so that it contains a list of groups, each of them
0084   containing a list of objects (i.e. list of lists)
0085 - all that has to be loaded/saved
0086 - each group and object should know how to disable itself
0087 - list editor should have Enable/Disable button (or checkboxes near items or
0088   something), must be configurable (disabling a variable makes no sense)
0089 - separate group-management should no longer be needed
0091 Global/profile settings
0092 -----------------------
0093 Current way of having two methods per config option (get/set) is not very good.
0094 We should use another approach - a couple of mappings, one for each option type
0095 (int, bool, string, ...). When saving stuff, care should be taken not to mix two
0096 valueswith equal name, but different type (could be done by prepending/appending
0097 type-prefix/suffix to name, or by having one group per type). Everyone who wants
0098 some config-option should also provide default value, returned if such option
0099 hasn't been set yet.
0101 Managing aliases/trgigers/groups via input-line
0102 -----------------------------------------------
0103 Macros should be provided to allow adding/modifying/deleting/(de)activating of stuff.
0104 TODO: those macros
0106 storing session-related data in plug-ins
0107 ----------------------------------------
0108 method 1: map<cSession *, cDataStorage *> data; - for data that should not be saved
0109 method 2: storing in cConnPrefs - if that data has to be remembered between sessions
0111 saving lists/larger data/... in plug-ins (to a separate file)
0112 -------------------------------------------------------------
0113 cConnPrefs knows current profile name - add methods to return path where configfile
0114 should be written.
0115 Profile import/export has to be modified to support those files! (currently it
0116 has a fixed list of files to export/import)
0118 syncing dialogs
0119 ---------------
0120 - lists should emit some signal, whenever a change occurs, so that dialogs can be
0121 kept in sync (triggers can alter stuff with the new macros, even if the dialogs
0122 are modal (so there's no reason to have those dlgs modal)
0124 Triggers and scripting
0125 ----------------------
0126  SEE FORUMS :)
0128 Events/actions
0129 --------------
0130 Many objects will be capable of registering themselves with an event/action
0131 class. Here they will be allowed to publish method calls and register events
0132 that they can trigger. Some plug-in wil then provide functions to call those
0133 methods and also to call some command(s) when some event fires off.
0134 Most things shall be based on these events - e.g. timers will be hooked to
0135 some timeout event, alias/trigger processing will also be based on some event
0136 (with help of the calling class - we need to set some flags about things like
0137 gagging and so).
0138 Some priorities for event handlers may need to be introduced.
0139 There could be an entire module that would allow the user to hook their macros
0140 on various events; it may also provide something like /invokeevent to allow
0141 hooking on custom events (something like /notify for external scripts).
0143 Custom commands and functions
0144 -----------------------------
0145 There will be some plug-in that will allow custom commands (similar to aliases,
0146 but it'd be clear that these are custom commands and not MUD commands) and
0147 functions (these can then be included in []-eval blocks).
0148 Functions need to return some value.
0149 The function is simply a list of expressions + possibility to assign result
0150 of that expression to some variable (expressions can't do that natively due
0151 to immediate variable expansion)
0152 Some special variable holding result of last expression will also be useful.
0153 Result of the very last expression of the function shall be the return value
0154 of the whole function.
0155 Recursive calls may also be allowed (LIMITED due to lack of local
0156 variables).
0158 Tags
0159 ----
0160 - each object can have a tag (more tags?).
0161 - you can export all objects with some tag(s) or import them, possibly renaming
0162 each tag, or delete all existing objects with a given tag and import new ones,
0163 or whatever you want.
0164 - list of defined tags + some description...