📄 localdb.~pas
字号:
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,_Function;
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 QMangeNPC;
// procedure QFunctionNPC;
procedure QSHOPNPC;
procedure RobotNPC();
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 LoadbindList():Integer;
procedure QMangeNPC;
procedure QFunctionNPC;
function LoadMapQuest():Integer;
function LoadQuestDiary():Integer;
function LoadAdminList():Boolean;
function LoadMerchant():Integer;
function LoadGuardList():Integer;
function LoadNpcs():Integer;
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();
{ Public declarations }
end;
var
FrmDB: TFrmDB;
nDeCryptString:Integer= -1;
implementation
uses ObjBase, Envir,edcode;
//{$R *.dfm}
{ TFrmDB }
//00487630
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;
//004855E0
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)数据失败!!!',[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;
//00486330
function TFrmDB.LoadMagicDB():Integer;
var
i:Integer;
Magic:pTMagic;
ResourceString
sSQLString = 'select * from Magic';
begin
Result:= -1;
EnterCriticalSection(ProcessHumanCriticalSection);
try
UserEngine.SwitchMagicList();
{
for I := 0 to UserEngine.MagicList.Count - 1 do begin
Dispose(pTMagic(UserEngine.MagicList.Items[I]));
end;
UserEngine.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;
finally
LeaveCriticalSection(ProcessHumanCriticalSection);
end;
end;
function TFrmDB.LoadMakeItem(): Integer; //00488CDC
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);
List28:=TStringList.Create;
ArrestStringEx(s18,'[',']',s24);
end else begin
if List28 <> nil then begin
s18:=GetValidStr3(s18,s20,[' ',#9]);
n14:=Str_ToInt(Trim(s18),1);
List28.AddObject(s20,TObject(n14));
end;
end;
end;
end; // for
if List28 <> nil then
g_MakeItemList.AddObject(s24,List28);
LoadList.Free;
Result:=1;
end;
end;
//00486D1C
function TFrmDB.LoadMapInfo: Integer;
//00486C1C
function LoadMapQuest(sName:String):TMerchant;
var
QuestNPC:TMerchant;
begin
QuestNPC:=TMerchant.Create;
QuestNPC.m_sMapName:='0';
QuestNPC.m_nCurrX:=0;
QuestNPC.m_nCurrY:=0;
QuestNPC.m_sCharName:=sName;
QuestNPC.m_nFlag:=0;
QuestNPC.m_wAppr:=0;
QuestNPC.m_sFilePath:='MapQuest_def\';
QuestNPC.m_boIsHide:=True;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -