// $Id: mudhelp.pas,v 1.7 2001/07/12 16:37:02 druid Exp $ unit mudhelp; interface uses dtypes; type GHelp = class keywords, helptype, syntax, related : string; text : string; level : integer; end; var help_files : GDLinkedList; procedure load_help(fname:string); function findHelp(text : string) : GHelp; implementation uses SysUtils, constants, strip, util, mudsystem, skills, AnsiIO; type ASkill = class min_lvl : integer; name : string; constructor Create(lvl : integer; str : string); end; constructor ASkill.Create(lvl : integer; str : string); begin min_lvl := lvl; name := str; end; function getSkillSpellList(sktype : integer) : string; procedure insertLevelSorted(var ll : GDLinkedList; ask : ASkill); var node,ins : GListNode; sk : ASkill; begin ins := nil; if (ll.head = nil) then begin ll.insertLast(ask); exit; end; node := ll.head; while (node <> nil) do begin sk := node.element; if (ask.min_lvl > sk.min_lvl) then begin ins := node; end else begin ll.insertBefore(node, ask); exit; end; node := node.next; end; ll.insertAfter(ins, ask) end; var buf : string; node : GListNode; gsk : GSkill; ask : ASkill; ll : GDLinkedList; begin buf := ''; ll := GDLinkedList.Create(); node := skill_table.head; while (node <> nil) do begin gsk := node.element; if (gsk.skill_type = sktype) then begin ask := ASkill.Create(gsk.min_lvl, gsk.name^); insertLevelSorted(ll, ask); end; node := node.next; end; node := ll.head; while (node <> nil) do begin ask := node.element; buf := buf + Format('[$B$4%3d$A$7] %s', [ask.min_lvl, ask.name]); if (node <> ll.tail) then buf := buf + #13#10; node := node.next; end; Result := buf; end; { Xenon 16/Apr/2001: added keywords %SKILL_LIST% and %SPELL_LIST% and their functionality } procedure load_help(fname:string); var f:textfile; s, g, key : string; keyword : boolean; keys, text, helptype, related, syntax : string; help : GHelp; a, b : integer; begin assignfile(f,'help\'+fname); {$I-} reset(f); {$I+} if IOResult<>0 then begin bugreport('load_help', 'mudhelp.pas', 'could not open help\' + fname, 'The specified helpfile could not be opened. Please check your settings.'); exit; end; // first, add a default help help := GHelp.Create; help.level := 0; help.keywords := 'DEFAULT_'; help.helptype := ''; help.syntax := ''; help.related := ''; help.text := 'This is dummy help.'; help_files.insertLast(help); keyword := false; repeat readln(f,s); if pos('#',s)=1 then begin g := uppercase(left(s, '=')); if (g = '#KEYWORD') then begin keys := right(s, '='); keyword:=true; text:=''; end else if (g = '#TYPE') then begin helptype := right(s, '='); end else if (g = '#SYNTAX') then begin syntax := right(s, '='); end else if (g = '#RELATED') then begin related := right(s, '='); end else if g='#END' then begin keyword:=false; help := GHelp.Create; help.level := StrToInt(right(s, '=')); help.keywords := keys; help.helptype := helptype; help.syntax := syntax; help.related := related; help.text := text; help_files.insertLast(help); end else if g='#INCLUDE' then load_help(right(s, '=')); end else if keyword then begin a := 1; while (a <= length(s)) do begin if (s[a] = '%') then begin if (a = length(s)) then begin bugreport('load_help', 'mudhelp.pas', 'illegal "%" character use in ' + fname, 'Use of the character "%" is prohibited in helpfiles.'); exit; end; if (s[a + 1] = '%') then begin g := '%'; a := a + 2; continue; end; key := ''; b := a + 1; while (s[b] <> '%') do begin key := key + s[b]; inc(b); end; if (key = 'VERSION') then g := version_number else if (key = 'INFO') then g := version_info else if (key = 'COPYRIGHT') then g := version_copyright else if (key = 'SKILL_LIST') then g := getSkillSpellList(SKILL_SKILL) else if (key = 'SPELL_LIST') then g := getSkillSpellList(SKILL_SPELL) else bugreport('load_help', 'mudhelp.pas', 'illegal key "' + key + '" in ' + fname, 'This helpfile uses an unknown key.'); text := text + g; a := b; end else text := text + s[a]; inc(a); end; text := text + #13#10; end; until eof(f); closefile(f); end; function findHelp(text : string) : GHelp; var node : GListNode; help : GHelp; key, arg : string; s, p : integer; begin Result := help_files.head.element; p := high(integer); text := uppercase(text); node := help_files.head; while (node <> nil) do begin help := node.element; key := help.keywords; while (length(key) > 0) do begin key := one_argument(key, arg); s := pos(text, arg); if (s > 0) and (s < p) then begin p := s; Result := help; end; end; node := node.next; end; end; begin help_files := GDLinkedList.Create; end.