/*
*** DaleMUD
*** PSI Skills
*/
#include <stdio.h>
#include <assert.h>
#include "protos.h"
extern struct char_data *character_list;
extern long SystemFlags;
void mind_burn(byte level, struct char_data *ch,
struct char_data *victim, struct obj_data *obj)
{
int dam;
struct char_data *tmp_victim, *temp;
if (!ch)
return;
dam = dice(1,4) + level/2 + 1;
send_to_char("Gouts of flame shoot forth from your mind!\n\r", ch);
act("$n sends a gout of flame shooting from $s mind!\n\r",
FALSE, ch, 0, 0, TO_ROOM);
for ( tmp_victim = real_roomp(ch->in_room)->people; tmp_victim;
tmp_victim = temp ) {
temp = tmp_victim->next_in_room;
if ( (ch->in_room == tmp_victim->in_room) && (ch != tmp_victim)) {
if ((GetMaxLevel(tmp_victim)>LOW_IMMORTAL) && (!IS_NPC(tmp_victim)))
return;
if (!in_group(ch, tmp_victim)) {
act("You are seared by the burning flame!\n\r",
FALSE, ch, 0, tmp_victim, TO_VICT);
heat_blind(tmp_victim);
if ( saves_spell(tmp_victim, SAVING_SPELL) )
dam = 0;
MissileDamage(ch, tmp_victim, dam, SKILL_MIND_BURN);
} else {
act("You are able to avoid the flames!\n\r",
FALSE, ch, 0, tmp_victim, TO_VICT);
heat_blind(tmp_victim);
}
}
}
}
void mind_teleport(byte level, struct char_data *ch,
struct char_data *victim, struct obj_data *obj)
{
int to_room, try = 0;
extern int top_of_world; /* ref to the top element of world */
struct room_data *room;
if (!ch || !victim)
return;
if (victim != ch) {
if (saves_spell(victim,SAVING_SPELL)) {
send_to_char("You can't seem to force them to blink out.\n\r",ch);
if (IS_NPC(victim)) {
if (!victim->specials.fighting)
set_fighting(victim, ch);
} else {
send_to_char("You feel strange, but the effect fades.\n\r",victim);
}
return;
} else {
ch = victim; /* the character (target) is now the victim */
}
}
if (!IsOnPmp(victim->in_room)) {
send_to_char("You're on an extra-dimensional plane!\n\r", ch);
return;
}
do {
to_room = number(0, top_of_world);
room = real_roomp(to_room);
if (room) {
if ((IS_SET(room->room_flags, PRIVATE)) ||
(IS_SET(room->room_flags, TUNNEL)) ||
(IS_SET(room->room_flags, NO_SUM)) ||
(IS_SET(room->room_flags, NO_MAGIC)) ||
!IsOnPmp(to_room)) {
room = 0;
try++;
}
}
} while (!room && try < 10);
if (try >= 10) {
send_to_char("The skill fails.\n\r", ch);
return;
}
act("$n seems to scatter into tiny particles and is gone!", FALSE, ch,0,0,TO_ROOM);
char_from_room(ch);
char_to_room(ch, to_room);
act("A mass of flying particles form into $n!", FALSE, ch,0,0,TO_ROOM);
do_look(ch, "", 0);
if (IS_SET(real_roomp(to_room)->room_flags, DEATH) &&
GetMaxLevel(ch) < LOW_IMMORTAL) {
NailThisSucker(ch);
return;
}
check_falling(ch);
}
/* astral travel */
#define PROBABILITY_TRAVEL_ENTRANCE 2701
void mind_probability_travel(byte level, struct char_data *ch,
struct char_data *victim, struct obj_data *obj)
{
struct char_data *tmp, *tmp2;
struct room_data *rp;
if (IS_SET(SystemFlags,SYS_NOASTRAL)) {
send_to_char("The astral planes are shifting, you cannot!\n",ch);
return;
}
rp = real_roomp(ch->in_room);
for (tmp = rp->people;tmp;tmp=tmp2) {
tmp2 = tmp->next_in_room;
if (in_group(ch, tmp) &&
(!tmp->specials.fighting) &&
(IS_PC(tmp)||IS_SET(tmp->specials.act,ACT_POLYSELF)) &&
IS_AFFECTED(tmp,AFF_GROUP)) {
act("$n wavers as $N sends $m to another plane.", FALSE, tmp, 0, ch, TO_ROOM);
char_from_room(tmp);
char_to_room(tmp, PROBABILITY_TRAVEL_ENTRANCE);
do_look(tmp, "\0", 0);
act("$n wavers into existance", FALSE, tmp, 0, 0, TO_ROOM);
}
}
}
/* sense DT's */
void mind_danger_sense(byte level, struct char_data *ch,
struct char_data *victim, struct obj_data *obj)
{
struct affected_type af;
if (!affected_by_spell(victim, SKILL_DANGER_SENSE) ) {
if (ch != victim) {
act("$n opens $N's eyes to dangers.",FALSE,ch,0,victim,TO_ROOM);
act("You open $N's eyes to dangers.",FALSE,ch,0,victim,TO_ROOM);
} else {
act("$n seems to look more intently about.",TRUE,victim,0,0,TO_ROOM);
act("You open your mind and eyes for hidden dangers.",TRUE,victim,0,0,TO_CHAR);
}
af.type = SKILL_DANGER_SENSE;
af.duration = (int)level/10;
af.modifier = 0;
af.location = APPLY_NONE;
af.bitvector = 0;
affect_to_char(victim, &af);
} else {
if (ch != victim)
act("$N can already sense dangers.",FALSE,ch,0,victim,TO_CHAR);
else
act("You already sense hidden dangers.",FALSE,ch,0,victim,TO_CHAR);
}
}
/* same as thief spy skil, see into the next room */
void mind_clairvoyance(byte level, struct char_data *ch,
struct char_data *victim, struct obj_data *obj)
{
struct affected_type af;
if (!affected_by_spell(victim, SKILL_CLAIRVOYANCE) ) {
if (ch != victim) {
act("",FALSE,ch,0,victim,TO_CHAR);
act("",FALSE,ch,0,victim,TO_ROOM);
} else {
act("$n meditates for a moment.",TRUE,victim,0,0,TO_ROOM);
act("You open your mind's eye to nearby visions and sights.",TRUE,victim,0,0,TO_CHAR);
}
af.type = SKILL_CLAIRVOYANCE;
af.duration = (level<LOW_IMMORTAL) ? 3 : level;
af.modifier = 0;
af.location = APPLY_NONE;
af.bitvector = AFF_SCRYING;
affect_to_char(victim, &af);
} else {
if (ch != victim)
act("$N can already sense nearby sights.",FALSE,ch,0,victim,TO_CHAR);
else
act("You are already clairvoyant.",FALSE,ch,0,victim,TO_CHAR);
}
}
/* single person attack skill */
void mind_disintergrate(byte level, struct char_data *ch,
struct char_data *victim, struct obj_data *obj)
{
spell_disintergrate(level,ch,victim,obj);
}
/* if not fighting, shove the mob/pc out'a the room if suffcient */
/* level and they do not save, otherwise set fighting. If fighting */
/* then if they fail, treat as bashed and the mobs/pc sits */
void mind_telekinesis(byte level, struct char_data *ch,
struct char_data *victim, int dir_num)
{
if (!ch) {
log_string("!ch in telekenisis");
return;
}
if (!victim) {
log_string("!victim in telekenisis");
return;
}
/* not fighting, shove him */
if (!ch->specials.fighting) {
if (saves_spell(victim,SAVING_SPELL) ||
IS_SET(victim->specials.act,ACT_SENTINEL) &&
IS_SET(victim->specials.act,ACT_HUGE)) {
/* saved, make fight */
act("Your mind suffers a breif weakness that forces you to drop $N!",FALSE,ch,0,victim,TO_CHAR);
act("$n tries to telekinesis you, but your mind resists!",FALSE,ch,0,victim,TO_VICT);
act("$n tries to telekinesis $N out of the area, but FAILS!",FALSE,ch,0,victim,TO_ROOM);
hit(victim,ch,TYPE_UNDEFINED);
} else {
/* missed save, lets shove'em */
act("You lift $N with a thought and force $M from the area!",FALSE,ch,0,victim,TO_CHAR);
act("$n lifts you with $s mind, flinging you out the area!",FALSE,ch,0,victim,TO_VICT);
act("$n summons great mental powers and lifts $N, only to toss $M from the area!",FALSE,ch,0,victim,TO_ROOM);
do_move(victim,"\0",dir_num);
}
} /* end was not fighting */
else
/* was fighting, bash him */
{
if (saves_spell(victim,SAVING_SPELL) ||
IS_SET(victim->specials.act,ACT_SENTINEL) ||
IS_SET(victim->specials.act,ACT_HUGE)) {
act("You cannot seem to focus your mind enough for the telekinetic force.",FALSE,ch,0,victim,TO_CHAR);
act("$n fails to lift you with $s mind!",FALSE,ch,0,victim,TO_VICT);
act("$n attemps to use $s telekinetic powers on $N, but fails!",FALSE,ch,0,victim,TO_ROOM);
/* do nothing */
} else {
/* smack'em to the ground */
act("You slam $N to the ground with a single thought!",FALSE,ch,0,victim,TO_CHAR);
act("$n lifts you with $s mind, then slams you to the ground!",FALSE,ch,0,victim,TO_VICT);
act("$n slams $N to the ground with $s telekinetic powers!",FALSE,ch,0,victim,TO_ROOM);
GET_POS(victim) = POSITION_SITTING;
if (!victim->specials.fighting)
set_fighting(victim,ch);
}
} /* end was fighting */
}
/* same as fly */
void mind_levitation(byte level, struct char_data *ch,
struct char_data *victim, struct obj_data *obj)
{
struct affected_type af;
if (!affected_by_spell(victim, SKILL_LEVITATION) ) {
if (ch != victim) {
act("You lift $N with a simple thought.",FALSE,ch,0,victim,TO_CHAR);
act("$N is lifted into the air by a simple thought from $n.",FALSE,ch,0,victim,TO_ROOM);
} else {
act("$n lifts $s own body with a thought.",TRUE,victim,0,0,TO_ROOM);
act("You lift yourself with your mind",TRUE,victim,0,0,TO_CHAR);
}
af.type = SKILL_LEVITATION;
af.duration = (int)(level*2)/10;
af.modifier = 0;
af.location = APPLY_NONE;
af.bitvector = AFF_FLYING;
affect_to_char(victim, &af);
} else {
if (ch != victim)
act("$N is already levitating.",FALSE,ch,0,victim,TO_CHAR);
else
act("You are already levitating.",FALSE,ch,0,victim,TO_CHAR);
}
}
/* healing, 100 points max, cost 100 mana, and stuns the */
/* psi and lags along time, simular results as mage spell id */
void mind_cell_adjustment(byte level, struct char_data *ch,
struct char_data *victim, struct obj_data *obj)
{
if (!ch) {
log_string("!ch in cell_adjustment");
return;
}
if (ch != victim) {
send_to_char("You cannot use this skill on others.\n\r",ch);
return;
}
act("You begin the process of altering your bodies cells.",FALSE,ch,0,victim,TO_CHAR);
act("$n goes into a deep trance.",FALSE,ch,0,victim,TO_ROOM);
if (GET_HIT(victim) + 100 > GET_MAX_HIT(victim)) {
act("You completely heal your body.",FALSE,victim,0,0,TO_CHAR);
GET_HIT(victim) = GET_MAX_HIT(victim);
} else {
act("You manage to heal some of your body through cell adjustment.",FALSE,victim,0,0,TO_CHAR);
GET_HIT(victim) +=100;
}
if (GetMaxLevel(ch)<LOW_IMMORTAL) {
act("You are overcome by exhaustion.",FALSE,ch,0,0,TO_CHAR);
act("$n slumps to the ground exhausted.",FALSE,ch,0,0,TO_ROOM);
WAIT_STATE(ch,PULSE_VIOLENCE*12);
GET_POS(ch) = POSITION_STUNNED;
}
}
/* hide */
void mind_chameleon(byte level, struct char_data *ch,
struct char_data *victim, struct obj_data *obj)
{
if (!ch)
return;
if (IS_AFFECTED(ch,AFF_HIDE)) {
REMOVE_BIT(ch->specials.affected_by,AFF_HIDE);
}
act("You camoflauge yourself in others minds.",FALSE,ch,0,0,TO_CHAR);
act("$n's body wavers, then disappears into the surroundings.",FALSE,ch,0,0,TO_ROOM);
SET_BIT(ch->specials.affected_by,AFF_HIDE);
}
/* strength */
void mind_psi_strength(byte level, struct char_data *ch,
struct char_data *victim, struct obj_data *obj)
{
struct affected_type af;
if (!victim || !ch)
return;
if (!affected_by_spell(victim,SKILL_PSI_STRENGTH)) {
act("You feel stronger.", FALSE, victim,0,0,TO_CHAR);
act("$n seems stronger!\n\r",
FALSE, victim, 0, 0, TO_ROOM);
af.type = SKILL_PSI_STRENGTH;
af.duration = 2*level;
if (IS_NPC(victim))
if (level >= CREATOR) {
af.modifier = 25 - GET_STR(victim);
} else
af.modifier = number(1,6);
else {
if (HasClass(ch, CLASS_WARRIOR) || HasClass(ch,CLASS_BARBARIAN) )
af.modifier = number(1,8);
else
if (HasClass(ch, CLASS_CLERIC|CLASS_THIEF|CLASS_PSI))
af.modifier = number(1,6);
else
af.modifier = number(1,4);
}
af.location = APPLY_STR;
af.bitvector = 0;
affect_to_char(victim, &af);
} else {
act("Nothing seems to happen.", FALSE, ch,0,0,TO_CHAR);
}
}
/* long lag time, but after that they get 12 hrs of no hunger/thirst */
void mind_mind_over_body(byte level, struct char_data *ch,
struct char_data *victim, struct obj_data *obj)
{
struct affected_type af;
if (!affected_by_spell(victim, SKILL_MIND_OVER_BODY) ) {
if (ch != victim) {
act("",FALSE,ch,0,victim,TO_CHAR);
act("",FALSE,ch,0,victim,TO_ROOM);
} else {
act("$n meditates for awhile.",TRUE,victim,0,0,TO_ROOM);
act("You force your body to obey your mind and not require food or water!",TRUE,victim,0,0,TO_CHAR);
}
af.type = SKILL_MIND_OVER_BODY;
af.duration = 12;
af.modifier = -1;
af.location = APPLY_MOD_THIRST;
af.bitvector = 0;
affect_to_char(victim, &af);
af.type = SKILL_MIND_OVER_BODY;
af.duration = 12;
af.modifier = -1;
af.location = APPLY_MOD_HUNGER;
af.bitvector = 0;
affect_to_char(victim, &af);
} else {
if (ch != victim)
act("$N does not require your help.",FALSE,ch,0,victim,TO_CHAR);
else
act("Your mind is already forcing your body to obey!",FALSE,ch,0,victim,TO_CHAR);
}
}
/* feeblemind*/
void mind_mind_wipe(byte level, struct char_data *ch,
struct char_data *victim, struct obj_data *obj)
{
spell_feeblemind(level,ch,victim,obj);
}
/* psi protective skill, immune to some psi skills */
void mind_tower_iron_will(byte level, struct char_data *ch,
struct char_data *victim, struct obj_data *obj)
{
struct affected_type af;
if (!affected_by_spell(victim, SKILL_TOWER_IRON_WILL) ) {
if (ch != victim) {
act("",FALSE,ch,0,victim,TO_CHAR);
act("",FALSE,ch,0,victim,TO_ROOM);
} else {
act("$n meditates for a few moments.",TRUE,victim,0,0,TO_ROOM);
act("You errect a tower of iron will to protect you!",TRUE,victim,0,0,TO_CHAR);
}
af.type = SKILL_TOWER_IRON_WILL;
af.duration = (int)level/10;
af.modifier = 0;
af.location = APPLY_NONE;
af.bitvector = 0;
affect_to_char(victim, &af);
} else {
if (ch != victim)
act("$N is already protected.",FALSE,ch,0,victim,TO_CHAR);
else
act("You are already protected.",FALSE,ch,0,victim,TO_CHAR);
}
}
/* psi protivtive skill, immune to feeblemind, etc... */
void mind_mindblank(byte level, struct char_data *ch,
struct char_data *victim, struct obj_data *obj)
{
struct affected_type af;
if (!affected_by_spell(victim, SKILL_MINDBLANK) ) {
if (ch != victim) {
act("",FALSE,ch,0,victim,TO_CHAR);
act("",FALSE,ch,0,victim,TO_ROOM);
} else {
act("$n meditates for a few moments.",TRUE,victim,0,0,TO_ROOM);
act("You begin to shift the patterns of your thoughts for protection.",TRUE,victim,0,0,TO_CHAR);
}
af.type = SKILL_MINDBLANK;
af.duration = (int)(level*2)/10;
af.modifier = 0;
af.location = APPLY_NONE;
af.bitvector = 0;
affect_to_char(victim, &af);
} else {
if (ch != victim)
act("$N is already protected.",FALSE,ch,0,victim,TO_CHAR);
else
act("You are already protected.",FALSE,ch,0,victim,TO_CHAR);
}
}
/* same as thief disguise */
void mind_psychic_impersonation(byte level, struct char_data *ch,
struct char_data *victim, struct obj_data *obj)
{
struct affected_type af;
struct char_data *k;
act("You attempt to make others see you as someone else.",FALSE,ch,0,victim,TO_VICT);
act("$N's features shift and waver before your eyes!",FALSE,ch,0,victim,TO_NOTVICT);
if (affected_by_spell(victim, SKILL_PSYCHIC_IMPERSONATION)) {
send_to_char("You are already attempting to do that\n\r", victim);
return;
}
for (k=character_list; k; k=k->next)
{
if (k->specials.hunting == victim)
{
k->specials.hunting = 0;
}
if (Hates(k, victim))
{
ZeroHatred(k, victim);
}
if (Fears(k, victim))
{
ZeroFeared(k, victim);
}
} /* end for */
af.type = SKILL_PSYCHIC_IMPERSONATION;
af.duration = (int)(level*2)/10;
af.modifier = 0;
af.location = APPLY_NONE;
af.bitvector = 0;
affect_to_char(victim, &af);
}
/* area effect psionic blast type skill */
void mind_ultra_blast(byte level, struct char_data *ch,
struct char_data *victim, struct obj_data *obj)
{
int dam;
struct char_data *tmp_victim, *temp;
assert(ch);
assert((level >= 1) && (level <= ABS_MAX_LVL));
/* damage = level d4, +level */
dam = dice(level,4);
dam +=level;
act("You blast out a massive wave of destructive psionic energy!",FALSE,ch,0,victim,TO_CHAR);
act("$n blasts out a massive wave of destructive psionic energy!",FALSE,ch,0,0,TO_ROOM);
for(tmp_victim = character_list; tmp_victim; tmp_victim = temp) {
temp = tmp_victim->next;
if ( (ch->in_room == tmp_victim->in_room) && (ch != tmp_victim)){
if (!in_group(ch,tmp_victim) && !IS_IMMORTAL(tmp_victim)) {
if (!saves_spell(tmp_victim, SAVING_SPELL)) {
/* half damage if effected by TOWER OF IRON WILL */
if (affected_by_spell(tmp_victim,SKILL_TOWER_IRON_WILL))
dam >>=1;
MissileDamage(ch,tmp_victim,dam,SKILL_ULTRA_BLAST);
/* damage here */
} else {
dam >>=1; /* half dam */
/* NO damage if effected by TOWER OF IRON WILL */
if (affected_by_spell(tmp_victim,SKILL_TOWER_IRON_WILL))
dam =0;
MissileDamage(ch,tmp_victim,dam,SKILL_ULTRA_BLAST);
}
} else
act("You manage to get out of the way of the massive psionic blast!",FALSE, ch, 0, tmp_victim, TO_VICT);
}
} /* end for */
}
/* massive single person attack */
void mind_psychic_crush(byte level, struct char_data *ch,
struct char_data *victim, struct obj_data *obj)
{
int dam;
assert(victim && ch);
assert((level >= 1) && (level <= ABS_MAX_LVL));
/* damage = level d6, +1 for every two levels of the psionist */
dam = dice(level,6);
dam +=(int)level/2;
if ( saves_spell(victim, SAVING_SPELL) ) {
dam >>= 1;
if (affected_by_spell(victim,SKILL_TOWER_IRON_WILL))
dam =0;
}
/* half dam if tower up */
if (affected_by_spell(victim,SKILL_TOWER_IRON_WILL))
dam >>=1;
MissileDamage(ch, victim, dam, SKILL_PSYCHIC_CRUSH);
}
/* increate int,wis or con, reduce the unselected attribs the same */
void mind_intensify(byte level, struct char_data *ch,
struct char_data *victim, struct obj_data *obj)
{
}
/* same as cleric COMMAND spell */
void mind_domination(byte level, struct char_data *ch,
struct char_data *victim, struct obj_data *obj)
{
}