/* Crimson2 Mud Server
* All source written/copyright Ryan Haksi 1995 *
* This source code is proprietary. Use in whole or in part without
* explicity permission by the author is strictly prohibited
*
* Current email address(es): cryogen@infoserve.net
* Phone number: (604) 591-5295
*
* C4 Script Language written/copyright Cam Lesiuk 1995
* Email: clesiuk@engr.uvic.ca
*/
/*****************************************************************
* *
* *
* A R E A S T U F F *
* *
* *
*****************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "crimson2.h"
#include "macro.h"
#include "mem.h"
#include "queue.h"
#include "log.h"
#include "str.h"
#include "ini.h"
#include "extra.h"
#include "property.h"
#include "code.h"
#include "file.h"
#include "thing.h"
#include "reset.h"
#include "exit.h"
#include "index.h"
#include "world.h"
#include "area.h"
#include "edit.h"
#include "history.h"
#include "socket.h"
#include "send.h"
#include "base.h"
#include "object.h"
#include "char.h"
#include "player.h"
#include "parse.h"
#include "cmd_area.h"
LWORD AGetArea(THING *thing, BYTE **cmd) {
THING *world;
LWORD numScan;
LWORD virtual = -1;
if (cmd) {
numScan = sscanf(*cmd, " %ld", &virtual);
} else {
numScan = 0;
}
if (numScan>0) {
*cmd = StrOneWord(*cmd, NULL);
return AreaOf(virtual);
} else {
world = Base(thing)->bInside;
if (!world || world->tType != TTYPE_WLD) {
SendThing("I'm afraid you're not inside a WORLD right at the moment\n", thing);
return -1;
}
return Wld(world)->wArea;
}
return -1;
}
CMDPROC(CmdArea) { /* void CmdProc(THING thing, BYTE* cmd) */
LWORD area;
BYTE buf[512];
/* ULWORD minuteSinceReset; */
cmd = StrOneWord(cmd, NULL);
area = AGetArea(thing, &cmd);
if (area == -1)
return;
if (thing->tType!=TTYPE_PLR)
return;
/* regular player -- show area name and desc */
sprintf(buf, "^gName:^G[^c%s^G]\n", areaList[area].aFileName->sText);
SendThing(buf, thing);
SendThing("^gDescription:^b\n", thing);
SendThing(areaList[area].aDesc->sText, thing);
SendThing("\n", thing);
return;
}
CMDPROC(CmdAStat) { /* void CmdProc(THING thing, BYTE* cmd) */
LWORD area;
BYTE buf[512];
ULWORD minuteSinceReset;
cmd = StrOneWord(cmd, NULL);
area = AGetArea(thing, &cmd);
if (area == -1)
return;
if (thing->tType!=TTYPE_PLR)
return;
if (Character(thing)->cLevel<LEVEL_GOD) {
/* regular player -- show area name and desc */
sprintf(buf, "^gName:^G[^c%s^G]\n", areaList[area].aFileName->sText);
SendThing(buf, thing);
SendThing("^gDescription:^b\n", thing);
SendThing(areaList[area].aDesc->sText, thing);
SendThing("\n", thing);
return;
}
/* show them the stats on the AREA */
/* first line, # Name & Type */
sprintf(buf, "^g#:^G[^c%ld^G] ^gName:^G[^c", area);
SendThing(buf, thing);
SendThing(areaList[area].aFileName->sText, thing);
sprintf(buf,"^G] [^w%5ld^G-^w%5ld^G]\n", areaList[area].aVirtualMin, areaList[area].aVirtualMax);
SendThing(buf, thing);
SendThing("^gAuthorized Editors:^c ", thing);
SendThing(areaList[area].aEditor->sText, thing);
SendThing("\n", thing);
sprintf(buf,"^gWorlds ^G[^c%5ld^G] ^gMobiles^G[^c%3ld^G] ^gObjects^G[^c%3ld^G] ^gResets^G[^c%3ld^G]\n", areaList[area].aWldIndex.iNum, areaList[area].aMobIndex.iNum, areaList[area].aObjIndex.iNum, areaList[area].aResetNum);
SendThing(buf, thing);
/* flags */
SendThing("^gSystem Flags: ^G[^c", thing);
SendThing(FlagSprintf(buf, areaList[area].aSystem, wSystemList, ' ', 512), thing);
SendThing("^G]\n", thing);
SendThing("^gReset/Area Flags: ^G[^c", thing);
SendThing(FlagSprintf(buf, areaList[area].aResetFlag, rFlagList, ' ', 512), thing);
SendThing("^G]\n", thing);
sprintf(buf,"^gReset Delay^G[^c%3hd^G] minutes\n", areaList[area].aResetDelay);
SendThing(buf, thing);
minuteSinceReset = (time(0) - areaList[area].aResetLast - startTime)/60;
sprintf(buf,"^gLast Reset ^G[^c%3ld^G] minutes ago\n", minuteSinceReset);
SendThing(buf, thing);
SendThing("^gDescription:^b\n", thing);
SendThing(areaList[area].aDesc->sText, thing);
SendThing("\n", thing);
}
CMDPROC(CmdAList) { /* void CmdProc(THING thing, BYTE* cmd) */
BYTE saved;
LWORD area;
BYTE buf[256];
BYTE truncateStr[256];
BYTE word[256];
/* List the rooms in 2 nicely formatted columns*/
for (area=0; area<areaListMax; area+=2) {
if (areaList[area].aSystem&(AS_WLDUNSAVED|AS_MOBUNSAVED|AS_OBJUNSAVED|AS_RSTUNSAVED))
saved='*';
else
saved=' ';
if (areaList[area].aResetFlag&RF_AREAISCLOSED) {
sprintf(buf, "^r%5ld-%5ld ^y%c^r%-24s",
areaList[area].aVirtualMin,
areaList[area].aVirtualMax,
saved,
StrTruncate(truncateStr, StrFirstWord(areaList[area].aFileName->sText,word), 25));
} else {
sprintf(buf, "^w%5ld-%5ld ^y%c^c%-24s",
areaList[area].aVirtualMin,
areaList[area].aVirtualMax,
saved,
StrTruncate(truncateStr, StrFirstWord(areaList[area].aFileName->sText,word), 25));
}
if (area+1 < areaListMax) {
if (areaList[area+1].aSystem&(AS_WLDUNSAVED|AS_MOBUNSAVED|AS_OBJUNSAVED|AS_RSTUNSAVED))
saved='*';
else
saved=' ';
if (areaList[area+1].aResetFlag&RF_AREAISCLOSED) {
sprintf(buf+strlen(buf), "^r%5ld-%5ld ^y%c^r%-24s",
areaList[area+1].aVirtualMin,
areaList[area+1].aVirtualMax,
saved,
StrTruncate(truncateStr, StrFirstWord(areaList[area+1].aFileName->sText,word), 25));
} else {
sprintf(buf+strlen(buf), "^w%5ld-%5ld ^y%c^c%-24s",
areaList[area+1].aVirtualMin,
areaList[area+1].aVirtualMax,
saved,
StrTruncate(truncateStr, StrFirstWord(areaList[area+1].aFileName->sText,word), 25));
}
}
strcat(buf, "\n");
SendThing(buf, thing);
}
sprintf(buf, "^g%ld ^bareas listed. ^y* ^bmeans the area has unsaved changes. \n", areaListMax);
SendThing(buf, thing);
}
CMDPROC(CmdADesc) { /* void CmdProc(THING thing, BYTE* cmd) */
LWORD area;
BYTE strName[512];
cmd = StrOneWord(cmd, NULL);
area = AGetArea(thing, &cmd);
if (area == -1) {
SendThing("^wYou cant do that here...\n", thing);
return;
}
/* Edit the requisite string */
SendHint("^;HINT: Descriptions must end with a blank line\n", thing);
sprintf(strName, "Area %s - Description", areaList[area].aFileName->sText);
EDITSTR(thing, areaList[area].aDesc, 4096, strName, EP_ENDLF);
EDITFLAG(thing, &areaList[area].aSystem, AS_RSTUNSAVED);
}
CMDPROC(CmdAFlag) { /* void CmdProc(THING thing, BYTE* cmd) */
LWORD area;
BYTE buf[512];
FLAG flag;
cmd = StrOneWord(cmd, NULL);
area = AGetArea(thing, &cmd);
if (area == -1) {
SendThing("^wYou cant do that here...\n", thing);
return;
}
sprintf(buf, "^g#:^G[^c%ld^G] ^gName:^G[^c", area);
SendThing(buf, thing);
SendThing(areaList[area].aFileName->sText, thing);
SendThing("^G]\n\n", thing);
SendThing("^gReset/Area Flags Set:\n^c", thing);
SendThing(FlagSprintf(buf, areaList[area].aResetFlag, rFlagList, ' ', 512), thing);
cmd = StrOneWord(cmd, buf);
flag = FlagFind(buf, rFlagList);
if (!flag) {
SendThing("\n\n^wPossible Flags Are:^g\n", thing);
SENDARRAY(rFlagList, 3, thing);
return;
}
BITFLIP(areaList[area].aResetFlag, flag);
SendThing("\n\n^gFlipping ^r", thing);
SendThing(FlagSprintf(buf, flag, rFlagList, '\n', 512), thing);
SendThing("\n\n^gReset/Area Flags Now:\n^c", thing);
SendThing(FlagSprintf(buf, areaList[area].aResetFlag, rFlagList, ' ', 512), thing);
SendThing("\n", thing);
BITSET(areaList[area].aSystem, AS_RSTUNSAVED);
}
CMDPROC(CmdADelay) { /* void CmdProc(THING thing, BYTE* cmd) */
LWORD area;
BYTE buf[512];
cmd = StrOneWord(cmd, NULL);
area = AGetArea(thing, NULL);
if (area == -1) {
SendThing("^wYou cant do that here...\n", thing);
return;
}
sprintf(buf, "^g#:^G[^c%ld^G] ^gName:^G[^c", area);
SendThing(buf, thing);
SendThing(areaList[area].aFileName->sText, thing);
SendThing("^G]\n\n", thing);
if (!*cmd) {
sprintf(buf, "^gReset Delay is Currently: %hd\n^c", areaList[area].aResetDelay);
SendThing(buf, thing);
return;
} else {
sprintf(buf, "^gReset Delay Was: %hd\n^c", areaList[area].aResetDelay);
SendThing(buf, thing);
}
areaList[area].aResetDelay = atoi(cmd);
sprintf(buf, "^gReset Delay Now: %hd\n^c", areaList[area].aResetDelay);
SendThing(buf, thing);
BITSET(areaList[area].aSystem, AS_RSTUNSAVED);
}
CMDPROC(CmdAReset) { /* void CmdProc(THING thing, BYTE* cmd) */
LWORD area;
LWORD areaMin;
LWORD areaMax;
cmd = StrOneWord(cmd, NULL);
area = AGetArea(thing, &cmd);
if (StrExact(cmd, "all")) {
if (!ParseCommandCheck(TYPEFIND("reboot",commandList), BaseControlFind(thing), "")) {
SendThing("^wI'm afraid that sort of thing is reserved for admins and the like.\n", thing);
return;
}
area = 0;
areaMin = 0;
areaMax = areaListMax;
} else {
areaMin = area;
areaMax = area+1;
}
if (area == -1) {
SendThing("^wYou cant do that here...\n", thing);
return;
}
for (area=areaMin; area<areaMax; area++) {
ResetArea(area);
SendThing("^wYou reset ", thing);
SendThing(areaList[area].aFileName->sText, thing);
SendThing("\n", thing);
}
}
CMDPROC(CmdAReboot) { /* void CmdProc(THING thing, BYTE* cmd) */
LWORD area;
LWORD i;
THING *t;
THING *next;
LWORD areaMin;
LWORD areaMax;
cmd = StrOneWord(cmd, NULL);
area = AGetArea(thing, &cmd);
if (StrExact(cmd, "all")) {
if (!ParseCommandCheck(TYPEFIND("reboot",commandList), BaseControlFind(thing), "")) {
SendThing("^wI'm afraid that sort of thing is reserved for admins and the like.\n", thing);
return;
}
area = 0;
areaMin = 0;
areaMax = areaListMax;
} else {
areaMin = area;
areaMax = area+1;
}
if (area == -1) {
SendThing("^wYou cant do that here...\n", thing);
return;
}
for (area=areaMin; area<areaMax; area++) {
/* Clear everything out */
for (i=0; i<areaList[area].aWldIndex.iNum; i++) {
for( t=areaList[area].aWldIndex.iThing[i]->tContain; t; t=next ) {
next = t->tNext;
if (t->tType==TTYPE_MOB)
ThingFree(t);
else if (t->tType==TTYPE_OBJ && Obj(t)->oTemplate->oType != OTYPE_RESETCMD)
ThingFree(t);
}
}
/* Reset it */
ResetArea(area);
SendThing("^wYou reboot ", thing);
SendThing(areaList[area].aFileName->sText, thing);
SendThing("\n", thing);
}
}
CMDPROC(CmdAProperty) { /* void CmdProc(THING thing, BYTE* cmd) */
LWORD area;
BYTE strName[256];
cmd = StrOneWord(cmd, NULL);
area = AGetArea(thing, &cmd);
if (area == -1)
return;
sprintf(strName, "^cArea ^w%s^c/", areaList[area].aFileName->sText);
if (EditProperty(thing, "APROPERTY", cmd, strName, &areaList[area].aResetThing.tProperty))
EDITFLAG(thing, &areaList[area].aSystem, AS_RSTUNSAVED);
}
CMDPROC(CmdACompile) { /* void CmdProc(THING *thing, BYTE* cmd) */
LWORD area;
BYTE buf[256];
PROPERTY *property;
LWORD areaMin;
LWORD areaMax;
cmd = StrOneWord(cmd, NULL);
area = AGetArea(thing, &cmd);
if (StrExact(cmd, "all")) {
if (!ParseCommandCheck(TYPEFIND("reboot",commandList), BaseControlFind(thing), "")) {
SendThing("^wI'm afraid that sort of thing is reserved for admins and the like.\n", thing);
return;
}
area = 0;
areaMin = 0;
areaMax = areaListMax;
} else {
areaMin = area;
areaMax = area+1;
}
if (area == -1) {
SendThing("^wYou cant do that here...\n", thing);
return;
}
for (area=areaMin; area<areaMax; area++) {
sprintf(buf, "^yCOMPILE: ^c%s\n", areaList[area].aFileName->sText);
SendThing(buf, thing);
for (property = areaList[area].aResetThing.tProperty; property; property=property->pNext) {
SendThing("^gProp.: ^c", thing);
SendThing(property->pKey->sText, thing);
SendThing("\n", thing);
if (property->pKey->sText[0]=='@') {
if (!CodeCompileProperty(property,thing))
CodeSetFlag(&areaList[area].aResetThing, areaList[area].aResetThing.tProperty);
}
}
}
}
CMDPROC(CmdADecomp) { /* void CmdProc(THING *thing, BYTE* cmd) */
LWORD area;
BYTE buf[256];
PROPERTY *property;
area = AGetArea(thing, &cmd);
if (area == -1)
return;
sprintf(buf, "^yDECOMP: ^c%s\n", areaList[area].aFileName->sText);
SendThing(buf, thing);
for (property = areaList[area].aResetThing.tProperty; property; property=property->pNext) {
SendThing("^gProp.: ^c", thing);
SendThing(property->pKey->sText, thing);
SendThing("\n", thing);
if (property->pKey->sText[0]=='@') {
if (!CodeDecompProperty(property,thing))
CodeClearFlag(&areaList[area].aResetThing, areaList[area].aResetThing.tProperty);
}
}
}
/* actually this should be CmdRSave */
CMDPROC(CmdASave) { /* void CmdProc(THING thing, BYTE* cmd) */
LWORD area;
BYTE buf[512];
SOCK *sock;
LWORD areaMin;
LWORD areaMax;
cmd = StrOneWord(cmd, NULL);
area = AGetArea(thing, &cmd);
if (StrExact(cmd, "all")) {
if (!ParseCommandCheck(TYPEFIND("reboot",commandList), BaseControlFind(thing), "")) {
SendThing("^wI'm afraid that sort of thing is reserved for admins and the like.\n", thing);
return;
}
area = 0;
areaMin = 0;
areaMax = areaListMax;
} else {
areaMin = area;
areaMax = area+1;
}
if (area == -1) {
SendThing("^wYou cant do that here...\n", thing);
return;
}
for (area=areaMin; area<areaMax; area++) {
if (BIT(areaList[area].aSystem, AS_RSTSHOWN))
SendThing("WARNING: Reset editing currently in progress\n", thing);
if (!BIT(areaList[area].aSystem, AS_RSTUNSAVED)) {
SendThing("There are no unsaved changes!\n", thing);
} else {
BITFLIP(areaList[area].aSystem, AS_RSTUNSAVED);
ResetWrite(area);
sock = BaseControlFind(thing);
sprintf(buf, "%s.rst saved by %s. (%ld resets)\n",
areaList[area].aFileName->sText,
sock->sHomeThing->tSDesc->sText,
areaList[area].aResetNum);
Log(LOG_AREA, buf);
sprintf(buf, "%s.rst saved. (^w%ld resets^V)\n", areaList[area].aFileName->sText, areaList[area].aResetNum);
SendThing(buf, thing);
}
}
}