⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 objnpc.pas

📁 乐都SQL版传奇全套代码,绝对可编译
💻 PAS
📖 第 1 页 / 共 5 页
字号:
    sText := '无效';
    sMsg := sub_49ADB8(sMsg, '<$GUARDRULE>', sText);
  end;

end;

procedure TCastleOfficial.UserSelect(PlayObject: TPlayObject; sData: string);
var
  s18, s20, sMsg, sLabel                : string;
  boCanJmp                              : Boolean;
resourcestring
  sExceptionMsg                           =
    '[Exception] TCastleManager::UserSelect... ';
begin
  inherited;
  try
    //    PlayObject.m_nScriptGotoCount:=0;
    if m_Castle = nil then
    begin
      PlayObject.SysMsg('NPC不属于城堡!!!', c_Red, t_Hint);
      exit;
    end;
    if (sData <> '') and (sData[1] = '@') then
    begin
      sMsg := GetValidStr3(sData, sLabel, [#13]);
      s18 := '';
      PlayObject.m_sScriptLable := sData;
      if TUserCastle(m_Castle).IsMasterGuild(TGUild(PlayObject.m_MyGuild)) and
        (PlayObject.IsGuildMaster) then
      begin
        boCanJmp := PlayObject.LableIsCanJmp(sLabel);
        if CompareText(sLabel, sSL_SENDMSG) = 0 then
        begin
          if sMsg = '' then
            exit;
        end;
        GotoLable(PlayObject, sLabel, not boCanJmp);
        //GotoLable(PlayObject,sLabel,not PlayObject.LableIsCanJmp(sLabel));
        if not boCanJmp then
          exit;
        if CompareText(sLabel, sSL_SENDMSG) = 0 then
        begin
          SendCustemMsg(PlayObject, sMsg);
          PlayObject.SendMsg(self, RM_MENU_OK, 0, Integer(self), 0, 0, s18);
        end
        else if CompareText(sLabel, sCASTLENAME) = 0 then
        begin
          sMsg := Trim(sMsg);
          if sMsg <> '' then
          begin
            TUserCastle(m_Castle).m_sName := sMsg;
            TUserCastle(m_Castle).Save;
            TUserCastle(m_Castle).m_MasterGuild.RefMemberName;
            s18 := '城堡名称更改成功...';
          end
          else
          begin
            s18 := '城堡名称更改失败!!!';
          end;
          PlayObject.SendMsg(self, RM_MENU_OK, 0, Integer(self), 0, 0, s18);
        end
        else if CompareText(sLabel, sWITHDRAWAL) = 0 then
        begin
          case TUserCastle(m_Castle).WithDrawalGolds(PlayObject, Str_ToInt(sMsg,
            0)) of
            -4: s18 := '输入的金币数不正确!!!';
            -3: s18 := '您无法携带更多的东西了。';
            -2: s18 := '该城内没有这么多金币.';
            -1: s18 := '只有行会 ' + TUserCastle(m_Castle).m_sOwnGuild +
              ' 的掌门人才能使用!!!';
            1: GotoLable(PlayObject, sMAIN, False);
          end;
          PlayObject.SendMsg(self, RM_MENU_OK, 0, Integer(self), 0, 0, s18);
        end
        else if CompareText(sLabel, sRECEIPTS) = 0 then
        begin
          case TUserCastle(m_Castle).ReceiptGolds(PlayObject, Str_ToInt(sMsg, 0))
            of
            -4: s18 := '输入的金币数不正确!!!';
            -3: s18 := '你已经达到在城内存放货物的限制了。';
            -2: s18 := '你没有那么多金币.';
            -1: s18 := '只有行会 ' + TUserCastle(m_Castle).m_sOwnGuild +
              ' 的掌门人才能使用!!!';
            1: GotoLable(PlayObject, sMAIN, False);
          end;
          PlayObject.SendMsg(self, RM_MENU_OK, 0, Integer(self), 0, 0, s18);
        end
        else if CompareText(sLabel, sOPENMAINDOOR) = 0 then
        begin
          TUserCastle(m_Castle).MainDoorControl(False);
        end
        else if CompareText(sLabel, sCLOSEMAINDOOR) = 0 then
        begin
          TUserCastle(m_Castle).MainDoorControl(True);
        end
        else if CompareText(sLabel, sREPAIRDOORNOW) = 0 then
        begin
          RepairDoor(PlayObject);
          GotoLable(PlayObject, sMAIN, False);
        end
        else if CompareText(sLabel, sREPAIRWALLNOW1) = 0 then
        begin
          RepairWallNow(1, PlayObject);
          GotoLable(PlayObject, sMAIN, False);
        end
        else if CompareText(sLabel, sREPAIRWALLNOW2) = 0 then
        begin
          RepairWallNow(2, PlayObject);
          GotoLable(PlayObject, sMAIN, False);
        end
        else if CompareText(sLabel, sREPAIRWALLNOW3) = 0 then
        begin
          RepairWallNow(3, PlayObject);
          GotoLable(PlayObject, sMAIN, False);
        end
        else if CompareLStr(sLabel, sHIREGUARDNOW, length(sHIREGUARDNOW)) then
        begin
          s20 := Copy(sLabel, length(sHIREGUARDNOW) + 1, length(sLabel));
          HireGuard(s20, PlayObject);
          PlayObject.SendMsg(self, RM_MENU_OK, 0, Integer(self), 0, 0, '');
          //GotoLable(PlayObject,sHIREGUARDOK,False);
        end
        else if CompareLStr(sLabel, sHIREARCHERNOW, length(sHIREARCHERNOW)) then
        begin
          s20 := Copy(sLabel, length(sHIREARCHERNOW) + 1, length(sLabel));
          HireArcher(s20, PlayObject);
          PlayObject.SendMsg(self, RM_MENU_OK, 0, Integer(self), 0, 0, '');
        end
        else if CompareText(sLabel, sEXIT) = 0 then
        begin
          PlayObject.SendMsg(self, RM_MERCHANTDLGCLOSE, 0, Integer(self), 0, 0,
            '');
        end
        else if CompareText(sLabel, sBACK) = 0 then
        begin
          if PlayObject.m_sScriptGoBackLable = '' then
            PlayObject.m_sScriptGoBackLable := sMAIN;
          GotoLable(PlayObject, PlayObject.m_sScriptGoBackLable, False);
        end;
      end
      else
      begin
        s18 := '你没有权利使用';
        PlayObject.SendMsg(self, RM_MENU_OK, 0, Integer(self), 0, 0, s18);
      end;
    end;
  except
    MainOutMessage(sExceptionMsg);
  end;
  //  inherited;

end;

procedure TCastleOfficial.HireGuard(sIndex: string; PlayObject: TPlayObject);
//004A413C
var
  n10                                   : Integer;
  ObjUnit                               : pTObjUnit;
begin
  if m_Castle = nil then
  begin
    PlayObject.SysMsg('NPC不属于城堡!!!', c_Red, t_Hint);
    exit;
  end;
  if TUserCastle(m_Castle).m_nTotalGold >= g_Config.nHireGuardPrice then
  begin
    n10 := Str_ToInt(sIndex, 0) - 1;
    if n10 <= MAXCALSTEGUARD then
    begin
      if TUserCastle(m_Castle).m_Guard[n10].BaseObject = nil then
      begin
        if not TUserCastle(m_Castle).m_boUnderWar then
        begin
          ObjUnit := @TUserCastle(m_Castle).m_Guard[n10];
          ObjUnit.BaseObject :=
            UserEngine.RegenMonsterByName(TUserCastle(m_Castle).m_sMapName,
            ObjUnit.nX,
            ObjUnit.nY,
            ObjUnit.sName);
          if ObjUnit.BaseObject <> nil then
          begin
            Dec(TUserCastle(m_Castle).m_nTotalGold, g_Config.nHireGuardPrice);
            ObjUnit.BaseObject.m_Castle := TUserCastle(m_Castle);
            PlayObject.SysMsg('雇佣成功.', c_Green, t_Hint);
          end;

        end
        else
        begin
          PlayObject.SysMsg('现在无法雇佣!!!', c_Red, t_Hint);
        end;
      end
      else
         PlayObject.SysMsg('早已雇佣!!!.', c_Green, t_Hint);
    end
    else
    begin
      PlayObject.SysMsg('指令错误!!!', c_Red, t_Hint);
    end;
  end
  else
  begin
    PlayObject.SysMsg('城内资金不足!!!', c_Red, t_Hint);
  end;
 
end;

procedure TCastleOfficial.HireArcher(sIndex: string; PlayObject: TPlayObject);
//004A433C
var
  n10                                   : Integer;
  ObjUnit                               : pTObjUnit;
begin
  if m_Castle = nil then
  begin
    PlayObject.SysMsg('NPC不属于城堡!!!', c_Red, t_Hint);
    exit;
  end;

  if TUserCastle(m_Castle).m_nTotalGold >= g_Config.nHireArcherPrice then
  begin
    n10 := Str_ToInt(sIndex, 0) - 1;
    if n10 <= MAXCASTLEARCHER then
    begin
      if TUserCastle(m_Castle).m_Archer[n10].BaseObject = nil then
      begin
        if not TUserCastle(m_Castle).m_boUnderWar then
        begin
          ObjUnit := @TUserCastle(m_Castle).m_Archer[n10];
          ObjUnit.BaseObject :=
            UserEngine.RegenMonsterByName(TUserCastle(m_Castle).m_sMapName,
            ObjUnit.nX,
            ObjUnit.nY,
            ObjUnit.sName);
          if ObjUnit.BaseObject <> nil then
          begin
            Dec(TUserCastle(m_Castle).m_nTotalGold, g_Config.nHireArcherPrice);
            ObjUnit.BaseObject.m_Castle := TUserCastle(m_Castle);
            if ObjUnit.BaseObject.m_btRaceServer=112 then
            Begin
              TGuardUnit(ObjUnit.BaseObject).m_nX550 := ObjUnit.nX;
              TGuardUnit(ObjUnit.BaseObject).m_nY554 := ObjUnit.nY;
              TGuardUnit(ObjUnit.BaseObject).m_nDirection := 3;
            End;
            PlayObject.SysMsg('雇佣成功.', c_Green, t_Hint);
          end;

        end
        else
        begin
          PlayObject.SysMsg('现在无法雇佣!!!', c_Red, t_Hint);
        end;
      end
      else
      begin
        PlayObject.SysMsg('早已雇佣!!!', c_Red, t_Hint);
      end;
    end
    else
    begin
      PlayObject.SysMsg('指令错误!!!', c_Red, t_Hint);
    end;
  end
  else
  begin
    PlayObject.SysMsg('城内资金不足!!!', c_Red, t_Hint);
  end;

end;
{ TMerchant }

procedure TMerchant.AddItemPrice(nIndex: Integer; nPrice: Integer); //0049F2AC
var
  ItemPrice                             : pTItemPrice;
begin
  New(ItemPrice);
  ItemPrice.wIndex := nIndex;
  ItemPrice.nPrice := nPrice;
  m_ItemPriceList.Add(ItemPrice);
  FrmDB.SaveGoodPriceRecord(self, m_sScript + '-' + m_sMapName);
end;

procedure TMerchant.CheckItemPrice(nIndex: Integer);        //0049F1BC
var
  i                                     : Integer;
  ItemPrice                             : pTItemPrice;
  n10                                   : Integer;
  StdItem                               : pTStdItem;
begin
  for i := 0 to m_ItemPriceList.Count - 1 do
  begin
    ItemPrice := m_ItemPriceList.Items[i];
    if ItemPrice.wIndex = nIndex then
    begin
      n10 := ItemPrice.nPrice;
      if ROUND(n10 * 1.1) > n10 then
      begin
        n10 := ROUND(n10 * 1.1);
      end
      else
        Inc(n10);
      exit;
    end;
  end;
  StdItem := UserEngine.GetStdItem(nIndex);
  if StdItem <> nil then
  begin
    AddItemPrice(nIndex, ROUND(StdItem.Price * 1.1));
  end;
end;

function TMerchant.GetRefillList(nIndex: Integer): TMyList;   //0049F118
var
  i                                     : Integer;
  List                                  : TMyList;
begin
  Result := nil;
  if nIndex <= 0 then
    exit;
  for i := 0 to m_GoodsList.Count - 1 do
  begin
    List := TMyList(m_GoodsList.Items[i]);
    if List.Count > 0 then
    begin
      if pTUserItem(List.Items[0]).wIndex = nIndex then
      begin
        Result := List;
        break;
      end;
    end;
  end;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -