/
CVS/
boards/CVS/
clans/
gmc/CVS/
help/CVS/
include/CVS/
players/
progs/CVS/
races/CVS/
system/CVS/
text/
text/CVS/
todo/
todo/CVS/
units/CVS/
// $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.