/* ....[@@@..[@@@..............[@.................. 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 ------------------------------------------------------------------------------ editobj.cc */ #include "config.h" #include "string.h" #include "llist.h" #include "index.h" #include "hash.h" #include "server.h" #include "bit.h" #include "spell.h" #include "edit.h" #include "pc.h" #include "object.h" #include "area.h" #include "room.h" #include "global.h" #include "trigs.h" void ObjectEditor::command( const String & arg ) { String str; String str2; String str3; String arg1; String arg2; String arg3; int i; int val1; int val2; Index index1; Modifier * mod; struct TriggerData * td; arg.startArgs(); arg1 = arg.getArg(); arg2 = arg.getArgRest(); if( !obj && !(bool)arg1 ) { pc->out( "No object to edit.\n\r" ); return; } else if( !area ) area = pc->inRoom()->getArea(); /* if( arg1 == "new" || arg1 == "create" ) { index1 = arg2; if( !(bool)index1.getKey() ) { pc->out( "Usage: new [scope:]<index>\n\r" ); return; } if( !(bool)index1.getScope() ) { area = pc->inRoom()->getArea(); index1.setScope( area->getKey() ); } else { area = lookupArea( index1.getScope() ); if( !area ) { pc->out( "No such area(scope) " ); pc->out( index1.getScope() ); pc->out( ".\n\r" ); return; } } if( area->lookupObj( index1.getKey() ) ) { pc->out( "Object " ); pc->out( index1.asString() ); pc->out( " already exists.\n\r" ); return; } setIndex( index1 ); obj = new Object( ITEM_UNUSED ); obj->setShort( "no short" ); obj->setLong( "no long" ); area->addObj( index1.getKey(), obj ); pc->out( "New object created.\n\r" ); return; } else*/ if( arg1 == "list" ) { Object * pObj; for_each( area->objIndex, pObj ) str.sprintfAdd( "%15s - %s\n\r", area->objIndex.getKey().chars(), pObj->getShort().chars() ); pc->out( str ); return; } if( !obj ) { pc->out( "No object to edit.\n\r" ); return; } if( !(bool)arg || arg[0] == '\n' ) { // Display object and return str << "Index: " << getIndex().asString() << "\n\r"; obj->describeItself( str ); pc->out( str ); return; } if( arg1 == "name" || arg1 == "keywords" ) { obj->setName( arg.getArgRest() ); pc->out( "\n\rKeywords set to : " ); pc->out( obj->getName() ); pc->out( "\n\r" ); return; } else if( arg1 == "save" ) { area->save(); area->rmDirtyBit(); pc->out( "Zone saved.\n\r" ); return; } else if( arg1 == "short" ) { obj->setShort( arg.getArgRest() ); pc->out( "\n\rShort set to : " ); pc->out( obj->getShort() ); pc->out( "\n\r" ); return; } else if( arg1 == "long" ) { obj->setLong( arg.getArgRest() ); pc->out( "\n\rLong set to : " ); pc->out( obj->getLong() ); pc->out( "\n\r" ); return; } else if( arg1 == "size" ) { if( ( val1 = lookupSize( arg2 ) ) ) { obj->setSize( val1 ); pc->out( "Size set.\n\r" ); return; } pc->out( "Invalid size.\n\r" ); return; } /* else if( arg1 == "type" ) { arg2 = arg.getArg(); if( !(bool)arg2 ) { pc->out( "Change object type to what?\n\r" ); return; } val1 = lookupObjType( arg2 ); if( val1 == UNDEFINED ) { pc->out( "Invalid type.\n\r" ); return; } obj->setType( val1 ); pc->out( "Type changed.\n\r" ); return; } */ else if( arg1 == "addmod" || arg1 == "addaffect" ) { arg2.startArgs(); arg3 = arg2.getArg(); if( !(bool)arg2 && !(bool)arg3 ) { pc->out( "addmod <mod-type> <mod-amount>\n\r" ); return; } if( !( val1 = lookupModType( arg3 ) ) ) { pc->out( "Invalid mod type, type 'mod-types'\n\r" ); return; } val2 = arg2.asInt(); mod = new Modifier( val1, val2 ); obj->mod_list.addTop( mod ); pc->out( "Modifier added.\n\r" ); return; } else if( arg1 == "help" || arg1 == "?" ) { pc->view( "../help/oedit.hlp" ); pc->page( "" ); return; } else if( arg1 == "obj-bits" || arg1 == "object-bits" ) { pc->view( "../help/obj-bits.hlp" ); pc->page( "" ); return; } else if( arg1 == "wear-bits" || arg1 == "wear-pos" ) { pc->view( "../help/wear-bits.hlp" ); pc->page( "" ); return; } else if( arg1 == "obj-types" || arg1 == "object-types" ) { pc->view( "../help/obj-types.hlp" ); pc->page( "" ); return; } else if( arg1 == "dam-types" || arg1 == "damage-types" ) { pc->view( "../help/dam-types.hlp" ); pc->page( "" ); return; } else if( arg1 == "set" ) { pc->out( obj->setVals(arg2) ); return; } else if ( arg1 == "trigadd" ) { void * fun; arg2.startArgs(); arg1 = arg2.getArg(); str2 = arg2.getArg(); val1 = lookupBit( otrig_types, arg1 ); if ( val1 == 0 ) { pc->out("No such bit.\n\r"); return; } fun = lookupOtrig( val1, str2.chars() ); if ( fun == NULL ) { pc->out("No such function for that type of trigger.\n\r"); return; } for_each(obj->triggers, td ) { if ( td->type == val1 ) break; } if ( td != NULL ) { pc->out("Replacing old trigger.\n\r"); obj->removeTrigger(td); } td = new (struct TriggerData); td->type = val1; td->fun = fun; obj->addTrigger(td); pc->out("Trigger added.\n\r"); return; } else if ( arg1 == "trigdel" ) { val1 = lookupBit( otrig_types, arg2 ); if ( val1 == 0 ) { pc->out("No such bit.\n\r"); return; } for_each(obj->triggers, td ) { if ( td->type == val1 ) break; } if ( td == NULL ) { pc->out("This object has no such trigger.\n\r"); return; } obj->removeTrigger(td); pc->out("Trigger removed.\n\r"); return; } else if ( arg1 == "triglist" ) { if ( !(bool)arg2 ) { // list types of triggers str << "Trigger types for Objectss " <<endl; for ( i=1; otrig_types[i].name; i++ ) { str << otrig_types[i].name << endl; } pc->out(str); return; } else { // list triggers for given type const char * name; val1 = lookupBit( otrig_types, arg2 ); if ( val1 == 0 ) { pc->out("No such bit.\n\r"); return; } str << "Triggers for type " << arg2 << ":" << endl; for ( i = 0; ; i++ ) { name = getOtrigName(val1, i); if ( !name ) break; str << name << endl; } pc->out(str); return; } } if( ( val1 = getObjBit( arg1 ) ) ) { obj->toggleObjBit( arg1 ); pc->out( "Object bit toggled.\n\r" ); return; } if( ( val1 = getWearBit( arg1 ) ) ) { obj->toggleWearBit( arg1 ); pc->out( "Wear bit toggled.\n\r" ); return; } pc->out( "Invalid command.\n\r" ); }