/* part of Crimson2 */
/* Written by B. Cameron Lesiuk, 1997 */
/* Written for use with Crimson2 MUD (written/copyright Ryan Haksi 1995).
* This source is proprietary. Use of this code without permission from
* Ryan Haksi or Cam Lesiuk is strictly prohibited.
*
* (clesiuk@engr.uvic.ca)
*/
/* MOLE related commands */
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <time.h>
#ifndef WIN32
#include <unistd.h>
#endif
#include "crimson2.h"
#include "macro.h"
#include "log.h"
#include "str.h"
#include "queue.h"
#include "send.h"
#include "ini.h"
#include "extra.h"
#include "property.h"
#include "file.h"
#include "thing.h"
#include "index.h"
#include "edit.h"
#include "history.h"
#include "mem.h"
#include "socket.h"
#include "site.h"
#include "exit.h"
#include "world.h"
#include "base.h"
#include "object.h"
#include "char.h"
#include "affect.h"
#include "fight.h"
#include "mobile.h"
#include "skill.h"
#include "player.h"
#include "parse.h"
#include "area.h"
#include "reset.h"
#include "cmd_inv.h"
#include "moledefs.h"
#include "mole.h"
#include "mole_msc.h"
/* Identification */
CMDMOLEPROC(CmdMOLEidrq) { /* CmdMOLEProc( SOCK *sock, ULWORD *pktID, LWORD virtual) */
BYTE buf[MOLE_PKT_MAX];
LWORD i=0;
if (pktID<MOLE_PKID_START)
return;
MOLEWriteULWORD(sock,pktID,buf,&i);
MOLEWriteULWORD(sock,
(CRIMSON_MAJOR_VERSION<<24)|(CRIMSON_MINOR_VERSION<<16)|
(MOLE_MAJOR_VERSION<<8)|(MOLE_MINOR_VERSION),buf,&i);
MOLESend(sock,buf,i,MOLE_CMD_IDEN);
}
/* System Information */
CMDMOLEPROC(CmdMOLEsysr) { /* CmdMOLEProc( SOCK *sock, ULWORD *pktID, LWORD virtual) */
BYTE buf[MOLE_PKT_MAX];
LWORD i=0;
WORD type;
WORD field;
WORD numType;
WORD numField;
if (pktID<MOLE_PKID_START)
return;
/* we send the flag and type lists */
/* Note that the list order MUST correspond to the
* order defined by the MOLE_LIST_* in mole.h!!! */
MOLEWriteULWORD(sock,pktID,buf,&i);
MOLEWriteBuf(sock,MOLE_SERVER_NAME,buf,&i);
MOLEWriteULWORD(sock,MOLE_LIST_NUMLISTS,buf,&i);
MOLEWRITELIST(sock,mTypeList,buf,&i);
MOLEWRITELIST(sock,sexList,buf,&i);
MOLEWRITELIST(sock,posList,buf,&i);
MOLEWRITELIST(sock,mActList,buf,&i);
MOLEWRITELIST(sock,affectList,buf,&i);
MOLEWRITELIST(sock,wTypeList,buf,&i);
MOLEWRITELIST(sock,wFlagList,buf,&i);
MOLEWRITELIST(sock,oActList,buf,&i);
MOLEWRITELIST(sock,oSFlagList,buf,&i);
MOLEWRITELIST(sock,oWFlagList,buf,&i);
MOLEWRITELIST(sock,oAmmoList,buf,&i);
MOLEWRITELIST(sock,oCFlagList,buf,&i);
MOLEWRITELIST(sock,oLiquidList,buf,&i);
MOLEWRITELIST(sock,applyList,buf,&i);
MOLEWRITELIST(sock,rFlagList,buf,&i);
MOLEWRITELIST(sock,wearList,buf,&i);
MOLEWRITELIST(sock,dirList,buf,&i);
MOLEWRITELIST(sock,eFlagList,buf,&i);
MOLEWRITELIST(sock,oTypeList,buf,&i);
MOLEWRITELIST(sock,resistList,buf,&i);
MOLEWRITELIST(sock,weaponList,buf,&i);
/* and lastly, and most trickily, we must send
* the oListType array */
/* first, count the types */
for (numType=0;*(oTypeList[numType].oTypeStr);numType++);
/* write this to our buffer */
MOLEWriteULWORD(sock,numType,buf,&i);
/* now cycle through our types and transmit each one */
for (type=0;type<numType;type++) {
/* first, count the fields */
for (numField=0;*(oTypeList[type].oField[numField]);numField++);
/* write this to our buffer */
MOLEWriteULWORD(sock,numField,buf,&i);
/* now cycle through our fields and transmit each one */
for (field=0;field<numField;field++) {
/* transmit name of field */
MOLEWriteBuf(sock,(oTypeList[type]).oFieldStr[field],buf,&i);
/* transmit field format (int, list, flag) */
if ((oTypeList[type]).oField[field][2]=='T') {
/* type lists */
MOLEWriteULWORD(sock,MOLE_LISTTYPE_TYPE,buf,&i);
/* transmit type list number */
if ((oTypeList[type]).oArray[field].oList==(BYTE**)(oAmmoList)) {
MOLEWriteULWORD(sock,MOLE_LIST_OAMMO,buf,&i);
} else if ((oTypeList[type]).oArray[field].oList==(BYTE**)(weaponList)) {
MOLEWriteULWORD(sock,MOLE_LIST_WEAPON,buf,&i);
} else if ((oTypeList[type]).oArray[field].oList==(BYTE**)(oLiquidList)) {
MOLEWriteULWORD(sock,MOLE_LIST_OLIQUID,buf,&i);
} else {
/* default MOLE_LIST_INVALID (ie: unimplemented/invalid) */
MOLEWriteULWORD(sock,MOLE_LIST_INVALID,buf,&i);
}
} else if ((oTypeList[type]).oField[field][2]=='F') {
/* Flag lists */
MOLEWriteULWORD(sock,MOLE_LISTTYPE_FLAG,buf,&i);
/* transmit flag list number */
if ((oTypeList[type]).oArray[field].oList==(BYTE**)(oSFlagList)) {
MOLEWriteULWORD(sock,MOLE_LIST_OSFLAG,buf,&i);
} else if ((oTypeList[type]).oArray[field].oList==(BYTE**)(oWFlagList)) {
MOLEWriteULWORD(sock,MOLE_LIST_OWFLAG,buf,&i);
} else if ((oTypeList[type]).oArray[field].oList==(BYTE**)(resistList)) {
MOLEWriteULWORD(sock,MOLE_LIST_RESIST,buf,&i);
} else if ((oTypeList[type]).oArray[field].oList==(BYTE**)(oCFlagList)) {
MOLEWriteULWORD(sock,MOLE_LIST_OCFLAG,buf,&i);
} else {
/* default MOLE_LIST_INVALID (ie: unimplemented/invalid) */
MOLEWriteULWORD(sock,MOLE_LIST_INVALID,buf,&i);
}
} else {
/* default (int) */
MOLEWriteULWORD(sock,MOLE_LISTTYPE_INVALID,buf,&i);
}
}
}
MOLESend(sock,buf,i,MOLE_CMD_SYSD);
}