⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 castle.pas

📁 乐都SQL版传奇全套代码,绝对可编译
💻 PAS
📖 第 1 页 / 共 3 页
字号:
end;

function TUserCastle.ReceiptGolds(PlayObject: TPlayObject; nGold: Integer):
  Integer;                                                  //00490864
begin
  Result := -1;
  if nGold <= 0 then
  begin
    Result := -4;
    exit;
  end;
  if (m_MasterGuild = PlayObject.m_MyGuild) and (PlayObject.m_nGuildRankNo = 1)
    and (nGold > 0) then
  begin
    if (nGold <= PlayObject.m_nGold) then
    begin
      if (m_nTotalGold + nGold) <= g_Config.nCastleGoldMax then
      begin
        Dec(PlayObject.m_nGold, nGold);
        Inc(m_nTotalGold, nGold);
        if g_boGameLogGold then
          AddGameDataLog('23' + #9 +
            PlayObject.m_sMapName + #9 +
            IntToStr(PlayObject.m_nCurrX) + #9 +
            IntToStr(PlayObject.m_nCurrY) + #9 +
            PlayObject.m_sCharName + #9 +
            sSTRING_GOLDNAME + #9 +
            IntToStr(nGold) + #9 +
            '1' + #9 +
            '0');
        PlayObject.GoldChanged;
        Result := 1;
      end
      else
        Result := -3;
    end
    else
      Result := -2;
  end;
end;

procedure TUserCastle.MainDoorControl(boClose: Boolean);    //00490460
begin
  if (m_MainDoor.BaseObject <> nil) and not m_MainDoor.BaseObject.m_boGhost then
  begin
    if boClose then
    begin
      if TCastleDoor(m_MainDoor.BaseObject).m_boOpened then
        TCastleDoor(m_MainDoor.BaseObject).Close;
    end
    else
    begin
      if not TCastleDoor(m_MainDoor.BaseObject).m_boOpened then
        TCastleDoor(m_MainDoor.BaseObject).Open;
    end;
  end;
end;

function TUserCastle.RepairDoor(): Boolean;                 //00490A70
var
  CastleDoor                            : pTObjUnit;
begin
  Result := False;
  CastleDoor := @m_MainDoor;
  if (CastleDoor.BaseObject = nil) or
    (m_boUnderWar) or
    (CastleDoor.BaseObject.m_WAbil.HP >= CastleDoor.BaseObject.m_WAbil.MaxHP)
    then
  begin
    exit;
  end;
  if not CastleDoor.BaseObject.m_boDeath then
  begin
    if (GetTickCount - CastleDoor.BaseObject.m_dwStruckTick) > 60 * 1000 then
    begin
      CastleDoor.BaseObject.m_WAbil.HP := CastleDoor.BaseObject.m_WAbil.MaxHP;
      TCastleDoor(CastleDoor.BaseObject).RefStatus();
      Result := True;
    end;
  end
  else
  begin
    if (GetTickCount - CastleDoor.BaseObject.m_dwStruckTick) > 60 * 1000 then
    begin
      CastleDoor.BaseObject.m_WAbil.HP := CastleDoor.BaseObject.m_WAbil.MaxHP;
      CastleDoor.BaseObject.m_boDeath := False;
      TCastleDoor(CastleDoor.BaseObject).m_boOpened := False;
      TCastleDoor(CastleDoor.BaseObject).RefStatus();
      Result := True;
    end;
  end;

end;

function TUserCastle.RepairWall(nWallIndex: Integer): Boolean; //00490B78
var
  Wall                                  : TBaseObject;
begin
  Result := False;
  Wall := nil;
  case nWallIndex of
    1: Wall := m_LeftWall.BaseObject;
    2: Wall := m_CenterWall.BaseObject;
    3: Wall := m_RightWall.BaseObject;
  end;
  if (Wall = nil) or
    (m_boUnderWar) or
    (Wall.m_WAbil.HP >= Wall.m_WAbil.MaxHP) then
  begin
    exit;
  end;
  if not Wall.m_boDeath then
  begin
    if (GetTickCount - Wall.m_dwStruckTick) > 60 * 1000 then
    begin
      Wall.m_WAbil.HP := Wall.m_WAbil.MaxHP;
      TWallStructure(Wall).RefStatus();
      Result := True;
    end;
  end
  else
  begin
    if (GetTickCount - Wall.m_dwStruckTick) > 60 * 1000 then
    begin
      Wall.m_WAbil.HP := Wall.m_WAbil.MaxHP;
      Wall.m_boDeath := False;
      TWallStructure(Wall).RefStatus();
      Result := True;
    end;
  end;
end;

function TUserCastle.AddAttackerInfo(Guild: TGUild): Boolean; //00490CD8
var
  AttackerInfo, ainfo                   : pTAttackerInfo;
  i                                     : Integer;
begin
  Result := False;
  if InAttackerList(Guild) then
    exit;
  //2005-10-12
//  if m_AttackWarList.Count > 1 then
 //   exit;
  New(AttackerInfo);
  AttackerInfo.AttackDate := AddDateTimeOfDay(Date,
    g_Config.nStartCastleWarDays);
  AttackerInfo.sGuildName := Guild.sGuildName;
  AttackerInfo.Guild := Guild;
  //2005-10-09修改
 { for i := 0 to m_AttackWarList.Count - 1 do
  begin
    ainfo := pTAttackerInfo(m_AttackWarList[i]);
    if ainfo.AttackDate >= AttackerInfo.AttackDate then
      AttackerInfo.AttackDate := AddDateTimeOfDay(ainfo.AttackDate, 2);
  end;
  }
  m_AttackWarList.Add(AttackerInfo);
  WarDateIndex := m_AttackWarList.Count - 1;

  SaveAttackSabukWall();
  UserEngine.SendServerGroupMsg(SS_212, nServerIndex, '');
  Result := True;
end;

function TUserCastle.InAttackerList(Guild: TGUild): Boolean; //00490C84
var
  i                                     : Integer;
begin
  Result := False;
  for i := 0 to m_AttackWarList.Count - 1 do
  begin
    if pTAttackerInfo(m_AttackWarList.Items[i]).Guild = Guild then
    begin
      Result := True;
      break;
    end;
  end;
end;

function TUserCastle.m_nChiefItemCount: Integer;
begin

end;

procedure TUserCastle.SetPower(nPower: Integer);
begin
  m_nPower := nPower;
end;

procedure TUserCastle.SetTechLevel(nLevel: Integer);
begin
  m_nTechLevel := nLevel;
end;

{ TCastleManager }



constructor TCastleManager.Create;
begin
  m_CastleList := TMyList.create;
  InitializeCriticalSection(CriticalSection);
end;


destructor TCastleManager.Destroy;
var
  i                                     : Integer;
  UserCastle                            : TUserCastle;
begin
  for i := 0 to m_CastleList.Count - 1 do
  begin
    UserCastle := TUserCastle(m_CastleList.Items[i]);
    UserCastle.Save;
    UserCastle.Free;
  end;
  m_CastleList.Free;
  DeleteCriticalSection(CriticalSection);
  inherited;
end;


function TCastleManager.Find(sCASTLENAME: string): TUserCastle;
var
  i                                     : Integer;
  Castle                                : TUserCastle;
begin
  Result := nil;
  for i := 0 to m_CastleList.Count - 1 do
  begin
    Castle := TUserCastle(m_CastleList.Items[i]);
    if CompareText(Castle.m_sName, sCASTLENAME) = 0 then
    begin
      Result := Castle;
      break;
    end;
  end;
end;

//取得角色所在座标的城堡

function TCastleManager.InCastleWarArea(
  BaseObject: TBaseObject): TUserCastle;
var
  i                                     : Integer;
  Castle                                : TUserCastle;
begin
  Result := nil;
  for i := 0 to m_CastleList.Count - 1 do
  begin
    Castle := TUserCastle(m_CastleList.Items[i]);
    if Castle.InCastleWarArea(BaseObject.m_PEnvir, BaseObject.m_nCurrX,
      BaseObject.m_nCurrY) then
    begin
      Result := Castle;
      break;
    end;
  end;
end;

function TCastleManager.InCastleWarArea(Envir: TEnvirnoment; nX,
  nY: Integer): TUserCastle;
var
  i                                     : Integer;
  Castle                                : TUserCastle;
begin
  Result := nil;
  for i := 0 to m_CastleList.Count - 1 do
  begin
    Castle := TUserCastle(m_CastleList.Items[i]);
    if Castle.InCastleWarArea(Envir, nX, nY) then
    begin
      Result := Castle;
      break;
    end;
  end;
end;

procedure TCastleManager.Initialize;
var
  i                                     : Integer;
  Castle                                : TUserCastle;
begin
  try
    Lock;
    if m_CastleList.Count <= 0 then
    begin
      Castle := TUserCastle.Create(0);
      m_CastleList.Add(Castle);
      Castle.Initialize;
      Castle.m_sConfigIndex:=0;
      Castle.m_EnvirList.Add('0151');
      Castle.m_EnvirList.Add('0152');
      Castle.m_EnvirList.Add('0153');
      Castle.m_EnvirList.Add('0154');
      Castle.m_EnvirList.Add('0155');
      Castle.m_EnvirList.Add('0156');
      for i := 0 to Castle.m_EnvirList.Count - 1 do
      begin
        Castle.m_EnvirList.Objects[i] :=
          g_MapManager.FindMap(Castle.m_EnvirList.Strings[i]);
      end;
      Save();
      exit;
    end;

    for i := 0 to m_CastleList.Count - 1 do
    begin
      Castle := TUserCastle(m_CastleList.Items[i]);
      Castle.Initialize;
    end;
  finally
    UnLock;
  end;
end;
//城堡皇宫所在地图

function TCastleManager.IsCastlePalaceEnvir(Envir: TEnvirnoment): TUserCastle;
var
  i                                     : Integer;
  Castle                                : TUserCastle;
begin
  Result := nil;
  for i := 0 to m_CastleList.Count - 1 do
  begin
    Castle := TUserCastle(m_CastleList.Items[i]);
    if Castle.m_MapPalace = Envir then
    begin
      Result := Castle;
      break;
    end;
  end;
end;
//城堡所在地图

function TCastleManager.IsCastleEnvir(Envir: TEnvirnoment): TUserCastle;
var
  i                                     : Integer;
  Castle                                : TUserCastle;
begin
  Result := nil;
  for i := 0 to m_CastleList.Count - 1 do
  begin
    Castle := TUserCastle(m_CastleList.Items[i]);
    if Castle.m_MapCastle = Envir then
    begin
      Result := Castle;
      break;
    end;
  end;
end;

function TCastleManager.IsCastleMember(
  BaseObject: TBaseObject): TUserCastle;
var
  i                                     : Integer;
  Castle                                : TUserCastle;
begin
  Result := nil;
  for i := 0 to m_CastleList.Count - 1 do
  begin
    Castle := TUserCastle(m_CastleList.Items[i]);
    if Castle.IsMember(BaseObject) then
    begin
      Result := Castle;
      break;
    end;
  end;
end;

procedure TCastleManager.Run;
var
  i                                     : Integer;
  UserCastle                            : TUserCastle;
begin
  Lock;
  try
    for i := 0 to m_CastleList.Count - 1 do
    begin
      UserCastle := TUserCastle(m_CastleList.Items[i]);
      UserCastle.Run;
    end;
  finally
    UnLock;
  end;
end;

procedure TCastleManager.GetCastleGoldInfo(List: TStringList);
var
  i                                     : Integer;
  Castle                                : TUserCastle;
begin
  for i := 0 to m_CastleList.Count - 1 do
  begin
    Castle := TUserCastle(m_CastleList.Items[i]);
    List.Add(format(g_sGameCommandSbkGoldShowMsg, [Castle.m_sName,
      Castle.m_nTotalGold, Castle.m_nTodayIncome]));
  end;
end;

procedure TCastleManager.Save;
var
  i                                     : Integer;
  Castle                                : TUserCastle;
begin
  SaveCastleList();
  for i := 0 to m_CastleList.Count - 1 do
  begin
    Castle := TUserCastle(m_CastleList.Items[i]);
    Castle.Save;
  end;
end;

procedure TCastleManager.LoadCastleList;
var
  Index                                 : Integer;
  Castle                                : TUserCastle;
  sCastleDir                            : string;
  i                                     : Integer;
begin
DataModule_mir200[0].LoadCastleList(self);
 


end;

procedure TCastleManager.SaveCastleList;
 
begin
  
end;

function TCastleManager.GetCastle(nIndex: Integer): TUserCastle;
begin
  Result := nil;
  if (nIndex >= 0) and (nIndex < m_CastleList.Count) then
    Result := TUserCastle(m_CastleList.Items[nIndex]);
end;

procedure TCastleManager.GetCastleNameList(List: TStringList);
var
  i                                     : Integer;
  Castle                                : TUserCastle;
begin
  for i := 0 to m_CastleList.Count - 1 do
  begin
    Castle := TUserCastle(m_CastleList.Items[i]);
    List.Add(Castle.m_sName);
  end;
end;

procedure TCastleManager.IncRateGold(Tariff,ReBate,nGold: Integer);
var
  i                                     : Integer;
  Castle                                : TUserCastle;
begin
  Lock;
  try
    for i := 0 to m_CastleList.Count - 1 do
    begin
      Castle := TUserCastle(m_CastleList.Items[i]);
      Castle.IncRateGold(Tariff,ReBate,nGold);
    end;
  finally
    UnLock;
  end;
end;




procedure TCastleManager.Lock;
begin
  EnterCriticalSection(CriticalSection);
end;

procedure TCastleManager.UnLock;
begin
  LeaveCriticalSection(CriticalSection);
end;

end.

⌨️ 快捷键说明

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