mirror of
https://github.com/ldmud/ldmud
synced 2026-08-12 14:26:05 -04:00
93 lines
2.9 KiB
Text
93 lines
2.9 KiB
Text
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)
|