/* * Levels: int levels[6] * * 0 = Mage, 1 = cleric, 3 = thief, 2 = fighter 4=ranger, 5=druid */ #include <stdio.h> #include <stdlib.h> /* #include <unistd.h> */ #include <limits.h> #include <sys/types.h> #include <string.h> #include "global.h" #include "bug.h" #include "utils.h" #include "comm.h" #include "db.h" #include "interpreter.h" #include "handler.h" #include "spells.h" #include "mudlimits.h" #include "opinion.h" #include "constants.h" #define _MULTICLASS_C #include "multiclass.h" int GetClassLevel(struct char_data *ch, int class) { if (DEBUG > 2) log_info("called %s with %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch), class); if (IS_SET(ch->player.class, class)) { return (GET_LEVEL(ch, CountBits(class) - 1)); } return (0); } int CountBits(int class) { if (DEBUG > 2) log_info("called %s with %d", __PRETTY_FUNCTION__, class); if (class == 1) return (1); if (class == 2) return (2); if (class == 4) return (3); if (class == 8) return (4); if (class == 16) return (5); /* ranger */ if (class == 32) return (6); /* druid */ return 0; } int OnlyClass(struct char_data *ch, int class) { int i = 0; if (DEBUG > 2) log_info("called %s with %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch), class); for (i = 1; i <= 32; i *= 2) { if (GetClassLevel(ch, i) != 0) if (i != class) return (FALSE); } return (TRUE); } int HasClass(struct char_data *ch, int class) { if (DEBUG > 3) log_info("called %s with %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch), class); if (IS_SET(ch->player.class, class)) return TRUE; return FALSE; } int HowManyClasses(struct char_data *ch) { int i = 0; int tot = 0; if (DEBUG > 3) log_info("called %s with %s", __PRETTY_FUNCTION__, SAFE_NAME(ch)); for (i = 0; i < ABS_MAX_CLASS; i++) if (HasClass(ch, 1 << i)) tot++; return tot ? tot : 1; } int BestFightingClass(struct char_data *ch) { if (DEBUG > 2) log_info("called %s with %s", __PRETTY_FUNCTION__, SAFE_NAME(ch)); if (GET_LEVEL(ch, WARRIOR_LEVEL_IND)) return (WARRIOR_LEVEL_IND); if (GET_LEVEL(ch, RANGER_LEVEL_IND)) return (RANGER_LEVEL_IND); if (GET_LEVEL(ch, DRUID_LEVEL_IND)) return (DRUID_LEVEL_IND); if (GET_LEVEL(ch, CLERIC_LEVEL_IND)) return (CLERIC_LEVEL_IND); if (GET_LEVEL(ch, THIEF_LEVEL_IND)) return (THIEF_LEVEL_IND); if (GET_LEVEL(ch, MAGE_LEVEL_IND)) return (MAGE_LEVEL_IND); log_error("Massive error.. character %s has no recognized class.", GET_NAME(ch)); return (1); } int BestThiefClass(struct char_data *ch) { if (DEBUG > 2) log_info("called %s with %s", __PRETTY_FUNCTION__, SAFE_NAME(ch)); if (GET_LEVEL(ch, THIEF_LEVEL_IND)) return (THIEF_LEVEL_IND); if (GET_LEVEL(ch, RANGER_LEVEL_IND)) return (RANGER_LEVEL_IND); if (GET_LEVEL(ch, MAGE_LEVEL_IND)) return (MAGE_LEVEL_IND); if (GET_LEVEL(ch, WARRIOR_LEVEL_IND)) return (WARRIOR_LEVEL_IND); if (GET_LEVEL(ch, DRUID_LEVEL_IND)) return (DRUID_LEVEL_IND); if (GET_LEVEL(ch, CLERIC_LEVEL_IND)) return (CLERIC_LEVEL_IND); log_error("Massive error.. character %s has no recognized class.", GET_NAME(ch)); return (1); } int BestMagicClass(struct char_data *ch) { if (DEBUG > 2) log_info("called %s with %s", __PRETTY_FUNCTION__, SAFE_NAME(ch)); if (GET_LEVEL(ch, MAGE_LEVEL_IND)) return (MAGE_LEVEL_IND); if (GET_LEVEL(ch, CLERIC_LEVEL_IND)) return (CLERIC_LEVEL_IND); if (GET_LEVEL(ch, DRUID_LEVEL_IND)) return (DRUID_LEVEL_IND); if (GET_LEVEL(ch, RANGER_LEVEL_IND)) return (RANGER_LEVEL_IND); if (GET_LEVEL(ch, THIEF_LEVEL_IND)) return (THIEF_LEVEL_IND); if (GET_LEVEL(ch, WARRIOR_LEVEL_IND)) return (WARRIOR_LEVEL_IND); log_error("Massive error.. character %s has no recognized class.", GET_NAME(ch)); return (1); } int GetALevel(struct char_data *ch, int which) { int ind[6] = { 0, 0, 0, 0, 0, 0 }; int j = 0; int k = 0; int i = 0; if (DEBUG > 2) log_info("called %s with %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch), which); for (i = MAGE_LEVEL_IND; i <= DRUID_LEVEL_IND; i++) { ind[i] = GET_LEVEL(ch, i); } /* * chintzy sort. (just to prove that I did learn something in college) */ for (i = 0; i < ABS_MAX_CLASS - 1; i++) { for (j = i + 1; j < ABS_MAX_CLASS; j++) { if (ind[j] > ind[i]) { k = ind[i]; ind[i] = ind[j]; ind[j] = k; } } } if (which > -1 && which < ABS_MAX_CLASS) { return (ind[which]); } return 0; } int GetSecMaxLev(struct char_data *ch) { if (DEBUG > 2) log_info("called %s with %s", __PRETTY_FUNCTION__, SAFE_NAME(ch)); return (GetALevel(ch, 1)); } int GetThirdMaxLev(struct char_data *ch) { if (DEBUG > 2) log_info("called %s with %s", __PRETTY_FUNCTION__, SAFE_NAME(ch)); return (GetALevel(ch, 2)); } int GetMaxLevel(struct char_data *ch) { int max = 0; int i = 0; /* * Cannot call things in bug.c from things bug.c calls! * * if (DEBUG > 2) * log_info("called %s with %s", __PRETTY_FUNCTION__, SAFE_NAME(ch)); */ for (i = MAGE_LEVEL_IND; i <= DRUID_LEVEL_IND; i++) { if (GET_LEVEL(ch, i) > max) max = GET_LEVEL(ch, i); } return (max); } int GetMinLevel(struct char_data *ch) { int min = INT_MAX; int i = 0; if (DEBUG > 2) log_info("called %s with %s", __PRETTY_FUNCTION__, SAFE_NAME(ch)); for (i = MAGE_LEVEL_IND; i <= DRUID_LEVEL_IND; i++) { if (GET_LEVEL(ch, i) > 0) if (GET_LEVEL(ch, i) < min) min = GET_LEVEL(ch, i); } return (min); } int GetTotLevel(struct char_data *ch) { if (DEBUG > 2) log_info("called %s with %s", __PRETTY_FUNCTION__, SAFE_NAME(ch)); return (GET_LEVEL(ch, 0) + GET_LEVEL(ch, 1) + GET_LEVEL(ch, 2) + GET_LEVEL(ch, 3) + GET_LEVEL(ch, 4) + GET_LEVEL(ch, 5)); } void StartLevels(struct char_data *ch) { if (DEBUG > 2) log_info("called %s with %s", __PRETTY_FUNCTION__, SAFE_NAME(ch)); if (IS_SET(ch->player.class, CLASS_MAGIC_USER)) { advance_level(ch, MAGE_LEVEL_IND); } if (IS_SET(ch->player.class, CLASS_CLERIC)) { advance_level(ch, CLERIC_LEVEL_IND); } if (IS_SET(ch->player.class, CLASS_WARRIOR)) { advance_level(ch, WARRIOR_LEVEL_IND); } if (IS_SET(ch->player.class, CLASS_RANGER)) { advance_level(ch, RANGER_LEVEL_IND); } if (IS_SET(ch->player.class, CLASS_DRUID)) { advance_level(ch, DRUID_LEVEL_IND); } if (IS_SET(ch->player.class, CLASS_THIEF)) { advance_level(ch, THIEF_LEVEL_IND); } } int BestClass(struct char_data *ch) { int max = 0; int class = 0; int i = 0; if (DEBUG > 2) log_info("called %s with %s", __PRETTY_FUNCTION__, SAFE_NAME(ch)); for (i = MAGE_LEVEL_IND; i <= DRUID_LEVEL_IND; i++) if (max < GET_LEVEL(ch, i)) { max = GET_LEVEL(ch, i); class = i; } if (max == 0) { /* eek */ log_fatal("Massive error.. character %s has no recognized class.", GET_NAME(ch)); proper_exit(MUD_HALT); return -1; } else { return (class); } }