/* ....[@@@..[@@@..............[@.................. 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 ------------------------------------------------------------------------------ pc_olc.cc */ #include "config.h" #include "string.h" #include "llist.h" #include "room.h" #include "repop.h" #include "hash.h" #include "server.h" #include "repop.h" #include "area.h" #include "bit.h" #include "edit.h" #include "pc.h" #include "help.h" #include "global.h" int saveAreaList(); bool PC::checkSecurity() { if( !in_room ) return false; else if( security > in_room->getArea()->getSecurity() ) return false; return true; } void PC::quitEditor() { if( editor ) { delete editor; editor = 0; } out( "Editor done.\n\r" ); } int saveAreaList(); void PC::do_aedit( const String & arg ) { String arg1; String arg2; if( !arg ) { editor = new AreaEditor( this ); editor->setArea( in_room->getArea() ); editor->command( "" ); return; } else { Area * area; arg.startArgs(); arg1 = arg.getArg(); if( arg1 == "create" || arg1 == "new" ) { arg2 = arg.getArg(); if( !(bool)arg2 ) { out( "You must give an index for new area.\n\r" ); return; } if( lookupArea( arg2 ) ) { out( "An area with that index already exists.\n\r" ); return; } area = new Area; area->setKey( arg2 ); arg2 += ".are"; area->setFile( arg2 ); editor = new AreaEditor( this ); editor->setArea( area ); out( "New area created.\n\r" ); areas.add( area ); area->save(); saveAreaList(); return; } else { area = lookupArea( arg1 ); if( !area ) { out( "No such area.\n\r" ); return; } if( area->getSecurity() < security ) { out( "That area is out of your security range.\n\r" ); return; } editor = new AreaEditor( this ); editor->setArea( area ); editor->command( "" ); return; } } } void PC::do_oedit( const String & arg ) { String arg1; String arg2; String arg3; Index index; Area * pArea; Object * pObj; int type; if( !(bool)arg ) { editor = new ObjectEditor( this ); editor->command( "" ); return; } arg.startArgs(); arg1 = arg.getArg(); arg2 = arg.getArg(); arg3 = arg.getArgRest(); if( arg1 == "new" || arg1 == "create" ) { if( !(bool)arg2 || !(bool)arg3 ) { out( "Usage: oedit { create | new } <type> <index>\n\r" ); return; } type = lookupObjType( arg2 ); if ( !type ) { out ("Wrong item type.\n\r"); return; } index = arg3; if( index.getScope() ) { if( !( pArea = lookupArea( index.getScope() ) ) ) { out( "No such area.\n\r" ); return; } } else pArea = inRoom()->getArea(); if( ( pObj = pArea->lookupObj( index.getKey() ) ) ) { out( "That object already exists.\n\r" ); return; } pObj = Object::createObject(type); pObj->setShort( "no short desc" ); pObj->setLong( "no long desc" ); pArea->addObj( index.getKey(), pObj ); } else { index = arg1; if( !(bool)index.getScope() ) pArea = inRoom()->getArea(); else if( !( pArea = lookupArea( index.getScope() ) ) ) { out( "No such zone.\n\r" ); return; } if( !( pObj = pArea->lookupObj( index.getKey() ) ) ) { out( "No such Object in that zone.\n\r" ); return; } } editor = new ObjectEditor( this ); editor->setIndex( index ); editor->setArea( pArea ); ((ObjectEditor*)editor)->setObj( pObj ); editor->command( "" ); return; } void PC::do_medit( const String & arg ) { String arg1; String arg2; Index index; NPC * pNPC; Area * pArea; if( !(bool)arg ) { editor = new NPCEditor( this ); editor->command( "" ); return; } arg.startArgs(); arg1 = arg.getArg(); arg2 = arg.getArgRest(); if( arg1 == "new" || arg1 == "create" ) { if( !(bool)arg2 ) { out( "Usage: medit { create | new } <index>\n\r" ); return; } index = arg2; if( index.getScope() ) { if( !( pArea = lookupArea( index.getScope() ) ) ) { out( "No such area.\n\r" ); return; } } else pArea = inRoom()->getArea(); if( ( pNPC = pArea->lookupNPC( index.getKey() ) ) ) { out( "That NPC already exists.\n\r" ); return; } pNPC = new NPC; pNPC->setShort( "no short desc" ); pNPC->setLong( "no long desc" ); pArea->addNPC( index.getKey(), pNPC ); } else { index = arg1; if( !(bool)index.getScope() ) pArea = inRoom()->getArea(); else if( !( pArea = lookupArea( index.getScope() ) ) ) { out( "No such zone.\n\r" ); return; } if( !( pNPC = pArea->lookupNPC( index.getKey() ) ) ) { out( "No such NPC in that zone.\n\r" ); return; } } editor = new NPCEditor( this ); editor->setIndex( index ); editor->setArea( pArea ); ((NPCEditor*)editor)->setNPC( pNPC ); editor->command( "" ); return; } void PC::do_redit( const String & arg ) { Index index; Area *pArea; Room *pRoom; if( !(bool)arg ) { editor = new RoomEditor( this ); ((RoomEditor*)editor)->setRoom( inRoom() ); editor->command( "" ); return; } arg.startArgs(); String arg1 = arg.getArg(); String arg2 = arg.getArg(); if( arg1 == "new" || arg1 == "create" ) { if( !(bool)arg2 ) { out( "No index specified for new room.\n\r" ); return; } else { index = arg2; if( !(bool)index.getKey() ) { out( "Room index must contain an index key.\n\r" ); return; } else if( index.getScope() ) { if( !( pArea = lookupArea( index.getScope() ) ) ) { out( "No such area.\n\r" ); return; } } else pArea = in_room->getArea(); if( ( pRoom = pArea->lookupRoom( index.getKey() ) ) ) { out( "A room already exists with that index.\n\r" ); return; } pRoom = new Room( pArea, index.getKey() ); pArea->addRoom( pRoom ); editor = new RoomEditor( this ); ((RoomEditor*)editor)->setRoom( pRoom ); editor->command( "" ); } return; } // Now find a command so see if it is a room index index = arg1; if( index.getScope() ) { if( !( pArea = lookupArea( index.getScope() ) ) ) { out( "No such area " ); out( index.getScope() ); out( "\n\r" ); return; } else if( !( pRoom = pArea->lookupRoom( index.getKey() ) ) ) { out( "No such room " ); out( index.asString() ); out( " in area " ); out( index.getScope() ); out( "\n\r" ); return; } editor = new RoomEditor( this ); ((RoomEditor*)editor)->setRoom( pRoom ); editor->command( "" ); return; } else { if( !( pRoom = inRoom()->getArea()->lookupRoom( index.getKey() ) ) ) { out( "No such room in this area.\n\r" ); return; } editor = new RoomEditor( this ); ((RoomEditor*)editor)->setRoom( pRoom ); editor->command( "" ); return; } } void PC::do_hedit( const String & arg ) { Help * help; if ( !(bool)arg ) { editor = new HelpEditor(this); editor->command(""); return; } else { // or hashtable ? for_each(helps_ll, help) { if ( help->isName(arg) ) break; } if ( help ) { editor = new HelpEditor(this); ((HelpEditor*)editor)->setHelp(help); editor->command(""); return; } else { help = new Help(); help->setName(arg); help->setFileName( String("change.me.filename") ); editor = new HelpEditor(this); ((HelpEditor*)editor)->setHelp(help); Help::add(help); editor->command(""); return; } } } void PC::do_mload( const String & arg ) { Index index( arg ); const NPC *prototype; // Check for scope, if not provide default scope // Default to the area we are standing in, if not // resolved then clear the area field and look for global if( !(bool)index.getScope() ) { index.setScope( in_room->getArea()->getKey() ); if( !( prototype = lookupNPC( index ) ) ) index.setScope( "" ); } if( !( prototype = lookupNPC( index ) ) ) { out( "No such mobile.\n\r" ); return; } NPC * pNPC = new NPC( *prototype ); pNPC->toWorld(); // Add a hit attack to the npc's list. // Bare handed is 1 to size squared ( human = 3 * 3 ) for max dam pNPC->addAttack( CLAW, 1, pNPC->getSize() * pNPC->getSize() ); in_room->addCharInv( pNPC ); String str; str << "Mobile '" << pNPC->getShort() << "' loaded.\n\r"; out( str ); str.clr(); str << name << " has created " << pNPC->getShort() << "\n\r"; in_room->outAllCharExcept( str, this, 0 ); } void PC::do_oload( const String & arg ) { Index index( arg ); const Object * prototype; // Check for scope, if not provide default scope // Default to the area we are standing in, if not // resolved then clear the area field and look for global if( !(bool)index.getScope() ) { index.setScope( in_room->getArea()->getKey() ); if( !( prototype = lookupObj( index ) ) ) index.setScope( "" ); } if( !( prototype = lookupObj( index ) ) ) { out( "No such object.\n\r" ); return; } Object * pObj = prototype->clone(); pObj->toWorld(); inRoom()->addObjInv( pObj ); String str; str << "Object '" << pObj->getShort() << "' loaded.\n\r"; out( str ); str.clr(); str << name << " has created " << pObj->getShort() << "\n\r"; in_room->outAllCharExcept( str, this, 0 ); } void PC::do_repops( const String & arg ) { Repop *repop; String str; int i = 1; if( arg == "list" ) { in_room->repops.reset(); while( ( repop = in_room->repops.peek() ) ) { str << '[' << i++ << "] " << repop->type << " " << repop->index.asString(); if( repop->getPtr() ) str << " -> " << repop->getPtr()->getShort(); str << "\n\r"; in_room->repops.next(); } out( str ); } else if( arg == "room" ) { in_room->repop(); out( "Room reset.\n\r" ); } else if( arg == "area" ) { in_room->getArea()->repop(); out( "Area reset.\n\r" ); } else if( arg == "world" ) { LList<Area> tList = areas; Area *area; tList.reset(); while( ( area = tList.peek() ) ) { tList.next(); area->repop(); } } else { out( "Usage: repop { list | room | area | world }\n\r" ); return; } } void saveHelps(); void saveGuilds(); void savePersistentData(); // we have to make more accurate functions void PC::do_dbsave( const String & ) { LList<Area> tList = areas; Area *area; tList.reset(); while( ( area = tList.peek() ) ) { tList.next(); area->save(); } saveAreaList(); saveHelps(); saveGuilds(); savePersistentData(); out( "Zone database saved.\n\r" ); }