grendel-1.0.0a7/backup/
grendel-1.0.0a7/bin/
grendel-1.0.0a7/boards/
grendel-1.0.0a7/clans/
grendel-1.0.0a7/documentation/todo/
grendel-1.0.0a7/help/
grendel-1.0.0a7/logs/
grendel-1.0.0a7/players/
grendel-1.0.0a7/progs/
grendel-1.0.0a7/races/
grendel-1.0.0a7/src/contrib/
grendel-1.0.0a7/src/modules/speller/
grendel-1.0.0a7/src/modules/status/
grendel-1.0.0a7/src/tests/
grendel-1.0.0a7/src/tests/dunit/
{
  Summary:
  	Clan routines
  
  ##	$Id: clan.pas,v 1.4 2004/04/10 22:24:03 druid Exp $
}

unit clan;

interface

uses
	dtypes;

type
	GClan = class
	private
		_name : string;          { clan name }
		_abbrev : string;        { abbreviation of clan name, 3-4 chars }
		_leader : string;        { leader of clan }
		_minlevel : integer;     { Minimum level to join }
		_clanobj : integer;      { VNum of clan obj (e.g. a ring) }
		_clanvnum : integer;     { Clan area starting VNum }

	public
		constructor Create();

		procedure load(const fname : string);
		
		property name : string read _name write _name;
		property abbrev : string read _abbrev write _abbrev;
		property leader : string read _leader write _leader;
		property minlevel : integer read _minlevel write _minlevel;
		property clanobj : integer read _clanobj write _clanobj;
		property clanvnum : integer read _clanvnum write _clanvnum;
	end;

var
   clan_list : GDLinkedList;

procedure load_clans();

function findClan(const s : string) : GClan;

procedure initClans();
procedure cleanupClans();

implementation

uses
    SysUtils,
	fsys,
    strip,
    console,
    mudsystem;

constructor GClan.Create();
begin
  inherited Create;

  _minlevel := 50;
  _clanvnum := 0;
  _clanobj := 0;
  _leader := '';
  _name := 'Untitled Clan';
  _abbrev := '';
end;

procedure GClan.load(const fname : string);
var 
  cf : textfile;
  d, r : string;
  i : integer;
begin
  assignfile(cf, translateFileName('clans\'+fname));
  {$I-}
  reset(cf);
  {$I+}

  if (IOResult <> 0) then
    begin
    bugreport('GClan.load', 'clan.pas', 'could not open clans\' + fname);
    exit;
    end;

  repeat
    readln(cf,d);
  until uppercase(d)='#CLAN';

  repeat
    readln(cf,d);

    r:=uppercase(left(d,':'));

    if r='NAME' then
      begin
      name := right(d,' ');
      writeConsole('   '+name);
      end
    else
    if r='LEADER' then
      leader := right(d,' ')
    else
    if r='MINLEVEL' then
      try
        minlevel := strtointdef(right(d,' '), 0)
      except
        minlevel:=0;
        bugreport('load_clan', 'area.pas', 'illegal character in MINLEVEL parameter');
      end
    else
    if r='CLANOBJ' then
      try
        clanobj := strtoint(right(d,' '))
      except
        clanobj:=0;
        bugreport('load_clan', 'area.pas', 'illegal character in CLANOBJ parameter');
      end
    else
    if r='CLANVNUM' then
      try
        clanvnum:=strtoint(right(d,' '));
      except
        clanvnum:=0;
        bugreport('load_clan', 'area.pas', 'illegal character in CLANVNUM parameter');
      end
    else
    if (r = 'ABBREV') then
      abbrev := right(d, ' ');
  until uppercase(d)='#END';
  
  // simple heuristics to convert a clan name to an abbreviation when none is specified
  if (abbrev = '') then
    begin
    for i := 1 to length(name) do
      if (name[i] in ['A'..'Z']) then
        abbrev := abbrev + name[i];
        
    if (length(abbrev) > 3) then
      abbrev := copy(abbrev, 1, 3);
    end;

  close(cf);
end;

procedure load_clans();
var clan : GClan;
    s:string;
    f:textfile;
begin
  assign(f, translateFileName('clans\clan.list'));
  {$I-}
  reset(f);
  {$I+}
  if IOResult<>0 then
    begin
    bugreport('load_clans', 'area.pas', 'could not open clans\clan.list');
    exit;
    end;
  repeat
    readln(f,s);

    if (s <> '$') then
      begin
      clan := GClan.Create;

      clan.load(s);

      clan_list.insertLast(clan);
      end;
  until s='$';

  close(f);
end;

function findClan(const s : string) : GClan;
var
	iterator : GIterator;
	clan : GClan;
begin
  Result := nil;
  iterator := clan_list.iterator();

  while (iterator.hasNext()) do
    begin
    clan := GClan(iterator.next());

    if (s = clan.name) then
      begin
      Result := clan;
      break;
      end;
    end;

	iterator.Free();
end;

procedure initClans();
begin
  clan_list := GDLinkedList.Create();
end;

procedure cleanupClans();
begin
  clan_list.clear();
  clan_list.Free();
end;


end.