📄 humdb.pas
字号:
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 + -