#include <sys/types.h>
#include <ctype.h>
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include "mud.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;
// 20% pl gain mod cap
return URANGE( 0, plMod, 0.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( is_genie( ch ) )
adjust_hiscore_ld( "plgenie", ch, ch->exp );
if( is_saibaman( ch ) )
adjust_hiscore_ld( "plsaibaman", 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 *scanned_pl_color( CHAR_DATA * ch )
{
/*
CHAR_DATA *victim;
long double diff;
if( !IS_NPC( victim ) )
diff = ( long double )victim->pl / ch->pl * 10;
else
diff = ( long double )victim->exp / ch->pl * 10;
if( diff < 6 )
return ( "&C" );
else if( diff <= 9 && diff > 6 )
return ( "&c" );
else if( diff <= 20 && diff > 9 )
return ( "&w" );
else if( diff <= 40 && diff > 20 )
return ( "&O" );
else if( diff <= 60 && diff > 40 )
return ( "&Y" );
else
return ( "&z" );
*/
return ( "&C" );
}
char *get_pkColor( CHAR_DATA * ch )
{
if( is_kaio( ch ) && ch->rank > 0 )
{
if( ch->rank == 1 )
return ( "&g" );
if( ch->rank == 2 )
return ( "&G" );
if( ch->rank == 3 )
return ( "&B" );
if( ch->rank == 4 )
return ( "&Y" );
if( ch->rank == 5 )
return ( "&W" );
if( ch->rank == 6 )
return ( "&R" );
}
if( is_demon( ch ) && ch->rank > 0 )
{
if( ch->rank == 1 )
return ( "&O" );
if( ch->rank == 2 )
return ( "&r" );
if( ch->rank == 3 )
return ( "&R" );
}
if( is_saiyan( ch ) && ch->rank > 0 )
{
if( ch->rank == 1 )
return ( "&c" );
if( ch->rank == 2 )
return ( "&R" );
if( ch->rank == 3 )
return ( "&z" );
}
if( xIS_SET( ch->act, PLR_PK1 ) )
return ( "&Y" );
if( xIS_SET( ch->act, PLR_PK2 ) || IS_HC( ch ) )
return ( "&R" );
return ( "&G" );
}
/* Moved the IS_HC flag from the bottom to the top -Karn 01.30.05 */
bool can_pk( CHAR_DATA * ch )
{
if( IS_HC( ch ) )
return TRUE;
if( xIS_SET( ch->act, PLR_PK1 ) )
return TRUE;
if( xIS_SET( ch->act, PLR_PK2 ) )
return TRUE;
// if (xIS_SET(ch->act, PLR_HOSTILE))
// return TRUE;
if( xIS_SET( ch->act, PLR_WAR1 ) )
return TRUE;
if( xIS_SET( ch->act, PLR_WAR2 ) )
return TRUE;
return FALSE;
/* :return TRU" only used on chaos day. Remember to comment out "return FALSE"*/
// return TRUE;
}
// 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 consciousness.", ch, NULL, NULL, TO_CHAR );
act( AT_RED, "The powers of $n's Kaioken attack slowly fade as $e loses consciousness.", 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.0085;
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;
}
/* We don't need quick Armor loss... BAD WARREN -Karn 01.29.05
* New Modification for only 80% armor drop not 97.5% -Karn 01.30.05
*/
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 = ( float )armorValue / 1000 * dam;
dam_to_lf = dam - ( ( float )armorValue / 10000 * dam );
dam_to_ac *= 0.15;
if( !IS_NPC( ch ) )
{
if( armorValue > ch->pcdata->natural_ac )
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;
}
char *is_swear( char *word )
{
CENSOR_DATA *cens;
for( cens = first_censor; cens; cens = cens->next )
{
if( cens->word[0] == '*' )
{
if( !str_cmp( cens->word + 1, word ) || !str_infix( cens->word + 1, word ) )
return cens->word + 1;
}
else
{
char *tmp = NULL;
if( !str_cmp( cens->word, word ) )
return cens->word;
if( ( tmp = strcasestr( word, cens->word ) ) != NULL )
{
char tmpbeg = *( tmp - 1 );
char tmpend = *( tmp + strlen( cens->word ) );
if( !isalpha( tmpbeg ) && !isalpha( tmpend ) )
return cens->word;
}
}
}
return NULL;
}
bool ispunc( char c )
{
if( c == '!' || c == '?' || c == '.' || c == ',' )
return TRUE;
else
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 = crypt( ch->pcdata->pwd, ch->name );
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->rank > 0 )
{
pager_printf( ch, "&RRank update: Stripping you of your rank.&D\n\r" );
ch->rank = 0;
}
pager_printf( ch, "Kaioshin, Demon and Saiyan 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" );
}
*/
if( ch->pcdata->upgradeL == 18 )
{
if( ch->pcdata->learned[gsn_namekfuse] > 0 && ch->pcdata->learned[gsn_namekfuse] < 100 )
{
pager_printf( ch, "Increasing learned percent of Namekian Fusion.\n\r" );
ch->pcdata->learned[gsn_namekfuse] = 100;
}
ch->pcdata->upgradeL = 18;
}
if( ch->pcdata->upgradeL == 19 )
{
if( ch->pcdata->learned[gsn_fusiondance] > 0 && ch->pcdata->learned[gsn_fusiondance] < 100 )
{
pager_printf( ch, "Increasing learned percent on Fusion Dance\n\r" );
ch->pcdata->learned[gsn_fusiondance] = 100;
}
ch->pcdata->upgradeL = 19;
}
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 do_ss( CHAR_DATA * ch, char *argument )
{
if( is_saiyan( ch ) || is_hb( ch ) )
{
set_char_color( AT_RED, ch );
send_to_char( "If you want to use SSJ, you have to spell it out.\n\r", ch );
return;
}
send_to_char( "Huh?!?\n\r", ch );
return;
}
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;
}
char *strcasestr( register char *s, register char *find )
{
register char c, sc;
register size_t len;
if( ( c = *find++ ) != 0 )
{
len = strlen( find );
do
{
do
{
if( ( sc = *s++ ) == 0 )
return ( NULL );
}
while( sc != c );
}
while( strncasecmp( s, find, len ) != 0 );
s--;
}
return ( ( char * )s );
}