?? localdb.pas
字號(hào):
unit LocalDB;
interface
uses
Windows, Messages, SysUtils, StrUtils, Variants, Classes, Graphics, Controls, Forms, ActiveX,
Dialogs, M2Share, {$IF DBTYPE = BDE}DBTables{$ELSE}ADODB{$IFEND}, DB, HUtil32, Grobal2, SDK, ObjNpc, UsrEngn, PlugIn;
type
TDefineInfo = record
sName: string;
sText: string;
end;
pTDefineInfo = ^TDefineInfo;
TQDDinfo = record
n00: Integer;
s04: string;
sList: TStringList;
end;
pTQDDinfo = ^TQDDinfo;
TGoodFileHeader = record
nItemCount: Integer;
Resv: array[0..251] of Integer;
end;
TFrmDB = class {(TForm)}
private
procedure DeCodeStringList(StringList: TStringList);
{ Private declarations }
public
{$IF DBTYPE = BDE}
Query: TQuery;
{$ELSE}
Query: TADOQuery;
{$IFEND}
constructor Create();
destructor Destroy; override;
function LoadMonitems(MonName: string; var ItemList: TList): Integer;
function LoadItemsDB(): Integer;
function LoadMinMap(): Integer;
function LoadMapInfo(): Integer;
function LoadMonsterDB(): Integer;
function LoadMagicDB(): Integer;
function LoadMonGen(): Integer;
function LoadUnbindList(): Integer;
function LoadMapQuest(): Integer;
function LoadQuestDiary(): Integer;
function LoadAdminList(): Boolean;
function LoadMerchant(): Integer;
function LoadGuardList(): Integer;
function LoadNpcs(): Integer;
procedure QMangeNPC;
procedure QFunctionNPC;
procedure RobotNPC();
function LoadMakeItem(): Integer;
function LoadStartPoint(): Integer;
function LoadNpcScript(NPC: TNormNpc; sPatch, sScritpName: string): Integer;
function LoadScriptFile(NPC: TNormNpc; sPatch, sScritpName: string; boFlag: Boolean): Integer;
function LoadGoodRecord(NPC: TMerchant; sFile: string): Integer;
function LoadGoodPriceRecord(NPC: TMerchant; sFile: string): Integer;
function SaveGoodRecord(NPC: TMerchant; sFile: string): Integer;
function SaveGoodPriceRecord(NPC: TMerchant; sFile: string): Integer;
function LoadUpgradeWeaponRecord(sNPCName: string; DataList: TList): Integer;
function SaveUpgradeWeaponRecord(sNPCName: string; DataList: TList): Integer;
procedure ReLoadMerchants();
procedure ReLoadNpc();
function LoadMapEvent(): Integer;
{ Public declarations }
end;
var
FrmDB: TFrmDB;
implementation
uses ObjBase, Envir;
//{$R *.dfm}
{ TFrmDB }
function TFrmDB.LoadAdminList(): Boolean;
var
sFileName: string;
sLineText: string;
sIPaddr: string;
sCharName: string;
sData: string;
LoadList: TStringList;
AdminInfo: pTAdminInfo;
I: Integer;
nLv: Integer;
begin
Result := False; ;
sFileName := g_Config.sEnvirDir + 'AdminList.txt';
if not FileExists(sFileName) then Exit;
UserEngine.m_AdminList.Lock;
try
UserEngine.m_AdminList.Clear;
LoadList := TStringList.Create;
LoadList.LoadFromFile(sFileName);
for I := 0 to LoadList.Count - 1 do begin
sLineText := LoadList.Strings[I];
nLv := -1;
if (sLineText <> '') and (sLineText[1] <> ';') then begin
if sLineText[1] = '*' then nLv := 10
else if sLineText[1] = '1' then nLv := 9
else if sLineText[1] = '2' then nLv := 8
else if sLineText[1] = '3' then nLv := 7
else if sLineText[1] = '4' then nLv := 6
else if sLineText[1] = '5' then nLv := 5
else if sLineText[1] = '6' then nLv := 4
else if sLineText[1] = '7' then nLv := 3
else if sLineText[1] = '8' then nLv := 2
else if sLineText[1] = '9' then nLv := 1;
if nLv > 0 then begin
sLineText := GetValidStrCap(sLineText, sData, ['/', '\', ' ', #9]);
sLineText := GetValidStrCap(sLineText, sCharName, ['/', '\', ' ', #9]);
sLineText := GetValidStrCap(sLineText, sIPaddr, ['/', '\', ' ', #9]);
{$IF VEROWNER = WL}
if (sCharName <= '') or (sIPaddr = '') then Continue;
{$IFEND}
New(AdminInfo);
AdminInfo.nLv := nLv;
AdminInfo.sChrName := sCharName;
AdminInfo.sIPaddr := sIPaddr;
UserEngine.m_AdminList.Add(AdminInfo);
end;
end;
end;
LoadList.Free;
finally
UserEngine.m_AdminList.UnLock;
end;
Result := True;
end;
//00488A68
function TFrmDB.LoadGuardList(): Integer;
var
sFileName, s14, s1C, s20, s24, s28, s2C: string;
tGuardList: TStringList;
I: Integer;
tGuard: TBaseObject;
begin
Result := -1;
sFileName := g_Config.sEnvirDir + 'GuardList.txt';
if FileExists(sFileName) then begin
tGuardList := TStringList.Create;
tGuardList.LoadFromFile(sFileName);
for I := 0 to tGuardList.Count - 1 do begin
s14 := tGuardList.Strings[I];
if (s14 <> '') and (s14[1] <> ';') then begin
s14 := GetValidStrCap(s14, s1C, [' ']);
if (s1C <> '') and (s1C[1] = '"') then
ArrestStringEx(s1C, '"', '"', s1C);
s14 := GetValidStr3(s14, s20, [' ']);
s14 := GetValidStr3(s14, s24, [' ', ',']);
s14 := GetValidStr3(s14, s28, [' ', ',', ':']);
s14 := GetValidStr3(s14, s2C, [' ', ':']);
if (s1C <> '') and (s20 <> '') and (s2C <> '') then begin
tGuard := UserEngine.RegenMonsterByName(s20, Str_ToInt(s24, 0), Str_ToInt(s28, 0), s1C);
//sMapName,nX,nY,sName
if tGuard <> nil then tGuard.m_btDirection := Str_ToInt(s2C, 0);
end;
end;
end;
tGuardList.Free;
Result := 1;
end;
end;
function TFrmDB.LoadItemsDB: Integer;
var
I, Idx: Integer;
StdItem: pTStdItem;
resourcestring
sSQLString = 'select * from StdItems';
begin
EnterCriticalSection(ProcessHumanCriticalSection);
try
try
for I := 0 to UserEngine.StdItemList.Count - 1 do begin
Dispose(pTStdItem(UserEngine.StdItemList.Items[I]));
end;
UserEngine.StdItemList.Clear;
Result := -1;
Query.SQL.Clear;
Query.SQL.Add(sSQLString);
try
Query.Open;
finally
Result := -2;
end;
for I := 0 to Query.RecordCount - 1 do begin
New(StdItem);
Idx := Query.FieldByName('Idx').AsInteger;
StdItem.Name := Query.FieldByName('Name').AsString;
StdItem.StdMode := Query.FieldByName('StdMode').AsInteger;
StdItem.Shape := Query.FieldByName('Shape').AsInteger;
StdItem.Weight := Query.FieldByName('Weight').AsInteger;
StdItem.AniCount := Query.FieldByName('AniCount').AsInteger;
StdItem.Source := Query.FieldByName('Source').AsInteger;
StdItem.Reserved := Query.FieldByName('Reserved').AsInteger;
StdItem.Looks := Query.FieldByName('Looks').AsInteger;
StdItem.DuraMax := Word(Query.FieldByName('DuraMax').AsInteger);
StdItem.AC := MakeLong(Round(Query.FieldByName('Ac').AsInteger * (g_Config.nItemsACPowerRate / 10)), Round(Query.FieldByName('Ac2').AsInteger * (g_Config.nItemsACPowerRate / 10)));
StdItem.MAC := MakeLong(Round(Query.FieldByName('Mac').AsInteger * (g_Config.nItemsACPowerRate / 10)), Round(Query.FieldByName('MAc2').AsInteger * (g_Config.nItemsACPowerRate / 10)));
StdItem.DC := MakeLong(Round(Query.FieldByName('Dc').AsInteger * (g_Config.nItemsPowerRate / 10)), Round(Query.FieldByName('Dc2').AsInteger * (g_Config.nItemsPowerRate / 10)));
StdItem.MC := MakeLong(Round(Query.FieldByName('Mc').AsInteger * (g_Config.nItemsPowerRate / 10)), Round(Query.FieldByName('Mc2').AsInteger * (g_Config.nItemsPowerRate / 10)));
StdItem.SC := MakeLong(Round(Query.FieldByName('Sc').AsInteger * (g_Config.nItemsPowerRate / 10)), Round(Query.FieldByName('Sc2').AsInteger * (g_Config.nItemsPowerRate / 10)));
StdItem.Need := Query.FieldByName('Need').AsInteger;
StdItem.NeedLevel := Query.FieldByName('NeedLevel').AsInteger;
StdItem.Price := Query.FieldByName('Price').AsInteger;
StdItem.NeedIdentify := GetGameLogItemNameList(StdItem.Name);
if UserEngine.StdItemList.Count = Idx then begin
UserEngine.StdItemList.Add(StdItem);
Result := 1;
end else begin
Memo.Lines.Add(Format('加載物品(Idx:%d Name:%s)數(shù)據(jù)失敗!!!', [Idx, StdItem.Name]));
Result := -100;
Exit;
end;
Query.Next;
end;
g_boGameLogGold := GetGameLogItemNameList(sSTRING_GOLDNAME) = 1;
g_boGameLogHumanDie := GetGameLogItemNameList(g_sHumanDieEvent) = 1;
g_boGameLogGameGold := GetGameLogItemNameList(g_Config.sGameGoldName) = 1;
g_boGameLogGamePoint := GetGameLogItemNameList(g_Config.sGamePointName) = 1;
finally
Query.Close;
end;
finally
LeaveCriticalSection(ProcessHumanCriticalSection);
end;
end;
function TFrmDB.LoadMagicDB(): Integer;
var
I: Integer;
Magic, OldMagic: pTMagic;
OldMagicList: TList;
resourcestring
sSQLString = 'select * from Magic';
begin
Result := -1;
EnterCriticalSection(ProcessHumanCriticalSection);
try
UserEngine.SwitchMagicList();
for I := 0 to UserEngine.m_MagicList.Count - 1 do begin
Dispose(pTMagic(UserEngine.m_MagicList.Items[I]));
end;
UserEngine.m_MagicList.Clear;
Query.SQL.Clear;
Query.SQL.Add(sSQLString);
try
Query.Open;
finally
Result := -2;
end;
for I := 0 to Query.RecordCount - 1 do begin
New(Magic);
Magic.wMagicId := Query.FieldByName('MagId').AsInteger;
Magic.sMagicName := Query.FieldByName('MagName').AsString;
Magic.btEffectType := Query.FieldByName('EffectType').AsInteger;
Magic.btEffect := Query.FieldByName('Effect').AsInteger;
Magic.wSpell := Query.FieldByName('Spell').AsInteger;
Magic.wPower := Query.FieldByName('Power').AsInteger;
Magic.wMaxPower := Query.FieldByName('MaxPower').AsInteger;
Magic.btJob := Query.FieldByName('Job').AsInteger;
Magic.TrainLevel[0] := Query.FieldByName('NeedL1').AsInteger;
Magic.TrainLevel[1] := Query.FieldByName('NeedL2').AsInteger;
Magic.TrainLevel[2] := Query.FieldByName('NeedL3').AsInteger;
Magic.TrainLevel[3] := Query.FieldByName('NeedL3').AsInteger;
Magic.MaxTrain[0] := Query.FieldByName('L1Train').AsInteger;
Magic.MaxTrain[1] := Query.FieldByName('L2Train').AsInteger;
Magic.MaxTrain[2] := Query.FieldByName('L3Train').AsInteger;
Magic.MaxTrain[3] := Magic.MaxTrain[2];
Magic.btTrainLv := 3;
Magic.dwDelayTime := Query.FieldByName('Delay').AsInteger;
Magic.btDefSpell := Query.FieldByName('DefSpell').AsInteger;
Magic.btDefPower := Query.FieldByName('DefPower').AsInteger;
Magic.btDefMaxPower := Query.FieldByName('DefMaxPower').AsInteger;
Magic.sDescr := Query.FieldByName('Descr').AsString;
if Magic.wMagicId > 0 then begin
UserEngine.m_MagicList.Add(Magic);
end else begin
Dispose(Magic);
end;
Result := 1;
Query.Next;
end;
Query.Close;
if UserEngine.OldMagicList.Count > 0 then begin
OldMagicList := TList(UserEngine.OldMagicList.Items[UserEngine.OldMagicList.Count - 1]);
for I := 0 to OldMagicList.Count - 1 do begin
OldMagic := pTMagic(OldMagicList.Items[I]);
if OldMagic.wMagicId >= 100 then begin
New(Magic);
Magic.wMagicId := OldMagic.wMagicId;
Magic.sMagicName := OldMagic.sMagicName;
Magic.btEffectType := OldMagic.btEffectType;
Magic.btEffect := OldMagic.btEffect;
//Magic.bt11 := OldMagic.bt11;
Magic.wSpell := OldMagic.wSpell;
Magic.wPower := OldMagic.wPower;
Magic.TrainLevel := OldMagic.TrainLevel;
//Magic.w02 := OldMagic.w02;
Magic.MaxTrain := OldMagic.MaxTrain;
Magic.btTrainLv := OldMagic.btTrainLv;
Magic.btJob := OldMagic.btJob;
//Magic.wMagicIdx := OldMagic.wMagicIdx;
Magic.dwDelayTime := OldMagic.dwDelayTime;
Magic.btDefSpell := OldMagic.btDefSpell;
Magic.btDefPower := OldMagic.btDefPower;
Magic.wMaxPower := OldMagic.wMaxPower;
Magic.btDefMaxPower := OldMagic.btDefMaxPower;
Magic.sDescr := OldMagic.sDescr;
UserEngine.m_MagicList.Add(Magic);
end;
end;
UserEngine.m_boStartLoadMagic := False;
{ for i := 0 to OldMagicList.Count - 1 do begin
DisPose(pTMagic(OldMagicList.Items[i]));
end;
OldMagicList.Free;
UserEngine.OldMagicList.Clear; }
end;
UserEngine.m_boStartLoadMagic := False;
finally
LeaveCriticalSection(ProcessHumanCriticalSection);
end;
end;
function TFrmDB.LoadMakeItem(): Integer;
var
I, n14: Integer;
s18, s20, s24: string;
LoadList: TStringList;
sFileName: string;
List28: TStringList;
begin
Result := -1;
sFileName := g_Config.sEnvirDir + 'MakeItem.txt';
if FileExists(sFileName) then begin
LoadList := TStringList.Create;
LoadList.LoadFromFile(sFileName);
List28 := nil;
s24 := '';
for I := 0 to LoadList.Count - 1 do begin
s18 := Trim(LoadList.Strings[I]);
if (s18 <> '') and (s18[1] <> ';') then begin
if s18[1] = '[' then begin
if List28 <> nil then
g_MakeItemList.AddObject(s24, List28);
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -