/
Crimson2/alias/
Crimson2/area.tmp/
Crimson2/area.tmp/AnomalySpaceDock/
Crimson2/area.tmp/AnomalyStation/
Crimson2/area.tmp/AntHill/
Crimson2/area.tmp/ArcticTerrarium/
Crimson2/area.tmp/BuilderCity/
Crimson2/area.tmp/Dungeon/
Crimson2/area.tmp/MiningDock/
Crimson2/area.tmp/PipeSystem/
Crimson2/area.tmp/RattArea/
Crimson2/area.tmp/RobotFactory/
Crimson2/area.tmp/SilverDale/
Crimson2/area.tmp/StarshipFearless/
Crimson2/area.tmp/StationConduits/
Crimson2/area.tmp/TerrariumAlpha/
Crimson2/area.tmp/TerrariumBeta/
Crimson2/area.tmp/TestArea/
Crimson2/area.tmp/Void/
Crimson2/area/
Crimson2/area/AnomalySpaceDock/
Crimson2/area/AnomalyStation/
Crimson2/area/MiningDock/
Crimson2/area/PipeSystem/
Crimson2/area/SilverDale/
Crimson2/area/StationConduits/
Crimson2/area/Void/
Crimson2/board/
Crimson2/clone/
Crimson2/lib/
Crimson2/mole/
Crimson2/mole/mole_src/HELP/
Crimson2/player/
Crimson2/util/
Crimson2/wldedit/
Crimson2/wldedit/res/
/* 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 "code.h"
#include "reset.h"
#include "moledefs.h"
#include "mole.h"
#include "mole_msc.h"

CMDMOLEPROC(CmdMOLErlrq) { /* CmdMOLEProc( SOCK *sock, ULWORD *pktID, LWORD virtual) */
  BYTE       buf[MOLE_PKT_MAX];
  LWORD      i=0;
  WORD       area;
  LWORD      k;

  if (pktID<MOLE_PKID_START)
    return;

  MOLEWriteULWORD(sock,pktID,buf,&i);

  /* Check security */
  /* we can't use regular "rshow" kuz it doesn't take a vnum arg */
  if (!MOLECommandCheck(sock,"wlist",virtual)) {
    MOLEWriteULWORD(sock,MOLE_NACK_AUTHORIZATION,buf,&i);
    MOLESend(sock,buf,i,MOLE_CMD_NACK);
    MOLEFlushQ(sock);
    return;
  }

  /* first, we need to find the specified area */
  area=AreaOf(virtual);
  if (area>=0) {
    MOLEWriteULWORD(sock,virtual,buf,&i);
    MOLEWriteULWORD(sock,areaList[area].aResetNum,buf,&i);
    for (k=0;k<areaList[area].aResetNum;k++) {
      MOLEWriteULWORD(sock,areaList[area].aResetList[k].rCmd,buf,&i);
      MOLEWriteULWORD(sock,areaList[area].aResetList[k].rIf,buf,&i);
      switch ((areaList[area].aResetList)[k].rCmd) {
        case 'O': /* Object to room */
        case 'o': /* Object to room */
          MOLEWriteULWORD(sock,
            (areaList[area].aResetList)[k].rArg1.rObj->oVirtual,
            buf,&i);
          MOLEWriteULWORD(sock,(areaList[area].aResetList)[k].rArg2.rNum,buf,&i);
          MOLEWriteULWORD(sock,Wld((areaList[area].aResetList)[k].rArg3.rWld)->wVirtual,buf,&i);
          MOLEWriteULWORD(sock,(areaList[area].aResetList)[k].rArg4.rNum,buf,&i);
          break;
        case 'M': /* Mobile to room */
        case 'm': /* Mobile to room */
          MOLEWriteULWORD(sock,
            (areaList[area].aResetList)[k].rArg1.rMob->mVirtual,
            buf,&i);
          MOLEWriteULWORD(sock,(areaList[area].aResetList)[k].rArg2.rNum,buf,&i);
          MOLEWriteULWORD(sock,Wld((areaList[area].aResetList)[k].rArg3.rWld)->wVirtual,buf,&i);
          MOLEWriteULWORD(sock,(areaList[area].aResetList)[k].rArg4.rNum,buf,&i);
          break;
        case 'G': /* give object to last mobile */
        case 'g': /* give object to last mobile */
          MOLEWriteULWORD(sock,
            (areaList[area].aResetList)[k].rArg1.rObj->oVirtual,
            buf,&i);
          MOLEWriteULWORD(sock,(areaList[area].aResetList)[k].rArg2.rNum,buf,&i);
          MOLEWriteULWORD(sock,(areaList[area].aResetList)[k].rArg3.rNum,buf,&i);
          MOLEWriteULWORD(sock,(areaList[area].aResetList)[k].rArg4.rNum,buf,&i);
          break;
        case 'P': /* put object inside object */
        case 'p': /* put object inside object */
          MOLEWriteULWORD(sock,
            (areaList[area].aResetList)[k].rArg1.rObj->oVirtual,
            buf,&i);
          MOLEWriteULWORD(sock,(areaList[area].aResetList)[k].rArg2.rNum,buf,&i);
          MOLEWriteULWORD(sock,(areaList[area].aResetList)[k].rArg3.rNum,buf,&i);
          MOLEWriteULWORD(sock,(areaList[area].aResetList)[k].rArg4.rNum,buf,&i);
          break;
        case 'E': /* equip mobile with an object */
        case 'e': /* equip mobile with an object */
          MOLEWriteULWORD(sock,
            (areaList[area].aResetList)[k].rArg1.rObj->oVirtual,
            buf,&i);
          MOLEWriteULWORD(sock,(areaList[area].aResetList)[k].rArg2.rNum,buf,&i);
          MOLEWriteULWORD(sock,(areaList[area].aResetList)[k].rArg3.rNum,buf,&i);
          MOLEWriteULWORD(sock,(areaList[area].aResetList)[k].rArg4.rNum,buf,&i);
          break;
        case 'D': /* set door state */
        case 'd': /* set door state */
          MOLEWriteULWORD(sock,
            Wld((areaList[area].aResetList)[k].rArg1.rWld)->wVirtual,
            buf,&i);
          MOLEWriteULWORD(sock,(areaList[area].aResetList)[k].rArg2.rNum,buf,&i);
          MOLEWriteULWORD(sock,(areaList[area].aResetList)[k].rArg3.rNum,buf,&i);
          MOLEWriteULWORD(sock,(areaList[area].aResetList)[k].rArg4.rNum,buf,&i);
          break;
        case 'R': /* remove object from room */
        case 'r': /* remove object from room */
          MOLEWriteULWORD(sock,
            Wld((areaList[area].aResetList)[k].rArg1.rWld)->wVirtual,
            buf,&i);
          MOLEWriteULWORD(sock,(areaList[area].aResetList)[k].rArg2.rNum,buf,&i);
          MOLEWriteULWORD(sock,(areaList[area].aResetList)[k].rArg3.rNum,buf,&i);
          MOLEWriteULWORD(sock,(areaList[area].aResetList)[k].rArg4.rNum,buf,&i);
          break;
        case '*': /* comment */
        default:
          MOLEWriteULWORD(sock,0L,buf,&i);
          MOLEWriteULWORD(sock,0L,buf,&i);
          MOLEWriteULWORD(sock,0L,buf,&i);
          MOLEWriteULWORD(sock,0L,buf,&i);
          break;
      }
    }
    MOLESend(sock,buf,i,MOLE_CMD_RLST);
  } else { 
    /* didn't find specified area - return nack */
    MOLEWriteULWORD(sock,MOLE_NACK_NODATA,buf,&i);
    MOLESend(sock,buf,i,MOLE_CMD_NACK);
  }
}

CMDMOLEPROC(CmdMOLErlst) { /* CmdMOLEProc( SOCK *sock, ULWORD *pktID, LWORD virtual) */
  BYTE         buf[MOLE_PKT_MAX];
  LWORD        i=0;
  RESETLIST    reset;
  LWORD        rc;      /* return code */
  ULWORD       data;
  ULWORD       dataCmd;
  ULWORD       dataIf;
  ULWORD       dataArg[4];
  LWORD        counter;
  WORD         resetGood;
  WORD         area;


  if (pktID<MOLE_PKID_START)
    return;

  MOLEWriteULWORD(sock,pktID,buf,&i);

  /* Check security */
  /* we can't use regular "rupdate" kuz it doesn't take a vnum arg */
  if (!MOLECommandCheck(sock,"wdesc",virtual)) {
    MOLEWriteULWORD(sock,MOLE_NACK_AUTHORIZATION,buf,&i);
    MOLESend(sock,buf,i,MOLE_CMD_NACK);
    MOLEFlushQ(sock);
    return;
  }

  /* first, we need to find the specified area */
  area=AreaOf(virtual);
  if (area>=0) {
    /* first, mark area as changed */
    BITSET(areaList[area].aSystem,AS_RSTUNSAVED);
    /* delete all previous reset commands */
    areaList[area].aResetNum=0;
    /* Ok, let's read in our new RST stats */
    if ((!(rc=MOLEGetQULWORD(sock,&data)))) 
      counter=data;                /* counter=# reset entries */
    while((counter>0)&&(!rc)) {
      if (!rc) rc=MOLEGetQULWORD(sock,&dataCmd);
      if (!rc) rc=MOLEGetQULWORD(sock,&dataIf);
      if (!rc) rc=MOLEGetQULWORD(sock,&dataArg[0]);
      if (!rc) rc=MOLEGetQULWORD(sock,&dataArg[1]);
      if (!rc) rc=MOLEGetQULWORD(sock,&dataArg[2]);
      if (!rc) rc=MOLEGetQULWORD(sock,&dataArg[3]);

      /* now let's look at this sucker and see if we can make *
       * a valid reset from it. If we can't, we just turf the *
       * whole thing.                                         */
      reset.rCmd=dataCmd;
      reset.rIf=dataIf;
      resetGood=0;
      switch (dataCmd) {
        case 'M':
          if (!(reset.rArg1.rMob=MobileOf(dataArg[0])))
            break;
          reset.rArg2.rNum=dataArg[1];
          if (!(reset.rArg3.rWld=WorldOf(dataArg[2])))
            break;
          reset.rArg4.rNum=dataArg[3];
          resetGood=1;
          break;
        case 'O':
          if (!(reset.rArg1.rObj=ObjectOf(dataArg[0])))
            break;
          reset.rArg2.rNum=dataArg[1];
          if (!(reset.rArg3.rWld=WorldOf(dataArg[2])))
            break;
          reset.rArg4.rNum=dataArg[3];
          resetGood=1;
          break;
        case 'G':
          if (!(reset.rArg1.rObj=ObjectOf(dataArg[0])))
            break;
          reset.rArg2.rNum=dataArg[1];
          reset.rArg3.rNum=0; /* zero out extra params */
          reset.rArg4.rNum=0; /* zero out extra params */
          resetGood=1;
          break;
        case 'P':
          if (!(reset.rArg1.rObj=ObjectOf(dataArg[0])))
            break;
          reset.rArg2.rNum=dataArg[1];
          reset.rArg3.rNum=dataArg[2];
          reset.rArg4.rNum=0; /* zero out extra params */
          resetGood=1;
          break;
        case 'E':
          if (!(reset.rArg1.rObj=ObjectOf(dataArg[0])))
            break;
          reset.rArg2.rNum=dataArg[1];
          reset.rArg3.rNum=0; /* zero out extra params */
          reset.rArg4.rNum=0; /* zero out extra params */
          resetGood=1;
          break;
        case 'D':
          if (!(reset.rArg1.rWld=WorldOf(dataArg[0])))
            break;
          reset.rArg2.rNum=dataArg[1];
          reset.rArg3.rNum=dataArg[2];
          reset.rArg4.rNum=0; /* zero out extra params */
          resetGood=1;
          break;
        case 'R':
          if (!(reset.rArg1.rWld=WorldOf(dataArg[0])))
            break;
          reset.rArg2.rNum=dataArg[1];
          reset.rArg3.rNum=0; /* zero out extra params */
          reset.rArg4.rNum=0; /* zero out extra params */
          resetGood=1;
          break;
        case '*':
        default:
          /* who knows... unsupported. Just ignore */
          reset.rArg1.rNum=0; /* zero out extra params */
          reset.rArg2.rNum=0; /* zero out extra params */
          reset.rArg3.rNum=0; /* zero out extra params */
          reset.rArg4.rNum=0; /* zero out extra params */
          break;
      }
      if (resetGood) {
        /* let's create this reset! */
        REALLOC("MOLEReset(mole_rst.c): resetList reallocation\n", areaList[area].aResetList,RESETLIST,areaList[area].aResetNum+1, areaList[area].aResetByte);
        memcpy((void*)&(areaList[area].aResetList[areaList[area].aResetNum]),(void*)&reset,sizeof(RESETLIST));
        areaList[area].aResetNum++;
      }
      counter--;
    }

    MOLESend(sock,buf,i,MOLE_CMD_ACKP);
  } else {
    /* didn't find specified area - return nack */
    MOLEWriteULWORD(sock,MOLE_NACK_NODATA,buf,&i);
    MOLESend(sock,buf,i,MOLE_CMD_NACK);
  }
}