guild.pas

来自「原版翎风(LF)引擎(M2)源码(Delphi)」· PAS 代码 · 共 1,320 行 · 第 1/3 页

PAS
1,320
字号
unit Guild;

interface
uses
  Windows, SysUtils, Classes, IniFiles, ObjBase;
type
  TGuildRank = record
    nRankNo: Integer;
    sRankName: string;
    MemberList: TStringList;
  end;
  pTGuildRank = ^TGuildRank;
  TWarGuild = record
    Guild: TObject;
    dwWarTick: LongWord;
    dwWarTime: LongWord;
  end;
  pTWarGuild = ^TWarGuild;
  TGUild = class
    sGuildName: string; //0x04
    NoticeList: TStringList; //0x08
    GuildWarList: TStringList; //0x0C
    GuildAllList: TStringList; //0x10
    m_RankList: TList; //0x14 职位列表
    nContestPoint: Integer; //0x18
    boTeamFight: Boolean; //0x1C;
//    MatchPoint   :Integer;
    TeamFightDeadList: TStringList; //0x20
    m_boEnableAuthAlly: Boolean; //0x24
    dwSaveTick: LongWord; //0x28
    boChanged: Boolean; //0x2C;
    m_DynamicVarList: TList;
  private
    m_Config: TIniFile;
    m_nBuildPoint: Integer; //建筑度
    m_nAurae: Integer; //人气度
    m_nStability: Integer; //安定度
    m_nFlourishing: Integer; //繁荣度
    m_nChiefItemCount: Integer; //行会领取装备数量

    function SetGuildInfo(sChief: string): Boolean;
    procedure ClearRank();
    procedure SaveGuildFile(sFileName: string);
    procedure SaveGuildConfig(sFileName: string);
    function GetMemberCount(): Integer;
    function GetMemgerIsFull(): Boolean;
    procedure SetAuraePoint(nPoint: Integer);
    procedure SetBuildPoint(nPoint: Integer);
    procedure SetStabilityPoint(nPoint: Integer);
    procedure SetFlourishPoint(nPoint: Integer);
    procedure SetChiefItemCount(nPoint: Integer);
  public
    constructor Create(sName: string);
    destructor Destroy; override;
    procedure SaveGuildInfoFile();
    function LoadGuild(): Boolean;
    function LoadGuildFile(sGuildFileName: string): Boolean;
    function LoadGuildConfig(sGuildFileName: string): Boolean;
    procedure UpdateGuildFile;
    procedure CheckSaveGuildFile;
    function IsMember(sName: string): Boolean;
    function IsAllyGuild(Guild: TGUild): Boolean;
    function IsWarGuild(Guild: TGUild): Boolean;
    function DelAllyGuild(Guild: TGUild): Boolean;
    procedure TeamFightWhoDead(sName: string);
    procedure TeamFightWhoWinPoint(sName: string; nPoint: Integer);
    procedure SendGuildMsg(sMsg: string);
    procedure RefMemberName();
    function GetRankName(PlayObject: TPlayObject; var nRankNo: Integer): string;
    function DelMember(sHumName: string): Boolean;
    function UpdateRank(sRankData: string): Integer;
    function CancelGuld(sHumName: string): Boolean;
    function IsNotWarGuild(Guild: TGUild): Boolean;
    function AllyGuild(Guild: TGUild): Boolean;

    function AddMember(PlayObject: TPlayObject): Boolean;
    procedure DelHumanObj(PlayObject: TPlayObject);
    function GetChiefName(): string;
    procedure BackupGuildFile();
    procedure sub_499B4C(Guild: TGUild);
    function AddWarGuild(Guild: TGUild): pTWarGuild;
    procedure StartTeamFight();
    procedure EndTeamFight();
    procedure AddTeamFightMember(sHumanName: string);
    property Count: Integer read GetMemberCount;
    property IsFull: Boolean read GetMemgerIsFull;
    property nBuildPoint: Integer read m_nBuildPoint write SetBuildPoint;
    property nAurae: Integer read m_nAurae write SetAuraePoint;
    property nStability: Integer read m_nStability write SetStabilityPoint;
    property nFlourishing: Integer read m_nFlourishing write SetFlourishPoint;
    property nChiefItemCount: Integer read m_nChiefItemCount write SetChiefItemCount;
  end;
  TGuildManager = class
    GuildList: TList; //0x4
  private
  public
    constructor Create();
    destructor Destroy; override;
    procedure LoadGuildInfo();
    procedure SaveGuildList();
    function MemberOfGuild(sName: string): TGUild;
    function AddGuild(sGuildName, sChief: string): Boolean;
    function FindGuild(sGuildName: string): TGUild;
    function DELGUILD(sGuildName: string): Boolean;
    procedure ClearGuildInf();
    procedure Run();
  end;
implementation

uses M2Share, HUtil32, Grobal2;

{ TGuildManager }

function TGuildManager.AddGuild(sGuildName, sChief: string): Boolean; //0049A4A4
var
  Guild: TGUild;
begin
  Result := False;
  if CheckGuildName(sGuildName) and (FindGuild(sGuildName) = nil) then
  begin
    Guild := TGUild.Create(sGuildName);
    Guild.SetGuildInfo(sChief);
    GuildList.Add(Guild);
    SaveGuildList();
    Result := True;
  end;
end;
function TGuildManager.DELGUILD(sGuildName: string): Boolean; //0049A550
var
  i: Integer;
  Guild: TGUild;
begin
  Result := False;
  for i := 0 to GuildList.Count - 1 do
  begin
    Guild := TGUild(GuildList.Items[i]);
    if CompareText(Guild.sGuildName, sGuildName) = 0 then
    begin
      if Guild.m_RankList.Count > 1 then Break;
      Guild.BackupGuildFile();
      GuildList.Delete(i);
      SaveGuildList();
      Result := True;
      Break;
    end;
  end;
end;

procedure TGuildManager.ClearGuildInf; //0049A02C
var
  i: Integer;
begin
  for i := 0 to GuildList.Count - 1 do
  begin
    TGUild(GuildList.Items[i]).Free;
  end;
  GuildList.Clear;
end;

constructor TGuildManager.Create;
begin
  GuildList := TList.Create;
end;

destructor TGuildManager.Destroy;
begin
  GuildList.Free;
  inherited;
end;

function TGuildManager.FindGuild(sGuildName: string): TGUild; //0049A36C
var
  i: Integer;
begin
  Result := nil;
  for i := 0 to GuildList.Count - 1 do
  begin
    if TGUild(GuildList.Items[i]).sGuildName = sGuildName then
    begin
      Result := TGUild(GuildList.Items[i]);
      Break;
    end;
  end;
end;

procedure TGuildManager.LoadGuildInfo; //0049A078
var
  LoadList: TStringList;
  Guild: TGUild;
  sGuildName: string;
  i: Integer;
begin
  if FileExists(g_Config.sGuildFile) then
  begin
    LoadList := TStringList.Create;
    LoadList.LoadFromFile(g_Config.sGuildFile);
    for i := 0 to LoadList.Count - 1 do
    begin
      sGuildName := Trim(LoadList.Strings[i]);
      if sGuildName <> '' then
      begin
        Guild := TGUild.Create(sGuildName);
        GuildList.Add(Guild);
      end;
    end;
    LoadList.Free;
    for i := GuildList.Count - 1 downto 0 do
    begin
      Guild := GuildList.Items[i];
      if not Guild.LoadGuild() then
      begin
        MainOutMessage(Guild.sGuildName + ' 读取出错!!!');
        Guild.Free;
        GuildList.Delete(i);
        SaveGuildList();
      end;
    end;
    MainOutMessage('已读取 ' + IntToStr(GuildList.Count) + '个行会信息...');
  end else
  begin
    MainOutMessage('行会信息读取失败...');
  end;

end;

function TGuildManager.MemberOfGuild(sName: string): TGUild;
//0049A408
var
  i: Integer;
begin
  Result := nil;
  for i := 0 to GuildList.Count - 1 do
  begin
    if TGUild(GuildList.Items[i]).IsMember(sName) then
    begin
      Result := TGUild(GuildList.Items[i]);
      Break;
    end;
  end;
end;

procedure TGuildManager.SaveGuildList; //0049A260
var
  i: Integer;
  SaveList: TStringList;
begin
  if nServerIndex <> 0 then Exit;
  SaveList := TStringList.Create;
  for i := 0 to GuildList.Count - 1 do
  begin
    SaveList.Add(TGUild(GuildList.Items[i]).sGuildName);
  end; // for
  try
    SaveList.SaveToFile(g_Config.sGuildFile);
  except
    MainOutMessage('行会信息保存失败!!');
  end;
  SaveList.Free;
end;

procedure TGuildManager.Run; //0049A61C
var
  i: Integer;
  ii: Integer;
  Guild: TGUild;
  boChanged: Boolean;
  WarGuild: pTWarGuild;
begin
  for i := 0 to GuildList.Count - 1 do
  begin
    Guild := TGUild(GuildList.Items[i]);
    boChanged := False;
    for ii := Guild.GuildWarList.Count - 1 downto 0 do
    begin
      WarGuild := pTWarGuild(Guild.GuildWarList.Objects[ii]);
      if (GetTickCount - WarGuild.dwWarTick) > WarGuild.dwWarTime then
      begin
        Guild.sub_499B4C(TGUild(WarGuild.Guild));
        Guild.GuildWarList.Delete(ii);
        Dispose(WarGuild);
        boChanged := True;
      end;
    end;

    if boChanged then
    begin
      Guild.UpdateGuildFile();
    end;
    Guild.CheckSaveGuildFile;
  end;
end;

{ TGuild }
procedure TGUild.ClearRank; //00497C78
var
  i: Integer;
  GuildRank: pTGuildRank;
begin
  for i := 0 to m_RankList.Count - 1 do
  begin
    GuildRank := m_RankList.Items[i];
    GuildRank.MemberList.Free;
    Dispose(GuildRank);
  end; // for
  m_RankList.Clear;
end;

constructor TGUild.Create(sName: string); //00497B04
var
  sFileName: string;
begin
  sGuildName := sName;
  NoticeList := TStringList.Create;
  GuildWarList := TStringList.Create;
  GuildAllList := TStringList.Create;
  m_RankList := TList.Create;
  TeamFightDeadList := TStringList.Create;
  dwSaveTick := 0;
  boChanged := False;
  nContestPoint := 0;
  boTeamFight := False;
  m_boEnableAuthAlly := False;

  sFileName := g_Config.sGuildDir + sName + '.ini';
  m_Config := TIniFile.Create(sFileName);
  if not FileExists(sFileName) then
  begin
    m_Config.WriteString('Guild', 'GuildName', sName);
  end;

  m_nBuildPoint := 0;
  m_nAurae := 0;
  m_nStability := 0;
  m_nFlourishing := 0;
  m_nChiefItemCount := 0;
  m_DynamicVarList := TList.Create;
end;

function TGUild.DelAllyGuild(Guild: TGUild): Boolean; //00499CEC
var
  i: Integer;
  AllyGuild: TGUild;
begin
  Result := False;
  for i := 0 to GuildAllList.Count - 1 do
  begin
    AllyGuild := TGUild(GuildAllList.Objects[i]);
    if AllyGuild = Guild then
    begin
      GuildAllList.Delete(i);
      Result := True;
      Break;
    end;
  end; // for
  SaveGuildInfoFile();
end;

destructor TGUild.Destroy; //00497C08
var
  i: Integer;
begin
  NoticeList.Free;
  GuildWarList.Free;
  GuildAllList.Free;
  ClearRank();
  m_RankList.Free;
  TeamFightDeadList.Free;
  m_Config.Free;
  for i := 0 to m_DynamicVarList.Count - 1 do
  begin
    Dispose(pTDynamicVar(m_DynamicVarList.Items[i]));
  end;
  m_DynamicVarList.Free;
  inherited;
end;

function TGUild.IsAllyGuild(Guild: TGUild): Boolean; //00499BD8
var
  i: Integer;
  AllyGuild: TGUild;
begin
  Result := False;
  for i := 0 to GuildAllList.Count - 1 do
  begin
    AllyGuild := TGUild(GuildAllList.Objects[i]);
    if AllyGuild = Guild then
    begin
      Result := True;
      Break;
    end;
  end;
end;

function TGUild.IsMember(sName: string): Boolean; //00498714
var
  i, ii: Integer;
  GuildRank: pTGuildRank;
begin
  Result := False;
  for i := 0 to m_RankList.Count - 1 do
  begin
    GuildRank := m_RankList.Items[i];
    for ii := 0 to GuildRank.MemberList.Count - 1 do
    begin
      if GuildRank.MemberList.Strings[ii] = sName then
      begin
        Result := True;
        Exit;
      end;
    end;
  end;
end;

function TGUild.IsWarGuild(Guild: TGUild): Boolean; //00499924
var
  i: Integer;
begin
  Result := False;
  for i := 0 to GuildWarList.Count - 1 do
  begin
    if pTWarGuild(GuildWarList.Objects[i]).Guild = Guild then
    begin
      Result := True;
      Break;
    end;
  end; // for
end;

function TGUild.LoadGuild(): Boolean; //00497CE4
var
  sFileName: string;
begin
  sFileName := sGuildName + '.txt';
  Result := LoadGuildFile(sFileName);
  LoadGuildConfig(sGuildName + '.ini');
end;

function TGUild.LoadGuildConfig(sGuildFileName: string): Boolean;
begin
  m_nBuildPoint := m_Config.ReadInteger('Guild', 'BuildPoint', m_nBuildPoint);

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?