/***************************************************************************
* Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, *
* Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. *
* *
* Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael *
* Chastain, Michael Quan, and Mitchell Tse. *
* *
* Envy Diku Mud improvements copyright (C) 1994 by Michael Quan, David *
* Love, Guilherme 'Willie' Arnold, and Mitchell Tse. *
* *
* In order to use any part of this Envy Diku Mud, you must comply with *
* the original Diku license in 'license.doc', the Merc license in *
* 'license.txt', as well as the Envy license in 'license.nvy'. *
* In particular, you may not remove either of these copyright notices. *
* *
* Much time and thought has gone into this software and you are *
* benefitting. We hope that you share your changes too. What goes *
* around, comes around. *
***************************************************************************/
/*$Id: act_multi.c,v 1.7 2005/03/28 04:01:58 tyrion Exp $*/
#if defined( macintosh )
#include <types.h>
#else
#include <sys/types.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "merc.h"
void do_remortalize( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *classmaster;
OBJ_DATA* obj;
AFFECT_DATA *paf;
AFFECT_DATA *paf_next;
char buf [ MAX_STRING_LENGTH ];
char arg [ MAX_INPUT_LENGTH ];
char arg2[ MAX_INPUT_LENGTH ];
char *temp_arg;
int mClass;
int found = 0;
int remortCost;
int qpCost;
bool pkRemort;
if ( IS_NPC( ch ) )
{
return;
}
for ( classmaster = ch->in_room->people; classmaster; classmaster = classmaster->next_in_room )
{
if ( IS_NPC( classmaster ) && IS_SET( classmaster->act, ACT_CLASSMASTER ) )
break;
}
if ( !classmaster )
{
send_to_char(C_DEFAULT, "You can't do that here.\n\r", ch );
return;
}
if ( ch->multied != ch->class )
{
send_to_char(C_DEFAULT, "You are already multiclassed.\n\r", ch );
return;
}
if ( ch->level < LEVEL_HERO )
{
send_to_char(C_DEFAULT, "You are not experienced enough.\n\r", ch );
return;
}
if ( ch->level < LEVEL_DEMIGOD )
{
/* Add race multiclass here */
}
temp_arg = one_argument( argument, arg );
one_argument( temp_arg, arg2 );
if ( arg[0] == '\0' )
{
send_to_char(C_DEFAULT, "Remort to which class?\n\r", ch );
return;
}
for ( mClass = 0; mClass < MAX_CLASS; mClass++ )
{
if ( (!str_prefix( arg, class_table[mClass].who_long ) ) ||
(!str_prefix( arg, class_table[mClass].who_name ) ) )
{
found = mClass;
break;
}
}
if ( mClass == MAX_CLASS )
{
send_to_char( C_DEFAULT, "That's not a class.\n\r", ch );
return;
}
if (ch->class == found )
{
send_to_char( C_DEFAULT, "You are already that class.\n\r", ch );
return;
}
if (!( str_prefix( temp_arg, "pkiller") || str_prefix( temp_arg,"peaceful" )))
{
send_to_char (AT_RED, "Do you want to remort as a pkiller? \n\r", ch);
send_to_char(C_DEFAULT, "Please type: \n\rREMORTILIZE <class> pkiller\n\r", ch);
send_to_char(C_DEFAULT, "Or:\n\rREMORTILIZE <class> peaceful\n\r", ch);
return;
}
else if (!str_prefix (temp_arg, "pkiller"))
{
send_to_char(AT_RED, "We're going PK!\n\r", ch);
pkRemort = 1;
}
else if(!str_prefix (temp_arg, "peaceful"))
{
send_to_char(AT_BLUE, "Peaceful is fine for those weak at heart.\n\r",ch);
pkRemort = 0;
}
else
{
send_to_char (AT_RED, "Do you want to remort as a pkiller? \n\r", ch);
send_to_char(C_DEFAULT, "Please type: \n\rREMORTILIZE <class> pkiller\n\r", ch);
send_to_char(C_DEFAULT, "Or:\n\rREMORTILIZE <class> peaceful\n\r", ch);
return;
}
remortCost = 100000;
if (pkRemort != ch->pkill)
{
remortCost = 250000; /*make it more expensive if they are changing pk status --Manaux*/
}
if ( ( ch->gold < remortCost ) )
{
if (ch->pkill == pkRemort)
{
send_to_char(C_DEFAULT, "You do not have enough money, you need 100000 gold.\n\r", ch );
return;
}
else
{
send_to_char(C_DEFAULT, "You do not have enough money, you need 250000 gold.\n\r(Changing pk status costs an additional 150000 million gold.)\n\r", ch);
return;
}
}
qpCost = 500;
if ( ch->pkill != pkRemort )
{
qpCost = 750;
}
if ( (ch->questpoints < qpCost ) )
{
if (ch->pkill == pkRemort) /*Case for not changing pk status */
{
send_to_char(C_DEFAULT, "You do not have enough quest points, you need 500.\n\r", ch );
return;
}
else /*Else, case for changing pk status*/
{
send_to_char (C_DEFAULT, "You do not have enough quest points, you need 750. \n\r(Changing pkill status costs an additional 250 qp)", ch);
return;
}
}
/* Ok, now that everything is checked, set the dude up. */
/* First thing ya have to do is take off all his clothes. */
for ( obj = ch->carrying; obj; obj = obj->next_content )
{
if( obj->wear_loc != WEAR_NONE)
unequip_char( ch, obj);
}
/* Ya know? I forgot this, strip the buggers stuff affects. */
for( paf = ch->affected; paf; paf = paf_next )
{
paf_next = paf->next;
affect_remove( ch, paf );
}
for( paf = ch->affected2; paf; paf = paf_next )
{
paf_next = paf->next;
affect_remove2( ch, paf );
}
for( paf = ch->affected3; paf; paf = paf_next )
{
paf_next = paf->next;
affect_remove3( ch, paf );
}
for( paf = ch->affected4; paf; paf = paf_next )
{
paf_next = paf->next;
affect_remove4( ch, paf );
}
for( paf = ch->affected_powers; paf; paf = paf_next )
{
paf_next = paf->next;
affect_remove_powers( ch, paf );
}
for( paf = ch->affected_weaknesses; paf; paf = paf_next )
{
paf_next = paf->next;
affect_remove_weaknesses( ch, paf );
}
ch->affected_by = 0;
ch->affected_by2 &= CODER;
ch->affected_by3 = 0;
ch->affected_by4 = 0;
ch->affected_by_powers = 0;
ch->affected_by_weaknesses = 0;
ch->shields = 0;
send_to_char(C_DEFAULT, "All your affects have been removed.\n\r", ch );
send_to_char(C_DEFAULT, "All of your religious affects have been removed.\n\r", ch );
ch->gold -= remortCost;
ch->questpoints -= qpCost;
ch->pkill = pkRemort;
ch->multied = found;
ch->level = 2;
ch->max_hit = 1500;
ch->hit = 1500;
if (ch->class != 9 && ch->class != 11 )
{
ch->mana = 750;
ch->max_mana = 750;
}
if (ch->class == 9 || ch->class == 11 )
{
ch->bp = 250;
ch->max_bp = 250;
}
ch->exp = 2000;
ch->move = 110;
ch->max_move = 110;
sprintf( log_buf, "%s has multiclassed to %s!", ch->name, class_table[ch->multied].who_long );
broadcast_channel( ch, log_buf, CHANNEL_INFO, "!!SOUND(welcome2.wav V=100 L=1 P=100 T=Info)");
send_to_char(C_DEFAULT, "Your equipment has been removed.\n\r", ch );
SendMultiMessage( ch );
sprintf (buf, "$n has chosen to multiclass to %s.",
class_table[ found ].who_long );
act(C_DEFAULT, buf, ch, NULL, NULL, TO_ROOM );
return;
}
void SendMultiMessage( CHAR_DATA* ch )
{
char buf [ MAX_STRING_LENGTH ];
switch( GET_CLASS( ch ) )
{
case CLASS_MAGE :
sprintf( buf, "\n\rYour arcane skills seem to leave you, but you "
"know that they will flow\n\ragain some day." );
strcat( buf, "\n\r" );
break;
case CLASS_CLERIC :
sprintf( buf, "\n\rThe calls of the gods become a whisper, but their "
"teachings will be\n\rwith you for all enternity." );
strcat( buf, "\n\r" );
break;
case CLASS_THIEF :
sprintf( buf, "\n\rYou realize that your seedy life is over, but the "
"things you have learned\n\rwill remain within you." );
strcat( buf, "\n\r" );
break;
case CLASS_WARRIOR :
sprintf( buf, "\n\rYou decide to follow the way of the sword no "
"longer, but are confident\n\rthat your skills will "
"return in time." );
strcat( buf, "\n\r" );
break;
case CLASS_PSIONICIST :
sprintf( buf, "\n\rYour journey of the mind has come to an end, but "
"you feel that your training\n\rwill return one day." );
strcat( buf, "\n\r" );
break;
case CLASS_DRUID :
sprintf( buf, "\n\rThe voices of nature fade off, but the last message "
"you hear is that they\n\rwill always be with you." );
strcat( buf, "\n\r" );
break;
case CLASS_RANGER :
sprintf( buf, "\n\rThe spirits of the woods let you go on your way, "
"but their influence still\n\rflows within you." );
strcat( buf, "\n\r" );
break;
case CLASS_PALADIN :
sprintf( buf, "\n\rThe calls of the gods become a whisper, but their "
"teachings will be\n\rwith you for all enternity." );
strcat( buf, "\n\r" );
break;
case CLASS_BARD :
sprintf( buf, "\n\rYou You realize that song and dance are not "
"everything in life, but\n\ryou are confident that "
"your skills will return in time." );
strcat( buf, "\n\r" );
break;
case CLASS_VAMPIRE :
sprintf( buf, "\n\rPerhaps your bloodlust will stay behind in "
"the past, but you realize\n\rthat this is not "
"possible." );
strcat( buf, "\n\r" );
break;
case CLASS_WEREWOLF :
sprintf( buf, "\n\rYou attempt to cure yourself of the lycanthropy "
"that infects your blood,\n\rbut you realize that "
"this is not possible. Your curse is eterna nol\n\r"
"matter how you try to rid yourself of it." );
strcat( buf, "\n\r" );
break;
case CLASS_ANTI_PALADIN :
sprintf( buf, "\n\rYou decide to follow the way of Satan any "
"longer, but are confident\n\rthat his blessings will "
"return in time." );
strcat( buf, "\n\r" );
break;
case CLASS_ASSASSIN :
sprintf( buf, "\n\rYou decide to follow the way of the sword no "
"longer, but are confident\n\rthat your skills will "
"return in time." );
strcat( buf, "\n\r" );
break;
case CLASS_MONK :
sprintf( buf, "\n\rThe calls of the gods become a whisper, but their "
"teachings will be\n\rwith you for all enternity." );
strcat( buf, "\n\r" );
break;
case CLASS_BARBARIAN :
sprintf( buf, "\n\rYou attempt to put the ravage nature of Barbarism "
"Behind you, but you are sure\n\rthat your true nature "
"will resurface." );
strcat( buf, "\n\r" );
break;
case CLASS_ILLUSIONIST :
sprintf( buf, "\n\rYour arcane skills seem to leave you, but you "
"know that they will flow\n\ragain some day." );
strcat( buf, "\n\r" );
break;
case CLASS_NECROMANCER :
sprintf( buf, "\n\rYour arcane skills seem to leave you, but you "
"know that they will flow\n\ragain some day." );
strcat( buf, "\n\r" );
break;
case CLASS_DEMONOLOGIST :
sprintf( buf, "\n\rYour arcane skills seem to leave you, but you "
"know that they will flow\n\ragain some day." );
strcat( buf, "\n\r" );
break;
case CLASS_SHAMAN :
sprintf( buf, "\n\rThe voices of nature fade off, but the last message "
"you hear is that they\n\rwill always be with you." );
strcat( buf, "\n\r" );
break;
case CLASS_DARKPRIEST :
sprintf( buf, "\n\rYour arcane skills seem to leave you, but you "
"know that they will flow\n\ragain some day." );
strcat( buf, "\n\r" );
break;
default :
buf[ 0 ] = '\0';
}
send_to_char(C_DEFAULT, buf, ch );
}