/*
....[@@@..[@@@..............[@.................. 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@falcon.mercer.peachnet.edu
MUD++ development mailing list mudpp-list@spice.com
------------------------------------------------------------------------------
affect.cc
*/
#include <string.h>
#include "bit.h"
#include "affect.h"
#include "spell.h"
const bitType affect_type_list[] =
{
{ "invisibility", AFF_INVIS },
{ "blindness", AFF_BLIND },
{ "sanctuary", AFF_SANCTUARY },
{ "sleep", AFF_SLEEP },
{ "charm", AFF_CHARM },
{ "poison", AFF_POISON },
{ "curse", AFF_CURSE },
{ "giant", AFF_GIANT },
{ 0, -1 }
};
const bitType mod_type_list[] =
{
{ "strength", MOD_STR },
{ "dexterity", MOD_DEX },
{ "intelligence", MOD_INT },
{ "wisdom", MOD_WIS },
{ "constitution", MOD_CON },
{ "speed", MOD_SPEED },
{ "hp", MOD_HP },
{ "hitpoints", MOD_HP },
{ "mana", MOD_MANA },
{ "energy", MOD_ENERGY },
{ "age", MOD_AGE },
{ "weight", MOD_WEIGHT },
{ "alignment", MOD_ALIGN },
{ "armor", MOD_ARMOR },
{ "damroll", MOD_DAMROLL },
{ "hitroll", MOD_HITROLL },
{ 0, -1 }
};
int getAffectType( const char * str )
{
if( !*str )
return -1;
int len = strlen( str );
for( int i = 0; affect_type_list[i].name; i++ )
{
if( !strncmp( str, affect_type_list[i].name, len ) )
return affect_type_list[i].val;
}
return -1;
}
const char * getAffectName( int type )
{
for( int i = 0; affect_type_list[i].name; i++ )
if( type == affect_type_list[i].val )
return affect_type_list[i].name;
return "";
}
int getModType( const char * str )
{
if( !*str )
return -1;
int len = strlen( str );
for( int i = 0; mod_type_list[i].name; i++ )
{
if( !strncmp( str, mod_type_list[i].name, len ) )
return mod_type_list[i].val;
}
return -1;
}
const char * getModName( int type )
{
for( int i = 0; mod_type_list[i].name; i++ )
if( type == mod_type_list[i].val )
return mod_type_list[i].name;
return "";
}
int Affect::writeTo( OutFile & out ) const
{
Modifier *mod;
out << '{' << getAffectName( type ) << ' ' << duration << ' ';
if( spell )
out << spell->getName() << '~';
else
out << "none~";
mods.reset();
while( ( mod = mods.peek() ) )
{
mods.next();
out << "\nM{" << mod->getName() << ' ' << mod->getAmt() << "}";
}
out << "\n}\n";
return 0;
}
int Affect::readFrom( InFile & in )
{
char buf[ 256 ];
Modifier *mod;
int modAmt;
int modType;
in.getword( buf );
in.getword( buf );
type = getAffectType( buf );
duration = in.getnum();
if( strcmp( in.getstring( buf ), "none" ) )
spell = lookupSpell( buf );
for( ; ; )
{
switch( *in.getword( buf ) )
{
default: return -1;
case '}': return 0;
case 'M': in.getword( buf );
in.getword( buf );
modAmt = in.getnum();
if( ( modType = getModType( buf ) ) != -1 )
{
mod = new Modifier( modType, modAmt );
if( mod )
mods.add( mod );
else
in.error( "allocationg new Modifier" );
}
in.getword( buf );
}
}
return 0;
}