/* * 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; } } }