Skip to content
Permalink
Browse files

introduce temporary aliases

An alias, that was at least once used with the new "tempalias" will not be
written to saved.cfg.

So, now there are four ways to create aliases:

1) alias (or "=")
  General alias, who's value gets saved at game exit in saved.cfg, and
  restored at the next restart - unless the alias was created at a time,
  where persistidents was zero (usually during execution of the game's own
  config files during startup).

2) const
  Creates an alias, that can not be changed. Makes it harder for users
  to destroy their config.

3) push
  Reassigns an alias with a new value. After "pop", the old value is
  restored. Allows the use of "local" aliases in scripts. Also avoids
  name conflicts.

4) tempalias
  Like "alias", but the value will not be written to saved.cfg.

The commit also changes aliases, written by the engine itself, to "temp":
gametimestart, __getmaprevisions

DOCREF tempalias
  • Loading branch information...
ac-stef committed Mar 6, 2015
1 parent 32db3e5 commit 0f8dbf69aabbe994755f97029cd8b469b0e91e08
Showing with 30 additions and 24 deletions.
  1. +1 −1 source/src/clients2c.cpp
  2. +8 −4 source/src/command.cpp
  3. +14 −13 source/src/command.h
  4. +4 −3 source/src/main.cpp
  5. +1 −1 source/src/protos.h
  6. +1 −1 source/src/world.cpp
  7. +1 −1 source/src/worldio.cpp
@@ -61,7 +61,7 @@ bool changemapserv(char *name, int mode, int download, int revision) // f
else
{
defformatstring(msg)("map '%s' revision: local %d, provided by server %d", name, hdr.maprevision, revision);
alias("__getmaprevisions", msg);
alias("__getmaprevisions", msg, true);
showmenu("getmap");
}
}
@@ -117,13 +117,14 @@ void delalias(const char *name)
}
COMMAND(delalias, "s");

void alias(const char *name, const char *action, bool constant)
void alias(const char *name, const char *action, bool temp, bool constant)
{
ident *b = idents->access(name);
if(!b)
{
ident b(ID_ALIAS, newstring(name), newstring(action), persistidents && !constant, execcontext);
ident b(ID_ALIAS, newstring(name), newstring(action), persistidents && !constant && !temp, execcontext);
b.isconst = constant;
b.istemp = temp;
idents->access(b.name, b);
return;
}
@@ -144,12 +145,14 @@ void alias(const char *name, const char *action, bool constant)
}

b->isconst = constant;
if(temp) b->istemp = true;
if(!constant || (action && action[0]))
{
if(b->action!=b->executing) delete[] b->action;
b->action = newstring(action);
b->persist = persistidents != 0;
}
if(b->istemp) b->persist = false;
}
else
{
@@ -158,8 +161,9 @@ void alias(const char *name, const char *action, bool constant)
}
}

COMMANDF(alias, "ss", (const char *name, const char *action) { alias(name, action, false); });
COMMANDF(const, "ss", (const char *name, const char *action) { alias(name, action, true); });
COMMANDF(alias, "ss", (const char *name, const char *action) { alias(name, action, false, false); });
COMMANDF(tempalias, "ss", (const char *name, const char *action) { alias(name, action, true, false); });
COMMANDF(const, "ss", (const char *name, const char *action) { alias(name, action, false, true); });

COMMANDF(checkalias, "s", (const char *name) { intret(getalias(name) ? 1 : 0); });
COMMANDF(isconst, "s", (const char *name) { ident *id = idents->access(name); intret(id && id->isconst ? 1 : 0); });
@@ -11,7 +11,6 @@ struct ident
{
int type; // one of ID_* above
const char *name;
bool isconst;
union
{
int minval; // ID_VAR
@@ -42,39 +41,41 @@ struct ident
int defaultval; // ID_VAR
float defaultvalf; // ID_FVAR
};
short context;
bool persist;
short context; // one of IEXC_* below
bool persist; // if true, value gets written to saved.cfg on exit; set to true, if it's an ID_ALIAS and the value gets changed
bool isconst; // ID_ALIAS: value may not be overwritten
bool istemp; // ID_ALIAS: if value is changed, "persist" will not be set true

ident() {}

// ID_VAR
ident(int type, const char *name, int minval, int maxval, int *i, int defval, void (*fun)(), bool persist, int context)
: type(type), name(name), isconst(false), minval(minval), maxval(maxval), fun(fun),
sig(NULL), action(NULL), defaultval(defval), context(context), persist(persist)
: type(type), name(name), minval(minval), maxval(maxval), fun(fun),
sig(NULL), action(NULL), defaultval(defval), context(context), persist(persist), isconst(false), istemp(false)
{ storage.i = i; }

// ID_FVAR
ident(int type, const char *name, float minval, float maxval, float *f, float defval, void (*fun)(), bool persist, int context)
: type(type), name(name), isconst(false), minvalf(minval), maxvalf(maxval), fun(fun),
sig(NULL), action(NULL), defaultvalf(defval), context(context), persist(persist)
: type(type), name(name), minvalf(minval), maxvalf(maxval), fun(fun),
sig(NULL), action(NULL), defaultvalf(defval), context(context), persist(persist), isconst(false), istemp(false)
{ storage.f = f; }

// ID_SVAR
ident(int type, const char *name, char **s, void (*fun)(), void (*getfun)(), bool persist, int context)
: type(type), name(name), isconst(false), minval(0), maxval(0), fun(fun),
sig(NULL), action(NULL), getfun(getfun), context(context), persist(persist)
: type(type), name(name), minval(0), maxval(0), fun(fun),
sig(NULL), action(NULL), getfun(getfun), context(context), persist(persist), isconst(false), istemp(false)
{ storage.s = s; }

// ID_ALIAS
ident(int type, const char *name, char *action, bool persist, int context)
: type(type), name(name), isconst(false), minval(0), maxval(0), stack(0),
sig(NULL), action(action), executing(NULL), context(context), persist(persist)
: type(type), name(name), minval(0), maxval(0), stack(0),
sig(NULL), action(action), executing(NULL), context(context), persist(persist), isconst(false), istemp(false)
{ storage.i = NULL; }

// ID_COMMAND
ident(int type, const char *name, void (*fun)(), const char *sig, int context)
: type(type), name(name), isconst(false), minval(0), maxval(0), fun(fun),
sig(sig), action(NULL), executing(NULL), context(context), persist(false)
: type(type), name(name), minval(0), maxval(0), fun(fun),
sig(sig), action(NULL), executing(NULL), context(context), persist(false), isconst(false), istemp(false)
{ storage.i = NULL; }
};

@@ -29,9 +29,10 @@ VAR(resetcfg, 0, 0, 1);

void quit() // normal exit
{
const char *mapstartonce = getalias("mapstartonce"), *onquit = getalias("onQuit");
if(mapstartonce && mapstartonce[0]) alias("mapstartonce", "");
if(onquit && onquit[0]) { execute(onquit); alias("onQuit", ""); }
const char *onquit = getalias("onQuit");
if(onquit && onquit[0]) execute(onquit);
alias("onQuit", "");
alias("mapstartonce", "");
extern void writeinitcfg();
writeinitcfg();
writeservercfg();
@@ -835,7 +835,7 @@ extern void resetcomplete();
extern void complete(char *s, bool reversedirection);
extern void push(const char *name, const char *action);
extern void pop(const char *name);
extern void alias(const char *name, const char *action, bool constant = false);
extern void alias(const char *name, const char *action, bool temp = false, bool constant = false);
extern const char *getalias(const char *name);
extern void writecfg();
extern void deletecfg();
@@ -580,7 +580,7 @@ void newmap(int *i)
exechook(HOOK_SP_MP, "onNewMap", "");
}
defformatstring(startmillis)("%d", millis_());
alias("gametimestart", startmillis);
alias("gametimestart", startmillis, true);
}

COMMAND(mapenlarge, "");
@@ -754,7 +754,7 @@ bool load_world(char *mname) // still supports all map formats that have
c2skeepalive();

defformatstring(startmillis)("%d", millis_());
alias("gametimestart", startmillis);
alias("gametimestart", startmillis, true);
startmap(mname);
return true;
}

0 comments on commit 0f8dbf6

Please sign in to comment.
You can’t perform that action at this time.