#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;
// 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 = 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->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;
}