procedure do_cast(ch:GCharacter;param:string);
var sn : GSkill;
victim:GCharacter;
sub : string;
obj : GObject;
spell_lvl : integer;
begin
if (ch.position = POS_BASHED) then
begin
ch.sendBuffer('You are bashed to the ground!'#13#10);
exit;
end;
if (length(param)=0) then
begin
ch.sendBuffer('Cast which what where?'#13#10);
exit;
end;
if (IS_SET(ch.room.flags, ROOM_NOCAST)) then
begin
ch.sendBuffer('A powerful force prevents you from using magic here.'#13#10);
exit;
end;
if (ch.cast_timer > 0) then
begin
ch.sendBuffer('You cannot cast this soon after your last spell!'#13#10);
exit;
end;
param := one_argument(param,sub);
if (ch.IS_NPC) then
sn := findSkill(sub)
else
sn := findSkillPlayer(ch, sub);
one_argument(param,sub);
if (sn <> nil) then
begin
if (sn.skill_type = SKILL_SPELL) then
begin
victim := nil;
case (sn.target) of
TARGET_OFF_ATTACK:begin
victim := ch.room.findChar(ch, sub);
if victim=nil then
if (ch.position=POS_FIGHTING) and (ch.fighting<>nil) then
victim:=ch.fighting;
if victim=nil then
begin
act(AT_REPORT,'They are not here.',false,ch,nil,nil,TO_CHAR);
exit;
end;
end;
TARGET_OFF_AREA:begin
victim := ch.room.findChar(ch, sub);
if (victim = ch) then
begin
act(AT_REPORT, 'You can''t cast this on yourself!',false,ch,nil,nil,TO_CHAR);
exit;
end;
if victim=nil then
if (ch.position=POS_FIGHTING) and (ch.fighting<>nil) then
victim:=ch.fighting;
if victim=nil then
begin
act(AT_REPORT,'They are not here.',false,ch,nil,nil,TO_CHAR);
exit;
end;
end;
TARGET_DEF_SELF:begin
if (length(sub)>0) then
begin
act(AT_REPORT,'You can only cast this on yourself.',false,ch,nil,nil,TO_CHAR);
exit;
end;
if ch.position=POS_FIGHTING then
begin
act(AT_REPORT,'You cannot concentrate enough.',false,ch,nil,nil,TO_CHAR);
exit;
end;
victim:=ch;
end;
TARGET_DEF_SINGLE:begin
if (length(sub)=0) then
victim := ch
else
victim := ch.room.findChar(ch, sub);
if victim=nil then
begin
act(AT_REPORT,'They are not here.',false,ch,nil,nil,TO_CHAR);
exit;
end;
end;
TARGET_DEF_AREA:begin
victim := ch;
end;
TARGET_DEF_WORLD:begin
victim := findCharWorld(ch, sub);
if victim=nil then
begin
act(AT_REPORT,'They are not here.',false,ch,nil,nil,TO_CHAR);
exit;
end;
end;
TARGET_OBJECT:begin
victim := GCharacter(ch.findInventory(sub));
if victim=nil then
begin
act(AT_REPORT,'You are not carrying that.',false,ch,nil,nil,TO_CHAR);
exit;
end;
end;
end;
if (sn.target <= TARGET_OFF_AREA) and (not ch.IS_NPC) then
GPlayer(ch).fightxp := 0;
obj := ch.getWield(ITEM_GEM);
if (obj <> nil) and (obj.item_type = ITEM_GEM) then
spell_lvl := obj.value[2]
else
spell_lvl := (ch.int + ch.wis) div 2;
if (victim = nil) then
act(AT_REPORT,'They are not here.',false,ch,nil,nil,TO_CHAR)
else
if (victim = ch) and (sn.target = TARGET_OFF_ATTACK) then
act(AT_REPORT,'You don''t want to cast that on yourself!',false,ch,nil,nil,TO_CHAR)
else
if (spell_lvl < sn.min_lvl) and (not ch.IS_NPC) then
act(AT_REPORT,'That spell is too powerful!',false,ch,nil,nil,TO_CHAR)
else
if (ch.mana >= sn.min_mana) or (ch.IS_NPC) then
begin
if (sn.target = TARGET_OFF_ATTACK) and (ch.fighting<>nil) then
ch.fighting := victim;
if (ch.IS_NPC) then
magic_timer(ch, victim, sn)
else
begin
ch.position := POS_CASTING;
act(AT_REPORT,'You begin to utter some strange incantations...',false,ch,nil,nil,TO_CHAR);
act(AT_REPORT,'$n begins to utter some strange incantations...',false,ch,nil,nil,TO_ROOM);
registerTimer(TIMER_CAST, magic_timer, sn.beats, ch, victim, sn);
end;
end
else
act(AT_REPORT,'You don''t have enough mana.',false,ch,nil,nil,TO_CHAR);
end
else
act(AT_REPORT,'That is not a spell.',false,ch,nil,nil,TO_CHAR);
end
else
act(AT_REPORT,'You haven''t learned that spell.',false,ch,nil,nil,TO_CHAR);
end;
procedure do_mana(ch : GCharacter; param : string);
var
obj : GObject;
spell_lvl : integer;
begin
obj := ch.getWield(ITEM_GEM);
if (obj <> nil) and (obj.item_type = ITEM_GEM) then
spell_lvl := obj.value[2]
else
spell_lvl := (ch.int + ch.wis) div 2;
act(AT_REPORT,'Your current spell-level: $B$1[$B$7' + inttostr(spell_lvl) + '$B$1]',false,ch,nil,nil,TO_CHAR);
act(AT_REPORT,'Your current mana: $B$1[$B$7' + inttostr(ch.mana) + '$B$1]',false,ch,nil,nil,TO_CHAR);
end;