// $Id: dam_skll.cc,v 1.6.2.5 2000/03/05 05:13:09 justin Exp $
// $Revision: 1.6.2.5 $ $Author: justin $ $Date: 2000/03/05 05:13:09 $
//
//ScryMUD Server Code
//Copyright (C) 1998 Ben Greear
//
//This program is free software; you can redistribute it and/or
//modify it under the terms of the GNU General Public License
//as published by the Free Software Foundation; either version 2
//of the License, or (at your option) any later version.
//
//This program is distributed in the hope that it will be useful,
//but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
//GNU General Public License for more details.
//
//You should have received a copy of the GNU General Public License
//along with this program; if not, write to the Free Software
//Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
//
// To contact the Author, Ben Greear: greear@cyberhighway.net, (preferred)
// greearb@agcs.com
//
//*********************** skills.cc ********************//
#include "misc.h"
#include "misc2.h"
#include "classes.h"
#include "spells.h"
#include "battle.h"
#include "skills.h"
#include "commands.h"
#include "batl_prc.h"
#include "dam_skll.h"
#include <PtrArray.h>
int hurl(int i_th, const String* victim, critter& pc, int was_ordered) {
critter* crit_ptr;
String buf(100);
if (pc.isNpc() && was_ordered) {
return -1;
}
if (!victim->Strlen()) {
crit_ptr = Top(pc.IS_FIGHTING);
}//if
else {
crit_ptr = ROOM.haveCritNamed(i_th, victim, pc.SEE_BIT);
}//if
if (!ok_to_do_action(crit_ptr, "mSVFP", 0, pc,
pc.getCurRoom(), NULL, TRUE)) {
return -1;
}
if (crit_ptr) {
if (crit_ptr == &pc) {
show("You can't hurl yourself!!\n", pc);
return -1;
}//if
if (!crit_ptr->canBeHurled()) {
Sprintf(buf, "%S is wary to that particular trick now!\n",
crit_ptr->getLongName());
buf.Cap();
pc.show(buf);
return -1;
}//if
if (pc.isPc() && (get_percent_lrnd(HURL_SKILL_NUM, pc) < 1)) {
pc.show("You don't know that skill yet.\n");
return -1;
}
if (crit_ptr->isMob()) {
crit_ptr = mob_to_smob(*crit_ptr, pc.getCurRoomNum(), TRUE,
i_th, victim, pc.SEE_BIT);
}//if
return do_hurl(*crit_ptr, pc);
}//if
else {
show("Hurl who?\n", pc);
return -1;
}
}//hurl
int do_hurl(critter& vict, critter& pc) {
String buf(100);
short do_fatality = FALSE;
if ((vict.isMob()) || (pc.isMob())) {
mudlog.log(ERROR, "ERROR: MOB sent to do_hurl.\n");
return -1;
}//if
if (!HaveData(&vict, pc.IS_FIGHTING)) {
join_in_battle(pc, vict);
}//if
if (skill_did_hit(pc, HURL_SKILL_NUM, vict)) {
Sprintf(buf, "lifts %S over %s head!!\n",
name_of_crit(vict, ~0), get_his_her(pc));
emote(buf, pc, ROOM, TRUE, &vict);
Sprintf(buf, "%S lifts you over %s head!!\n",
name_of_crit(pc, vict.SEE_BIT), get_his_her(pc));
show(buf, vict);
Sprintf(buf, "You lift %S over your head.\n",
name_of_crit(vict, pc.SEE_BIT));
show(buf, pc);
/* affects */
door* dptr;
vict.notifyHasBeenHurled();
vict.doRemoveFromBattle();
vict.PAUSE += d(1,4) + 2;
pc.PAUSE += d(1,3);
if ((dptr = door::findDoor(ROOM.DOORS, 1,
Top(door_list[d(1,10)].names), ~0, ROOM)) &&
!(dptr->dr_data->door_data_flags.get(2))) {
Sprintf(buf, "hurls %S out of the room.\n", name_of_crit(vict, ~0));
emote(buf, pc, ROOM, TRUE, &vict);
Sprintf(buf, "You hurl %s out of the room.\n", get_him_her(vict));
show(buf, pc);
Sprintf(buf, "%S hurls you out of the room.\n",
name_of_crit(pc, vict.SEE_BIT));
buf.Cap();
show(buf, vict);
emote("is hurtled into the room.\n", vict,
room_list[abs(dptr->destination)], TRUE);
door* opposite_door =
door::findDoorByDest(room_list[abs(dptr->destination)].doors,
pc.getCurRoomNum());
String from_dir(30);
int is_custom = FALSE;
if (opposite_door) {
from_dir = *(opposite_door->getDirection());
if (strcasecmp(from_dir, "up") == 0) {
is_custom = TRUE;
from_dir = "above";
}
else if (strcasecmp(from_dir, "down") == 0) {
is_custom = TRUE;
from_dir = "below";
}
}//if
int is_dead;
vict.doGoToRoom(abs(dptr->destination), from_dir, dptr, is_dead,
vict.getCurRoomNum(), 1);
if (is_dead) {
return 0;
}
if (vict.isFlying()) {
vict.show("Fortunately, you are flying, and only barely scrape the ground!\n");
}
else {
exact_raw_damage(d(8, pc.STR) * (dptr->distance + 1), NORMAL,
vict, pc);
}
}//if hurled into another room
else { //hurled against the wall
Sprintf(buf, "hurls %S into the wall.\n", name_of_crit(vict, ~0));
emote(buf, pc, ROOM, TRUE, &vict);
Sprintf(buf, "You hurl %s into the wall.\n", get_him_her(vict));
show(buf, pc);
Sprintf(buf, "%S hurls you into the wall.\n",
name_of_crit(pc, vict.SEE_BIT));
buf.Cap();
show(buf, vict);
exact_raw_damage(d(8, pc.STR), NORMAL, vict, pc);
}//else hurled into wall
if (vict.HP < 0) { //do fatality
show("You meet the ground and your world goes black!\n", vict);
emote("hits the ground and moves no more!\n", vict,
room_list[vict.getCurRoomNum()], TRUE);
do_fatality = TRUE;
}//if fatality
//else { //no fatality
// emote("hits the ground hard!\n", vict,
// *(vict.getCurRoom()), TRUE);
//}//else
}//if hit
else { //missed
Sprintf(buf, "%S tries but fails to lift you over %s head!\n",
name_of_crit(pc, vict.SEE_BIT), get_his_her(pc));
buf.Cap();
show(buf, vict);
Sprintf(buf, "You fail to lift %S over your head!\n",
name_of_crit(vict, pc.SEE_BIT));
show(buf, pc);
Sprintf(buf, "fails to lift %S over %s head.\n",
name_of_crit(vict, ~0), get_his_her(pc));
emote(buf, pc, ROOM, TRUE, &vict);
}//else
if (do_fatality) {
agg_kills_vict(&pc, vict);
}//if
return 0;
}//do_hurl
int body_slam(int i_th, const String* victim, critter& pc, int was_ordered) {
critter* crit_ptr;
String buf(100);
if (pc.isNpc() && was_ordered) {
return -1;
}
if (!victim->Strlen()) {
crit_ptr = Top(pc.IS_FIGHTING);
}//if
else {
crit_ptr = ROOM.haveCritNamed(i_th, victim, pc.SEE_BIT);
}//if
if (crit_ptr) {
if (!ok_to_do_action(crit_ptr, "mSVFPA", 0, pc, pc.getCurRoom(),
NULL, TRUE)) {
return -1;
}
if (crit_ptr == &pc) {
show("You shouldn't be slamming yourself..\n", pc);
return -1;
}//if
if (pc.isPc() && (get_percent_lrnd(BODYSLAM_SKILL_NUM, pc) < 1)) {
pc.show("You don't know that skill yet.\n");
return -1;
}
if (crit_ptr->isMob()) {
crit_ptr = mob_to_smob(*crit_ptr, pc.getCurRoomNum(), TRUE, i_th, victim,
pc.SEE_BIT);
}//if
return do_body_slam(*crit_ptr, pc);
}//if
else {
show("Bodyslam who?\n", pc);
return -1;
}
}//body_slam
int do_body_slam(critter& vict, critter& pc) {
String buf(100);
short do_fatality = FALSE;
if ((vict.isMob()) || (pc.isMob())) {
mudlog.log(ERROR, "ERROR: MOB sent to do_bash.\n");
return -1;
}//if
if (!HaveData(&vict, pc.IS_FIGHTING)) {
mudlog.log(DBG, "Calling join_in_battle in do_body_slam..\n");
join_in_battle(pc, vict);
}//if
if (skill_did_hit(pc, BODYSLAM_SKILL_NUM, vict)) {
pc.PAUSE += d(1,3); //increment pause_count
exact_raw_damage(d(5, pc.STR) + pc.LEVEL, NORMAL, vict, pc);
vict.PAUSE += (d(1,3) + 1);
Sprintf(buf, "lifts %S over %s head!!\n",
name_of_crit(vict, ~0), get_his_her(pc));
emote(buf, pc, ROOM, TRUE, &vict);
Sprintf(buf, "%S lifts you over %s head!!\n",
name_of_crit(pc, vict.SEE_BIT), get_his_her(pc));
show(buf, vict);
Sprintf(buf, "You lift %S over your head with a mighty heave!\n",
name_of_crit(vict, pc.SEE_BIT));
show(buf, pc);
if (vict.HP < 0) {
Sprintf(buf, "crushes %S's body into the ground!!\n",
name_of_crit(vict, ~0), get_his_her(pc));
emote(buf, pc, ROOM, TRUE, &vict);
show("You meet the ground and your world goes black!\n", vict);
Sprintf(buf,
"You crush %S into the ground, %s moves no more\n",
name_of_crit(vict, pc.SEE_BIT), get_he_she(vict));
show(buf, pc);
do_fatality = TRUE;
}//if fatality
else {
Sprintf(buf, "%S slams you into the ground!\n",
name_of_crit(pc, vict.SEE_BIT));
buf.Cap();
show(buf, vict);
Sprintf(buf, "You slam %S into the ground!\n",
name_of_crit(vict, vict.SEE_BIT));
show(buf, pc);
Sprintf(buf, "slams %S to the ground!\n",
name_of_crit(vict, ~0));
emote(buf, pc, ROOM, TRUE, &vict);
}//else
}//if
else { //missed
Sprintf(buf, "%S tries but fails to lift you over %s head!\n",
name_of_crit(pc, vict.SEE_BIT), get_his_her(pc));
buf.Cap();
show(buf, vict);
Sprintf(buf, "You fail to lift %S over your head!\n",
name_of_crit(vict, pc.SEE_BIT));
show(buf, pc);
Sprintf(buf, "fails to lift %S over %s head.\n",
name_of_crit(vict, ~0), get_his_her(pc));
emote(buf, pc, ROOM, TRUE, &vict);
pc.PAUSE += d(1,3); //increment pause_count
}//else
if (do_fatality) {
agg_kills_vict(&pc, vict);
}//if
return 0;
}//do_body_slam