📄 humdb.pas
字号:
unit HumDB;
interface
uses
Windows, Classes, SysUtils, Forms, MudUtil, Grobal2;
resourcestring
sDBHeaderDesc = '传奇游戏数据库文件 2006/07/01';
sDBIdxHeaderDesc = '传奇游戏数据库索引文件 2006/07/01';
type
TDBHeader = packed record //Size 124
sDesc: string[$23]; //0x00 36
n24: Integer; //0x24
n28: Integer; //0x28
n2C: Integer; //0x2C
n30: Integer; //0x30
n34: Integer; //0x34
n38: Integer; //0x38
n3C: Integer; //0x3C
n40: Integer; //0x40
n44: Integer; //0x44
n48: Integer; //0x48
n4C: Integer; //0x4C
n50: Integer; //0x50
n54: Integer; //0x54
n58: Integer; //0x58
nLastIndex: Integer; //0x5C
dLastDate: TDateTime; //0x60
nHumCount: Integer; //0x68
n6C: Integer; //0x6C
n70: Integer; //0x70
dUpdateDate: TDateTime; //0x74
end;
pTDBHeader = ^TDBHeader;
TIdxHeader = packed record //Size 124
sDesc: string[39]; //0x00
n2C: Integer; //0x2C
n30: Integer; //0x30
n34: Integer; //0x34
n38: Integer; //0x38
n3C: Integer; //0x3C
n40: Integer; //0x40
n44: Integer; //0x44
n48: Integer; //0x48
n4C: Integer; //0x4C
n50: Integer; //0x50
n54: Integer; //0x54
n58: Integer; //0x58
n5C: Integer; //0x5C
n60: Integer; //0x60 95
n70: Integer; //0x70 99
nQuickCount: Integer; //0x74 100
nHumCount: Integer; //0x78
nDeleteCount: Integer; //0x7C
nLastIndex: Integer; //0x80
dUpdateDate: TDateTime; //0x84
end;
pTIdxHeader = ^TIdxHeader;
TNakedAbility = packed record //Size 20
DC: Word;
MC: Word;
SC: Word;
AC: Word;
MAC: Word;
HP: Word;
MP: Word;
Hit: Word;
Speed: Word;
X2: Word;
end;
pTNakedAbility = ^TNakedAbility;
TAbility = packed record //OK //Size 44
Level: Word; //0x198
AC: Word; //0x19A
MAC: Word; //0x19C
DC: Word; //0x19E
MC: Word; //0x1A0
SC: Word; //0x1A2
HP: Word; //0x1A4
MP: Word; //0x1A6
MaxHP: Word; //0x1A8
MaxMP: Word; //0x1AA
dw1AC: LongWord; //0x1AC
Exp: LongWord; //0x1B0
MaxExp: LongWord; //0x1B4
Weight: Word; //0x1B8
MaxWeight: Word; //0x1BA
WearWeight: Word; //0x1BC
MaxWearWeight: Word; //0x1BD
HandWeight: Word; //0x1BE
MaxHandWeight: Word; //0x1BF
end;
THumItems = record
MakeIndex: Integer;
wIndex: Word; //物品id
Dura: Word; //当前持久值
DuraMax: Word; //最大持久值
btValue: array[0..13] of Byte;
end;
pTHumItems = ^THumItems;
TMagic = record
wMagIdx: Word;
btLevel: Byte;
btKey: Byte;
nTranPoint: Integer; //当前持久值
end;
pTMagic = ^TMagic;
TRecordHeader = packed record //Size 12
boDeleted: Boolean;
nSelectID: Byte;
w1: Word;
dCreateDate: TDateTime; //创建时间
sName: string[15]; //0x15 //角色名称 28
end;
pTRecordHeader = ^TRecordHeader;
TQuestUnit = array[0..34] of Byte;
TQuestFlag = array[0..82] of Byte;
TStatusTime = array[0..11] of Word;
THumData = packed record
sChrName: string[14]; //0x14 //角色名称
sCurMap: string[16]; //0x04 //返城地图 57
wCurX: Word; //0x24 人物所在座标X(2字节) 59
wCurY: Word; //0x28 人物所在座标Y(2字节) 61
btDir: Byte; //0x2C 人物所在方向(1字节) 62
btHair: Byte; //0x2E 人物的头发(1字节) 63
btSex: Byte; //0x2D 人物的性别(1字节) 64
btJob: Byte; //0x2F 人物的职业(1字节) 65
nGold: Integer; //0x30 人物金币数(4字节) 69
Abil: TAbility; //0x34 -> 0x5B //44 人物属性 113 50
BonusAbil: TNakedAbility; //20 133
sHomeMap: string[17]; //17 0x78 //回城地图 150
wHomeX: Word; //0x8C //回城座标X 152
wHomeY: Word; //0x90 //回城座标Y 154
N1: array[0..14] of Byte; //未知
sMasterName: string[14];
boMaster: Boolean; //是否是师傅
btCreditPoint: Byte; //声望
N2: Word; //未知
sStoragePwd: string[7]; //仓库密码
btReLevel: Byte; //转生等级
N3: array[0..22] of Byte; //未知
nBonusPoint: Integer; //属性点
nGameGold: Integer; //元宝
nGamePoint: Integer; //泡点
nPayMentPoint: Integer; //冲值点
n4: array[0..3] of Byte;
nPKPoint: Word; //PK值
btAllowGroup: Byte; //允许组队
btF9: Byte;
btAttatckMode: Byte;
btIncHealth: Byte;
btIncSpell: Byte;
btIncHealing: Byte;
btFightZoneDieCount: Byte;
n5: array[0..1] of Byte;
sAccount: string[10]; //账号
btEE: Byte;
boLockLogon: Boolean;
wContribution: Word; //贡献度
btEF: Byte;
nHungerStatus: Integer;
boAllowGuildReCall: Boolean;
wGroupRcallTime: Word;
dBodyLuck: Double;
boAllowGroupReCall: Boolean; //17
QuestUnitOpen: TQuestUnit; //35
QuestUnit: TQuestUnit; //35
sDearName: string[14]; //老婆名称
n8: Word;
btDivorce: Byte; //是否结婚
n9: Byte;
btMarryCount: Byte; //结婚次数
wStatusTimeArr: TStatusTime; //24
QuestFlag: TQuestFlag; //61
HumItems: array[0..8] of THumItems; //9格装备 衣服 武器 蜡烛 头盔 项链 手镯 手镯 戒指 戒指
BagItems: array[0..45] of THumItems; //包裹装备
Magic: array[0..19] of TMagic; //魔法
StorageItems: array[0..45] of THumItems; //仓库物品
HumAddItems: array[0..3] of THumItems; //新增4格 护身符 腰带 鞋子 宝石
end;
pTHumData = ^THumData;
{TQuestUnit = array [0..29] of Byte;
TQuestFlag = array [0..9] of Byte;
TStatusTime = array [0..11] of Word;
THumData = packed record
sChrName :String[14]; //0x14 //角色名称
sCurMap :String[16]; //0x04 //返城地图 57
wCurX :Word; //0x24 人物所在座标X(2字节) 59
wCurY :Word; //0x28 人物所在座标Y(2字节) 61
btDir :Byte; //0x2C 人物所在方向(1字节) 62
btHair :Byte; //0x2E 人物的头发(1字节) 63
btSex :Byte; //0x2D 人物的性别(1字节) 64
btJob :Byte; //0x2F 人物的职业(1字节) 65
nGold :Integer; //0x30 人物金币数(4字节) 69
Abil :TAbility; //0x34 -> 0x5B //44 人物属性 113
BonusAbil :TNakedAbility; //20 133
sHomeMap :String[17]; //17 0x78 //回城地图 150
wHomeX :Word; //0x8C //回城座标X 152
wHomeY :Word; //0x90 //回城座标Y 154
n1 :array[0..14] of Byte; //未知
sMasterName :String[14];
boMaster :Boolean; //是否是师傅
btCreditPoint :Byte; //声望
n2 :Word; //未知
sStoragePwd :String[7]; //仓库密码
btReLevel :Byte; //转生等级
n3 :array[0..22] of Byte; //未知
nBonusPoint :Integer; //属性点
nGameGold :Integer; //元宝
nGamePoint :Integer; //泡点
nPayMentPoint :Integer; //冲值点
n4 :array[0..3] of Byte;
nPKPoint :Word; //PK值
btAllowGroup :Byte; //允许组队
btF9 :Byte;
btAttatckMode :Byte;
btIncHealth :Byte;
btIncSpell :Byte;
btIncHealing :Byte;
btFightZoneDieCount:Byte;
n5 :array[0..1] of Byte;
sAccount :String[10];//账号
//n5 :array[0..8] of Byte; //0..8
btEE :Byte;
boLockLogon :Boolean;
//n6 :Word;
wContribution :Word; //贡献度
btEF :Byte;
nHungerStatus :Integer;
boAllowGuildReCall :Boolean;
wGroupRcallTime :Word;//Double
dBodyLuck :Double;
boAllowGroupReCall :Boolean; //17
QuestUnitOpen :TQuestUnit; //72
QuestUnit :TQuestUnit;
QuestFlag :TQuestFlag;
//n7 :array[0..86] of Byte;//未知
sDearName :String[14]; //老婆名称
n8 :Word;
btDivorce :Byte; //是否结婚
n9 :Byte;
btMarryCount :Byte; //结婚次数
wStatusTimeArr :TStatusTime; //? //24 12 * 2
n10 :array [0..82] of Byte;//未知
HumItems :array [0..8] of THumItems; //9格装备 衣服 武器 蜡烛 头盔 项链 手镯 手镯 戒指 戒指
BagItems :array [0..45] of THumItems; //包裹装备
Magic :array [0..19] of TMagic; //魔法
StorageItems :array [0..45] of THumItems; //仓库物品
HumAddItems :array [0..3] of THumItems; //新增4格 护身符 腰带 鞋子 宝石
end; }
THumDataInfo = packed record //Size 3164
Header: TRecordHeader;
Data: THumData;
end;
pTHumDataInfo = ^THumDataInfo;
THumInfo = packed record //Size 72
Header: TRecordHeader;
sChrName: string[14]; //0x14 //角色名称 44
sAccount: string[10]; //账号
boDeleted: Boolean; //是否删除
bt1: Byte; //未知
dModDate: TDateTime;
btCount: Byte; //操作计次
boSelected: Boolean; //是否选择
n6: array[0..5] of Byte;
end;
pTHumInfo = ^THumInfo;
TIdxRecord = record
sChrName: string[15];
nIndex: Integer;
end;
pTIdxRecord = ^TIdxRecord;
TFileHumDB = class
n4: Integer; //0x04
m_nFileHandle: Integer; //0x08
n0C: Integer; //0x0C
m_OnChange: TNotifyEvent;
m_boChanged: Boolean; //0x18
m_Header: TDBHeader; //0x1C
m_QuickList: TQuickList; //0x98
m_QuickIDList: TQuickIDList; //0x9C
m_DeletedList: TList; //0xA0 已被删除的记录号
m_sDBFileName: string; //0xA4
private
procedure LoadQuickList;
procedure Lock;
procedure UnLock;
function UpdateRecord(nIndex: Integer; HumRecord: THumInfo; boNew: Boolean): Boolean;
function DeleteRecord(nIndex: Integer): Boolean;
function GetRecord(n08: Integer; var HumDBRecord: THumInfo): Boolean;
public
constructor Create(sFileName: string);
destructor Destroy; override;
function Open(): Boolean;
function OpenEx(): Boolean;
procedure Close();
function Index(sName: string): Integer;
function Get(n08: Integer; var HumDBRecord: THumInfo): Integer;
function GetBy(n08: Integer; var HumDBRecord: THumInfo): Boolean;
function FindByName(sChrName: string; ChrList: TStringList): Integer;
function FindByAccount(sAccount: string; var ChrList: TStringList): Integer;
function ChrCountOfAccount(sAccount: string): Integer;
function Add(HumRecord: THumInfo): Boolean;
function Delete(sName: string): Boolean;
function Update(nIndex: Integer; var HumDBRecord: THumInfo): Boolean;
function UpdateBy(nIndex: Integer; var HumDBRecord: THumInfo): Boolean;
end;
TFileDB = class
n4: Integer; //0x4
m_nFileHandle: Integer; //0x08
nC: Integer;
m_OnChange: TNotifyEvent; //0x10
m_boChanged: Boolean; //0x18
m_nLastIndex: Integer; //0x1C
m_dUpdateTime: TDateTime; //0x20
m_Header: TDBHeader; //0x28
m_QuickList: TQuickList; //0xA4
m_DeletedList: TList; //0xA8 已被删除的记录号
m_sDBFileName: string; //0xAC
m_sIdxFileName: string; //0xB0
private
procedure LoadQuickList;
function LoadDBIndex(): Boolean;
procedure SaveIndex();
function GetRecord(nIndex: Integer; var HumanRCD: THumDataInfo): Boolean;
function UpdateRecord(nIndex: Integer; var HumanRCD: THumDataInfo; boNew: Boolean): Boolean;
function DeleteRecord(nIndex: Integer): Boolean;
public
constructor Create(sFileName: string);
destructor Destroy; override;
procedure Lock;
procedure UnLock;
function Open(): Boolean;
function OpenEx(): Boolean;
procedure Close();
function Index(sName: string): Integer;
function Get(nIndex: Integer; var HumanRCD: THumDataInfo): Integer;
function Update(nIndex: Integer; var HumanRCD: THumDataInfo): Boolean;
function Add(var HumanRCD: THumDataInfo): Boolean;
function Find(sChrName: string; List: TStrings): Integer;
procedure Rebuild();
function Count(): Integer;
function Delete(sChrName: string): Boolean; overload;
function Delete(nIndex: Integer): Boolean; overload;
end;
var
HumChrDB: TFileHumDB;
HumDataDB: TFileDB;
implementation
uses DBShare, HUtil32;
{ TFileHumDB }
constructor TFileHumDB.Create(sFileName: string); //0x0048B73C
begin
m_sDBFileName := sFileName;
m_QuickList := TQuickList.Create;
m_QuickIDList := TQuickIDList.Create;
m_DeletedList := TList.Create;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -