/* This file is the Clan-Skills of the PK Clan DarkSide && Renshai */
/* Copyright 2000, Gabe Volker */
/* To be used only on Asgardian Nightmare unless permission is granted */
#if defined( macintosh )
#include <types.h>
#include <time.h>
#else
#include <sys/types.h>
#include <errno.h>
#include <unistd.h>
#include <sys/time.h>
#endif
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include "merc.h"
#include "clan.h"
#include "magic.h"
DECLARE_DO_FUN( do_announce );
int focus_dam args ((CHAR_DATA *ch));
int focus_hit args ((CHAR_DATA *ch));
int focus_ac args ((CHAR_DATA *ch));
void do_battle_fury(CHAR_DATA *ch, char *argument)
{
int chance, hp_percent;
int sn;
if ((chance = get_skill (ch, gsn_battle_fury)) == 0
|| !has_skill(ch,gsn_battle_fury))
{
send_to_char ("{.You do not know how to battlefury.{x\n\r", ch);
return;
}
if (is_affected (ch, gsn_battle_fury))
{
send_to_char ("{.You are already embracing the fury of the DarkSide.{x\n\r", ch);
return;
}
if (IS_AFFECTED (ch, AFF_CALM))
{
send_to_char ("{.You're feeling too mellow to battlefury.{x\n\r", ch);
return;
}
if (ch->mana < 100)
{
send_to_char ("{.You can't get up enough energy.{x\n\r", ch);
return;
}
/* modifiers */
/* fighting */
if (ch->position == POS_FIGHTING)
chance += 10;
/* damage -- below 50% of hp helps, above hurts */
hp_percent = 100 * ch->hit / ch->max_hit;
chance += 25 - hp_percent / 2;
if (number_percent () < chance)
{
AFFECT_DATA af;
WAIT_STATE (ch, PULSE_VIOLENCE);
ch->mana -= 150;
ch->move = UMAX(1,ch->move - 50);
/* heal a little damage */
ch->hit += ch->level * 4;
ch->hit = UMIN (ch->hit, ch->max_hit);
send_to_char ("{.Your eyes invert for a moment as you are consumed by {rfury!{x\n\r", ch);
act ("{($n gets a {cw{gi{rc{yk{ce{gd{k look in $s eyes.{x", ch, NULL, NULL, TO_ROOM);
check_improve (ch, gsn_battle_fury, TRUE, 2);
af.where = TO_AFFECTS;
af.type = gsn_battle_fury;
af.level = ch->level;
af.duration = number_fuzzy (ch->level / 10);
af.bitvector = 0;
af.location = APPLY_DAMROLL;
af.modifier = UMAX (1, ch->level / 4);
affect_to_char (ch, &af);
if(!IS_SHIELDED(ch,SHD_STEEL))
{
sn = skill_lookup("steel flesh");
af.where = TO_SHIELDS;
af.type = sn;
af.level = ch->level;
af.duration = ch->level/2;
af.location = APPLY_AC;
af.modifier = UMAX (10, 5 * (ch->level / 20)) * (-1);
af.bitvector = SHD_STEEL;
affect_to_char (ch, &af);
send_to_char("Your skin hardens into steel-like material.\n\r",ch);
}
}
else
{
WAIT_STATE (ch, 2 * PULSE_VIOLENCE);
ch->mana -= 25;
ch->move = UMAX(1,ch->move-75);
send_to_char ("{.Your pulse speeds up, but nothing happens.{x\n\r", ch);
check_improve (ch, gsn_battle_fury, FALSE, 2);
}
}
/* Renshai Clan Skills */
/* BattleCry that channels' godly force at opponents */
void do_modis_anger(CHAR_DATA *ch, char *argument)
{
if(ch->clan != clan_lookup("storm"))
{
send_to_char("Huh?\n\r",ch);
return;
}
if (is_affected (ch, gsn_modis_anger))
{
send_to_char ("{.Your anger begins to subside.{x\n\r",ch);
affect_strip(ch,gsn_modis_anger);
return;
}
if (number_percent () )
{
AFFECT_DATA af;
send_to_char ("{.You release your stored energy and bellow a mighty battlecry!{x\n\r",ch);
send_to_char ("{.You feel the {!Wrath {xof {DShadows{x enter your body!{x\n\r", ch);
act ("{($n bellows a mighty battlecry and begins frothing at the mouth.{x", ch, NULL, NULL, TO_ROOM);
act ("{($n's eyes turn blood red.{x", ch, NULL, NULL, TO_ROOM);
/* check_improve (ch, gsn_modis_anger, TRUE, 2); */
af.where = TO_AFFECTS;
af.type = gsn_modis_anger;
af.level = ch->level;
af.duration = -1;
af.bitvector = 0;
af.location = APPLY_DAMROLL;
af.modifier = 5;
affect_to_char (ch, &af);
}
return;
}
/* Increased Accuracy resulting in Double Strike */
void do_concentration(CHAR_DATA *ch, char *argument)
{
int chance;
if ((chance = get_skill (ch, gsn_concentration)) == 0
|| !has_skill(ch,gsn_concentration))
{
send_to_char ("{.You know not the way of the Rensahi.{x\n\r", ch);
return;
}
if (is_affected (ch, gsn_concentration))
{
send_to_char ("{.You are already concentrating on your accuracy!{x\n\r", ch);
return;
}
if( ch->move < 251 )
{
send_to_char("You do not have the stamina to do this. Gather your energy.\n\r",ch);
return;
}
if (is_affected (ch, gsn_modis_anger))
{
send_to_char("{.Your anger fades, you start to cool down.{x\n\r",ch);
affect_strip(ch, gsn_modis_anger);
}
if (number_percent () < chance)
{
AFFECT_DATA af;
WAIT_STATE (ch, PULSE_VIOLENCE);
ch->move -= 250;
send_to_char ("{.You concentrate on the determination of Modi and your aim improves!{x\n\r", ch);
act ("{($n's eyes turn light blue with white steaks.{x", ch, NULL, NULL, TO_ROOM);
/* check_improve (ch, gsn_concentration, TRUE, 2); */
af.where = TO_AFFECTS;
af.type = gsn_concentration;
af.level = ch->level;
af.duration = -1;
af.bitvector = 0;
af.location = APPLY_HITROLL;
af.modifier = UMAX (1, ch->level / 3);
affect_to_char (ch, &af);
}
return;
}
void do_calm(CHAR_DATA *ch, char *argument)
{
/* Tien
if(ch->clan != clan_lookup("renshai"))
{
send_to_char("Huh?\n\r",ch);
return;
}
*/
if (is_affected (ch, gsn_concentration))
{
send_to_char("{.Your concentration fades, your temperature starts to rise.{x\n\r",ch);
affect_strip(ch, gsn_concentration);
return;
}
if (is_affected (ch, gsn_modis_anger))
{
send_to_char("{.Your anger fades, you start to cool down.{x\n\r",ch);
affect_strip(ch, gsn_modis_anger);
return;
}
send_to_char("{.You feel cool and collected.{x\n\r",ch);
return;
}
void do_faith(CHAR_DATA *ch, char *argument)
{
CHAR_DATA *victim;
int chance = 0;
int dam;
char arg[MSL];
one_argument (argument, arg);
if ((chance = get_skill (ch, gsn_blind_faith)) == 0
|| !has_skill(ch,gsn_blind_faith))
{
send_to_char ("{!You do not have enough {&faith!{x\n\r", ch);
return;
}
if (arg[0] == '\0')
victim = ch->fighting;
else
victim = get_char_room(ch,arg);
if (victim == NULL)
{
send_to_char("They aren't here.\n\r",ch);
return;
}
if (victim == ch)
{
send_to_char ("You know how much faith you have!\n\r", ch);
return;
}
if (is_safe(ch, victim))
return;
if (IS_AFFECTED(ch,AFF_CHARM) && ch->master == victim)
{
act("$N is your beloved master.",ch,NULL,victim,TO_CHAR);
return;
}
chance = get_skill(ch,gsn_blind_faith);
if (number_percent() <= chance)
{
if (ch->pcdata->tier == 1)
dam = dice( ch->level, 10 );
else if (ch->pcdata->tier == 2)
dam = dice( ch->level*2, 12 );
else
dam = dice( ch->level*3, 13 );
if (ch->mana < 50)
ch->hit -= 50;
else
ch->mana -= 50;
if (victim != ch)
{
act("$n utters words of his faith, suddenly the room erupts in blinding light!\n\r",
ch,NULL,NULL,TO_ROOM);
send_to_char("You call upon your faith and suddenly the room erupts in blinding light.\n\r",ch);
}
if ( ( ch->fighting == NULL )
&& ( !IS_NPC( ch ) )
&& ( !IS_NPC( victim ) ) )
{
ch->attacker = TRUE;
victim->attacker = FALSE;
}
if ( saves_spell( ch->level, victim, DAM_HOLY) )
dam *= 0.75;
damage( ch, victim, dam, gsn_blind_faith, DAM_LIGHT , TRUE, 0);
spell_blindness(gsn_blindness, 3 * ch->level / 2, ch, (void *) victim,TARGET_CHAR);
WAIT_STATE (ch, PULSE_VIOLENCE);
}
else
{
send_to_char("You lose faith momentarily and feel slightly weaker.\n\r",ch);
act("$n utters words of his faith, but falters and nothing happens.\n\r",
ch,NULL,NULL,TO_ROOM);
if (ch->mana < 25)
ch->hit -= 25;
else
ch->mana -= 25;
WAIT_STATE (ch, PULSE_VIOLENCE);
}
}
// void do_crit_strike(CHAR_DATA *ch, char *argument)
//{
// int chance;
//
// if ((chance = get_skill (ch, gsn_crit_strike)) == 0
// || !has_skill(ch,gsn_crit_strike))
// {
// send_to_char ("{.You know not the way of the Storm.{x\n\r", ch);
// return;
// }
// if (is_affected (ch, gsn_crit_strike))
// {
// send_to_char ("{.Your fury begins to subside.{x\n\r", ch);
// affect_strip(ch, gsn_crit_strike);
// return;
// }
//
// if( ch->mana < 100 )
// {
// send_to_char("You do not have the willpower to do this. Gather your energy.\n\r",ch);
// return;
// }
//
// if (is_affected (ch, gsn_crit_strike))
// {
// send_to_char("{.Your fury begins to subside.{x\n\r",ch);
// affect_strip(ch, gsn_crit_strike);
// }
//
// if (number_percent () < chance)
// {
// AFFECT_DATA af;
//
// WAIT_STATE (ch, PULSE_VIOLENCE);
// ch->mana -= 100;
//
// send_to_char ("{.You focus on crital striking!{x\n\r",ch);
// send_to_char ("{.You feel the {!Wrath {xof The {&Storm{x enter your body!{x\n\r", ch);
// act ("{($n concentration increases{x", ch, NULL, NULL, TO_ROOM);
// act ("{($n's eyes turn into shadows.{x", ch, NULL, NULL, TO_ROOM);
//
// /* check_improve (ch, gsn_crit_strike, TRUE, 2); */
//
// af.where = TO_AFFECTS;
// af.type = gsn_crit_strike;
// af.level = ch->level;
// af.duration = -1;
// af.bitvector = 0;
//
// af.location = APPLY_DAMROLL;
// af.modifier = UMAX (1, ch->level / 5);
// affect_to_char (ch, &af);
// }
//
// return;
//}
/** Alliance clanskill removed - Quintalis 9-28-04 **
int alliance_damroll(CHAR_DATA *ch)
{
int damroll;
int dam;
damroll = 0;
if (IS_NPC(ch)
|| ch->clan != clan_lookup("alliance") )
return damroll;
dam = ch->damroll;
dam += str_app[get_curr_stat(ch,STAT_STR)].todam;
dam += focus_dam(ch);
if (IS_CRUSADER(ch))
dam += (ch->alignment*ch->level)/2000;
if (ch->class == CLASS_MONK)
dam += ch->pcdata->power[0]/10+ch->pcdata->power[1]/10;
if (ch->fighting == NULL)
damroll = dam/20;
else if (IS_NPC(ch->fighting))
damroll = dam/20;
else if (IN_ARENA(ch))
damroll = dam/20;
else if (number_on(ch->clan) == number_on(ch->fighting->clan))
damroll = dam/8;
else if (number_on(ch->clan)+1 < number_on(ch->fighting->clan))
damroll = dam/4;
else if (number_on(ch->clan) < number_on(ch->fighting->clan))
damroll = dam/6;
else
damroll = dam/20;
if (damroll < 0)
damroll = (damroll*damroll)/2;
return damroll;
}
int alliance_hitroll(CHAR_DATA *ch)
{
int hitroll;
int hit;
hitroll = 0;
if (IS_NPC(ch)
|| ch->clan != clan_lookup("alliance") )
return hitroll;
hit = ch->hitroll;
hit += str_app[get_curr_stat(ch,STAT_STR)].tohit;
hit += focus_hit(ch);
if (IS_CRUSADER(ch))
hit += (ch->alignment*ch->level)/2000;
if (ch->fighting == NULL)
hitroll = hit/20;
else if (IS_NPC(ch->fighting))
hitroll = hit/20;
else if (IN_ARENA(ch))
hitroll = hit/20;
else if (number_on(ch->clan) == number_on(ch->fighting->clan))
hitroll = hit/8;
else if (number_on(ch->clan)+1 < number_on(ch->fighting->clan))
hitroll = hit/4;
else if (number_on(ch->clan) < number_on(ch->fighting->clan))
hitroll = hit/6;
else
hitroll = hit/20;
if (hitroll < 0)
hitroll = (hitroll*hitroll)/2;
return hitroll;
}
int alliance_ac(CHAR_DATA *ch, int type)
{
int armor;
int ac;
armor = 0;
if (IS_NPC(ch)
|| ch->clan != clan_lookup("alliance") )
return armor;
ac = ch->armor[type];
if (IS_AWAKE(ch))
ac += dex_app[get_curr_stat(ch,STAT_DEX)].defensive;
ac += focus_ac(ch);
if (ch->fighting == NULL)
armor = ac/20;
else if (IS_NPC(ch->fighting))
armor = ac/20;
else if (IN_ARENA(ch))
armor = ac/20;
else if (number_on(ch->clan) == number_on(ch->fighting->clan))
armor = ac/8;
else if (number_on(ch->clan)+1 < number_on(ch->fighting->clan))
armor = ac/4;
else if (number_on(ch->clan) < number_on(ch->fighting->clan))
armor = ac/6;
else
armor = ac/20;
if(armor > 0)
armor = 0-armor;
return armor;
}**/