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

📄 humdb.pas

📁 传奇源代码的delphi版本
💻 PAS
📖 第 1 页 / 共 4 页
字号:
    Result := False;
end;

function TFileHumDB.FindByAccount(sAccount: string; var ChrList: TStringList): integer;
  //0x0048C4DC
var
  ChrNameList: TList;
  QuickID: pTQuickID;
  i: integer;
begin
  ChrNameList := nil;
  m_QuickIDList.GetChrList(sAccount, ChrNameList);
  if ChrNameList <> nil then begin
    for i := 0 to ChrNameList.Count - 1 do begin
      QuickID := ChrNameList.Items[i];
      ChrList.AddObject(QuickID.sAccount, TObject(QuickID));
    end;
  end;
  Result := ChrList.Count;
end;

function TFileHumDB.ChrCountOfAccount(sAccount: string): integer;//0x0048C5B0
var
  ChrList: TList;
  I: integer;
  HumDBRecord: THumInfo;
begin
  Result  := 0;
  ChrList := nil;
  m_QuickIDList.GetChrList(sAccount, ChrList);
  if ChrList <> nil then begin
    for I := 0 to ChrList.Count - 1 do begin
      if GetBy(pTQuickID(ChrList.Items[I]).nIndex, HumDBRecord) and
        (not HumDBRecord.boDeleted) then Inc(Result);
    end;
  end;
end;

function TFileHumDB.Add(HumRecord: THumInfo): boolean;//0x0048C1F4
var
  Header: TDBHeader;
  nIndex: integer;
begin
  if m_QuickList.GetIndex(HumRecord.Header.sChrName) >= 0 then Result := False
  else begin
    Header := m_Header;
    if m_DeletedList.Count > 0 then begin
      nIndex := integer(m_DeletedList.Items[0]);
      m_DeletedList.Delete(0);
    end else begin
      nIndex := m_Header.nHumCount;
      Inc(m_Header.nHumCount);
    end;
    if UpdateRecord(nIndex, HumRecord, True) then begin
      m_QuickList.AddRecord(HumRecord.Header.sChrName, nIndex);
      m_QuickIDList.AddRecord(HumRecord.sAccount, HumRecord.sChrName,
        nIndex, HumRecord.Header.nSelectID);
      Result := True;
    end else begin
      m_Header := Header;
      Result   := False;
    end;
  end;
end;

function TFileHumDB.UpdateRecord(nIndex: integer; HumRecord: THumInfo;
  boNew: boolean): boolean;//0x0048BF5C
var
  HumRcd: THumInfo;
  nPosion, n10: integer;
begin
  nPosion := nIndex * SizeOf(THumInfo) + SizeOf(TDBHeader);
  if FileSeek(m_nFileHandle, nPosion, 0) = nPosion then begin
    n10 := FileSeek(m_nFileHandle, 0, 1);
    if boNew and (FileRead(m_nFileHandle, HumRcd, SizeOf(THumInfo)) =
      SizeOf(THumInfo)) and (not HumRcd.Header.boDeleted) and
      (HumRcd.Header.sChrName <> '') then Result := True
    else begin
      HumRecord.Header.boDeleted := False;
      HumRecord.Header.dCreateDate := Now();
      m_Header.dUpdateDate := Now();
      FileSeek(m_nFileHandle, 0, 0);
      FileWrite(m_nFileHandle, m_Header, SizeOf(TDBHeader));
      FileSeek(m_nFileHandle, n10, 0);
      FileWrite(m_nFileHandle, HumRecord, SizeOf(THumInfo));
      FileSeek(m_nFileHandle, -SizeOf(THumInfo), 1);
      m_nCurIndex := nIndex;
      m_boChanged := True;
      Result      := True;
    end;
  end else
    Result := False;
end;

function TFileHumDB.Delete(sName: string): boolean;//0x0048BDE0
var
  n10: integer;
  HumRecord: THumInfo;
  ChrNameList: TList;
  n14: integer;
begin
  Result := False;
  n10    := m_QuickList.GetIndex(sName);
  if n10 < 0 then exit;
  Get(n10, HumRecord);
  if DeleteRecord(integer(m_QuickList.Objects[n10])) then begin
    m_QuickList.Delete(n10);
    Result := True;
  end;
  n14 := m_QuickIDList.GetChrList(HumRecord.sAccount, ChrNameList);
  if n14 >= 0 then begin
    m_QuickIDList.DelRecord(n14, HumRecord.sChrName);
  end;

end;

function TFileHumDB.DeleteRecord(nIndex: integer): boolean;//0x0048BD58
var
  HumRcdHeader: TRecordHeader;
begin
  Result := False;
  if FileSeek(m_nFileHandle, nIndex * SizeOf(THumInfo) + SizeOf(TDBHeader), 0) = -1 then
    exit;
  HumRcdHeader.boDeleted   := True;
  HumRcdHeader.dCreateDate := Now();
  FileWrite(m_nFileHandle, HumRcdHeader, SizeOf(TRecordHeader));
  m_DeletedList.Add(Pointer(nIndex));
  m_boChanged := True;
  Result      := True;
end;

function TFileHumDB.Update(nIndex: integer; var HumDBRecord: THumInfo): boolean;
  //0x0048C14C
begin
  Result := False;
  if nIndex < 0 then exit;
  if m_QuickList.Count <= nIndex then exit;
  if UpdateRecord(integer(m_QuickList.Objects[nIndex]), HumDBRecord, False) then
    Result := True;
end;



function TFileHumDB.UpdateBy(nIndex: integer; var HumDBRecord: THumInfo): boolean;
  //00048C1B4
begin
  Result := False;
  if UpdateRecord(nIndex, HumDBRecord, False) then Result := True;
end;



{ TFileDB }

constructor TFileDB.Create;
begin
  boDataDBReady := False;
  m_QuickList  := TQuickList.Create;

  n4ADAE4      := 0;
  n4ADAF0      := 0;
  nRecordCount := -1;

  if g_boSQLIsReady then LoadQuickList;
end;

destructor TFileDB.Destroy;
begin
  m_QuickList.Free;

  inherited;
end;

procedure TFileDB.LoadQuickList;
var
  nIndex    :Integer;
  boDeleted :Boolean;
  sChrName  :String;
resourcestring
  sSQL = 'SELECT * FROM TBL_CHARACTER';
begin
  nRecordCount   := -1;
  m_QuickList.Clear;
  n4ADAE4 := 0;
  n4ADAE8 := 0;
  n4ADAF0 := 0;

  Lock;
  try
    try
      dbQry.SQL.Clear;
      dbQry.SQL.Add(sSQL);
      try
        dbQry.Open;
      except
        OutMainMessage('[Exception] TFileDB.LoadQuickList');
      end;

      nRecordCount := dbQry.RecordCount;
      n4ADAF0 := nRecordCount;
      for nIndex := 0 to nRecordCount - 1 do begin
        Inc(n4ADAE4);

        boDeleted   := dbQry.FieldByName('FLD_DELETED').AsBoolean;
        sChrName    := Trim(dbQry.FieldByName('FLD_CHARNAME').AsString);

        if (not boDeleted) and (sChrName <> '') then begin
          m_QuickList.AddObject(sChrName, TObject(nIndex));
          Inc(n4ADAE8);
        end else begin
          Inc(n4ADAEC);
        end;


        dbQry.Next;
      end;
    finally
      dbQry.Close;
    end;
  finally
    UnLock;
  end;
  m_QuickList.SortString(0, m_QuickList.Count - 1);

  boDataDBReady := True;
end;

procedure TFileDB.Lock;
begin
  EnterCriticalSection(HumDB_CS);
end;

procedure TFileDB.UnLock;
begin
  LeaveCriticalSection(HumDB_CS);
end;

function TFileDB.Open: boolean;
begin
  Result := False;
  Lock();

  m_boChanged := False;

  Result := True
end;

procedure TFileDB.Close;
begin
  if m_boChanged and Assigned(m_OnChange) then begin
    m_OnChange(Self);
  end;
  UnLock();
end;

function TFileDB.Index(sName: string): integer;
begin
  Result := m_QuickList.GetIndex(sName);
end;

function TFileDB.Get(nIndex: integer; var HumanRCD: THumDataInfo): integer;
begin
  Result := -1;
  if nIndex < 0 then exit;
  if m_QuickList.Count <= nIndex then exit;
  if GetRecord(nIndex, HumanRCD) then Result := nIndex;
end;

function TFileDB.GetQryChar(nIndex: integer; var QueryChrRcd: TQueryChr): integer;
var
  sChrName  :String;
resourcestring
  sSQL = 'SELECT * FROM TBL_CHARACTER WHERE FLD_CHARNAME=''%s''';
begin
  Result := -1;
  if nIndex < 0 then exit;
  if m_QuickList.Count <= nIndex then exit;

  sChrName := m_QuickList[nIndex];

  try
    dbQry.SQL.Clear;
    dbQry.SQL.Add(format(sSQL, [sChrName]));
    try
      dbQry.Open;
    except
      OutMainMessage('[Exception] TFileDB.GetQryChar (1)');
      Exit;
    end;

    if dbQry.RecordCount > 0 then begin
      QueryChrRcd.sName     := Trim(dbQry.FieldByName('FLD_CHARNAME').AsString);
      QueryChrRcd.btClass   := dbQry.FieldByName('FLD_JOB').AsInteger;
      QueryChrRcd.btHair    := dbQry.FieldByName('FLD_HAIR').AsInteger;
      QueryChrRcd.btGender  := dbQry.FieldByName('FLD_SEX').AsInteger;
      QueryChrRcd.btLevel   := dbQry.FieldByName('FLD_LEVEL').AsInteger;
    end;
  finally
    dbQry.Close;
  end;

  Result := nIndex;
end;

function TFileDB.GetUserCurMap(nIndex: integer): String;
var
  sChrName  :String;
resourcestring
  sSQL = 'SELECT * FROM TBL_CHARACTER WHERE FLD_CHARNAME=''%s''';
begin
  Result := '';
  if nIndex < 0 then exit;
  if m_QuickList.Count <= nIndex then exit;

  sChrName := m_QuickList[nIndex];

  try
    dbQry.SQL.Clear;
    dbQry.SQL.Add(format(sSQL, [sChrName]));
    try
      dbQry.Open;
    except
      OutMainMessage('[Exception] TFileDB.GetUserCurMap');
      Exit;
    end;

    if dbQry.RecordCount > 0 then begin
      Result     := Trim(dbQry.FieldByName('FLD_MAPNAME').AsString);
    end;
  finally
    dbQry.Close;
  end;
end;

function TFileDB.Update(nIndex: integer; var HumanRCD: THumDataInfo): boolean;
begin
  Result := False;
  if (nIndex >= 0) and (m_QuickList.Count > nIndex) then
    if UpdateRecord(nIndex, HumanRCD, False) then
      Result := True;
end;

function TFileDB.Add(var HumanRCD: THumDataInfo): boolean;
var
  sChrName: string;
  nIndex: integer;
begin
  sChrName := HumanRCD.Header.sChrName;
  if m_QuickList.GetIndex(sChrName) >= 0 then begin
    Result := False;
  end else begin
    nIndex := nRecordCount;
    Inc(nRecordCount);

    if UpdateRecord(nIndex, HumanRCD, True) then begin
      m_QuickList.AddRecord(sChrName, nIndex);
      Result := True;
    end else begin
      Result   := False;
    end;
  end;
end;

function TFileDB.GetRecord(nIndex: integer; var HumanRCD: THumDataInfo): boolean;
var
  sChrName  :String;
  sTmp      :String;
  str       :String;
  i         :Integer;
  nCount    :Integer;
  nPosition :Integer;
  Blob      :TBlob;
resourcestring
  sSQL = 'SELECT * FROM TBL_CHARACTER WHERE FLD_CHARNAME=''%s''';
  sSQL2 = 'SELECT * FROM TBL_ADDABILITY WHERE FLD_CHARNAME=''%s''';
  sSQL3 = 'SELECT * FROM TBL_QUEST WHERE FLD_CHARNAME=''%s''';

⌨️ 快捷键说明

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