{$F+} { The complete quit procedure, which even logs off NPCs! - Grimlord } procedure do_quit(ch : GCharacter; param : string); var timer : GTimer; begin if (ch.position = POS_FIGHTING) then begin ch.sendBuffer('You are fighting! You can''t quit!'#13#10); exit; end; timer := hasTimer(ch, TIMER_COMBAT); if (timer <> nil) then begin ch.sendBuffer('You have recently fled out of combat or have encountered a member'#13#10); ch.sendBuffer('of the opposite alignment. Therefor you are not allowed to quit.'#13#10); ch.sendBuffer('Please wait another '+inttostr(round(timer.counter / CPULSE_TICK))+' gameticks to quit.'#13#10); exit; end; if (auction_good.seller = ch) or (auction_good.buyer = ch) or (auction_evil.seller = ch) or (auction_evil.buyer = ch) then begin ch.sendBuffer('Please wait till the current auction has been concluded.'#13#10); exit; end; if (ch.snooped_by <> nil) then interpret(ch.snooped_by, 'snoop self'); act(AT_REPORT, '$n has logged off.', false, ch, nil, nil, TO_ROOM); if (ch.conn <> nil) then GConnection(ch.conn).send('Thanks for playing! Please visit this MUD again!'#13#10); ch.quit; end; procedure do_save(ch : GCharacter; param : string); begin ch.save(ch.name^); ch.sendBuffer('Ok.'#13#10); end; procedure do_afk(ch : GCharacter; param : string); begin GConnection(ch.conn).afk := true; ch.sendBuffer('You are now listed as AFK. Hitting ENTER will cease this.'#13#10); end; { Revised help - Nemesis } procedure do_help(ch : GCharacter; param : string); var buf, s, keyword : string; help : GHelp; counter : integer; node : GListNode; begin if (length(param) = 0) then begin buf := ch.ansiColor(3) + ' ' + add_chars(78, '---- Available help keywords ', '-') + ch.ansiColor(7) + #13#10#13#10; counter := 0; node := help_files.head; while (node <> nil) do begin help := node.element; keyword := help.keywords; while (length(keyword) > 0) do begin keyword := one_argument(keyword, s); if (s[length(s)] <> '_') then begin buf := buf + pad_string(lowercase(s), 19); inc(counter); if (counter = 4) then begin buf := buf + #13#10; counter := 0; end; end; end; node := node.next; end; ch.sendPager(buf + #13#10); exit; end; help := findHelp(param); if (help = nil) or (help = help_files.head.element) then ch.sendBuffer('No help on that word.'#13#10) else begin buf := ch.ansiColor(3) + ' ' + add_chars(78, '---- Help topic ', '-') + ch.ansiColor(7) + #13#10#13#10 + 'Name: ' + ansiColor(3,0) + help.keywords + #13#10 + ansiColor(7,0) + 'Type: ' + ansiColor(3,0) + help.helptype + #13#10 + ansiColor(7,0) + 'Syntax: ' + ansiColor(3,0) + help.syntax + #13#10 + ansiColor(7,0) + 'Related: ' + ansiColor(3,0) + help.related + #13#10 + ansiColor(7,0) + #13#10 + help.text; ch.sendPager(buf); end; end; procedure do_remort(ch : GCharacter; param : string); var a:integer; str,con,dex,int,wis,dam,pracs:integer; sub : string; begin if (ch.IS_IMMORT) then ch.sendBuffer('You don''t want to remort!'#13#10) else if (ch.player^.remorts >= 6) then ch.sendBuffer('You have had enough remorts.'#13#10) else if (length(param) = 0) then ch.sendBuffer('REMORT <stat> <stat> <stat> <stat> <stat> <extra>'#13#10) else begin str:=0; con:=0; dex:=0; int:=0; wis:=0; dam:=0; pracs:=0; for a:=0 to 4 do begin param:=one_argument(param,sub); if (comparestr('str', sub) = 0) then inc(str) else if (comparestr('con',sub)=0) then inc(con) else if (comparestr('dex',sub)=0) then inc(dex) else if (comparestr('int',sub)=0) then inc(int) else if (comparestr('wis',sub)=0) then inc(wis) else begin ch.sendBuffer('Unknown stat in parameter list.'#13#10); exit; end; end; param := one_argument(param,sub); if (comparestr('dam',sub)=0) then inc(dam,2) else if (comparestr('pracs',sub)=0) then inc(pracs,25) else begin ch.sendBuffer('Illegal extra in parameter list.'#13#10); exit; end; with ch do begin inc(player^.remorts); inc(ability.str,str); inc(ability.con,con); inc(ability.dex,dex); inc(ability.int,int); inc(ability.wis,wis); inc(point.apb,dam); level:=1; point.max_hp:=50; point.max_mv:=40; point.max_mana:=25; // player^.xptogo:=calculatexp2lvl(ch); fillchar(learned,sizeof(learned),0); // recalcac(ch); point.hitroll:=50; end; act(AT_WHITE,'Congratulations! This is remort '+inttostr(ch.player^.remorts)+ ' for your character!',false,ch,nil,nil,TO_CHAR); end; end; { Revised - Nemesis } procedure do_delete(ch: GCharacter; param : string); var f:file; h:integer; begin if (ch.IS_NPC) then begin ch.sendBuffer('NPCs cannot delete.'#13#10); exit; end; if (not MD5Match(ch.player^.md5_password, MD5String(param))) then begin ch.sendBuffer('Type DELETE <password> to delete. WARNING: This is irreversible!'#13#10); exit; end; GConnection(ch.conn).send('You feel yourself dissolving, atom by atom...'#13#10); write_console(ch.name^ + ' has deleted'); ch.quit; assignfile(f, 'players\' + ch.name^ + '.usr'); rename(f, 'backup\' + ch.name^ + '.usr'); end; procedure do_wimpy(ch : GCharacter; param : string); var wimpy:integer; begin if (length(param) = 0) then begin ch.sendBuffer('Set wimpy to what?'#13#10); exit; end; try wimpy := strtoint(param); except ch.sendBuffer('That is not a valid number.'#13#10); exit; end; if (wimpy > ch.point.max_hp div 3) then ch.sendBuffer('Your wimpy cannot be higher than 1/3 of your total hps!'#13#10) else begin ch.player^.wimpy := wimpy; ch.sendBuffer(pchar('Wimpy set to '+inttostr(wimpy)+'.'+#13#10)); end; end; { Allow players to lock their keyboard - Nemesis } procedure do_keylock(ch : GCharacter; param: string); begin GConnection(ch.conn).afk := true; GConnection(ch.conn).keylock := true; ch.sendBuffer('You are now away from keyboard.'#13#10); ch.sendBuffer('Enter your password to unlock.'#13#10); end; {$I include\cmd_imm.inc} {$I include\cmd_info.inc} {$I include\cmd_move.inc} {$I include\cmd_fight.inc} {$I include\cmd_magic.inc} {$I include\cmd_skill.inc} {$I include\cmd_comm.inc} {$I include\cmd_obj.inc} {$I include\cmd_shops.inc} {$I include\cmd_build.inc}