📄 localdb.pas
字号:
begin
try
sScriptFile:=g_Config.sEnvirDir + 'Robot_def\' + 'RobotManage.txt';
sScritpDir:=g_Config.sEnvirDir + 'Robot_def\';
if not DirectoryExists(sScritpDir) then
mkdir(Pchar(sScritpDir));
if not FileExists(sScriptFile) then begin
tSaveList:=TStringList.Create;
tSaveList.Add(';此脚为机器人专用脚本,用于机器人处理功能用的脚本。');
tSaveList.SaveToFile(sScriptFile);
tSaveList.Free;
end;
if FileExists(sScriptFile) then begin
g_RobotNPC:=TMerchant.Create;
g_RobotNPC.m_sMapName:='0';
g_RobotNPC.m_nCurrX:=0;
g_RobotNPC.m_nCurrY:=0;
g_RobotNPC.m_sCharName:='RobotManage';
g_RobotNPC.m_nFlag:=0;
g_RobotNPC.m_wAppr:=0;
g_RobotNPC.m_sFilePath:='Robot_def\';
g_RobotNPC.m_boIsHide:=True;
g_RobotNPC.m_boIsQuest:=False;
UserEngine.QuestNPCList.Add(g_RobotNPC);
end else begin
g_RobotNPC:=nil;
end;
except
g_RobotNPC:=nil;
end;
end;
//00489414
function TFrmDB.LoadMapQuest(): Integer;
var
sFileName,tStr:String;
tMapQuestList:TStringList;
i:Integer;
sMap,s1C,s20,sMonName,sItem,sQuest,s30,s34:String;
n38,n3C:Integer;
boGrouped:Boolean;
Map:TEnvirnoment;
begin
Result:=1;
sFileName:=g_Config.sEnvirDir + 'MapQuest.txt';
if FileExists(sFileName) then begin
tMapQuestList:=TStringList.Create;
tMapQuestList.LoadFromFile(sFileName);
for i:=0 to tMapQuestList.Count -1 do begin
tStr:=tMapQuestList.Strings[i];
if (tStr <> '') and (tStr[1] <> ';') then begin
tStr:=GetValidStr3(tStr, sMap, [' ', #9]);
tStr:=GetValidStr3(tStr, s1C, [' ', #9]);
tStr:=GetValidStr3(tStr, s20, [' ', #9]);
tStr:=GetValidStr3(tStr, sMonName, [' ', #9]);
if (sMonName <> '') and (sMonName[1] = '"') then
ArrestStringEx(sMonName,'"','"',sMonName);
tStr:=GetValidStr3(tStr, sItem, [' ', #9]);
if (sItem <> '') and (sItem[1] = '"') then
ArrestStringEx(sItem,'"','"',sItem);
tStr:=GetValidStr3(tStr, sQuest, [' ', #9]);
tStr:=GetValidStr3(tStr, s30, [' ', #9]);
if (sMap <> '') and (sMonName <> '') and (sQuest <> '') then begin
Map:=g_MapManager.FindMap(sMap);
if Map <> nil then begin
ArrestStringEx(s1C,'[',']',s34);
n38:=Str_ToInt(s34,0);
n3C:=Str_ToInt(s20,0);
if CompareLStr(s30,'GROUP',length('GROUP')) then boGrouped:=True
else boGrouped:=False;
if not Map.CreateQuest(n38,n3C,sMonName,sItem,sQuest,boGrouped) then Result:= -i;
//nFlag,boFlag,Monster,Item,Quest,boGrouped
end else Result:= -i;
end else Result:= -i;
end;
end;
tMapQuestList.Free;
end;
QMangeNPC();
QFunctionNPC();
RobotNPC();
end;
function TFrmDB.LoadMerchant(): Integer;
var
i:Integer;
boUse:Boolean;
tMerchantNPC:TMerchant;
ResourceString
sSQLString = 'SELECT * FROM TBL_MERCHANT';
begin
Result:= -1;
EnterCriticalSection(ProcessHumanCriticalSection);
try
try
Query.SQL.Clear;
Query.SQL.Add(sSQLString);
try
Query.Open;
finally
Result:= -2;
end;
for i:=0 to Query.RecordCount -1 do begin
boUse := Query.FieldByName('FLD_ENABLED').AsBoolean;
if boUse then begin
tMerchantNPC:=TMerchant.Create;
tMerchantNPC.m_sScript := Query.FieldByName('FLD_SCRIPTFILE').AsString;
tMerchantNPC.m_sMapName := Query.FieldByName('FLD_MAPNAME').AsString;
tMerchantNPC.m_nCurrX := Query.FieldByName('FLD_X').AsInteger;
tMerchantNPC.m_nCurrY := Query.FieldByName('FLD_Y').AsInteger;
tMerchantNPC.m_sCharName := Query.FieldByName('FLD_NAME').AsString;
tMerchantNPC.m_nFlag := Query.FieldByName('FLD_FLAG').AsInteger;
tMerchantNPC.m_wAppr := Query.FieldByName('FLD_APPEARANCE').AsInteger;
tMerchantNPC.m_boCastle := Query.FieldByName('FLD_ISCASTLE').AsBoolean;
tMerchantNPC.m_boCanMove := Query.FieldByName('FLD_CANMOVE').AsBoolean;
tMerchantNPC.m_dwMoveTime := Query.FieldByName('FLD_MOVETIME').AsInteger;
if (tMerchantNPC.m_sScript <> '') and (tMerchantNPC.m_sMapName <> '') then
UserEngine.AddMerchant(tMerchantNPC)
else
tMerchantNPC.Free;
end;
Result := 1;
Query.Next;
end;
finally
Query.Close;
end;
finally
LeaveCriticalSection(ProcessHumanCriticalSection);
end;
end;
//004867F4
function TFrmDB.LoadMonGen(): Integer;
var
i:Integer;
boLoads:Boolean;
MonGenInfo:pTMonGenInfo;
ResourceString
sSQLString = 'SELECT * FROM TBL_MONGEN ORDER BY FLD_MAPNAME';
begin
Result:=0;
EnterCriticalSection(ProcessHumanCriticalSection);
try
Query.SQL.Clear;
Query.SQL.Add(sSQLString);
try
Query.Open;
finally
Result:= -1;
end;
for i:=0 to Query.RecordCount -1 do begin
boLoads := Query.FieldByName('FLD_LOAD').AsBoolean;
if boLoads then begin
New(MonGenInfo);
MonGenInfo.sMapName := Trim(Query.FieldByName('FLD_MAPNAME').AsString);
MonGenInfo.nX := Query.FieldByName('FLD_X').AsInteger;
MonGenInfo.nY := Query.FieldByName('FLD_Y').AsInteger;
MonGenInfo.sMonName := Trim(Query.FieldByName('FLD_MONNAME').AsString);
MonGenInfo.nRange := Query.FieldByName('FLD_RANGE').AsInteger;
MonGenInfo.nCount := Query.FieldByName('FLD_COUNT').AsInteger;
MonGenInfo.dwZenTime := Query.FieldByName('FLD_GENTIME').AsInteger * 60 * 1000;
MonGenInfo.nMissionGenRate := Query.FieldByName('FLD_SMALLGENRATE').AsInteger;
if (MonGenInfo.sMapName <> '') and
(MonGenInfo.sMonName <> '') and
(MonGenInfo.dwZenTime <> 0) and
(g_MapManager.GetMapInfo(nServerIndex,MonGenInfo.sMapName) <> nil) then begin
MonGenInfo.CertList:=TList.Create;
MonGenInfo.Envir:=g_MapManager.FindMap(MonGenInfo.sMapName);
if MonGenInfo.Envir <> nil then begin
UserEngine.m_MonGenList.Add(MonGenInfo);
end else begin
Dispose(MonGenInfo);
end;
end;
end;
Result := 1;
Query.Next;
end;
Query.Close;
finally
LeaveCriticalSection(ProcessHumanCriticalSection);
end;
end;
//00485E04
function TFrmDB.LoadMonsterDB():Integer;
var
i:Integer;
Monster:pTMonInfo;
ResourceString
sSQLString = 'SELECT * FROM TBL_MONSTER';
begin
Result:=0;
EnterCriticalSection(ProcessHumanCriticalSection);
try
for I := 0 to UserEngine.MonsterList.Count - 1 do begin
Dispose(pTMonInfo(UserEngine.MonsterList.Items[I]));
end;
UserEngine.MonsterList.Clear;
Query.SQL.Clear;
Query.SQL.Add(sSQLString);
try
Query.Open;
finally
Result:= -1;
end;
for i:=0 to Query.RecordCount -1 do begin
New(Monster);
Monster.ItemList := TList.Create;
Monster.sName := Trim(Query.FieldByName('FLD_NAME').AsString);
Monster.btRace := Query.FieldByName('FLD_RACE').AsInteger;
Monster.btRaceImg := Query.FieldByName('FLD_RACEIMG').AsInteger;
Monster.wAppr := Query.FieldByName('FLD_IMGINDEX').AsInteger;
Monster.wLevel := Query.FieldByName('FLD_LV').AsInteger;
Monster.btLifeAttrib := Query.FieldByName('FLD_UNDEAD').AsInteger;
Monster.wCoolEye := Query.FieldByName('FLD_COOLEYE').AsInteger;
Monster.dwExp := Query.FieldByName('FLD_EXP').AsInteger;
//城门或城墙的状态跟HP值有关,如果HP异常,将导致城墙显示不了
if Monster.btRace in [110,111] then begin //如果为城墙或城门由HP不加倍
Monster.wHP := Query.FieldByName('FLD_HP').AsInteger;
end else begin
Monster.wHP := ROUND(Query.FieldByName('FLD_HP').AsInteger * (g_Config.nMonsterPowerRate / 10));
end;
Monster.wMP := ROUND(Query.FieldByName('FLD_MP').AsInteger * (g_Config.nMonsterPowerRate / 10));
Monster.wAC := ROUND(Query.FieldByName('FLD_AC').AsInteger * (g_Config.nMonsterPowerRate / 10));
Monster.wMAC := ROUND(Query.FieldByName('FLD_MAC').AsInteger * (g_Config.nMonsterPowerRate / 10));
Monster.wDC := ROUND(Query.FieldByName('FLD_DC').AsInteger * (g_Config.nMonsterPowerRate / 10));
Monster.wMaxDC := ROUND(Query.FieldByName('FLD_DCMAX').AsInteger * (g_Config.nMonsterPowerRate / 10));
Monster.wMC := ROUND(Query.FieldByName('FLD_MC').AsInteger * (g_Config.nMonsterPowerRate / 10));
Monster.wSC := ROUND(Query.FieldByName('FLD_SC').AsInteger * (g_Config.nMonsterPowerRate / 10));
Monster.wSpeed := Query.FieldByName('FLD_AGILITY').AsInteger;
Monster.wHitPoint := Query.FieldByName('FLD_ACCURATE').AsInteger;
Monster.wWalkSpeed := _MAX(200,Query.FieldByName('FLD_WALK_SPD').AsInteger);
Monster.wWalkStep := _MAX(1,Query.FieldByName('FLD_WALKSTEP').AsInteger);
Monster.wWalkWait := Query.FieldByName('FLD_WALKWAIT').AsInteger;
Monster.wAttackSpeed := Query.FieldByName('FLD_ATTACK_SPD').AsInteger;
Monster.wAntiPush := Query.FieldByName('FLD_ATTACK_SPD').AsInteger;
Monster.boAggro := Query.FieldByName('FLD_AGGRO').AsBoolean;
Monster.boTame := Query.FieldByName('FLD_TAME').AsBoolean;
if Monster.wWalkSpeed < 200 then Monster.wWalkSpeed:= 200;
if Monster.wAttackSpeed < 200 then Monster.wAttackSpeed:= 200;
Monster.ItemList:=nil;
LoadMonitems(Monster.sName,Monster.ItemList);
UserEngine.MonsterList.Add(Monster);
Result := 1;
Query.Next;
end;
Query.Close;
finally
LeaveCriticalSection(ProcessHumanCriticalSection);
end;
end;
function TFrmDB.LoadMonitems(MonName:String;var ItemList:TList):Integer;//00485ABC
var
I: Integer;
s24:String;
LoadList:TStringList;
MonItem:pTMonItem;
s28,s2C,s30:String;
n18,n1C,n20:Integer;
begin
Result:=0;
s24:=g_Config.sEnvirDir + 'MonItems\' + MonName + '.txt';
if FileExists(s24) then begin
if ItemList <> nil then begin
for I := 0 to Itemlist.Count - 1 do begin
DisPose(pTMonItem(ItemList.Items[I]));
end;
ItemList.Clear;
end; //00485B81
LoadList:=TStringList.Create;
LoadList.LoadFromFile(s24);
for I := 0 to LoadList.Count - 1 do begin
s28:=LoadList.Strings[I];
if (s28 <> '') and (s28[1] <> ';') then begin
s28:=GetValidStr3(s28,s30,[' ','/',#9]);
n18:=Str_ToInt(s30,-1);
s28:=GetValidStr3(s28,s30,[' ','/',#9]);
n1C:=Str_ToInt(s30,-1);
s28:=GetValidStr3(s28,s30,[' ',#9]);
if s30 <> '' then begin
if s30[1] = '"' then
ArrestStringEx(s30,'"','"',s30);
end;
s2C:=s30;
s28:=GetValidStr3(s28,s30,[' ',#9]);
n20:=Str_ToInt(s30,1);
if (n18 > 0) and (n1C > 0) and (s2C <> '') then begin
if ItemList = nil then ItemList:=TList.Create;
New(MonItem);
MonItem.SelPoint:=n18 -1;
MonItem.MaxPoint:=n1C;
MonItem.ItemName:=s2C;
MonItem.Count:=n20;
ItemList.Add(MonItem);
Inc(Result);
end;
end;
end;
LoadList.Free;
end;
end;
//00488178
function TFrmDB.LoadNpcs(): Integer;
var
i,nType:Integer;
boUse:Boolean;
NPC:TNormNpc;
ResourceString
sSQLString = 'SELECT * FROM TBL_NPC';
begin
Result:= -1;
EnterCriticalSection(ProcessHumanCriticalSection);
try
try
Query.SQL.Clear;
Query.SQL.Add(sSQLString);
try
Query.Open;
finally
Result:= -2;
end;
for i:=0 to Query.RecordCount -1 do begin
boUse := Query.FieldByName('FLD_ENABLED').AsBoolean;
if boUse then begin
NPC:=nil;
nType := Query.FieldByName('FLD_TYPE').AsInteger;
case nType of
0: NPC:=TMerchant.Create;
1: NPC:=TGuildOfficial.Create;
2: NPC:=TCastleOfficial.Create;
end;
if NPC <> nil then begin
NPC.m_sMapName := Query.FieldByName('FLD_MAPNAME').AsString;
NPC.m_nCurrX := Query.FieldByName('FLD_X').AsInteger;
NPC.m_nCurrY := Query.FieldByName('FLD_Y').AsInteger;
NPC.m_sCharName := Query.FieldByName('FLD_NAME').AsString;
NPC.m_nFlag := Query.FieldByName('FLD_FLAG').AsInteger;
NPC.m_wAppr := Query.FieldByName('FLD_APPEARANCE').AsInteger;
UserEngine.QuestNPCList.Add(NPC);
end;
end;
Result := 1;
Query.Next;
end;
finally
Query.Close;
end;
finally
LeaveCriticalSection(ProcessHumanCriticalSection);
end;
end;
//00489840
function TFrmDB.LoadQuestDiary(): Integer;
function sub_48978C(nIndex:Integer):String;
begin
if nIndex >= 1000 then begin
Result:=IntToStr(nIndex);
exit;
end;
if nIndex >= 100 then begin
Result:=IntToStr(nIndex) + '0';
exit;
end;
Result:=IntToStr(nIndex) + '00';
end;
var
i,ii:Integer;
QDDinfoList:TList;
QDDinfo:pTQDDinfo;
s14,s18,s1C,s20:String;
bo2D:Boolean;
nC:Integer;
LoadList:TStringList;
begin
Result:=1;
for i:=0 to QuestDiaryList.Count -1 do begin
QDDinfoList:=QuestDiaryList.Items[i];
for ii:=0 to QDDinfoList.Count -1 do begin
QDDinfo:=QDDinfoList.Items[ii];
QDDinfo.sList.Free;
Dispose(QDDinfo);
end;
QDDinfoList.Free;
end;
QuestDiaryList.Clear;
bo2D:=False;
nC:=1;
while (True) do begin
QDDinfoList:=nil;
s14:='QuestDiary\' + sub_48978C(nC) + '.txt';
if FileExists(s14) then begin
s18:='';
QDDinfo:=nil;
LoadList:=TStringList.Create;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -