- 精华
- 阅读权限
- 180
- 好友
- 相册
- 分享
- 听众
- 收听
- 注册时间
- 2008-11-1
- 在线时间
- 小时
- 最后登录
- 1970-1-1
|
[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.
|
|