/* Check that mobs yell when you cast a spell at them */
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "emlen.h"
#define CHECK_CHAR(ch) if ( (ch)->data_type==50) return
bool hitop = FALSE;
bool using_weapon = FALSE;
bool using_shield = FALSE;
int ghit_pos = 0;
char reasonfd[30];
void
do_tackle (CHAR_DATA * ch, char *argy)
{
CHAR_DATA *victim;
int chan;
SINGLE_OBJECT *obj;
int xn;
char buf[STD_LENGTH];
DEFINE_COMMAND ("tackle", do_tackle, POSITION_FIGHTING, 0, LOG_NORMAL, "This command makes your character attempt to tackle his/her opponent.")
check_fgt (ch);
/*if (!FIGHTING(ch)) {
send_to_char("You cannot start combat with a kick. Use KILL instead.\n\r",ch);
return;
} */
if (ch->fgt->ears > 9)
{
send_to_char ("You can't tackle this soon after giving or recieving a bash.\n\r", ch);
return;
}
chan = 0;
if (ch->wait > 2)
return;
if (FIGHTING (ch) == NULL)
{
if (argy[0] == '\0' || argy == "")
{
send_to_char ("Tackle who?\n\r", ch);
return;
}
if ((victim = get_char_room (ch, argy)) == NULL)
{
send_to_char ("Tackle who?\n\r", ch);
return;
}
if (victim == ch)
{
send_to_char ("You really do look like an idiot!\n\r", ch);
return;
}
}
else
victim = FIGHTING (ch);
if (RIDING (ch) != NULL)
{
send_to_char ("You can't tackle someone when you are riding!\n\r", ch);
return;
}
if (is_safe (ch, victim))
{
return;
}
if (FIGHTING (ch) != victim)
{
if (!pkill (ch, victim))
return;
check_pkill (ch, victim);
}
if (!can_see (ch, victim))
{
send_to_char ("How can you tackle someone you can't see!?\n\r", ch);
return;
}
if (ch->position == POSITION_BASHED)
{
act ("You are bashed on the ground, how do you expect to tackle!?", ch, NULL, victim, TO_CHAR);
return;
}
if (ch->position == POSITION_GROUNDFIGHTING)
{
act ("You are on the ground; how do you expect to tackle $N?", ch, NULL, victim, TO_CHAR);
return;
}
if (!can_groundfight (victim))
{
act ("You do not want to tackle that kind of creature!", ch, NULL, victim, TO_CHAR);
return;
}
if (victim->position == POSITION_GROUNDFIGHTING)
{
act ("$N is already on the ground, tackled!", ch, NULL, victim, TO_CHAR);
return;
}
check_ced (ch);
check_ced (victim);
if (!(IS_IN_MELEE (ch, victim)))
{
send_to_char ("You are not in the main melee!\n\r", ch);
return;
}
if (!pow.tackle_with_weapon)
{
for (obj = ch->carrying; obj != NULL; obj = obj->next_content)
if (obj->pIndexData->item_type == ITEM_WEAPON && (obj->wear_loc == WEAR_HOLD_1 ||
obj->wear_loc == WEAR_HOLD_2))
{
send_to_char ("You cannot tackle with a weapon in hand!\n\r", ch);
return;
}
}
if (!pow.tackle_person_with_weapon)
{
for (obj = victim->carrying; obj != NULL; obj = obj->next_content)
if (obj->pIndexData->item_type == ITEM_WEAPON && (obj->wear_loc == WEAR_HOLD_1 ||
obj->wear_loc == WEAR_HOLD_2))
{
send_to_char ("Are you CRAZY!? Tackle someone with a weapon!??\n\r", ch);
send_to_char ("You'd surely get whacked on your approach...\n\r", ch);
return;
}
}
#ifndef OLD_FIGHT
if (!ch->fgt || is_fighting_near(ch,victim)==-1) {
send_to_char("You must be next to that opponent to tackle him/her/it.\n\r",ch);
return;
}
if (ch->fgt && ch->fgt->field_ticks>0) {
char bb[500];
sprintf(bb,"tackle %s",argy);
setnext(ch,bb);
return;
}
#endif
if (IS_MOB (ch))
chan = (LEVEL (ch) * 2) + 20;
else
chan = (get_curr_dex (ch) * 3) + (LEVEL (ch) * 2);
chan -= (LEVEL (victim) * 2) + (IS_MOB (victim) ? 15 : 0);
if (chan > 110)
chan = 110;
if (victim->ced && IS_SET (victim->ced->fight_ops, F_GROUND))
xn = 150;
else
xn = 370;
if ((number_range (0, xn) > chan && IS_AWAKE (victim)) || LEVEL (ch) < 12 || LEVEL (victim) < 12)
{
send_to_char ("You miss the tackle and almost fall on the ground!\n\r", ch);
act ("$n tries to tackle you, but almost falls over instead!", ch, NULL, victim, TO_VICT);
act ("$n misses a tackle at $N and almost falls over!", ch, NULL, victim, TO_NOTVICT);
WAIT_STATE (ch, 4 * PULSE_VIOLENCE);
if (FIGHTING (victim) == NULL)
set_fighting (victim, ch);
set_fighting (ch, victim);
return;
}
check_ced (victim);
check_ced (ch);
victim->ced->ground_pos = 0;
ch->ced->ground_pos = 0;
NEW_POSITION(victim, POSITION_GROUNDFIGHTING);
NEW_POSITION(ch, POSITION_GROUNDFIGHTING);
if (RIDING (victim) != NULL)
{
sprintf (buf, "As you jump up and tackle $N, $S flies off of %s and lands hard on the ground!", PERS (RIDING (victim), ch));
act (buf, ch, NULL, victim, TO_CHAR);
sprintf (buf, "$n's flying tackle makes $N fall off of %s. $N lands on his back on the ground.", NAME (RIDING (victim)));
act (buf, ch, NULL, victim, TO_NOTVICT);
sprintf (buf, "You fall off of %s as $n tackles you!", PERS (RIDING (victim), victim));
act (buf, ch, NULL, victim, TO_VICT);
check_fgt (victim->fgt->riding);
victim->fgt->riding->fgt->mounted_by = NULL;
victim->fgt->riding = NULL;
}
else if (RIDING (victim) == NULL)
{
act ("You tackle $N! The fight is taken to the ground!", ch, NULL, victim, TO_CHAR);
act ("$n tackles $N and they both end up on the ground!", ch, NULL, victim, TO_NOTVICT);
act ("$n tackles you! The fight is taken to the ground!", ch, NULL, victim, TO_VICT);
}
set_fighting (ch, victim);
set_fighting (victim, ch);
victim->fgt->fighting = ch;
ch->fgt->fighting = victim;
victim->ced->ground_pos = 0;
ch->ced->ground_pos = 0;
NEW_POSITION(victim, POSITION_GROUNDFIGHTING);
NEW_POSITION(ch, POSITION_GROUNDFIGHTING);
WAIT_STATE (victim, 3 * PULSE_VIOLENCE);
WAIT_STATE (ch, (4 * PULSE_VIOLENCE));
return;
}
void
violence_update (bool flaggy)
{
CHAR_DATA *ch;
CHAR_DATA *ch_next;
CHAR_DATA *victim;
CHAR_DATA *rch;
CHAR_DATA *rch_next;
int posorg;
combat_state++;
if (combat_state == 4)
combat_state = 0;
for (ch = f_first; ch != NULL; ch = ch_next)
{
if (ch->data_type==50) {
fprintf(stderr,"That was it!\n");
remove_from_fighting_list(ch);
return;
}
if (FIGHTING(ch) && FIGHTING(ch)->data_type==50) {
fprintf(stderr,"That was it2!\n");
ch->fgt->fighting=NULL;
return;
}
ch_next = ch->next_fighting;
check_fgt (ch);
if (!ch->in_room)
continue;
if (ch->position == POSITION_FIGHTING && !FIGHTING (ch))
NEW_POSITION(ch, POSITION_STANDING);
if (!flaggy)
{
if (IS_MOB (ch) && IS_SET (ch->pIndexData->act4, ACT4_FASTHUNT) && ch->fgt && ch->fgt->hunting != NULL && FIGHTING (ch) == NULL && ch->move > 5 && ch->position == POSITION_STANDING)
if (number_range (1, 3) == 2 && IS_MOB (ch))
hunt_victim (ch);
if (ch->fgt->ears == 10)
{
ch->fgt->ears = 2;
if (ch->position == POSITION_BASHED)
do_stand (ch, "");
}
else if (ch->fgt->ears > 10)
ch->fgt->ears--;
if (IS_MOB (ch) && FIGHTING (ch) == NULL && (IS_AFFECTED (ch, AFF_CHARM) /*|| (ch->npcdata->hire && ch->npcdata->hire!=NULL) */ ))
{
/* if (ch->npcdata->hire!=NULL && ch->npcdata->hire->fighting!=NULL)
multi_hit(ch,ch->npcdata->hire->fighting, TYPE_UNDEFINED); */
if (IS_AFFECTED (ch, AFF_CHARM) && ch->fgt->master && ch->fgt->master != NULL && (ch->fgt->master->fgt == NULL || ch->fgt->master->fgt->fighting != NULL))
#ifdef OLD_FIGHT
multi_hit (ch, ch->fgt->master->fgt->fighting, TYPE_UNDEFINED);
#else
set_fighting(ch,ch->fgt->master->fgt->fighting);
#endif
}
}
/*End if !flaggy */
if ((victim = FIGHTING (ch)) == NULL) /*Below applies to fighting only */
continue;
if (FIGHTING (victim) == NULL)
{
victim->fgt->fighting = ch;
}
if (IS_AWAKE (ch) && ch->in_room == victim->in_room)
{
if (!flaggy && IS_MOB (ch) && IS_SET (ch->pIndexData->act4, ACT4_MOBSWITCH))
{
CHAR_DATA *cir;
int percent = 100;
int count = -1;
cir = ch->in_room->more->people;
while (cir != NULL)
{
cir = cir->next_in_room;
count++;
}
if (count != 0)
percent = 100 / count;
for (cir = ch->in_room->more->people; cir != NULL; cir = cir->next_in_room)
{
if (FIGHTING (cir) == ch && (number_percent () <= percent) && FIGHTING (ch) != cir)
{
act ("$n turns and attacks $N!", ch, NULL, cir, TO_NOTVICT);
act ("$n turns towards you and attacks!", ch, NULL, cir, TO_CHAR);
set_fighting (ch, cir);
break;
}
}
}
posorg = victim->position;
if (ch->fgt->challenge == 10 && number_range (1, 9) == 2)
{
char bufr[500];
sprintf (bufr, "($B$1Arena$N$7) $B%s: $4%s $7%s: $4%s", NAME (ch), STRING_HITS (ch), NAME (victim), STRING_HITS (victim));
do_arenaecho (ch, bufr, TRUE);
}
if (ch != victim && ch->position == POSITION_GROUNDFIGHTING && victim->position == POSITION_GROUNDFIGHTING)
{
if (!flaggy)
ground_hit (ch, victim, TYPE_UNDEFINED);
}
else if (ch->position != POSITION_CASTING)
{
if (ch->fgt->challenge == 10 && number_range (1, 6) == 2)
{
char buf[500];
int i;
i = number_range (1, 5);
if (i == 1)
sprintf (buf, "($B$1Arena$N$7) $BBlood runs freely as %s and %s exchange blows.", NAME (ch), NAME (victim));
if (i == 2)
sprintf (buf, "($B$1Arena$N$7) $BThe two fighters circle, flailing at each other wildly.");
if (i == 3)
sprintf (buf, "($B$1Arena$N$7) $BPieces of flesh fly everywhere as blows are exchanged.");
if (i == 4)
sprintf (buf, "($B$1Arena$N$7) $B%s lets out a loud warcry before attacking!", NAME (ch));
if (i == 5)
sprintf (buf, "($B$1Arena$N$7) $BYou can almost hear the crunching of bones...");
do_arenaecho (ch, buf, TRUE);
}
if (IS_MOB (ch) && ch->pIndexData && ch->pIndexData->opt)
{
if (number_range (1, 101) < ch->pIndexData->opt->warrior_percent)
{
int cnt = 0;
if (ch->pIndexData->opt->flurries)
cnt++;
if (ch->pIndexData->opt->tackles)
cnt++;
if (ch->pIndexData->opt->kicks)
cnt++;
if (number_range (1, cnt) == 1 && ch->pIndexData->opt->flurries &&
ch->move > 40)
{
do_flurry (ch, "");
}
else if (number_range (1, cnt) == 1 && ch->pIndexData->opt->tackles)
{
do_tackle (ch, "");
}
else if (number_range (1, cnt) == 1 && ch->pIndexData->opt->kicks)
{
do_kick (ch, "");
}
}
else
{
if (number_range (1, 101) < ch->pIndexData->opt->cast_percent)
{
int iil;
int cnt = 0;
for (iil = 0; iil < 10; iil++)
if (ch->pIndexData->opt->cast_spells[iil] != NULL)
cnt++;
for (iil = 0; iil < 10; iil++)
{
if (number_range (1, cnt) == 1 && ch->pIndexData->opt->cast_spells[iil] != NULL)
{
SPELL_DATA *spl;
if ((spl = skill_lookup (ch->pIndexData->opt->cast_spells[iil], -1)) == NULL)
continue;
if (LEVEL (ch) < spl->spell_level)
continue;
if (spl->spell_type == TAR_CHAR_DEFENSIVE ||
spl->spell_type == TAR_CHAR_SELF)
{
general_spell (spl, LEVEL (ch), ch, ch);
}
else
general_spell (spl, LEVEL (ch), ch, victim);
break;
}
}
}
}
}
#ifdef OLD_FIGHT
if (pow.old_attack)
{
multi_hit (ch, victim, TYPE_UNDEFINED);
}
else
#endif
if (!flaggy)
{
if (FIGHTING (ch) && FIGHTING (FIGHTING (ch)) == ch && !ch->fgt->attacker_turn)
continue;
if (FIGHTING (ch) && FIGHTING (FIGHTING (ch)) != ch && number_range (1, 2) == 2)
continue;
#ifdef OLD_FIGHT
multi_hit (ch, victim, TYPE_UNDEFINED);
#endif
}
else
{
/*if (ch->fgt->attacks<2) continue; */
ch->fgt->attacks = 0;
#ifdef OLD_FIGHT
multi_hit (ch, victim, TYPE_UNDEFINED + 20000);
#endif
ch->fgt->attacks = 1;
}
}
if (posorg == POSITION_CASTING && victim->position != POSITION_CASTING)
{
send_to_char ("OUCH! You just lost your concentration!\n\r", victim);
if (IS_PLAYER (victim))
victim->pcdata->tickcounts = 0;
}
}
else
stop_fighting (ch, FALSE);
if ((victim = FIGHTING (ch)) == NULL)
continue;
for (rch = ch->in_room->more->people; rch != NULL; rch = rch_next)
{
rch_next = rch->next_in_room;
if (IS_AWAKE (rch) && FIGHTING (rch) == NULL)
{
if (IS_PLAYER (ch) || IS_AFFECTED (ch, AFF_CHARM))
{
if ((IS_PLAYER (rch) || IS_AFFECTED (rch, AFF_CHARM)) && is_same_group (ch, rch) && IS_SET (rch->pcdata->act2, PLR_ASSIST) && !IN_BATTLE (rch) && !IN_BATTLE (ch) && FIGHTING (ch) != NULL && IS_MOB (FIGHTING (ch)) && rch->position == POSITION_STANDING
&& (!ch->ced || ch->hit > ch->ced->wimpy))
{
act ("You join the fight!", rch, NULL, rch, TO_CHAR);
act ("$n joins the fight!", rch, NULL, rch, TO_ROOM);
#ifdef OLD_FIGHT
multi_hit (rch, victim, TYPE_UNDEFINED);
#endif
set_fighting(rch,victim);
}
continue;
}
if (IS_MOB (rch) && !IS_AFFECTED (rch, AFF_CHARM))
{
if (rch->pIndexData == ch->pIndexData)
{
CHAR_DATA *vch;
CHAR_DATA *target;
int number;
target = NULL;
number = 0;
for (vch = ch->in_room->more->people; vch; vch = vch->next)
{
if (can_see (rch, vch)
&& is_same_group (vch, victim)
&& number_range (0, number) == 0)
{
target = vch;
number++;
}
}
if (target != NULL)
{
if (LEVEL (rch) > 6 && FIGHTING (rch) == NULL && can_see (rch, target))
{
check_fgt (rch);
rch->fgt->fighting = target;
NEW_POSITION(rch, POSITION_FIGHTING);
act ("$n CHARGES into battle!", rch, NULL, NULL, TO_ROOM);
#ifdef OLD_FIGHT
multi_hit (rch, target, TYPE_UNDEFINED);
#else
set_fighting(rch,target);
#endif
}
}
}
}
}
}
}
if (!flaggy && !pow.old_attack)
{
CHAR_DATA *rch_next;
for (rch = f_first; rch != NULL; rch = rch_next)
{
rch_next = rch->next_fighting;
check_fgt (rch);
if (rch->fgt->fighting)
check_fgt (rch->fgt->fighting);
if (FIGHTING (rch) == NULL || (rch->fgt->upd && !rch->fgt->fighting->fgt->upd))
continue;
if (FIGHTING (FIGHTING (rch)) && FIGHTING (FIGHTING (rch)) == rch)
{
rch->fgt->upd = FALSE;
rch->fgt->fighting->fgt->upd = TRUE;
if (rch->fgt->attacker_turn && rch->fgt->fighting->fgt->attacker_turn)
rch->fgt->attacker_turn = FALSE;
else if (!rch->fgt->attacker_turn && !rch->fgt->fighting->fgt->attacker_turn)
rch->fgt->attacker_turn = TRUE;
else if (rch->fgt->attacker_turn)
{
rch->fgt->attacker_turn = FALSE;
rch->fgt->fighting->fgt->attacker_turn = TRUE;
}
else if (!rch->fgt->attacker_turn)
{
rch->fgt->attacker_turn = TRUE;
rch->fgt->fighting->fgt->attacker_turn = FALSE;
}
}
}
}
return;
}
void
do_circle (CHAR_DATA * ch, char *argy)
{
SINGLE_OBJECT *obj;
int dt;
SPELL_DATA *spl;
DEFINE_COMMAND ("circle", do_circle, POSITION_FIGHTING, 0, LOG_NORMAL, "This command allows you to circle behind an opponent (who isn't fighting you), and thrust a dagger in his/her/its back during combat.")
check_fgt (ch);
if ((spl = skill_lookup ("Circle", -1)) == NULL)
{
send_to_char ("Huh?\n\r", ch);
return;
}
if (ch->fgt->ears > 9)
{
send_to_char ("You can't circle this soon after giving or recieving a bash.\n\r", ch);
return;
}
if (IS_MOB (ch))
return;
if (ch->pcdata->tickcounts > 3)
{
send_to_char ("You are off-balance from your last maneuver; you can't circle at the moment.\n\r", ch);
return;
}
if (ch->wait > 1)
return;
if (ch->position != POSITION_FIGHTING)
return;
if (FIGHTING (ch) == NULL)
return;
if (FIGHTING (FIGHTING (ch)) == NULL)
return;
if (FIGHTING (FIGHTING (ch)) == ch)
{
send_to_char ("You can't circle around behind the mob who is fighting you!\n\r", ch);
return;
}
if (ch->pcdata->learned[gsn_circle] < 2)
{
send_to_char ("You do not know how to circle an opponent!\n\r", ch);
return;
}
if ((obj = get_item_held (ch, ITEM_WEAPON)) == NULL)
{
send_to_char ("You need to wield a weapon.\n\r", ch);
return;
}
dt = ((I_WEAPON *) obj->more)->attack_type;
if (attack_table[dt].hit_type != TYPE_PIERCE)
{
send_to_char ("You need to wield a piercing weapon.\n\r", ch);
return;
}
if (FIGHTING (ch)->position == POSITION_GROUNDFIGHTING)
{
send_to_char ("That person is entangled in mortal combat on the ground!!\n\r", ch);
return;
}
check_ced (ch);
check_ced (FIGHTING (ch));
if (!(IS_IN_MELEE (ch, FIGHTING (ch))))
{
send_to_char ("You aren't on the front lines of that battle!\n\r", ch);
return;
}
send_to_char ("You attempt to circle around your victim...\n\r", ch);
ch->pcdata->tickcounts = spl->mana; /*13; */
/*
act("$n begins to circle behind $s victim...",ch,NULL,ch,TO_ROOM);
*/
NEW_POSITION(ch, POSITION_CIRCLE);
return;
}
void
do_actual_circle (CHAR_DATA * ch, char *argy)
{
SINGLE_OBJECT *obj;
int dt;
CHAR_DATA *c;
DESCRIPTOR_DATA *d;
SPELL_DATA *spl;
if (IS_MOB (ch))
return;
if (ch->wait > 1)
return;
if (FIGHTING (ch) == NULL)
return;
if (FIGHTING (FIGHTING (ch)) == NULL)
return;
if (ch->position != POSITION_CIRCLE)
return;
NEW_POSITION(ch, POSITION_STANDING);
if (IS_PLAYER (ch))
skill_gain (ch, gsn_circle, TRUE);
if ((spl = skill_lookup ("Circle", -1)) == NULL)
{
send_to_char ("Huh?\n\r", ch);
return;
}
if (FIGHTING (FIGHTING (ch)) == ch)
{
send_to_char ("You can't circle around behind the mob who is fighting you!\n\r", ch);
return;
}
if (ch->pcdata->learned[gsn_circle] < 2)
{
send_to_char ("You do not know how to circle an opponent!\n\r", ch);
return;
}
if ((obj = get_item_held (ch, ITEM_WEAPON)) == NULL)
{
send_to_char ("You need to wield a weapon.\n\r", ch);
return;
}
dt = ((I_WEAPON *) obj->more)->attack_type;
if (attack_table[dt].hit_type != TYPE_PIERCE)
{
send_to_char ("You need to wield a piercing weapon.\n\r", ch);
return;
}
if (FIGHTING (ch)->position == POSITION_GROUNDFIGHTING)
{
send_to_char ("That person is entangled in mortal combat on the ground!!\n\r", ch);
return;
}
for (d = descriptor_list; d != NULL; d = d->next)
{
if (!d->character || d->connected != CON_PLAYING)
continue;
c = d->character;
if (FIGHTING (c) == FIGHTING (ch) && c->position == POSITION_CIRCLE)
{
act ("$B$4You bump into $N, who is also trying to circle at the same time!", ch, NULL, c, TO_CHAR);
act ("$B$4$n bumps into $N, who are both trying to circle at the same time! What fools!", ch, NULL, c, TO_NOTVICT);
act ("$B$4$n bumps into you as you both crowd behind the same mob, trying to circle!", ch, NULL, c, TO_VICT);
NEW_POSITION(c, POSITION_FIGHTING);
free_temp (c);
SUBHIT(c,4);
SUBHIT(ch,5);
return;
}
}
if (number_range (0, 110) < ch->pcdata->learned[gsn_circle])
{
set_fighting (FIGHTING (ch), ch);
set_fighting (ch, FIGHTING (ch));
if (IS_PLAYER (ch))
ch->pcdata->tickcounts = spl->casting_time;
multi_hit (ch, FIGHTING (ch), gsn_circle);
}
else
send_to_char ("You failed to circle your opponent.\n\r", ch);
return;
}
void
check_pkill (CHAR_DATA * ch, CHAR_DATA * victim)
{
if (CHALLENGE (ch) == 10 || (IN_BATTLE (ch)))
return;
return;
}
void
multi_hit (CHAR_DATA * ch, CHAR_DATA * victim, int dt)
{
int chance;
int gmembers;
bool cons;
bool castsp = FALSE;
bool second;
SINGLE_OBJECT *action_object = NULL;
CHAR_DATA *vch;
SINGLE_OBJECT *wield;
cons = FALSE;
second = FALSE;
CHECK_CHAR (ch);
CHECK_CHAR (victim);
check_fgt (ch);
check_fgt (victim);
using_weapon = FALSE;
using_shield = FALSE;
/* Not in same room */
if (ch->in_room != victim->in_room) {
ch->fgt->fighting=NULL;
victim->fgt->fighting=NULL;
ch->position=POSITION_STANDING;
victim->position=POSITION_STANDING;
return;
}
if (dt > 19000)
{
dt -= 20000; /*second=TRUE; */
}
if (dt > 8000)
{
dt -= 10000;
cons_damage = 0;
cons = TRUE;
}
if (!cons)
{
/*AM I JUST CONSIDERING THE BATTLE? */
check_ced (ch);
check_ced (victim);
add_to_fighting_list (ch);
add_to_fighting_list (victim);
if (!FIGHTING(victim)) {
closeto=TRUE;
set_fighting(victim,ch);
}
if (!FIGHTING(ch)) {
closeto=TRUE;
set_fighting(ch,victim);
}
closeto=FALSE;
if (IS_MOB (victim) && victim && IS_SET (victim->act, ACT_UNTOUCHABLE))
{
send_to_char ("Your physical attacks don't seem to hurt this creature!\n\r", ch);
return;
}
if (ch->position == POSITION_SLEEPING)
return;
if (victim == NULL)
return;
if (victim->in_room == NULL || ch->in_room == NULL)
return;
/* Kill self capabilities here */
if (pow.can_fight_self) {
if (IS_PLAYER (ch) && ch->desc != NULL && FIGHTING (ch) == NULL)
{
write_to_descriptor2 (ch->desc, "\n\r", 2);
ch->fgt->fighting = victim;
}
else
{
check_fgt (ch);
ch->fgt->fighting = victim;
}
}
if (FIGHTING (FIGHTING (ch)) == NULL)
{
ch->ced->attackers[0] = victim;
victim->ced->attackers[0] = ch;
}
if (ch == FIGHTING (victim) && !(IS_IN_MELEE (ch, victim)))
{
/*victim is being hit, but not in melee?? */
victim->ced->attackers[0] = ch; /*Set him in position 1 attacking */
}
for (vch = victim->in_room->more->people; vch != NULL; vch = vch->next_in_room)
{
if (FIGHTING (vch) == victim)
{
check_ced (vch);
if (!IS_IN_MELEE (vch, victim))
{
for (gmembers = 0; gmembers < 4; gmembers++)
{
if (victim->ced->attackers[gmembers] == NULL ||
victim->ced->attackers[gmembers]->in_room != victim->in_room)
{
victim->ced->attackers[gmembers] = vch;
break;
}
}
}
}
}
if (dt != gsn_backstab && !IS_IN_MELEE (ch, victim))
{
send_to_char ("\x1B[35;1m<-> (\x1B[32mYou are not within melee range\x1B[35m) <->\x1B[37;0m\n\r", ch);
return;
}
if (ch->position <= POSITION_STUNNED && ch->position >= 0)
return;
if (victim->position == POSITION_DEAD)
{
stop_fighting (ch, TRUE);
ch->wait = 0;
stop_fighting (victim, TRUE);
}
if (is_safe (ch, victim))
{
return;
}
if (!second)
{
if (ch->fgt->combat_delay_count <= -5)
{
ch->fgt->combat_delay_count--;
if (ch->fgt->combat_delay_count < -8)
ch->fgt->combat_delay_count = -1;
}
if (ch->fgt->combat_delay_count > 0)
{
ch->fgt->combat_delay_count--;
return;
}
if (ch->position != POSITION_BASHED && ch->fgt->combat_delay_count == 0)
{
ch->fgt->combat_delay_count = -1;
send_to_char ("You scramble to your feet!\n\r", ch);
act ("$n stands up quickly, trying not to get whacked again!", ch, NULL, NULL, TO_ROOM);
NEW_POSITION(ch, POSITION_FIGHTING);
}
if (IS_MOB (ch) && ch->position == POSITION_BASHED && ch->fgt->combat_delay_count < 1)
{
ch->fgt->combat_delay_count = -5;
send_to_char ("You scramble to your feet!\n\r", ch);
act ("$n stands up, trying not to get bashed down again!", ch, NULL, NULL, TO_ROOM);
NEW_POSITION(ch, POSITION_FIGHTING);
}
if (ch->position == POSITION_BASHED)
{
update_pos (ch);
return;
}
if (ch->fgt->combat_delay_count < 1 && ch->position == POSITION_STANDING)
{
NEW_POSITION(ch, POSITION_FIGHTING);
}
if (number_range (1, 40) == 3 && RIDING (ch) == NULL && ch->hit > 15 && victim->hit > 15 &&
!IS_AFFECTED (ch, AFF_FLYING) &&
can_groundfight (ch) && can_groundfight (victim) && (ch->hit * (double) 1.7 <
ch->max_hit || victim->hit * (double) 1.7 < victim->max_hit))
{
if (number_range (1, 2) == 1 || !IS_SET (ch->ced->fight_ops, F_GROUND) ||
!IS_SET (victim->ced->fight_ops, F_GROUND) ||
LEVEL (ch) < 10 || LEVEL (victim) < 10 || victim->position == POSITION_GROUNDFIGHTING
|| ch->position == POSITION_GROUNDFIGHTING || FIGHTING (victim) != ch)
{
act ("You slip on a pool of blood that has formed on the ground here!\n\rYou hit your head hard as your face meets the ground!", ch, NULL, victim, TO_CHAR);
act ("$n slips on a pool of blood and falls on $s face!", ch, NULL, victim, TO_ROOM);
SUBHIT(ch,(7 + (UMIN (10, LEVEL (ch) / 7))));
WAIT_STATE (ch, PULSE_VIOLENCE);
return;
}
else
{
act ("You slip on some blood and $N falls on top of you!", ch, NULL, victim, TO_CHAR);
act ("$n slips on some blood and drags $N down too!", ch, NULL, victim, TO_NOTVICT);
act ("$n slips on a pool of blood on the ground, but as $n\n\rgoes down, $n grabs you, taking you down too!", ch, NULL, victim, TO_VICT);
act ("The fight is taken to the ground!", ch, NULL, victim, TO_ROOM);
act ("The fight is taken to the ground!", ch, NULL, victim, TO_CHAR);
NEW_POSITION(ch, POSITION_GROUNDFIGHTING);
NEW_POSITION(victim, POSITION_GROUNDFIGHTING);
WAIT_STATE (ch, PULSE_VIOLENCE);
WAIT_STATE (victim, PULSE_VIOLENCE);
return;
}
}
}
/*End if !second */
}
/*End is considering */
if (victim)
{
SINGLE_OBJECT *o;
for (o = victim->carrying; o != NULL; o = o->next_content)
{
if (o->wear_loc == WEAR_HOLD_1 && o->pIndexData->item_type == ITEM_WEAPON)
{
using_weapon = TRUE;
}
if (o->wear_loc == WEAR_HOLD_2 && o->pIndexData->item_type == ITEM_WEAPON)
{
using_weapon = TRUE;
}
if (o->wear_loc == WEAR_SHIELD)
{
using_shield = TRUE;
}
}
}
if (dt == gsn_backstab || dt == gsn_circle)
{
SINGLE_OBJECT *wield1;
SINGLE_OBJECT *wield2;
wield1 = get_eq_char (ch, WEAR_HOLD_1);
wield2 = get_eq_char (ch, WEAR_HOLD_2);
if (wield1 && wield1->pIndexData->item_type == ITEM_WEAPON && IS_SET (wield1->extra_flags, ITEM_PIERCE))
{
one_hit (ch, victim, dt, wield1, cons);
}
else if (wield2 && wield2->pIndexData->item_type == ITEM_WEAPON && IS_SET (wield2->extra_flags, ITEM_PIERCE))
{
one_hit (ch, victim, dt, wield2, cons);
}
return;
}
if (dt == TYPE_UNDEFINED)
{
SINGLE_OBJECT *o;
SINGLE_OBJECT *wield1 = NULL;
SINGLE_OBJECT *wield2 = NULL;
if (IS_MOB (ch) && (ch->pIndexData->mobtype == MOB_DUMMY))
return;
for (o = ch->carrying; o != NULL; o = o->next_content)
{
if (!cons && !action_object)
{
if (o->wear_loc > WEAR_NONE && o->wear_loc != WEAR_BELT_1 &&
o->wear_loc != WEAR_BELT_2 && o->pIndexData->values_2[0] > 0 &&
number_range (1, 1000) < o->pIndexData->values_2[1])
{
action_object = o;
}
if (o->wear_loc > WEAR_NONE && o->wear_loc != WEAR_BELT_1 &&
o->wear_loc != WEAR_BELT_2 && o->pIndexData->values_2[2] > 0 &&
number_range (1, 1000) < o->pIndexData->values_2[3])
{
action_object = o;
castsp = TRUE;
}
}
if (o->wear_loc == WEAR_HOLD_1 && o->pIndexData->item_type == ITEM_WEAPON)
{
wield1 = o;
}
if (o->wear_loc == WEAR_HOLD_2 && o->pIndexData->item_type == ITEM_WEAPON)
{
wield2 = o;
}
}
if (IS_MOB (victim) && (victim->pIndexData->mobtype == MOB_GHOST))
{
bool can_hit_it;
can_hit_it = FALSE;
if (wield1 && (IS_OBJ_STAT (wield1, ITEM_GLOW) || IS_OBJ_STAT (wield1, ITEM_HUM)))
can_hit_it = TRUE;
if (wield2 && (IS_OBJ_STAT (wield2, ITEM_GLOW) || IS_OBJ_STAT (wield2, ITEM_HUM)))
can_hit_it = TRUE;
if (!can_hit_it)
{
if (!cons)
{
send_to_char ("Your attack goes right through your victim as if it was not there!\n\r", ch);
return;
}
}
}
if (wield1 && IS_AFFECTED_EXTRA (ch, AFF_SPEED))
{
if (number_range (1, 100) < ((get_curr_dex (ch) - 4) * 2))
{
one_hit (ch, victim, dt, wield1, cons);
}
}
if (wield1)
{
one_hit (ch, victim, dt, wield1, cons);
if (wield2 && ((IS_PLAYER (ch) &&
ch->pcdata->learned[gsn_dual_wield] > number_range (0, 148))
|| ((IS_MOB (ch)) && number_range (1, 120) < LEVEL (ch))))
{
if (wield2)
{
one_hit (ch, victim, dt, wield2, cons);
}
}
}
else if (wield2 != NULL)
{
one_hit (ch, victim, dt, wield2, cons);
}
else
{
one_hit (ch, victim, TYPE_HIT, NULL, cons);
}
if (FIGHTING (ch) != victim || dt == gsn_backstab || dt == gsn_circle)
return;
wield = (wield1 ? wield1 : wield2);
if (second)
{
chance = 0;
}
else
chance = IS_MOB (ch) ? LEVEL (ch) / 3 : ((ch->pcdata->learned[gsn_second_attack] / 4) + LEVEL (ch) / 4);
if (number_percent () < chance)
{
if (wield)
one_hit (ch, victim, dt, wield, cons);
else
one_hit (ch, victim, TYPE_HIT, NULL, cons);
if (IS_PLAYER (ch) && !cons)
skill_gain (ch, gsn_second_attack, TRUE);
if (FIGHTING (ch) != victim)
return;
}
if (second)
chance = 0;
else
chance = IS_MOB (ch) ? LEVEL (ch) / 6 : ch->pcdata->learned[gsn_third_attack] / 7;
if (number_percent () < chance)
{
if (wield)
one_hit (ch, victim, dt, wield, cons);
else
one_hit (ch, victim, TYPE_HIT, NULL, cons);
if (IS_PLAYER (ch) && !cons)
skill_gain (ch, gsn_third_attack, TRUE);
if (FIGHTING (ch) != victim)
return;
}
/* chance = IS_MOB(ch) ? LEVEL(ch) / 10 : 0;
if ( number_percent( ) < chance )
one_hit( ch, victim, dt, wield, cons ); */
}
if (victim->position == POSITION_RESTING || victim->position == POSITION_SLEEPING || victim->position == POSITION_STANDING)
set_fighting (victim, ch);
if (action_object)
{
SPELL_DATA *s;
int spell_level;
if (castsp)
{
if ((s = skill_lookup (NULL, action_object->pIndexData->values_2[2])) != NULL)
{
if (s->spell_level <= LEVEL (ch))
{
if (action_object->pIndexData->values_2[4] > 0)
spell_level = action_object->pIndexData->values_2[4];
else
spell_level = LEVEL (ch) / 2;
if (s->spell_type == TAR_CHAR_DEFENSIVE)
{
general_spell (s, spell_level, ch, ch);
}
else
{
general_spell (s, spell_level, ch, victim);
}
}
}
}
if (!castsp)
{
if (action_object->pIndexData->action_descr[0])
{
act (action_object->pIndexData->action_descr[0], ch, action_object, victim, TO_CHAR);
}
if (action_object->pIndexData->action_descr[1])
{
act (action_object->pIndexData->action_descr[1], ch, action_object, victim, TO_VICT);
}
if (action_object->pIndexData->action_descr[2])
{
act (action_object->pIndexData->action_descr[2], ch, action_object, victim, TO_NOTVICT);
}
SUBHIT(victim, number_range (1, action_object->pIndexData->values_2[0]));
if (victim->hit < 1)
victim->hit = 1;
}
}
using_weapon = FALSE;
using_shield = FALSE;
return;
}
int
addoffense (CHAR_DATA * ch, SINGLE_OBJECT * obj)
{
if (IS_MOB (ch))
return 0;
if (IS_SET (obj->extra_flags, ITEM_LASER))
{
if (ch->pcdata->learned[gsn_laser] < 2)
{
return -100;
}
else
return (ch->pcdata->learned[gsn_laser] / 4);
}
if (IS_SET (obj->extra_flags, ITEM_PIERCE))
return (ch->pcdata->learned[gsn_pierce] == -100 ? 0 : ch->pcdata->learned[gsn_pierce] / 4);
if (IS_SET (obj->extra_flags, ITEM_CONCUSSION))
return (ch->pcdata->learned[gsn_concussion] == -100 ? 0 : ch->pcdata->learned[gsn_concussion] / 5);
if (IS_SET (obj->extra_flags, ITEM_WHIP))
return (ch->pcdata->learned[gsn_whip] == -100 ? 0 : ch->pcdata->learned[gsn_whip] / 4);
if (ch->pcdata->learned[gsn_slashing] == -100)
return 0;
if (IS_SET (obj->extra_flags, ITEM_HEAVY_SLASH))
{
if (get_curr_str (ch) < 11)
return -3;
if (get_curr_str (ch) < 16)
return 0;
if (get_curr_str (ch) < 18)
return (ch->pcdata->learned[gsn_slashing] / 7);
if (get_curr_str (ch) < 21)
return (ch->pcdata->learned[gsn_slashing] / 6);
if (get_curr_str (ch) < 24)
return (ch->pcdata->learned[gsn_slashing] / 5);
else
return (ch->pcdata->learned[gsn_slashing] / 4);
}
if (IS_SET (obj->extra_flags, ITEM_LIGHT_SLASH))
return ((ch->pcdata->learned[gsn_slashing] / 4) + ((get_curr_str (ch) - 5) / 2));
if (IS_SET (obj->extra_flags, ITEM_SLASHING))
return (ch->pcdata->learned[gsn_slashing] / 5);
return 0;
}
void
one_hit (CHAR_DATA * ch, CHAR_DATA * victim, int dt, SINGLE_OBJECT * obj, bool consid)
{
SINGLE_OBJECT *wield;
int to_hit;
int bonushit;
int max_absorb;
int actual_absorb;
int dam;
int diceroll;
int iWear;
int hit_pos;
max_absorb = 0;
actual_absorb = 0;
bonushit = 0;
CHECK_CHAR (ch);
CHECK_CHAR (victim);
check_ced (ch);
check_ced (victim);
check_fgt (ch);
check_fgt (victim);
if (ch->in_room != victim->in_room) {
ch->fgt->fighting=NULL;
victim->fgt->fighting=NULL;
ch->position=POSITION_STANDING;
victim->position=POSITION_STANDING;
return;
}
hit_pos = number_range (1, 4);
if (victim && ch && victim->height > ch->height + 22 && hit_pos == STRIKE_HEAD)
{
if (number_range (1, 2) == 2)
hit_pos = STRIKE_LEGS;
else
hit_pos = STRIKE_BODY;
}
if (!consid)
{
/*If I'm considering, don't do the following */
if (victim->position == POSITION_DEAD || ch->in_room != victim->in_room)
{
ch->fgt->fighting = NULL;
victim->fgt->fighting = NULL;
ch->wait = 0;
return;
}
if (ch && victim && IS_MOB (ch) && IS_PLAYER (victim) &&
(LEVEL (victim) > 5) &&
(!HUNTING (ch) || (HUNTING (ch) && !is_number (HUNTING (ch)))))
{
if (strlen (NAME (victim)) < 16)
{
if (HUNTING (ch) != NULL)
{
free_string (ch->fgt->hunting);
ch->fgt->hunting = NULL;
}
ch->fgt->hunting = str_dup (NAME (victim));
}
}
if (MOUNTED_BY (victim) == ch)
{
ch->fgt->riding = NULL;
victim->fgt->mounted_by = NULL;
}
}
/*End is consid */
/*
* Figure out the type of damage message.
*/
wield = obj;
if (wield && wield->pIndexData->item_type != ITEM_WEAPON)
wield = NULL;
if (dt == TYPE_UNDEFINED)
{
dt = TYPE_HIT;
if (wield != NULL && wield->pIndexData->item_type == ITEM_WEAPON)
{
I_WEAPON *w = (I_WEAPON *) wield->more;
{
if (w->attack_type == 3 && number_range (1, 15) == 4)
dt += 2;
else if (w->attack_type == 11 && number_range (1, 15) == 5)
dt += 1;
else
dt += w->attack_type;
}
if (IS_PLAYER (ch))
bonushit = addoffense (ch, wield);
}
}
to_hit = ((get_curr_dex (ch) + 13 + bonushit + GET_HITROLL (ch) +
LEVEL (ch) / 7 + (IS_SET (ch->ced->fight_ops, F_AGGRESSIVE) ? 5 : 0)) -
(LEVEL (victim) / 4 + (get_curr_dex (victim) - 5) +
(!IS_SET (victim->ced->fight_ops, F_AGGRESSIVE) ? 8 : 0)));
if (IS_MOB (ch))
to_hit += ch->pIndexData->hitroll;
if (HAS_ARMS_DEXTERITY_IMPLANT (ch))
to_hit += number_range (5, 14);
if (number_percent () >= to_hit && number_range (0, 9) >= 6 &&
dt != gsn_backstab && dt != gsn_circle && IS_AWAKE (victim))
{
/* Shit! Missed! */
if (!consid)
{
ghit_pos = hit_pos;
damage (ch, victim, 0, dt);
ghit_pos = 0;
}
else
cons_damage += 0;
return;
}
if (!consid && IS_PLAYER (ch) && wield != NULL && wield->pIndexData->item_type == ITEM_WEAPON)
{
if (IS_SET (wield->extra_flags, ITEM_LASER))
skill_gain (ch, gsn_laser, TRUE);
if (IS_SET (wield->extra_flags, ITEM_PIERCE))
skill_gain (ch, gsn_pierce, TRUE);
if (IS_SET (wield->extra_flags, ITEM_CONCUSSION))
skill_gain (ch, gsn_concussion, TRUE);
if (IS_SET (wield->extra_flags, ITEM_WHIP))
skill_gain (ch, gsn_whip, TRUE);
if (IS_SET (wield->extra_flags, ITEM_HEAVY_SLASH) ||
IS_SET (wield->extra_flags, ITEM_LIGHT_SLASH) ||
IS_SET (wield->extra_flags, ITEM_SLASHING))
skill_gain (ch, gsn_slashing, TRUE);
}
diceroll = number_range (0, 19);
dam = 0;
if (IS_MOB (ch))
{
#ifdef NEW_NEW
if (wield != NULL && wield->pIndexData->item_type == ITEM_WEAPON)
{
dam = (dice (FIRSTDICE (wield), SECONDDICE (wield)) / 2) +
(number_range (LEVEL (ch) / 3, (LEVEL (ch)) / 2));
}
else
{
dam = number_range ((LEVEL (ch)*2)/5, (LEVEL (ch)*4)/5 );
}
#else
if (wield != NULL && wield->pIndexData->item_type == ITEM_WEAPON)
{
dam = (dice (FIRSTDICE (wield), SECONDDICE (wield)) / 2) +
(number_range (LEVEL (ch) / 4, (LEVEL (ch)) / 2));
}
else
{
dam = number_range (LEVEL (ch) / 4, (LEVEL (ch)) / 2);
}
#endif
dam += ch->pIndexData->damroll;
if (dam <= 0)
dam = 1;
}
else
{
if (wield != NULL && wield->pIndexData->item_type == ITEM_WEAPON)
{
dam = dice (FIRSTDICE (wield), SECONDDICE (wield));
}
else
{
/*FISTS of HIGH-LEVS now do more damage */
if (IS_SET (ch->ced->fight_ops, F_AGGRESSIVE))
{
if (LEVEL (ch) < 10)
dam = number_range (1, 3);
else if (LEVEL (ch) < 20)
dam = number_range (1, 4);
else if (LEVEL (ch) < 35)
dam = number_range (1, 6);
else if (LEVEL (ch) < 50)
dam = number_range (1, 7);
else if (LEVEL (ch) < 65)
dam = number_range (2, 9);
else if (LEVEL (ch) < 90)
dam = number_range (3, 11);
else
dam = number_range (6, 14);
}
else
dam = number_range (1, 3);
if (HAS_HANDS_STRENGTH_IMPLANT (ch))
dam += number_range (2, 5);
if (HAS_BODY_STRENGTH_IMPLANT (ch))
dam += number_range (1, 3);
}
}
if (LEVEL (ch) > 8 && IS_SET (ch->ced->fight_ops, F_POWER))
dam += 1;
if (IS_PLAYER (ch))
dam += (number_range (0, GET_DAMROLL (ch)) / 2);
if (!consid && IS_PLAYER (ch) && ch->pcdata->learned[gsn_enhanced_damage] > 0)
{
dam += (dam * ch->pcdata->learned[gsn_enhanced_damage]) / 400;
if (number_range (1, 15) == 10)
skill_gain (ch, gsn_enhanced_damage, TRUE);
}
if (IS_SET (ch->ced->fight_ops, F_AGGRESSIVE) && number_range (1, 2) == 2)
dam += 1;
{
int b4 = dam;
int aftr;
int dif;
#ifdef NEW_WORLD
if (IS_PLAYER (ch) && IS_PLAYER (victim) && dam > 17)
dam = number_range (10, 18);
if (IS_PLAYER (ch) && IS_PLAYER (victim))
dam = new_damage_2 (victim, dam, hit_pos, dt);
else
#endif
dam = new_damage (victim, dam, hit_pos, dt);
aftr = dam;
dif = b4 - aftr;
if (!consid && IS_PLAYER (ch) && dif > 4 && number_range (1, 100) < ch->pcdata->learned[gsn_penetration])
{
if (number_range (1, 5) == 2)
skill_gain (ch, gsn_penetration, TRUE);
dif /= 2;
dam += dif;
}
}
if (!consid)
{
if (ch->position != POSITION_BASHED && victim->position != POSITION_BASHED && number_range (1, 7) == 4 && IS_AFFECTED (ch, AFF_FLYING) && !IS_AFFECTED (victim, AFF_FLYING))
{
act ("$n swoops down and attacks $N!", ch, NULL, victim, TO_NOTVICT);
act ("$n swoops down from the air and attacks you!", ch, NULL, victim, TO_VICT);
act ("You swoop down from the air and attack $N!", ch, NULL, victim, TO_CHAR);
dam += 2;
if (number_range (1, 12) == 5)
{
if (number_range (1, 2) == 1)
{
act ("$N catches $n with an elbow while $e is approaching!", ch, NULL, victim, TO_NOTVICT);
act ("You catch $n with an elbow as $e approaches!", ch, NULL, victim, TO_VICT);
act ("$N smashes $S elbow into your face as you swoop down!", ch, NULL, victim, TO_CHAR);
}
else
{
act ("$N jumps out of the way and $n smashes into the ground!", ch, NULL, victim, TO_NOTVICT);
act ("You jump out of the way and $n smashes into the ground!", ch, NULL, victim, TO_VICT);
act ("$N steps out of the way and you smash into the ground!", ch, NULL, victim, TO_CHAR);
}
if (ch->hit > 7)
SUBHIT(ch,7);
return;
}
}
if (ch->position != POSITION_BASHED && victim->position != POSITION_BASHED && number_range (1, 11) == 4 && !IS_AFFECTED (ch, AFF_FLYING) && IS_AFFECTED (victim, AFF_FLYING))
{
/*hitter not flying, victim flying */
act ("$N quickly flies out of the way, dodging your attack!", ch, NULL, victim, TO_CHAR);
act ("$N flies out of $n's attack path.", ch, NULL, victim, TO_NOTVICT);
act ("You fly out of the path of $n's attack.", ch, NULL, victim, TO_VICT);
return;
}
if (ch->position != POSITION_BASHED && victim->position != POSITION_BASHED && number_range (1, 34) == 6 && IS_AFFECTED (ch, AFF_FLYING) && IS_AFFECTED (victim, AFF_FLYING))
{
/*both hitter and victim flying */
act ("$N and $n get tangled and smash into the ground!", ch, NULL, victim, TO_NOTVICT);
act ("You smash into the ground as you struggle with $n!", ch, NULL, victim, TO_VICT);
act ("You smash into the ground as you struggle with $N!", ch, NULL, victim, TO_CHAR);
if (ch->hit > 10)
{
SUBHIT(ch,9);
SUBHIT(victim,9);
}
return;
}
if (!IS_AWAKE (victim))
{
if (dam < 2)
dam = 2;
dam = (dam * 3);
}
if (victim->position == POSITION_RESTING)
{
if (dam < 2)
dam = 2;
dam = (dam * 3) / 2;
}
}
/*end if !consid */
if (dt == gsn_circle)
{
int muu;
if (dam < 3)
dam = 3;
muu = 2 + (LEVEL (ch) / 17);
if (is_member (ch, GUILD_ASSASSIN))
{
muu += 1;
dam += 1;
}
if (is_member (ch, GUILD_THIEFG))
{
muu += 1;
dam += 1;
}
if (muu > 6)
muu = 6;
dam *= muu;
}
if (dt == gsn_backstab)
{
float mult;
mult = 0.0;
mult = 2.5 + ((float) LEVEL (ch) / 10.0);
if (mult > 11)
mult = 11.5;
if (is_member (ch, GUILD_ASSASSIN))
{
mult += 2.0;
dam += 3.8;
}
if (is_member (ch, GUILD_THIEFG))
{
mult += 1.2;
dam += 1.4;
}
if (!IS_AWAKE (victim))
mult += 3.0;
dam *= mult;
}
if (dam <= 0)
dam = 1;
if (!consid)
{
if (number_range (1, 5) == 1 && ch->move > 0)
{
SUBMOVE(ch,1);
upd_mps (ch);
}
}
ghit_pos = hit_pos;
/*end if !consid */
if (wield && ((I_WEAPON *) wield->more)->damage_p < 3)
{
if (!consid)
damage (ch, victim, dam / 10, dt);
else
cons_damage += 1;
if (!consid)
send_to_char ("Your weapon is so bashed up it hardly does any damage!\n\r", ch);
}
else if (wield && ((I_WEAPON *) wield->more)->damage_p < 15)
{
if (!consid)
damage (ch, victim, dam / 3, dt);
else
cons_damage += (dam / 3);
}
else if (wield && ((I_WEAPON *) wield->more)->damage_p < 44)
{
if (!consid)
damage (ch, victim, dam / 2, dt);
else
cons_damage += (dam / 2);
}
else if (wield && ((I_WEAPON *) wield->more)->damage_p < 73)
{
if (dam > 31)
dam -= 7;
else if (dam > 22)
dam -= 6;
else if (dam > 15)
dam -= 4;
else if (dam > 9)
dam -= 2;
else if (dam > 4)
dam -= 1;
if (!consid)
damage (ch, victim, dam, dt);
else
cons_damage += dam;
}
else if (!consid) {
hitop=TRUE;
damage (ch, victim, dam, dt);
}
else
cons_damage += dam;
if (victim->data_type==50) return;
if (!consid)
if (FIGHTING (ch) == NULL)
return;
if (!consid)
{
if (wield && (((I_WEAPON *) wield->more)->strength != 0) &&
(dam >= ((I_WEAPON *) wield->more)->strength))
if (number_range (1, 12) == 5)
{
--((I_WEAPON *) wield->more)->damage_p;
if (((I_WEAPON *) wield->more)->damage_p == 1)
{
send_to_char ("--->ACK! Your weapon just broke!\n\r", ch);
unequip_char (ch, wield);
free_it (wield);
return;
}
else if (number_range (1, 4) == 3) /*only display occasionally */
send_to_char ("Your weapon is damaged slightly by your attack!\n\r", ch);
}
ghit_pos = 0;
if (dam >= 4 && number_range (1, 3) == 1
&& (wield = get_eq_char (victim,
(iWear = number_range (WEAR_NONE + 1, MAX_WEAR)))) != NULL
&& wield->pIndexData->item_type == ITEM_ARMOR
&& wield->wear_loc != -1
&& ((I_ARMOR *) wield->more)->max_condition)
{
int localle;
char blah[500];
char *tmp;
if (hit_pos == STRIKE_BODY)
{
if (wield->wear_loc != WEAR_BODY && wield->wear_loc != WEAR_WAIST &&
wield->wear_loc != WEAR_SHIELD && wield->wear_loc != WEAR_ABOUT)
goto brkl;
}
if (hit_pos == STRIKE_HEAD)
{
if (wield->wear_loc != WEAR_HEAD && wield->wear_loc != WEAR_NECK_1 &&
wield->wear_loc != WEAR_NECK_2 && wield->wear_loc != WEAR_FACE &&
wield->wear_loc != WEAR_SHIELD && wield->wear_loc != WEAR_EAR_1 &&
wield->wear_loc != WEAR_EAR_2)
goto brkl;
}
if (hit_pos == STRIKE_ARMS)
{
if (wield->wear_loc != WEAR_ARMS && wield->wear_loc != WEAR_HANDS &&
wield->wear_loc != WEAR_SHIELD && wield->wear_loc != WEAR_WRIST_L &&
wield->wear_loc != WEAR_WRIST_R && wield->wear_loc != WEAR_SHOULDER_L &&
wield->wear_loc != WEAR_SHOULDER_R)
goto brkl;
}
if (hit_pos == STRIKE_LEGS)
{
if (wield->wear_loc != WEAR_LEGS && wield->wear_loc != WEAR_FEET &&
wield->wear_loc != WEAR_ANKLE_1 && wield->wear_loc != WEAR_ANKLE_2)
goto brkl;
}
if (wield->pIndexData->short_descr[0] != '\0')
{
for (tmp = wield->pIndexData->short_descr; *tmp != '\0'; tmp++)
{
};
if (*(tmp - 1) == 's')
sprintf (blah, "$p are damaged.");
else
sprintf (blah, "$p is damaged.");
act (blah, victim, wield, NULL, TO_CHAR);
localle = wield->wear_loc;
unequip_char (victim, wield);
--((I_ARMOR *) wield->more)->condition_now;
equip_char (victim, wield, localle);
if (((I_ARMOR *) wield->more)->condition_now <= 0)
{
if (*tmp == 's')
sprintf (blah, "The damage was so powerful, $p fall apart!");
else
sprintf (blah, "The damage was so powerful, $p falls apart!");
act (blah, victim, wield, NULL, TO_CHAR);
unequip_char (victim, wield);
free_it (wield);
return;
}
}
}
brkl:
if (wield) {};
}
/*end if !consid */
return;
}
bool
can_trip (CHAR_DATA * ch)
{
if (number_range (1, 4) != 1)
return FALSE;
if (IS_PLAYER (ch))
return TRUE;
if (ch->pIndexData->mobtype == MOB_HUMAN
|| ch->pIndexData->mobtype == MOB_DWARF
|| ch->pIndexData->mobtype == MOB_ELF
|| ch->pIndexData->mobtype == MOB_GIANT
|| ch->pIndexData->mobtype == MOB_DRAGON)
return TRUE;
return FALSE;
}
bool
bashable (CHAR_DATA * ch)
{
if (IS_PLAYER (ch))
return TRUE;
if (ch->pIndexData->mobtype == MOB_GHOST)
return FALSE;
if (ch->pIndexData->mobtype == MOB_DRAGON)
return FALSE;
return TRUE;
}
int
kickable (CHAR_DATA * ch)
{
if (IS_PLAYER (ch))
return 1;
if (ch->pIndexData->mobtype == MOB_GHOST)
return 0;
if (IS_AFFECTED (ch, AFF_FLYING))
return 2;
return 1;
}
bool
pkill (CHAR_DATA * ch, CHAR_DATA * victim)
{
return TRUE;
}
bool
is_using_sword (CHAR_DATA * ch)
{
SINGLE_OBJECT *obj;
if (!ch)
return FALSE;
for (obj = ch->carrying; obj != NULL; obj = obj->next_content)
{
if (obj->wear_loc != WEAR_HOLD_1 && obj->wear_loc != WEAR_HOLD_2)
continue;
if (obj->pIndexData->item_type != ITEM_WEAPON)
continue;
if (((I_WEAPON *) obj->more)->attack_type == 3)
return TRUE;
}
return FALSE;
}
/*
* Inflict damage from a hit.
*/
void
damage (CHAR_DATA * ch, CHAR_DATA * victim, int dam, int dt)
{
bool display_pr;
CHECK_CHAR (ch);
CHECK_CHAR (victim);
check_fgt (ch);
check_fgt (victim);
if (!ch->in_room || !victim->in_room) return;
if (ch->in_room != victim->in_room) {
ch->fgt->fighting=NULL;
victim->fgt->fighting=NULL;
ch->position=POSITION_STANDING;
victim->position=POSITION_STANDING;
return;
}
add_to_fighting_list (ch);
add_to_fighting_list (victim);
if (!FIGHTING(ch)) set_fighting(ch,victim);
if (!FIGHTING(victim)) set_fighting(victim,ch);
if (dt > 19000)
{
dt -= 20000;
display_pr = FALSE;
}
else
display_pr = TRUE;
if (victim == NULL)
{
ch->fgt->fighting = NULL;
return;
}
if (!victim->in_room || !victim->in_room->area ||
((IS_PLAYER (ch) && LEVEL (ch) > 99 && !IS_REAL_GOD (ch)) && victim->in_room && victim->in_room->area &&
victim->in_room->area->open == 1))
{
ch->fgt->fighting = NULL;
victim->fgt->fighting = NULL;
return;
}
if (victim->position == POSITION_DEAD)
{
ch->wait = 0;
stop_fighting(ch,TRUE);
return;
}
if (FIGHTING (victim) == ch && FIGHTING (ch) != victim && !(victim->position == POSITION_GROUNDFIGHTING &&
ch->position == POSITION_GROUNDFIGHTING) && dt != gsn_kick &&
victim->position != POSITION_CASTING && victim->position != POSITION_BASHED &&
ch->position != POSITION_CASTING && ch->position != POSITION_BASHED)
{
NEW_POSITION(ch, POSITION_FIGHTING);
NEW_POSITION(victim, POSITION_FIGHTING);
if (IS_PLAYER (ch) && ch->desc != NULL)
{
write_to_descriptor2 (ch->desc, "\n\r", 2);
}
if (ch!=victim || pow.can_fight_self) {
ch->fgt->fighting = victim;
}
}
if (ch->position == POSITION_GROUNDFIGHTING && victim->position != POSITION_GROUNDFIGHTING)
{
NEW_POSITION(ch, POSITION_FIGHTING);
}
update_pos (victim);
if (victim->position == POSITION_DEAD)
goto isdedman;
/*
* Stop up any residual loopholes.
*/
if (victim != ch)
{
if (is_safe (ch, victim))
{
if (IS_MOB (ch))
return;
act ("\x1B[1;37mYou hear a loud clash of thunder in the sky, sent forth by", ch, NULL, NULL, TO_CHAR);
act ("the gods, and you decide not to attack.\x1B[0m", ch, NULL, NULL, TO_CHAR);
act ("You hear massive clashes of thunder in the heavens above.",
ch, NULL, NULL, TO_NOTVICT);
return;
}
if (IS_PLAYER (ch) && !IS_IMMORTAL (ch))
{
ch->pcdata->no_quit = 2;
}
if (IS_PLAYER (victim) && !IS_IMMORTAL (victim))
{
victim->pcdata->no_quit = 2;
}
if (IS_PLAYER (ch) && !IS_MOB (victim) && !IS_IMMORTAL (ch) && !IS_IMMORTAL (victim))
{
/*player killing player */
ch->pcdata->no_quit_pk = 5;
victim->pcdata->no_quit_pk = 5;
}
if (can_yell (victim) && victim->hit < 8 && victim->max_hit > 100 && ch->hit > 60)
{
do_fatal (victim, ch, dt);
}
if (IS_PLAYER (ch) && dam > 2 && ch && victim && ch != victim)
{
int gn;
#ifdef NEW_WORLD
gn = (dam * 2) + (LEVEL (victim) * 3) + ((LEVEL (ch) * LEVEL (ch)) / 4) + number_range (1, (LEVEL (victim) + LEVEL (ch)));
#else
gn = (dam * 3) + (LEVEL (victim) * 3) + ((LEVEL (ch) * LEVEL (ch)) / 8) + number_range (1, (LEVEL (victim) + LEVEL (ch)));
#endif
if (LEVEL (ch) < 100 && ch->in_room && ch->in_room->vnum >= 1000 &&
(!(LEVEL (ch) > 10 && LEVEL (victim) < 4) && !(LEVEL (ch) > 20 && LEVEL (victim) < 8) &&
!(LEVEL (ch) > 35 && LEVEL (victim) < 14) && !(LEVEL (ch) > 50 && LEVEL (victim) < 20)))
{
if ((IS_PLAYER (ch) && !IS_PLAYER (victim)) || (!IS_PLAYER (ch) && IS_PLAYER (victim)))
{
gain_exp (ch, gn);
if (IS_PLAYER (ch))
ch->pcdata->voting_on += gn;
}
}
}
if (victim->position > POSITION_STUNNED && dam > 0)
{
if (FIGHTING (victim) == NULL)
{
set_fighting (victim, ch);
NEW_POSITION(victim, POSITION_FIGHTING);
}
}
if (victim->position > POSITION_STUNNED)
{
if (FIGHTING (ch) == NULL && dt != TYPE_SHOT)
set_fighting (ch, victim);
}
/*
* More charm stuff.
*/
if (MASTER (victim) == ch)
stop_follower (victim);
if (IS_AFFECTED (ch, AFF_HIDE) && dt != TYPE_SHOT)
{
affect_strip (ch, gsn_hide);
REMOVE_BIT (ch->affected_by, AFF_HIDE);
act ("$n is revealed.", ch, NULL, NULL, TO_ROOM);
}
/*
* Damage modifiers.
*/
if (dt > 999)
{
if (IS_EVIL (ch) && IS_AFFECTED (victim, AFF_PROT_EVIL))
dam -= number_range (0, (dam / 3));
if (IS_GOOD (ch) && IS_AFFECTED (victim, AFF_PROT_GOOD))
dam -= number_range (0, (dam / 3));
if (IS_AFFECTED (victim, AFF_SANCTUARY))
dam -= number_range (0, (dam / 2));
if (IS_AFFECTED (victim, AFF_PROTECT))
dam -= dam / 2;
if (dam < 0)
dam = 0;
}
if (!ch || !victim)
return;
/*
* Check for disarm, trip, parry, and dodge.
*/
if (dt >= TYPE_HIT && dt != TYPE_SHOT)
{
if ((IS_MOB (ch) && number_percent () < 20)
&& ch->move > 10)
{
if (can_trip (ch) &&
victim->position != POSITION_GROUNDFIGHTING && victim->position != POSITION_CASTING)
{
disarm (ch, victim);
}
}
if ((IS_MOB (ch) && number_percent () < 8) &&
victim->position != POSITION_GROUNDFIGHTING && can_trip (ch) &&
victim->position != POSITION_CASTING && can_trip (victim)
&& victim->fgt->combat_delay_count < 0
&& ch->move > 10)
{
if (number_range (0, 7) == 1)
trip (ch, victim);
else
{
act ("$n tries to trip you, but you quickly jump out of the way!", ch, NULL, victim, TO_VICT_SPAM);
act ("You try to trip $N, but $N swiftly jumps out of the way!", ch, NULL, victim, TO_CHAR);
act ("$n tries to trip $N, but $N swiftly jumps out of the way!", ch, NULL, victim, TO_NOTVICT_SPAM);
}
}
if (!ch || !victim)
return;
if (dt > 999 && dt != gsn_circle && dt != gsn_backstab)
{
if (IS_AFFECTED (victim, AFF_INVISIBLE) &&
!IS_AFFECTED (ch, AFF_DETECT_INVIS) && number_range (1, 14) == 3)
{
act ("You flail wildly around, trying to hit your invisible opponent...", ch, NULL, victim, TO_CHAR_SPAM);
return;
}
if (victim->position == POSITION_GROUNDFIGHTING)
{
if (number_range (1, 3) != 1)
{
act ("$N is groundfighting and you can't find a line of attack.", ch, NULL, victim, TO_CHAR_SPAM);
act ("$n can't find a clear line of attack at the moment.", ch, NULL, victim, TO_NOTVICT_SPAM);
return;
}
}
else if (number_range (1, 8) > 2)
{
if (!ch || !victim)
return;
if ((dt == 1003 || dt == 1011) && using_weapon && check_parry (ch, victim))
return;
if (check_dodge (ch, victim))
return;
if (check_shield (ch, victim))
return;
}
}
if (!ch || !victim)
return;
if (!IS_SET (ch->ced->fight_ops, F_POWER) && number_range (1, 12) == 4 && ch->position == POSITION_FIGHTING)
{
act ("$N quickly steps out of the way of your attack.", ch, NULL, victim, TO_CHAR_SPAM);
act ("$N steps out of the way of $n's attack.", ch, NULL, victim, TO_NOTVICT_SPAM);
act ("You quickly step out of the way of $n's attack.", ch, NULL, victim, TO_VICT_SPAM);
return;
}
}
if (dt == gsn_backstab || dt == gsn_circle || (dt != TYPE_SHOT && dt != gsn_kick && (!(dt > 0 && dt < 300))))
dam_message (ch, victim, dam, dt, ghit_pos);
}
SUBHIT(victim,dam);
upd_hps (victim);
if (victim->fgt && victim->fgt->field) {
handle_gs_da(victim,victim->fgt->pos_x, victim->fgt->pos_y);
}
if (!ch || !victim)
return;
if (victim->position == POSITION_CASTING && dam > 4)
{
NEW_POSITION(victim, POSITION_FIGHTING);
send_to_char ("OUCH! You just lost your concentration!\n\r", victim);
}
if (!IS_AWAKE (victim))
stop_fighting (victim, FALSE);
if (IS_PLAYER (victim)
&& LEVEL (victim) >= LEVEL_IMMORTAL
&& victim->hit < 1)
victim->hit = 1;
update_pos (victim);
isdedman:
switch (victim->position)
{
case POSITION_MORTAL:
act ("$n is mortally wounded, and will die soon if not aided.",
victim, NULL, NULL, TO_ROOM);
send_to_char (
"You are mortally wounded, and will die soon if not aided.\n\r",
victim);
break;
case POSITION_INCAP:
act ("$n is incapacitated and will suffer a slow, painful death if not aided.",
victim, NULL, NULL, TO_ROOM);
send_to_char (
"You are incapacitated and will suffer a slow, painful death if not aided.\n\r",
victim);
break;
case POSITION_STUNNED:
act ("$n is stunned, but will probably recover.",
victim, NULL, NULL, TO_ROOM);
send_to_char ("You are stunned, but will probably recover.\n\r",
victim);
break;
case POSITION_DEAD:
if (IS_PLAYER (ch) && LEVEL (ch) < 8)
{
ch->copper++;
send_to_char ("You just got a copper coin from the gods for the kill!\n\r", ch);
}
act ("$n has been killed!", victim, 0, 0, TO_ROOM);
send_to_char ("You have been killed!\n\r\n\r", victim);
ch->wait = 0;
break;
default:
if (dam > victim->max_hit / 5)
send_to_char ("Ouch, that was *not* pleasant!\n\r", victim);
if (victim->hit < victim->max_hit / 8)
send_to_char ("You sure are BLEEDING!\n\r", victim);
break;
}
if (!ch || !victim)
return;
if (victim->position == POSITION_DEAD)
{
if (IS_PLAYER (victim) && IN_BATTLE (victim) == TRUE)
{
stop_fighting (victim, TRUE);
NEW_POSITION(victim, POSITION_STANDING);
NEW_POSITION(ch, POSITION_STANDING);
MAXHIT(victim);
upd_hps (victim);
char_from_room (victim);
char_to_room (victim, get_room_index (victim->fgt->wasroomtwo));
do_look (victim, "");
return;
}
if (IS_PLAYER (victim) && CHALLENGE (victim) != 0)
{
stop_fighting (victim, TRUE);
NEW_POSITION(victim, POSITION_STANDING);
NEW_POSITION(ch, POSITION_STANDING);
ch->fgt->fighting = NULL;
victim->fgt->fighting = NULL;
MAXHIT(ch);
MAXHIT(victim);
upd_hps (ch);
upd_hps (victim);
end_arena (ch, victim);
return;
}
group_gain (ch, victim);
ch->wait = 0;
if (IS_PLAYER (victim))
{
int ii;
char buf[STD_LENGTH];
victim->pcdata->deaths++;
victim->pcdata->no_quit = 0;
if (!IS_EVIL (victim) && !IS_EVIL (ch) && ch->pcdata->bounty > 10 && victim->pcdata->bounty < 10)
{
fprintf (stderr, "%s killed without provocation by %s at %d",
NAME (victim),
NAME (ch),
victim->in_room->vnum);
conv_race (ch);
}
reasonfd[0] = '\0';
if (strlen (NAME (ch)) < 30)
strcpy (reasonfd, NAME (ch));
sprintf (log_buf, "%s killed by %s at %d",
NAME (victim),
NAME (ch),
victim->in_room->vnum);
log_string (log_buf);
sprintf (log_buf, "%s just got killed by %s!", NAME (victim), NAME (ch));
ii = clan_number (victim);
if (ii > 0)
clan_notify (log_buf, ii);
if (LEADER (victim) != NULL)
group_notify (log_buf, victim);
if (IS_PLAYER (ch))
{
sprintf (log_buf, "%s just killed %s!", NAME (ch), NAME (victim));
ii = clan_number (ch);
if (ii > 0)
clan_notify (log_buf, ii);
}
sprintf (buf, "Ntfy> %s", log_buf);
NOTIFY (buf, LEVEL_IMMORTAL, WIZ_NOTIFY_DEATH);
if (IS_PLAYER (ch) && !IS_MOB (victim))
{
if (victim->pcdata->warpoints - (1 + (LEVEL (victim) / 6)) >= 0)
victim->pcdata->warpoints -= (1 + (LEVEL (victim) / 6));
}
if (IS_MOB (ch) && IS_PLAYER (victim))
{
pc_death_penalty (ch, victim);
}
else
gain_exp (victim, -(LEVEL (victim) * 1423));
}
raw_kill (victim, (dt == 1003));
if (IS_JAVA(victim)) do_clear(victim,"");
if (IS_PLAYER (ch) && IS_MOB (victim))
{
int old_gold = 0;
CHAR_DATA *others;
char buf[STD_LENGTH];
bool RNQ = TRUE;
for (others = ch->in_room->more->people; others != NULL; others = others->next_in_room)
{
if (FIGHTING (others) == ch || FIGHTING (ch) != NULL)
{
RNQ = FALSE;
break;
}
}
if (RNQ)
ch->pcdata->no_quit = 0;
old_gold = tally_coins (ch);
if (IS_SET (ch->pcdata->act2, PLR_AUTOLOOT))
do_get (ch, "all from corpse");
else if (IS_SET (ch->pcdata->act2, PLR_AUTOGOLD))
do_get (ch, "all.coins from corpse");
if (IS_SET (ch->pcdata->act2, PLR_AUTOSAC))
do_sacrifice (ch, "corpse");
if (IS_SET (ch->pcdata->act2, PLR_AUTOSPLIT)
&& tally_coins (ch) - old_gold > 1)
{
sprintf (buf, "%d", tally_coins (ch) - old_gold);
do_split (ch, buf);
}
}
ch->wait = 0;
return;
}
if (victim == ch)
return;
/*
* Take care of link dead people.
*/
if (IS_PLAYER (victim) && victim->desc == NULL)
{
if (number_range (0, victim->wait) < 2)
{
do_flee (victim, "");
return;
}
}
/*
* Wimp out?
*/
/*
if (IS_MOB (victim) && dam > 0 && dt != TYPE_SHOT)
{
if ((IS_SET (victim->act, ACT_WIMPY) && number_bits (1) == 0
&& victim->hit < victim->max_hit / 6))
do_flee (victim, "");
return;
}
*/
if (IS_PLAYER (victim) && dam > 0 && dt != TYPE_SHOT)
if (victim->ced && victim->hit <= victim->ced->wimpy && victim->position != POSITION_BASHED)
do_flee (victim, "");
return;
}
bool
is_safe (CHAR_DATA * ch, CHAR_DATA * victim)
{
CHAR_DATA *tch;
bool god_present;
if (!victim->in_room) return TRUE;
#ifndef NEW_WORLD
if (IN_BOAT(ch) && IN_BOAT(victim) && !is_in_same_boat (ch, victim))
{
send_to_char ("They aren't here.\n\r", ch);
return TRUE;
}
if ((IN_BOAT(ch) || IN_BOAT(victim)) && !is_in_same_boat (ch, victim))
{
send_to_char ("You must be either both in the same boat, or out of your boat to attack.\n\r", ch);
return TRUE;
}
#endif
if (IS_REAL_GOD (ch))
return FALSE;
god_present = FALSE;
if (ch->in_room && ((ch->in_room->vnum < 101 && ch->in_room->vnum > 95) ||
(ch->in_room->vnum >= 400 && ch->in_room->vnum < 500)))
return TRUE;
for (tch = victim->in_room->more->people; tch != NULL; tch = tch->next_in_room)
if (tch != ch && tch != victim && IS_REAL_GOD (tch) && IS_SET (tch->act, PLR_HOLYPEACE))
god_present = TRUE;
if (god_present)
{
if (FIGHTING (victim) != NULL)
{
victim->fgt->fighting = NULL;
NEW_POSITION(victim, POSITION_STANDING);
}
if (FIGHTING (ch) != NULL)
{
ch->fgt->fighting = NULL;
NEW_POSITION(ch, POSITION_STANDING);
}
send_to_char ("No fighting in the presence of Gods!\n\r", ch);
return TRUE;
}
if (IN_BATTLE (ch) || CHALLENGE (ch) == 10)
return FALSE;
ALLOW_UNMOTIVATED_PK (yes)
#ifdef NEW_WORLD
if (IS_PLAYER (ch) && IS_PLAYER (victim) && IS_EVIL (ch) && !IS_EVIL (victim) && LEVEL (victim) < 10)
{
send_to_char ("That newbie is still protected, sorry.\n\r", ch);
return TRUE;
}
if (IS_PLAYER (ch) && IS_PLAYER (victim) && !IS_EVIL (ch) && IS_EVIL (victim) && LEVEL (ch) < 10)
{
send_to_char ("You may not engage in pkill combat until level 10, sorry.\n\r", ch);
return TRUE;
}
#ifdef ALIENPK
if (not_within_levels (ch, victim))
return TRUE;
#endif
if (IS_PLAYER (ch) && IS_PLAYER (victim) && NO_PKILL (ch))
return TRUE;
if (IS_PLAYER (victim) && IS_PLAYER (ch) && NO_PKILL (victim))
return TRUE;
#endif
/*
if (IS_PLAYER(ch) && IS_PLAYER (victim) && !IS_EVIL(ch) &&
!IS_EVIL(victim)
*/
if (!pow.good_kill_good && IS_PLAYER(ch) && IS_PLAYER(victim) && !IS_EVIL(ch) &&
!IS_EVIL(victim)) {
return TRUE;
}
if (!pow.evil_kill_evil && IS_PLAYER(ch) && IS_PLAYER(victim) && IS_EVIL(ch) &&
IS_EVIL(victim)) {
return TRUE;
}
return FALSE;
}
bool
check_parry (CHAR_DATA * ch, CHAR_DATA * victim)
{
int chance;
CHAR_DATA *mob;
int number = 0;
if (victim->move <= 5)
return FALSE;
if (!IS_AWAKE (victim) || victim->position <= POSITION_STUNNED)
return FALSE;
/* Optimize this! */
if (!using_weapon)
return FALSE;
if (IS_AFFECTED (ch, AFF_INVISIBLE) &&
!IS_AFFECTED (victim, AFF_DETECT_INVIS))
{
act ("You try to parry, but you can't see your opponent and fail!", victim, NULL, ch, TO_CHAR);
return FALSE;
}
/* If more than one fighting you, the less chance of parrying */
for (mob = ch->in_room->more->people; mob != NULL; mob = mob->next_in_room)
{
if (FIGHTING (mob) == victim
&& mob != victim)
number++;
}
if (number < 1)
number = 1;
if (IS_MOB (victim))
{
chance = victim->pIndexData->parry +
(UMIN (60, (LEVEL (victim) * 2)) / (number * 2));
}
else
{
chance = victim->pcdata->learned[gsn_parry] / (2 * number);
}
if (IS_PLAYER (victim) && is_member (victim, GUILD_WARRIOR))
chance += 32;
if (number_range (1, 1000) >= chance)
return FALSE;
if (number_range (1, 2) == 2)
{
act ("You skillfully parry $n's attack.", ch, NULL, victim, TO_VICT);
act ("$N skillfully parries your attack.", ch, NULL, victim, TO_CHAR);
act ("$N skillfully parries $n's attack.", ch, NULL, victim, TO_NOTVICT);
}
else
{
act ("You forcefully deflect $n's blade, parrying the attack.", ch, NULL, victim, TO_VICT);
act ("$N forcefully deflects your blade, parrying the attack.", ch, NULL, victim, TO_CHAR);
act ("$N deflects $n's attack with his weapon.", ch, NULL, victim, TO_NOTVICT);
}
if (number_range (1, 3) == 2)
skill_gain (victim, gsn_parry, TRUE);
SUBMOVE(victim,1);
return TRUE;
}
bool
check_dodge (CHAR_DATA * ch, CHAR_DATA * victim)
{
int chance;
CHAR_DATA *mob;
int number = 0;
if (RIDING (victim) != NULL)
return FALSE;
if (victim->move <= 5)
return FALSE;
if (IS_PLAYER (victim))
{
if (victim->pcdata->carry_weight > (get_curr_str (victim) * 2))
if (number_range (1, 6) == 2)
return FALSE;
if (victim->pcdata->carry_weight > (get_curr_str (victim) * 3))
if (number_range (1, 5) == 2)
return FALSE;
if (victim->pcdata->carry_weight > (get_curr_str (victim) * 4))
if (number_range (1, 4) == 2)
return FALSE;
if (victim->pcdata->carry_weight > (get_curr_str (victim) * 5))
if (number_range (1, 3) == 2)
return FALSE;
if (victim->pcdata->carry_weight > (get_curr_str (victim) * 6))
if (number_range (1, 3) == 2)
return FALSE;
}
if (!IS_AWAKE (victim) || victim->position <= POSITION_STUNNED)
return FALSE;
/* If more than one fighting you, the less chance of parrying */
for (mob = ch->in_room->more->people; mob != NULL; mob = mob->next_in_room)
{
if (FIGHTING (mob) == victim
&& mob != victim)
number++;
}
if (number < 1)
number = 1;
if (IS_MOB (victim))
{
chance = victim->pIndexData->dodge +
(UMIN (75, ((LEVEL (victim) * 5) / 2)) / (number));
}
else
{
chance = victim->pcdata->learned[gsn_dodge] / (2 * number);
}
if (IS_PLAYER (victim) && !is_member (victim, GUILD_THIEFG))
chance += 32;
if (number_range (0, 1000) >= chance)
return FALSE;
if (IS_AFFECTED (ch, AFF_INVISIBLE) && !IS_AFFECTED (victim, AFF_DETECT_INVIS))
{
if (number_range (1, 10) > 3)
{
act ("You try to dodge, but since you can't see where the attacker is, you fail!", victim, NULL, victim, TO_VICT);
return FALSE;
}
else
{
act ("Although you can't see the attacker, you get lucky and dodge the attack!", ch, NULL, victim, TO_VICT);
act ("$N gets lucky and quickly dodges your attack.", ch, NULL, victim, TO_CHAR);
act ("$N gets lucky and dodges $n's attack.", ch, NULL, victim, TO_NOTVICT);
if (number_range (1, 4) == 2)
skill_gain (victim, gsn_dodge, TRUE);
SUBMOVE(victim,1);
return TRUE;
}
}
else
{
if (victim->position != POSITION_BASHED)
{
if (number_range (1, 2) == 2)
{
act ("You step aside, dodging $n's attack.", ch, NULL, victim, TO_VICT);
act ("$N quickly steps aside, dodging your attack.", ch, NULL, victim, TO_CHAR);
act ("$N steps aside, dodging $n's attack.", ch, NULL, victim, TO_NOTVICT);
}
else
{
if (number_range (1, 2) == 2)
{
act ("You duck right, dodging $n's attack.", ch, NULL, victim, TO_VICT);
act ("$N ducks right, dodging your attack.", ch, NULL, victim, TO_CHAR);
act ("$N ducks right, dodging $n's attack.", ch, NULL, victim, TO_NOTVICT);
}
else
{
act ("You duck left, dodging $n's attack.", ch, NULL, victim, TO_VICT);
act ("$N ducks left, dodging your attack.", ch, NULL, victim, TO_CHAR);
act ("$N ducks left, dodging $n's attack.", ch, NULL, victim, TO_NOTVICT);
}
}
}
else
{
act ("You roll out of the way of $n's attack.", ch, NULL, victim, TO_VICT);
act ("$N rolls out of the way of your attack.", ch, NULL, victim, TO_CHAR);
act ("$N rolls out of the way of $n's attack.", ch, NULL, victim, TO_NOTVICT);
}
if (number_range (1, 4) == 2)
skill_gain (victim, gsn_dodge, TRUE);
SUBMOVE(victim,1);
return TRUE;
}
return FALSE;
}
/*
* Check for shield block.
*/
bool
check_shield (CHAR_DATA * ch, CHAR_DATA * victim)
{
int chance, chancey;
CHAR_DATA *mob;
CHAR_DATA *vict;
SINGLE_OBJECT *Attshield = NULL;
int number = 0;
vict = FIGHTING (ch);
if (!IS_AWAKE (victim))
return FALSE;
/* Optimize this */
if (!using_shield)
return FALSE;
/* If more than one fighting you, the less chance of parrying */
for (mob = ch->in_room->more->people; mob != NULL; mob = mob->next_in_room)
{
if (FIGHTING (mob) == victim
&& mob != victim)
number++;
}
if (number < 1)
number = 1;
if (IS_MOB (victim))
chance = UMIN (60, LEVEL (victim));
else
{
chance = victim->pcdata->learned[gsn_shield_block] / (number);
}
if (number_range (1, 1200) >= chance)
return FALSE;
act ("You block $n's attack with your shield.", ch, NULL, victim, TO_VICT);
act ("$N blocks your attack with $S shield.", ch, NULL, victim, TO_CHAR);
act ("$N blocks $n's attack with $S shield.", ch, NULL, victim, TO_NOTVICT);
skill_gain (victim, gsn_shield_block, TRUE);
chancey = (get_curr_dex (ch) + 10);
if (Attshield == NULL)
return TRUE;
else if (number_range (1, 30) <= chancey)
{
int dam;
act ("You slam into $N with your shield.", ch, NULL, vict, TO_CHAR);
act ("$N slams into you with $s shield.", ch, NULL, vict, TO_VICT);
act ("$N slams $S shield into $n's body.", ch, NULL, vict, TO_NOTVICT);
dam = ((get_curr_str (ch)) / (number_range (2, 5)));
SUBHIT(vict,dam);
if (vict->hit < 1)
vict->hit = 1;
}
return TRUE;
}
/*
* Set position of a victim.
*/
void
update_pos (CHAR_DATA * victim)
{
if (victim == NULL)
return;
if (victim->position==POSITION_STANDING && victim->fgt && victim->fgt->field) {
remove_from_combat_field(victim);
}
if (victim->hit > 0)
{
if (victim->position <= POSITION_STUNNED && victim->position >= 0)
{
if (FIGHTING (victim) == NULL)
NEW_POSITION(victim, POSITION_STANDING);
}
return;
}
if (IS_MOB (victim) || victim->hit <= -5)
{
NEW_POSITION(victim, POSITION_DEAD);
return;
}
if (victim->hit <= -3)
NEW_POSITION(victim, POSITION_MORTAL);
else if (victim->hit <= -1)
NEW_POSITION(victim, POSITION_INCAP);
else
NEW_POSITION(victim, POSITION_STUNNED);
return;
}
/*
* Start fights.
*/
void
set_fighting (CHAR_DATA * ch, CHAR_DATA * victim)
{
check_ced (ch);
check_ced (victim);
check_fgt (ch);
check_fgt (victim);
if (ch == NULL || victim == NULL)
return;
if (ch==victim && !pow.can_fight_self) return;
/*if ( IS_AFFECTED(ch, AFF_SLEEP) )
affect_strip( ch, gsn_sleep ); */
ch->fgt->fighting = victim;
if (ch->position != POSITION_GROUNDFIGHTING && ch->position != POSITION_BASHED)
NEW_POSITION(ch, POSITION_FIGHTING);
add_to_fighting_list (ch);
add_to_fighting_list (victim);
if (!FIGHTING(victim)) {
set_fighting(victim,ch);
}
#ifndef OLD_FIGHT
add_to_combat_field(ch,victim);
add_to_combat_field(victim,ch);
#endif
if (1) /*!second)*/
{
if (IS_MOB (victim) && FIGHTING (victim) != NULL && IS_PLAYER (FIGHTING (victim)) && !victim->ced->has_yelled && victim->pIndexData->yeller_number != 0
&& (HUNTING (victim) == NULL || FIGHTING (FIGHTING (victim)) == NULL))
{
CHAR_DATA *tempch;
CHAR_DATA *witness;
if (!IS_SET (victim->pIndexData->act4, ACT4_SOLOYELL))
{
witness = NULL;
for (witness = victim->in_room->more->people; witness != NULL; witness = witness->next_in_room)
{
if (witness == victim || (witness->pIndexData && witness->pIndexData->yeller_number < 1))
continue;
check_ced (witness);
if (IS_MOB (witness) && !witness->ced->has_yelled && witness->pIndexData->yeller_number == victim->pIndexData->yeller_number)
break;
}
if (witness != NULL)
{
for (tempch = char_list; tempch != NULL; tempch = tempch->next)
{
if (tempch->in_room && tempch->in_room->area != victim->in_room->area)
continue;
if (IS_MOB (tempch) && tempch->pIndexData->yeller_number == victim->pIndexData->yeller_number && tempch->in_room && tempch->in_room->area == victim->in_room->area && tempch->pIndexData->will_help > 0)
{
if (tempch->pIndexData->will_help == 1 || number_range (1, tempch->pIndexData->will_help) == 2)
{
if (HUNTING (tempch) != NULL)
{
free_string (tempch->fgt->hunting);
tempch->fgt->hunting = NULL;
}
check_fgt (tempch);
tempch->fgt->hunting = str_dup (NAME (FIGHTING (victim)));
add_to_fighting_list (tempch);
}
}
}
check_ced (victim);
check_ced (witness);
victim->ced->has_yelled = TRUE;
witness->ced->has_yelled = TRUE;
if (can_yell (witness))
{
char buffr[500];
if (number_range (1, 2) == 1)
sprintf (buffr, "Help! %s is attacking %s!", NAME (FIGHTING (victim)), SD (victim));
else
sprintf (buffr, "%s is trying to kill %s! Send help!", NAME (FIGHTING (victim)), SD (victim));
do_yell (witness, buffr);
}
}
}
else
{
for (tempch = char_list; tempch != NULL; tempch = tempch->next)
{
if (tempch->in_room && tempch->in_room->area != victim->in_room->area)
continue;
if (IS_MOB (tempch) && tempch->pIndexData->yeller_number == victim->pIndexData->yeller_number && tempch->in_room && tempch->in_room->area == victim->in_room->area && tempch->pIndexData->will_help > 0)
{
if (tempch->pIndexData->will_help == 1 || number_range (1, tempch->pIndexData->will_help) == 2)
{
if (HUNTING (tempch) != NULL)
{
free_string (tempch->fgt->hunting);
tempch->fgt->hunting = NULL;
}
check_fgt (tempch);
tempch->fgt->hunting = str_dup (NAME (FIGHTING (victim)));
add_to_fighting_list (tempch);
}
}
}
victim->ced->has_yelled = TRUE;
if (can_yell (victim))
{
char buffr[500];
if (number_range (1, 2) == 1)
sprintf (buffr, "%s just attacked me!", NAME (FIGHTING (victim)));
else
sprintf (buffr, "%s is trying to kill me!!", NAME (FIGHTING (victim)));
do_yell (victim, buffr);
}
}
}
}
/*End if !second */ return;
}
/*
* Stop fights.
*/
void
stop_fighting (CHAR_DATA * ch, bool fBoth)
{
CHAR_DATA *fch;
CHAR_DATA *fch_next;
if (FIGHTING(ch)==FIGHTING(FIGHTING(ch))) fBoth=TRUE;
if (fBoth && FIGHTING (ch))
{
remove_from_combat_field(FIGHTING(ch));
NEW_POSITION(ch->fgt->fighting,POSITION_STANDING);
if (FIGHTING (FIGHTING (ch)))
ch->fgt->fighting->fgt->fighting = NULL;
update_pos (FIGHTING (ch));
}
remove_from_combat_field(ch);
for (fch = f_first; fch != NULL; fch = fch_next)
{
fch_next = fch->next_fighting;
if (fch == ch || (fBoth && FIGHTING (fch) != NULL && FIGHTING (fch) == ch))
{
fch->fgt->fighting = NULL;
NEW_POSITION(fch, POSITION_STANDING);
fch->fgt->combat_delay_count = -1;
update_pos (fch);
}
}
if (ch->fgt)
ch->fgt->fighting = NULL;
NEW_POSITION(ch, POSITION_STANDING);
update_pos (ch);
return;
}
bool
IS_CORPSE_MOB (CHAR_DATA * ch)
{
if (IS_PLAYER (ch))
return TRUE;
switch (ch->pIndexData->mobtype)
{
case MOB_GHOST:
return FALSE;
break;
case MOB_STATUE:
return FALSE;
break;
case MOB_PLANT:
return FALSE;
break;
case MOB_FISH:
return FALSE;
break;
}
return TRUE;
}
int
xp_compute (CHAR_DATA * gch, CHAR_DATA * victim)
{
int before;
int kk;
if (IS_MOB (gch) || !pow.evil_good)
return 0;
if (!race_info[gch->pcdata->race].switch_aligns)
return 0;
before = gch->pcdata->alignment;
kk = ALIGN (victim) / 70;
if (kk < -3)
kk = -3;
if (kk > 3)
kk = 3;
gch->pcdata->alignment -= kk;
if (ALIGN (gch) < -100 && ALIGN (gch) > -150 && IS_PLAYER (gch))
send_to_char ("You feel a strange evil presence creeping into your soul...\n\r", gch);
if (ALIGN (gch) > 100 && ALIGN (gch) < 150)
send_to_char ("You feel a strange devotion to virtue creeping into your soul...\n\r", gch);
conv_race (gch);
clan_check_align (gch);
if (!IS_EVIL (gch) && before < -149)
{
gch->pcdata->alignment = 5000;
gch->pcdata->warpoints = 0;
}
if (IS_EVIL (gch) && before > -150)
{
gch->pcdata->alignment = -5000;
gch->pcdata->warpoints = 0;
}
return 2;
}
void
disarm (CHAR_DATA * ch, CHAR_DATA * victim)
{
SINGLE_OBJECT *obj;
if ((obj = get_item_held (ch, ITEM_WEAPON)) == NULL)
return;
if ((obj = get_item_held (victim, ITEM_WEAPON)) == NULL)
return;
if (number_range (0, 30) < get_curr_str (victim))
{
act ("$n tries to disarm you, but your strength allows you to hold on!", ch, NULL, victim, TO_VICT_SPAM + 1000);
act ("You try to disarm $N, but $N's strength won't allow it!", ch, NULL, victim, TO_CHAR + 1000);
act ("$n tries to disarm $N, but $N's strength won't allow it!", ch, NULL, victim, TO_NOTVICT_SPAM + 1000);
return;
}
if (number_range (1, 3) > 1)
return;
if (IS_SET (obj->extra_flags, ITEM_NOREMOVE) || IS_IMMORTAL (ch))
{
act ("$B$n tries to disarm you, but $p stays firmly in your sweaty hand!$R",
ch, obj, victim, TO_VICT);
act ("You try to knock the weapon from $S's hand, but you fail miserably!",
ch, obj, victim, TO_CHAR);
return;
}
act ("$B$4$n disarms you and sends your weapon flying!$R$7", ch, NULL, victim, TO_VICT);
act ("$B$4You have managed to disarm $N!$R$7", ch, NULL, victim, TO_CHAR);
act ("$B$4$n disarms $N!$R$7", ch, NULL, victim, TO_NOTVICT);
unequip_char (victim, obj);
obj_from (obj);
if (IS_MOB (victim))
obj_to (obj, victim);
else
obj_to (obj, victim->in_room);
return;
}
void
do_bash (CHAR_DATA * ch, char *argy)
{
CHAR_DATA *victim;
int chan;
bool notft = FALSE;
int tmpi;
char buf[STD_LENGTH];
DEFINE_COMMAND ("bash", do_bash, POSITION_FIGHTING, 0, LOG_NEVER, "This command allows you to bash an opponent to the ground.")
check_fgt (ch);
chan = 0;
/*if (!FIGHTING(ch)) {
send_to_char("You cannot start combat with a bash. Use KILL instead.\n\r",ch);
return;
} */
if (ch->wait > 2)
return;
if (ch->fgt->ears > 9)
{
send_to_char ("You can't bash this soon again after giving or recieving a bash.\n\r", ch);
return;
}
if (ch->in_room->sector_type == SECT_UNDERWATER)
{
send_to_char ("Bash someone underwater? I don't think so...\n\r", ch);
return;
}
if ((FIGHTING (ch) == NULL || ch->position != POSITION_FIGHTING) && (argy == "" || argy[0] == '\0'))
{
send_to_char ("Bash whom?\n\r", ch);
return;
}
if (FIGHTING (ch) == NULL)
{
notft = TRUE;
if ((victim = get_char_room (ch, argy)) == NULL)
{
if (argy[0] == '\0')
{
send_to_char ("Bash who?\n\r", ch);
return;
}
send_to_char ("They aren't here.\n\r", ch);
return;
}
if (victim == ch)
{
send_to_char ("You really do look like an idiot!\n\r", ch);
return;
}
}
else
victim = ch->fgt->fighting;
if (RIDING (ch) != NULL)
{
send_to_char ("You can't bash someone when you are riding!\n\r", ch);
return;
}
if (is_safe (ch, victim))
{
return;
}
check_ced (ch);
check_ced (victim);
if (!(IS_IN_MELEE (ch, victim)))
{
send_to_char ("You aren't on the front lines of that battle!\n\r", ch);
return;
}
if (FIGHTING (ch) != victim)
{
if (!pkill (ch, victim))
return;
check_pkill (ch, victim);
}
if (!can_see (ch, victim))
{
send_to_char ("How can you bash someone you can't see!?\n\r", ch);
return;
}
if (ch->position == POSITION_GROUNDFIGHTING)
{
act ("You are wrestling on the ground! You can't bash $N!", ch, NULL, victim, TO_CHAR);
return;
}
if (victim->position == POSITION_GROUNDFIGHTING)
{
send_to_char ("Your victim is groundfighting!\n\r", ch);
return;
}
if (ch->position == POSITION_BASHED)
{
act ("You yourself are bashed.. how do you expect to bash $N?", ch, NULL, victim, TO_CHAR);
return;
}
if (!bashable (victim))
{
act ("You can't bash that kind of creature!", ch, NULL, victim, TO_CHAR);
return;
}
check_fgt (victim);
#ifndef OLD_FIGHT
if (!ch->fgt || is_fighting_near(ch,victim)==-1) {
send_to_char("You must be next to that opponent to bash him/her/it.\n\r",ch);
return;
}
if (ch->fgt && ch->fgt->field_ticks>0) {
char bb[500];
sprintf(bb,"bash %s",argy);
setnext(ch,bb);
return;
}
#endif
if (victim->fgt->combat_delay_count < -2)
{
act ("$N is alert from $S last bash to the ground. You nearly fall over!", ch, NULL, victim, TO_CHAR);
WAIT_STATE (ch, 2 * PULSE_VIOLENCE);
return;
}
if (victim->position == POSITION_BASHED)
{
act ("$N has already been bashed to the ground!", ch, NULL, victim, TO_CHAR);
return;
}
if (number_range (1, 11) == 3 && IS_AWAKE (victim) && IS_AFFECTED (victim, AFF_FLYING) && !IS_AFFECTED (ch, AFF_FLYING))
{
/*basher is not flying, victim is */
act ("$N quickly flies out of the way of $n's bash!", ch, NULL, victim, TO_NOTVICT + 1000);
act ("$N quickly flies out of the way of your bash!", ch, NULL, victim, TO_CHAR + 1000);
act ("You quickly fly out of the way of $n's bash!", ch, NULL, victim, TO_VICT + 1000);
WAIT_STATE (ch, 4 * PULSE_VIOLENCE);
return;
}
if (IS_MOB (victim))
tmpi = 10;
else
tmpi = (15 + get_curr_dex (victim) + (victim->pcdata->learned[gsn_dodge] / 6));
if (IS_MOB (ch))
chan = (LEVEL (ch) * 2);
else
chan = ((ch->pcdata->learned[gsn_bash]) + (get_curr_str (ch) * 2)) - tmpi;
if (IS_PLAYER (ch) && ch->pcdata->learned[gsn_bash] < 5)
chan = 5;
if (chan < 5)
chan = 5;
if (chan > 155)
chan = number_range (130, 160);
if (HAS_BODY_STRENGTH_IMPLANT (ch))
chan += number_range (18, 34);
if (HAS_BODY_STRENGTH_IMPLANT (victim))
chan -= number_range (10, 20);
if (number_range (0, 210) > chan && IS_AWAKE (victim))
{
act ("You miss the bash and almost fall on the ground!", ch, NULL, victim, TO_CHAR + 1000);
act ("$n tries to bash you, but almost falls over instead!", ch, NULL, victim, TO_VICT + 1000);
act ("$n misses a bash at $N and almost falls over!", ch, NULL, victim, TO_NOTVICT + 1000);
if (notft)
{
WAIT_STATE (ch, (double) 7.3 * PULSE_VIOLENCE);
}
else
WAIT_STATE (ch, (double) 5.3 * PULSE_VIOLENCE);
if (FIGHTING (victim) == NULL)
set_fighting (victim, ch);
set_fighting (ch, victim);
return;
}
if (RIDING (victim) != NULL)
{
sprintf (buf, "$B$2Your powerful bash sends $N flying off of %s!$R$7", PERS (RIDING (victim), ch));
act (buf, ch, NULL, victim, TO_CHAR);
sprintf (buf, "$B$2$n's bash sends $N flying off of %s!$R$7", NAME (RIDING (victim)));
act (buf, ch, NULL, victim, TO_NOTVICT);
sprintf (buf, "$B$2You fly off of %s as $n bashes you!$R$7", PERS (RIDING (victim), victim));
act (buf, ch, NULL, victim, TO_VICT);
check_fgt (victim->fgt->riding);
victim->fgt->riding->fgt->mounted_by = NULL;
victim->fgt->riding = NULL;
}
else if (RIDING (victim) == NULL)
{
if (number_range (1, 18) != 4 || !can_groundfight (victim) || LEVEL (victim) < 12
|| !can_groundfight (ch) || LEVEL (ch) < 12 || !pow.bash_slip_to_tackle)
{
char buf[400];
act ("$B$2Your powerful bash sends $N sprawling onto the ground!$R$7", ch, NULL, victim, TO_CHAR + 1000);
act ("$B$2$n sends $N sprawling backwards on to the ground with a powerful bash!$R$7", ch, NULL, victim, TO_NOTVICT + 1000);
act ("$B$2$n sends you sprawling backwards on to the ground with a powerful bash!$R$7", ch, NULL, victim, TO_VICT + 1000);
if (IS_PLAYER (ch))
skill_gain (ch, gsn_bash, TRUE);
if (CHALLENGE (ch) == 10)
{
sprintf (buf, "($B$1Arena$N$7) $B%s just sent %s flying with a bash!", NAME (ch), NAME (victim));
do_arenaecho (ch, buf, TRUE);
}
}
else
{
char buf[500];
int i;
act ("$B$5You bash $N, but trip and stumble! You are now groundfighting!$R$7", ch, NULL, victim, TO_CHAR);
act ("$B$5$n bashes $N, but trips and falls! They begin fighting on the ground!$R$7", ch, NULL, victim, TO_NOTVICT);
act ("$B$5$n bashes you, but trips and looses his balance and falls on top of you. You begin to ground-fight!!$R$7", ch, NULL, victim, TO_VICT);
if (CHALLENGE (ch) == 10)
{
i = number_range (1, 3);
if (i == 1)
sprintf (buf, "($B$1Arena$N$7) $B%s tries to bash %s but they both fall to the\n\r($B$1Arena$N$7) $Bground in a bloody tangle of elbows and teeth...", NAME (ch), NAME (victim));
if (i == 2)
sprintf (buf, "($B$1Arena$N$7) $B%s falls on his face, trying to bash %s.\n\r($B$1Arena$N$7) $BThey both fall over and begin clawing at each other!", NAME (ch), NAME (victim));
if (i == 3)
sprintf (buf, "($B$1Arena$N$7) $B%s tries to bash %s, but %s catches %s\n\r($B$1Arena$N$7) $Bwith an elbow and they both fall to the ground in a bloody mess!", NAME (ch), NAME (victim), NAME (victim), NAME (ch));
do_arenaecho (ch, buf, TRUE);
}
set_fighting (ch, victim);
victim->fgt->fighting = ch;
NEW_POSITION(victim, POSITION_GROUNDFIGHTING);
NEW_POSITION(ch, POSITION_GROUNDFIGHTING);
return;
}
}
{
SPELL_DATA *s;
if ((s = skill_lookup (NULL, gsn_bash)) == NULL)
{
fprintf (stderr, "Bash not found!\n");
return;
}
victim->fgt->combat_delay_count = 4;
if (victim->position != POSITION_FIGHTING)
victim->fgt->fighting = ch;
victim->position = POSITION_BASHED;
set_fighting (ch, victim);
victim->fgt->ears = 10 + (s->casting_time);
ch->fgt->ears = 10 + (s->casting_time * 2);
}
return;
}
void
trip (CHAR_DATA * ch, CHAR_DATA * victim)
{
if (ch->in_room->sector_type == SECT_UNDERWATER)
{
return;
}
if (RIDING (victim) != NULL)
return;
if (
IS_AFFECTED (victim, AFF_FLYING)
|| IS_IMMORTAL (ch))
{
act ("$n tries to trip you, but you float over it!", ch, NULL, victim, TO_VICT_SPAM);
act ("You try to trip $N, but $N floats over it!", ch, NULL, victim, TO_CHAR);
act ("$n tries to trip $N, but $N floats over it!", ch, NULL, victim, TO_NOTVICT_SPAM);
return;
}
act ("$B$n trips you and you go down!$R", ch, NULL, victim, TO_VICT);
act ("You trip $N and $E goes down!", ch, NULL, victim, TO_CHAR);
act ("$n trips $N!", ch, NULL, victim, TO_NOTVICT);
victim->fgt->combat_delay_count = UMAX (1, dice (1, 5 - get_curr_dex (victim) / 6));
WAIT_STATE (ch, PULSE_VIOLENCE);
WAIT_STATE (victim, PULSE_VIOLENCE);
return;
}
void
do_kill (CHAR_DATA * ch, char *argy)
{
char arg[SML_LENGTH];
CHAR_DATA *victim;
CHAR_DATA *fch, *fch_next;
DEFINE_COMMAND ("kill", do_kill, POSITION_FIGHTING, 0, LOG_NORMAL, "This command allows you to start combat or switch targets during combat.")
check_fgt (ch);
one_argy (argy, arg);
if (ch->fgt->ears > 9)
{
send_to_char ("You are suffering from the ever-popular bash lag (tm), and therefore\n\rcannot attack another mob/player or use the kill command.\n\r", ch);
return;
}
if (arg[0] == '\0')
{
send_to_char ("Syntax: Kill <thing/person to kill>\n\r", ch);
return;
}
if ((victim = get_char_room (ch, arg)) == NULL)
{
send_to_char ("Who or what is that?\n\r", ch);
return;
}
if (victim == ch)
{
send_to_char ("You hit yourself.. moron!\n\r", ch);
multi_hit (ch, ch, TYPE_UNDEFINED);
return;
}
if (!can_see (ch, victim))
{
send_to_char ("Who or what is that?\n\r", ch);
return;
}
if (is_safe (ch, victim))
{
return;
}
if (!pkill (ch, victim))
return;
check_pkill (ch, victim);
if (victim->position == POSITION_GROUNDFIGHTING)
{
set_fighting (ch, victim);
return;
}
if (IS_AFFECTED (ch, AFF_CHARM) && MASTER (ch) == victim)
{
act ("$N is your master!", ch, NULL, victim, TO_CHAR);
return;
}
for (fch = ch->in_room->more->people; fch != NULL; fch = fch_next)
{
fch_next = fch->next_in_room;
if (IS_MOB (fch) && IS_SET (fch->pIndexData->act3, ACT3_GUARD_MOB)
&& victim->pIndexData != NULL && victim->pIndexData->vnum == fch->pIndexData->guard)
{
do_say (fch, "You'll have to get by me first!");
#ifdef OLD_FIGHT
multi_hit (fch, ch, TYPE_UNDEFINED);
#else
set_fighting(fch,ch);
#endif
return;
}
}
if (FIGHTING (ch) && victim == FIGHTING (ch))
{
act ("You're already fighting $N!", ch, NULL, victim, TO_CHAR);
return;
}
check_fgt (victim);
#ifdef OLD_FIGHT
if (ch->position == POSITION_FIGHTING && FIGHTING (ch) != victim)
#endif
{
if (!IS_AWAKE(victim)) {
multi_hit (ch, victim, TYPE_UNDEFINED);
return;
}
act ("Your new target is $N!", ch, NULL, victim, TO_CHAR);
act ("$n turns and targets $N!", ch, NULL, victim, TO_ROOM);
WAIT_STATE (ch, PULSE_VIOLENCE);
set_fighting(ch,victim);
}
#ifndef OLD_FIGHT
return;
#endif
if ((IS_PLAYER (victim)) && IS_AFFECTED (ch, AFF_CHARM))
{
return;
}
if (ch->fgt->combat_delay_count >= 0)
{
ch->fgt->combat_delay_count = -1;
}
if (victim->fgt->combat_delay_count >= 0)
{
victim->fgt->combat_delay_count = -1;
}
WAIT_STATE (ch, 5 * PULSE_VIOLENCE);
if (IS_MOB (ch) && IS_SET (ch->act, ACT_KILLGLADIATOR))
{
do_say (ch, "You are not permitted to leave!!");
}
set_fighting (ch, victim);
if (victim->position != POSITION_FIGHTING &&
victim->position != POSITION_GROUNDFIGHTING &&
victim->position != POSITION_BASHED)
victim->fgt->fighting = ch;
#ifdef OLD_FIGHT
multi_hit (ch, victim, TYPE_UNDEFINED);
#endif
return;
}
void
do_flurry (CHAR_DATA * ch, char *argy)
{
char arg[SML_LENGTH];
CHAR_DATA *victim;
DEFINE_COMMAND ("flurry", do_flurry, POSITION_FIGHTING, 0, LOG_NORMAL, "This command allows you to flail around madly in a wild flurry. Anyone can do this (it uses moves).")
if (!FIGHTING (ch))
{
send_to_char ("You must be fighting to flurry.\n\r", ch);
return;
}
one_argy (argy, arg);
if (ch->fgt->ears > 9)
{
send_to_char ("You can't flurry this soon after giving or recieving a bash.\n\r", ch);
return;
}
if (ch->position == POSITION_GROUNDFIGHTING)
{
send_to_char ("You can't Flurry while groundfighting!\n\r", ch);
return;
}
if (ch->position == POSITION_BASHED)
{
send_to_char ("You can't flurry when you have been bashed!\n\r", ch);
return;
}
if (FIGHTING (ch) == NULL)
{
send_to_char ("You can't begin a fight with a flurry; you must be already fighting!\n\r", ch);
return;
}
if (ch->move < pow.flurry_mps)
{
send_to_char ("You are too exhausted to flurry.\n\r", ch);
return;
}
victim = ch->fgt->fighting;
#ifndef OLD_FIGHT
if (!ch->fgt || is_fighting_near(ch,victim)==-1) {
send_to_char("You must be next to your opponent to flurry into him/her/it.\n\r",ch);
return;
}
if (ch->fgt && ch->fgt->field_ticks>0) {
setnext(ch,"flurry");
return;
}
#endif
SUBMOVE(ch,pow.flurry_mps);
upd_mps (ch);
WAIT_STATE (ch, 3 * PULSE_VIOLENCE);
act ("You open up a wild flurry of multiple attacks!", ch, NULL, victim, TO_CHAR + 1000);
act ("$n opens up in a wild flurry of multiple attacks!", ch, NULL, victim, TO_ROOM + 1000);
hitop=FALSE;
multi_hit (ch, victim, TYPE_UNDEFINED);
if (victim->data_type != 50)
multi_hit (ch, victim, TYPE_UNDEFINED);
if (hitop && ch->fgt && ch->fgt->field && victim && victim->fgt && victim->fgt->field) {
java_hit_field(ch->fgt->field,ch,ch->fgt->pos_x,ch->fgt->pos_y,
victim->fgt->pos_x,victim->fgt->pos_y);
}
hitop=FALSE;
return;
}
void
do_bs (CHAR_DATA * ch, char *argy)
{
DEFINE_COMMAND ("bs", do_bs, POSITION_STANDING, 0, LOG_NORMAL, "See backstab.")
do_backstab (ch, argy);
return;
}
void
do_backstab (CHAR_DATA * ch, char *argy)
{
char arg[SML_LENGTH];
CHAR_DATA *victim;
SINGLE_OBJECT *obj;
int dt;
SPELL_DATA *spl;
DEFINE_COMMAND ("backstab", do_backstab, POSITION_STANDING, 0, LOG_NORMAL, "This command allows you to sneak behind an opponent and place a piercing weapon in his/her/its back.")
if ((spl = skill_lookup ("Backstab", -1)) == NULL)
{
send_to_char ("Huh?\n\r", ch);
return;
}
one_argy (argy, arg);
if (arg[0] == '\0')
{
send_to_char ("Backstab whom?\n\r", ch);
return;
}
if ((victim = get_char_room (ch, arg)) == NULL)
{
send_to_char ("They aren't here.\n\r", ch);
return;
}
if (victim == ch)
{
send_to_char ("How can you sneak up on yourself?\n\r", ch);
return;
}
if (is_safe (ch, victim))
{
return;
}
if (!pkill (ch, victim))
return;
check_pkill (ch, victim);
if ((obj = get_item_held (ch, ITEM_WEAPON)) == NULL)
{
send_to_char ("You need to wield a weapon.\n\r", ch);
return;
}
dt = ((I_WEAPON *) obj->more)->attack_type;
if (attack_table[dt].hit_type != TYPE_PIERCE)
{
send_to_char ("You need to wield a piercing weapon.\n\r", ch);
return;
}
if (FIGHTING (victim) != NULL)
{
send_to_char ("You can't backstab a person who is already *fighting*.\n\r", ch);
return;
}
if (IS_MOB (victim) &&
(
IS_SET (victim->pIndexData->act3, ACT3_GUARD_DOOR) ||
IS_SET (victim->pIndexData->act3, ACT3_GUARD_DOOR_EVIL) ||
IS_SET (victim->pIndexData->act3, ACT3_GUARD_DOOR_GOOD) ||
victim->pIndexData->clan_guard_1 ||
victim->pIndexData->clan_guard_2))
{
send_to_char ("But you can't get behind the mob to backstab; it's guarding an exit.\n\r", ch);
return;
}
if (!IS_AWAKE (victim))
{
do_actual_backstab (ch, argy);
return;
}
send_to_char ("You begin to stealthily move behind your target...\n\r", ch);
if (IS_PLAYER (ch))
ch->pcdata->tickcounts = spl->mana;
if (IS_MOB (ch))
{
do_actual_backstab (ch, argy);
return;
}
if (strlen (argy) > 140)
return;
check_temp (ch);
strcpy (ch->pcdata->temp->temp_string, argy);
NEW_POSITION(ch, POSITION_BACKSTAB);
return;
}
void
do_actual_backstab (CHAR_DATA * ch, char *argy)
{
char arg[SML_LENGTH];
CHAR_DATA *victim;
SINGLE_OBJECT *obj;
int dt;
SPELL_DATA *spl;
if ((spl = skill_lookup ("Backstab", -1)) == NULL)
{
send_to_char ("Huh?\n\r", ch);
return;
}
one_argy (argy, arg);
if (ch->position == POSITION_FIGHTING)
return;
NEW_POSITION(ch, POSITION_STANDING);
if (arg[0] == '\0')
{
send_to_char ("Backstab whom?\n\r", ch);
return;
}
if ((victim = get_char_room (ch, arg)) == NULL)
{
send_to_char ("They aren't here.\n\r", ch);
return;
}
if (victim == ch)
{
send_to_char ("How can you sneak up on yourself?\n\r", ch);
return;
}
if (is_safe (ch, victim))
{
return;
}
if ((obj = get_item_held (ch, ITEM_WEAPON)) == NULL)
{
send_to_char ("You need to wield a weapon.\n\r", ch);
return;
}
dt = ((I_WEAPON *) obj->more)->attack_type;
if (attack_table[dt].hit_type != TYPE_PIERCE)
{
send_to_char ("You need to wield a piercing weapon.\n\r", ch);
return;
}
if (FIGHTING (victim) != NULL)
{
send_to_char ("You can't backstab a person who is already *fighting*.\n\r", ch);
return;
}
if (IS_AFFECTED (victim, AFF_FLYING) && !IS_AFFECTED (ch, AFF_FLYING))
{
/*victim is flying, char is not */
if (number_range (1, 4) > 1)
{
act ("You manage to jump up high enough to get your dagger to $S back...", ch, NULL, victim, TO_CHAR);
}
else
{
act ("You can't reach $N because $E is flying too high...", ch, NULL, victim, TO_CHAR);
return;
}
}
if (IS_PLAYER (ch))
ch->pcdata->tickcounts = spl->casting_time;
/* set_fighting (ch, victim);
set_fighting (victim, ch);
*/ if (IS_PLAYER (ch))
skill_gain (ch, gsn_backstab, TRUE);
if (!IS_AWAKE (victim)
|| IS_MOB (ch)
|| (IS_PLAYER (ch) && number_percent () < ch->pcdata->learned[gsn_backstab]))
multi_hit (ch, victim, gsn_backstab);
else
damage (ch, victim, 0, gsn_backstab);
return;
}
void
do_flee (CHAR_DATA * ch, char *argy)
{
ROOM_DATA *was_in;
ROOM_DATA *now_in;
int fled_dir;
CHAR_DATA *victim;
char buf[STD_LENGTH];
int attempt, tattempt;
bool double_flee;
DEFINE_COMMAND ("flee", do_flee, POSITION_FIGHTING, 0, LOG_NORMAL, "This command allows you to flee from combat.")
check_fgt (ch);
#ifndef NEW_WORLD
if (ch->ced && ch->ced->in_boat)
{
do_board (ch, "boat");
return;
}
#endif
if (!FIGHTING(ch)) {
send_to_char("You cannot flee if you are not fighting!\n\r",ch);
return;
}
if (ch->position == POSITION_DEAD)
return;
if (ch->fgt->ears > 9)
{
send_to_char ("You are too off balance from your last combat action to flee!\n\r", ch);
return;
}
double_flee = TRUE;
if (IS_PLAYER (ch) && ch->pcdata->tickcounts > 1)
{
send_to_char ("You fail to find a pause in combat in which to flee!\n\r", ch);
return;
}
if (ch->wait > 1)
{
send_to_char ("You are too off-balance and cannot flee.\n\r", ch);
return;
}
WAIT_STATE (ch, 10);
if (ch->position == POSITION_BASHED)
{
send_to_char ("You try to crawl away, but you are bashed to the ground!\n\rBetter stand up first...\n\r", ch);
return;
}
/* if (number_range (1,5) > 2) {
send_to_char("You couldn't manage to flee from combat!\n\r",ch);
return;
}*/
if (number_range (1, 100) < pow.flee_chance)
{
send_to_char("You couldn't manage to flee from combat!\n\r",ch);
return;
}
if ((victim = FIGHTING (ch)) == NULL)
{
if (ch->position == POSITION_BASHED)
{
NEW_POSITION(ch, POSITION_STANDING);
update_pos (ch);
return;
}
NEW_POSITION(ch, POSITION_STANDING);
update_pos (ch);
send_to_char ("You don't have to flee if you're not fighting.\n\r", ch);
return;
}
if (ch->in_room && ch->in_room->more && ch->in_room->more->linked_to)
{
if (number_range (1, 3) != 2)
{
send_to_char ("You couldn't manage to get out of the vehicle!\n\r", ch);
return;
}
stop_fighting (ch, TRUE);
NEW_POSITION(ch, POSITION_STANDING);
send_to_char ("You managed to flee!\n\r", ch);
do_leave (ch, "");
return;
}
if (IS_MOB (ch))
{
if (number_range (1, 2) == 2)
{
act ("$n tries to escape, but can't get away!", ch, NULL, ch, TO_ROOM);
return;
}
if (victim->position == POSITION_DEAD)
{
stop_fighting (victim, TRUE);
ch->wait = 0;
return;
}
if (ch->position == POSITION_FIGHTING)
NEW_POSITION(ch, POSITION_STANDING);
}
if (ch->position == POSITION_GROUNDFIGHTING)
{
send_to_char ("You attempt to stand up...\n\r", ch);
do_stand (ch, "");
return;
}
if (IS_PLAYER (ch) && rchars_in_group (ch) > 1)
double_flee = FALSE;
was_in = ch->in_room;
for (attempt = 0; attempt < 6; attempt++)
{
EXIT_DATA *pexit;
int door;
door = number_door ();
if ((pexit = was_in->exit[door]) == 0
|| (ROOM_DATA *) pexit->to_room == NULL
|| ((ROOM_DATA *) pexit->to_room)->sector_type == SECT_WATER_NOSWIM
|| ((ROOM_DATA *) pexit->to_room)->sector_type == SECT_WATER_SWIM
|| (pexit->d_info && IS_SET (pexit->d_info->exit_info, EX_CLOSED))
|| (IS_MOB (victim) && (IS_SET (victim->pIndexData->act3, ACT3_GUARD_DOOR)
|| (IS_SET (victim->pIndexData->act3, ACT3_GUARD_DOOR_EVIL)
&& IS_EVIL (ch))
|| (IS_SET (victim->pIndexData->act3, ACT3_GUARD_DOOR_GOOD)
&& !IS_EVIL (ch)))
&& victim->pIndexData && victim->pIndexData->guard == door)
|| (IS_MOB (ch)
&& IS_SET (((ROOM_DATA *) pexit->to_room)->room_flags, ROOM_NO_MOB)))
continue;
if (RIDING (ch) != NULL)
{
send_to_char ("You fall from your mount as you try to escape!\n\r", ch);
check_fgt (ch->fgt->riding);
ch->fgt->riding->fgt->mounted_by = NULL;
ch->fgt->riding = NULL;
}
if (MOUNTED_BY (ch) != NULL)
{
send_to_char ("Your rider falls off as you try to escape!\n\r", ch);
send_to_char ("Your mount bolts from under you!\n\r", MOUNTED_BY (ch));
check_fgt (ch->fgt->mounted_by);
ch->fgt->mounted_by->fgt->riding = NULL;
ch->fgt->mounted_by = NULL;
}
move_char (ch, door + 20);
if (IS_JAVA(ch)) do_clear(ch,"");
if ((now_in = ch->in_room) == was_in)
continue;
ch->in_room = was_in;
sprintf (buf, "\x1B[1;32m%s flees %s in panic!\x1B[0m\n\r",
capitalize (NAME (ch)),
dir_name[door]);
act (buf, ch, NULL, NULL, TO_ROOM);
make_blood (ch, door);
ch->in_room = now_in;
if (IS_PLAYER (ch))
{
fled_dir = door;
was_in = ch->in_room;
for (tattempt = 0; tattempt < 6; tattempt++)
{
EXIT_DATA *tpexit;
int tdoor;
tdoor = number_door ();
if ((tpexit = was_in->exit[tdoor]) == 0
|| (ROOM_DATA *) tpexit->to_room == NULL
|| ((ROOM_DATA *) tpexit->to_room)->sector_type == SECT_WATER_NOSWIM
|| ((ROOM_DATA *) tpexit->to_room)->sector_type == SECT_WATER_SWIM
|| (tpexit->d_info && IS_SET (tpexit->d_info->exit_info, EX_CLOSED))
|| (IS_MOB (victim) && (IS_SET (victim->pIndexData->act3, ACT3_GUARD_DOOR)
|| (IS_SET (victim->pIndexData->act3, ACT3_GUARD_DOOR_EVIL)
&& IS_EVIL (ch))
|| (IS_SET (victim->pIndexData->act3, ACT3_GUARD_DOOR_GOOD)
&& !IS_EVIL (ch)))
&& victim->pIndexData && victim->pIndexData->guard == tdoor)
|| (IS_MOB (ch)
&& IS_SET (((ROOM_DATA *) tpexit->to_room)->room_flags, ROOM_NO_MOB)))
continue;
if (fled_dir == rev_dir[tdoor])
continue;
if (double_flee)
{
move_char (ch, tdoor + 20);
if (IS_JAVA(ch)) do_clear(ch,"");
if ((now_in = ch->in_room) == was_in)
continue;
}
break;
}
send_to_char ("Run away! You flee head over heels!\n\r", ch);
gain_exp (ch, -10);
}
if (FIGHTING (FIGHTING (ch)) == ch)
stop_fighting (ch, TRUE);
else
stop_fighting (ch, FALSE);
return;
}
act ("$N won't let you get away!", ch, NULL, FIGHTING (ch), TO_CHAR);
return;
}
void
do_rescue (CHAR_DATA * ch, char *argy)
{
char arg[SML_LENGTH];
CHAR_DATA *victim;
CHAR_DATA *fch;
int temp;
int temp2;
DEFINE_COMMAND ("rescue", do_rescue, POSITION_FIGHTING, 0, LOG_NORMAL, "This command allows you to rescue someone getting whacked. Success is based on your rescue skill.")
one_argy (argy, arg);
if (arg[0] == '\0')
{
send_to_char ("Who is that?\n\r", ch);
return;
}
if ((victim = get_char_room (ch, arg)) == NULL)
{
send_to_char ("Who is that?\n\r", ch);
return;
}
if ((IS_EVIL (ch) && !IS_EVIL (victim)) || (!IS_EVIL (ch) && IS_EVIL (victim)))
{
send_to_char ("Why would you want to do that?\n\r", ch);
return;
}
if (ch->position != POSITION_STANDING && ch->position != POSITION_FIGHTING)
{
send_to_char ("You must be fighting or standing to rescue someone.\n\r", ch);
return;
}
if (victim == ch)
{
send_to_char ("You rescue yourself. That did a lot of good.\n\r", ch);
return;
}
if (IS_PLAYER (ch) && IS_MOB (victim))
{
send_to_char ("That person doesn't want your help!\n\r", ch);
return;
}
if (FIGHTING (ch) == victim)
{
send_to_char ("You rescue yourself. That was useful.\n\r", ch);
return;
}
if ((fch = FIGHTING (victim)) == NULL)
{
send_to_char ("That person is not fighting right now.\n\r", ch);
return;
}
if (victim->position != POSITION_FIGHTING)
{
send_to_char ("That person isn't in a normal fighting position.\n\r", ch);
return;
}
if (fch->position != POSITION_FIGHTING)
{
send_to_char ("That person's opponent is not in a normal fighting position!\n\r", ch);
return;
}
if (victim->position == POSITION_GROUNDFIGHTING)
{
send_to_char ("That person is groundfighting! You can't rescue!\n\r", ch);
return;
}
#ifndef NEW_WORLD
if (IN_BOAT (victim) && !IN_BOAT (ch))
{
send_to_char ("But that person is in a boat!\n\r", ch);
return;
}
if (!IN_BOAT (victim) && IN_BOAT (ch))
{
send_to_char ("But that person is not in your boat!\n\r", ch);
return;
}
if (IN_BOAT (victim) && IN_BOAT (ch) && ch->ced->in_boat != victim->ced->in_boat)
{
send_to_char ("But you aren't in the same boat!\n\r", ch);
return;
}
#endif
if (victim->position == POSITION_GROUNDFIGHTING)
{
if (ch->position == POSITION_GROUNDFIGHTING)
{
send_to_char ("You are groundfighting! You can't rescue!\n\r", ch);
return;
}
set_fighting (ch, FIGHTING (victim));
return;
}
WAIT_STATE (ch, 15);
if (IS_PLAYER (ch) && number_percent () > ch->pcdata->learned[gsn_rescue])
{
send_to_char ("You attempt the rescue but fail.\n\r", ch);
return;
}
act ("You rescue $N!", ch, NULL, victim, TO_CHAR);
act ("$n rescues you!", ch, NULL, victim, TO_VICT);
act ("$n rescues $N!", ch, NULL, victim, TO_NOTVICT);
check_fgt (fch);
check_fgt (ch);
check_fgt (victim);
temp = victim->fgt->combat_delay_count;
temp2 = fch->fgt->combat_delay_count;
if (IS_PLAYER (ch))
{
stop_fighting (fch, FALSE);
stop_fighting (victim, FALSE);
}
check_fgt (fch);
check_fgt (victim);
set_fighting (ch, fch);
set_fighting (fch, ch);
check_fgt (fch);
check_fgt (victim);
victim->fgt->combat_delay_count = temp;
fch->fgt->combat_delay_count = temp2;
WAIT_STATE (ch, 22);
if (IS_PLAYER (ch)) {
skill_gain (ch, gsn_rescue, TRUE);
}
victim->fgt->combat_delay_count = temp;
fch->fgt->combat_delay_count = temp2;
return;
}
void
do_kick (CHAR_DATA * ch, char *argy)
{
CHAR_DATA *victim;
int ii, i;
bool notft = FALSE;
int dl = 0;
int iii = 1;
DEFINE_COMMAND ("kick", do_kick, POSITION_FIGHTING, 0, LOG_NORMAL, "This command allows you to kick an opponent. Success is based on kicking skill, power is based on profession and level.")
check_fgt (ch);
/*if (!FIGHTING(ch)) {
send_to_char("You cannot start combat with a kick. Use KILL instead.\n\r",ch);
return;
} */
if (ch->wait > 2)
return;
if (ch->fgt->ears > 9)
{
send_to_char ("You can't kick this soon after a bash.\n\r", ch);
return;
}
if (FIGHTING (ch) == NULL)
{
notft = TRUE;
if (argy[0] == '\0' || argy == "")
{
send_to_char ("Who?\n\r", ch);
return;
}
if ((victim = get_char_room (ch, argy)) == NULL)
{
send_to_char ("Who?\n\r", ch);
return;
}
if (victim == ch)
{
send_to_char ("You kick yourself in the butt, but it doesn't hurt that much.\n\r", ch);
return;
}
}
else
victim = ch->fgt->fighting;
if (victim->data_type==50) return;
if (is_safe (ch, victim))
{
return;
}
if (FIGHTING (ch) != victim)
{
if (!pkill (ch, victim))
return;
check_pkill (ch, victim);
}
check_ced (ch);
check_ced (victim);
if (!(IS_IN_MELEE (ch, victim)))
{
send_to_char ("You aren't on the front lines of that battle!\n\r", ch);
return;
}
if (ch->position == POSITION_BASHED)
{
send_to_char ("You try to kick, but from the ground you can't hit your opponent.\n\r", ch);
return;
}
if (ch->position == POSITION_GROUNDFIGHTING)
{
send_to_char ("You can't kick when you are locked into mortal combat on the ground!\n\r", ch);
return;
}
if (kickable (victim) == 0)
{
act ("You can't kick that type of creature!", ch, NULL, victim, TO_CHAR);
return;
}
#ifndef OLD_FIGHT
if (!ch->fgt || is_fighting_near(ch,victim)==-1) {
send_to_char("You must be next to that opponent to kick him/her/it.\n\r",ch);
return;
}
if (ch->fgt && ch->fgt->field_ticks>0) {
char bb[500];
sprintf(bb,"kick %s",argy);
setnext(ch,bb);
return;
}
#endif
if ((IS_PROF (ch, PROF_MONK)) && (LEVEL (ch) > 19))
dl = 50;
else
dl = 33;
if (notft)
dl += (2 * PULSE_VIOLENCE);
WAIT_STATE (ch, dl);
if (kickable (victim) == 2)
{
act ("You try to kick $N, but $E flies out of the way!", ch, NULL, victim, TO_CHAR);
return;
}
set_fighting (ch, victim);
/*set_fighting(victim,ch); */
if (IS_PROF (ch, PROF_MONK) && (LEVEL (ch) >= 45))
{
if (number_range (1, 10) < 4)
i = 3;
else
i = 2;
}
else if (IS_PROF (ch, PROF_MONK) && (LEVEL (ch) < 45) && (LEVEL (ch) > 19))
{
if (number_range (1, 10) < 6)
i = 2;
else
i = 1;
}
else
i = 1;
for (; i > 0; i--)
{
if (IS_MOB (ch) || (!IS_AWAKE (victim) || (IS_PLAYER (ch) && number_percent () < ch->pcdata->learned[gsn_kick])))
{
char buf[500];
int i;
int damm;
damm = translate (damt.kick_dam, LEVEL (ch), ch);
if (HAS_LEGS_STRENGTH_IMPLANT (ch))
damm += number_range (3, 4);
if (IS_PLAYER (ch) && IS_PROF (ch, PROF_MONK))
{
damm += 1;
if (LEVEL (ch) > 7 && number_range (1, 2) == 2)
damm += 1;
if (LEVEL (ch) > 16)
damm += 1;
if (LEVEL (ch) > 31)
damm += 1;
if (LEVEL (ch) > 54)
damm += 1;
if (LEVEL (ch) > 67)
damm += 1;
if (LEVEL (ch) > 81)
damm += 1;
}
if (IS_PLAYER (ch) && number_range (1, 3) == 2)
skill_gain (ch, gsn_kick, TRUE);
if (CHALLENGE (ch) == 10)
{
i = number_range (1, 3);
if (i == 1)
sprintf (buf, "($B$1Arena$N$7) $B%s kicks %s in the ribs... snap crackle pop!", NAME (ch), NAME (victim));
if (i == 2)
sprintf (buf, "($B$1Arena$N$7) $B%s kicks %s's knee; that's gotta hurt!", NAME (ch), NAME (victim));
if (i == 3)
sprintf (buf, "($B$1Arena$N$7) $B%s's kick catches %s in the side of the head!", NAME (ch), NAME (victim));
do_arenaecho (ch, buf, TRUE);
}
if (can_yell (victim))
{
if (damm < 5)
{
act ("\x1B[35;1mYour weak kick barely bruises $N's shin.\x1B[37;0m", ch, NULL, victim, TO_CHAR);
act ("\x1B[37;1m$n's weak kick barely bruises $N's shin.\x1B[0m", ch, NULL, victim, TO_NOTVICT);
act ("\x1B[36;1m$n's weak kick bruises your shin.\x1B[37;0m", ch, NULL, victim, TO_VICT);
}
else
{
ii = number_range (1, 5);
if (ii == 1)
{
act ("\x1B[35;1mYour kick slams into $N's shin!\x1B[37;0m", ch, NULL, victim, TO_CHAR);
act ("\x1B[37;1m$n's kick slams into $N's shin.\x1B[0m", ch, NULL, victim, TO_NOTVICT);
act ("\x1B[36;1m$n's kick slams into your shin!\x1B[37;0m", ch, NULL, victim, TO_VICT);
}
else if (ii == 2)
{
act ("\x1B[35;1mYour kick smashes into $N's solar plexus!\x1B[37;0m", ch, NULL, victim, TO_CHAR);
act ("\x1B[37;1m$n kicks $N directly in the solar plexus!\x1B[0m", ch, NULL, victim, TO_NOTVICT);
act ("\x1B[36;1m$n kicks you in the solar plexus! Ouch!\x1B[37;0m", ch, NULL, victim, TO_VICT);
}
else if (ii == 3)
{
act ("\x1B[35;1mYour kick smashes into $N's knee!\x1B[37;0m", ch, NULL, victim, TO_CHAR);
act ("\x1B[37;1m$n kicks $N's knee very hard!\x1B[0m", ch, NULL, victim, TO_NOTVICT);
act ("\x1B[36;1m$n kicks your knee, and you nearly fall over...\x1B[37;0m", ch, NULL, victim, TO_VICT);
}
else if (ii == 4)
{
act ("\x1B[35;1mYou lift your leg high, and kick $N in the head!!\x1B[37;0m", ch, NULL, victim, TO_CHAR);
act ("\x1B[37;1m$n kicks $N's right in the face! Ouch...\x1B[0m", ch, NULL, victim, TO_NOTVICT);
act ("\x1B[36;1m$n kicks you in the face!\x1B[37;0m", ch, NULL, victim, TO_VICT);
act ("\x1B[31;1mBlood spurts from $N's nose!\x1B[37;0m", ch, NULL, victim, TO_CHAR);
act ("\x1B[31;1mBlood spurts from $N's nose!\x1B[37;0m", ch, NULL, victim, TO_NOTVICT);
act ("\x1B[31;1mBlood pours forth from your injured nose!\x1B[37;0m", ch, NULL, victim, TO_VICT);
}
else if (ii == 5)
{
act ("\x1B[35;1mYour kick connects with $N's ribs!\x1B[37;0m", ch, NULL, victim, TO_CHAR);
act ("\x1B[37;1m$n kicks $N in the ribs!\x1B[0m", ch, NULL, victim, TO_NOTVICT);
act ("\x1B[36;1m$n kicks you in the ribs!! Ouch!\x1B[37;0m", ch, NULL, victim, TO_VICT);
}
}
}
else
{
act ("\x1B[35;1mWham! Your kick slams into $N!\x1B[37;0m", ch, NULL, victim, TO_CHAR);
act ("\x1B[37;1m$n's kick slams into $N!\x1B[37;0m", ch, NULL, victim, TO_NOTVICT);
act ("\x1B[37;1m$n's kick slams into you hard!\x1B[37;0m", ch, NULL, victim, TO_VICT);
}
show_hitdam (gsn_kick, "kick", damm, ch, victim);
if (ch->fgt && ch->fgt->field && victim && victim->in_room && victim->fgt && victim->fgt->field) {
java_hit_field(ch->fgt->field,ch,ch->fgt->pos_x,ch->fgt->pos_y,
victim->fgt->pos_x,victim->fgt->pos_y);
}
damage (ch, victim, damm, gsn_kick);
}
else
{
set_fighting (ch, victim);
if (FIGHTING (victim) == NULL)
victim->fgt->fighting = ch;
act ("You miss a kick at $N.", ch, NULL, victim, TO_CHAR + 1000);
act ("$n misses a kick at $N.", ch, NULL, victim, TO_NOTVICT + 1000);
act ("$n tries to kick you but misses.", ch, NULL, victim, TO_VICT + 1000);
}
}
return;
}
void
do_disarm (CHAR_DATA * ch, char *argy)
{
CHAR_DATA *victim;
SINGLE_OBJECT *obj;
int percent;
DEFINE_COMMAND ("disarm", do_disarm, POSITION_FIGHTING, 0, LOG_NORMAL, "This command allows you to disarm an opponent. Success is based on the disarm skill.")
if (CHALLENGE (ch) == 10)
{
send_to_char ("You cannot disarm in the arena.\n\r", ch);
return;
}
if (ch->wait > 2)
{
send_to_char ("You are too off balance to disarm right now.\n\r", ch);
return;
}
if (IS_PLAYER (ch) && ch->pcdata->tickcounts > 3)
{
send_to_char ("You are too off balance to disarm right now.\n\r", ch);
return;
}
if (IN_BATTLE (ch) == TRUE)
{
send_to_char ("You cannot disarm while in the battleground.\n\r", ch);
return;
}
if (get_item_held (ch, ITEM_WEAPON) == NULL)
{
send_to_char ("You must wield a weapon to disarm.\n\r", ch);
return;
}
if ((victim = FIGHTING (ch)) == NULL)
{
send_to_char ("You aren't fighting anybody or anything.\n\r", ch);
return;
}
if ((obj = get_item_held (victim, ITEM_WEAPON)) == NULL)
{
send_to_char ("Your opponent is not wielding a weapon.\n\r", ch);
return;
}
WAIT_STATE (ch, 50);
if (HAS_HANDS_STRENGTH_IMPLANT (victim) && !HAS_HANDS_STRENGTH_IMPLANT (ch))
{
act ("$N's incredible, almost unnatural grip remains completely in control of the weapon it holds.", ch, NULL, victim, TO_CHAR);
act ("Your bionic hands thwart $n's attempt at disarming you.", ch, NULL, victim, TO_VICT);
return;
}
percent = number_percent () + LEVEL (victim) - (LEVEL (ch) * 2);
if (IS_MOB (ch) || (IS_PLAYER (ch) && percent < ch->pcdata->learned[gsn_disarm] * 2 / 3))
{
disarm (ch, victim);
skill_gain (ch, gsn_disarm, FALSE);
}
else
send_to_char ("You tried, but you could not disarm your opponent.\n\r", ch);
return;
}
void
do_sla (CHAR_DATA * ch, char *argy)
{
DEFINE_COMMAND ("sla", do_sla, POSITION_DEAD, 110, LOG_NORMAL, "This is so you don't try to slap someone and slay em instead!")
send_to_char ("Slay? Slam? Sleep? What do you mean?\n\r", ch);
return;
}
void
do_slay (CHAR_DATA * ch, char *argy)
{
CHAR_DATA *victim;
char arg[SML_LENGTH];
DEFINE_COMMAND ("slay", do_slay, POSITION_DEAD, 110, LOG_ALWAYS, "This command slays a mob or player.")
if (IS_MOB (ch))
return;
if (!IS_REAL_GOD (ch))
{
send_to_char ("Command has been removed.\n\r", ch);
return;
}
one_argy (argy, arg);
if (arg[0] == '\0')
{
send_to_char ("Who is that?\n\r", ch);
return;
}
if ((victim = get_char_room (ch, arg)) == NULL)
{
send_to_char ("Who is that?\n\r", ch);
return;
}
if (ch == victim)
{
send_to_char ("You aren't allowed to slay yourself. Go see a psychiatrist.\n\r", ch);
return;
}
if (IS_PLAYER (victim) && LEVEL (ch) < 110)
{
send_to_char ("You shouldn't be slaying other players.\n\r", ch);
return;
}
act ("You grab $S head and you squeeze hard... until $N's skull explodes into a bloody mess!",
ch, NULL, victim, TO_CHAR);
act ("$n grabs your head and squeezes hard... until your eyes pop out! Everything goes dark...",
ch, NULL, victim, TO_VICT);
act ("$n grabs ahold of $N's head and squeezes hard. Pretty soon $N's entire head and skull are just bloody pieces of flesh-and-brain-chunks on the ground.",
ch, NULL, victim, TO_NOTVICT);
raw_kill (victim, FALSE);
return;
}
bool
hit_suck_disarm (CHAR_DATA * ch, CHAR_DATA * victim, int hit, int dam)
{
SINGLE_OBJECT *obj;
if (number_range (1, 100) >= LEVEL (ch)
&& (obj = get_item_held (victim, ITEM_WEAPON)) != NULL
&& hand_empty (ch) != WEAR_NONE)
{
unequip_char (victim, obj);
obj->wear_loc = hand_empty (ch);
obj_from (obj);
obj_to (obj, ch);
act ("Your weapon sucks $N's weapon right out of $S hand!", ch, NULL, victim, TO_CHAR);
act ("$n's weapon sucks your weapon right out of your hand!", ch, NULL, victim, TO_VICT);
act ("$n's magical weapon sucks $N's weapon right out of $S hand!", ch, NULL, victim, TO_NOTVICT);
return TRUE;
}
return FALSE;
}
bool
hit_vorpal (CHAR_DATA * ch, CHAR_DATA * victim, int hit, int dam)
{
char buf[STD_LENGTH];
SINGLE_OBJECT *obj;
char *name;
if (!IS_REAL_GOD (ch))
{
return FALSE;
}
if (hit >= 17)
{
act ("With a mighty blow, you seperate $N's head from $S body!", ch, 0, victim, TO_CHAR);
act ("Everything goes black as $n seperates your head from your body with a mighty slash!", ch, 0, victim, TO_VICT);
act ("$n's might slash seperates $N's head from $S body!", ch, 0, victim, TO_NOTVICT);
act ("$n's severed head falls to the ground with a thud.", victim, 0, 0, TO_ROOM);
stop_fighting (victim, TRUE);
name = NAME (ch);
obj = create_object (get_obj_index (OBJ_VNUM_SEVERED_HEAD), 0);
obj->timer = number_range (4, 7);
sprintf (buf, STR (obj, short_descr), NAME (victim));
if (obj->short_descr && obj->short_descr != NULL)
free_string (obj->short_descr);
obj->short_descr = str_dup (buf);
sprintf (buf, STR (obj, description), NAME (victim));
if (obj->description && obj->description != NULL)
free_string (obj->description);
obj->description = str_dup (buf);
obj_to (obj, ch->in_room);
make_corpse (victim);
if (IS_MOB (victim))
{
gain_exp (ch, victim->exp);
victim->pIndexData->killed++;
extract_char (victim, TRUE);
return TRUE;
}
extract_char (victim, FALSE);
while (victim->affected)
affect_remove (victim, victim->affected);
if (IS_PLAYER (victim))
victim->affected_by = victim->pcdata->nat_abilities;
victim->armor = 100;
NEW_POSITION(victim, POSITION_RESTING);
victim->hit = UMAX (1, victim->hit);
victim->move = UMAX (1, victim->move);
save_char_obj (victim);
return TRUE;
}
return FALSE;
}
void
skill_gain (CHAR_DATA * ch, short gsn, bool report)
{
char buf[STD_LENGTH];
bool learnyes;
int vall[10];
SPELL_DATA *spell;
if (IS_MOB (ch))
return;
#ifdef NEW_WORLD
if (gsn == gsn_slashing || gsn == gsn_whip || gsn == gsn_concussion || gsn == gsn_pierce)
{
int ii;
vall[0] = 550;
vall[1] = 450;
vall[2] = 350;
vall[3] = 300;
vall[4] = 360;
vall[5] = 420;
vall[6] = 500;
vall[7] = 660;
vall[8] = 725;
vall[9] = 890;
for (ii = 0; ii < 10; ii++)
vall[ii] += 125;
}
else
{
spell = skill_lookup (NULL, gsn);
if (spell == NULL)
return;
if (spell->slot != 0)
{
vall[0] = 220;
vall[1] = 110;
vall[2] = 60;
vall[4] = 34;
vall[5] = 40;
vall[6] = 55;
vall[7] = 65;
vall[8] = 75;
vall[9] = 95;
}
else
{
vall[0] = 250;
vall[1] = 230;
vall[2] = 170;
vall[3] = 142;
vall[4] = 115;
vall[5] = 115;
vall[6] = 155;
vall[7] = 250;
vall[8] = 350;
vall[9] = 500;
}
}
learnyes = FALSE;
if (ch->pcdata->learned[gsn] < 5)
return;
if (ch->pcdata->learned[gsn] < 20 && number_range (1, vall[0]) == 29)
learnyes = TRUE;
else if (ch->pcdata->learned[gsn] < 40 && number_range (1, vall[1]) == 29)
learnyes = TRUE;
else if (ch->pcdata->learned[gsn] < 60 && number_range (1, vall[2]) == 29)
learnyes = TRUE;
else if (ch->pcdata->learned[gsn] < 70 && number_range (1, vall[3]) == 29)
learnyes = TRUE;
else if (ch->pcdata->learned[gsn] < 78 && number_range (1, vall[4]) == 20)
learnyes = TRUE;
else if (ch->pcdata->learned[gsn] < 84 && number_range (1, vall[5]) == 29)
learnyes = TRUE;
else if (ch->pcdata->learned[gsn] < 87 && number_range (1, vall[6]) == 29)
learnyes = TRUE;
else if (ch->pcdata->learned[gsn] < 92 && number_range (1, vall[7]) == 29)
learnyes = TRUE;
else if (ch->pcdata->learned[gsn] < 97 && number_range (1, vall[8]) == 29)
learnyes = TRUE;
else if (number_range (1, vall[9]) == 69)
learnyes = TRUE;
if (learnyes && ch->pcdata->learned[gsn] < 100)
{
{
SPELL_DATA *spl;
spl = skill_lookup (NULL, gsn);
if (spl == NULL)
sprintf (buf, "ERROR!! PLEASE REPORT TO ORIN!\n\r");
else
sprintf (buf, "\x1B[37;1m**** [You have become better at %s!] ****\x1B[0m\n\r",
spl->spell_funky_name);
send_to_char (buf, ch);
}
ch->pcdata->learned[gsn]++;
}
#else
if (gsn == gsn_slashing || gsn == gsn_whip || gsn == gsn_concussion || gsn == gsn_pierce)
{
int ii;
vall[0] = 950;
vall[1] = 850;
vall[2] = 720;
vall[3] = 600;
vall[4] = 560;
vall[5] = 620;
vall[6] = 700;
vall[7] = 760;
vall[8] = 825;
vall[9] = 1190;
for (ii = 0; ii < 10; ii++)
vall[ii] += 290;
}
else
{
spell = skill_lookup (NULL, gsn);
if (spell == NULL)
return;
if (spell->slot != 0)
{
vall[0] = 280;
vall[1] = 150;
vall[2] = 90;
vall[4] = 44;
vall[5] = 60;
vall[6] = 75;
vall[7] = 85;
vall[8] = 95;
vall[9] = 125;
}
else
{
vall[0] = 450;
vall[1] = 330;
vall[2] = 210;
vall[3] = 172;
vall[4] = 195;
vall[5] = 215;
vall[6] = 255;
vall[7] = 350;
vall[8] = 450;
vall[9] = 600;
}
}
learnyes = FALSE;
if (ch->pcdata->learned[gsn] < 10)
return;
if (ch->pcdata->learned[gsn] < 20 && number_range (1, vall[0]) == 69)
learnyes = TRUE;
else if (ch->pcdata->learned[gsn] < 40 && number_range (1, vall[1]) == 69)
learnyes = TRUE;
else if (ch->pcdata->learned[gsn] < 60 && number_range (1, vall[2]) == 69)
learnyes = TRUE;
else if (ch->pcdata->learned[gsn] < 70 && number_range (1, vall[3]) == 69)
learnyes = TRUE;
else if (ch->pcdata->learned[gsn] < 78 && number_range (1, vall[4]) == 40)
learnyes = TRUE;
else if (ch->pcdata->learned[gsn] < 84 && number_range (1, vall[5]) == 69)
learnyes = TRUE;
else if (ch->pcdata->learned[gsn] < 87 && number_range (1, vall[6]) == 69)
learnyes = TRUE;
else if (ch->pcdata->learned[gsn] < 92 && number_range (1, vall[7]) == 69)
learnyes = TRUE;
else if (ch->pcdata->learned[gsn] < 97 && number_range (1, vall[8]) == 69)
learnyes = TRUE;
else if (number_range (1, vall[9]) == 69)
learnyes = TRUE;
if (learnyes && ch->pcdata->learned[gsn] < 100)
{
{
SPELL_DATA *spl;
spl = skill_lookup (NULL, gsn);
if (spl == NULL)
sprintf (buf, "ERROR!! PLEASE REPORT TO ORIN!\n\r");
else
sprintf (buf, "\x1B[37;1m**** [You have become better at %s!] ****\x1B[0m\n\r",
spl->spell_funky_name);
send_to_char (buf, ch);
}
ch->pcdata->learned[gsn]++;
}
#endif
return;
}