Skip to content

Commit

Permalink
теперь смотрятся все комнаты на предмет помощи. правильно отрабатываю…
Browse files Browse the repository at this point in the history
…т контракты при переключении режимов заводов.
  • Loading branch information
merlokk committed Jul 4, 2012
1 parent 708660b commit 39df13c
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 29 deletions.
17 changes: 13 additions & 4 deletions uGameItems.pas
Expand Up @@ -1747,13 +1747,26 @@ procedure TMFieldFactory.ChangeState(NewState: integer);

if NewState = STATE_ABANDONED then
begin
ContractOutput := ContractInput;
ContractInput := '';
OutputFill := InputFill;
InputFill := '';

State := STATE_ABANDONED;
end;

if NewState = STATE_WORK then
begin
if PutGameItem <> nil then
begin
ContractOutput := IntToStr(PutGameItem.ID);
ProcessEnd := PutGameItem.GetAttr('stage_length').AsInteger;
if ProcessEnd = 0 then
ProcessEnd := 1 * 60 * 60 * 1000;
end
else
ProcessEnd := 1 * 60 * 60 * 1000; // 1 hour - default
LastUpdate := Now;

State := STATE_WORK;
end;
Expand Down Expand Up @@ -1797,10 +1810,6 @@ procedure TMFieldFactory.Execute(canTick, canWork: boolean);
begin
elm := Qu.Add(Room.ID, ID, Name, faTick);
elm.ActionDT := GetProcessEndDT;
ContractOutput := ContractInput;
ContractInput := '';
OutputFill := InputFill;
InputFill := '';

ChangeState(STATE_ABANDONED);
end;
Expand Down
63 changes: 38 additions & 25 deletions uTasks.pas
Expand Up @@ -3,7 +3,7 @@
interface
uses
SysUtils, Variants, Types, Classes, IOUtils, Forms, XMLIntf, XMLDoc, StrUtils,
Windows, DateUtils, ShellAPI, pFIBQuery,
Windows, DateUtils, ShellAPI, pFIBQuery, Math,
uMPserv, uVK, uDB, uGameItems, uLogger, uQueue, uFactories,
uCalc, uDefs;

Expand Down Expand Up @@ -92,6 +92,8 @@ TMTaskCurRoomWork = class (TMTask)
end;

TMTaskWorkDispatcher = class (TMTask)
private
public
constructor Create; override;
procedure IntExecute; override;
end;
Expand Down Expand Up @@ -129,6 +131,9 @@ TMTaskProcessGifts = class (TMTask)
end;

TMTaskFriendHelp = class (TMTask)
private
FLastFriendHelp: TDateTime;
public
constructor Create; override;
procedure IntExecute; override;
end;
Expand Down Expand Up @@ -996,10 +1001,10 @@ procedure TMTaskWorkDispatcher.IntExecute;
begin
tr := world.GetRoom(i);
if tr <> nil then
sum := sum + tr.FieldsExecuteCount(true, true, 0, Now + 5 * OneMinute);
sum := sum + tr.FieldsExecuteCount(true, true, 0, Now + 7 * OneMinute);
end;

if sum = 0 then
if sum < 3 then
begin
FTaskExec.ExecuteTask(ttFriendHelp);
exit;
Expand Down Expand Up @@ -1372,6 +1377,7 @@ constructor TMTaskFriendHelp.Create;
begin
inherited;
SetTaskType(ttFriendHelp);
FLastFriendHelp := 0;
end;

procedure TMTaskFriendHelp.IntExecute;
Expand All @@ -1387,6 +1393,8 @@ procedure TMTaskFriendHelp.IntExecute;
HelpCount: integer;
begin
inherited;
// once per 10 minutes
if FLastFriendHelp + 10 * OneMinute > Now then exit;
HelpCount := 0;

world := TMWorld.GetInstance;
Expand All @@ -1401,30 +1409,33 @@ procedure TMTaskFriendHelp.IntExecute;
FriendWorld.LastHeader := world.LastHeader;
StartDT := Now;

RoomID := 0;
for i := 0 to length(world.Friends) - 1 do
for i := 0 to length(world.Friends) - 1 do // friends
if (world.Friends[i].ID <> OwnerID) and
world.Friends[i].NeedHelp and
FDB.CanHelpFriend(RoomID, world.Friends[i].ID) then
world.Friends[i].NeedHelp then
begin
HelpCount := HelpCount + 1;
sleep(1000);
if not FMPServ.GetUserStatFriend(FriendWorld, RoomID, LastFriend, world.Friends[i].ID, FQu)
then continue;

// calc work here
FQu.Clear;
FQu.CurrentXP := FriendWorld.LastHeader.Exp;
room := FriendWorld.GetRoom(RoomID);
if room <> nil then
room.FieldsHelp(50, world.Friends[i].ID);

// work finished
world.Friends[i].DisableHelp;
FDB.UpdateFriendHelp(room.ID, world.Friends[i].ID, FQu.Count, Now);
FQu.Trunc(FriendWorld.LastHeader.HelpPoints);

LastFriend := world.Friends[i].ID;
for RoomID := 0 to world.GetRoomCount - 1 do // rooms
if FDB.CanHelpFriend(RoomID, world.Friends[i].ID) then
begin
HelpCount := HelpCount + 1;
sleep(2000);
if not FMPServ.GetUserStatFriend(FriendWorld, RoomID, LastFriend, world.Friends[i].ID, FQu)
then continue;

// calc work here
FQu.Clear;
FQu.CurrentXP := FriendWorld.LastHeader.Exp;
room := FriendWorld.GetRoom(RoomID);
if room <> nil then
room.FieldsHelp(50, world.Friends[i].ID);

// work finished
world.Friends[i].DisableHelp;
FDB.UpdateFriendHelp(room.ID, world.Friends[i].ID, FQu.Count, Now);
FQu.Trunc(FriendWorld.LastHeader.HelpPoints);

LastFriend := world.Friends[i].ID;
FriendWorld.Clear;
end;

// only allowed 10 min of work time
if StartDT + 10 * OneMinute < Now then break;
Expand All @@ -1437,6 +1448,8 @@ procedure TMTaskFriendHelp.IntExecute;
FriendWorld.Free;
AddLog('Friend help completed. Helped ' + IntToStr(HelpCount) +
' friends from date ' + DateTimeToStr(StartDT) + '.');

FLastFriendHelp := Now;
end;

end.

0 comments on commit 39df13c

Please sign in to comment.