/****************************************************************************
* Multiclass Code *
* Markanth : dlmud@dlmud.com *
* Devil's Lament : dlmud.com port 3778 *
* Web Page : http://www.dlmud.com *
* *
* A nice and simple remort code if you like multiclassing. *
* This code require you have a working knowledge of how rom skills work. *
* *
* All I ask in return is that you give me credit on your mud somewhere *
* or email me if you use it. *
***************************************************************************/
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "merc.h"
#include "tables.h"
#include "const.h"
void do_recl(CHAR_DATA * ch, char *argument)
{
send_to_char("If you want to RECLASS, you must spell it out.\n\r", ch);
return;
}
void do_reclass(CHAR_DATA * ch, char *argument)
{
DESCRIPTOR_DATA *d;
CHAR_DATA *mob;
AFFECT_DATA *af,
*af_next;
char buf[MAX_INPUT_LENGTH];
int x, i,
sn;
if (IS_NPC(ch) || (d = ch->desc) == NULL)
return;
/*
* check for priest or special mob
*/
for (mob = ch->in_room->people; mob; mob = mob->next_in_room)
{
if (IS_NPC(mob) && IS_SET(mob->act, ACT_IS_HEALER)) /* setup to do at healer's for now */
break;
}
if (mob == NULL)
{
send_to_char("You can't do that here.\n\r", ch);
return;
}
if (ch->level < LEVEL_HERO )
{
send_to_char("You must be a HERO to reclass.\n\r", ch);
return;
}
if(number_classes(ch) == MAX_REMORT)
{
send_to_char("You can't reclass any more!\n\r", ch);
return;
}
for (x = 0; x < MAX_WEAR; x++)
{
if (get_eq_char(ch, x) != NULL)
{
send_to_char("Remove all of your eq first. (heal uncurse for cursed items)\n\r", ch);
return;
}
}
if (ch->pcdata->confirm_remort)
{
if (argument[0] != '\0')
{
send_to_char("Reclass status removed.\n\r", ch);
ch->pcdata->confirm_remort = FALSE;
return;
} else
{
sprintf(buf, "You have chosen to reclass. You will be allowed to pick a new %s\n\r", !ch->pcdata->stay_race ? "RACE" : "CLASS");
send_to_char(buf, ch);
send_to_char("selection section of character creation, and will be allowed recreate\n\r", ch);
send_to_char("your character with an additional klass and bonuses.\n\r\n\r", ch);
send_to_char("In the unlikely event that you are disconnected or the MUD\n\r", ch);
send_to_char("crashes while you are creating your character, log back on and write a\n\r", ch);
send_to_char("note to 'immortal' who will retrieve your backup.\n\r", ch);
wiznet("$N has reclassed.", ch, NULL, 0, 0, 0);
info( ch, 0, "{G[INFO]: {R%s has just reclassed!{x\n\r", ch->name );
for (af = ch->affected; af != NULL; af = af_next)
{
af_next = af->next;
affect_remove(ch, af);
}
SET_BIT ( ch->act, PLR_REMORT );
SET_BIT ( ch->comm, COMM_QUIET );
char_from_room ( ch );
char_to_room ( ch, get_room_index ( ROOM_VNUM_LIMBO ) );
ch->level = 1;
ch->exp = 0;
ch->pcdata->points = 0;
ch->max_hit = 100 * ( number_classes ( ch ) + 1 );
ch->max_mana = 100 * ( number_classes ( ch ) + 1 );
ch->max_move = 100 * ( number_classes ( ch ) + 1 );
ch->hit = ch->max_hit;
ch->mana = ch->max_move;
ch->move = ch->max_mana;
ch->pcdata->perm_hit = ch->max_hit;
ch->pcdata->perm_mana = ch->max_mana;
ch->pcdata->perm_move = ch->max_move;
ch->wimpy = ch->max_hit / 5;
ch->train = 5 * ( number_classes ( ch ) + 1 );
ch->practice = 7 * ( number_classes ( ch ) + 1 );
ch->exp = exp_per_level ( ch, ch->pcdata->points );
ch->levelflux = ch->levelflux;
reset_char ( ch );
/* nuke any high level pets */
if (ch->pet != NULL)
{
nuke_pets(ch);
ch->pet = NULL;
}
/* Race skills are lost.
100% skills are kept at 50%.
All other skills are reset back to 1%. */
for (sn = 0; sn < MAX_SKILL; sn++)
{
if (ch->pcdata->learned[sn] > 0)
{
if (is_race_skill(ch, sn) && !ch->pcdata->stay_race)
ch->pcdata->learned[sn] = 0;
else if (ch->pcdata->learned[sn] == 100)
ch->pcdata->learned[sn] = 50;
else
ch->pcdata->learned[sn] = 1;
}
}
/* send char to race selection, customize this as you see fit */
send_to_char("\n\rNow beginning the reclassing process.\n\r\n\r", ch);
for(i = 0; i < MAX_CBOOL ; i++)
ch->pcdata->creation[i] = TRUE;
ch->pcdata->creation[CHOSE_CLASS] = FALSE;
send_to_char("This is the Creation Menu:\n\r",ch );
printf_to_char(ch,"{WA{D){W Race Selection - {w%s\n\r", ch->pcdata->creation[CHOSE_RACE] == TRUE ? pc_race_table[ch->race].name : "Not Chosen" );
printf_to_char(ch,"{WB{D){W Class Selection - {w%s\n\r", ch->pcdata->creation[CHOSE_CLASS] == TRUE ? class_long(ch) : "Not Chosen" );
printf_to_char(ch,"{WC{D){W Gender Selection - {w%s\n\r", ch->pcdata->creation[CHOSE_GENDER] == TRUE ? sex_table[ch->sex].name : "Not Chosen" );
printf_to_char(ch,"{WF{D){W Short Description - {w%s\n\r", ch->pcdata->creation[CHOSE_SHORT] == TRUE ? ch->short_descr : "Not Chosen" );
printf_to_char(ch,"{WG{D){W Attribute Selection - {w%s{x\n\r", ch->pcdata->creation[CHOSE_ATTRIBUTES] == TRUE ? "Set" : "Not Chosen" );
send_to_char("{WH{D){W Done",ch);
send_to_char("\n\rPlease make a selection based off the corresponding letter.\n\rEnter selection-> ",ch);
d->connected = CON_CREATION_MENU;
return;
}
}
if (argument[0] != '\0')
{
send_to_char("Just type reclass. No argument.\n\r", ch);
return;
}
send_to_char("Typing reclass with an argument will undo reclass status.\n\r", ch);
send_to_char("Reclassing is not reversable, make sure you read help RECLASS\n\r", ch);
send_to_char("and have an idea of what klass you want to reclass into.\n\r", ch);
send_to_char("Type reclass again to confirm this command.\n\r", ch);
ch->pcdata->confirm_remort = TRUE;
if (!ch->pcdata->stay_race)
wiznet("$N is contemplating reclassing.", ch, NULL, 0, 0, get_trust(ch));
}