#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#ifndef WIN32
#include <unistd.h> /* for unlink */
#endif
#include "crimson2.h"
#include "macro.h"
#include "log.h"
#include "mem.h"
#include "str.h"
#include "ini.h"
#include "queue.h"
#include "send.h"
#include "extra.h"
#include "thing.h"
#include "index.h"
#include "edit.h"
#include "history.h"
#include "socket.h"
#include "world.h"
#include "base.h"
#include "object.h"
#include "char.h"
#include "mobile.h"
#include "player.h"
#include "area.h"
#include "codestuf.h"
#include "compile.h"
#include "interp.h"
#include "function.h"
#include "decomp.h"
#include "exit.h"
#include "skill.h"
#include "fight.h"
/* Globals */
ULWORD cSystemVariable; /* # of system variables which take up first bit of local variable tables */
ULWORD cSystemVariableStatic; /* # of sys vars which are STATIC. IE: unchangeable */
BYTE *cDataType[] = {
"NULL",
"INT",
"STR",
"THING",
"EXTRA",
"EXIT",
"UNDEF6", /* Why Cam used 31 as CDT_ETC I cant tell ya */
"UNDEF7",
"UNDEF8",
"UNDEF9",
"UNDEF10",
"UNDEF11",
"UNDEF12",
"UNDEF13",
"UNDEF14",
"UNDEF15",
"UNDEF16",
"UNDEF17",
"UNDEF18",
"UNDEF19",
"UNDEF20",
"UNDEF21",
"UNDEF22",
"UNDEF23",
"UNDEF24",
"UNDEF25",
"UNDEF26",
"UNDEF27",
"UNDEF28",
"UNDEF29",
"UNDEF30",
"ETC",
""
};
CODERESERVEDWORD cResWord[] = { /* table of reserved words */
{ "int" },
{ "str" },
{ "thing" },
{ "local" },
{ "global" },
{ "private" },
{ "for" },
{ "while" },
{ "else" },
{ "stop" },
{ "if" },
{ "switch" },
{ "break" },
{ "case" },
{ "goto" },
{ "char" },
{ "const" },
{ "default" },
{ "double" },
{ "extern" },
{ "float" },
{ "asm" },
{ "long" },
{ "public" },
{ "return" },
{ "short" },
{ "signed" },
{ "sizeof" },
{ "struct" },
{ "typedef" },
{ "union" },
{ "unsigned" },
{ "void" },
{ "extra" },
{ "continue" },
{ "exit" },
{ "prop" },
{ "property" },
{ "" }
};
/* Master Global Variable Table */
/* To add a global variable, do the following:
* step 1: Add an entry into the following table.
* CAREFUL: the first group are STATIC (ie C4 cannot
* change their value) and the second group are DYNAMIC
* (C4 can change their value!). The groups are each
* terminated by a NULL entry.
* The first parameter is the variable name.
* The second parameter is the variable type.
* third is the initial integer value, if type CDT_INT.
* fourth is the initial pointer value, if type CDT_STR,
* CDT_THING, or CDT_EXTRA.
* step 2: If you've added a lot of variables, you may have to
* increment the constant CMAX_VAR in compile.h. This
* constant defines the max # of local variables available,
* including those found below!
* step 3: If the initial value is sufficient, you're done! If the
* value of the variable changes at boot-up (most pointer
* types will have to be set like this), or at various times
* (eg: TIME), then you will have to go into interp.c and
* modify InterpInit and Interp to set your new variable
* accordingly. There is existing code there that you can
* look at and copy for your own variable.
*
* HUGE WARNING!!! GIGANTIC ENORMOUS MEGA WARNING!!!!!!!!!!!!!!!!!!
* READ THIS READ THIS READ THIS READ THIS READ THIS READ THIS READ THIS!!!
* When the system saves C4 code attached to a THING, it can either
* disassemble the code back into source code, or it can save it as
* binary data to save boot time. Here's the glitch: the variables
* are stored in the binary format as an integer value offset into
* the array cSysVar below. Do you see the danger?
*
* Suppose you ran your MUD and saved all your C4 code as binary.
* Suppose also that you had a C4 program which used the system
* variable TNULL. When your MUD compiled your C4, the variable TNULL
* would be stored in memory as 0x0001 ("NULL" would be 0x0000).
* So you saved your C4 code as binary
* to disk and TNULL got written to disk as "00 01". Now, suppose
* you went in and added a NEW system variable inbetween NULL and
* TNULL called "NEWVAR". You see, the position of NEWVAR is now
* 0x0001 according to your table, but your C4 code
* saved in binary format is expecting 0x0001 to be TNULL!!!
* So when you load your code, your binary code expects TNULL to be 0x00001
* but your compiled MUD expects TNULL to be 0x0002!!!! OH MY! In fact, ALL
* your variables are now shifted by 1!!!
*
* MORAL OF THE STORY: If you EVER, and I mean EVER, think of changing
* the following cSysVar array, be it adding a variable, rearranging,
* deleting, or whatever, MAKE SURE YOUR MUD FILES ARE SAVED AS SOURCE
* CODE!!!!!!! Let me say this another way: MAKE SURE YOUR MUD C4 CODE IS
* SAVED AS SOURCE CODE, NOT BINARY!!!
*
* In case you missed it, MAKE SURE YOUR MUD SAVES SCRIPTS AS SOURCE
* CODE, NOT BINARY FORMAT!!!
*
* I hope I have made myself clear on this point.
*
* Well, good luck and happy coding!
*/
CODESYSVAR cSysVar[] = {
/* static (non-C4-changeable) system variables */
{ "NULL", CDT_STR, 0 ,NULL },
{ "TNULL", CDT_THING, 0 ,NULL },
{ "ENULL", CDT_EXTRA, 0 ,NULL },
{ "XNULL", CDT_EXIT, 0 ,NULL },
{ "TRUE", CDT_INT, 1 ,NULL },
{ "FALSE", CDT_INT, 0 ,NULL },
{ "YES", CDT_INT, 1 ,NULL },
{ "NO", CDT_INT, 0 ,NULL },
{ "EVENT_THING", CDT_THING, 0 ,NULL },
{ "CODE_THING", CDT_THING, 0 ,NULL },
{ "SPARE_THING", CDT_THING, 0 ,NULL },
{ "EXIT", CDT_EXIT, 0 ,NULL },
{ "TIME", CDT_INT, 0 ,NULL },
{ "SEGMENT", CDT_INT, 0 ,NULL },
{ "COMMAND", CDT_STR, 0 ,NULL },
{ "CMD_CMD", CDT_STR, 0 ,NULL },
{ "CMD_SRCKEY", CDT_STR, 0 ,NULL },
{ "CMD_SRCOFFSET", CDT_INT, 0 ,NULL },
{ "CMD_SRCNUM", CDT_INT, 0 ,NULL },
{ "CMD_DSTKEY", CDT_STR, 0 ,NULL },
{ "CMD_DSTOFFSET", CDT_INT, 0 ,NULL },
{ "SEND_ROOM", CDT_INT, SEND_ROOM ,NULL },
{ "SEND_SRC", CDT_INT, SEND_SRC ,NULL },
{ "SEND_DST", CDT_INT, SEND_DST ,NULL },
{ "SEND_VISIBLE", CDT_INT, SEND_VISIBLE ,NULL },
{ "SEND_AUDIBLE", CDT_INT, SEND_AUDIBLE ,NULL },
{ "SEND_CAPFIRST", CDT_INT, SEND_CAPFIRST ,NULL },
{ "TTYPE_UNDEF", CDT_INT, TTYPE_UNDEF ,NULL },
{ "TTYPE_WLD", CDT_INT, TTYPE_WLD ,NULL },
{ "TTYPE_BASE", CDT_INT, TTYPE_BASE ,NULL },
{ "TTYPE_OBJ", CDT_INT, TTYPE_OBJ ,NULL },
{ "TTYPE_CHARACTER",CDT_INT, TTYPE_CHARACTER ,NULL },
{ "TTYPE_MOB", CDT_INT, TTYPE_MOB ,NULL },
{ "TTYPE_PLR", CDT_INT, TTYPE_PLR ,NULL },
{ "TF_CONTINUE", CDT_INT, TF_CONTINUE ,NULL },
{ "TF_PLR", CDT_INT, TF_PLR ,NULL },
{ "TF_OBJ", CDT_INT, TF_OBJ ,NULL },
{ "TF_MOB", CDT_INT, TF_MOB ,NULL },
{ "TF_PLR_ANYWHERE",CDT_INT, TF_PLR_ANYWHERE ,NULL },
{ "TF_OBJ_ANYWHERE",CDT_INT, TF_OBJ_ANYWHERE ,NULL },
{ "TF_MOB_ANYWHERE",CDT_INT, TF_MOB_ANYWHERE ,NULL },
{ "TF_PLR_WLD", CDT_INT, TF_PLR_WLD ,NULL },
{ "TF_OBJ_WLD", CDT_INT, TF_OBJ_WLD ,NULL },
{ "TF_MOB_WLD", CDT_INT, TF_MOB_WLD ,NULL },
{ "TF_WLD", CDT_INT, TF_WLD ,NULL },
{ "TF_OBJINV", CDT_INT, TF_OBJINV ,NULL },
{ "TF_OBJEQUIP", CDT_INT, TF_OBJEQUIP ,NULL },
{ "TF_ALLMATCH", CDT_INT, TF_ALLMATCH ,NULL },
{ "EDIR_NORTH", CDT_INT, EDIR_NORTH ,NULL },
{ "EDIR_EAST", CDT_INT, EDIR_EAST ,NULL },
{ "EDIR_SOUTH", CDT_INT, EDIR_SOUTH ,NULL },
{ "EDIR_WEST", CDT_INT, EDIR_WEST ,NULL },
{ "EDIR_UP", CDT_INT, EDIR_UP ,NULL },
{ "EDIR_DOWN", CDT_INT, EDIR_DOWN ,NULL },
{ "EDIR_UNDEFINED",CDT_INT, EDIR_UNDEFINED ,NULL },
{ "EF_ISDOOR", CDT_INT, EF_ISDOOR ,NULL },
{ "EF_PICKPROOF", CDT_INT, EF_PICKPROOF ,NULL },
{ "EF_LOCKED", CDT_INT, EF_LOCKED ,NULL },
{ "EF_CLOSED", CDT_INT, EF_CLOSED ,NULL },
{ "EF_HIDDEN", CDT_INT, EF_HIDDEN ,NULL },
{ "EF_ELECTRONIC", CDT_INT, EF_ELECTRONIC ,NULL },
{ "SF_WEAPON", CDT_INT, SF_WEAPON ,NULL },
{ "SF_MELEE", CDT_INT, SF_MELEE ,NULL },
{ "SF_LASER", CDT_INT, SF_LASER ,NULL },
{ "SF_SLUG", CDT_INT, SF_SLUG ,NULL },
{ "SF_BLASTER", CDT_INT, SF_BLASTER ,NULL },
{ "SF_ION", CDT_INT, SF_ION ,NULL },
{ "SF_SUPPORT", CDT_INT, SF_SUPPORT ,NULL },
{ "SF_PLASMA", CDT_INT, SF_PLASMA ,NULL },
{ "SF_OFFENSE", CDT_INT, SF_OFFENSE ,NULL },
{ "SF_DEFENSE", CDT_INT, SF_DEFENSE ,NULL },
{ "SF_PSYCHIC", CDT_INT, SF_PSYCHIC ,NULL },
{ "SF_BODY", CDT_INT, SF_BODY ,NULL },
{ "SF_TELEKINETIC",CDT_INT, SF_TELEKINETIC ,NULL },
{ "SF_APPORTATION",CDT_INT, SF_APPORTATION ,NULL },
{ "SF_SPIRIT", CDT_INT, SF_SPIRIT ,NULL },
{ "SF_PYROKINETIC",CDT_INT, SF_PYROKINETIC ,NULL },
{ "SF_TELEPATHY", CDT_INT, SF_TELEPATHY ,NULL },
{ "SF_GENERAL", CDT_INT, SF_GENERAL ,NULL },
{ "SF_CLASS", CDT_INT, SF_CLASS ,NULL },
{ "OR_BIO", CDT_INT, OR_BIO ,NULL },
{ "OR_CHIP", CDT_INT, OR_CHIP ,NULL },
{ "OR_RICH", CDT_INT, OR_RICH ,NULL },
{ "FD_PUNCTURE", CDT_INT, FD_PUNCTURE ,NULL },
{ "FD_SLASH", CDT_INT, FD_SLASH ,NULL },
{ "FD_CONCUSSIVE", CDT_INT, FD_CONCUSSIVE ,NULL },
{ "FD_HEAT", CDT_INT, FD_HEAT ,NULL },
{ "FD_EMR", CDT_INT, FD_EMR ,NULL },
{ "FD_LASER", CDT_INT, FD_LASER ,NULL },
{ "FD_PSYCHIC", CDT_INT, FD_PSYCHIC ,NULL },
{ "FD_ACID", CDT_INT, FD_ACID ,NULL },
{ "FD_POISON", CDT_INT, FD_POISON ,NULL },
{ "FR_PUNCTURE", CDT_INT, FR_PUNCTURE ,NULL },
{ "FR_SLASH", CDT_INT, FR_SLASH ,NULL },
{ "FR_CONCUSSIVE", CDT_INT, FR_CONCUSSIVE ,NULL },
{ "FR_HEAT", CDT_INT, FR_HEAT ,NULL },
{ "FR_EMR", CDT_INT, FR_EMR ,NULL },
{ "FR_LASER", CDT_INT, FR_LASER ,NULL },
{ "FR_PSYCHIC", CDT_INT, FR_PSYCHIC ,NULL },
{ "FR_ACID", CDT_INT, FR_ACID ,NULL },
{ "FR_POISON", CDT_INT, FR_POISON ,NULL },
{ "WT_INDOORS", CDT_INT, WT_INDOORS ,NULL },
{ "WT_CITY", CDT_INT, WT_CITY ,NULL },
{ "WT_FIELD", CDT_INT, WT_FIELD ,NULL },
{ "WT_FOREST", CDT_INT, WT_FOREST ,NULL },
{ "WT_HILLS", CDT_INT, WT_HILLS ,NULL },
{ "WT_MOUNTAIN", CDT_INT, WT_MOUNTAIN ,NULL },
{ "WT_WATERSWIM", CDT_INT, WT_WATERSWIM ,NULL },
{ "WT_WATERNOSWIM",CDT_INT, WT_WATERNOSWIM ,NULL },
{ "WT_UNDERWATER", CDT_INT, WT_UNDERWATER ,NULL },
{ "WT_VACUUM", CDT_INT, WT_VACUUM ,NULL },
{ "WT_DESERT", CDT_INT, WT_DESERT ,NULL },
{ "WT_ARCTIC", CDT_INT, WT_ARCTIC ,NULL },
{ "WT_ROAD", CDT_INT, WT_ROAD ,NULL },
{ "WT_TRAIL", CDT_INT, WT_TRAIL ,NULL },
{ "WF_DARK", CDT_INT, WF_DARK ,NULL },
{ "WF_DEATHTRAP", CDT_INT, WF_DEATHTRAP ,NULL },
{ "WF_NOMOB", CDT_INT, WF_NOMOB ,NULL },
{ "WF_VACUUM", CDT_INT, WF_VACUUM ,NULL },
{ "WF_NOGOOD", CDT_INT, WF_NOGOOD ,NULL },
{ "WF_NONEUTRAL", CDT_INT, WF_NONEUTRAL ,NULL },
{ "WF_NOEVIL", CDT_INT, WF_NOEVIL ,NULL },
{ "WF_NOPSIONIC", CDT_INT, WF_NOPSIONIC ,NULL },
{ "WF_SMALL", CDT_INT, WF_SMALL ,NULL },
{ "WF_PRIVATE", CDT_INT, WF_PRIVATE ,NULL },
{ "WF_DRAINPOWER", CDT_INT, WF_DRAINPOWER ,NULL },
{ "WF_NOTELEPORTOUT",CDT_INT, WF_NOTELEPORTOUT ,NULL },
{ "WF_NOTELEPORTIN",CDT_INT, WF_NOTELEPORTIN ,NULL },
{ "RACE_HUMAN" ,CDT_INT, 0 ,NULL },
{ "RACE_ARTIFICER" ,CDT_INT, 1 ,NULL },
{ "RACE_SILICONOID",CDT_INT, 2 ,NULL },
{ "RACE_SALAMANDER",CDT_INT, 3 ,NULL },
{ NULL, CDT_NULL, 0 ,NULL },
/* end of static (non-C4-changeable) system variables */
/* dynamic (C4-changeable) system variables */
{ "BLOCK_CMD", CDT_INT, 0 ,NULL },
{ NULL, CDT_NULL, 0 ,NULL }
/* end of dynamic (C4-changeable) system variables */
};
void CodeStufInit() {
ULWORD i;
/* Initialize global settings */
for (i=0;cSysVar[i].cText!=NULL;i++); /* find first NULL entry */
cSystemVariableStatic=i;
for (i++;cSysVar[i].cText!=NULL;i++); /* find second NULL entry */
cSystemVariable=i-1; /* -1 is to ignore first NULL entry */
}