藏宝湾网游单机站

 找回密码
 注册

QQ登录

只需一步,快速开始

★【黑暗之光SF★我是大主宰SF】【神将三国SF】★

★【0.1折】★【变态网页游戏私服】★

★神将三国网页版上线送V5 5w元宝 5000w铜币 我是大主宰上线满v,80万元宝,小怪都爆元宝,耐玩长久稳定★

【原始传奇SF/维京传奇SF】【GM包站手游】

★【原始传奇SF/维京传奇SF】【GM包站手游】★

★2025火爆『传奇岁月+赤焰号角+维京传奇+原始传奇』爆战力称号BUFF+神装99999999万人PK★

首创可以单机 可以互动 可以赚烟钱的传奇

★全网独家 可以单机 可以互动的传奇!★

★全网唯一持续更新的可单机游戏!每15-25天更新一次内容,保持游戏新鲜度!! 众多独家的功能特色,众多你没见过的全新玩法,有能力的赚点烟钱,还能偶尔沙城战斗!★

★承接推广★
★承接推广★

★承接推广★

☆六一新区开放-放置传奇☆

★六一新区开放-放置传奇★

★可白嫖 上班摸鱼类 放置文字传奇游戏(放置休闲)qq群756025698★

★三职业复古★开局送神装★爆率100%★散人逆袭★

★三职业复古★开局送神装★爆率100%★散人逆袭★

★〖双线〗〖无忧传奇〗〖每日新区〗〖开局送神装 100%高爆率 装备元宝打怪爆〗★

★承接推广★

★承接推广★

★承接推广★

★承接推广★

★承接推广★

★承接推广★

★DNF★全职业平衡★公益服★
★DNF★全职业平衡★公益服★

【dnf86版本】【怀旧服】【全职业平衡】【非变态服】【非商业服】【775016356】

★承接推广★

★承接推广★

★承接推广★

★梦幻16门派全新大唐九黎★

★梦幻16门派全新大唐九黎★

★★新增全新门派九黎城,★不做垃圾,力争什么都做到最好★持续更新,长久稳定★

★承接推广★

★承接推广★

★承接推广★

查看: 1362|回复: 1

[分享] [77M2] 传奇引擎 每日悬赏任务榜 脚本

[复制链接]
发表于 2015-6-24 10:40:32 | 显示全部楼层 |阅读模式

[77M2] 传奇引擎 每日悬赏任务榜 脚本

给会使用的朋友. 我不做任何解答. 77M2上手难度++++++

引擎的链接具体大家可以搜索一下 就不发类似广告的链接了.

unit G_TaskMgr;

{
悬赏任务设计规则:
  1.每日悬赏任务接取后,如果没提交,可以一直存在
  2.同时进行的悬赏任务置能有1个
  3.悬赏任务刷新及每日人物变量刷新均不重置当前悬赏任务
  4.每日人物变量刷新只重置当日任务完成量为0
  5.Player.Check[_P_CHECK_TASK]只在杀死怪物和获得物品的时候用来检查是否有悬赏任务在进行,任务本身的检查只检查任务ID是否存在  
}

interface
  uses Classes, SysUtils, Math, DateUtils, FastIniFile, DefiniensConst;

procedure Main(Npc: TNormNpc; Player: TPlayObject; Args: TArgs);
//刷新任务
procedure RefreshTask(Npc: TNormNpc; Player: TPlayObject; Args: TArgs);
//查看任务
procedure ViewTask(Npc: TNormNpc; Player: TPlayObject; Args: TArgs);
//领取一个任务
procedure SetTask(Npc: TNormNpc; Player: TPlayObject; Args: TArgs);
//撤销当前任务
procedure UnSetTask(Npc: TNormNpc; Player: TPlayObject; Args: TArgs);
//提交任务
procedure SubmitTask(Npc: TNormNpc; Player: TPlayObject; Args: TArgs);
//处理人物登陆的时候加载任务信息
procedure LoadMyTaskInfo(Player: TPlayObject);

implementation

type
    TTaskItem = class
      ID: Integer; //任务ID      
    _Type: Byte; //任务类型   
    Quality: Byte; //任务品质
    Level: Integer; //需要任务最低等级
    Rate: Byte; //出现概率
      Name:String; //任务名称
    MonItemName: String; //杀什么怪或递交什么物品
    MonItemNum: Integer; //怪的数量或物品数量
    MonItemQuality: Integer; //物品品质(肉品质、矿石品质)
    RGold: Integer; //奖励金币数量
    RGameGold: Integer; //奖励元宝数量
    RGift: Integer; //奖励礼金数量
    RExp: Integer; //奖励经验值  
    RItemName: String; //奖励物品名称
    RItemNum: Integer; //奖励物品数量   
    RBindItem: Boolean; //奖励的物品是否绑定
    RItemHour: Integer; //效期(小时,0为不限时)
    Desc: String; //任务描述
  end;
var
    TaskList: TList;
  
function FindTaskItem(ID: Integer): TTaskItem;
var
    I: Integer;
begin
    Result := nil;
  for I := 0 to TaskList.Count - 1 do
  begin
    if TTaskItem(TaskList[I]).ID = ID then
    begin   
        Result := TTaskItem(TaskList[I]);
      Break;
    end;
  end;
end;

procedure SetVarTaskID(Player: TPlayObject; Index, ID: Integer);
begin
  Player.VarInteger('每日任务'+ IntToStr(Index) +'ID').AsInteger := ID;
  Player.VarInteger('每日任务'+ IntToStr(Index) +'ID').Save;
end;

procedure SetVarTaskState(Player: TPlayObject; Index, State: Integer);
begin
  Player.VarInteger('每日任务'+ IntToStr(Index) +'状态').AsInteger := State;
  Player.VarInteger('每日任务'+ IntToStr(Index) +'状态').Save;  
end;

procedure SetVarLastRefreshTime(Player: TPlayObject; Value: TDateTime);
begin
  Player.VarDateTime('最后一次刷新任务时间').AsDateTime := Value;
  Player.VarDateTime('最后一次刷新任务时间').Save;  
end;

procedure SubmitSetVarTaskState(Player: TPlayObject);
var
  I: Integer;
begin
  //任务提交任务的时候将任务列表里面可提交的标识置为已提交
  //同一时间只有一个日常任务进行,当前任务可能不是任务列表里的,而是上一次列表刷新时候接的任务,但是任务列表里置为正在进行的任务一定是当前的任务
  for I := 1 to 4 do
  begin
    if Player.VarInteger('每日任务'+ IntToStr(I) +'状态').AsInteger = 1 then
    begin                     
      Player.VarInteger('每日任务'+ IntToStr(I) +'状态').AsInteger := 2;
      Player.VarInteger('每日任务'+ IntToStr(I) +'状态').Save;      
    end;
  end;
end;

procedure ClearVarTask(Player: TPlayObject);
begin
  //将个人变量中的任务数据清除
  SetVarTaskID(Player, 1, 0);
  SetVarTaskState(Player, 1, 0);
  SetVarTaskID(Player, 2, 0);
  SetVarTaskState(Player, 2, 0);
  SetVarTaskID(Player, 3, 0);
  SetVarTaskState(Player, 3, 0);
  SetVarTaskID(Player, 4, 0);
  SetVarTaskState(Player, 4, 0);
end;

procedure DoRefreshTask(Player: TPlayObject);
var
    I, Idx, SelRate: Integer;
  L: LongWord;
  ATaskItem: TTaskItem;
begin
    if not Player.Locked then //如果当前没处于锁定标记状态
  begin
    Player.Locked := True; //标记为锁定   
    try
      ClearVarTask(Player); //清除任务变量                                             
      if TaskList.Count > 0 then //如果任务库有数据
      begin
        I := 0;
        L := GetTickCount(); //记录当前开始时间
        Randomize; //初始化随机种子
        while True do
        begin      
          Idx := Random(TaskList.Count); //随机取一个任务库的序号
          ATaskItem := TTaskItem(TaskList[Idx]); //根据序号任务库取一条记录
          if (ATaskItem <> nil) and ((ATaskItem.Level = 0) or (Player.Level >= ATaskItem.Level)) then //如果任务存在,且任务的等级需求为0或人物的等级不低于任务的等级要求
          begin
            SelRate := Random(100); //取一个随机值
            if SelRate <= ATaskItem.Rate then //如果随机值小于这个任务的概率范围,则选取该任务
            begin
              SetVarTaskID(Player, I+1, ATaskItem.ID);  //设置一个任务ID
              SetVarTaskState(Player, I+1, 0); //设置一个任务状态         
              Inc(I);
              if I > 3 then //如果已经选取了4个任务则不再选取
                Break;
            end;
          end;      
          if GetTickCount - L > 100 then //如果100毫秒没完成4个任务的选择,则直接跳出
              Break;                  
        end;
        SetVarLastRefreshTime(Player, Now); //设置最后一次刷新时间为当前时间
      end;
    finally
      Player.Locked := False; //执行完成,取消锁定标记
    end;         
  end;
end;
  
function GetTaskInformation(Player: TPlayObject): String;
var
    I, Idx, Color: Integer;
  ATaskItem: TTaskItem;
  ALastTime: TDateTime;
begin
  //两个小时时间到后自动刷新  
  if DateUtils.MinutesBetween(Player.VarDateTime('最后一次刷新任务时间').AsDateTime, Now) >= 120{2小时刷新一次:2 * 60} then
    DoRefreshTask(Player);                                         
  
  //拼接可选任务
  for I := 0 to 3 do
  begin
    Idx := Player.VarInteger('每日任务'+ IntToStr(I+1) +'ID').AsInteger;
    ATaskItem := FindTaskItem(Idx);  
    if ATaskItem <> nil then
    begin      
      Color := 255;
      case ATaskItem.Quality of
        0: Color := 255;
        1: Color := 250;
        2: Color := 252;
        3: Color := 253;
      end;
      case Player.VarInteger('每日任务'+ IntToStr(I+1) +'状态').AsInteger of
        0{还没接}: Result := Result + Format('    <{S=%s;C=%d}/@ViewTask(%d, %d)>\', [ATaskItem.Name, Color, ATaskItem.ID, I + 1]);
        1{还没完}:
        begin   
          if Player.N[_P_TASK_JD] >= Player.P[_P_P_TASKNUM] then
            Result := Result + Format('    <{S=%s;C=%d}{S=(可提交);C=250}/@ViewTask(%d, %d)>\', [ATaskItem.Name, Color, ATaskItem.ID, I + 1])
          else
            Result := Result + Format('    <{S=%s;C=%d}{S=(进行中);C=249}/@ViewTask(%d, %d)>\', [ATaskItem.Name, Color, ATaskItem.ID, I + 1]);
        end;
        2{已提交}: Result := Result + Format('    <{S=%s;C=%d}{S=(已完成);C=250}/@ViewTask(%d, %d)>\', [ATaskItem.Name, Color, ATaskItem.ID, I + 1]);
      end;     
    end;
  end;         
  
  //拼接当前信息
  Result := Result + '{S=当前任务:;C=254;Y=88}\';
  if Player.N[_P_TASKID] > 0 then
  begin
    ATaskItem := FindTaskItem(Player.N[_P_TASKID]);
    if ATaskItem <> nil then
    begin
      Color := 255;
      case ATaskItem.Quality of
        0: Color := 255;
        1: Color := 250;
        2: Color := 252;
        3: Color := 253;
      end;
      if Player.N[_P_TASK_JD] >= Player.P[_P_P_TASKNUM] then
        Result := Result + Format('    <{S=%s;C=%d;Y=104}{S=(可提交);C=250;Y=104}/@ViewTask(%d, 0)>\', [ATaskItem.Name, Color, ATaskItem.ID])   
      else
        Result := Result + Format('    <{S=%s;C=%d;Y=104}/@ViewTask(%d, 0)>\', [ATaskItem.Name, Color, ATaskItem.ID]);   
    end;
  end
  else
      Result := Result + '    {S=无;Y=104}\';
  
  //拼接底部信息  
  ALastTime := Player.VarDateTime('最后一次刷新任务时间').AsDateTime;
  ALastTime := DateUtils.IncHour(ALastTime, 2);   
  Result := Result + '\<{S=关闭;Y=126}/@exit>   {S=下次刷新时间:'+FormatDateTime('MM月DD日hh时mm分', ALastTime)+';Y=126} <{S=(支付20元宝立即刷新);Y=126}/@@Question(确定支付20元宝立即刷新吗?,@RefreshTask)>';
end;

procedure ClearTask(Player: TPlayObject);
begin
  //永久数据处理
  Player.Check[_P_CHECK_TASKMON] := False; //设置为没任务状态
  Player.Check[_P_CHECK_TASKITEM] := False; //设置为没任务状态
  Player.N[_P_TASKID] := 0; //清空任务ID  
  Player.N[_P_TASK_JD] := 0;  //清空任务进度
  //临时数据处理  
  Player.S[_P_S_TASKMON] := ''; //清空任务需求名称  
  Player.S[_P_S_TASKNAME] := '';
  Player.P[_P_P_TASKNUM] := 0; //清空任务需求总数
end;

function GetBagItemCount(Player: TPlayObject; const ItemName: String; Quality: Integer): Integer;
var
    ItemIndex, I: Integer;
  StdItem: TStdItem;
  AHandled: Boolean;
begin
  Result := 0;
  AHandled := False;
  //检查有品质要求的肉或矿石   
  if Quality > 0 then
  begin
    ItemIndex := Gamelib.FindItemIndex(ItemName);  
    StdItem := Gamelib.FindStdItem(ItemIndex);
    if StdItem <> nil then
    begin      
      case StdItem.StdMode of
        40{肉}, 43{矿}:
        begin
          for I := 0 to Player.ItemSize - 1 do //循环包裹
          begin              
            if (Player.BagItem[I] <> nil) and (Player.BagItem[I].ItemIndex = StdItem.Index) then //找到包裹中和需求一样的物品
            begin              
              if Player.BagItem[I].Dura >= Quality * 1000 then //如果品质不低于要求
                Inc(Result); //找到的数量总和+1
            end;
          end;
          AHandled := True; //标识为已处理
        end;
      end;         
    end;
  end;  
  if not AHandled then //如果没标识为已处理
   Result := Player.GetItemCount(ItemName);
end;

procedure LoadMyTaskInfo(Player: TPlayObject);
var
    ATaskItem: TTaskItem;
begin
  Player.Check[_P_CHECK_TASKMON] := False;  
  Player.Check[_P_CHECK_TASKITEM] := False;  
  if Player.N[_P_TASKID] > 0 then
  begin
    ATaskItem := FindTaskItem(Player.N[_P_TASKID]);
    if ATaskItem <> nil then
    begin                                       
        //将任务系统需要的临时变量读出来
      case ATaskItem._Type of
        0: Player.Check[_P_CHECK_TASKMON] := True;
        1:
        begin
          Player.Check[_P_CHECK_TASKITEM] := True;
          Player.N[_P_TASK_JD] := GetBagItemCount(Player, ATaskItem.MonItemName, ATaskItem.MonItemQuality); //物品任务需要重新核对持有数量
        end;
      end;
      Player.S[_P_S_TASKNAME] := ATaskItem.Name;
      Player.S[_P_S_TASKMON] := ATaskItem.MonItemName;
      Player.P[_P_P_TASKType] := ATaskItem._Type;
      Player.P[_P_P_TASKNUM] := ATaskItem.MonItemNum;
      Player.P[_P_P_TASKQA] := ATaskItem.MonItemQuality;
      Player.SendMessage(Format('当前正在进行每日悬赏任务:%s(%d/%d)', [ATaskItem.Name, Player.N[_P_TASK_JD], Player.P[_P_P_TASKNUM]]), 0);
    end
    else
    begin      
        //如果没找到任务项,则直接删除任务
      ClearTask(Player);
    end;
  end;
end;

procedure Main(Npc: TNormNpc; Player: TPlayObject; Args: TArgs);
begin            
    if Player.N[_P_XSCS] < Daily_Task_Max then
    Npc.Say(Player, GetTaskInformation(Player))
  else
      Npc.Say(Player, '你已经完成了今日的日常任务!!!');
end;

procedure RefreshTask(Npc: TNormNpc; Player: TPlayObject; Args: TArgs);
begin
  if Player.GameGold >= 20 then
  begin                 
    if Player.N[_P_XSCS] < Daily_Task_Max then
    begin   
      //支付元宝主动刷新
      DoRefreshTask(Player);
      Player.GameGold := Player.GameGold - 20;
      Player.GoldChanged;
      Main(Npc, Player, Args);      
    end
    else
      Npc.MessageBox(Player, '今日悬赏任务已完成,刷新失败!!!');
  end
  else
      Npc.MessageBox(Player, '你的元宝不足以支付刷新费用。。。');
end;

procedure ViewTask(Npc: TNormNpc; Player: TPlayObject; Args: TArgs);
var
    AIdx: Integer;   
  ATaskItem: TTaskItem;
begin
  //本函数要求传入两个参数,第一个为任务ID,第二个为玩家4个悬赏任务中的第几个任务
  ATaskItem := FindTaskItem(Args.Int[0]);  
  AIdx := Args.Int[1];
  if ATaskItem <> nil then
  begin
    case AIdx of
      0{当前进行中的任务,可能没在4个任务列表中}:
      begin
        Npc.Say(Player, ATaskItem.Desc + '\<{S=提交任务;Y=126}/@SubmitTask('+ IntToStr(AIdx) +')>  <{S=撤销任务;Y=126}/@UnSetTask>  <{S=返回;Y=126}/@main>')         
      end;
      1..4{当前任务列表的内容}:
      begin
        case Player.VarInteger('每日任务'+ IntToStr(AIdx) +'状态').AsInteger of
          0{还没接}: Npc.Say(Player, ATaskItem.Desc + '\<{S=接受;Y=126}/@SetTask('+IntToStr(ATaskItem.ID)+', '+ IntToStr(AIdx) +')>  <{S=返回;Y=126}/@main>');
          1{还没完}: Npc.Say(Player, ATaskItem.Desc + '\<{S=提交任务;Y=126}/@SubmitTask('+ IntToStr(AIdx) +')>  <{S=撤销任务;Y=126}/@UnSetTask>  <{S=返回;Y=126}/@main>');     
          2{已提交}: Npc.Say(Player, ATaskItem.Desc + '\<{S=返回;Y=126}/@main>');
        end;  
      end;
    end;        
  end
  else
      Npc.MessageBox(Player, '任务不存在');
end;

procedure SetTask(Npc: TNormNpc; Player: TPlayObject; Args: TArgs);
var
    TaskID, MyTaskIdx: Integer;  
  ATaskItem: TTaskItem;
begin
  if (Player.N[_P_XSCS] < Daily_Task_Max) then //如果没有达到最大完成次数
  begin
    if Player.N[_P_TASKID] = 0 then //如果当前不存在进行中的任务
    begin
      TaskID := Args.Int[0];
      MyTaskIdx := Args.Int[1];
      ATaskItem := FindTaskItem(TaskID);  
      if ATaskItem <> nil then
      begin           
        SetVarTaskState(Player, MyTaskIdx, 1);   
        Player.N[_P_TASKID] := TaskID; //记录任务ID
        Player.N[_P_TASK_JD] := 0; //将进度置为0   
        case ATaskItem._Type of
          0: Player.Check[_P_CHECK_TASKMON] := True;
          1:
          begin
            Player.Check[_P_CHECK_TASKITEM] := True;
            Player.N[_P_TASK_JD] := GetBagItemCount(Player, ATaskItem.MonItemName, ATaskItem.MonItemQuality); //物品任务需要重新核对持有数量
          end;
        end;         
        Player.S[_P_S_TASKNAME] := ATaskItem.Name; //记录任务名称
        Player.S[_P_S_TASKMON] := ATaskItem.MonItemName; //记录当前任务的需求
        Player.P[_P_P_TASKType] := ATaskItem._Type; //记录当前任务的类型  
        Player.P[_P_P_TASKNUM] := ATaskItem.MonItemNum;  
        Player.P[_P_P_TASKQA] := ATaskItem.MonItemQuality;  
        ViewTask(Npc, Player, Args); //跳转到接任务的界面        
      end
      else
      begin
        Npc.MessageBox(Player, '任务领取失败!!!');
        Debug(Format('玩家%s领取任务失败,任务ID:%d', [Player.Name, TaskID]));   
      end;
    end
        else
        Npc.MessageBox(Player, '当前有任务正在进行当中!!!');   
  end
  else
    Npc.MessageBox(Player, Format('今日已完成%d次悬赏任务!!!', [Daily_Task_Max]));
end;

procedure UnSetTask(Npc: TNormNpc; Player: TPlayObject; Args: TArgs);
var
    I: Integer;
begin
  //将任务列表中的正在进行的任务置为未领取状态
  for I := 1 to 4 do
  begin
    if Player.VarInteger('每日任务'+ IntToStr(I) +'状态').AsInteger = 1 then
    begin         
      Player.VarInteger('每日任务'+ IntToStr(I) +'状态').AsInteger := 0;
      Player.VarInteger('每日任务'+ IntToStr(I) +'状态').Save;      
    end;      
  end;
  //清空当前任务信息
  ClearTask(Player);  
  //到主界面  
  Main(Npc, Player, Args);
end;

procedure TakeTaskNeedItem(Npc: TNormNpc; Player: TPlayObject; const ItemName: String; Count, Quality: Integer);
var
  AHandled: Boolean;
    ItemIndex, I, nCount: Integer;
  StdItem: TStdItem;
begin
  AHandled := False;
  if Quality > 0 then
  begin
    ItemIndex := Gamelib.FindItemIndex(ItemName);  
    StdItem := Gamelib.FindStdItem(ItemIndex);
    if StdItem <> nil then
    begin         
      nCount := 0;
      case StdItem.StdMode of
        40{肉}, 43{矿}:
        begin
          for I := Player.ItemSize - 1 downto 0 do //循环包裹
          begin              
            if (Player.BagItem[I] <> nil) and (Player.BagItem[I].ItemIndex = StdItem.Index) then //找到包裹中和需求一样的物品
            begin      
              if Player.BagItem[I].Dura >= Quality * 1000 then //如果品质不低于要求
              begin   
                Npc.TakeItem(Player, Player.BagItem[I]); //收取
                Inc(nCount);
                if nCount = Count then
                    Break;
              end;
            end;
          end;
          AHandled := True; //标识为已处理
        end;
      end;         
    end;  
  end;
  if not AHandled then
    Npc.Take(Player, ItemName, Count);
end;

procedure SubmitTask(Npc: TNormNpc; Player: TPlayObject; Args: TArgs);
var
  ATaskItem: TTaskItem;
  AItemIndex: Integer;
  AStdItem: TStdItem;
  ACount: Integer;
  AItem: TUserItem;
  boHandle: Boolean;
begin
  if Player.N[_P_TASKID] > 0 then
  begin   
    boHandle := False;         
    case Player.P[_P_P_TASKType] of
      0: boHandle := Player.N[_P_TASK_JD] >= Player.P[_P_P_TASKNUM]; //杀怪任务直接检查已杀怪的数量
      1: boHandle := GetBagItemCount(Player, Player.S[_P_S_TASKMON], Player.P[_P_P_TASKQA]) >= Player.P[_P_P_TASKNUM]; //检查物品
    end;
    if boHandle then
    begin                           
        ATaskItem := FindTaskItem(Player.N[_P_TASKID]);
      //如果任务是物品,则收取任务物品
      if Player.P[_P_P_TASKType] = 1 then
        TakeTaskNeedItem(Npc, Player, Player.S[_P_S_TASKMON], Player.P[_P_P_TASKNUM], Player.P[_P_P_TASKQA]);        
        ClearTask(Player); //清空任务标记                       
      SubmitSetVarTaskState(Player); //设置任务列表里的任务状态
      Player.N[_P_XSCS] := Player.N[_P_XSCS] + 1;
      if ATaskItem <> nil then
      begin                        
        //发放奖励
        Player.Gold := Player.Gold + ATaskItem.RGold; //增加金币
        Player.GameGold := Player.GameGold + ATaskItem.RGameGold; //增加元宝
        Player.GamePoint := Player.GamePoint + ATaskItem.RGift; //增加礼金
        Player.GoldChanged;
        Player.AddExp(ATaskItem.RExp); //增加经验值
        //发放物品奖励
        if ATaskItem.RItemName <> '' then
        begin
            AItemIndex := Gamelib.FindItemIndex(ATaskItem.RItemName); //查找物品的数据库ID
            if AItemIndex > 0 then
          begin
            AStdItem := Gamelib.FindStdItem(AItemIndex); //取出物品定义
            if AStdItem <> nil then
            begin        
                ACount := Max(1, ATaskItem.RItemNum); //取出奖励物品的数量
              while True do
              begin                        
                AItem := Npc.GiveItemByIndex(Player, AItemIndex, True); //给玩家一个物品
                if AItem <> nil then
                begin
                  AItem.Bind := ATaskItem.RBindItem; //根据任务配置指定是否绑定
                  if ATaskItem.RItemHour > 0 then
                    AItem.MaxDate := DateUtils.IncHour(Now, ATaskItem.RItemHour); //将限时道具加上日期限制
                  if AStdItem.StdMode in [0,1,3,42] then   
                  begin   
                      //可叠加物品的数量是Dura
                    AItem.Dura := Min(AItem.DuraMax, ACount);
                    ACount := ACount - AItem.Dura;
                  end
                  else
                      ACount := ACount - 1;
                  Player.UpdateItem(AItem); //客户端更新物品
                  if ACount <= 0 then //如果数量发放完成则跳出
                    Break;
                end
                else
                    Break;
              end;
            end;
          end;
        end;  
        Main(Npc, Player, Args);
      end
      else
          Npc.MessageBox(Player, '任务提交出错,该任务已经不存在');
    end
    else
    begin                                                
        if Player.S[_P_S_TASKMON] = '*' then
        Npc.MessageBox(Player, Format('你当前任务还没完成,进度(%d/%d)', [Player.N[_P_TASK_JD], Player.P[_P_P_TASKNUM]]))   
      else
        Npc.MessageBox(Player, Format('你当前任务还没完成,进度(%s%d/%d)', [Player.S[_P_S_TASKMON], Player.N[_P_TASK_JD], Player.P[_P_P_TASKNUM]]));   
    end;
  end
  else
      Npc.MessageBox(Player, '你当前没有可提交的任务');
end;

procedure LoadAllTask;  
var
    AList,
    ASections: TStrings;
    Ini: TFastIniFile;
  ASection: String;
  ATaskItem: TTaskItem;
  I, ID, RndIdx: Integer;  
  ATmpList: TList;
begin
    TaskList := TList.Create;
  AList := Gamelib.TryGetResource('日常任务');
  if AList <> nil then
  begin
    Ini := TFastIniFile.CreateFromStrings(AList);
    Ini.InlineCommentsEnabled := False;  
    ASections := TStringList.Create;
    ATmpList := TList.Create;
    try                                                        
      Ini.ReadSections(ASections);
      for I := 0 to ASections.Count - 1 do //循环读取INI的各个任务配置段
      begin   
        ASection := ASections[I];
        ATaskItem := TTaskItem.Create;
        ATaskItem.Name := ASection;   
        ATaskItem.ID := I + 1;
        ATaskItem._Type := Ini.ReadInteger(ASection, '类型', 0);
        ATaskItem.Quality := Ini.ReadInteger(ASection, '品质', 0);
        ATaskItem.Level := Ini.ReadInteger(ASection, '要求等级', 0);
        ATaskItem.Rate := Ini.ReadInteger(ASection, '出现概率', 100);
        ATaskItem.MonItemName := Ini.ReadString(ASection, '需求', '');
        ATaskItem.MonItemNum := Ini.ReadInteger(ASection, '数量', 0);   
        ATaskItem.MonItemQuality := Ini.ReadInteger(ASection, '需求特质', 0);            
        ATaskItem.RGold := Ini.ReadInteger(ASection, '奖励金币', 0);
        ATaskItem.RGameGold := Ini.ReadInteger(ASection, '奖励元宝', 0);
        ATaskItem.RGift := Ini.ReadInteger(ASection, '奖励礼金', 0);
        ATaskItem.RExp := Ini.ReadInteger(ASection, '奖励经验', 0);
        ATaskItem.RItemName := Ini.ReadString(ASection, '奖励物品', '');  
        ATaskItem.RItemNum := Ini.ReadInteger(ASection, '奖励物品数量', 1);
        ATaskItem.RBindItem := Ini.ReadBoolean(ASection, '奖励物品绑定', False);
        ATaskItem.RItemHour := Ini.ReadInteger(ASection, '奖励物品效期', 0);      
        ATaskItem.Desc := Ini.ReadString(ASection, '描述', '');  
        ATmpList.Add(ATaskItem);  //将任务类增加到临时列表
      end;
               
      //将任务随机排序
      Randomize;
      while ATmpList.Count > 0 do
      begin
        RndIdx := Random(ATmpList.Count);
        TaskList.Add(ATmpList[RndIdx]);
        ATmpList.Delete(RndIdx);
      end;
    finally
      Ini.Free;
      ASections.Free;
      ATmpList.Free;
    end;
  end;
end;

procedure UnloadAllTask;
var
    I: Integer;
begin
  for I := 0 to TaskList.Count - 1 do
      TTaskItem(TaskList[I]).Free;
  TaskList.Free;
end;

initialization
  LoadAllTask;
  
finalization
    UnloadAllTask;

end.



发表于 2015-6-24 12:04:05 | 显示全部楼层
不明觉厉~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

本站内容如若侵犯到您的权益,请来电来函告知,我们会尽快处理!
联系QQ:1953150286,2251387361,123784736,免责申明

排行榜|联系我们|小黑屋|手机版|Archiver|游戏藏宝湾 |

GMT+8, 2025-5-29 13:24 , Processed in 0.062204 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表