#include <sys/types.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include "emlen.h" #define CTRL_R "" char update_char[400]; void do_afk (CHAR_DATA * ch, char *argy) { DEFINE_COMMAND ("afk", do_afk, POSITION_DEAD, 0, LOG_NORMAL, "This command logs you as away from the keyboard.") send_to_char ("You have been flagged as AFK. Typing any input will turn this off.\n\r", ch); send_to_char ("If you are away for too long, your character *will* autosave and autoquit.\n\r", ch); ch->timer = 50; return; } void info_remort (CHAR_DATA * ch, char * argy) { send_to_char("This command does not actually remort your character.\n\r", ch); send_to_char("It checks to see if you have the requirements for remorting.\n\r", ch); send_to_char("Type remort requirements to see the requrements for remorting.\n\r", ch); send_to_char("Type REMORT REMORT to actually remort your character.\n\r", ch); } void show_remort_requirements(CHAR_DATA * ch, char *argy) { char buf[500]; int remort = 0; for (remort = 0; remort < pow.max_remorts; ++remort) { if((remort == ch->pcdata->remort_times)) sprintf(buf,"-->"); else sprintf(buf, " "); send_to_char(buf, ch); //Non Ascended Remort Requirements if (ch->pcdata->race < 9) sprintf(buf, "Remort: %2d, Lvl: %2d, Wps Req/Lost: %5d/%5d, Kps Req/Lost: %5d/%5d\n\r", (remort+1), pow.remort_req[remort][0], pow.remort_req[remort][1], pow.remort_req[remort][2],pow.remort_req[remort][3], pow.remort_req[remort][4]); //Ascended Remort Requirements if (ch->pcdata->race > 8) sprintf(buf, "Remort: %2d, Lvl: %2d, Wps Req/Lost: %5d/%5d, Kps Req/Lost: %5d/%5d\n\r", (remort+1), pow.ascended_remort_req[remort][0], pow.ascended_remort_req[remort][1], pow.ascended_remort_req[remort][2], pow.ascended_remort_req[remort][3], pow.ascended_remort_req[remort][4]); send_to_char(buf, ch); if ((remort == ch->pcdata->remort_times)) { sprintf(buf, "-->You are level %d, you have %ld warpoints, and have %d killpoints.\n\r", LEVEL(ch), ch->pcdata->warpoints, ch->pcdata->killpoints); send_to_char(buf, ch); } } if (ch->pcdata->remort_times >= pow.max_remorts) send_to_char("You have the maximum number of remorts.\n\r", ch); return; } void do_raceinfo (CHAR_DATA *ch, char *argy) { char buf[SML_LENGTH]; int iRace; int i; SPELL_DATA *spl; DEFINE_COMMAND("raceinfo", do_raceinfo, POSITION_DEAD, 0, LOG_NORMAL, "This command lists the basic information about the races in the game.") if (!str_cmp(argy, "all") || argy[0] == '\0' || argy == "" || argy == "" || argy[0] == '\0' || !str_cmp(argy, "blank") || !str_cmp(argy, "remort") || !str_cmp(argy, "ascend") || !str_cmp(argy, "evolve")) { send_to_char(" Name St In Wi De Co Sk/Sp Rgn H/M Ac Specials\n\r", ch); for(iRace = 0; iRace < RACE_COUNT; iRace++) { if ((str_cmp(race_info[iRace].name, "Blank") && ( ((race_info[iRace].remort_race == 0) && str_cmp(argy,"ascend") && str_cmp(argy,"evolve")) || ((race_info[iRace].remort_race == 1) && !str_cmp(argy, "evolve")) || ((race_info[iRace].remort_race == 2) && !str_cmp(argy, "ascend"))) ) ) { bool before = FALSE; sprintf(buf,"[%2d]\x1b[1;37m %12s: \x1b[1;37m%2d %2d %2d %2d %2d\x1b[0;37m \x1b[1;31m %2d/%-2d/%-2d\x1b[1;34m%3d %3d\x1b[1;37m %3d ",(iRace+1),race_info[iRace].name ,race_info[iRace].limits[0], race_info[iRace].limits[1], race_info[iRace].limits[2], race_info[iRace].limits[3], race_info[iRace].limits[4], race_info[iRace].max_skills, race_info[iRace].max_spells, race_info[iRace].max_profs, race_info[iRace].regen_hit_percent, race_info[iRace].regen_move_percent, race_info[iRace].natarmor); send_to_char(buf, ch); if (race_info[iRace].affect_bits != 0) { before = TRUE; sprintf(buf, "%s", natural_abilities (race_info[iRace].affect_bits)); send_to_char(buf, ch); } if (race_info[iRace].affect_bits2 != 0) { if (before == TRUE) send_to_char(",", ch); before = TRUE; sprintf(buf, "%s", natural_abilities2 (race_info[iRace].affect_bits2)); send_to_char(buf, ch); } if (race_info[iRace].nat_augments != 0) { if (before == TRUE) send_to_char(",", ch); before = TRUE; sprintf(buf, "%s", augmentss (race_info[iRace].nat_augments)); send_to_char(buf, ch); } send_to_char("\x1b[0;37m\n\r", ch); } } return; } for (iRace = 0; iRace < RACE_COUNT; iRace++) { if (!str_cmp(argy, race_info[iRace].name) && str_cmp(argy, "blank")) break; } if (is_number(argy)) iRace = atoi(argy)-1; if (iRace >= -1 && iRace < (RACE_COUNT) && str_cmp(race_info[iRace].name,"blank")) { do_help (ch, (char *) race_info[iRace].name); send_to_char ("--------------------------------------------------------------------------\n\r", ch); sprintf (buf, "People of this race usually range in height from %d'%d\" to %d' %d\".\n\r", race_info[iRace].height_min / 12, race_info[iRace].height_min % 12, race_info[iRace].height_max / 12, race_info[iRace].height_max % 12); send_to_char(buf, ch); sprintf (buf, "Max Skills: \x1B[1;32m%d\x1B[0;37m. Max Spells:\x1B[1;32m%d\x1B[0;37m. Max Profs:\x1B[1;32m%d\x1B[0;37m.\n\r", race_info[iRace].max_skills, race_info[iRace].max_spells, race_info[iRace].max_profs); send_to_char(buf, ch); if (pow.show_race_select_info || ch->pcdata->level > 0) { sprintf (buf, "Natural Armor Bonus:\x1B[1;34m%d\x1B[0;37m.\n\rStat limits: \x1B[1;35mS: %d D: %d C: %d I: %d W: %d\x1B[0;37m.\n\r", (100 - race_info[iRace].natarmor), race_info[iRace].limits[0], race_info[iRace].limits[3], race_info[iRace].limits[4], race_info[iRace].limits[1], race_info[iRace].limits[2]); send_to_char(buf, ch); sprintf (buf, "Natural abilities: \x1B[1;36m%s\x1B[0;37m.\n\r", natural_abilities (race_info[iRace].affect_bits)); send_to_char(buf, ch); sprintf (buf, "Natural abilities2: \x1B[1;36m%s\x1B[0;37m.\n\r", natural_abilities2 (race_info[iRace].affect_bits2)); send_to_char(buf, ch); sprintf (buf, "Natural Enhancements: \x1B[1;36m%s\x1B[0;37m.\n\r", augmentss (race_info[iRace].nat_augments)); send_to_char(buf, ch); if (race_info[iRace].regen_hit_percent != 100) { sprintf (buf, "Hitpoint regeneration is \x1B[1;37m%d\x1B[0;37m percent of normal.\n\r", race_info[iRace].regen_hit_percent); send_to_char(buf, ch); } if (race_info[iRace].regen_move_percent != 100) { sprintf (buf, "Movement regeneration is \x1B[1;37m%d\x1B[0;37m percent of normal.\n\r", race_info[iRace].regen_move_percent); send_to_char(buf, ch); } if (race_info[iRace].attack_spell_percent != 100) { sprintf (buf, "This race casts attack spells at \x1B[1;37m%d\x1B[0;37m percent of normal power.\n\r", race_info[iRace].attack_spell_percent); send_to_char(buf, ch); } if (race_info[iRace].combat_damage_bonus != 0) { sprintf (buf, "This race has a natural attack power %s of \x1B[1;37m%d\x1B[0;37m.\n\r", (race_info[iRace].combat_damage_bonus > 0 ? "bonus" : "penalty"), race_info[iRace].combat_damage_bonus); send_to_char(buf, ch); } if (race_info[iRace].backstab_percent != 100) { sprintf (buf, "This race backstabs at \x1B[1;37m%d\x1B[0;37m percent of normal.\n\r", race_info[iRace].backstab_percent); send_to_char(buf, ch); } if (race_info[iRace].heal_percent != 100) { sprintf (buf, "This race casts healing spells at \x1B[1;37m%d\x1B[0;37m percent of normal power.\n\r", race_info[iRace].heal_percent); send_to_char(buf, ch); } if (race_info[iRace].hps_bonus != 0) { sprintf (buf, "This race %s a %s \x1B[1;37m%d\x1B[0;37m hit points gained per level.\n\r", (race_info[iRace].hps_bonus > 0 ? "gains" : "has"), (race_info[iRace].hps_bonus > 0 ? "bonus" : "penalty"), (race_info[iRace].hps_bonus)); send_to_char(buf, ch); } if (race_info[iRace].mana_percent != 100) { sprintf (buf, "This race stores \x1B[1;37m%d\x1B[0;37m percent of the normal amount of mana.\n\r", race_info[iRace].mana_percent); send_to_char(buf, ch); } for (i = 0; i < 3; i ++) { if (race_info[iRace].nat_skills[i] > 0) { if ((spl = skill_lookup (NULL,race_info[iRace].nat_skills[i])) != NULL) { sprintf(buf, "This race can use %s naturally.\n\r", spl->spell_funky_name); send_to_char(buf, ch); } } } } send_to_char ("--------------------------------------------------------------------------\n\r", ch); } else { send_to_char("raceinfo or raceinfo <racename> or raceinfo <race_number>.\n\r", ch); } return; } void do_alignmentinfo (CHAR_DATA *ch, char *argy) { char buf[SML_LENGTH]; int Align, i; SPELL_DATA *spl; DEFINE_COMMAND("aligninfo", do_alignmentinfo, POSITION_DEAD, 0, LOG_NORMAL, "This command lists the basic information about the alignments in the game.") if (!str_cmp(argy, "all") || argy[0] == '\0' || argy == "" || argy == "" || argy[0] == '\0' || !str_cmp(argy, "blank")) { send_to_char(" Bonuses to all of the following above and beyond racial bonuses:\n\r", ch); send_to_char(" Name St In Wi De Co Sk/Sp/Pr Rgn H/M Ac Specials\n\r", ch); for(Align = 0; Align < NUM_ALIGN; Align++) { if (str_cmp(race_info[Align].name, "Blank")) { bool before = FALSE; sprintf(buf,"[%2d]\x1b[1;37m%12s: \x1b[1;37m%2d %2d %2d %2d %2d\x1b[0;37m \x1b[1;31m %2d/%1d/%-2d\x1b[1;34m%3d %3d\x1b[1;37m %3d ",(Align),align_info[Align].name ,align_info[Align].bonus[0], align_info[Align].bonus[1], align_info[Align].bonus[2], align_info[Align].bonus[3], align_info[Align].bonus[4], align_info[Align].max_skills, align_info[Align].max_spells, align_info[Align].max_profs, align_info[Align].regen_hit_percent, align_info[Align].regen_move_percent, align_info[Align].natarmor); send_to_char(buf, ch); if (align_info[Align].affect_bits != 0) { before = TRUE; sprintf(buf, "%s", natural_abilities (align_info[Align].affect_bits)); send_to_char(buf, ch); } if (align_info[Align].affect_bits2 != 0) { if (before == TRUE) send_to_char(",", ch); before = TRUE; sprintf(buf, "%s", natural_abilities2 (align_info[Align].affect_bits2)); send_to_char(buf, ch); } if (align_info[Align].nat_augments != 0) { if (before == TRUE) send_to_char(",", ch); before = TRUE; sprintf(buf, "%s", augmentss (align_info[Align].nat_augments)); send_to_char(buf, ch); } send_to_char("\x1b[0;37m\n\r", ch); } } return; } for (Align = 0; Align < NUM_ALIGN; Align++) { if (!str_cmp(argy, align_info[Align].name) && str_cmp(argy, "blank")) break; } if (is_number(argy)) Align = atoi(argy); if (Align >= 0 && Align < (NUM_ALIGN) && str_cmp(align_info[Align].name,"blank")) { do_help (ch, (char *) align_info[Align].name); send_to_char ("--------------------------------------------------------------------------\n\r", ch); sprintf (buf, "Skill %s: \x1B[1;32m%d\x1B[0;37m. Spell %s:\x1B[1;32m%d\x1B[0;37m. Profs %s:\x1B[1;32m%d\x1B[0;37m. \n\r", (align_info[Align].max_skills > 0 ? "Bonus" : "Penalty"),align_info[Align].max_skills, (align_info[Align].max_spells > 0 ? "Bonus" : "Penalty"),align_info[Align].max_spells, (align_info[Align].max_profs > 0 ? "Bonus" : "Penalty"),align_info[Align].max_profs); send_to_char(buf, ch); sprintf (buf, "Natural Armor Bonus:\x1B[1;34m%d\x1B[0;37m.\n\rStat Limit Modifiers: \x1B[1;35mS: %d D: %d C: %d I: %d W: %d\x1B[0;37m.\n\r", (align_info[Align].natarmor), align_info[Align].limits[0], align_info[Align].limits[3], align_info[Align].limits[4], align_info[Align].limits[1], align_info[Align].limits[2]); send_to_char(buf, ch); sprintf (buf, "Natural abilities: \x1B[1;36m%s\x1B[0;37m.\n\r", natural_abilities (align_info[Align].affect_bits)); send_to_char(buf, ch); sprintf (buf, "Natural abilities2: \x1B[1;36m%s\x1B[0;37m.\n\r", natural_abilities2 (align_info[Align].affect_bits2)); send_to_char(buf, ch); sprintf (buf, "Natural Enhancements: \x1B[1;36m%s\x1B[0;37m.\n\r", augmentss (align_info[Align].nat_augments)); send_to_char(buf, ch); if (align_info[Align].regen_hit_percent != 0) { sprintf (buf, "Hitpoint regeneration %s is \x1B[1;37m%d\x1B[0;37m percent from normal.\n\r", (align_info[Align].regen_hit_percent > 0 ? "bonus" : "penalty"), align_info[Align].regen_hit_percent); send_to_char(buf, ch); } if (align_info[Align].regen_move_percent != 0) { sprintf (buf, "Movement regeneration %s is \x1B[1;37m%d\x1B[0;37m percent from normal.\n\r", (align_info[Align].regen_move_percent > 0 ? "bonus" : "penalty"),align_info[Align].regen_move_percent); send_to_char(buf, ch); } if (align_info[Align].attack_spell_percent != 00) { sprintf (buf, "Attack spell %s is \x1B[1;37m%d\x1B[0;37m from normal.\n\r", (align_info[Align].attack_spell_percent > 0 ? "bonus" : "penalty"),align_info[Align].attack_spell_percent); send_to_char(buf, ch); } if (align_info[Align].combat_damage_bonus != 0) { sprintf (buf, "This alignment has a natural attack power %s of \x1B[1;37m%d\x1B[0;37m from normal.\n\r", (align_info[Align].combat_damage_bonus > 0 ? "bonus" : "penalty"), align_info[Align].combat_damage_bonus); send_to_char(buf, ch); } if (align_info[Align].backstab_percent != 0) { sprintf (buf, "Backstab %s of \x1B[1;37m%d\x1B[0;37m from normal.\n\r", (align_info[Align].backstab_percent > 0 ? "bonus" : "penalty"), align_info[Align].backstab_percent); send_to_char(buf, ch); } if (align_info[Align].heal_percent != 0) { sprintf (buf, "Healing spell %s is \x1B[1;37m%d\x1B[0;37m percent from normal.\n\r", (align_info[Align].heal_percent > 0 ? "bonus" : "penalty"),align_info[Align].heal_percent); send_to_char(buf, ch); } if (align_info[Align].hps_bonus != 0) { sprintf (buf, "This race %s a %s \x1B[1;37m%d\x1B[0;37m hit points gained per level.\n\r", (align_info[Align].hps_bonus > 0 ? "gains" : "has"), (align_info[Align].hps_bonus > 0 ? "bonus" : "penalty"), (align_info[Align].hps_bonus)); send_to_char(buf, ch); } if (align_info[Align].mana_percent != 0) { sprintf (buf, "This race stores \x1B[1;37m%d\x1B[0;37m percent %s mana than normal.\n\r", align_info[Align].mana_percent, (align_info[Align].mana_percent > 0 ? "more" : "less")); send_to_char(buf, ch); } for (i = 0; i < 3; i ++) { if (align_info[Align].nat_skills[i] > 0) { if ((spl = skill_lookup (NULL,align_info[Align].nat_skills[i])) != NULL) { sprintf(buf, "This alignment can use %s naturally.\n\r", spl->spell_funky_name); send_to_char(buf, ch); } } } send_to_char ("--------------------------------------------------------------------------\n\r", ch); } else { send_to_char("aligninfo or aligninfo <alignname> or aligninfo <align_number>.\n\r", ch); } return; } void do_ascend (CHAR_DATA * ch, char * argy) { SINGLE_OBJECT *obj; SINGLE_OBJECT *next_obj; int k; char workstr[STD_LENGTH]; char buf4[SML_LENGTH]; DEFINE_COMMAND ("ascend", do_ascend, POSITION_DEAD, 0, LOG_NORMAL, "This command causes your character to assume a more powerful race") if (IS_MOB(ch)) return; if (ch->pcdata->race == 0) { send_to_char("Humans may never ascend!!\n\r", ch); return; } if (!str_cmp (argy, "cost")) { send_to_char ("Ascension Requirements:\n\r", ch); sprintf (buf4, "Lvl: %2d Remorts: %2d Wpts: %4d Ttl Wpts: %4d\n\r", pow.ascension_req[0], pow.ascension_req[1], pow.ascension_req[2], pow.ascension_req[3]); send_to_char (buf4, ch); return; } if (pow.ascension_req[4] > 0 && get_room_index(pow.ascension_req[4]) != NULL && ch->in_room->vnum != pow.ascension_req[4] ) { send_to_char ("You are not in the proper place to Ascend!\n\r", ch); return; } if (str_cmp (argy, "character")) { send_to_char ("You must type ascend character to ascend.\n\r", ch); return; } if (ch->position != POSITION_STANDING) { send_to_char ("You must be standing to ascend!\n\r", ch); return; } if (LEVEL(ch) < pow.ascension_req[0]) { sprintf (buf4, "You must be at least level %d in order to ascend.\n\r", pow.ascension_req[0]); send_to_char (buf4, ch); return; } if (ch->pcdata->remort_times < pow.ascension_req[1]) { sprintf (buf4, "You must have remorted at least %d times in order to ascend.\n\r", pow.ascension_req[1]); send_to_char (buf4, ch); return; } if (ch->pcdata->warpoints < pow.ascension_req[2]) { sprintf (buf4, "You must have at least %d current warpoints in order to ascend.\n\r", pow.ascension_req[2]); send_to_char (buf4, ch); return; } if (ch->pcdata->total_wps < pow.ascension_req[3]) { sprintf (buf4, "You must have accumulated at least %d total warpoints in order to ascend.\n\r", pow.ascension_req[3]); send_to_char (buf4, ch); return; } if (ch->pcdata->race > 16) { send_to_char ("You are unable to refine yourself any further through ascension.\n\r", ch); return; } //Do Actual Ascension here /*Begin transforming the character */ for (obj = ch->carrying; obj != NULL; obj = next_obj) { next_obj = obj->next_content; if (IS_SET (obj->pIndexData->extra_flags, ITEM_SAVE)) continue; if (pow.vaporize_inv && (obj->wear_loc == -1 || obj->contains != NULL)) { sprintf (workstr, "%s just vaporized!!\n\r", capitalize (obj->pIndexData->short_descr)); send_to_char (workstr, ch); free_it (obj); continue; } else if (obj->wear_loc != -1) unequip_char (ch, obj); if (pow.vaporize_all) { sprintf (workstr, "%s just vaporized!!\n\r", capitalize (obj->pIndexData->short_descr)); send_to_char (workstr, ch); free_it (obj); continue; } } send_to_char ("Your worn items were removed to inventory.\n\r", ch); ch->pcdata->level = 1; ch->exp = 1; check_fgt(ch); free_string(ch->fgt->phunting); ch->fgt->phunting = NULL; free_string(ch->fgt->hunting); ch->fgt->hunting = NULL; ch->pcdata->voting_on = 0; ch->pcdata->deaths =0; REMOVE_BIT(ch->act, PLR_PKED_THIS_MORT); ch->pcdata->practice = 10; ch->pcdata->learn = 2; //Reset All Important Character Data ch->pcdata->remort_times = 0; /* ch->pcdata->total_wps = 0; */ /* ch->pcdata->warpoints = 0; KEEP THIS FOR RECORDS */ ch->pcdata->guilds = 0; /* ch->pcdata->augments = 0; */ /* STRUCTURE fixed augs being removed */ ch->pcdata->totalkills = 0; ch->pcdata->killpoints = 0; ch->pcdata->pklevels = 0; ch->pcdata->pkhelpers = 0; ch->pcdata->hard_pkills = 0; ch->pcdata->pkills = 0; ch->pcdata->pkilled = 0; ch->pcdata->pkers = 0; ch->pcdata->ascend_times++; for (k = 0; k < MAX_TROPHY; k++) { ch->pcdata->trophy_name[k][0] = '\0'; ch->pcdata->trophy_times[k] = 0; ch->pcdata->trophy_level[k] = 0; } //Do A Global Echo to impress people! { CHAR_DATA *sch; sch = create_mobile(get_mob_index(1)); char_to_room(sch, get_room_index(2)); sprintf(buf4, "$B$5M$1y$N$1t$5hi$1c$Ba$B$5l $0power surges from the astral plane rushing towards the room of"); do_echo(sch, buf4); sprintf(buf4, "$B$0transformation!", NAME(ch)); do_echo(sch, buf4); sprintf(buf4, "$B$1%s $0utters a scream heard throughout the land!", NAME(ch)); do_echo(sch, buf4); //Send Message to Character send_to_char("Your body is wracked with pain as you undergo a metamorphosis.\n\r", ch); //Do Actual Race Change raceswitch(ch, ch->pcdata->race + 8); //Reset Stats to what they were rolled at for (k = 0; k < NUM_STATS;k ++) { ch->pcdata->stat[k] = ch->pcdata->start_stat[k]; } //Add stats depending on your race for ascending -MATUSE if (ch->pcdata->race == 9) { ch->pcdata->stat[2] += 2; ch->pcdata->stat[1] += 1; } else if (ch->pcdata->race == 10) { ch->pcdata->stat[2] += 1; ch->pcdata->stat[1] += 2; } else if (ch->pcdata->race == 11) { ch->pcdata->stat[0] += 1; ch->pcdata->stat[3] += 2; } else if (ch->pcdata->race == 12) { ch->pcdata->stat[4] += 1; ch->pcdata->stat[3] += 2; } else if (ch->pcdata->race == 13) { ch->pcdata->stat[0] += 1; ch->pcdata->stat[4] += 2; } else if (ch->pcdata->race == 14) { ch->pcdata->stat[4] += 1; ch->pcdata->stat[0] += 2; } else if (ch->pcdata->race == 15) { ch->pcdata->stat[0] += 1; ch->pcdata->stat[1] += 1; ch->pcdata->stat[4] += 1; } else if (ch->pcdata->race == 16) { ch->pcdata->stat[0] += 1; ch->pcdata->stat[2] += 1; ch->pcdata->stat[4] += 1; } else if (ch->pcdata->race == 17) { ch->pcdata->stat[2] += 4; ch->pcdata->stat[1] += 2; } else if (ch->pcdata->race == 18) { ch->pcdata->stat[2] += 2; ch->pcdata->stat[1] += 4; } else if (ch->pcdata->race == 19) { ch->pcdata->stat[3] += 4; ch->pcdata->stat[0] += 2; } else if (ch->pcdata->race == 20) { ch->pcdata->stat[3] += 4; ch->pcdata->stat[4] += 2; } else if (ch->pcdata->race == 21) { ch->pcdata->stat[0] += 4; ch->pcdata->stat[4] += 2; } else if (ch->pcdata->race == 22) { ch->pcdata->stat[4] += 4; ch->pcdata->stat[0] += 2; } else if (ch->pcdata->race == 23) { ch->pcdata->stat[0] += 2; ch->pcdata->stat[1] += 2; ch->pcdata->stat[4] += 2; } else if (ch->pcdata->race == 24) { ch->pcdata->stat[0] += 1; ch->pcdata->stat[2] += 1; ch->pcdata->stat[4] += 1; } set_initial_hp(ch); sprintf(buf4, "A pulse of power surges throughout the lands as a new %s rises!", race_info[ch->pcdata->race].name); do_echo(sch, buf4); //Do Global Ascension Message sprintf(buf4, "$B$1%s$B$0 has $B$4AsCeNdEd!$N", NAME(ch)); do_echo(sch, buf4); //Get rid of that sexy reboot mob! extract_char(sch, TRUE); } for (k = 0; k < SKILL_COUNT; k++) { ch->pcdata->learned[k] = -100; } natural_mana (ch); if (pow.beams_to_room > 0) { int to_room; if (pow.beams_to_room == 1) { to_room = (ALIGN(ch) + 100); } else to_room = pow.beams_to_room; char_from_room (ch); char_to_room (ch, get_room_index (to_room)); do_look (ch, "auto"); } send_to_char ("\x1B[1;37mMetamorphosis complete!!!\x1B[37;0m\n\r", ch); send_to_char ("You have purged yourself of your previous life and transcended.\n\r",ch); max_remort_times[ch->pcdata->alignment] = UMAX(max_remort_times[ch->pcdata->alignment], ch->pcdata->remort_times); fix_char(ch); do_save (ch, "xx2xx11"); return; } void do_forsake (CHAR_DATA * ch, char * argy) { char buf4[SML_LENGTH]; DEFINE_COMMAND ("forsake", do_forsake, POSITION_DEAD, 0, LOG_NORMAL, "This command allows one to forsake their alignment") if (IS_MOB(ch)) return; if(!str_cmp (argy, "cost")) { send_to_char ("Forsake Requirements:\n\r", ch); sprintf (buf4, "Lvl: %2d Remorts: %2d Wpts: %4d\n\r", pow.forsake_req[0], pow.forsake_req[1], pow.forsake_req[2]); send_to_char (buf4, ch); return; } if(str_cmp (argy, "alignment yes")) { send_to_char ("You must type forsake alignment yes to forsake your alignment.\n\r", ch); return; } if(ch->position != POSITION_STANDING) { send_to_char("You must be standing to forsake!\n\r", ch); return; } if (ch->pcdata->remort_times < pow.forsake_req[1]) { sprintf (buf4, "You must have remorted at least %d times in order to forsake.\n\r", pow.forsake_req[1]); send_to_char(buf4, ch); return; } if (LEVEL(ch) < pow.forsake_req[0]) { sprintf (buf4, "You must be at least level %d in order to forsake.\n\r", pow.forsake_req[0]); send_to_char (buf4, ch); return; } if (ch->pcdata->warpoints < pow.forsake_req[2]) { sprintf (buf4, "You must have at least %d current warpoints to forsake your alignment.\n\r", pow.forsake_req[2]); send_to_char (buf4, ch); return; } if (pow.forsake_req[4] > 0 && get_room_index(pow.forsake_req[4]) != NULL && ch->in_room->vnum != pow.forsake_req[4] ) { send_to_char("You are not in the proper place to forsake!\n\r", ch); return; } { CHAR_DATA *sch; sch = create_mobile(get_mob_index(1)); char_to_room(sch, get_room_index(2)); ch->pcdata->warpoints = ch->pcdata->warpoints - 100; send_to_char ("You abandon your alignment to the whims of fate.", ch); alignswitch(ch, 3); char_from_room(ch); char_to_room(ch, get_room_index(103)); sprintf(buf4, "$B$0A clap of $6thunder$0 echos throughout the land as"); do_echo(sch, buf4); sprintf(buf4, "$N$B%s $B$0has chosen to walk the path of the traitor and abandon his", NAME(ch)); do_echo(sch, buf4); sprintf(buf4, "$B$0alignment to the winds of fate.", NAME(ch)); do_echo(sch, buf4); sprintf(buf4, "$B$0Another soul joins the ranks of the forsaken!$N"); do_echo(sch, buf4); extract_char(sch, TRUE); } return; } void do_remort (CHAR_DATA * ch, char * argy) { char buf[SML_LENGTH]; int remort = 0; bool ready = TRUE; DEFINE_COMMAND ("remort", do_remort, POSITION_DEAD, 0, LOG_NORMAL, "This command transfers worthy players to the remort room where they can TRANSFORM.") if (IS_MOB(ch)) return; if(ch->position !=POSITION_STANDING) { send_to_char("You must be standing to remort!!!\n\r", ch); return; } if (argy == "" || argy == '\0' || !str_cmp(argy, "help")) { info_remort(ch, argy); return; } if (!str_cmp (argy, "requirements") || !str_cmp(argy, "cost") || !str_cmp(argy, "costs")) { if ((ch->pcdata->race > 10 && pow.asctransform_in_room > 0) || (ch->pcdata->race < 11 && pow.transform_in_room > 0)) { show_remort_requirements (ch, argy); return; } else { if (number_range(0,1) == 1) send_to_char ("Huh?\n\r", ch); else if (number_range(0,1) == 1) send_to_char ("What? (Type HELP for help)\n\r", ch); else send_to_char ("Unrecognized Command.\n\r", ch); return; } } if (str_cmp (argy, "remort")) { info_remort(ch, ""); return; } if (ch->pcdata->race < 11 && pow.remort_in_room[ch->pcdata->remort_times] > 0 && get_room_index(pow.remort_in_room[ch->pcdata->remort_times]) != NULL && ch->in_room->vnum != pow.remort_in_room[ch->pcdata->remort_times] ) { send_to_char("You are not in the proper place to remort!\n\r", ch); return; } if (ch->pcdata->race > 10 && pow.ascend_remort_in_room[ch->pcdata->remort_times] > 0 && get_room_index(pow.ascend_remort_in_room[ch->pcdata->remort_times]) != NULL && ch->in_room->vnum != pow.ascend_remort_in_room[ch->pcdata->remort_times] ) { send_to_char("You are not in the proper place to remort!\n\r", ch); return; } remort = ch->pcdata->remort_times; if ((ch->pcdata->race < 11 && (LEVEL(ch) < pow.remort_req[remort][0])) || (ch->pcdata->race > 10 && (LEVEL(ch) < pow.ascended_remort_req[remort][0]))) { send_to_char("You need to gain more levels before you can remort!\n\r", ch); ready = FALSE; } if ((ch->pcdata->race < 11 && (ch->pcdata->warpoints < pow.remort_req[remort][1])) || (ch->pcdata->race > 10 && (ch->pcdata->warpoints < pow.ascended_remort_req[remort][1]))) { send_to_char("You need to pkill more before we will allow you to remort!\n\r", ch); ready = FALSE; } if ((ch->pcdata->race < 11 && (ch->pcdata->killpoints < pow.remort_req[remort][3])) || (ch->pcdata->race > 10 && (ch->pcdata->killpoints < pow.ascended_remort_req[remort][3]))) { send_to_char("You need to kill more tough monsters before you can remort!\n\r", ch); ready = FALSE; } if (!ready) return; char_from_room(ch); if ((pow.transform_in_room > 0 && get_room_index(pow.transform_in_room) != NULL && ch->pcdata->race < 11) || (pow.asctransform_in_room > 0 && get_room_index(pow.asctransform_in_room) != NULL && ch->pcdata->race > 10)) char_to_room(ch, get_room_index(pow.transform_in_room)); { CHAR_DATA *sch; sch=create_mobile(get_mob_index(1)); char_to_room(sch,get_room_index(2)); sprintf(buf, "We, the immortals, decree that %s is fit to be reborn!\n\r", NAME(ch)); do_echo(sch, buf); extract_char(sch, TRUE); } if (ch->pcdata->race < 11) { ch->pcdata->warpoints -= pow.remort_req[remort][2]; ch->pcdata->killpoints -= pow.remort_req[remort][4]; } else { ch->pcdata->warpoints -= pow.ascended_remort_req[remort][2]; ch->pcdata->killpoints -= pow.ascended_remort_req[remort][4]; } } void do_choosesides (CHAR_DATA * ch, char *argy) { int num; char buf[200]; DEFINE_COMMAND ("choosesides", do_choosesides, POSITION_DEAD, 0, LOG_NORMAL, "This command is the one that lets newbies choose sides.") if (IS_MOB(ch)) return; if (pow.choose_in_room > 0 && (!ch->in_room || ch->in_room->vnum != pow.choose_in_room)) { send_to_char("You are not in the room of choosing.\n\r", ch); return; } if(IS_PLAYER(ch)) { if(LEVEL(ch) < 0 && ch->pcdata->remort_times == 0) { sprintf(buf, "You still need %d %s before you can choose an alignment.\n\r",40-LEVEL(ch),40-LEVEL(ch) == 1 ? "level" : "levels"); send_to_char(buf,ch); return; } } if (is_number(argy)) { num = atoi(argy); if (num > 0 && num < NUM_ALIGN && num != 3) { sprintf(buf, "\n\r\n\r\n\r\x1b[1;31m Ok, you choose side %d.\n\r\n\r\n\r", num); send_to_char(buf, ch); alignswitch(ch, num); char_from_room(ch); char_to_room(ch, get_room_index(100+num)); return; } } sprintf(buf, "Please type aligninfo and choose a number from 1 to %d.\n\r", (NUM_ALIGN-2)); send_to_char(buf, ch); return; } void write_playerbase_to_file (void) { FILE *fff; char write_one_line[500]; PLAYERBASE_DATA *playerbase; int tps, np, rp, average_level, level_tot; tps = 0; np = 0; rp = 0; average_level = 0; level_tot = 0; if ((fff = fopen ("player.txt", "w+")) == NULL) { fprintf (stderr, "The write failed! Bad news!! VERY bad news!!!!\n\r"); return; } for (playerbase = playerbase_zero; playerbase != NULL; playerbase = playerbase->next) { if (playerbase->player_level != -1) { tps++; if(playerbase->player_level <= pow.level_to_choose && playerbase->player_remort_times == 0) np++; if (playerbase->player_remort_times > 0) rp++; level_tot += (playerbase->player_level); sprintf (write_one_line, "%-17s R: %d Lvl: %3d Last_on: %4ld hrs NoD: %s\n", playerbase->player_name, (playerbase->player_remort_times), (playerbase->player_level), ((current_time - playerbase->player_last_login) / 3600), (playerbase->player_nodelete ? "y" : "n")); fprintf (fff, write_one_line); } } if (tps == 0) average_level = 0; else average_level = level_tot / tps; fprintf (fff, "Total Playerbase size: %d. Max Playerbase size: Unlimited.\n\r", tps); fprintf (fff, "Newbies: %d. Remorted players: %d. Average Lvl: %d.\n\r", np, rp, average_level); fclose (fff); return; } void do_players (CHAR_DATA * ch, char *argy) { int num_total, level_total, average_level; int average_lev[NUM_ALIGN]; int level_tot[NUM_ALIGN]; int num_tot[NUM_ALIGN]; int num_remorts[NUM_ALIGN][pow.max_remorts+1]; int maximum_remorts[NUM_ALIGN]; int i, jj; PLAYERBASE_DATA *playerbase; DEFINE_COMMAND ("players", do_players, POSITION_DEAD, 0, LOG_NORMAL, "This command lists the playerbase size, and gives some general info.") num_total = 0; level_total = 0; average_level = 0; for (jj = 0; jj < NUM_ALIGN; jj++) { average_lev[jj] = 0; level_tot[jj] = 0; num_tot[jj] = 0; maximum_remorts[jj] = 0; for (i = 0; i < (pow.max_remorts+1); i++) { num_remorts[jj][i] = 0; } } if (!str_cmp (argy, "file") && ch->pcdata->level == MAX_LEVEL) write_playerbase_to_file (); for (playerbase = playerbase_zero; playerbase != NULL; playerbase = playerbase->next) { if (playerbase->player_level > 91) continue; num_total++; level_total += playerbase->player_level; level_tot[playerbase->player_align] += playerbase->player_level; num_tot[playerbase->player_align]++; num_remorts[playerbase->player_align][playerbase->player_remort_times]++; if (playerbase->player_remort_times > maximum_remorts[playerbase->player_align]) maximum_remorts[playerbase->player_align] = playerbase->player_remort_times; } if (num_total == 0) average_level = 0; else average_level = level_total / num_total; for (jj = 0; jj < NUM_ALIGN; jj++) { if (num_tot[jj] == 0) average_lev[jj] = 0; else average_lev [jj] = level_tot[jj]/num_tot[jj]; } sprintf (update_char, "Total Playerbase size: \x1B[1;37m%d\x1B[0m. Average Playerbase Level: \x1b[1;37m%d\x1b[0;37m.\n\r", num_total, average_level); send_to_char (update_char, ch); for (jj = 0; jj < NUM_ALIGN; jj ++) { if (num_tot[jj] > 0) { sprintf(update_char, "Total members of %s: %d, Average Level: %d, Max Remort: %d\n\r", align_info[jj].name, num_tot[jj], average_lev[jj],maximum_remorts[jj]); send_to_char(update_char, ch); } } if (!str_cmp(argy, "full") && LEVEL(ch) == MAX_LEVEL) { for (i=0; i < (pow.max_remorts+1); i++) { update_char[0] = '\0'; for (jj = 0; jj < NUM_ALIGN; jj++) { sprintf(update_char, "%4d", num_remorts[jj][i]); send_to_char(update_char,ch); } send_to_char("\n\r", ch); } } return; } void do_pdelete (CHAR_DATA * ch, char *argy) { PLAYERBASE_DATA *playerbase; CHAR_DATA *ccc; DEFINE_COMMAND ("pdelete", do_pdelete, POSITION_DEAD, MAX_LEVEL, LOG_ALWAYS, "This command is used to delete characters.") /* if (IS_MOB (ch)) { do_echo(ch, "This didnt work cuz you are a mob!!\n\r"); return; } */ if (IS_PLAYER(ch) && !IS_REAL_GOD (ch)) { do_echo(ch, "This didnt work cuz you aren't a real god!!\n\r"); return; } if (argy == "" || argy[0] == '\0') { send_to_char ("Syntax is PDELETE <playername>.\n\r", ch); return; } ccc = get_char_world (ch, argy); if (ccc != NULL && IS_PLAYER (ccc)) { do_delete (ccc, "character forever"); } for (playerbase = playerbase_zero; playerbase != NULL; playerbase = playerbase->next) { if (!str_cmp (argy, playerbase->player_name)) { sprintf (update_char, "%s%s.cor", PLAYER_DIR, playerbase->player_name); unlink (update_char); sprintf (update_char, "%s%s", PLAYER_DIR, playerbase->player_name); unlink (update_char); /* sprintf(update_char,"rm \"%s%s\" &",PLAYER_DIR,jumble_name(playerbase->player_name,FALSE)); system(update_char); */ playerbase->player_level = -1; send_to_char ("Character deleted!\n\r", ch); save_playerbase (); return; } } send_to_char ("Player not found.\n\r", ch); return; } void do_nodelete (CHAR_DATA * ch, char *argy) { PLAYERBASE_DATA *playerbase; DEFINE_COMMAND ("z_nodelete", do_nodelete, POSITION_DEAD, MAX_LEVEL, LOG_ALWAYS, "This toggles a no delete flag on/off for a given player.") if (argy == "" || argy[0] == '\0') { char line[3][17]; char outbuf[200]; line[0][0] = '\0'; line[1][0] = '\0'; line[2][0] = '\0'; send_to_char ("Syntax is NODELETE <charname>.\n\r", ch); send_to_char ("\n\rCurrent no_delete flags on:\n\r", ch); for (playerbase = playerbase_zero; playerbase != NULL; playerbase = playerbase->next) { if (playerbase->player_level == -1) continue; if (playerbase->player_nodelete) { if (line[0][0] == '\0') strcpy (line[0], playerbase->player_name); else if (line[1][0] == '\0') strcpy (line[1], playerbase->player_name); else if (line[2][0] == '\0') strcpy (line[2], playerbase->player_name); else { sprintf (outbuf, "%17s %17s %17s\n\r", line[0], line[1], line[2]); send_to_char (outbuf, ch); strcpy (line[0], playerbase->player_name); line[1][0] = '\0'; line[2][0] = '\0'; } } } sprintf (outbuf, "%17s %17s %17s\n\r", (line[0][0] == '\0' ? " " : line[0]), (line[1][0] == '\0' ? " " : line[1]), (line[2][0] == '\0' ? " " : line[2])); send_to_char (outbuf, ch); return; } for (playerbase = playerbase_zero; playerbase != NULL; playerbase = playerbase->next) { if (!str_cmp (argy, playerbase->player_name)) { if (playerbase->player_nodelete) { send_to_char ("PLAYER NOW CAN BE DELETED AFTER INACTIVITY!\n\r", ch); playerbase->player_nodelete = FALSE; save_playerbase (); return; } else { send_to_char ("Player is now safe from inactivity deletion.\n\r", ch); playerbase->player_nodelete = TRUE; save_playerbase (); return; } } } send_to_char ("I could not find that player in the database.\n\r", ch); return; } void show_remort (CHAR_DATA * ch) { send_to_char ("You should read help Transform first, before you go any further.\n\r", ch); send_to_char ("\n\rThe correct syntax for transforming is:\n\r", ch); send_to_char ("Transform <\x1B[1;37mstat\x1B[0m> <\x1B[1;37mstat\x1B[0m> <\x1B[1;37mstat\x1B[0m>\n\r", ch); send_to_char ("<stat> is STR, DEX, CON, WIS, INT or NONE to specify null.\n\r", ch); send_to_char ("\n\rOr:\n\r", ch); if (pow.augmentremortonly) { send_to_char ("Transform <\x1B[1;37mstat\x1B[0m> <\x1B[1;37mstat\x1B[0m> <\x1B[1;37maugment\x1B[0m>\n\r", ch); send_to_char ("To view a list of augments type augment list.\n\r", ch); send_to_char ("\n\rOr:\n\r", ch); } send_to_char ("Transform race <\x1B[1;37mnumber\x1B[0m> - Switches your race (REMORT 2 and BELOW)\n\r", ch); return; } void show_donate (CHAR_DATA * ch) { send_to_char ("You should read help Donate first, before continuing.\n\r", ch); send_to_char ("The proper syntax is:\n\n\r", ch); send_to_char ("Donate <amount> <warpoints/gold> <city/clan>.\n\n\r", ch); send_to_char ("You must donate at least 100 gold or warpoints each time.\n\r", ch); return; }