/*
....[@@@..[@@@..............[@.................. 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
------------------------------------------------------------------------------
editnpc.cc
*/
#include "config.h"
#include "string.h"
#include "llist.h"
#include "index.h"
#include "room.h"
#include "hash.h"
#include "bit.h"
#include "edit.h"
#include "area.h"
#include "pc.h"
#include "npc.h"
#include "global.h"
#include "trigs.h"
void NPCEditor::command( const String & arg )
{
String str;
String str2;
String arg1;
String arg2;
Index index1;
int val1;
int i;
struct TriggerData * td;
arg.startArgs();
arg1 = arg.getArg();
arg2 = arg.getArgRest();
if( !npc && !(bool)arg1 )
{
pc->out( "No NPC 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->lookupNPC( index1.getKey() ) )
{
pc->out( "NPC " );
pc->out( index1.asString() );
pc->out( " already exists.\n\r" );
return;
}
setIndex( index1 );
npc = new NPC;
npc->setShort( "no short" );
npc->setLong( "no long" );
area->addNPC( index1.getKey(), npc );
pc->out( "New NPC created.\n\r" );
return;
}
else if( arg1 == "list" )
{
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 == "help" || arg1 == "?" )
{
pc->view( "../help/medit.hlp" );
pc->page( "" );
return;
}
else if( arg1 == "save" )
{
area->save();
area->rmDirtyBit();
pc->out( "Zone saved.\n\r" );
return;
}
else if( arg1 == "npc-bits" )
{
pc->view( "../help/npc-bits.hlp" );
pc->page( "" );
return;
}
else if( arg1 == "sizes" )
{
pc->view( "../help/sizes.hlp" );
pc->page( "" );
return;
}
else if( arg1 == "races" )
{
pc->view( "../help/races.hlp" );
pc->page( "" );
return;
}
if( !npc )
{
pc->out( "No NPC to edit.\n\r" );
return;
}
if( !(bool)arg || arg[0] == '\n' )
{
// Display NPC and return
str << "Index: " << getIndex().asString() << "\n\r";
npc->describeItself( str );
pc->out( str );
return;
}
if( arg1 == "name" || arg1 == "keywords" )
{
npc->setName( arg2 );
pc->out( "Keywords set.\n\r" );
return;
}
else if( arg1 == "short" )
{
npc->setShort( arg2 );
pc->out( "Short description set.\n\r" );
return;
}
else if( arg1 == "long" )
{
npc->setLong( arg2 );
pc->out( "Long description set.\n\r" );
return;
}
else if( arg1 == "level" )
{
if( ( val1 = arg2.asInt() > 0 ) )
{
npc->setLevel( arg2.asInt() );
pc->out( "Level set.\n\r" );
return;
}
pc->out( "Invalid level.\n\r" );
return;
}
else if( arg1 == "hp" )
{
npc->setMaxHP( arg2.asInt() );
pc->out( "Max hit-points set.\n\r" );
return;
}
else if( arg1 == "mana" )
{
npc->setMaxMana( arg2.asInt() );
pc->out( "Max mana set.\n\r" );
return;
}
else if( arg1 == "race" )
{
if( ( val1 = lookupRace( arg2 ) ) )
{
// Set initial stats according to race
npc->setRace( val1 );
pc->out( "Race set.\n\r" );
return;
}
pc->out( "No such race.\n\r" );
return;
}
else if( arg1 == "size" )
{
if( ( val1 = lookupSize( arg2 ) ) )
{
// Set initial stats according to race
npc->setSize( val1 );
pc->out( "Size set.\n\r" );
return;
}
pc->out( "No such size.\n\r" );
return;
}
else if( arg1 == "sex" )
{
if( arg2 == "male" )
npc->setSex( MALE );
else if( arg2 == "female" )
npc->setSex( FEMALE );
else if( arg2 == "neuter" )
npc->setSex( NEUTER );
else return;
pc->out( "Sex set.\n\r" );
return;
}
else if( arg1 == "str" || arg1 == "strength" )
{
npc->setStr( arg2.asInt() );
pc->out( "Strength set.\n\r" );
return;
}
else if( arg1 == "int" || arg1 == "intelligence" )
{
npc->setInt( arg2.asInt() );
pc->out( "Intelligence set.\n\r" );
return;
}
else if( arg1 == "con" || arg1 == "constitution" )
{
npc->setCon( arg2.asInt() );
pc->out( "Constitution set.\n\r" );
return;
}
else if( arg1 == "chs" || arg1 == "charisma" )
{
npc->setCharisma( arg2.asInt() );
pc->out( "Charisma set.\n\r" );
return;
}
else if( arg1 == "spd" || arg1 == "speed" )
{
npc->setSpd( arg2.asInt() );
pc->out( "Speed set.\n\r" );
return;
}
else if( arg1 == "dex" || arg1 == "dexterity" )
{
npc->setDex( arg2.asInt() );
pc->out( "Dexterity set.\n\r" );
return;
}
else if( arg1 == "wis" || arg1 == "wisdom" )
{
npc->setWis( arg2.asInt() );
pc->out( "Wisdom set.\n\r" );
return;
}
else if( arg1 == "armor" )
{
npc->setArmor( arg2.asInt() );
pc->out( "Armor set.\n\r" );
return;
}
else if ( arg1 == "trigadd" )
{
void * fun;
arg2.startArgs();
arg1 = arg2.getArg();
str2 = arg2.getArg();
val1 = lookupBit( ctrig_types, arg1 );
if ( val1 == 0 )
{
pc->out("No such bit.\n\r");
return;
}
fun = lookupCtrig( val1, str2.chars() );
if ( fun == NULL )
{
pc->out("No such function for that type of trigger.\n\r");
return;
}
for_each(npc->triggers, td )
{
if ( td->type == val1 )
break;
}
if ( td != NULL )
{
pc->out("Replacing old trigger.\n\r");
npc->removeTrigger(td);
}
td = new (struct TriggerData);
td->type = val1;
td->fun = fun;
npc->addTrigger(td);
pc->out("Trigger added.\n\r");
return;
}
else if ( arg1 == "trigdel" )
{
val1 = lookupBit( ctrig_types, arg2 );
if ( val1 == 0 )
{
pc->out("No such bit.\n\r");
return;
}
for_each(npc->triggers, td )
{
if ( td->type == val1 )
break;
}
if ( td == NULL )
{
pc->out("This npc has no such trigger.\n\r");
return;
}
npc->removeTrigger(td);
pc->out("Trigger removed.\n\r");
return;
}
else if ( arg1 == "triglist" )
{
if ( !(bool)arg2 )
{
// list types of triggers
str << "Trigger types for NPCs " <<endl;
for ( i=1; ctrig_types[i].name; i++ )
{
str << ctrig_types[i].name << endl;
}
pc->out(str);
return;
}
else
{
// list triggers for given type
const char * name;
val1 = lookupBit( ctrig_types, arg2 );
if ( val1 == 0 )
{
pc->out("No such bit.\n\r");
return;
}
str << "Triggers for type " << arg2 << ":" << endl;
for ( i = 0; ; i++ )
{
name = getCtrigName(val1, i);
if ( !name )
break;
str << name << endl;
}
pc->out(str);
return;
}
}
if( ( val1 = getNPCBit( arg1 ) ) )
{
npc->toggleNPCBit( val1 );
pc->out( "NPC Bit toggled.\n\r" );
return;
}
}