/*
* list.cpp
* This program is a utility that lists out monsters, objects and rooms.
* ____ _
* | _ \ ___ __ _| |_ __ ___ ___
* | |_) / _ \/ _` | | '_ ` _ \/ __|
* | _ < __/ (_| | | | | | | \__ \
* |_| \_\___|\__,_|_|_| |_| |_|___/
*
* Permission to use, modify and distribute is granted via the
* Creative Commons - Attribution - Non Commercial - Share Alike 3.0 License
* http://creativecommons.org/licenses/by-nc-sa/3.0/
*
* Copyright (C) 2007-2009 Jason Mitchell, Randi Mitchell
* Contributions by Tim Callahan, Jonathan Hseu
* Based on Mordor (C) Brooke Paul, Brett J. Vickers, John P. Freeman
*
*/
#include <sstream>
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include "mud.h"
#include <dirent.h>
void handleListArgs(int argc, char *argv[]);
char oname[81];
char Str[240];
CatRef objToFind, crtToFind, extToFind;
int rangeLow = 0, rangeHigh = 32000, Type = -1, Wear = -1,minArmor = 0, dam = 0, Levlo = 1, Levhi = 69, Quests;
int Flag[15], Notflag[15], Spell[15], Spellnum=0, Ospell=-1, Flagnum=0, Notflagnum=0, Fd=1, uniqueOnly = 0, Key=0, noExits=0, TrainingClass=-1;
void listCrt(int rLow=0, int rHigh=16000);
void listObj(int rLow=0, int rHigh=16000);
void listRoom(int rLow=0, int rHigh=16000);
void printMonsterHeader();
void printMonster(Monster* toPrint);
void printObjectHeader();
void printObject(Object* toPrint);
void printRoomHeader();
void printRoom(Room* toPrint);
void abort() {
std::cout << "list <m|o|r> [options]\n";
std::cout << "[options]: -r#:# index range\n";
std::cout << " -c# rooms with training for class #.\n";
std::cout << " -s# descriptor for output\n";
std::cout << " -l#:# level range\n";
std::cout << " -t# object type\n";
std::cout << " -w# object wearflag\n";
std::cout << " -f# flag set\n";
std::cout << " -F# flag NOT set\n";
std::cout << " -S# spell set\n";
std::cout << " -q quest objects only\n";
std::cout << " -o# monsters/rooms carrying object\n";
std::cout << " -m# rooms with monster\n";
std::cout << " -x# rooms with exit to room #\n";
std::cout << " -p# magic power(spell) #\n";
std::cout << " -u List all unique objects\n";
std::cout << " -n List all rooms without exits\n";
exit(0);
}
int main(int argc, char *argv[]) {
if(argc < 2)
abort();
gConfig = Config::getInstance();
gConfig->load();
fclose(stderr);
if(argc > 2)
handleListArgs(argc-2, &argv[2]);
switch(argv[1][0]) {
case 'm':
case 'c':
listCrt(rangeLow, rangeHigh);
break;
case 'o':
listObj(rangeLow, rangeHigh);
break;
case 'r':
listRoom(rangeLow, rangeHigh);
break;
case 'a':
listObj(rangeLow, rangeHigh);
listCrt(rangeLow, rangeHigh);
listRoom(rangeLow, rangeHigh);
break;
default:
abort();
}
}
void listObj(int rLow, int rHigh) {
char filename[256];
int curNum, curFile;
xmlDocPtr xmlDoc;
xmlNodePtr rootNode;
xmlNodePtr curNode;
int num;
Object* curObject = 0;
bool skipFromFlag = false;
struct dirent *dirp=0;
DIR *dir=0;
printObjectHeader();
if((dir = opendir(OBJPATH)) == NULL) {
printf("Directory could not be opened.\n");
return;
}
while((dirp = readdir(dir)) != NULL) {
if(dirp->d_name[0] == '.')
continue;
// Current mob we're looking at, start at rangeLow
curNum = rLow;
// Current file we're looking at
curFile = curNum/OFILESIZE;
while(curNum <= rHigh) {
sprintf(filename, "%s%s/o%02d.xml", OBJPATH, dirp->d_name, curFile);
if((xmlDoc = xml::loadFile(filename, "Objects")) == NULL) {
// Ok so we can't load this file, means none of them in this range are going to be found
// so jump to the next file and increase the curNum as appropriate
curFile++;
curNum = curFile * OFILESIZE;
continue;
}
rootNode = xmlDocGetRootElement(xmlDoc);
curNode = rootNode->children;
while(curNode != NULL) {
if(NODE_NAME(curNode, "Object")) {
skipFromFlag = false;
num = xml::getIntProp(curNode, "Num");
// Passed the highest mob we want to see, so quit
if(num > rHigh)
break;
// Lower mob than we want to see, go to the next one
if(num < rLow) {
curNode = curNode->next;
continue;
}
// If we got here, we probly want to see it so lets print it out and set the curNum to what we're at
curNum = num;
curObject = new Object;
if(!curObject) abort();
curObject->info.id = num;
curObject->info.setArea(dirp->d_name);
curObject->readFromXml(curNode);
int j;
for(j=0; j<Flagnum; j++)
if(!curObject->flagIsSet(Flag[j]-1))
skipFromFlag = true;
for(j=0; j<Notflagnum; j++)
if(curObject->flagIsSet(Notflag[j]-1))
skipFromFlag = true;
// Invert the logic here, test for cases to ignore
if(!strcmp(curObject->name, "...") ||
!strcmp(curObject->name, "none") ||
(Type != -1 && curObject->type != Type) ||
(Wear != -1 && curObject->wearflag != Wear) ||
(Ospell != -1 && curObject->magicpower != Ospell) ||
(Quests && !curObject->questnum) ||
(minArmor && curObject->armor < minArmor) ||
(uniqueOnly && curObject->max_unique == 0) ||
skipFromFlag)
{
// Do nothing
}
else
printObject(curObject);
delete curObject;
}
continueObj:
curNode = curNode->next;
}
xmlFreeDoc(xmlDoc);
xmlCleanupParser();
// Move on to the next file
curFile++;
curNum = curFile * OFILESIZE;
}
}
}
void listCrt(int rLow, int rHigh) {
char filename[256];
int curNum, curFile;
xmlDocPtr xmlDoc;
xmlNodePtr rootNode;
xmlNodePtr curNode;
int j, num;
Monster* curMonster = 0;
bool skipThisMon = false;
struct dirent *dirp=0;
DIR *dir=0;
printMonsterHeader();
if((dir = opendir(MONPATH)) == NULL) {
printf("Directory could not be opened.\n");
return;
}
while((dirp = readdir(dir)) != NULL) {
if(dirp->d_name[0] == '.')
continue;
// Current mob we're looking at, start at rangeLow
curNum = rLow;
// Current file we're looking at
curFile = curNum/MFILESIZE;
while(curNum <= rHigh) {
sprintf(filename, "%s%s/m%02d.xml", MONPATH, dirp->d_name, curFile);
if((xmlDoc = xml::loadFile(filename, "Creatures")) == NULL) {
// Ok so we can't load this file, means none of them in this range are going to be found
// so jump to the next file and increase the curNum as appropriate
curFile++;
curNum = curFile * MFILESIZE;
continue;
}
rootNode = xmlDocGetRootElement(xmlDoc);
curNode = rootNode->children;
while(curNode != NULL) {
if(NODE_NAME(curNode, "Creature")) {
num = xml::getIntProp(curNode, "Num");
skipThisMon = false;
// Passed the highest mob we want to see, so quit
if(num > rHigh)
break;
// Lower mob than we want to see, go to the next one
if(num < rLow) {
curNode = curNode->next;
continue;
}
// If we got here, we probly want to see it so lets print it out and set the curNum to what we're at
curNum = num;
curMonster = new Monster;
if(!curMonster) abort();
curMonster->info.id = num;
curMonster->info.setArea(dirp->d_name);
xml::copyPropToBString(curMonster->version, curNode, "Version");
curMonster->readFromXml(curNode);
if(objToFind.id) {
for(j=0; j<10; j++)
if(curMonster->carry[j] == objToFind) {
skipThisMon = false;
break;
} else
skipThisMon = true;
}
if(curMonster->level < Levlo || curMonster->level > Levhi)
skipThisMon = true;
for(j=0; j<Flagnum; j++)
if(!curMonster->flagIsSet(Flag[j]-1))
skipThisMon = true;
for(j=0; j<Spellnum; j++)
if(!curMonster->spellIsKnown(Spell[j]-1))
skipThisMon = true;
for(j=0; j<Notflagnum; j++)
if(curMonster->flagIsSet(Notflag[j]-1))
skipThisMon = true;
if(!strcmp(curMonster->name, "...") ||
!strcmp(curMonster->name, "none") ||
!strcmp(curMonster->name, "clay form") ||
skipThisMon == true)
{
// Do nothing
}
else
printMonster(curMonster);
free_crt(curMonster);
}
curNode = curNode->next;
}
xmlFreeDoc(xmlDoc);
xmlCleanupParser();
// Move on to the next file
curFile++;
curNum = curFile * MFILESIZE;
}
}
}
void listRoom(int rLow, int rHigh) {
std::map<int, crlasttime>::iterator it;
std::map<int, CatRef>::iterator ct;
char filename[256];
int curNum;
xmlDocPtr xmlDoc;
xmlNodePtr rootNode;
int j;
Room* curRoom = 0;
bool skipThisRoom = false;
bool found = false;
xtag *ep;
otag *op, *cnt;
struct dirent *dirp=0;
DIR *dir=0;
//printRoomHeader();
if((dir = opendir(ROOMPATH)) == NULL) {
printf("Directory could not be opened.\n");
return;
}
while((dirp = readdir(dir)) != NULL) {
if(dirp->d_name[0] == '.')
continue;
curNum = rLow;
while(curNum <= rHigh) {
sprintf(filename, "%s%s/r%05d.xml", ROOMPATH, dirp->d_name, curNum);
if((xmlDoc = xml::loadFile(filename, "Room")) == NULL) {
curNum++;
continue;
}
rootNode = xmlDocGetRootElement(xmlDoc);
j = xml::getIntProp(rootNode, "Num");
if(j != curNum) {
std::cout << "ERROR: Room " << j << " when expecting " << curNum << ".\n";
curNum++;
continue;
}
skipThisRoom = false;
curRoom = new Room;
// if(!curRoom->readFromXml(rootNode) != 0) {
// delete curRoom;
// curNum++;
// continue;
// }
curRoom->readFromXml(rootNode);
for(j=0; j<Flagnum; j++)
if(!curRoom->flagIsSet(Flag[j]-1))
skipThisRoom = true;
for(j=0; j<Notflagnum; j++)
if(curRoom->flagIsSet(Notflag[j]-1))
skipThisRoom = true;
if(curRoom->name[0] == ' ' || curRoom->name[0] == '\0')
skipThisRoom = true;
if(objToFind.id) {
found = false;
for(it = curRoom->permObjects.begin(); it != curRoom->permObjects.end() ; it++) {
if((*it).second.cr == objToFind) {
found = true;
break;
}
}
if(!found)
skipThisRoom = true;
}
if(crtToFind.id) {
found = false;
for(ct = curRoom->wander.begin(); ct != curRoom->wander.end() ; ct++) {
if((*ct).second.cr == crtToFind) {
found = true;
break;
}
}
for(it = curRoom->permMonsters.begin(); it != curRoom->permMonsters.end() ; it++) {
if((*it).second.cr == crtToFind) {
found = true;
break;
}
}
if(!found)
skipThisRoom = true;
}
if(extToFind.id) {
found = false;
ep = curRoom->first_ext;
while(ep) {
if(ep->ext->room == extToFind) {
found = true;
break;
}
ep = ep->next_tag;
}
if(!found)
skipThisRoom = true;
}
if(Key != -1) {
found = false;
ep = curRoom->first_ext;
while(ep) {
if(ep->ext->key == Key) {
found = true;
break;
}
ep = ep->next_tag;
}
if(!found)
skipThisRoom = true;
}
if(noExits) {
found = false;
ep = curRoom->first_ext;
while(ep) {
if(ep->ext->room.id > 0) {
found=1; break;
}
}
ep = ep->next_tag;
if(found)
skipThisRoom = true;
}
if(oname[0] != 0) {
op = curRoom->first_obj;
while(op) {
if(!strcmp(op->obj->name, oname))
found = true;
if(op->obj->type == CONTAINER) {
cnt = op->obj->first_obj;
while(cnt) {
if(!strcmp(cnt->obj->name, oname)) {
found = true;
}
cnt = cnt->next_tag;
}
}
op = op->next_tag;
}
if(!found)
skipThisRoom = true;
}
if(TrainingClass != -1 && curRoom->whatTraining() != TrainingClass)
skipThisRoom = true;
if(!skipThisRoom)
printRoom(curRoom);
delete curRoom;
xmlFreeDoc(xmlDoc);
xmlCleanupParser();
// Move on to the next file
curNum++;
}
}
}
void printObjectHeader() {
std::ostringstream objectStr;
objectStr << "Index";
objectStr << "|";
objectStr << "Name";
objectStr << "|";
objectStr << "Object Type";
objectStr << "|";
objectStr << "Value";
objectStr << "|";
objectStr << "DN";
objectStr << "|";
objectStr << "DS";
objectStr << "|";
objectStr << "DP";
objectStr << "|";
objectStr << "Adj";
objectStr << "|";
objectStr << "NumAtk";
objectStr << "|";
objectStr << "Delay";
objectStr << "|";
objectStr << "ShotsCur";
objectStr << "|";
objectStr << "ShotsMax";
objectStr << "|";
objectStr << "Armor";
objectStr << "|";
objectStr << "Bulk";
objectStr << "|";
objectStr << "Weight";
objectStr << "|";
objectStr << "WearLoc";
objectStr << "|";
objectStr << "Magicpower";
objectStr << "|";
objectStr << "Level";
objectStr << "|";
objectStr << "ShopValue";
objectStr << "|";
objectStr << "Questnum";
objectStr << "\n";
bstring printStr = objectStr.str();
std::cout << printStr;
}
bstring getWearLoc(int loc) {
switch(loc) {
case 1: return("Body");
case 2: return("Arms");
case 3: return("Legs");
case 4: return("Neck");
case 5: return("Waist");
case 6: return("Hands");
case 7: return("Head");
case 8: return("Feet");
case 9: return("Finger");
case 10:
case 11:
case 12:
case 13:
case 14:
case 15:
case 16: return("BadFinger");
case 17: return("Hold");
case 18: return("Shield");
case 19: return("Face");
case 20: return("Wielded");
default: return("Not Set");
}
}
void printObject(Object* toPrint) {
std::ostringstream objectStr;
objectStr << toPrint->info.str();
objectStr << "|";
objectStr << toPrint->name;
objectStr << "|";
objectStr << obj_type(toPrint->type) << "(" << toPrint->type << ")";
objectStr << "|";
objectStr << toPrint->value[2];
objectStr << "|";
objectStr << toPrint->ndice;
objectStr << "|";
objectStr << toPrint->sdice;
objectStr << "|";
objectStr << toPrint->pdice;
objectStr << "|";
objectStr << toPrint->adjustment;
objectStr << "|";
objectStr << toPrint->numAttacks;
objectStr << "|";
objectStr << toPrint->getWeaponDelay();
objectStr << "|";
objectStr << toPrint->shotscur;
objectStr << "|";
objectStr << toPrint->shotsmax;
objectStr << "|";
objectStr << toPrint->armor;
objectStr << "|";
objectStr << toPrint->getBulk();
objectStr << "|";
objectStr << toPrint->weight;
objectStr << "|";
objectStr << getWearLoc(toPrint->wearflag) << "(" << toPrint->wearflag << ")" objectStr << "|";
if(toPrint->magicpower && (toPrint->type == POTION || toPrint->type == SCROLL || toPrint->type == WAND || toPrint->flagIsSet(O_WEAPON_CASTS)))
objectStr << get_spell_name(toPrint->magicpower - 1) << "(" << toPrint->magicpower << ")";
else if(toPrint->magicpower && toPrint->type == SONGSCROLL)
objectStr << get_song_name(toPrint->magicpower - 1) << "(" << toPrint->magicpower << ")";
else
objectStr << toPrint->magicpower;
objectStr << "|";
objectStr << toPrint->level;
objectStr << "|";
objectStr << toPrint->shopValue;
objectStr << "|";
if(toPrint->questnum && toPrint->questnum <= numQuests)
objectStr << gConfig->questTable[toPrint->questnum-1] << "(" << toPrint->questnum << ")";
else
objectStr << toPrint->questnum;
objectStr << "\n";
bstring printStr = objectStr.str();
std::cout << printStr;
}
void printMonsterHeader() {
std::ostringstream monsterStr;
monsterStr << "Index";
monsterStr << "|";
monsterStr << "Name";
monsterStr << "|";
monsterStr << "MonsterType";
monsterStr << "|";
monsterStr << "HD";
monsterStr << "|";
monsterStr << "Class";
monsterStr << "|";
monsterStr << "Race";
monsterStr << "|";
monsterStr << "Level";
monsterStr << "|";
monsterStr << "Experience";
monsterStr << "|";
monsterStr << "Gold";
monsterStr << "|";
monsterStr << "Alignment";
monsterStr << "|";
monsterStr << "Hp";
monsterStr << "|";
monsterStr << "Mp";
monsterStr << "|";
monsterStr << "Strength";
monsterStr << "|";
monsterStr << "Dexterity";
monsterStr << "|";
monsterStr << "Constitution";
monsterStr << "|";
monsterStr << "Intelligence";
monsterStr << "|";
monsterStr << "Piety";
monsterStr << "|";
monsterStr << "ndice";
monsterStr << "|";
monsterStr << "sdice";
monsterStr << "|";
monsterStr << "pdice";
monsterStr << "\n";
monsterStr << "\n";
bstring printStr = monsterStr.str();
std::cout << printStr;
}
void printMonster(Monster* toPrint) {
std::ostringstream monsterStr;
monsterStr << toPrint->info.str();
monsterStr << "|";
monsterStr << toPrint->name;
monsterStr << "|";
monsterStr << getName(toPrint->type);
monsterStr << "|";
monsterStr << getHitdice(toPrint->type);
monsterStr << "|";
monsterStr << get_class_string(toPrint->cClass);
monsterStr << "|";
monsterStr << gConfig->getRace(toPrint->race)->getName();
monsterStr << "|";
monsterStr << toPrint->level;
monsterStr << "|";
monsterStr << toPrint->experience;
monsterStr << "|";
monsterStr << toPrint->gold;
monsterStr << "|";
monsterStr << toPrint->alignment;
monsterStr << "|";
monsterStr << toPrint->hp.getMax();
monsterStr << "|";
monsterStr << toPrint->mp.getMax();
monsterStr << "|";
monsterStr << toPrint->strength.max;
monsterStr << "|";
monsterStr << toPrint->dexterity.max;
monsterStr << "|";
monsterStr << toPrint->constitution.max;
monsterStr << "|";
monsterStr << toPrint->intelligence.max;
monsterStr << "|";
monsterStr << toPrint->piety.max;
monsterStr << "|";
monsterStr << toPrint->ndice;
monsterStr << "|";
monsterStr << toPrint->sdice;
monsterStr << "|";
monsterStr << toPrint->pdice;
monsterStr << "\n";
bstring printStr = monsterStr.str();
std::cout << printStr;
}
bstring getWearLoc(int loc) {
switch(loc) {
case 1: return("Body");
case 2: return("Arms");
case 3: return("Legs");
case 4: return("Neck");
case 5: return("Waist");
case 6: return("Hands");
case 7: return("Head");
case 8: return("Feet");
case 9: return("Finger");
case 10:
case 11:
case 12:
case 13:
case 14:
case 15:
case 16: return("BadFinger");
case 17: return("Hold");
case 18: return("Shield");
case 19: return("Face");
case 20: return("Wielded");
default: return("Not Set");
}
}
void printObject(Object* toPrint) {
std::ostringstream objectStr;
objectStr << toPrint->info.str();
objectStr << "|";
objectStr << toPrint->name;
objectStr << "|";
objectStr << obj_type(toPrint->type) << "(" << toPrint->type << ")";
objectStr << "|";
objectStr << toPrint->value[2];
objectStr << "|";
objectStr << toPrint->ndice;
objectStr << "|";
objectStr << toPrint->sdice;
objectStr << "|";
objectStr << toPrint->pdice;
objectStr << "|";
objectStr << toPrint->adjustment;
objectStr << "|";
objectStr << toPrint->numAttacks;
objectStr << "|";
objectStr << toPrint->delay;
objectStr << "|";
objectStr << toPrint->shotscur;
objectStr << "|";
objectStr << toPrint->shotsmax;
objectStr << "|";
objectStr << toPrint->armor;
objectStr << "|";
objectStr << toPrint->getBulk();
objectStr << "|";
objectStr << toPrint->weight;
objectStr << "|";
objectStr << getWearLoc(toPrint->wearflag) << "(" << toPrint->wearflag << ")";
objectStr << "|";
if(toPrint->magicpower && (toPrint->type == POTION || toPrint->type == SCROLL || toPrint->type == WAND || toPrint->flagIsSet(O_WEAPON_CASTS)))
objectStr << get_spell_name(toPrint->magicpower - 1) << "(" << toPrint->magicpower << ")";
else if(toPrint->magicpower && toPrint->type == SONGSCROLL)
objectStr << get_song_name(toPrint->magicpower - 1) << "(" << toPrint->magicpower << ")";
else
objectStr << toPrint->magicpower;
objectStr << "|";
objectStr << toPrint->level;
objectStr << "|";
objectStr << toPrint->shopValue;
objectStr << "|";
if(toPrint->questnum && toPrint->questnum <= numQuests)
objectStr << gConfig->questTable[toPrint->questnum-1] << "(" << toPrint->questnum << ")";
else
objectStr << toPrint->questnum;
objectStr << "|";
objectStr << "\n";
bstring printStr = objectStr.str();
std::cout << printStr;
}
void printMonsterHeader() {
std::ostringstream monsterStr;
monsterStr << "Index";
monsterStr << "|";
monsterStr << "Name";
monsterStr << "|";
monsterStr << "MonsterType";
monsterStr << "|";
monsterStr << "HD";
monsterStr << "|";
monsterStr << "Class";
monsterStr << "|";
monsterStr << "Race";
monsterStr << "|";
monsterStr << "Level";
monsterStr << "|";
monsterStr << "Experience";
monsterStr << "|";
monsterStr << "Gold";
monsterStr << "|";
monsterStr << "Alignment";
monsterStr << "|";
monsterStr << "Hp";
monsterStr << "|";
monsterStr << "Mp";
monsterStr << "|";
monsterStr << "Strength";
monsterStr << "|";
monsterStr << "Dexterity";
monsterStr << "|";
monsterStr << "Constitution";
monsterStr << "|";
monsterStr << "Intelligence";
monsterStr << "|";
monsterStr << "Piety";
monsterStr << "|";
monsterStr << "ndice";
monsterStr << "|";
monsterStr << "sdice";
monsterStr << "|";
monsterStr << "pdice";
monsterStr << "\n";
monsterStr << "\n";
bstring printStr = monsterStr.str();
std::cout << printStr;
}
void printMonster(Monster* toPrint) {
std::ostringstream monsterStr;
monsterStr << toPrint->info.str();
monsterStr << "|";
monsterStr << toPrint->name;
monsterStr << "|";
monsterStr << get_mobtype_name(toPrint->type);
monsterStr << "|";
monsterStr << get_mob_hitdice(toPrint->type);
monsterStr << "|";
monsterStr << get_class_string(toPrint->cClass);
monsterStr << "|";
monsterStr << gConfig->getRace(toPrint->race)->getName();
monsterStr << "|";
monsterStr << toPrint->level;
monsterStr << "|";
monsterStr << toPrint->experience;
monsterStr << "|";
monsterStr << toPrint->gold;
monsterStr << "|";
monsterStr << toPrint->alignment;
monsterStr << "|";
monsterStr << toPrint->hp.getMax();
monsterStr << "|";
monsterStr << toPrint->mp.getMax();
monsterStr << "|";
monsterStr << toPrint->strength.max;
monsterStr << "|";
monsterStr << toPrint->dexterity.max;
monsterStr << "|";
monsterStr << toPrint->constitution.max;
monsterStr << "|";
monsterStr << toPrint->intelligence.max;
monsterStr << "|";
monsterStr << toPrint->piety.max;
monsterStr << "|";
monsterStr << toPrint->ndice;
monsterStr << "|";
monsterStr << toPrint->sdice;
monsterStr << "|";
monsterStr << toPrint->pdice;
monsterStr << "\n";
bstring printStr = monsterStr.str();
std::cout << printStr;
}
void printRoomHeader() {
std::ostringstream roomStr;
roomStr << "Num";
roomStr << "|";
roomStr << "Name";
roomStr << "|";
roomStr << "wander.random Monsters";
roomStr << "|";
roomStr << "wander.traffic";
roomStr << "\n";
bstring printStr = roomStr.str();
std::cout << printStr;
}
void printRoom(Room* toPrint) {
std::map<int, CatRef>::iterator it;
std::ostringstream roomStr;
roomStr << toPrint->info.str();
roomStr << "|";
roomStr << toPrint->name;
roomStr << "|";
for(it = curRoom->wander.begin(); it != curRoom->wander.end() ; it++) {
roomStr << (*it).second.random[i].str() << "|";
}
roomStr << toPrint->wander.traffic;
roomStr << "\n";
bstring printStr = roomStr.str();
std::cout << printStr;
}
// sprintf(Str, "\n%6s %-40s %-39s %-4s\n", " # ", "Name", "wander.random Monsters", "Traf");
// if(dam != 0) {
// op = rom->first_obj;
// while(op) {
// if(MDAM(op->obj) > dam) {
// printf("%d - %s\n", op->obj->index, op->obj->name);
// count++;
// }
// if(op->obj->type == CONTAINER) {
// cnt = op->obj->first_obj;
// while(cnt) {
// if(MDAM(cnt->obj) > dam) {
// printf("%d - %s\n", cnt->obj->index, cnt->obj->name);
// count++;
// }
// cnt = cnt->next_tag;
// }
// }
// op = op->next_tag;
// }
// }
//
// rom->name[20]=0;
// sprintf(Str, "%5d. %-20.20s %05d/%05d/%05d/%05d/%05d/%05d/%05d/%05d/%05d/%05d %03d%%\n", i, rom->name, rom->wander.random[0], rom->wander.random[1], rom->wander.random[2], rom->wander.random[3], rom->wander.random[4], rom->wander.random[5], rom->wander.random[6], rom->wander.random[7], rom->wander.random[8], rom->wander.random[9], rom->wander.traffic);
// write(Fd, Str, strlen(Str));
// if(!((i-(missing+skipped)-rangeLow+1)%50)) {
// sprintf(Str, "\n%6s %-40s %-39s %-4s\n", " # ", "Name", "wander.random Monsters", "Traf");
// write(Fd, Str, strlen(Str));
// sprintf(Str, "--------------------------------------------------------------------------------------------\n");
// write(Fd, Str, strlen(Str));
// }
void handleListArgs(int argc, char *argv[])
{
char rangestr[80];
int i, j, n;
rangeLow = 0;
rangeHigh = 32000;
for(i=0; i<argc; i++) {
if(argv[i][0] == 0) continue;
if(argv[i][0] != '-')
abort();
switch(argv[i][1]) {
case 'r':
strcpy(rangestr, &argv[i][2]);
n = strlen(rangestr);
rangeLow = -1; rangeHigh = -1;
for(j=1; j<n; j++) {
if(rangestr[j] == ':') {
rangestr[j] = 0;
rangeLow = atoi(rangestr);
rangeHigh = atoi(&rangestr[j+1]);
}
}
if(rangeLow == -1 || rangeHigh == -1 || rangeLow > rangeHigh)
abort();
break;
case 'l':
strcpy(rangestr, &argv[i][2]);
n = strlen(rangestr);
Levlo = -1; Levhi = -1;
for(j=1; j<n; j++) {
if(rangestr[j] == ':') {
rangestr[j] = 0;
Levlo = atoi(rangestr);
Levhi = atoi(&rangestr[j+1]);
}
}
if(Levlo == -1 || Levhi == -1 || Levlo > Levhi)
abort();
break;
case 'c':
minArmor = atoi(&argv[i][2]);
TrainingClass = atoi(&argv[i][2]);
break;
case 't':
Type = atoi(&argv[i][2]);
break;
case 'w':
Wear = atoi(&argv[i][2]);
break;
case 'p':
Ospell = atoi(&argv[i][2]);
break;
case 'f':
Flag[Flagnum++] = atoi(&argv[i][2]);
break;
case 'F':
Notflag[Notflagnum++] = atoi(&argv[i][2]);
break;
case 'q':
Quests = 1;
break;
case 'o':
//objToFind = atoi(&argv[i][2]);
getCatRef(&argv[i][2], &objToFind, 0);
break;
case 'm':
//crtToFind = atoi(&argv[i][2]);
getCatRef(&argv[i][2], &crtToFind, 0);
break;
case 'S':
Spell[Spellnum++] = atoi(&argv[i][2]);
break;
case 's':
Fd = atoi(&argv[i][2]);
break;
case 'x':
//extToFind = atoi(&argv[i][2]);
getCatRef(&argv[i][2], &extToFind, 0);
break;
case 'k':
Key = atoi(&argv[i][2]);
break;
case 'u':
uniqueOnly = 1;
break;
case 'n':
noExits=1;
break;
case 'N':
strncpy(oname, argv[i+1], 80);
i++;
break;
case 'd':
dam = atoi(&argv[i][2]);
break;
default:
break;
}
}
}