| CONCEPT |
| |
| VARIABLE INITIALIZATION |
| |
| DESCRIPTION |
| Global variables, like their local counterparts, can be defined |
| with an initial value: |
| |
| int * a = ({ 3, 4 }); |
| |
| The initialization value can be any legal LPC expression, |
| including function calls. The code for the initializations is |
| collected in a compiler-generated function __INIT() which is |
| called even before the create-hook is applied on the object. |
| |
| During initialization, blueprints and clones are treated |
| slightly differently: |
| |
| Blueprint variables are always all initialized using __INIT(). |
| |
| For clones the programmer can select whether the clone's |
| variables should also be initialized with __INIT(), or if they |
| should be assigned from the current blueprint values |
| ('shared with the blueprint'). The latter method is useful for |
| example if blueprints and clones shall share arrays or |
| mappings. |
| |
| The selection is performed with the two pragmas |
| 'init_variables' and 'share_variables'. The status of this |
| pragma at the point of the first variable definition counts, |
| and is applied to all variables in the program. |
| |
| The clone initialization method is evaluated per-program, i.e. |
| if an inherited program defines 'share_variables' and the child |
| program doesn't, only the inherited variables are initialized |
| from the blueprint, and all others from __INIT(). |
| |
| The default setting for the pragma is configured into the |
| driver, but can also be chosen when starting the driver. |
| |
| EXAMPLE |
| For the object |
| |
| ---------- |
| inherit "a"; |
| int a = 4; |
| int b; |
| ---------- |
| |
| the compiler executes the equivalent of these __INIT() functions: |
| |
| #pragma share_variables: |
| |
| unknown __INIT() |
| { |
| "a"::__INIT(); |
| if (clonep(this_object())) |
| { |
| a = (blueprint of this_object())->a; |
| } |
| else |
| { |
| a = 4; |
| } |
| return 1; |
| } |
| |
| |
| #pragma init_variables: |
| |
| unknown __INIT() |
| { |
| "a"::__INIT(); |
| a = 4; |
| return 1; |
| } |
| |
| |
| In either case the variable 'b' (in fact all variables) are |
| set to '0' as part of the loading/cloning process before the |
| driver performs the specific initialisation. |
| |
| WARNING |
| Do not call __INIT() yourself, overload, or use it directly in |
| any other way. The implementation of the variable |
| initialization may change at any time. |
| |
| HISTORY |
| Before LDMud 3.3.378, the choice between sharing and initializing |
| variables was a fixed configuration choice of the driver. |
| |
| SEE ALSO |
| pragma(LPC), create(H), invocation(D) |