objnpc.pas
来自「FIR引擎最新源码+注册」· PAS 代码 · 共 1,370 行 · 第 1/5 页
PAS
1,370 行
I: Integer;
UserItem: pTUserItem;
begin
if List = nil then begin
List := TList.Create;
m_GoodsList.Add(List);
end;
for I := 0 to nInt - 1 do begin
New(UserItem);
if UserEngine.CopyToUserItemFromName(sItemName, UserItem) then begin
List.Insert(0, UserItem);
end else Dispose(UserItem);
end;
end;
procedure DelReFillItem(var List: TList; nInt: Integer);
var
I: Integer;
begin
for I := List.Count - 1 downto 0 do begin
if nInt <= 0 then Break;
if pTUserItem(List.Items[I]) <> nil then begin
Dispose(pTUserItem(List.Items[I]));
end;
List.Delete(I);
Dec(nInt);
end;
end;
var
I, II: Integer;
Goods: pTGoods;
nIndex, nRefillCount: Integer;
RefillList, RefillList20: TList;
bo21: Boolean;
resourcestring
sExceptionMsg = '[Exception] TMerchant::RefillGoods %s/%d:%d [%s] Code:%d';
begin
try
for I := 0 to m_RefillGoodsList.Count - 1 do begin
Goods := m_RefillGoodsList.Items[I];
if Goods = nil then Continue;
if (GetTickCount - Goods.dwRefillTick) > Goods.dwRefillTime * 60 * 1000 then begin
Goods.dwRefillTick := GetTickCount();
nIndex := UserEngine.GetStdItemIdx(Goods.sItemName);
if nIndex >= 0 then begin
RefillList := GetRefillList(nIndex);
nRefillCount := 0;
if RefillList <> nil then nRefillCount := RefillList.Count;
if Goods.nCount > nRefillCount then begin
CheckItemPrice(nIndex);
RefillItems(RefillList, Goods.sItemName, Goods.nCount - nRefillCount);
FrmDB.SaveGoodRecord(Self, m_sScript + '-' + m_sMapName);
FrmDB.SaveGoodPriceRecord(Self, m_sScript + '-' + m_sMapName);
end;
if Goods.nCount < nRefillCount then begin
DelReFillItem(RefillList, nRefillCount - Goods.nCount);
FrmDB.SaveGoodRecord(Self, m_sScript + '-' + m_sMapName);
FrmDB.SaveGoodPriceRecord(Self, m_sScript + '-' + m_sMapName);
end;
end;
end;
end;
for I := 0 to m_GoodsList.Count - 1 do begin
RefillList20 := TList(m_GoodsList.Items[I]);
if RefillList20 = nil then Continue;
if RefillList20.Count > 1000 then begin
bo21 := False;
for II := 0 to m_RefillGoodsList.Count - 1 do begin
Goods := m_RefillGoodsList.Items[II];
if Goods = nil then Continue;
nIndex := UserEngine.GetStdItemIdx(Goods.sItemName);
if (pTItemPrice(RefillList20.Items[0]) <> nil) and (pTItemPrice(RefillList20.Items[0]).wIndex = nIndex) then begin
bo21 := True;
Break;
end;
end;
if not bo21 then begin
DelReFillItem(RefillList20, RefillList20.Count - 1000);
end else begin
DelReFillItem(RefillList20, RefillList20.Count - 5000);
end;
end;
end;
except
on E: Exception do
MainOutMessage(Format(sExceptionMsg, [m_sCharName, m_nCurrX, m_nCurrY, E.Message, nCHECK]));
end;
end;
function TMerchant.CheckItemType(nStdMode: Integer): Boolean;
var
I: Integer;
begin
Result := False;
for I := 0 to m_ItemTypeList.Count - 1 do begin
if Integer(m_ItemTypeList.Items[I]) = nStdMode then begin
Result := True;
Break;
end;
end;
end;
function TMerchant.GetItemPrice(nIndex: Integer): Integer;
var
I: Integer;
ItemPrice: pTItemPrice;
StdItem: pTStdItem;
begin
Result := -1;
for I := 0 to m_ItemPriceList.Count - 1 do begin
ItemPrice := m_ItemPriceList.Items[I];
if ItemPrice = nil then Continue;
if ItemPrice.wIndex = nIndex then begin
Result := ItemPrice.nPrice;
Break;
end;
end; // for
if Result < 0 then begin
StdItem := UserEngine.GetStdItem(nIndex);
if StdItem <> nil then begin
if CheckItemType(StdItem.StdMode) then
Result := StdItem.Price;
end;
end;
end;
procedure TMerchant.SaveUpgradingList();
begin
try
//FrmDB.SaveUpgradeWeaponRecord(m_sCharName,m_UpgradeWeaponList);
FrmDB.SaveUpgradeWeaponRecord(m_sScript + '-' + m_sMapName, m_UpgradeWeaponList);
except
MainOutMessage('Failure in saving upgradinglist - ' + m_sCharName);
end;
end;
procedure TMerchant.UpgradeWapon(User: TPlayObject);
procedure sub_4A0218(ItemList: TList; var btDc: Byte; var btSc: Byte; var btMc: Byte; var btDura: Byte);
var
I, II: Integer;
DuraList: TList;
UserItem: pTUserItem;
StdItem: pTStdItem;
StdItem80: TStdItem;
DelItemList: TStringList;
nDc, nSc, nMc, nDcMin, nDcMax, nScMin, nScMax, nMcMin, nMcMax, nDura, nItemCount: Integer;
begin
nDcMin := 0;
nDcMax := 0;
nScMin := 0;
nScMax := 0;
nMcMin := 0;
nMcMax := 0;
nDura := 0;
nItemCount := 0;
DelItemList := nil;
DuraList := TList.Create;
for I := ItemList.Count - 1 downto 0 do begin
UserItem := ItemList.Items[I];
if UserEngine.GetStdItemName(UserItem.wIndex) = g_Config.sBlackStone then begin
DuraList.Add(Pointer(Round(UserItem.Dura / 1.0E3)));
if DelItemList = nil then DelItemList := TStringList.Create;
DelItemList.AddObject(g_Config.sBlackStone, TObject(UserItem.MakeIndex));
Dispose(UserItem);
ItemList.Delete(I);
end else begin
if IsUseItem(UserItem.wIndex) then begin
StdItem := UserEngine.GetStdItem(UserItem.wIndex);
if StdItem <> nil then begin
StdItem80 := StdItem^;
ItemUnit.GetItemAddValue(UserItem, StdItem80);
nDc := 0;
nSc := 0;
nMc := 0;
case StdItem80.StdMode of
19, 20, 21: begin //004A0421
nDc := HiWord(StdItem80.DC) + LoWord(StdItem80.DC);
nSc := HiWord(StdItem80.SC) + LoWord(StdItem80.SC);
nMc := HiWord(StdItem80.MC) + LoWord(StdItem80.MC);
end;
22, 23: begin //004A046E
nDc := HiWord(StdItem80.DC) + LoWord(StdItem80.DC);
nSc := HiWord(StdItem80.SC) + LoWord(StdItem80.SC);
nMc := HiWord(StdItem80.MC) + LoWord(StdItem80.MC);
end;
24, 26: begin
nDc := HiWord(StdItem80.DC) + LoWord(StdItem80.DC) + 1;
nSc := HiWord(StdItem80.SC) + LoWord(StdItem80.SC) + 1;
nMc := HiWord(StdItem80.MC) + LoWord(StdItem80.MC) + 1;
end;
end;
if nDcMin < nDc then begin
nDcMax := nDcMin;
nDcMin := nDc;
end else begin
if nDcMax < nDc then nDcMax := nDc;
end;
if nScMin < nSc then begin
nScMax := nScMin;
nScMin := nSc;
end else begin
if nScMax < nSc then nScMax := nSc;
end;
if nMcMin < nMc then begin
nMcMax := nMcMin;
nMcMin := nMc;
end else begin
if nMcMax < nMc then nMcMax := nMc;
end;
if DelItemList = nil then DelItemList := TStringList.Create;
DelItemList.AddObject(StdItem.Name, TObject(UserItem.MakeIndex));
//004A06DB
if StdItem.NeedIdentify = 1 then
AddGameDataLog('26' + #9 +
User.m_sMapName + #9 +
IntToStr(User.m_nCurrX) + #9 +
IntToStr(User.m_nCurrY) + #9 +
User.m_sCharName + #9 +
//UserEngine.GetStdItemName(UserItem.wIndex) + #9 +
StdItem.Name + #9 +
IntToStr(UserItem.MakeIndex) + #9 +
'1' + #9 +
'0');
Dispose(UserItem);
ItemList.Delete(I);
end;
end;
end;
end; // for
for I := 0 to DuraList.Count - 1 do begin
if DuraList.Count <= 0 then Break;
for II := DuraList.Count - 1 downto I + 1 do begin
if Integer(DuraList.Items[II]) > Integer(DuraList.Items[II - 1]) then
DuraList.Exchange(II, II - 1);
end; // for
end; // for
for I := 0 to DuraList.Count - 1 do begin
nDura := nDura + Integer(DuraList.Items[I]);
Inc(nItemCount);
if nItemCount >= 5 then Break;
end;
btDura := Round(_MIN(5, nItemCount) + _MIN(5, nItemCount) * ((nDura / nItemCount) / 5.0));
btDc := nDcMin div 5 + nDcMax div 3;
btSc := nScMin div 5 + nScMax div 3;
btMc := nMcMin div 5 + nMcMax div 3;
if DelItemList <> nil then
User.SendMsg(Self, RM_SENDDELITEMLIST, 0, Integer(DelItemList), 0, 0, '');
if DuraList <> nil then DuraList.Free;
end;
var
I: Integer;
bo0D: Boolean;
UpgradeInfo: pTUpgradeInfo;
StdItem: pTStdItem;
begin
bo0D := False;
for I := 0 to m_UpgradeWeaponList.Count - 1 do begin
UpgradeInfo := m_UpgradeWeaponList.Items[I];
if UpgradeInfo.sUserName = User.m_sCharName then begin
GotoLable(User, sUPGRADEING, False);
Exit;
end;
end;
if (User.m_UseItems[U_WEAPON].wIndex <> 0) and (User.m_nGold >= g_Config.nUpgradeWeaponPrice) and
(User.CheckItems(g_Config.sBlackStone) <> nil) then begin
User.DecGold(g_Config.nUpgradeWeaponPrice);
// if m_boCastle or g_Config.boGetAllNpcTax then UserCastle.IncRateGold(g_Config.nUpgradeWeaponPrice);
if m_boCastle or g_Config.boGetAllNpcTax then begin
if m_Castle <> nil then begin
TUserCastle(m_Castle).IncRateGold(g_Config.nUpgradeWeaponPrice);
end else
if g_Config.boGetAllNpcTax then begin
g_CastleManager.IncRateGold(g_Config.nUpgradeWeaponPrice);
end;
end;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?