unit uHCDateTime;

interface

uses
  Classes, uHCTypeDefs, uHCDefines;

function HCDateTimeInc(dtIn: THCDateTimeRec; incSecs: long): THCDateTimeRec;

implementation


{*** Take a date & time, add game time elapsed # of seconds to it ***}
function HCDateTimeInc(dtIn: THCDateTimeRec; incSecs: long): THCDateTimeRec;
var
  dtOut: THCDateTimeRec;
  intC: long;
  month : array[0..11] of Integer; // ALE FPC only, not allowed in Delphi = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
begin
  Move(dtIn, dtOut, sizeof(dtOut));

  month[0] := 31; month[1]  := 28; month[2]  := 31;
  month[3] := 30; month[4]  := 31; month[5]  := 30;
  month[6] := 31; month[7]  := 31; month[8]  := 30;
  month[9] := 31; month[10] := 30; month[11] := 31;

  for intC := 0 to incSecs - (GAMESTARTTIME + 1) do
  begin
    // ALE 20150615 Increment the datetime by a second
    Inc(dtOut.second);
    if (dtOut.second > 59) then
    begin
      dtOut.second := 0;
      Inc(dtOut.minute);
      if (dtOut.minute > 59) then
      begin
        dtOut.minute := 0;
        Inc(dtOut.hour);
  	if (dtOut.hour > 23) then
        begin
          dtOut.hour := 0;
          Inc(dtOut.day); // ALE 20211228 we should increment day!
  	  // ALE 20150616 now we get into month logic
  	  if ((dtOut.year mod 4 = 0) AND ((dtOut.year mod 100 <> 0) OR (dtOut.year mod 400 = 0))) then
  	    month[2 - 1] := 29;
  	  if (dtOut.day > month[dtOut.month - 1]) then
  	  begin
  	    dtOut.day := 1;
  	    Inc(dtOut.month);
  	    if (dtOut.month > 12) then
  	    begin
  	      dtOut.month := 1; // ALE 20211228 from 0 to 1 for January
  	      Inc(dtOut.year);
  	    end;
  	  end;
  	end;
      end;
    end;
  end;
  result := dtOut;

end;

end.

