/* ....[@@@..[@@@..............[@.................. MUD++ is a written from ....[@..[@..[@..[@..[@..[@@@@@....[@......[@.... scratch multi-user swords and ....[@..[@..[@..[@..[@..[@..[@..[@@@@@..[@@@@@.. sorcery game written in C++. ....[@......[@..[@..[@..[@..[@....[@......[@.... This server is an ongoing ....[@......[@..[@@@@@..[@@@@@.................. development project. All ................................................ contributions are welcome. ....Copyright(C).1995.Melvin.Smith.............. Enjoy. ------------------------------------------------------------------------------ Melvin Smith (aka Fusion) msmith@hom.net MUD++ development mailing list mudpp@van.ml.org ------------------------------------------------------------------------------ editarea.cc */ #include "config.h" #include "string.h" #include "llist.h" #include "index.h" #include "room.h" #include "hash.h" #include "area.h" #include "bit.h" #include "edit.h" #include "pc.h" #include "global.h" int saveAreaList() { Area *area; OutputFile out( "../area/area.lst" ); if( !out ) return -1; areas.reset(); while( ( area = areas.peek() ) ) { areas.next(); out << area->getFile() << endl; } out.close(); return 0; } void AreaEditor::command( const String & arg ) { Area *checkArea; Room *room; LList<PC> pcIterate; LList<Area> areaIterate; String str; String arg1; String arg2; arg.startArgs(); arg1 = arg.getArg(); arg2 = arg.getArgRest(); // remainder if( !(bool)arg1 || arg1[0] == '\n' ) { str << "\n\r" << "Name: " << area->getName() << "\n\r" << "Index: " << area->getKey() << "\n\r" << "File: " << area->getFile() << "\n\r" << "Security: " << area->getSecurity() << "\n\r" << "Builder: " << area->getBuilder() << "\n\r" << "Repop: " << area->getRepopMessg() << "\n\r" << "MinMax: " << area->getMinLevel() << " " << area->getMaxLevel() << "\n\r" << "Title: " << area->getTitle() << "\n\r" << "\n\r"; pc->out( str ); return; } else if( arg1 == "reload" || arg1 == "reboot" ) { // There will probably be a problem with someone reloading // an area after an index change but before a save. // Clean it up later. // Check for players in the area. PC *ch; bool save = false; pcIterate = pcs; pcIterate.reset(); while( ( ch = pcIterate.peek() ) ) { pcIterate.next(); if( ch->inRoom()->getArea() == area ) { if( ch == pc ) { save = true; continue; } pc->out( "Can't reload area. There are players in the zone.\n\r" ); return; } } String wasIn; if( save ) { wasIn = pc->inRoom()->getKey(); pc->inRoom()->rmCharInv( pc ); } area->reload(); if( save ) { if( !( room = area->lookupRoom( wasIn ) ) ) { pc->out( "Yipes! The room you were in was not reloaded!\n\r" ); if( !( room = getFirstRoom() ) ) { Cout << "Area reload: no rooms loaded. EeeeK!\n"; mudpp_exit(0); } } room->addCharInv( pc ); } pc->out( "Area reloaded from disk.\n\r" ); Area *pArea; areaIterate = areas; areaIterate.reset(); while( ( pArea = areaIterate.peek() ) ) { areaIterate.next(); pArea->hardLink(); } pc->out( "World relinked.\n\r" ); return; } else if( arg1.isAbbrev( "save" ) ) { if( !area->getDirtyBit() ) { pc->out( "No modifications since last save.\n\r" ); return; } if( !(bool)area->getKey() ) { pc->out( "This area needs an index key first.\n\r" ); return; } area->save(); pc->out( "Area saved.\n\r" ); area->rmDirtyBit(); return; } else if( arg1 == "rooms" ) { Room * pRoom; for_each( area->roomIndex, pRoom ) str.sprintfAdd( "%15s - %s\n\r", pRoom->getKey().chars(), pRoom->getName().chars() ); pc->out( str ); return; } else if( arg1 == "npcs" || arg1 == "mobs" ) { NPC * pNPC; for_each( area->npcIndex, pNPC ) str.sprintfAdd( "%15s - %s\n\r", area->npcIndex.getKey().chars(), pNPC->getShort().chars() ); pc->out( str ); return; } else if( arg1 == "objs" || arg1 == "objects" ) { Object * pObj; for_each( area->objIndex, pObj ) str.sprintfAdd( "%15s - %s\n\r", area->objIndex.getKey().chars(), pObj->getShort().chars() ); pc->out( str ); return; } else if( arg1 == "help" || arg1 == "?" ) { pc->view( "../help/aedit.hlp" ); pc->page( "" ); return; } if( !(bool)arg2 ) { pc->out( "Invalid argument.\n\r" ); return; } if( arg1.isAbbrev( "index" ) ) { if( ( checkArea = lookupArea( arg2 ) ) && checkArea != area ) { pc->out( "There is already an area with that index.\n\r" ); return; } area->setKey( arg2 ); arg2 += ".are"; area->setFile( arg2 ); pc->out( "Area index key set.\n\r" ); pc->out( "Filename is now : " ); pc->out( area->getFile() ); pc->out( "\n\r" ); // Save new area.lst if( saveAreaList() != -1 ) pc->out( "New 'area.lst' saved.\n\r" ); else pc->out( "There was an error writing 'area.lst'\n\r" ); area->save(); return; } else if( arg1.isAbbrev( "name" ) ) { area->setName( arg2 ); pc->out( "Area name set.\n\r" ); } else if( arg1.isAbbrev( "repop" ) ) { str.clr(); str << "\n\r" << arg2 << "\n\r"; area->setRepopMessg( str ); pc->out( "Repop string set.\n\r" ); } else if( arg1.isAbbrev( "title" ) ) { area->setTitle( arg2 ); pc->out( "Area title set.\n\r" ); } else if( arg1.isAbbrev( "minlevel" ) ) { area->setMinLevel( arg2.asInt() ); pc->out( "Minlevel set.\n\r" ); } else if( arg1.isAbbrev( "maxlevel" ) ) { area->setMaxLevel( arg2.asInt() ); pc->out( "Maxlevel set.\n\r" ); } else if( arg1.isAbbrev( "builder" ) ) { area->setBuilder( arg2 ); pc->out( "Builder set.\n\r" ); } else { pc->out( "Invalid command.\n\r" ); return; } area->setDirtyBit(); }