roh/conf/area/
roh/game/talk/
roh/help/
roh/monsters/ocean/
roh/objects/ocean/
roh/player/
roh/rooms/area/1/
roh/rooms/misc/
roh/rooms/ocean/
roh/src-2.44b/
/*
 * 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;

		}
	}
}