I have a bug in my multi-class system. Where if I
create a cleric character, and multi-class to the
mage. It will multi-class, however when a person
goes to multi-class again to something like the warrior
it tells me I can not repeat a class already completed.
Below is my multi.c file, if anyone can help that would
be great. Yes, it is sloppy, but hey, Im not perfect! :)
-------------
/*********************************************************************\
* File : multi.c Based on CircleMUD *
* Usage : Controls player multi levels *
* *
\*********************************************************************/
#include "conf.h"
#include "sysdep.h"
#include "structs.h"
#include "utils.h"
#include "db.h"
#include "interpreter.h"
#include "comm.h"
#include "multi.h"
extern int parse_class(char arg);
extern struct room_data *world;
extern char *pc_class_types[];
void perform_remove(struct char_data * ch, int pos);
char *multi_message =
"\r\n"
"The blessings from the Implementors has been bestowed upon\r\n"
"you in your new class. All of your powers and skills will stay the
same\r\n"
"and your power will increase as a mortal into your next class.\r\n";
int okay_to_multi(struct char_data * ch, int flag)
{
int room;
/* Is the char in the appropriate room? */
if (MULTI_ROOM >= 0) {
room = real_room(MULTI_ROOM);
if (ch->in_room != real_room(MULTI_ROOM)) {
send_to_char("You are not in the correct room to multi!\r\n", ch);
return (FALSE);
}
}
/* Is wanted class same as current class? */
if (flag == GET_CLASS(ch)) {
sprintf(buf, "You are currently a %s!\r\n",
pc_class_types[(int)GET_CLASS(ch)]);
send_to_char(buf, ch);
return (FALSE);
}
/* Has char already completed this class? */
if (HAS_CLASS(ch, flag)) {
send_to_char("You can not repeat a class already completed.\r\n", ch);
return (FALSE);
}
/* Is the char the right level? */
if (GET_LEVEL(ch) < MULTI_LEVEL) {
sprintf(buf, "You are only level %d, you must be at least Level %d
before you can multi.\r\n",
GET_LEVEL(ch), MULTI_LEVEL);
send_to_char(buf, ch);
return (FALSE);
}
/* Has player offered the coin? */
if (!PLR_FLAGGED(ch, PLR_MULTIRDY)) {
send_to_char("You still need to offer the coin of dreams!\r\n", ch);
return (FALSE);
}
/* Everything else is okay, return TRUE! */
return (TRUE);
}
void reset_char_stats(struct char_data * ch, int flag, int num_multi)
{
GET_MAX_HIT(ch) = MULTI_HP; GET_HIT(ch) = GET_MAX_HIT(ch);
GET_MAX_MANA(ch) = MULTI_MANA; GET_MOVE(ch) = GET_MAX_MOVE(ch);
GET_MAX_MOVE(ch) = MULTI_MOVE; GET_MANA(ch) = GET_MAX_MANA(ch);
GET_LEVEL(ch) = 1;
GET_MULTI(ch) = GET_MULTI(ch) + 1;
GET_EXP(ch) = 1;
GET_TOTAL_LEVEL(ch)++;
if (GET_REMORT(ch) == 99) {
GET_REMORT(ch) = (int)GET_CLASS(ch);
GET_REMORT2(ch) = 99;
GET_REMORT3(ch) = 99;
} else if (GET_REMORT(ch) != 99 && GET_REMORT2(ch) == 99) {
GET_REMORT2(ch) = (int)GET_CLASS(ch);
GET_REMORT3(ch) = 99;
} else if (GET_REMORT(ch) != 99 && GET_REMORT2(ch) != 99 &&
GET_REMORT3(ch) == 99) {
GET_REMORT3(ch) = (int)GET_CLASS(ch);
} else {
send_to_char("BUG! REPORT! BUG!", ch);
return;
}
GET_CLASS(ch) = flag;
send_to_char(multi_message, ch);
}
ACMD(do_multi)
{
int flag = 0;
int i;
int num_multi = 0;
one_argument(argument, arg);
if (!*arg) {
send_to_char("Syntax: multi <class name>\r\n"
"Choose your next class:\r\n"
"\r\n"
"Mage, Cleric, Thief, Warrior\r\n", ch);
return;
}
if (!str_cmp(arg, "mage")) {
flag = CLASS_MAGIC_USER;
} else if (!str_cmp(arg, "cleric")) {
flag = CLASS_CLERIC;
} else if (!str_cmp(arg, "thief")) {
flag = CLASS_THIEF;
} else if (!str_cmp(arg, "warrior")) {
flag = CLASS_WARRIOR;
} else {
send_to_char("Improper class name, please try again.\r\n", ch);
return;
}
for (i = 0; i < NUM_WEARS; i++)
if (GET_EQ(ch, i)) {
perform_remove(ch, i);
}
if (!okay_to_multi(ch, flag))
return;
reset_char_stats(ch, flag, num_multi);
REMOVE_BIT(PLR_FLAGS(ch), PLR_MULTIRDY);
sprintf(buf, "&R(Multiclass) [%s has multi-classed to %s]&n", GET_NAME(ch),
CLASS_NAME(ch));
mudlog(buf, NRM, LVL_IMMORT, TRUE);
}
+------------------------------------------------------------+
| Ensure that you have read the CircleMUD Mailing List FAQ: |
| http://qsilver.queensu.ca/~fletchra/Circle/list-faq.html |
+------------------------------------------------------------+
This archive was generated by hypermail 2b30 : 12/15/00 PST