#include <sys/types.h> #include <ctype.h> #include <math.h> #include <stdio.h> #include <string.h> #include <time.h> #include "mud.h" #include "sha256.h" extern void remove_member args( ( CHAR_DATA *ch ) ); bool str_ssh args( ( const char *astr, const char *bstr ) ); void transStatRemove args ((CHAR_DATA *ch)); /********** * MACROS * **********/ /* Abbreviate powerlevels */ char *abbNumLD(long double number) { static char abbNumber[MAX_STRING_LENGTH]; long double tempNumber = number; abbNumber[0] = '\0'; if (number < 100000) sprintf(abbNumber, "%s", num_punct_ld(number)); else if (number < 1000000) // 123.4k { tempNumber /= 1000; sprintf(abbNumber, "%.1Lfk", tempNumber ); } else if (number < 10000000) // 1.234m { tempNumber /= 1000000; sprintf(abbNumber, "%.3Lfm", tempNumber ); } else if (number < 100000000) //12.34m { tempNumber /= 1000000; sprintf(abbNumber, "%.2Lfm", tempNumber ); } else if (number < 1000000000) //123.4m { tempNumber /= 1000000; sprintf(abbNumber, "%.1Lfm", tempNumber ); } else if (number < 10000000000ULL) { tempNumber /= 1000000000; sprintf(abbNumber, "%.3Lfb", tempNumber ); } else if (number < 100000000000ULL) { tempNumber /= 1000000000; sprintf(abbNumber, "%.2Lfb", tempNumber ); } else if (number < 1000000000000ULL) { tempNumber /= 1000000000; sprintf(abbNumber, "%.1Lfb", tempNumber ); } else if (number < 10000000000000ULL) { tempNumber /= 1000000000000ULL; sprintf(abbNumber, "%.3Lft", tempNumber ); } else if (number < 100000000000000ULL) { tempNumber /= 1000000000000ULL; sprintf(abbNumber, "%.2Lft", tempNumber ); } else if (number < 1000000000000000ULL) { tempNumber /= 1000000000000ULL; sprintf(abbNumber, "%.1Lft", tempNumber ); } else if (number < 10000000000000000ULL) { tempNumber /= 1000000000000000ULL; sprintf(abbNumber, "%.3Lfq", tempNumber ); } else if (number < 100000000000000000ULL) { tempNumber /= 1000000000000000ULL; sprintf(abbNumber, "%.2Lfq", tempNumber ); } else /*if (number < 1000000000000000000ULL)*/ { tempNumber /= 1000000000000000ULL; sprintf(abbNumber, "%.1Lfq", tempNumber ); } /*else if (number < 10000000000000000000ULL) { tempNumber /= 1000000000000000000ULL; sprintf(abbNumber, "%.3Lfqt", tempNumber ); } else if (number < 100000000000000000000ULL) { tempNumber /= 1000000000000000000ULL; sprintf(abbNumber, "%.2Lfqt", tempNumber ); } else { tempNumber /= 1000000000000000000ULL; sprintf(abbNumber, "%.1Lfqt", tempNumber ); }*/ return abbNumber; } bool is_splitformed(CHAR_DATA *ch) { if (xIS_SET(ch->affected_by, AFF_SPLIT_FORM) || xIS_SET(ch->affected_by, AFF_TRI_FORM) || xIS_SET(ch->affected_by, AFF_MULTI_FORM) || xIS_SET(ch->affected_by, AFF_BIOJR)) return TRUE; return FALSE; } double weightedClothingPlMod(CHAR_DATA *ch) { OBJ_DATA *obj; int iWear; double plMod = 0; if (IS_NPC(ch)) return 0; for ( iWear = 0; iWear < MAX_WEAR; iWear++ ) { for ( obj = ch->first_carrying; obj; obj = obj->next_content ) if ( obj->wear_loc == iWear ) { if (obj->item_type == ITEM_ARMOR && obj->value[3] > 0) plMod += obj->value[3]; } } plMod = plMod/10000; // 10% pl gain mod cap // if (plMod > 0.10) // plMod = 0.10; return URANGE( 0, plMod, 20 ); } void update_plHiscore( CHAR_DATA *ch ) { struct tm *time; struct tm *creationTime; int tyear = 0; int tmon = 0; int ctyear = 0; int ctmon = 0; time = localtime(¤t_time); tyear = time->tm_year; tmon = time->tm_mon; creationTime = localtime(&ch->pcdata->creation_date); ctyear = creationTime->tm_year; ctmon = creationTime->tm_mon; adjust_hiscore_ld( "powerlevel", ch, ch->exp ); if (is_saiyan(ch)) adjust_hiscore_ld( "plsaiyan", ch, ch->exp ); if (is_human(ch)) adjust_hiscore_ld( "plhuman", ch, ch->exp ); if (is_hb(ch)) adjust_hiscore_ld( "plhalfbreed", ch, ch->exp ); if (is_namek(ch)) adjust_hiscore_ld( "plnamek", ch, ch->exp ); if (is_android(ch) || is_superandroid(ch) ) adjust_hiscore_ld( "plandroid", ch, ch->exp ); if (is_icer(ch)) adjust_hiscore_ld( "plicer", ch, ch->exp ); if (is_bio(ch)) adjust_hiscore_ld( "plbio-android", ch, ch->exp ); if (is_kaio(ch)) adjust_hiscore_ld( "plkaio", ch, ch->exp ); if (is_demon(ch)) adjust_hiscore_ld( "pldemon", ch, ch->exp ); if (ctyear == tyear && ctmon == tmon) { switch (tmon) { default: case 0: adjust_hiscore_ld( "januaryladder", ch, ch->exp ); break; case 1: adjust_hiscore_ld( "februaryladder", ch, ch->exp ); break; case 2: adjust_hiscore_ld( "marchladder", ch, ch->exp ); break; case 3: adjust_hiscore_ld( "aprilladder", ch, ch->exp ); break; case 4: adjust_hiscore_ld( "mayladder", ch, ch->exp ); break; case 5: adjust_hiscore_ld( "juneladder", ch, ch->exp ); break; case 6: adjust_hiscore_ld( "julyladder", ch, ch->exp ); break; case 7: adjust_hiscore_ld( "augustladder", ch, ch->exp ); break; case 8: adjust_hiscore_ld( "septemberladder", ch, ch->exp ); break; case 9: adjust_hiscore_ld( "octoberladder", ch, ch->exp ); break; case 10: adjust_hiscore_ld( "novemberladder", ch, ch->exp ); break; case 11: adjust_hiscore_ld( "decemberladder", ch, ch->exp ); break; } } return; } char *get_pkColor( CHAR_DATA *ch ) { if( is_kaio(ch) && ch->kairank > 0 ) { if( ch->kairank == 1 ) return ("&g"); if( ch->kairank == 2 ) return ("&G"); if( ch->kairank == 3 ) return ("&B"); if( ch->kairank == 4 ) return ("&Y"); if( ch->kairank == 5 ) return ("&W"); if( ch->kairank == 6 ) return ("&R"); } if( is_demon(ch) && ch->demonrank > 0 ) { if( ch->demonrank == 1 ) return ("&O"); if( ch->demonrank == 2 ) return ("&r"); if( ch->demonrank == 3 ) return ("&R"); } if (xIS_SET(ch->act, PLR_PK1)) return ("&Y"); if (xIS_SET(ch->act, PLR_PK2) || IS_HC(ch)) return ("&R"); return ("&G"); } bool can_pk( CHAR_DATA *ch ) { if (xIS_SET(ch->act, PLR_PK1)) return TRUE; if (xIS_SET(ch->act, PLR_PK2)) return TRUE; if (xIS_SET(ch->act, PLR_WAR1)) return TRUE; if (xIS_SET(ch->act, PLR_WAR2)) return TRUE; if (IS_HC(ch)) return TRUE; return FALSE; } // Chaged this to a function for expantion later on int get_damroll( CHAR_DATA *ch) { int damroll = 0; damroll = get_curr_str(ch) / 20; if (ch->mental_state > 5 && ch->mental_state < 15) damroll++; return damroll; } // For finding the defence bonus based on str int get_strDef( CHAR_DATA *victim ) { int strDef = 0; strDef = get_curr_str(victim) / 50; if (victim->mental_state > 5 && victim->mental_state < 15) strDef++; if( victim->skillGsn > 0 ) strDef /= 2; return strDef; } // For finding the defence bonus based on con int get_conDef( CHAR_DATA *victim ) { int conDef = 0; conDef = get_curr_con(victim) / 25; if (victim->mental_state > 5 && victim->mental_state < 15) conDef++; if( victim->skillGsn > 0 ) conDef /= 2; return conDef; } int get_armor( CHAR_DATA *ch ) { OBJ_DATA *obj; int iWear; int armor = 0; // int npcArmor = 0; /* ch->armor is only for NPCs and has nothing to do with eq armor it's used only to find a percentile damage mod. Handled in one_hit() -Goku if( IS_NPC( ch ) ) { npcArmor = ch->armor; } */ for ( iWear = 0; iWear < MAX_WEAR; iWear++ ) { for ( obj = ch->first_carrying; obj; obj = obj->next_content ) if ( obj->wear_loc == iWear ) { if (obj->item_type == ITEM_ARMOR && obj->value[4] > 0) armor += obj->value[4]; } } if (!IS_NPC(ch)) { ch->pcdata->natural_ac = (float) ch->hit / 100 * ch->pcdata->natural_ac_max; if (ch->pcdata->natural_ac < 0) ch->pcdata->natural_ac = 0; armor += ch->pcdata->natural_ac; } /* if( IS_NPC( ch ) && npcArmor > armor ) { armor = npcArmor; } */ /* returned to 10k max armor -Goku 10.05.04 */ if (armor > 10000) armor = 10000; return armor; } int get_maxarmor( CHAR_DATA *ch ) { OBJ_DATA *obj; int iWear; int armor = 0; for ( iWear = 0; iWear < MAX_WEAR; iWear++ ) { for ( obj = ch->first_carrying; obj; obj = obj->next_content ) if ( obj->wear_loc == iWear ) { if (obj->item_type == ITEM_ARMOR && obj->value[5] > 0) armor += obj->value[5]; } } if (!IS_NPC(ch)) { if (ch->pcdata->natural_ac_max < 0) ch->pcdata->natural_ac_max = 0; armor += ch->pcdata->natural_ac_max; } if (armor > 8000) armor = 8000; return armor; } // Hidden armor stat = evil. --Saiyr int get_hidden_armor( CHAR_DATA *ch ) { int armor; int maxarmor; float percentage; int hiddenarmor; if( IS_NPC( ch ) ) return ch->armor; else { armor = get_armor( ch ); maxarmor = get_maxarmor( ch ); percentage = armor / maxarmor; hiddenarmor = maxarmor > race_table[ch->race]->max_armor ? percentage * race_table[ch->race]->max_armor : armor; } return hiddenarmor; } double get_attmod( CHAR_DATA *ch, CHAR_DATA *victim ) { double attmod = 0.000; /* No longer neccessary since mobs now use their pl value - Karma if ( !IS_NPC(ch) && !IS_NPC(victim) ) attmod = ( (double) (ch)->pl / (victim)->pl); if ( !IS_NPC(ch) && IS_NPC(victim) ) attmod = ( (double) (ch)->pl / (victim)->exp); if ( IS_NPC(ch) && !IS_NPC(victim) ) attmod = ( (double) (ch)->exp / (victim)->pl); if ( IS_NPC(ch) && IS_NPC(victim) ) attmod = ( (double) (ch)->exp / (victim)->exp); */ attmod = ( (double) (ch)->pl / (victim)->pl); /* turning off the damage buffer since it's not really needed any more -Goku if (attmod < 2 && attmod >= 0.5) attmod = 1; if (attmod < 0.5) attmod *= 2; if (attmod > 2) attmod *= 0.5; */ return attmod; } long double get_lattmod( CHAR_DATA *ch, CHAR_DATA *victim ) { long double attmod = 0.000; if ( !IS_NPC(ch) && !IS_NPC(victim) ) attmod = ( (long double) (ch)->pl / (victim)->pl); if ( !IS_NPC(ch) && IS_NPC(victim) ) attmod = ( (long double) (ch)->pl / (victim)->exp); if ( IS_NPC(ch) && !IS_NPC(victim) ) attmod = ( (long double) (ch)->exp / (victim)->pl); if ( IS_NPC(ch) && IS_NPC(victim) ) attmod = ( (long double) (ch)->exp / (victim)->exp); return attmod; } OBJ_DATA *has_scouter( CHAR_DATA *ch ) { OBJ_DATA *obj; int iWear; for ( iWear = 0; iWear < MAX_WEAR; iWear++ ) { for ( obj = ch->first_carrying; obj; obj = obj->next_content ) if ( obj->wear_loc == iWear ) { if ( obj->item_type == ITEM_SCOUTER ) return obj; } } return NULL; } OBJ_DATA *has_dragonradar( CHAR_DATA *ch ) { OBJ_DATA *obj; int iWear; for ( iWear = 0; iWear < MAX_WEAR; iWear++ ) { for ( obj = ch->first_carrying; obj; obj = obj->next_content ) if ( obj->wear_loc == WEAR_HOLD ) { if ( obj->item_type == ITEM_DRAGONRADAR ) return obj; } } return NULL; } int get_true_rank( CHAR_DATA *ch ) { if (IS_NPC(ch)) return 0; if (ch->exp < 5000) return 1; else if (ch->exp < 100000) return 2; else if (ch->exp < 1000000) return 3; else if (ch->exp < 10000000) return 4; else if (ch->exp < 100000000) return 5; else if (ch->exp < 1000000000) return 6; else if (ch->exp < 10000000000ULL) return 7; else if (ch->exp < 50000000000ULL) return 8; else if (ch->exp < 100000000000ULL) return 9; else if (ch->exp < 300000000000ULL) return 10; else if (ch->exp < 600000000000ULL) return 11; else if (ch->exp < 1000000000000ULL) return 12; else if (ch->exp < 10000000000000ULL) return 13; else if (ch->exp < 50000000000000ULL) return 14; else if (ch->exp < 100000000000000ULL) return 15; else return 16; /*else if (ch->exp >= 100000000000000ULL) return 16;*/ return 0; } int get_rank_number( CHAR_DATA *ch ) { if (IS_NPC(ch)) return -1; if (IS_HC(ch)) return 0; else if (ch->exp < 5000) return 1; else if (ch->exp < 100000) return 2; else if (ch->exp < 1000000) return 3; else if (ch->exp < 10000000) return 4; else if (ch->exp < 100000000) return 5; else if (ch->exp < 1000000000) return 6; else if (ch->exp < 10000000000ULL) return 7; else if (ch->exp < 50000000000ULL) return 8; else if (ch->exp < 100000000000ULL) return 9; else if (ch->exp < 300000000000ULL) return 10; else if (ch->exp < 600000000000ULL) return 11; else if (ch->exp < 1000000000000ULL) return 12; else if (ch->exp < 10000000000000ULL) return 13; else if (ch->exp < 50000000000000ULL) return 14; else if (ch->exp < 100000000000000ULL) return 15; else return 16; /*else if (ch->exp >= 100000000000000ULL) return 16;*/ return -1; } char *get_rank( CHAR_DATA *ch) { if (IS_NPC(ch)) return ("NPC"); if (IS_HC(ch)) return ("Unknown"); else if (ch->exp < 5000) return ("Fighter in Training"); else if (ch->exp < 100000) return ("Trained Fighter"); else if (ch->exp < 1000000) return ("Skilled Fighter"); else if (ch->exp < 10000000) return ("Experienced Fighter"); else if (ch->exp < 100000000) return ("Ultimate Fighter"); else if (ch->exp < 1000000000) return ("Veteran Warrior"); else if (ch->exp < 10000000000ULL) return ("Fearsome Warrior"); else if (ch->exp < 50000000000ULL) return ("Legendary Warrior"); else if (ch->exp < 100000000000ULL) return ("Epic Warrior"); else if (ch->exp < 300000000000ULL) return ("Ascendant Warrior"); else if (ch->exp < 600000000000ULL) return ("Transcendant Warrior"); else if (ch->exp < 1000000000000ULL) return ("Champion"); else if (ch->exp < 10000000000000ULL) return ("Titan"); else if (ch->exp < 50000000000000ULL) return ("Mythical Warrior"); else if (ch->exp < 100000000000000ULL) return ("Omnipotent Warrior"); else /*if (ch->exp >= 100000000000000ULL)*/ return ("Demi-God"); return ("BUG: NOTIFY GOKU"); } char *get_rank_color( CHAR_DATA *ch) { if (IS_NPC(ch)) return ("&rNPC"); if (IS_HC(ch)) return ("&rUnknown"); else if (ch->exp < 5000) return ("&PFighter in Training"); else if (ch->exp < 100000) return ("&cTrained Fighter"); else if (ch->exp < 1000000) return ("&OSkilled Fighter"); else if (ch->exp < 10000000) return ("&wExperienced Fighter"); else if (ch->exp < 100000000) return ("&RUltimate Fighter"); else if (ch->exp < 1000000000) return ("&CVeteran Warrior"); else if (ch->exp < 10000000000ULL) return ("&rFearsome Warrior"); else if (ch->exp < 50000000000ULL) return ("&BLegendary Warrior"); else if (ch->exp < 100000000000ULL) return ("&WEpic Warrior"); else if (ch->exp < 300000000000ULL) return ("&gAscendant Warrior"); else if (ch->exp < 600000000000ULL) return (">ranscendent Warrior"); else if (ch->exp < 1000000000000ULL) return ("&BChampion"); else if (ch->exp < 10000000000000ULL) return ("&WTitan"); else if (ch->exp < 50000000000000ULL) return ("&CMythical Warrior"); else if (ch->exp < 100000000000000ULL) return ("&ROmnipotent Warrior"); else /*if (ch->exp >= 10000000000000ULL)*/ return ("&zDemi-God"); return ("&rBUG: NOTIFY GOKU"); } char *color_align( CHAR_DATA *ch) { if (IS_HC(ch)) return ("&z"); else if (IS_GOOD(ch)) return ("&C"); else if (IS_NEUTRAL(ch)) return ("&w"); else return ("&R"); } char *color_clan( CHAR_DATA *ch) { if (IS_NPC(ch)) return (""); if (!ch->pcdata) return (""); if (!ch->pcdata->clan) return (""); if (ch->pcdata->clan->alignment == CLANALIGN_GOOD) return ("&C"); else if (ch->pcdata->clan->alignment == CLANALIGN_NEUTRAL) return ("&w"); else if (ch->pcdata->clan->alignment == CLANALIGN_EVIL) return ("&R"); return (""); } char *get_build( CHAR_DATA *ch ) { if (IS_NPC(ch)) return (""); return (build_type[ch->pcdata->build]); } char *get_haircolor( CHAR_DATA *ch ) { if (IS_NPC(ch)) return (""); return (hair_color[ch->pcdata->haircolor]); } char *get_eyes( CHAR_DATA *ch ) { if (IS_NPC(ch)) return (""); return (eye_color[ch->pcdata->eyes]); } char *get_complexion( CHAR_DATA *ch ) { if (IS_NPC(ch)) return (""); return (complexion[ch->pcdata->complexion]); } char *get_secondary_color( CHAR_DATA *ch ) { if (IS_NPC(ch)) return (""); return (secondary_color[ch->pcdata->secondarycolor]); } int get_hairlen( CHAR_DATA *ch ) { if (IS_NPC(ch)) return 0; return (ch->pcdata->hairlen); } char *get_hairstyle( CHAR_DATA *ch ) { if (IS_NPC(ch)) return (""); return (hair_style[ch->pcdata->hairstyle]); } char *heshe( CHAR_DATA *ch, bool cap ) { if (cap) { if (ch->sex == SEX_MALE) return ("He"); if (ch->sex == SEX_FEMALE) return ("She"); else return ("It"); } else { if (ch->sex == SEX_MALE) return ("he"); if (ch->sex == SEX_FEMALE) return ("she"); else return ("it"); } } char *himher( CHAR_DATA *ch, bool cap ) { if (cap) { if (ch->sex == SEX_MALE) return ("Him"); if (ch->sex == SEX_FEMALE) return ("Her"); else return ("It"); } else { if (ch->sex == SEX_MALE) return ("him"); if (ch->sex == SEX_FEMALE) return ("her"); else return ("it"); } } char *hisher( CHAR_DATA *ch, bool cap ) { if (cap) { if (ch->sex == SEX_MALE) return ("His"); if (ch->sex == SEX_FEMALE) return ("Her"); else return ("Its"); } else { if (ch->sex == SEX_MALE) return ("his"); if (ch->sex == SEX_FEMALE) return ("her"); else return ("its"); } } sh_int get_newage( CHAR_DATA *ch ) { if (IS_NPC(ch)) return 4 + ( ch->played + (current_time - ch->logon) ) / 7200; else return (ch->pcdata->age); } bool is_atwar( CHAR_DATA *ch, CHAR_DATA *victim) { /* CLAN_DATA *clanch; CLAN_DATA *clanvict; if (!ch->pcdata->clan || !victim->pcdata->clan) return FALSE; clanch = ch->pcdata->clan; clanvict = victim->pcdata->clan; if (!clanch->war && !clanvict->war) return FALSE; if (!strcmp(clanch->war_clan, clanvict->war_clan)) return TRUE; */ return FALSE; } /************* * FUNCTIONS * *************/ void kaioken_drain(CHAR_DATA *ch) { char buf[MAX_INPUT_LENGTH]; int drain; int kaioken; long double los = 0; if (ch->position <= POS_SLEEPING) { act( AT_RED, "The powers of the Kaioken slowly fade away as you lose conciseness.", ch, NULL, NULL, TO_CHAR ); act( AT_RED, "The powers of $n's Kaioken attack slowly fade as $e loses conciseness.", ch, NULL, NULL, TO_NOTVICT ); xREMOVE_BIT((ch)->affected_by, AFF_KAIOKEN); if (xIS_SET((ch)->affected_by, AFF_HEART)) xREMOVE_BIT(ch->affected_by, AFF_HEART); ch->pl = ch->exp; transStatRemove( ch ); heart_calc(ch, ""); return; } drain = number_range( 6, 8 ); kaioken = (ch->pl / ch->exp); drain *= kaioken; if( !str_cmp(get_race(ch),"kaio") ) drain /= 3; if (ch->mana - drain < 0) { drain = drain - ch->mana; ch->mana = 0; } else ch->mana -= drain; if (drain != 0 && ch->mana == 0) { if (ch->hit - drain > 0) ch->hit -= drain; else if (ch->hit - drain < 0) { ch->hit -= drain; update_pos(ch); if ( ch->position == POS_DEAD) { act( AT_RED, "Your body explodes under the strain of using the Kaioken.", ch, NULL, NULL, TO_CHAR ); act( AT_RED, "$n explodes under the strain of using the Kaioken.", ch, NULL, NULL, TO_NOTVICT ); sprintf( buf, "%s explodes under the strain of using the Kaioken", ch->name ); do_info(ch, buf); if ( !IS_NPC(ch) ) los = ch->exp * 0.085; gain_exp( ch, 0 - los); raw_kill(ch, ch); } } } return; } void clan_auto_kick( CHAR_DATA *ch ) { /* char buf[MAX_INPUT_LENGTH]; CLAN_DATA *clan; if (IS_NPC(ch) || !ch->pcdata->clan) return; if (IS_HC(ch)) return; clan = ch->pcdata->clan; if (!str_cmp( ch->name, clan->leader ) || !str_cmp( ch->name, clan->deity )) { return; } if ( (clan->alignment == 1 && ch->alignment > 0) || (clan->alignment == 2 && ch->alignment < 500 && ch->alignment > -500) || (clan->alignment == 3 && ch->alignment < 0) || clan->alignment == 0 ) return; pager_printf_color(ch, "&RYou have been outcast from the %s.&W", clan->name); sprintf( buf, "%s has been auto-booted from the %s", ch->name, clan->name); do_info(ch, buf); --clan->members; ch->pcdata->clan = NULL; remove_member( ch ); STRFREE(ch->pcdata->clan_name); ch->pcdata->clan_name = STRALLOC( "" ); save_char_obj( ch ); save_clan( clan ); */ return; } void clan_auto_align( CHAR_DATA *ch, CLAN_DATA *clan ) { /* CHAR_DATA *leader = NULL; CHAR_DATA *number1 = NULL; CHAR_DATA *number2 = NULL; char buf[MAX_STRING_LENGTH]; if ( clan->leader ) { if ( ( leader = get_char_world( ch, clan->leader ) ) == NULL ) return; } if ( clan->number1 ) { if ( ( number1 = get_char_world( ch, clan->number1 ) ) == NULL ) return; } if ( clan->number2 ) { if ( ( number2 = get_char_world( ch, clan->number2 ) ) == NULL ) return; } if (IS_GOOD(leader) && IS_GOOD(number1) && IS_GOOD(number2) && clan->alignment != 1) { clan->alignment = 1; sprintf(buf, "The leaders of the %s have decided to change their clan's alignment to GOOD.", clan->name); } else if (IS_NEUTRAL(leader) && IS_NEUTRAL(number1) && IS_NEUTRAL(number2) && clan->alignment != 2) { clan->alignment = 2; sprintf(buf, "The leaders of the %s have decided to change their clan's alignment to NEUTRAL.", clan->name); } else if (IS_EVIL(leader) && IS_EVIL(number1) && IS_EVIL(number2) && clan->alignment != 3) { clan->alignment = 3; sprintf(buf, "The leaders of the %s have decided to change their clan's alignment to EVIL.", clan->name); } else return; echo_to_all ( AT_WHITE, buf, ECHOTAR_ALL ); clan_auto_align_kick( clan ); save_clan( clan ); */ return; } void clan_auto_align_kick( CLAN_DATA *clan ) { /* DESCRIPTOR_DATA *d; CHAR_DATA *vch; for( d = first_descriptor; d; d= d->next ) { vch = d->character; if (!vch) { continue; } if (vch->pcdata->clan != clan) continue; if (!str_cmp( vch->name, clan->deity )) return; if (!str_cmp( vch->name, clan->leader ) || !str_cmp( vch->name, clan->number1 ) || !str_cmp( vch->name, clan->number2 ) ) continue; if ( (clan->alignment == 1 && vch->alignment > 0) || (clan->alignment == 2 && vch->alignment < 500 && vch->alignment > -500) || (clan->alignment == 3 && vch->alignment < 0) ) continue; pager_printf_color(vch, "&RYou have been outcast from the %s.&W", clan->name); --clan->members; vch->pcdata->clan = NULL; STRFREE(vch->pcdata->clan_name); vch->pcdata->clan_name = STRALLOC( "" ); save_char_obj( vch ); } */ return; } void damage_armor( CHAR_DATA *ch, int dam ) { OBJ_DATA *obj; int iWear; int count = 0; int ac_dam = 0; int cary_over = 0; if (dam <= 0) return; ac_dam = dam; for ( iWear = 0; iWear < MAX_WEAR; iWear++ ) { for ( obj = ch->first_carrying; obj; obj = obj->next_content ) if ( obj->wear_loc == iWear ) { if (obj->item_type == ITEM_ARMOR && obj->value[4] > 0) count++; } } if (ac_dam < count) while (ac_dam < count) { count--; } ac_dam = ac_dam / count; for ( iWear = 0; iWear < MAX_WEAR; iWear++ ) { for ( obj = ch->first_carrying; obj; obj = obj->next_content ) if ( obj->wear_loc == iWear ) { if (obj->item_type == ITEM_ARMOR && obj->value[4] > 0) { if ( obj->value[4] >= (ac_dam + cary_over) ) { obj->value[4] -= (ac_dam + cary_over); cary_over = 0; } else { cary_over = (ac_dam + cary_over) - obj->value[4]; obj->value[4] = 0; } } } } return; } int dam_armor_recalc( CHAR_DATA *ch, int dam ) { double dam_to_ac = 0; double dam_to_lf = 0; int armorValue = get_armor( ch ); // if (get_armor(ch) <= 0) if (armorValue <= 0) return dam; if( armorValue > 8000 ) { armorValue = 8000; } dam_to_ac = (double) armorValue / 1000 * dam; dam_to_lf = dam - ((double) armorValue / 10000 * dam); // dam_to_ac *= 0.15; dam_to_ac = floor(dam_to_ac); dam_to_lf = floor(dam_to_lf); if (dam_to_ac > 999999999) dam_to_ac = 999999999; if (dam_to_lf > 999999999) dam_to_lf = 999999999; if (!IS_NPC(ch)) { if (armorValue > ch->pcdata->natural_ac && dam_to_lf < ch->hit) damage_armor(ch, (int)dam_to_ac); } return (int)dam_to_lf; } CENSOR_DATA *first_censor; CENSOR_DATA *last_censor; void save_censor(void) { CENSOR_DATA *cens; FILE *fp; fclose(fpReserve); if (!(fp = fopen(SYSTEM_DIR CENSOR_LIST, "w"))) { bug( "Save_censor: cannot open " CENSOR_LIST, 0 ); perror(CENSOR_LIST); fpReserve = fopen( NULL_FILE, "r" ); return; } for (cens = first_censor; cens; cens = cens->next) fprintf(fp, "%s~\n", cens->word); fprintf(fp, "$~\n"); fclose(fp); fpReserve = fopen(NULL_FILE, "r"); return; } void do_censor(CHAR_DATA *ch, char *argument) { char arg[MAX_INPUT_LENGTH]; CENSOR_DATA *cens; set_char_color( AT_PLAIN, ch ); argument = one_argument(argument, arg); if (!*arg) { int wid = 0; send_to_char("-- Censored Words --\n\r", ch); for (cens = first_censor; cens; cens = cens->next) { ch_printf(ch, "%-17s ", cens->word); if (++wid % 4 == 0) send_to_char("\n\r", ch); } if (wid % 4 != 0) send_to_char("\n\r", ch); return; } for (cens = first_censor; cens; cens = cens->next) if (!str_cmp(arg, cens->word)) { UNLINK(cens, first_censor, last_censor, next, prev); DISPOSE(cens->word); DISPOSE(cens); save_censor(); send_to_char("Word no longer censored.\n\r", ch); return; } CREATE(cens, CENSOR_DATA, 1); cens->word = str_dup(arg); sort_censor(cens); save_censor(); send_to_char("Word censored.\n\r", ch); return; } void load_censor( void ) { CENSOR_DATA *cens; FILE *fp; if ( !(fp = fopen( SYSTEM_DIR CENSOR_LIST, "r" )) ) return; for ( ; ; ) { if ( feof( fp ) ) { bug( "Load_censor: no $ found." ); fclose(fp); return; } CREATE(cens, CENSOR_DATA, 1); cens->word = fread_string_nohash(fp); if (*cens->word == '$') break; sort_censor(cens); } DISPOSE(cens->word); DISPOSE(cens); fclose(fp); return; } void sort_censor( CENSOR_DATA *pRes ) { CENSOR_DATA *cens = NULL; if ( !pRes ) { bug( "Sort_censor: NULL pRes" ); return; } pRes->next = NULL; pRes->prev = NULL; for ( cens = first_censor; cens; cens = cens->next ) { if ( strcasecmp(pRes->word, cens->word) > 0 ) { INSERT(pRes, cens, first_censor, next, prev); break; } } if ( !cens ) { LINK(pRes, first_censor, last_censor, next, prev); } return; } bool is_swear( char *word ) { CENSOR_DATA *cens; for (cens = first_censor; cens; cens = cens->next) if ((!str_infix(cens->word, word)) || !str_cmp(cens->word, word)) // if (str_ssh(word, cens->word)) return TRUE; return FALSE; } void do_info( CHAR_DATA *ch, char *argument ) { char buf[MAX_INPUT_LENGTH]; CHAR_DATA *och; DESCRIPTOR_DATA *d; sprintf(buf, "&W[&YInfo&W] &w::&B%s&w::\r\n", argument); sysdata.outBytesFlag = LOGBOUTINFOCHANNEL; for (d = first_descriptor; d; d = d->next) { if(d->connected == CON_PLAYING) { och = d->character; /*if (och == ch) continue;*/ if(!xIS_SET(och->deaf, CHANNEL_INFO)) { och->desc->psuppress_channel++; send_to_char(buf, och); } } } sysdata.outBytesFlag = LOGBOUTNORM; do_ainfo(ch, argument); return; } void echo_to_clan( CLAN_DATA *clan, char *argument ) { char buf[MAX_INPUT_LENGTH]; CHAR_DATA *och; DESCRIPTOR_DATA *d; sprintf(buf, "&W[&YClanInfo&W] &w::&c%s&w::\r\n", argument); sysdata.outBytesFlag = LOGBOUTINFOCHANNEL; for (d = first_descriptor; d; d = d->next) { if(d->connected == CON_PLAYING) { och = d->character; if (!och->pcdata->clan) continue; if (och->pcdata->clan != clan) continue; och->desc->psuppress_channel++; send_to_char(buf, och); } } sysdata.outBytesFlag = LOGBOUTNORM; return; } void do_ainfo( CHAR_DATA *ch, char *argument ) { char buf[MAX_INPUT_LENGTH]; CHAR_DATA *och; DESCRIPTOR_DATA *d; if (ch) { if (IS_IMMORTAL(ch)) sprintf(buf, "&W[&YAInfo&W] &w::&Y%s&w::\r\n", argument); else sprintf(buf, "&W[&YAInfo&W] &w::&B%s&w::\r\n", argument); } else sprintf(buf, "&W[&YAInfo&W] &w::&R%s&w::\r\n", argument); sysdata.outBytesFlag = LOGBOUTINFOCHANNEL; for (d = first_descriptor; d; d = d->next) { if(d->connected == CON_PLAYING) { och = d->character; if (och == ch) continue; if(!xIS_SET(och->deaf, CHANNEL_AINFO) && IS_IMMORTAL(och) && och->level >= ch->level) { och->desc->psuppress_channel++; send_to_char(buf, och); } } } sysdata.outBytesFlag = LOGBOUTNORM; return; } bool str_ssh( const char *astr, const char *bstr ) { int sstr1; int sstr2; int ichar; int ibstr = 0; int punct = 0; if ( astr[0] == '\0' ) return FALSE; if ( bstr[0] == '\0' ) return FALSE; sstr1 = strlen(astr); sstr2 = strlen(bstr); for ( ichar = 0; ichar <= sstr1; ichar++ ) { if ((astr[ichar] == '&' || astr[ichar] == '}' || astr[ichar] == '^') && LOWER(astr[ichar+1]) != LOWER(bstr[ibstr])) { ichar++; continue; } /* if (isspace(astr[ichar]) || isdigit(astr[ichar])) continue; */ if (astr[ichar] == astr[ichar-1]) continue; if (ispunct(astr[ichar]) && ibstr > 0) { punct++; ichar++; ibstr++; } if (LOWER(astr[ichar]) != LOWER(bstr[ibstr])) ibstr = 0; if (LOWER(astr[ichar]) == LOWER(bstr[ibstr])) ibstr++; if (ibstr >= sstr2 && punct < sstr2) return TRUE; } return FALSE; } void find_absorb_data( CHAR_DATA *ch, CHAR_DATA *victim) { int sn = 0; int i = 0; bool stop = FALSE; bool snFound = FALSE; if (IS_NPC(ch) || IS_NPC(victim)) return; /* * moved the sn != gsn checks to the while loop so that it can * continue looping if it finds these numbers instead of just * breaking the loop -Goku */ while(!stop) { switch (number_range(1,2)) { case 1: sn = number_range(gsn_first_skill, gsn_first_ability - 1); if (victim->pcdata->learned[sn] > 0 && ch->pcdata->learned[sn] < skill_table[sn]->skill_adept[ch->class] && ch->pl >= skill_table[sn]->skill_level[ch->class] && skill_table[sn]->skill_adept[ch->class] > 0 && skill_table[sn]->skill_level[ch->class] > 0 && sn != gsn_semiperfect && sn != gsn_perfect && sn != gsn_ultraperfect && sn != gsn_rescue) stop = TRUE; snFound = TRUE; break; case 2: sn = number_range(gsn_first_ability, gsn_first_weapon - 1); if (victim->pcdata->learned[sn] > 0 && ch->pcdata->learned[sn] < skill_table[sn]->skill_adept[ch->class] && ch->pl >= skill_table[sn]->skill_level[ch->class] && skill_table[sn]->skill_adept[ch->class] > 0 && skill_table[sn]->skill_level[ch->class] > 0 && sn != gsn_semiperfect && sn != gsn_perfect && sn != gsn_ultraperfect && sn != gsn_rescue) stop = TRUE; snFound = TRUE; break; } i++; if (i > 100) stop = TRUE; } if (snFound) { ch->pcdata->absorb_sn = sn; ch->pcdata->absorb_learn = victim->pcdata->learned[sn] / 2; } else { ch->pcdata->absorb_sn = 0; ch->pcdata->absorb_learn = 0; } return; } void bio_absorb(CHAR_DATA *ch, CHAR_DATA *victim) { int xp_gain_post = 0; char buf1[MAX_STRING_LENGTH]; long double cPL = ch->exp; long double vPL = victim->exp; bool canAbsorb = FALSE; if(IS_NPC(ch)) return; if( !IS_NPC( ch ) && ch->pl > ch->exp ) cPL = ch->pl; if( !IS_NPC( victim ) && victim->pl > victim->exp ) vPL = victim->pl; if( ( cPL / vPL ) > 5 ) { canAbsorb = FALSE; } else { canAbsorb = TRUE; } act( AT_HIT, "You stab $N in the chest with your tail and suck out $S life force.", ch, NULL, victim, TO_CHAR ); act( AT_HIT, "$n stabs $N in the chest with $s tail and sucks out $S life force.", ch, NULL, victim, TO_ROOM ); if (number_range(1, 100) < 75 && ch->pcdata->absorb_learn > 0 // && ( vPL >= cPL )) && ( canAbsorb ) && !IS_NPC( victim) ) { pager_printf(ch, "You surge with new found power as you learn %s\n\r", skill_table[ch->pcdata->absorb_sn]->name); ch->pcdata->learned[ch->pcdata->absorb_sn] = UMIN( GET_ADEPT(ch,ch->pcdata->absorb_sn), ch->pcdata->learned[ch->pcdata->absorb_sn] + ch->pcdata->absorb_learn ); } xp_gain_post = UMIN( ch->pcdata->absorb_pl * ( race_table[ch->race]->exp_multiplier/100.0), 2147483646); if (xp_gain_post != 1) { sprintf( buf1, "Your power level increases by %s points.", num_punct(xp_gain_post) ); act( AT_HIT, buf1, ch, NULL, victim, TO_CHAR ); } else { sprintf( buf1, "Your power level increases by %s point.", num_punct(xp_gain_post) ); act( AT_HIT, buf1, ch, NULL, victim, TO_CHAR ); } gain_exp(ch, ch->pcdata->absorb_pl); ch->pcdata->absorb_pl = 0; ch->pcdata->absorb_sn = 0; ch->pcdata->absorb_learn = 0; victim->hit = -20; update_pos( victim ); evolveCheck(ch, victim, FALSE); return; } void evolveCheck(CHAR_DATA *ch, CHAR_DATA *victim, bool death) { int evolveChance = 0; long double cPL, vPL; if(IS_NPC(ch)) return; if (ch->exp > skill_table[gsn_semiperfect]->skill_level[ch->class] && ch->pcdata->learned[gsn_semiperfect] == 0) { if (!IS_NPC(victim)) { if( ch->exp > ch->pl ) cPL = ch->exp; else cPL = ch->pl; if( victim->exp > victim->pl ) vPL = victim->exp; else vPL = victim->pl; // if( vPL < cPL ) if( ( cPL / vPL ) > 5 ) return; if (!death) ch->rage++; evolveChance = number_range(1, 100); if (ch->rage * 5 > evolveChance) { pager_printf(ch, "&YNew power boils within you as you feel it's time to evolve.\n\r", skill_table[ch->pcdata->absorb_sn]->name); ch->pcdata->learned[gsn_semiperfect] = 100; ch->rage = 0; } } } if (ch->exp > skill_table[gsn_perfect]->skill_level[ch->class] && ch->pcdata->learned[gsn_perfect] == 0) { if (!IS_NPC(victim)) { if( ch->exp > ch->pl ) cPL = ch->exp; else cPL = ch->pl; if( victim->exp > victim->pl ) vPL = victim->exp; else vPL = victim->pl; // if( vPL < cPL ) if( ( cPL / vPL ) > 5 ) return; if (!death) ch->rage++; evolveChance = number_range(1, 100); if (ch->rage * 5 > evolveChance) { pager_printf(ch, "&YNew power boils within you as you feel it's time to evolve.\n\r", skill_table[ch->pcdata->absorb_sn]->name); ch->pcdata->learned[gsn_perfect] = 100; ch->rage = 0; } } } if (ch->exp > skill_table[gsn_ultraperfect]->skill_level[ch->class] && ch->pcdata->learned[gsn_ultraperfect] == 0) { if (!IS_NPC(victim)) { if( ch->exp > ch->pl ) cPL = ch->exp; else cPL = ch->pl; if( victim->exp > victim->pl ) vPL = victim->exp; else vPL = victim->pl; // if( vPL < cPL ) if( ( cPL / vPL ) > 5 ) return; if (!death) ch->rage++; evolveChance = number_range(1, 100); if (ch->rage * 5 > evolveChance) { pager_printf(ch, "&YNew power boils within you as you feel it's time to evolve.\n\r", skill_table[ch->pcdata->absorb_sn]->name); ch->pcdata->learned[gsn_ultraperfect] = 100; ch->rage = 0; } } } return; } void update_absorb(CHAR_DATA *ch, CHAR_DATA *victim) { int i = 0; int race_absorb = 0; if(IS_NPC(ch)) return; if (IS_NPC(victim)) { ch->pcdata->absorb_mob++; return; } if (victim->pl >= ch->pl) { ch->pcdata->absorb_pc++; ch->pcdata->absorb_race[victim->race]++; } else { ch->pcdata->absorb_pc++; ch->pcdata->absorb_race[victim->race]++; } for(i=0;i<=10;i++) { if (ch->pcdata->absorb_race[i] > race_absorb) { race_absorb = ch->pcdata->absorb_race[i]; ch->pcdata->absorb_pl_mod = i; } } return; } int chargeDamMult(CHAR_DATA *ch, int dam) { if (ch->charge > 0) dam *= ch->charge; return dam; } bool gTrainFlee(CHAR_DATA *ch) { ROOM_INDEX_DATA *was_in; ROOM_INDEX_DATA *now_in; int attempt; sh_int door; EXIT_DATA *pexit; was_in = ch->in_room; for ( attempt = 0; attempt < 8; attempt++ ) { door = number_door( ); if (( pexit = get_exit( was_in, door ) ) == NULL || !pexit->to_room || IS_SET( pexit->exit_info, EX_NOFLEE ) || ( IS_SET( pexit->exit_info, EX_CLOSED ) && !IS_AFFECTED( ch, AFF_PASS_DOOR ) ) || ( IS_NPC( ch ) && xIS_SET( pexit->to_room->room_flags, ROOM_NO_MOB ) ) ) continue; move_char( ch, pexit, 0 ); if ( ( now_in = ch->in_room ) == was_in ) continue; ch->in_room = was_in; act( AT_FLEE, "$n tried to hard and got kicked out of the room!", ch, NULL, NULL, TO_ROOM ); ch->in_room = now_in; act( AT_FLEE, "$n glances around for signs of pursuit.", ch, NULL, NULL, TO_ROOM ); act( AT_FLEE, "You flee head over heels from combat!", ch, NULL, NULL, TO_CHAR ); return TRUE; } /* didn't get knocked out*/ return FALSE; } bool upgrade_player(CHAR_DATA *ch) { OBJ_DATA *obj; if (IS_NPC(ch)) return FALSE; if( ch->pcdata->sparcount > 0 && ch->pcdata->nextspartime <= 0 ) ch->pcdata->sparcount = 0; { for ( obj = ch->first_carrying; obj; obj = obj->next_content ) { if( obj->pIndexData->item_type == ITEM_ARMOR ) { obj->value[3] = obj->pIndexData->value[3]; } if( obj->item_type == ITEM_CONTAINER ) { OBJ_DATA *cobj, *cobj_next; for( cobj = obj->first_content; cobj != NULL ; cobj = cobj_next ) { cobj_next = cobj->next_content; if( cobj->pIndexData->item_type == ITEM_ARMOR ) { cobj->value[3] = cobj->pIndexData->value[3]; } } } } pager_printf( ch, "Items updated.\n\r" ); } if (ch->pcdata->upgradeL >= CURRENT_UPGRADE_LEVEL) return FALSE; /* * should be a loop to do each upgrade until * the player is upgraded to the current level */ pager_printf(ch, "Updates found. Starting update...\n\r"); /* upgrade level 1 */ if( ch->pcdata->upgradeL == 0 ) { ch->pcdata->permTstr = ch->perm_str; ch->pcdata->permTspd = ch->perm_dex; ch->pcdata->permTint = ch->perm_int; ch->pcdata->permTcon = ch->perm_con; ch->pcdata->upgradeL = CURRENT_UPGRADE_LEVEL; ch->pcdata->xTrain = 0; ch->pcdata->total_xTrain = 0; ch->pcdata->upgradeL = 1; } if( ch->pcdata->upgradeL == 1 ) { ch->pcdata->orignaleyes = ch->pcdata->eyes; ch->pcdata->orignalhaircolor = ch->pcdata->haircolor; ch->pcdata->upgradeL = 2; } if( ch->pcdata->upgradeL == 2 ) { ch->pcdata->auraColorPowerUp = -1; ch->pcdata->upgradeL = 3; } if( ch->pcdata->upgradeL == 3 ) { pager_printf( ch, "Unauthorizing Bio. Please see 'help bio' for" " new guidelines.\n\r" ); xREMOVE_BIT( ch->act, PLR_CAN_CHAT ); ch->pcdata->upgradeL = 4; } if( ch->pcdata->upgradeL == 4 ) { if( ch->pcdata->learned[gsn_bbk] > 0 ) { pager_printf( ch, "Removing Big Bang Kamehameha from your ability list.\n\r" ); if( ch->pcdata->learned[gsn_big_bang] < ch->pcdata->learned[gsn_bbk] ) { pager_printf( ch, "Converting Big Bang Kamehameha learned to Big Bang.\n\r" ); ch->pcdata->learned[gsn_big_bang] = ch->pcdata->learned[gsn_bbk]; } ch->pcdata->learned[gsn_bbk] = 0; } ch->pcdata->upgradeL = 5; } if( ch->pcdata->upgradeL == 5 ) { if( ch->pcdata->learned[gsn_preservation] > 0 && ch->pcdata->learned[gsn_preservation] < 95 ) { pager_printf( ch, "Increasing learned percent of Preservation.\n\r" ); ch->pcdata->learned[gsn_preservation] = 95; } if( ch->pcdata->learned[gsn_self_destruct] > 0 && ch->pcdata->learned[gsn_self_destruct] < 95 ) { pager_printf( ch, "Increasing program competency of Self Destruct.\n\r" ); ch->pcdata->learned[gsn_self_destruct] = 95; } ch->pcdata->upgradeL = 6; } if (ch->pcdata->upgradeL == 6) { OBJ_DATA *obj; // i felt like doing a zeni wipe and clearing out death certificates -Goku ch->gold = 0; for ( obj = ch->first_carrying; obj; obj = obj->next_content ) { if (obj->pIndexData->vnum == 610) { separate_obj(obj); extract_obj( obj ); } } ch->pcdata->upgradeL = 7; } if (ch->pcdata->upgradeL == 7) { if( is_leader( ch ) ) { ch->pcdata->clanRank = 2; if( !str_cmp( ch->pcdata->clan->leader1, ch->name ) ) ch->pcdata->clanRank = 1; } ch->pcdata->upgradeL = 8; pager_printf( ch, "Updating clan rank.\n\r" ); } if( ch->pcdata->upgradeL == 8 ) { for( obj = ch->last_carrying; obj; obj = obj->prev_content ) { if( obj->pIndexData->vnum == 50001 ) { obj->value[4] = obj->pIndexData->value[4]; obj->value[5] = obj->pIndexData->value[5]; pager_printf( ch, "Updating mecha-synth...\n\r" ); } } ch->pcdata->upgradeL = 9; } if( ch->pcdata->upgradeL == 9 ) { if( ch->pcdata->clan_name && !str_cmp( ch->pcdata->clan_name, "Crimson Shadow" ) ) { strcpy( ch->pcdata->clan_name, "" ); ch->pcdata->clan = NULL; } pager_printf( ch, "All Crimson Shadow members have been outcasted.\n\r" ); ch->pcdata->upgradeL = 10; } if (ch ->pcdata->upgradeL == 10 ) { if( ch->pcdata->sparcount != 0) ch->pcdata->sparcount = 0; ch->pcdata->upgradeL = 11; } if (ch ->pcdata->upgradeL == 11 ) { if( ch->pcdata->sparcount != 0) ch->pcdata->sparcount = 0; ch->pcdata->upgradeL = 12; } if (ch->pcdata->upgradeL == 12) { if( is_leader( ch ) ) { ch->pcdata->clanRank = 2; if( ch->sex == SEX_FEMALE ) ch->pcdata->clan->fRank2Count += 1; else ch->pcdata->clan->mRank2Count += 1; ch->pcdata->clan->members += 1; } if( ch->pcdata->clan ) { if( !str_cmp( ch->pcdata->clan->leader1, ch->name ) ) { ch->pcdata->clanRank = 1; if( ch->sex == SEX_FEMALE ) { ch->pcdata->clan->fRank2Count -= 1; ch->pcdata->clan->fRank1Count += 1; } else { ch->pcdata->clan->mRank2Count -= 1; ch->pcdata->clan->mRank1Count += 1; } ch->pcdata->clan->members += 1; } } if( ch->pcdata->clan && !is_leader( ch ) ) { ch->pcdata->clanRank = 7; if( ch->sex == SEX_FEMALE ) ch->pcdata->clan->fRank7Count += 1; else ch->pcdata->clan->mRank7Count += 1; ch->pcdata->clan->members += 1; } ch->pcdata->upgradeL = 13; pager_printf( ch, "Updating clan structure.\n\r" ); } if (ch->pcdata->upgradeL == 13) { char *pwdnew; pwdnew = sha256_crypt( ch->pcdata->pwd ); DISPOSE( ch->pcdata->pwd ); ch->pcdata->pwd = str_dup( pwdnew ); pager_printf( ch, "Password encrypted.\n\r" ); ch->pcdata->upgradeL = 14; } if (ch->pcdata->upgradeL == 14 ) { OBJ_DATA *obj, *obj_next; OBJ_DATA *cobj, *cobj_next; for( obj = ch->first_carrying; obj != NULL ; obj = obj_next ) { obj_next = obj->next_content; if ( obj->item_type == ITEM_CONTAINER ) { for( cobj = obj->first_content; cobj != NULL ; cobj = cobj_next ) { cobj_next = cobj->next_content; if( cobj->pIndexData->vnum == 100333 ) { if( IS_OBJ_STAT(cobj, ITEM_ANTI_NEUTRAL) ) { pager_printf( ch, "Anti-neutral Back to the Wall found in your inventory.\n\r"); pager_printf( ch, "Stripping anti-neutral flag.\n\r"); xTOGGLE_BIT(cobj->extra_flags, ITEM_ANTI_NEUTRAL); } } else if( cobj->pIndexData->vnum == 100335 ) { if( IS_OBJ_STAT(cobj, ITEM_ANTI_NEUTRAL) ) { pager_printf( ch, "Anti-neutral Touch found in your inventory.\n\r"); pager_printf( ch, "Stripping anti-neutral flag.\n\r"); xTOGGLE_BIT(cobj->extra_flags, ITEM_ANTI_NEUTRAL); } } else if( cobj->pIndexData->vnum == 100336 ) { if( IS_OBJ_STAT(cobj, ITEM_ANTI_NEUTRAL) ) { pager_printf( ch, "Anti-neutral Matrix of Leadership found in your inventory.\n\r"); pager_printf( ch, "Stripping anti-neutral flag.\n\r"); xTOGGLE_BIT(cobj->extra_flags, ITEM_ANTI_NEUTRAL); } } } } if( obj->pIndexData->vnum == 100333 ) { if( IS_OBJ_STAT(obj, ITEM_ANTI_NEUTRAL) ) { pager_printf( ch, "Anti-neutral Back to the Wall found in your inventory.\n\r"); pager_printf( ch, "Stripping anti-neutral flag.\n\r"); xTOGGLE_BIT(obj->extra_flags, ITEM_ANTI_NEUTRAL); } } else if( obj->pIndexData->vnum == 100335 ) { if( IS_OBJ_STAT(obj, ITEM_ANTI_NEUTRAL) ) { pager_printf( ch, "Anti-neutral Touch found in your inventory.\n\r"); pager_printf( ch, "Stripping anti-neutral flag.\n\r"); xTOGGLE_BIT(obj->extra_flags, ITEM_ANTI_NEUTRAL); } } else if( obj->pIndexData->vnum == 100336 ) { if( IS_OBJ_STAT(obj, ITEM_ANTI_NEUTRAL) ) { pager_printf( ch, "Anti-neutral Matrix of Leadership found in your inventory.\n\r"); pager_printf( ch, "Stripping anti-neutral flag.\n\r"); xTOGGLE_BIT(obj->extra_flags, ITEM_ANTI_NEUTRAL); } } } pager_printf( ch, "Snake way equipment updated successfully.\n\r"); ch->pcdata->upgradeL = 15; } if (ch->pcdata->upgradeL == 15 ) { ch->pcdata->auraColorPowerUp = 0; pager_printf( ch, "Your aura color has been reset to the default.\n\r"); pager_printf( ch, "You must set your aura again using the AURA command.\n\r"); ch->pcdata->upgradeL = 16; } if (ch->pcdata->upgradeL == 16 ) { OBJ_DATA *obj, *obj_next; OBJ_DATA *cobj, *cobj_next; for( obj = ch->first_carrying; obj != NULL ; obj = obj_next ) { obj_next = obj->next_content; if ( obj->item_type == ITEM_CONTAINER ) { for( cobj = obj->first_content; cobj != NULL ; cobj = cobj_next ) { cobj_next = cobj->next_content; if( cobj->pIndexData->vnum == 100333 ) { if( !IS_OBJ_STAT(cobj, ITEM_ANTI_NEUTRAL) ) { pager_printf( ch, "Back to the Wall found in your inventory.\n\r"); pager_printf( ch, "Re-adding anti-neutral flag.\n\r"); xTOGGLE_BIT(cobj->extra_flags, ITEM_ANTI_NEUTRAL); } } else if( cobj->pIndexData->vnum == 100335 ) { if( !IS_OBJ_STAT(cobj, ITEM_ANTI_NEUTRAL) ) { pager_printf( ch, "Touch found in your inventory.\n\r"); pager_printf( ch, "Re-adding anti-neutral flag.\n\r"); xTOGGLE_BIT(cobj->extra_flags, ITEM_ANTI_NEUTRAL); } } else if( cobj->pIndexData->vnum == 100336 ) { if( !IS_OBJ_STAT(cobj, ITEM_ANTI_NEUTRAL) ) { pager_printf( ch, "Matrix of Leadership found in your inventory.\n\r"); pager_printf( ch, "Re-adding anti-neutral flag.\n\r"); xTOGGLE_BIT(cobj->extra_flags, ITEM_ANTI_NEUTRAL); } } } } if( obj->pIndexData->vnum == 100333 ) { if( !IS_OBJ_STAT(obj, ITEM_ANTI_NEUTRAL) ) { pager_printf( ch, "Back to the Wall found in your inventory.\n\r"); pager_printf( ch, "Re-adding anti-neutral flag.\n\r"); xTOGGLE_BIT(obj->extra_flags, ITEM_ANTI_NEUTRAL); } } else if( obj->pIndexData->vnum == 100335 ) { if( !IS_OBJ_STAT(obj, ITEM_ANTI_NEUTRAL) ) { pager_printf( ch, "Touch found in your inventory.\n\r"); pager_printf( ch, "Re-adding anti-neutral flag.\n\r"); xTOGGLE_BIT(obj->extra_flags, ITEM_ANTI_NEUTRAL); } } else if( obj->pIndexData->vnum == 100336 ) { if( !IS_OBJ_STAT(obj, ITEM_ANTI_NEUTRAL) ) { pager_printf( ch, "Matrix of Leadership found in your inventory.\n\r"); pager_printf( ch, "Re-adding anti-neutral flag.\n\r"); xTOGGLE_BIT(obj->extra_flags, ITEM_ANTI_NEUTRAL); } } } pager_printf( ch, "Snake way equipment updated successfully.\n\r"); ch->pcdata->upgradeL = 17; } if( ch->pcdata->upgradeL == 17 ) { if( ch->kairank > 0 ) { pager_printf( ch, "&RKaioshin rank update: Stripping you of your rank.&D\n\r"); ch->kairank = 0; } if( ch->demonrank > 0 ) { pager_printf( ch, "&RDemon rank update: Stripping you of your rank.&D\n\r"); ch->demonrank = 0; } pager_printf( ch, "Kaioshin and Demon ranks updated successfully.\n\r"); ch->pcdata->upgradeL = 18; } // Run it every time, we want these weighted gains fixed // if( ch->pcdata->upgradeL == 16 ) /* { for ( obj = ch->first_carrying; obj; obj = obj->next_content ) { if( obj->pIndexData->item_type == ITEM_ARMOR ) { obj->value[3] = obj->pIndexData->value[3]; } } pager_printf( ch, "Items updated.\n\r" ); } */ pager_printf(ch, "Saving updated player data...\n\r"); save_char_obj(ch); pager_printf(ch, "Saved.\n\r"); return TRUE; } int race_lookup( const char *name ) { int race; for( race = 0; race_table[race]->race_name != NULL; race ++ ) { if( !strcasecmp( name, race_table[race]->race_name ) ) return race; } return 0; } int class_lookup( const char *name ) { int class; for( class = 0; class_table[class]->who_name != NULL; class ++ ) { if( !strcasecmp( name, class_table[class]->who_name ) ) return class; } return 0; } void do_check_ld( CHAR_DATA *ch, char *argument ) { char buf[MAX_STRING_LENGTH]; CHAR_DATA *wch; int count = 0; if( IS_NPC( ch ) ) { send_to_char( "Sorry, not for mobiles.\n\r", ch ); return; } sprintf( buf, "\n\rLink-Dead Player" ); strcat( buf, "\n\r----------------" ); strcat( buf, "\n\r" ); send_to_pager( buf, ch ); for( wch = first_char; wch; wch = wch->next ) { if( !wch->desc && !IS_NPC( wch ) ) { sprintf( buf, "%s", wch->name ); strcat( buf, "\n\r" ); send_to_pager( buf, ch ); count++; } } sprintf( buf, "\n\rTotal Found: %d\n\r", count ); send_to_pager( buf, ch ); } // Added by Saiyr. Used to display clan ranks on the who list. char * get_clan_rank( CHAR_DATA *ch ) { if( IS_NPC( ch ) ) return ""; if( !ch->pcdata->clan ) return ""; if( ch->sex == 1 || ch->sex == 0 ) { if( ch->pcdata->clanRank == 1 ) return ch->pcdata->clan->mRank1; if( ch->pcdata->clanRank == 2 ) return ch->pcdata->clan->mRank2; if( ch->pcdata->clanRank == 3 ) return ch->pcdata->clan->mRank3; if( ch->pcdata->clanRank == 4 ) return ch->pcdata->clan->mRank4; if( ch->pcdata->clanRank == 5 ) return ch->pcdata->clan->mRank5; if( ch->pcdata->clanRank == 6 ) return ch->pcdata->clan->mRank6; if( ch->pcdata->clanRank == 7 ) return ch->pcdata->clan->mRank7; } else { if( ch->pcdata->clanRank == 1 ) return ch->pcdata->clan->fRank1; if( ch->pcdata->clanRank == 2 ) return ch->pcdata->clan->fRank2; if( ch->pcdata->clanRank == 3 ) return ch->pcdata->clan->fRank3; if( ch->pcdata->clanRank == 4 ) return ch->pcdata->clan->fRank4; if( ch->pcdata->clanRank == 5 ) return ch->pcdata->clan->fRank5; if( ch->pcdata->clanRank == 6 ) return ch->pcdata->clan->fRank6; if( ch->pcdata->clanRank == 7 ) return ch->pcdata->clan->fRank7; } return ""; } bool has_phrase( char *searchphrase, char *querystring ) { int maxpos = strlen( querystring ) - strlen( searchphrase ); int positioncounter = 0; int charactercounter = 0; int searchlen = strlen( searchphrase ); bool retval = TRUE; if( strlen( searchphrase ) == strlen( querystring ) ) { if( !strcmp( searchphrase, querystring ) ) return TRUE; else return FALSE; } while( positioncounter <= maxpos ) { for( charactercounter = 0; charactercounter < searchlen; charactercounter++ ) { if( searchphrase[charactercounter] != querystring[positioncounter+charactercounter] ) { retval = FALSE; break; } } if( retval == TRUE ) return TRUE; retval = TRUE; positioncounter++; } return FALSE; } void obj_cost_recalc(OBJ_INDEX_DATA *obj) { int cost = 0; AFFECT_DATA *iaf; int mod = 0; switch (obj->item_type) { case ITEM_LIGHT: cost = obj->value[2] * 100; break; case ITEM_WAND: cost = obj->value[2] * 1000; break; case ITEM_WEAPON: cost = obj->value[1] * obj->value[2] * 1000; break; case ITEM_ARMOR: cost = obj->value[5] * 100; break; case ITEM_CONTAINER: cost = obj->value[0] * 20; break; case ITEM_SCOUTER: cost = obj->cost * 10; break; } for( iaf = obj->first_affect; iaf; iaf = iaf->next ) { if (!iaf) break; if (iaf->location == APPLY_STR || iaf->location == APPLY_DEX || iaf->location == APPLY_INT || iaf->location == APPLY_CON) mod += iaf->modifier * 2500; else if (iaf->location == APPLY_LCK) mod += iaf->modifier * 5000; else if (iaf->location == APPLY_ALLSTATS) mod += iaf->modifier * 10000; else if (iaf->location == APPLY_MANA) mod += iaf->modifier * 500; else mod += iaf->modifier * 1000; } obj->cost = cost+mod; return; } void do_gokus_super_building_command(CHAR_DATA *ch, char *argument) { pager_printf(ch, "Goku doesn't build silly person.\n\r"); /* int vnum; OBJ_INDEX_DATA *obj; AREA_DATA *tarea; for(vnum = 1; vnum < 150299; vnum++) { obj = get_obj_index(vnum); if (obj) { obj_cost_recalc(obj); } } for(tarea = first_area; tarea;tarea = tarea->next) { fold_area( tarea, tarea->filename, FALSE ); } */ /* int vnum; int mobv; int level = 0; bool goodLevel = FALSE; AREA_DATA *area; ROOM_INDEX_DATA *location; location = get_room_index(6000); area = location->area; for(vnum = 6600; vnum < 8000; vnum++) { if (vnum % 100 == 0) { if (!goodLevel) { goodLevel = TRUE; mobv = 6003+level; } else { goodLevel = FALSE; mobv = 6010+level; level++; } } bug("M 1 %d 1 %d", mobv, vnum); // add_reset(area,'M',1,mobv,1,vnum); } */ /* int vnum; MOB_INDEX_DATA *mob; OBJ_INDEX_DATA *obj; ROOM_INDEX_DATA *location; for(vnum = 6000; vnum < 8000; vnum++) { mob = get_mob_index(vnum); if (mob) xSET_BIT(mob->act, ACT_PROTOTYPE); obj = get_obj_index(vnum); if (obj) xSET_BIT(obj->extra_flags, ITEM_PROTOTYPE); location = get_room_index(vnum); if (location) { xSET_BIT( location->room_flags, ROOM_PROTOTYPE ); xSET_BIT( location->room_flags, ROOM_NO_ASTRAL ); xREMOVE_BIT( location->room_flags, ROOM_NO_MOB ); location->sector_type = SECT_INSIDE; } } */ /* int roomLocX = 1; int roomLocY = 1; char roomLocYchar[MAX_STRING_LENGTH]; int vnum; int level = 0; bool goodLevel = FALSE; ROOM_INDEX_DATA *location; EXIT_DATA *xit; char buf[MAX_STRING_LENGTH]; char roomDesc1[MAX_STRING_LENGTH]; char roomDesc2[MAX_STRING_LENGTH]; char roomDesc3[MAX_STRING_LENGTH]; char roomDesc4[MAX_STRING_LENGTH]; sprintf(roomLocYchar, "XABCDEFGHIJ"); strcpy(roomDesc1, "A soft yet brilliant light emanates, seemingly from nowhere, keeping this\n\rbattle arena well lit. Deep black tiles with a dull grey edging line the\n\rfloor and ceiling to absorb excess energy when needed. These protect this\n\rstar base from stray ki blasts and serves as a supplementary power source\n\rfor such a gigantic outpost at the center of the universe.\n\r"); strcpy(roomDesc2, "A soft yet brilliant light emanates, seemingly from nowhere, keeping this\n\rbattle arena well lit. Deep black tiles with a dull grey edging line the\n\rfloor, ceiling and walls to absorb excess energy when needed. These\n\rprotect this star base from stray ki blasts and serves as a supplementary\n\rpower source for such a gigantic outpost at the center of the universe.\n\r"); strcpy(roomDesc3, "A deep red glow fills the area illuminating the battle arena with a dark,\n\runsettling presence. Deep black tiles with a dull grey edging line the\n\rfloor and ceiling to absorb excess energy when needed. These protect this\n\rstar base from stray ki blasts and serves as a supplementary power source\n\rfor such a gigantic outpost at the center of the universe.\n\r"); strcpy(roomDesc4, "A deep red glow fills the area illuminating the battle arena with a dark,\n\runsettling presence. Deep black tiles with a dull grey edging line the\n\rfloor, ceiling and walls to absorb excess energy when needed. These\n\rprotect this star base from stray ki blasts and serves as a supplementary\n\rpower source for such a gigantic outpost at the center of the universe.\n\r"); for(vnum = 6600; vnum < 8000; vnum++) { roomLocX++; if (vnum % 100 == 0) { roomLocX = 1; roomLocY = 1; if (!goodLevel) { goodLevel = TRUE; level++; } else goodLevel = FALSE; } if (roomLocX > 10) { roomLocX = 1; roomLocY++; } location = get_room_index(vnum); sprintf(buf, "Battle Arena Level %2.2d [Sector:%c-%d]",level,roomLocYchar[roomLocX],roomLocY); STRFREE( location->name ); location->name = STRALLOC( buf ); STRFREE( location->description ); if (roomLocX == 1 || roomLocX == 10 || roomLocY == 1 || roomLocY == 10) { if (goodLevel) location->description = STRALLOC( roomDesc2 ); else location->description = STRALLOC( roomDesc4 ); } else { if (goodLevel) location->description = STRALLOC( roomDesc1 ); else location->description = STRALLOC( roomDesc3 ); } if (roomLocX - 1 >= 1) { xit = make_exit( location, get_room_index(vnum-1), DIR_WEST ); xit->keyword = STRALLOC( "" ); xit->description = STRALLOC( "" ); xit->key = -1; xit->exit_info = 0; } if (roomLocX + 1 <= 10) { xit = make_exit( location, get_room_index(vnum+1), DIR_EAST ); xit->keyword = STRALLOC( "" ); xit->description = STRALLOC( "" ); xit->key = -1; xit->exit_info = 0; } if (roomLocY - 1 >= 1) { xit = make_exit( location, get_room_index(vnum-10), DIR_NORTH ); xit->keyword = STRALLOC( "" ); xit->description = STRALLOC( "" ); xit->key = -1; xit->exit_info = 0; } if (roomLocY + 1 <= 10) { xit = make_exit( location, get_room_index(vnum+10), DIR_SOUTH ); xit->keyword = STRALLOC( "" ); xit->description = STRALLOC( "" ); xit->key = -1; xit->exit_info = 0; } xSET_BIT( location->room_flags, ROOM_NO_ASTRAL ); } */ /* flags: ROOM_INDOORS, ROOM_NO_ASTRAL, no mob xTOGGLE_BIT( location->room_flags, value ); sector: SECT_INSIDE location->sector_type = atoi( argument ); */ return; }