{
Summary:
Online help interface
## $Id: mudhelp.pas,v 1.7 2004/04/10 22:24:03 druid Exp $
}
unit mudhelp;
interface
uses
dtypes;
type
GHelp = class
public
keywords, helptype, syntax, related : string;
text : string;
level : integer;
end;
var
helpFiles : GDLinkedList;
procedure loadHelp(const fname : string);
function findHelp(text : string) : GHelp;
procedure initHelp();
procedure cleanupHelp();
implementation
uses
SysUtils,
fsys,
constants,
strip,
util,
mudsystem,
skills;
type
ASkill = class
min_lvl : integer;
name : string;
constructor Create(lvl : integer; const str : string);
end;
constructor ASkill.Create(lvl : integer; const 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 := ASkill(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;
iterator : GIterator;
gsk : GSkill;
ask : ASkill;
ll : GDLinkedList;
begin
buf := '';
ll := GDLinkedList.Create();
iterator := skill_table.iterator();
while (iterator.hasNext()) do
begin
gsk := GSkill(iterator.next());
if (gsk.skill_type = sktype) then
begin
ask := ASkill.Create(gsk.min_lvl, gsk.name);
insertLevelSorted(ll, ask);
end;
end;
iterator.Free();
iterator := ll.iterator();
while (iterator.hasNext()) do
begin
ask := ASkill(iterator.next());
buf := buf + Format('[$B$4%3d$A$7] %s', [ask.min_lvl, ask.name]);
if (iterator.hasNext()) then
buf := buf + #13#10;
end;
Result := buf;
end;
{ Xenon 16/Apr/2001: added keywords %SKILL_LIST% and %SPELL_LIST% and their functionality }
procedure loadHelp(const 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, translateFileName('help\'+fname));
{$I-}
reset(f);
{$I+}
if (IOResult <> 0) then
begin
bugreport('load_help', 'mudhelp.pas', 'could not open help\' + fname);
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.';
helpFiles.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:='';
// jago .. clear all variables
related := '';
syntax := '';
helptype := '';
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;
helpFiles.insertLast(help);
end
else
if (g = '#INCLUDE') then
loadHelp(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);
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);
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;
// Find help by keyword
function findHelp(text : string) : GHelp;
var
help : GHelp;
key, arg : string;
s, p : integer;
iterator : GIterator;
begin
Result := GHelp(helpFiles.head.element);
p := high(integer);
text := uppercase(text);
iterator := helpFiles.iterator();
while (iterator.hasNext()) do
begin
help := GHelp(iterator.next());
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;
end;
iterator.Free();
end;
procedure initHelp();
begin
helpFiles := GDLinkedList.Create();
end;
procedure cleanupHelp();
begin
helpFiles.clear();
helpFiles.Free();
end;
end.