/****************************************************************************** * * File: new_train.c * * Function: New Updated Train Function for Legend of Chrystancia * * Author(s): Queen Serenity of the Moon Kingdom * * Copyright: Copyright (c) 1995-2003 * Silver Aerie Codeworks * * Source: Complete hack/slash/delete rewrite of boring train code from stock * * Notes: Yeah umm it's done. * * Change History: * 03_29_08_001 Attempted to go live. * 03_14_09_002 Removed QP costs for Stats/Immunities * (Unique/Matthew) * *****************************************************************************/ #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" #include "player.h" void do_avatar_announce (CHAR_DATA * ch, char *argument) { DESCRIPTOR_DATA *d; char buf[MAX_STRING_LENGTH]; FILE *fp; char *nstr; char buf2[MSL]; time_t nowtime; struct tm *t; char *strtime; nstr = switch_char (argument, '>', ' '); argument = nstr; /* nowtime = time (¤t_time); t = localtime (&nowtime); // strftime (buf2, 100, "%d/%m %H:%M:%S", t); strftime (buf2, 100, "%d-%b-%Y %T", t); */ nowtime = time (¤t_time); t = localtime (&nowtime); buf2[0] = '\0'; strtime = asctime(gmtime(¤t_time)); strtime[strlen(strtime)-1] = '\0'; strcat(buf2, datestring(strtime)); if (argument[0] == '\0') return; for (d = first_descriptor; d != NULL; d = d->next) { if (d->connected == CON_PLAYING && !IS_SET (d->character->deaf, CHANNEL_INFO)) { sprintf (buf, "^1#7-->#n ^1#3AVATAR#n ^1#7<--#n %s ^1#7-->#n ^1#3AVATAR#n ^1#7<--#n #n\n\r", argument); cent_to_char (buf, d->character); } } if (!(fp = fopen (INFO_FILE, "a+"))) { bug ("Cannot open INFO_FILE!", 0); return; } fprintf (fp, ">#w[#r%s#w]#n #w%s#n\r\n", buf2, argument); fclose (fp); return; } void do_legend_announce (CHAR_DATA * ch, char *argument) { DESCRIPTOR_DATA *d; char buf[MAX_STRING_LENGTH]; FILE *fp; char *nstr; char buf2[MSL]; time_t nowtime; struct tm *t; char *strtime; nstr = switch_char (argument, '>', ' '); argument = nstr; nowtime = time (¤t_time); t = localtime (&nowtime); buf2[0] = '\0'; strtime = asctime(gmtime(¤t_time)); strtime[strlen(strtime)-1] = '\0'; strcat(buf2, datestring(strtime)); if (argument[0] == '\0') return; for (d = first_descriptor; d != NULL; d = d->next) { if (d->connected == CON_PLAYING && !IS_SET (d->character->deaf, CHANNEL_INFO)) { sprintf (buf, "^4#2-->#n ^4#cRENOWN#n ^4#2<--#n %s ^4#2-->#n ^4#cRENOWN#n ^4#2<--#n #n\n\r", argument); cent_to_char (buf, d->character); } } if (!(fp = fopen (INFO_FILE, "a+"))) { bug ("Cannot open INFO_FILE!", 0); return; } fprintf (fp, ">#w[#r%s#w]#n #w%s#n\r\n", buf2, argument); fclose (fp); return; } void seren_banner_to_char (char *txt, CHAR_DATA * ch) { int lspace = 0; int rspace = 0; int ltotal = 0; char work_buf_1[50000]; char work_buf_2[50000]; ltotal = 25 - col_str_len (txt); if (ltotal < 0) ltotal = 0; lspace = (ltotal / 2) + (ltotal % 2); rspace = (ltotal - lspace); sprintf (work_buf_1, "#R-----------------------=#w[#y %%%ds%%s%%%ds #w]#R=-----------------------", lspace, rspace); sprintf (work_buf_2, work_buf_1, " ", txt, " "); cent_to_char (work_buf_2, ch); return; } void do_train (CHAR_DATA * ch, char *argument) { char arg1[MAX_STRING_LENGTH]; // Holds first argument, usually what is trained char arg2[MAX_STRING_LENGTH]; // Holds second argument usually how much is trained (amount) sh_int *pAbility=0; // Location of what is being trained char *pOutput=NULL; // Title of what is being trained int xp_cost=0; // Used to just be cost, now this is how much exp it takes to train something -- Serenity int qp_cost=0; // Used to just be cost2, now this is how much qp it takes to train something -- Serenity int earnt_qp=0; // Used to be used as cost3, now this is how much earned qp it takes to train something -- Serneity int immcost=0; // How much experience it costs immunities to be trained??? int statcap=0; // Used to be hpcap, manacap, movecap, now this is the maximum amount you can improve hp/mana/move int max_stat = 18; // Maximum s/i/w/d/c scores by default bool is_ok = FALSE; // found a legal train area? char legbuf[MSL]; // A simple output buffer for legend titles int train_loop = 0; // A simple integer for loops bool train_all = FALSE; // Utilize all on-hand experience for training this area if applicable, (only on hp/mana/move) int amount = 1; // Amount desired vs actually improved, default to 1 int trained_amount = 0; // Amount actually improved vs desired int combo_var = 0; // Used for displaying combinations of things like a - b etc. bool VITALS_TRAIN = FALSE; // Improving Str, Int, Wis, Dex, Con bool HPMPMV_TRAIN = FALSE; // Improving Hp Mana Move bool PRIMAL_TRAIN = FALSE; // Improving Primal bool STATUS_TRAIN = FALSE; // Improving Legend bool AVATAR_TRAIN = FALSE; // Going avatar bool MORTAL_TRAIN = FALSE; // Going to mortal bool AMAGIC_TRAIN = FALSE; // Anti-Magic Train bool SILVER_TRAIN = FALSE; // Silver Train bool GNOSIS_TRAIN = FALSE; // Gnosis Train bool VAMPYR_TRAIN = FALSE; // Vampire Generation Train bool DRAGON_TRAIN = FALSE; // Dragon Age Train bool MFOCUS_TRAIN = FALSE; // Monk Focus Train bool HQUICK_TRAIN = FALSE; // Highlander Quickening Train bool IMMUNE_TRAIN = FALSE; // Immunities/Resistances Train bool CHAR_DIRTY = FALSE; // Character got modified if (IS_NPC (ch)) return; if ((IS_SET (ch->garou1, GAROU_WHELP2)) || (IS_SET (ch->garou1, GAROU_WHELP1))) { stc ("You are unable to train with whelps curse affecting you.\n\r", ch); return; } argument = one_argument (argument, arg1); argument = one_argument (argument, arg2); /* --- New stat cap proposal, utiilizes the 15000 + ((x(x+1)/2)*1000) method. * --- where x = lstatus + 1. 1, 1+2, 1+2+3, 1+2+3+4 x+1;((x(x+1)/2) x=0 0+1=1 (1(1+1)/2) -> (1(2)/2) -> (2/2) -> 1 x=1 1+1=2 (2(2+1)/2) -> (2(3)/2) -> (6/2) -> 3 x=2 2+1=3 (3(3+1)/2) -> (3(4)/2) -> (12/2) -> 6 x=3 3+1=4 (4(4+1)/2) -> (4(5)/2) -> (20/2) -> 10 x=4 4+1=5 (5(5+1)/2) -> (5(6)/2) -> (30/2) -> 15 Current Gained Planned Gained 0 - 15000 0 - 0 0 - 15000 0 - 0 1 - 16000 1 - 1000 1 - 16000 1 - 1000 2 - 17000 2 - 2000 2 - 18000 2 - 3000 3 - 18000 3 - 3000 3 - 21000 3 - 6000 4 - 19000 4 - 4000 4 - 25000 4 - 10000 5 - 20000 5 - 5000 5 - 30000 5 - 15000 6 - 21000 6 - 6000 6 - 36000 6 - 21000 7 - 22000 7 - 7000 7 - 43000 7 - 28000 8 - 23000 8 - 8000 8 - 61000 8 - 36000 9 - 24000 9 - 9000 9 - 70000 9 - 45000 10 - 150000 10 - 135000 10 - 150000 10 - 135000 11 - 150000 11 - 135000 11 - 150000 11 - 135000 */ if (ch->lstatus < 1) statcap = 15000; if (ch->lstatus < 10) statcap = 15000 + (1000 * ((ch->lstatus + 1) * ((ch->lstatus + 1) + 1) / 2)) + (200 * ch->race); else statcap = 150000 + (500 * ch->race); if (ch->level >= 3) max_stat = 20; if (IS_CLASS (ch, CLASS_MONK)) max_stat = 25; if (IS_CLASS (ch, CLASS_HIGHLANDER)) max_stat = 30; if (IS_CLASS (ch, CLASS_DRAGON)) max_stat = 35; if (arg1[0] == '\0') { // ok so just display what we can train eh? stc ("\n\r", ch); cent_to_char ("#wYou can improve in the following areas:#n", ch); seren_banner_to_char ("VITAL STATISTICS", ch); { int xp_str_cost = ((ch->pcdata->perm_str + 1) * 500); int xp_int_cost = ((ch->pcdata->perm_int + 1) * 500); int xp_wis_cost = ((ch->pcdata->perm_wis + 1) * 500); int xp_dex_cost = ((ch->pcdata->perm_dex + 1) * 500); int xp_con_cost = ((ch->pcdata->perm_con + 1) * 500); /* int qp_str_cost = ( ( ch->pcdata->perm_str + 1 ) * 25); int qp_int_cost = ( ( ch->pcdata->perm_int + 1 ) * 25); int qp_wis_cost = ( ( ch->pcdata->perm_wis + 1 ) * 25); int qp_dex_cost = ( ( ch->pcdata->perm_dex + 1 ) * 25); int qp_con_cost = ( ( ch->pcdata->perm_con + 1 ) * 25); int eqp_str_req = ( ( ( ch->pcdata->perm_str + 1 ) * ( ( ch->pcdata->perm_str + 1 ) + 1) / 2) * 25); int eqp_int_req = ( ( ( ch->pcdata->perm_int + 1 ) * ( ( ch->pcdata->perm_int + 1 ) + 1) / 2) * 25); int eqp_wis_req = ( ( ( ch->pcdata->perm_wis + 1 ) * ( ( ch->pcdata->perm_wis + 1 ) + 1) / 2) * 25); int eqp_dex_req = ( ( ( ch->pcdata->perm_dex + 1 ) * ( ( ch->pcdata->perm_dex + 1 ) + 1) / 2) * 25); int eqp_con_req = ( ( ( ch->pcdata->perm_con + 1 ) * ( ( ch->pcdata->perm_con + 1 ) + 1) / 2) * 25); */ // removal of earned qp costs /* int qp_str_cost = 0; int qp_int_cost = 0; int qp_wis_cost = 0; int qp_dex_cost = 0; int qp_con_cost = 0; int eqp_str_req = 0; int eqp_int_req = 0; int eqp_wis_req = 0; int eqp_dex_req = 0; int eqp_con_req = 0; */ int hp_cost = 0; int mp_cost = 0; int mv_cost = 0; hp_cost = (ch->max_hit - (ch->pcdata->perm_con * 4)); mp_cost = (ch->max_mana - (ch->pcdata->perm_wis * 4)); mv_cost = (ch->max_move - (ch->pcdata->perm_dex * 4)); if (IS_CLASS (ch, CLASS_HIGHLANDER)) { if (IS_DEMPOWER (ch, HPOWER_BLADESPIN)) hp_cost *= 0.55; if (IS_DEMPOWER (ch, HPOWER_ANCESTRAL)) mp_cost *= 0.55; if (IS_DEMPOWER (ch, HPOWER_SWORDCRAFT)) mv_cost *= 0.55; } if (hp_cost < 1) hp_cost = 1; if (mp_cost < 1) mp_cost = 1; if (mv_cost < 1) mv_cost = 1; if (ch->pcdata->perm_str < max_stat) stcf (ch, "#c%-20s#g : #y%d to Max, #g%d exp#y, for next.#n\n\r", "Strength", (max_stat - ch->pcdata->perm_str), xp_str_cost); else stcf (ch, "#c%-20s#g : #y0 to Max, #g0 exp#y, for next.#n\n\r", "Strength"); if (ch->pcdata->perm_int < max_stat) stcf (ch, "#c%-20s#g : #y%d to Max, #g%d exp#y, for next.#n\n\r", "Intelligence", (max_stat - ch->pcdata->perm_int), xp_int_cost); else stcf (ch, "#c%-20s#g : #y0 to Max, #g0 exp#y, for next.#n\n\r", "Intelligence"); if (ch->pcdata->perm_wis < max_stat) stcf (ch, "#c%-20s#g : #y%d to Max, #g%d exp#y, for next.#n\n\r", "Wisdom", (max_stat - ch->pcdata->perm_wis), xp_wis_cost); else stcf (ch, "#c%-20s#g : #y0 to Max, #g0 exp#y, for next.#n\n\r", "Wisdom"); if (ch->pcdata->perm_dex < max_stat) stcf (ch, "#c%-20s#g : #y%d to Max, #g%d exp#y, for next.#n\n\r", "Dexterity", (max_stat - ch->pcdata->perm_dex), xp_dex_cost); else stcf (ch, "#c%-20s#g : #y0 to Max, #g0 exp#y, for next.#n\n\r", "Dexterity"); if (ch->pcdata->perm_con < max_stat) stcf (ch, "#c%-20s#g : #y%d to Max, #g%d exp#y, for next.#n\n\r", "Constitution", (max_stat - ch->pcdata->perm_con), xp_con_cost); else stcf (ch, "#c%-20s#g : #y0 to Max, #g0 exp#y, for next.#n\n\r", "Constitution"); stc ("\n\r", ch); if (ch->max_hit < (statcap + ch->xhit)) stcf (ch, "#c%-20s#g : #g%d exp#y. %d points away from Stamina Cap.#n\n\r", "Stamina (HP)", hp_cost, ((statcap + ch->xhit) - ch->max_hit)); else stcf (ch, "#c%-20s#g : #g%d exp#y. You are at your Stamina Cap.#n\n\r", "Stamina (HP)", 0); if (ch->max_mana < (statcap + ch->xmana)) stcf (ch, "#c%-20s#g : #g%d exp#y. %d points away from Spirit Cap.#n\n\r", "Spirit (MP)", mp_cost, ((statcap + ch->xmana) - ch->max_mana)); else stcf (ch, "#c%-20s#g : #g%d exp#y. You are at your Spirit Cap.#n\n\r", "Spirit (MP)", 0); if (ch->max_move < (statcap + ch->xmove)) stcf (ch, "#c%-20s#g : #g%d exp#y. %d points away from Vitality Cap.#n\n\r", "Vitality (MV)", mv_cost, ((statcap + ch->xmove) - ch->max_move)); else stcf (ch, "#c%-20s#g : #g%d exp#y. You are at your Vitality Cap.#n\n\r", "Vitality (MV)", 0); stc ("\n\r", ch); } if (ch->level <= 2) { int the_cost = 0; seren_banner_to_char ("PK READINESS", ch); if (ch->level == 1) { stcf (ch, "#c%-20s#g : #y<--- You.#n\n\r", "Newbie", the_cost); } if (ch->level == 2) { if (ch->lstatus < 4) the_cost = 4000; else if (ch->lstatus < 6) the_cost = 2000; else if (ch->lstatus < 8) the_cost = 1000; else if (ch->lstatus < 10) the_cost = 500; else the_cost = 0; stcf (ch, "#c%-20s#g : #g%d exp#y.#n\n\r", "Avatar", the_cost); } if ((ch->level >= 3) && ((ch->race < 1) && (ch->class == CLASS_NONE) && (!IS_IMMORTAL (ch)))) stcf (ch, "#c%-20s#g : #g%d exp#y.#n\n\r", "Mortal", 0); else if (IS_IMMORTAL (ch)) stcf (ch, "#c%-20s#g : #g%d exp#y.#n\n\r", "Mortal", 0); stc ("\n\r", ch); } seren_banner_to_char ("QUEST/CLASS", ch); { int the_cost = 0; the_cost = (ch->practice + 1) * 500; if (ch->practice < 9999) stcf (ch, "#c%-20s#g : #g%d exp#y. %d to Max.#n\n\r", "Primal Energy", the_cost, (9999 - ch->practice)); else stcf (ch, "#c%-20s#g : #y0 exp. At Maximum.#n\n\r", "Primal Energy"); if (IS_CLASS (ch, CLASS_WEREWOLF)) { the_cost = (ch->pcdata->powers[WPOWER_SILVER] + 1) * 2500; if (ch->pcdata->powers[WPOWER_SILVER] < 100) stcf (ch, "#c%-20s#g : #g%d exp#y. %d to Max.#n\n\r", "Silver Tolerance", the_cost, (100 - ch->pcdata->powers[WPOWER_SILVER])); else stcf (ch, "#c%-20s#g : #y0 exp. At Maximum.#n\n\r", "Silver Tolerance"); the_cost = (ch->gnosis[GMAXIMUM] + 1) * 25000; if (ch->gnosis[GMAXIMUM] < 20) stcf (ch, "#c%-20s#g : #g%d exp#y. %d to Max.#n\n\r", "Gnosis Points", the_cost, (20 - ch->gnosis[GMAXIMUM])); else stcf (ch, "#c%-20s#g : #y0 exp. At Maximum.#n\n\r", "Gnosis Points"); } if (IS_CLASS (ch, CLASS_MONK)) { the_cost = (ch->focus[MAXIMUM] + 1) * 50000; if (ch->focus[MAXIMUM] < 100) stcf (ch, "#c%-20s#g : #g%d exp#y. %d to Max.#n\n\r", "Mental Focus", the_cost, (100 - ch->focus[MAXIMUM])); else stcf (ch, "#c%-20s#g : #y0 exp. At Maximum.#n\n\r", "Mental Focus"); } if (IS_CLASS (ch, CLASS_HIGHLANDER)) { int work_amt = (((ch->quickening[1] + 1) * ((ch->quickening[1] + 1) + 1)) / 2); int the_xp_cost = 0; int the_qp_cost = 0; if (work_amt == 0) work_amt = 1; the_xp_cost = work_amt * 100000; the_qp_cost = work_amt * 50; if (ch->quickening[1] < 50) stcf (ch, "#c%-20s#g : #g%d exp and %d quest points#y. %d to Max.#n\n\r", "Quickening", the_xp_cost, the_qp_cost, (50 - ch->quickening[1])); else stcf (ch, "#c%-20s#g : #g0 exp and 0 quest points#y. At Maximum.#n\n\r", "Quickening"); } if (IS_CLASS (ch, CLASS_DRAGON)) { the_cost = (ch->pcdata->dragonage + 1) * 3000000; if (ch->pcdata->dragonage < SUPREME && ch->pcdata->dragonage == GET_AGE(ch)) stcf (ch, "#c%-20s#g : #g%d exp#y. %d to Oldest.#n\n\r", "Dragonage", the_cost, (SUPREME - ch->pcdata->dragonage)); else stcf (ch, "#c%-20s#g : #y0 exp. At Oldest.#n\n\r", "Dragonage"); } if (IS_CLASS (ch, CLASS_VAMPIRE)) { the_cost = (ch->pcdata->rank + 1) * 2500000; if (ch->pcdata->rank < AGE_METHUSELAH) stcf (ch, "#c%-20s#g : #g%d exp#y. %d to Moste Anciente.#n\n\r", "Vampiric Lineage", the_cost, (AGE_METHUSELAH - ch->pcdata->rank)); else stcf (ch, "#c%-20s#g : #y0 exp. At Moste Anciente.#n\n\r", "Vampiric Lineage"); } if (IS_CLASS (ch, CLASS_DROW)) { the_cost = (ch->pcdata->stats[DROW_MAGIC] + 1) * 100; if (ch->pcdata->stats[DROW_MAGIC] < 100) stcf (ch, "#c%-20s#g : #y%d drow points. %d to Max.#n\n\r", "Magic Resistance", the_cost, (100 - ch->pcdata->stats[DROW_MAGIC])); else stcf (ch, "#c%-20s#g : #y0 drow points. At Max.#n\n\r", "Magic Resistance"); } stc ("\n\r", ch); } seren_banner_to_char ("LEGENDARY RENOWN", ch); { int the_lexp = (2000000 + (3000000 * ch->lstatus)); int the_lquest = (1000 * ch->lstatus); int the_learnt = 0; switch (ch->lstatus + 1) { default: sprintf (legbuf, "Unknown"); break; case 1: sprintf (legbuf, "Citizen"); the_learnt = 0; break; case 2: sprintf (legbuf, "Savior"); the_learnt = 1000; break; case 3: sprintf (legbuf, "Myth"); the_learnt = 3000; break; case 4: sprintf (legbuf, "Legend"); the_learnt = 6000; break; case 5: sprintf (legbuf, "Titan"); the_learnt = 10000; break; case 6: sprintf (legbuf, "Immortal"); the_learnt = 15000; break; case 7: sprintf (legbuf, "Oracle"); the_learnt = 21000; break; case 8: sprintf (legbuf, "Demi God"); the_learnt = 28000; break; case 9: sprintf (legbuf, "Deity"); the_learnt = 36000; break; case 10: sprintf (legbuf, "Almighty"); the_learnt = 45000; break; } if (ch->lstatus < 10) stcf (ch, "#c%-20s#g : #y%d to Max, #g%d exp#y, %d(%d) qp(earned) for %s.#n\n\r", "Legendary Status", (10 - ch->lstatus), the_lexp, the_lquest, the_learnt, legbuf); else stcf (ch, "#c%-20s#g : #yAt Max, 0 exp, 0(0) qp(earned) for next.#n\n\r", "Legendary Status"); stc ("\n\r", ch); } seren_banner_to_char ("RESISTANCES", ch); { int the_imm_tot = 0; int imm_xp_cost = 0; int imm_qp_cost = 0; int weapcount = 0; int magicount = 0; int affecount = 0; int skilcount = 0; the_imm_tot = count_imms (ch); imm_xp_cost = (the_imm_tot + 1) * 25000; // imm_qp_cost = ( the_imm_tot + 1 ) * 25; imm_qp_cost = 0; if (!IS_IMMUNE (ch, IMM_SLASH)) weapcount++; if (!IS_IMMUNE (ch, IMM_STAB)) weapcount++; if (!IS_IMMUNE (ch, IMM_SMASH)) weapcount++; if (!IS_IMMUNE (ch, IMM_ANIMAL)) weapcount++; if (!IS_IMMUNE (ch, IMM_MISC)) weapcount++; if (!IS_IMMUNE (ch, IMM_HEAT)) magicount++; if (!IS_IMMUNE (ch, IMM_COLD)) magicount++; if (!IS_IMMUNE (ch, IMM_LIGHTNING)) magicount++; if (!IS_IMMUNE (ch, IMM_ACID)) magicount++; if (!IS_IMMUNE (ch, IMM_DRAIN)) magicount++; if (!IS_IMMUNE (ch, IMM_CHARM)) affecount++; if (!IS_IMMUNE (ch, IMM_SLEEP)) affecount++; if (!IS_IMMUNE (ch, IMM_VOODOO)) affecount++; if (!IS_IMMUNE (ch, IMM_HURL)) skilcount++; if (!IS_IMMUNE (ch, IMM_BACKSTAB)) skilcount++; if (!IS_IMMUNE (ch, IMM_KICK)) skilcount++; if (!IS_IMMUNE (ch, IMM_DISARM)) skilcount++; if (!IS_IMMUNE (ch, IMM_STEAL)) skilcount++; stcf (ch, "#c%-20s#g : #y", "WEAPONS"); if (weapcount) { if (!IS_IMMUNE (ch, IMM_SLASH)) { send_to_char ("#wSlash", ch); weapcount--; if (weapcount) stc (", ", ch); } if (!IS_IMMUNE (ch, IMM_STAB)) { send_to_char ("#wStab", ch); weapcount--; if (weapcount) stc (", ", ch); } if (!IS_IMMUNE (ch, IMM_SMASH)) { send_to_char ("#wSmash", ch); weapcount--; if (weapcount) stc (", ", ch); } if (!IS_IMMUNE (ch, IMM_ANIMAL)) { send_to_char ("#wBeast", ch); weapcount--; if (weapcount) stc (", ", ch); } if (!IS_IMMUNE (ch, IMM_MISC)) send_to_char ("#wBind", ch); } else stc ("Finished.", ch); stc ("\n\r", ch); // divide6_to_char( ch ); stcf (ch, "#c%-20s#g : #y", "MAGICS"); if (magicount) { if (!IS_IMMUNE (ch, IMM_HEAT)) { send_to_char ("#wFire", ch); magicount--; if (magicount) stc (", ", ch); } if (!IS_IMMUNE (ch, IMM_COLD)) { send_to_char ("#wWater", ch); magicount--; if (magicount) stc (", ", ch); } if (!IS_IMMUNE (ch, IMM_LIGHTNING)) { send_to_char ("#wWind", ch); magicount--; if (magicount) stc (", ", ch); } if (!IS_IMMUNE (ch, IMM_ACID)) { send_to_char ("#wEarth", ch); magicount--; if (magicount) stc (", ", ch); } if (!IS_IMMUNE (ch, IMM_DRAIN)) send_to_char ("#wDark", ch); } else stc ("Finished.", ch); stc ("\n\r", ch); // divide6_to_char( ch ); stcf (ch, "#c%-20s#g : #y", "AFFECTS"); if (affecount) { if (!IS_IMMUNE (ch, IMM_CHARM)) { send_to_char ("#wControl", ch); affecount--; if (affecount) stc (", ", ch); } if (!IS_IMMUNE (ch, IMM_SLEEP)) { send_to_char ("#wEnchant", ch); affecount--; if (affecount) stc (", ", ch); } if (!IS_IMMUNE (ch, IMM_VOODOO)) send_to_char ("#wVoodoo", ch); } else stc ("Finished.", ch); stc ("\n\r", ch); // divide6_to_char( ch ); stcf (ch, "#c%-20s#g : #y", "SKILLS"); if (skilcount) { if (!IS_IMMUNE (ch, IMM_HURL)) { send_to_char ("#wHurl", ch); skilcount--; if (skilcount) stc (", ", ch); } if (!IS_IMMUNE (ch, IMM_BACKSTAB)) { send_to_char ("#wBackstab", ch); skilcount--; if (skilcount) stc (", ", ch); } if (!IS_IMMUNE (ch, IMM_KICK)) { send_to_char ("#wPhysical", ch); skilcount--; if (skilcount) stc (", ", ch); } if (!IS_IMMUNE (ch, IMM_DISARM)) { send_to_char ("#wDisarm", ch); skilcount--; if (skilcount) stc (", ", ch); } if (!IS_IMMUNE (ch, IMM_STEAL)) send_to_char ("#wSteal", ch); } else stc ("Finished.", ch); stc ("\n\r", ch); if (the_imm_tot < 18) stcf (ch, "#c%-20s %d Remain, #g%d exp#y, for next resistance", "", (18 - the_imm_tot), imm_xp_cost); else stcf (ch, "#c%-20s 0 Remain, 0 exp, for next resistance", ""); stc ("\n\r", ch); stc ("#R -----------------------------------------------------------------------------#n\n\r", ch); } return; } if (!str_prefix (arg1, "strength")) is_ok = TRUE; else if (!str_prefix (arg1, "intelligence")) is_ok = TRUE; else if (!str_prefix (arg1, "wisdom")) is_ok = TRUE; else if (!str_prefix (arg1, "dexterity")) is_ok = TRUE; else if (!str_prefix (arg1, "constitution")) is_ok = TRUE; else if (!str_cmp (arg1, "hp") || !str_cmp (arg1, "stamina")) is_ok = TRUE; else if (!str_cmp (arg1, "mana") || !str_cmp (arg1, "spirit")) is_ok = TRUE; else if (!str_cmp (arg1, "move") || !str_cmp (arg1, "vitality")) is_ok = TRUE; else if (!str_cmp (arg1, "primal")) is_ok = TRUE; else if (!str_cmp (arg1, "legend")) is_ok = TRUE; else is_ok = FALSE; if (IS_CLASS (ch, CLASS_WEREWOLF)) { if (!str_cmp (arg1, "silver")) is_ok = TRUE; if (!str_cmp (arg1, "gnosis")) is_ok = TRUE; } if (IS_CLASS (ch, CLASS_MONK)) { if (!str_cmp (arg1, "focus")) is_ok = TRUE; } if (IS_CLASS (ch, CLASS_VAMPIRE)) { if (!str_cmp (arg1, "lineage")) is_ok = TRUE; } if (IS_CLASS (ch, CLASS_DROW)) { if (!str_cmp (arg1, "magic")) is_ok = TRUE; } if (IS_CLASS (ch, CLASS_DRAGON)) { if ((!str_cmp (arg1, "dragonage")) && ch->pcdata->dragonage < SUPREME && ch->pcdata->dragonage == GET_AGE(ch)) is_ok = TRUE; } if (IS_CLASS (ch, CLASS_HIGHLANDER)) { if (!str_cmp (arg1, "quickening")) is_ok = TRUE; } if ((arg2[0] != '\0') && (is_ok)) { amount = 0; if (!str_cmp (arg2, "all")) train_all = TRUE; if ((!is_number (arg2)) && (!train_all)) { send_to_char ("Please enter a numeric value.#n\n\r", ch); return; } if (!train_all) amount = atoi (arg2); if (((str_cmp (arg1, "hp")) && (str_cmp (arg1, "mana")) && (str_cmp (arg1, "move"))) && ((str_cmp (arg1, "stamina")) && (str_cmp (arg1, "spirit")) && (str_cmp (arg1, "vitality")))) { if (train_all) { stcf (ch, "You can't use train all with %s, only hp/mana/move.#n\n\r", arg1); return; } if ((amount < 1) || (amount > 250)) { send_to_char ("Please enter a value between 1 and 250.#n\n\r", ch); return; } } else { if (!train_all) { if (amount < 1 || amount > 1000) { send_to_char ("Please enter a value between 1 and 1000.#n\n\r", ch); return; } } } } if (!str_prefix (arg1, "strength")) { pAbility = &ch->pcdata->perm_str; pOutput = "strength"; VITALS_TRAIN = TRUE; } else if (!str_prefix (arg1, "intelligence")) { pAbility = &ch->pcdata->perm_int; pOutput = "intelligence"; VITALS_TRAIN = TRUE; } else if (!str_prefix (arg1, "wisdom")) { pAbility = &ch->pcdata->perm_wis; pOutput = "wisdom"; VITALS_TRAIN = TRUE; } else if (!str_prefix (arg1, "dexterity")) { pAbility = &ch->pcdata->perm_dex; pOutput = "dexterity"; VITALS_TRAIN = TRUE; } else if (!str_prefix (arg1, "constitution")) { pAbility = &ch->pcdata->perm_con; pOutput = "constitution"; VITALS_TRAIN = TRUE; } else { // Worry about something else here-after, vitals didn't change. VITALS_TRAIN = FALSE; } // after checking stats either train and quit or continue checking if (VITALS_TRAIN) { bool FAIL = FALSE; trained_amount = 0; if ((*pAbility + amount) > max_stat) amount = max_stat - *pAbility; if (amount <= 0) { stcf (ch, "Your %s is already at its peak.#n\n\r", pOutput); return; } /* y = x+1; (y(y+1)/2)*25 x=0 y = 0+1; (y(y+1)/2)*25 -> y = 1; (y(y+1)/2)*25 -> (1(1+1)/2)*25 -> (1(2)/2)*25 -> ( 2/2)*25 -> 1*25 -> 25 x=1 y = 1+1; (y(y+1)/2)*25 -> y = 2; (y(y+1)/2)*25 -> (2(2+1)/2)*25 -> (2(3)/2)*25 -> ( 6/2)*25 -> 3*25 -> 75 x=2 y = 2+1; (y(y+1)/2)*25 -> y = 3; (y(y+1)/2)*25 -> (3(3+1)/2)*25 -> (3(4)/2)*25 -> (12/2)*25 -> 6*25 -> 150 x=3 y = 3+1; (y(y+1)/2)*25 -> y = 4; (y(y+1)/2)*25 -> (4(4+1)/2)*25 -> (4(5)/2)*25 -> (20/2)*25 -> 10*25 -> 250 x=4 y = 4+1; (y(y+1)/2)*25 -> y = 5; (y(y+1)/2)*25 -> (5(5+1)/2)*25 -> (5(6)/2)*25 -> (30/2)*25 -> 15*25 -> 375 */ for (train_loop = 0; train_loop < amount; train_loop++) { xp_cost = ((*pAbility + 1) * 500); qp_cost = ((*pAbility + 1) * 25); earnt_qp = (((*pAbility + 1) * ((*pAbility + 1) + 1) / 2) * 25); if (FAIL) continue; if (ch->exp < xp_cost) { combo_var = xp_cost - ch->exp; FAIL = TRUE; stcf (ch, "You need another#g %d experience to increase %s from %d to %d.#n\n\r", combo_var, pOutput, *pAbility, (*pAbility + 1)); } /* if ( ch->pcdata->quest < qp_cost ) { combo_var = qp_cost - ch->pcdata->quest; FAIL = TRUE; stcf( ch, "You need another %d quest points to increase %s from %d to %d.#n\n\r", combo_var, pOutput, *pAbility, ( *pAbility + 1 ) ); } if ( ch->pcdata->score[SCORE_QUEST] < earnt_qp ) { combo_var = earnt_qp - ch->pcdata->score[SCORE_QUEST]; FAIL = TRUE; stcf( ch, "You need another#g %d earned quest points to increase %s from %d to %d.#n\n\r", combo_var, pOutput, *pAbility, ( *pAbility + 1 ) ); } */ if (!FAIL) { trained_amount++; ch->exp -= xp_cost; // ch->pcdata->quest -= qp_cost; *pAbility += 1; CHAR_DIRTY = TRUE; } } if ((FAIL) && (trained_amount > 0)) stcf (ch, "You increased your %s only %d of the %d times you requested.#n\n\r", pOutput, trained_amount, amount); else if ((FAIL) && (trained_amount == 0)) stcf (ch, "You were unable to increase your %s at all.#n\n\r", pOutput); else stcf (ch, "You increased your %s by %d points.#n\n\r", pOutput, trained_amount); if (CHAR_DIRTY) save_char_obj (ch); return; } // Finished with checking for VITALS_TRAIN, let's do HPMPMV_TRAIN next. if (!str_cmp (arg1, "hp") || !str_cmp (arg1, "stamina")) { pAbility = &ch->max_hit; pOutput = "stamina"; HPMPMV_TRAIN = TRUE; } else if (!str_cmp (arg1, "mana") || !str_cmp (arg1, "spirit")) { pAbility = &ch->max_mana; pOutput = "spirit"; HPMPMV_TRAIN = TRUE; } else if (!str_cmp (arg1, "move") || !str_cmp (arg1, "vitality")) { pAbility = &ch->max_move; pOutput = "vitality"; HPMPMV_TRAIN = TRUE; } else { // Worry about something else here-after, HPMPMV didn't change. HPMPMV_TRAIN = FALSE; } // after checking stats either train and quit or continue checking if (HPMPMV_TRAIN) { int newstatcap = statcap; bool FAIL = FALSE; trained_amount = 0; if (!str_cmp(pOutput, "stamina")) newstatcap += ch->xhit; else if (!str_cmp(pOutput, "spirit")) newstatcap += ch->xmana; else if (!str_cmp(pOutput, "vitality")) newstatcap += ch->xmove; if ((*pAbility + amount) > newstatcap) amount = newstatcap - *pAbility; if ((amount <= 0) && (!train_all)) { stcf (ch, "Your %s is already at its peak.#n\n\r", pOutput); return; } if (train_all) amount = 150000; for (train_loop = 0; train_loop < amount; train_loop++) { if (!str_cmp (arg1, "hp")) xp_cost = ((ch->max_hit - ch->xhit) - (ch->pcdata->perm_con * 4)); if (!str_cmp (arg1, "stamina")) xp_cost = ((ch->max_hit - ch->xhit) - (ch->pcdata->perm_con * 4)); if (!str_cmp (arg1, "mana")) xp_cost = ((ch->max_mana - ch->xmana) - (ch->pcdata->perm_wis * 4)); if (!str_cmp (arg1, "spirit")) xp_cost = ((ch->max_mana - ch->xmana) - (ch->pcdata->perm_wis * 4)); if (!str_cmp (arg1, "move")) xp_cost = ((ch->max_move - ch->xmove) - (ch->pcdata->perm_dex * 4)); if (!str_cmp (arg1, "vitality")) xp_cost = ((ch->max_move - ch->xmove) - (ch->pcdata->perm_dex * 4)); if (IS_CLASS (ch, CLASS_HIGHLANDER)) { if ((IS_DEMPOWER (ch, HPOWER_BLADESPIN)) && (!str_cmp (arg1, "hp"))) xp_cost *= 0.55; if ((IS_DEMPOWER (ch, HPOWER_ANCESTRAL)) && (!str_cmp (arg1, "mana"))) xp_cost *= 0.55; if ((IS_DEMPOWER (ch, HPOWER_SWORDCRAFT)) && (!str_cmp (arg1, "move"))) xp_cost *= 0.55; if ((IS_DEMPOWER (ch, HPOWER_BLADESPIN)) && (!str_cmp (arg1, "stamina"))) xp_cost *= 0.55; if ((IS_DEMPOWER (ch, HPOWER_ANCESTRAL)) && (!str_cmp (arg1, "spirit"))) xp_cost *= 0.55; if ((IS_DEMPOWER (ch, HPOWER_SWORDCRAFT)) && (!str_cmp (arg1, "vitality"))) xp_cost *= 0.55; } if (xp_cost < 1) xp_cost = 1; if (FAIL) continue; if ((*pAbility) >= newstatcap) FAIL = TRUE; if (ch->exp < xp_cost) { combo_var = xp_cost - ch->exp; FAIL = TRUE; stcf (ch, "You need another#g %d experience to increase %s from %d to %d.#n\n\r", combo_var, pOutput, *pAbility, (*pAbility + 1)); } if (!FAIL) { trained_amount++; ch->exp -= xp_cost; *pAbility += 1; CHAR_DIRTY = TRUE; } } if ((FAIL) && (trained_amount > 0)) stcf (ch, "You increased your %s only %d of the %d times you requested.#n\n\r", pOutput, trained_amount, amount); else if ((FAIL) && (trained_amount == 0)) stcf (ch, "You were unable to increase your %s at all.#n\n\r", pOutput); else stcf (ch, "You increased your %s by %d points.#n\n\r", pOutput, trained_amount); if (CHAR_DIRTY) save_char_obj (ch); return; } // Finished with checking for HPMPMV_TRAIN, let's do PRIMAL_TRAIN next. if (!str_cmp (arg1, "primal")) { pAbility = &ch->practice; pOutput = "primal energy"; PRIMAL_TRAIN = TRUE; } else { // Worry about something else here-after, primal didn't change. PRIMAL_TRAIN = FALSE; } // after checking stats either train and quit or continue checking if (PRIMAL_TRAIN) { bool FAIL = FALSE; trained_amount = 0; if ((*pAbility + amount) > 9999) amount = 9999 - *pAbility; if (amount <= 0) { stcf (ch, "Your %s is already at its peak.#n\n\r", pOutput); return; } for (train_loop = 0; train_loop < amount; train_loop++) { xp_cost = (*pAbility + 1) * 500; if (FAIL) continue; if (ch->exp < xp_cost) { combo_var = xp_cost - ch->exp; FAIL = TRUE; stcf (ch, "You need another#g %d experience to increase %s from %d to %d.#n\n\r", combo_var, pOutput, *pAbility, (*pAbility + 1)); } if (!FAIL) { trained_amount++; ch->exp -= xp_cost; *pAbility += 1; CHAR_DIRTY = TRUE; } } if ((FAIL) && (trained_amount > 0)) stcf (ch, "You increased your %s only %d of the %d times you requested.#n\n\r", pOutput, trained_amount, amount); else if ((FAIL) && (trained_amount == 0)) stcf (ch, "You were unable to increase your %s at all.#n\n\r", pOutput); else stcf (ch, "You increased your %s by %d points.#n\n\r", pOutput, trained_amount); if (CHAR_DIRTY) save_char_obj (ch); return; } // Finished with checking for PRIMAL_TRAIN, let's do STATUS_TRAIN next. if (!str_cmp (arg1, "legend")) { pAbility = &ch->lstatus; pOutput = "legendary reknown"; STATUS_TRAIN = TRUE; } else { // Worry about something else here-after, legend didn't change. STATUS_TRAIN = FALSE; } // after checking stats either train and quit or continue checking if (STATUS_TRAIN) { bool FAIL = FALSE; trained_amount = 0; if ((*pAbility + amount) > 10) amount = 10 - *pAbility; if (amount <= 0) { stcf (ch, "Your %s is already at its peak.#n\n\r", pOutput); return; } for (train_loop = 0; train_loop < amount; train_loop++) { if (FAIL) continue; xp_cost = (2000000 + (3000000 * ch->lstatus)); qp_cost = (1000 * ch->lstatus); if (ch->lstatus == 0) earnt_qp = 0; if (ch->lstatus == 1) earnt_qp = 1000; if (ch->lstatus == 2) earnt_qp = 3000; if (ch->lstatus == 3) earnt_qp = 6000; if (ch->lstatus == 4) earnt_qp = 10000; if (ch->lstatus == 5) earnt_qp = 15000; if (ch->lstatus == 6) earnt_qp = 21000; if (ch->lstatus == 7) earnt_qp = 28000; if (ch->lstatus == 8) earnt_qp = 36000; if (ch->lstatus == 9) earnt_qp = 45000; /* if (ch->lstatus == 10) { xp_cost = 2000000000; // 2.00 billion Exp -- Serenity qp_cost = 500000; // 0.50 million Qp on Hand -- Serenity earnt_qp = 750000; // 0.75 million Qp earned -- Serenity } */ if (ch->exp < xp_cost) { combo_var = xp_cost - ch->exp; FAIL = TRUE; stcf (ch, "You need another#g %d experience to increase %s from %d to %d.#n\n\r", combo_var, pOutput, *pAbility, (*pAbility + 1)); } if (ch->pcdata->quest < qp_cost) { combo_var = qp_cost - ch->pcdata->quest; FAIL = TRUE; stcf (ch, "You need another %d quest points to increase %s from %d to %d.#n\n\r", combo_var, pOutput, *pAbility, (*pAbility + 1)); } if (ch->pcdata->score[SCORE_QUEST] < earnt_qp) { combo_var = earnt_qp - ch->pcdata->score[SCORE_QUEST]; FAIL = TRUE; stcf (ch, "You need another#g %d earned quest points to increase %s from %d to %d.#n\n\r", combo_var, pOutput, *pAbility, (*pAbility + 1)); } if (ch->lstatus == 10) { if (ch->max_hit < 150000) { combo_var = 150000 - ch->max_hit; FAIL = TRUE; stcf (ch, "You need another#g %d stamina to increase %s from %d to %d.#n\n\r", combo_var, pOutput, *pAbility, (*pAbility + 1)); } if (ch->max_mana < 150000) { combo_var = 150000 - ch->max_mana; FAIL = TRUE; stcf (ch, "You need another#g %d spirit to increase %s from %d to %d.#n\n\r", combo_var, pOutput, *pAbility, (*pAbility + 1)); } if (ch->max_move < 150000) { combo_var = 150000 - ch->max_move; FAIL = TRUE; stcf (ch, "You need another#g %d vitality to increase %s from %d to %d.#n\n\r", combo_var, pOutput, *pAbility, (*pAbility + 1)); } } if (!FAIL) { char announce_buf[500]; switch (ch->lstatus + 1) { default: sprintf (legbuf, "Unknown"); break; case 1: sprintf (legbuf, "a Citizen"); break; case 2: sprintf (legbuf, "a Savior"); break; case 3: sprintf (legbuf, "a Myth"); break; case 4: sprintf (legbuf, "a Legend"); break; case 5: sprintf (legbuf, "a Titan"); break; case 6: sprintf (legbuf, "an Immortal"); break; case 7: sprintf (legbuf, "an Oracle"); break; case 8: sprintf (legbuf, "a Demi God"); break; case 9: sprintf (legbuf, "a Deity"); break; case 10: sprintf (legbuf, "an Almighty Entity"); break; } trained_amount++; ch->exp -= xp_cost; ch->pcdata->quest -= qp_cost; *pAbility += 1; sprintf (announce_buf, "#r%s #wis %s", ch->name, legbuf); do_legend_announce (ch, announce_buf); CHAR_DIRTY = TRUE; } } if ((FAIL) && (trained_amount > 0)) stcf (ch, "You increased your %s only %d of the %d times you requested.#n\n\r", pOutput, trained_amount, amount); else if ((FAIL) && (trained_amount == 0)) stcf (ch, "You were unable to increase your %s at all.#n\n\r", pOutput); else stcf (ch, "You increased your %s by %d points.#n\n\r", pOutput, trained_amount); if (CHAR_DIRTY) save_char_obj (ch); return; } // Finished with checking for STATUS_TRAIN, let's do AVATAR_TRAIN next. if (!str_cmp (arg1, "avatar")) { pAbility = &ch->level; pOutput = "pk readiness"; AVATAR_TRAIN = TRUE; } else { // Worry about something else here-after, avatar didn't change. AVATAR_TRAIN = FALSE; } // after checking stats either train and quit or continue checking if (AVATAR_TRAIN) { bool FAIL = FALSE; char avatar_buf[1500]; trained_amount = 0; amount = 1; if ((*pAbility + amount) > 3) amount = 3 - *pAbility; if (*pAbility == 1) { stcf (ch, "Your %s should not be a matter of concern to you at this time.#n\n\r", pOutput); return; } if (*pAbility != 2) amount = 0; if (amount > 1) amount = 1; if (amount <= 0) { stcf (ch, "Your %s is already at its peak.#n\n\r", pOutput); return; } for (train_loop = 0; train_loop < amount; train_loop++) { if (ch->lstatus < 4) xp_cost = 4000; else if (ch->lstatus < 6) xp_cost = 2000; else if (ch->lstatus < 8) xp_cost = 1000; else if (ch->lstatus < 10) xp_cost = 500; else xp_cost = 0; if (FAIL) continue; if (ch->exp < xp_cost) { combo_var = xp_cost - ch->exp; FAIL = TRUE; stcf (ch, "You need another#g %d experience to increase %s from %d to %d.#n\n\r", combo_var, pOutput, *pAbility, (*pAbility + 1)); } if (!FAIL) { trained_amount++; ch->exp -= xp_cost; *pAbility += 1; if (IS_CLASS (ch, CLASS_DEMON)) ch->alignment = -1000; if (IS_CLASS (ch, CLASS_HIGHLANDER)) { do_remove (ch, "all"); do_wear (ch, "all"); } ch->captimer = 0; if (ch->level < ch->trust) ch->level = ch->trust; if (!IS_NPC (ch) && IS_VAMPAFF (ch, VAM_MORTAL)) do_mortalvamp (ch, ""); if (IS_CLASS (ch, CLASS_DEMON)) sprintf (avatar_buf, "#r%s #whas embraced Lucifer as father.", ch->name); else if (IS_CLASS (ch, CLASS_MAGE)) sprintf (avatar_buf, "#r%s #whas once again hit the library for books.", ch->name); else if (IS_CLASS (ch, CLASS_WEREWOLF)) sprintf (avatar_buf, "#r%s #whas joined the fight for Gaia.", ch->name); else if (IS_CLASS (ch, CLASS_VAMPIRE)) sprintf (avatar_buf, "#r%s #whas let the beast consume them.", ch->name); else if (IS_CLASS (ch, CLASS_HIGHLANDER)) { sprintf (avatar_buf, "#r%s #whas taken up the sacred arts of the katana.", ch->name); clear_stats (ch); } else if (IS_CLASS (ch, CLASS_DROW)) sprintf (avatar_buf, "#r%s #whas selected Lloth as guide and guardian.", ch->name); else if (IS_CLASS (ch, CLASS_MONK)) sprintf (avatar_buf, "#r%s #whas left the monastary seeking enlightenment.", ch->name); else if (IS_CLASS (ch, CLASS_DRAGON)) sprintf (avatar_buf, "#r%s #whas transformed into a gigantic Wyrm.", ch->name); else if (IS_CLASS (ch, CLASS_NINJA)) sprintf (avatar_buf, "#r%s #whas vanished into the night.", ch->name); else if (IS_CLASS (ch, CLASS_FAE)) sprintf (avatar_buf, "#r%s #whas rejoined the dreaming and faerie court.", ch->name); else if (IS_CLASS (ch, CLASS_CHOOSE)) sprintf (avatar_buf, "#r%s #whas rejoined the dreaming and faerie court.", ch->name); else if (IS_CLASS (ch, CLASS_WRAITH)) sprintf (avatar_buf, "#r%s #whas died... Again.", ch->name); else sprintf (avatar_buf, "#r%s #whas become an avatar.#n", ch->name); do_avatar_announce (ch, avatar_buf); CHAR_DIRTY = TRUE; } } if ((FAIL) && (trained_amount > 0)) stcf (ch, "You were unable to increase your %s.#n\n\r", pOutput); else if ((FAIL) && (trained_amount == 0)) stcf (ch, "You were unable to increase your %s at all.#n\n\r", pOutput); else stcf (ch, "You increased your %s to maximum.#n\n\r", pOutput, trained_amount); if (CHAR_DIRTY) save_char_obj (ch); return; } // Finished with checking for AVATAR_TRAIN, let's do MORTAL_TRAIN next. if (!str_cmp (arg1, "mortal")) { if (IS_IMMORTAL (ch)) { stc ("Immortals have no need to train mortal!\n\r", ch); return; } pAbility = &ch->level; pOutput = "mortality"; MORTAL_TRAIN = TRUE; } else { // Worry about something else here-after, mortality didn't change. MORTAL_TRAIN = FALSE; } // after checking stats either train and quit or continue checking if (MORTAL_TRAIN) { bool FAIL = FALSE; trained_amount = 0; xp_cost = 0; amount = *pAbility - 2; if ((*pAbility - amount) < 2) amount = *pAbility - 2; if (*pAbility == 1) { stcf (ch, "Your %s should not be a matter of concern to you at this time.#n\n\r", pOutput); return; } if (*pAbility == 2) amount = 0; if ((ch->race > 0) && (!IS_IMMORTAL (ch))) { stcf (ch, "You can't embrace %s fully while you have status.#n\n\r", pOutput); return; } if (ch->fight_timer > 0) { send_to_char ("Not until your fight timer expires.#n\n\r", ch); return; } if (IS_SET (ch->war, WARRING)) { stc ("Not while in a war!\n\r", ch); return; } if (IS_SET (ch->flag2, AFF2_INARENA)) { stc ("Not while you're in the arena.#n\n\r", ch); return; } if ((ch->class != CLASS_NONE) && (!IS_IMMORTAL (ch))) { stcf (ch, "You are unable to embrace %s any longer.#n\n\r", pOutput); return; } if (amount <= 0) { stcf (ch, "You've already embraced your %s.#n\n\r", pOutput); return; } for (train_loop = 0; train_loop < amount; train_loop++) { if (ch->lstatus < 4) xp_cost = 4000; else if (ch->lstatus < 6) xp_cost = 2000; else if (ch->lstatus < 8) xp_cost = 1000; else if (ch->lstatus < 10) xp_cost = 500; else xp_cost = 0; if (FAIL) continue; if (ch->exp < xp_cost) { combo_var = xp_cost - ch->exp; FAIL = TRUE; stcf (ch, "You need another#g %d experience to embrace your %s.#n\n\r", combo_var, pOutput); } if (!FAIL) { trained_amount++; ch->exp -= xp_cost; ch->level = 2; ch->trust = 0; CHAR_DIRTY = TRUE; } } if ((FAIL) && (trained_amount > 0)) stcf (ch, "You were unable to embrace your %s.#n\n\r", pOutput); else if ((FAIL) && (trained_amount == 0)) stcf (ch, "You were unable to emrabce your %s.#n\n\r", pOutput); else stcf (ch, "You embraced your %s.#n\n\r", pOutput); if (CHAR_DIRTY) save_char_obj (ch); return; } // Finished with checking for MORTAL_TRAIN, let's do AMAGIC_TRAIN next. if (!str_cmp (arg1, "magic") && (IS_CLASS (ch, CLASS_DROW))) { pAbility = &ch->pcdata->stats[DROW_MAGIC]; pOutput = "magic resistance"; AMAGIC_TRAIN = TRUE; } else { // Worry about something else here-after, magic resistance didn't change. AMAGIC_TRAIN = FALSE; } // after checking stats either train and quit or continue checking if (AMAGIC_TRAIN) { bool FAIL = FALSE; trained_amount = 0; if ((*pAbility + amount) > 100) amount = 100 - *pAbility; if (amount <= 0) { stcf (ch, "Your %s is already at its peak.#n\n\r", pOutput); return; } for (train_loop = 0; train_loop < amount; train_loop++) { xp_cost = (*pAbility + 1) * 100; if (FAIL) continue; if (ch->pcdata->stats[DROW_POWER] < xp_cost) { // combo_var = ch->pcdata->stats[DROW_POWER] - ch->exp; combo_var = ch->pcdata->stats[DROW_MAGIC] + 1 * 100; FAIL = TRUE; stcf (ch, "You need another %d drow points to increase %s from %d to %d.#n\n\r", combo_var, pOutput, *pAbility, (*pAbility + 1)); } if (!FAIL) { trained_amount++; ch->pcdata->stats[DROW_POWER] -= combo_var; *pAbility += 1; CHAR_DIRTY = TRUE; } } if ((FAIL) && (trained_amount > 0)) stcf (ch, "You increased your %s only %d of the %d times you requested.#n\n\r", pOutput, trained_amount, amount); else if ((FAIL) && (trained_amount == 0)) stcf (ch, "You were unable to increase your %s at all.#n\n\r", pOutput); else stcf (ch, "You increased your %s by %d percent.#n\n\r", pOutput, trained_amount); if (CHAR_DIRTY) save_char_obj (ch); return; } // Finished with checking for AMAGIC_TRAIN, let's do SILVER_TRAIN next. if (!str_cmp (arg1, "silver") && (IS_CLASS (ch, CLASS_WEREWOLF))) { pAbility = &ch->pcdata->powers[WPOWER_SILVER]; pOutput = "silver tolerance"; SILVER_TRAIN = TRUE; } else { // Worry about something else here-after, silver tolerance didn't change. SILVER_TRAIN = FALSE; } // after checking stats either train and quit or continue checking if (SILVER_TRAIN) { bool FAIL = FALSE; trained_amount = 0; if ((*pAbility + amount) > 100) amount = 100 - *pAbility; if (amount <= 0) { stcf (ch, "Your %s is already at its peak.#n\n\r", pOutput); return; } for (train_loop = 0; train_loop < amount; train_loop++) { xp_cost = (*pAbility + 1) * 2500; if (FAIL) continue; if (ch->exp < xp_cost) { combo_var = xp_cost - ch->exp; FAIL = TRUE; stcf (ch, "You need another#g %d experience to increase %s from %d to %d.#n\n\r", combo_var, pOutput, *pAbility, (*pAbility + 1)); } if (!FAIL) { trained_amount++; ch->exp -= xp_cost; *pAbility += 1; CHAR_DIRTY = TRUE; } } if ((FAIL) && (trained_amount > 0)) stcf (ch, "You increased your %s only %d of the %d times you requested.#n\n\r", pOutput, trained_amount, amount); else if ((FAIL) && (trained_amount == 0)) stcf (ch, "You were unable to increase your %s at all.#n\n\r", pOutput); else stcf (ch, "You increased your %s by %d percent.#n\n\r", pOutput, trained_amount); if (CHAR_DIRTY) save_char_obj (ch); return; } // Finished with checking for SILVER_TRAIN, let's do GNOSIS_TRAIN next. if (!str_cmp (arg1, "gnosis") && (IS_CLASS (ch, CLASS_WEREWOLF))) { pAbility = &ch->gnosis[GMAXIMUM]; pOutput = "gnosis points"; GNOSIS_TRAIN = TRUE; } else { // Worry about something else here-after, gnosis didn't change. GNOSIS_TRAIN = FALSE; } // after checking stats either train and quit or continue checking if (GNOSIS_TRAIN) { bool FAIL = FALSE; trained_amount = 0; if ((*pAbility + amount) > 20) amount = 20 - *pAbility; if (amount <= 0) { stcf (ch, "Your %s is already at its peak.#n\n\r", pOutput); return; } for (train_loop = 0; train_loop < amount; train_loop++) { xp_cost = (*pAbility + 1) * 25000; if (FAIL) continue; if (ch->exp < xp_cost) { combo_var = xp_cost - ch->exp; FAIL = TRUE; stcf (ch, "You need another#g %d experience to increase %s from %d to %d.#n\n\r", combo_var, pOutput, *pAbility, (*pAbility + 1)); } if (!FAIL) { trained_amount++; ch->exp -= xp_cost; *pAbility += 1; ch->gnosis[GCURRENT]++; // Associated ability CHAR_DIRTY = TRUE; } } if ((FAIL) && (trained_amount > 0)) stcf (ch, "You increased your %s only %d of the %d times you requested.#n\n\r", pOutput, trained_amount, amount); else if ((FAIL) && (trained_amount == 0)) stcf (ch, "You were unable to increase your %s at all.#n\n\r", pOutput); else stcf (ch, "You increased your %s by %d points.#n\n\r", pOutput, trained_amount); if (CHAR_DIRTY) save_char_obj (ch); return; } // Finished with checking for GNOSIS_TRAIN, let's do VAMPYR_TRAIN next. if (!str_cmp (arg1, "lineage") && (IS_CLASS (ch, CLASS_VAMPIRE))) { pAbility = &ch->pcdata->rank; pOutput = "ancient lineage"; VAMPYR_TRAIN = TRUE; } else { // Worry about something else here-after, lineage didn't change. VAMPYR_TRAIN = FALSE; } // after checking stats either train and quit or continue checking if (VAMPYR_TRAIN) { bool FAIL = FALSE; char *word_buf; trained_amount = 0; if ((*pAbility + amount) > AGE_METHUSELAH) amount = AGE_METHUSELAH - *pAbility; if (amount <= 0) { stcf (ch, "Your %s is already at the best.#n\n\r", pOutput); return; } for (train_loop = 0; train_loop < amount; train_loop++) { switch (ch->pcdata->rank + 1) { default: { word_buf = "Unknown"; xp_cost = 0; break; } // Free? case AGE_CHILDE: { word_buf = "Childe"; xp_cost = 0; break; } // Free case AGE_NEONATE: { word_buf = "Neonate"; xp_cost = 2500000; break; } // 2.5 mil case AGE_ANCILLA: { word_buf = "Ancilla"; xp_cost = 5000000; break; } // 5 mil case AGE_ELDER: { word_buf = "Elder"; xp_cost = 7500000; break; } // 7.5 mil case AGE_METHUSELAH: { word_buf = "Methuselah"; xp_cost = 10000000; break; } // 10 mil } if (FAIL) continue; if (ch->exp < xp_cost) { combo_var = xp_cost - ch->exp; FAIL = TRUE; stcf (ch, "You need another#g %d experience to improve your %s to %s Vampire.#n\n\r", combo_var, pOutput, word_buf); } if (!FAIL) { trained_amount++; ch->exp -= xp_cost; *pAbility += 1; CHAR_DIRTY = TRUE; } } if ((FAIL) && (trained_amount > 0)) stcf (ch, "You improved your %s only %d of the %d times you requested.#n\n\r", pOutput, trained_amount, amount); else if ((FAIL) && (trained_amount == 0)) stcf (ch, "You were unable to improve your %s.#n\n\r", pOutput); else stcf (ch, "You improved your %s by %d ranks.#n\n\r", pOutput, trained_amount); if (CHAR_DIRTY) save_char_obj (ch); return; } // Finished with checking for VAMPYR_TRAIN, let's do DRAGON_TRAIN next. if (str_cmp (arg1, "dragonage") || (!IS_CLASS (ch, CLASS_DRAGON))) { // Worry about something else here-after, dragonage didn't change. DRAGON_TRAIN = FALSE; } else { int temp = GET_AGE(ch); pOutput = "maturity"; DRAGON_TRAIN = TRUE; bool FAIL = FALSE; char *age_buf[13] = { "New", "Hatchling", "Dragon Whelp", "Juvenile Dragon", "Young Adult Dragon", "Adult Dragon", "Mature Adult Dragon", "Elder Dragon", "Venerable Dragon", "Ancient Dragon", "Lesser Wyrm", "Greater Wyrm", "Supreme Wyrm" }; trained_amount = 0; if ((temp + amount) > ((14-ch->pcdata->stats[UNI_GEN])*2)-1) amount = (((14-ch->pcdata->stats[UNI_GEN])*2)-1) - temp; else if ((temp + amount) > SUPREME) amount = SUPREME - temp; if (amount <= 0) { stcf (ch, "Your %s is already at its limit.#n\n\r", pOutput); return; } for (train_loop = 0; train_loop < amount; train_loop++) { xp_cost = (temp + 1) * 3000000; if (FAIL) continue; if (ch->exp < xp_cost) { combo_var = xp_cost - ch->exp; FAIL = TRUE; stcprintf (ch, "You need another#g %d experience to increase your %s from %s to %s.#n\n\r", combo_var, pOutput, age_buf[temp], age_buf[(temp + 1)]); } if (!FAIL) { trained_amount++; ch->exp -= xp_cost; ch->pcdata->dragonage += 1; CHAR_DIRTY = TRUE; } } if ((FAIL) && (trained_amount > 0)) stcf (ch, "You increased your %s only %d of the %d age bands you requested.#n\n\r", pOutput, trained_amount, amount); else if ((FAIL) && (trained_amount == 0)) stcf (ch, "You were unable to increase your %s.#n\n\r", pOutput); else stcf (ch, "You increased your %s by %d age bands.#n\n\r", pOutput, trained_amount); if (ch->pcdata->dragonage > 12) ch->pcdata->dragonage = 12; stcprintf (ch, "You are now a %s.#n\n\r", age_buf[ch->pcdata->dragonage]); if (CHAR_DIRTY) save_char_obj (ch); return; } // Finished with checking for DRAGON_TRAIN, let's do MFOCUS_TRAIN next. if (!str_cmp (arg1, "focus") && (IS_CLASS (ch, CLASS_MONK))) { pAbility = &ch->focus[MAXIMUM]; pOutput = "mental focus"; MFOCUS_TRAIN = TRUE; } else { // Worry about something else here-after, focus didn't change. MFOCUS_TRAIN = FALSE; } // after checking stats either train and quit or continue checking if (MFOCUS_TRAIN) { bool FAIL = FALSE; trained_amount = 0; if ((*pAbility + amount) > 100) amount = 100 - *pAbility; if (amount <= 0) { stcf (ch, "Your %s is already at its peak.#n\n\r", pOutput); return; } for (train_loop = 0; train_loop < amount; train_loop++) { xp_cost = (*pAbility + 1) * 50000; if (FAIL) continue; if (ch->exp < xp_cost) { combo_var = xp_cost - ch->exp; FAIL = TRUE; stcf (ch, "You need another#g %d experience to increase %s from %d to %d.#n\n\r", combo_var, pOutput, *pAbility, (*pAbility + 1)); } if (!FAIL) { trained_amount++; ch->exp -= xp_cost; *pAbility += 1; ch->focus[CURRENT]++; // Associated Ability CHAR_DIRTY = TRUE; } } if ((FAIL) && (trained_amount > 0)) stcf (ch, "You increased your %s only %d of the %d times you requested.#n\n\r", pOutput, trained_amount, amount); else if ((FAIL) && (trained_amount == 0)) stcf (ch, "You were unable to increase your %s at all.#n\n\r", pOutput); else stcf (ch, "You increased your %s by %d points.#n\n\r", pOutput, trained_amount); if (CHAR_DIRTY) save_char_obj (ch); return; } // Finished with checking for MFOCUS_TRAIN, let's do HQUICK_TRAIN next. if (!str_cmp (arg1, "quickening") && (IS_CLASS (ch, CLASS_HIGHLANDER))) { pAbility = &ch->quickening[1]; pOutput = "quickening"; HQUICK_TRAIN = TRUE; } else { // Worry about something else here-after, focus didn't change. HQUICK_TRAIN = FALSE; } // after checking stats either train and quit or continue checking if (HQUICK_TRAIN) { bool FAIL = FALSE; int work_amt; trained_amount = 0; if ((*pAbility + amount) > 50) amount = 50 - *pAbility; if (ch->quickening[1] > 49) { stc ("Go kill an avatar or something it'll be cheaper.#n\n\r", ch); return; } if (!IS_DEMPOWER (ch, HPOWER_EMPOWER)) { stc ("You don't know how to improve your quickening without killing.#n\n\r", ch); return; } if (amount <= 0) { stcf (ch, "Your %s is already at its peak.#n\n\r", pOutput); return; } for (train_loop = 0; train_loop < amount; train_loop++) { work_amt = (((*pAbility + 1) * ((*pAbility + 1) + 1)) / 2); if (work_amt == 0) work_amt = 1; xp_cost = work_amt * 100000; qp_cost = work_amt * 50; if (FAIL) continue; if (ch->exp < xp_cost) { combo_var = xp_cost - ch->exp; FAIL = TRUE; stcf (ch, "You need another#g %d experience to increase %s from %d to %d.#n\n\r", combo_var, pOutput, *pAbility, (*pAbility + 1)); } if (ch->pcdata->quest < qp_cost) { combo_var = qp_cost - ch->pcdata->quest; FAIL = TRUE; stcf (ch, "You need another %d quest points to increase %s from %d to %d.#n\n\r", combo_var, pOutput, *pAbility, (*pAbility + 1)); } if (!FAIL) { trained_amount++; ch->exp -= xp_cost; ch->pcdata->quest -= qp_cost; *pAbility += 1; CHAR_DIRTY = TRUE; } } if ((FAIL) && (trained_amount > 0)) stcf (ch, "You improved your maximum level of %s only %d of the %d times you requested.#n\n\r", pOutput, trained_amount, amount); else if ((FAIL) && (trained_amount == 0)) stcf (ch, "You were unable to improve your maximum level of %s at all.#n\n\r", pOutput); else stcf (ch, "You improve your maximum level of %s by %d points.#n\n\r", pOutput, trained_amount); if (CHAR_DIRTY) save_char_obj (ch); return; } // Finished with checking for HQUICK_TRAIN, let's do IMMUNE_TRAIN next. if (!str_cmp (arg1, "slash")) { pOutput = "resistance to slashing weapons"; IMMUNE_TRAIN = TRUE; } else if (!str_cmp (arg1, "stab")) { pOutput = "resistance to stabbing weapons"; IMMUNE_TRAIN = TRUE; } else if (!str_cmp (arg1, "smash")) { pOutput = "resistance to smashing weapons"; IMMUNE_TRAIN = TRUE; } else if (!str_cmp (arg1, "beast")) { pOutput = "resistance to beastial weapons"; IMMUNE_TRAIN = TRUE; } else if (!str_cmp (arg1, "bind")) { pOutput = "resistance to binding weapons"; IMMUNE_TRAIN = TRUE; } else if (!str_cmp (arg1, "fire")) { pOutput = "resistance to fire magic"; IMMUNE_TRAIN = TRUE; } else if (!str_cmp (arg1, "water")) { pOutput = "resistance to water magic"; IMMUNE_TRAIN = TRUE; } else if (!str_cmp (arg1, "wind")) { pOutput = "resistance to wind magic"; IMMUNE_TRAIN = TRUE; } else if (!str_cmp (arg1, "earth")) { pOutput = "resistance to earth magic"; IMMUNE_TRAIN = TRUE; } else if (!str_cmp (arg1, "dark")) { pOutput = "resistance to dark magic"; IMMUNE_TRAIN = TRUE; } else if (!str_cmp (arg1, "control")) { pOutput = "resistance to controlling magics"; IMMUNE_TRAIN = TRUE; } else if (!str_cmp (arg1, "enchant")) { pOutput = "resistance to enchantment spells"; IMMUNE_TRAIN = TRUE; } else if (!str_cmp (arg1, "voodoo")) { pOutput = "resistance to voodoo abilities"; IMMUNE_TRAIN = TRUE; } else if (!str_cmp (arg1, "hurl")) { pOutput = "resistance to hurling attacks"; IMMUNE_TRAIN = TRUE; } else if (!str_cmp (arg1, "backstab")) { pOutput = "resistance to backstab attacks"; IMMUNE_TRAIN = TRUE; } else if (!str_cmp (arg1, "physical")) { pOutput = "resistance to some physical attacks"; IMMUNE_TRAIN = TRUE; } else if (!str_cmp (arg1, "disarm")) { pOutput = "better understanding of your weapon"; IMMUNE_TRAIN = TRUE; } else if (!str_cmp (arg1, "steal")) { pOutput = "higher awareness of those around you"; IMMUNE_TRAIN = TRUE; } else { // Worry about something else here-after, Immunities didn't change. IMMUNE_TRAIN = FALSE; } // after checking stats either train and quit or continue checking if (IMMUNE_TRAIN) { bool FAIL = FALSE; int train_which = 0; int amt_req_1 = 0; int amt_req_2 = 0; int amt_req_3 = 0; char *name_req_1=NULL; char *name_req_2=NULL; char *name_req_3=NULL; sh_int *loc_req_1=0; sh_int *loc_req_2=0; sh_int *loc_req_3=0; bool USE_AMT_1 = FALSE; bool USE_AMT_2 = FALSE; bool USE_AMT_3 = FALSE; trained_amount = 0; pAbility = &ch->immune; if (amount > 1) amount = 1; if (!str_cmp (arg1, "slash")) { train_which = IMM_SLASH; name_req_1 = "skill with slicing weapons"; name_req_2 = "skill with slashing weapons"; amt_req_1 = 175; loc_req_1 = &ch->wpn[1]; USE_AMT_1 = TRUE; amt_req_2 = 175; loc_req_2 = &ch->wpn[3]; USE_AMT_2 = TRUE; } else if (!str_cmp (arg1, "stab")) { train_which = IMM_STAB; name_req_1 = "skill with stabbing weapons"; name_req_2 = "skill with piercing weapons"; amt_req_1 = 175; loc_req_1 = &ch->wpn[2]; USE_AMT_1 = TRUE; amt_req_2 = 175; loc_req_2 = &ch->wpn[11]; USE_AMT_2 = TRUE; } else if (!str_cmp (arg1, "smash")) { train_which = IMM_SMASH; name_req_1 = "skill with blasting weapons"; name_req_2 = "skill with pounding weapons"; name_req_3 = "skill with crushing weapons"; amt_req_1 = 175; loc_req_1 = &ch->wpn[6]; USE_AMT_1 = TRUE; amt_req_2 = 175; loc_req_2 = &ch->wpn[7]; USE_AMT_2 = TRUE; amt_req_3 = 175; loc_req_3 = &ch->wpn[8]; USE_AMT_3 = TRUE; } else if (!str_cmp (arg1, "beast")) { train_which = IMM_ANIMAL; name_req_1 = "skill with claws"; name_req_2 = "skill with fangs"; amt_req_1 = 175; loc_req_1 = &ch->wpn[5]; USE_AMT_1 = TRUE; amt_req_2 = 175; loc_req_2 = &ch->wpn[10]; USE_AMT_2 = TRUE; } else if (!str_cmp (arg1, "bind")) { train_which = IMM_MISC; name_req_1 = "skill with whipping weapons"; name_req_2 = "skill with grepping weapons"; name_req_3 = "skill with sucking weapons"; amt_req_1 = 175; loc_req_1 = &ch->wpn[4]; USE_AMT_1 = TRUE; amt_req_2 = 175; loc_req_2 = &ch->wpn[9]; USE_AMT_2 = TRUE; amt_req_3 = 175; loc_req_3 = &ch->wpn[12]; USE_AMT_3 = TRUE; } else if (!str_cmp (arg1, "fire")) { train_which = IMM_HEAT; name_req_1 = "skill with red magic"; amt_req_1 = 175; loc_req_1 = &ch->spl[1]; USE_AMT_1 = TRUE; } else if (!str_cmp (arg1, "water")) { train_which = IMM_COLD; name_req_1 = "skill with blue magic"; amt_req_1 = 175; loc_req_1 = &ch->spl[2]; USE_AMT_1 = TRUE; } else if (!str_cmp (arg1, "wind")) { train_which = IMM_LIGHTNING; name_req_1 = "skill with yellow magic"; amt_req_1 = 175; loc_req_1 = &ch->spl[4]; USE_AMT_1 = TRUE; } else if (!str_cmp (arg1, "earth")) { train_which = IMM_ACID; name_req_1 = "skill with green magic"; amt_req_1 = 175; loc_req_1 = &ch->spl[3]; USE_AMT_1 = TRUE; } else if (!str_cmp (arg1, "dark")) { train_which = IMM_DRAIN; name_req_1 = "skill with purple magic"; amt_req_1 = 175; loc_req_1 = &ch->spl[0]; USE_AMT_1 = TRUE; } else if (!str_cmp (arg1, "control")) { train_which = IMM_CHARM; name_req_1 = "skill with blue magic"; name_req_2 = "wisdom"; amt_req_1 = 200; loc_req_1 = &ch->spl[2]; USE_AMT_1 = TRUE; amt_req_2 = 20; loc_req_2 = &ch->pcdata->perm_wis; USE_AMT_2 = TRUE; } else if (!str_cmp (arg1, "enchant")) { train_which = IMM_SLEEP; name_req_1 = "skill with green magic"; name_req_2 = "skill with yellow magic"; amt_req_1 = 200; loc_req_1 = &ch->spl[3]; USE_AMT_1 = TRUE; amt_req_2 = 200; loc_req_2 = &ch->spl[4]; USE_AMT_2 = TRUE; } else if (!str_cmp (arg1, "voodoo")) { train_which = IMM_VOODOO; name_req_1 = "skill with purple magic"; name_req_2 = "skill with red magic"; amt_req_1 = 200; loc_req_1 = &ch->spl[0]; USE_AMT_1 = TRUE; amt_req_2 = 200; loc_req_2 = &ch->spl[1]; USE_AMT_2 = TRUE; } //changed the 15k req to 5k else if (!str_cmp (arg1, "hurl")) { train_which = IMM_HURL; name_req_1 = "stamina"; name_req_2 = "strength"; amt_req_1 = 5000; loc_req_1 = &ch->max_hit; USE_AMT_1 = TRUE; amt_req_2 = 20; loc_req_2 = &ch->pcdata->perm_str; USE_AMT_2 = TRUE; } else if (!str_cmp (arg1, "backstab")) { train_which = IMM_BACKSTAB; name_req_1 = "vitality"; name_req_2 = "dexterity"; amt_req_1 = 5000; loc_req_1 = &ch->max_move; USE_AMT_1 = TRUE; amt_req_2 = 20; loc_req_2 = &ch->pcdata->perm_dex; USE_AMT_2 = TRUE; } else if (!str_cmp (arg1, "physical")) { train_which = IMM_KICK; name_req_1 = "stamina"; name_req_2 = "constitution"; name_req_3 = "strength"; amt_req_1 = 5000; loc_req_1 = &ch->max_hit; USE_AMT_1 = TRUE; amt_req_2 = 20; loc_req_2 = &ch->pcdata->perm_con; USE_AMT_2 = TRUE; amt_req_3 = 20; loc_req_3 = &ch->pcdata->perm_str; USE_AMT_3 = TRUE; } else if (!str_cmp (arg1, "disarm")) { train_which = IMM_DISARM; name_req_1 = "vitality"; name_req_2 = "dexterity"; name_req_3 = "strength"; amt_req_1 = 5000; loc_req_1 = &ch->max_move; USE_AMT_1 = TRUE; amt_req_2 = 20; loc_req_2 = &ch->pcdata->perm_dex; USE_AMT_2 = TRUE; amt_req_3 = 20; loc_req_3 = &ch->pcdata->perm_str; USE_AMT_3 = TRUE; } else if (!str_cmp (arg1, "steal")) { train_which = IMM_STEAL; name_req_1 = "wisdom"; name_req_2 = "intelligence"; name_req_3 = "dexterity"; amt_req_1 = 20; loc_req_1 = &ch->pcdata->perm_wis; USE_AMT_1 = TRUE; amt_req_2 = 20; loc_req_2 = &ch->pcdata->perm_int; USE_AMT_2 = TRUE; amt_req_3 = 20; loc_req_3 = &ch->pcdata->perm_dex; USE_AMT_3 = TRUE; } if (IS_SET (*pAbility, train_which)) { stcf (ch, "Your already have a %s.#n\n\r", pOutput); return; } for (train_loop = 0; train_loop < amount; train_loop++) { immcost = count_imms (ch); xp_cost = (immcost + 1) * 25000; qp_cost = (immcost + 1) * 25; if (FAIL) continue; if (ch->exp < xp_cost) { combo_var = xp_cost - ch->exp; FAIL = TRUE; stcf (ch, "You need another#g %d experience to gain a %s.#n\n\r", combo_var, pOutput); } /* if ( ch->pcdata->quest < qp_cost ) { combo_var = qp_cost - ch->pcdata->quest; FAIL = TRUE; stcf( ch, "You need another#g %d quest points to gain a %s.#n\n\r", combo_var, pOutput ); } */ if (USE_AMT_1) { if (*loc_req_1 < amt_req_1) { FAIL = TRUE; stcf (ch, "You need another %d %s to gain a %s.#n\n\r", (amt_req_1 - *loc_req_1), name_req_1, pOutput); } } if (USE_AMT_2) { if (*loc_req_2 < amt_req_2) { FAIL = TRUE; stcf (ch, "You need another %d %s to gain a %s.#n\n\r", (amt_req_2 - *loc_req_2), name_req_2, pOutput); } } if (USE_AMT_3) { if (*loc_req_3 < amt_req_3) { FAIL = TRUE; stcf (ch, "You need another %d %s to gain a %s.#n\n\r", (amt_req_3 - *loc_req_3), name_req_3, pOutput); } } if (!FAIL) { trained_amount++; ch->exp -= xp_cost; // ch->pcdata->quest -= qp_cost; SET_BIT (ch->immune, train_which); CHAR_DIRTY = TRUE; } } if ((FAIL) && (trained_amount > 0)) stcf (ch, "You gained a %s.#n\n\r", pOutput); else if ((FAIL) && (trained_amount == 0)) stcf (ch, "You were unable to to gain a %s.#n\n\r", pOutput); else stcf (ch, "You gained a %s.#n\n\r", pOutput); if (CHAR_DIRTY) save_char_obj (ch); return; } // Finished with checking for IMMUNE_TRAIN, nothing left to do really. if ((VITALS_TRAIN) || (HPMPMV_TRAIN) || (PRIMAL_TRAIN) || (STATUS_TRAIN) || (AVATAR_TRAIN) || (MORTAL_TRAIN) || (AMAGIC_TRAIN) || (SILVER_TRAIN) || (GNOSIS_TRAIN) || (VAMPYR_TRAIN) || (DRAGON_TRAIN) || (MFOCUS_TRAIN) || (HQUICK_TRAIN) || (IMMUNE_TRAIN)) { stc ("Finished training. Should have already exited. Please report to Serenity what you trained to see this message.#n\n\r", ch); return; } do_train (ch, ""); // If we got here do this just to show the syntax. return; }