home *** CD-ROM | disk | FTP | other *** search
/ The Devil's Doorknob BBS Capture (1996-2003) / devilsdoorknobbbscapture1996-2003.iso / Dloads / BBSONLIN / SUPDOM1.ZIP / MAINTAIN.DOM < prev    next >
Text File  |  1991-03-13  |  16KB  |  437 lines

  1. { for Dominions! version 2.00TC - October 1989 }
  2. { for Super Dominions v 0.10 - August 1990 }
  3.  
  4. {+!+!+!+!+!+!+!+!+!+!+ Maintenance Procedures  +!+!+!+!+!+!+!+!+!+!+!+!+}
  5.  
  6. procedure Production;
  7.  
  8.   Var
  9.     LoopPro, Owner_Temp : Integer;
  10.     Technology_Percent : Byte;
  11.  
  12.   Begin
  13.     print ('Producing goods');
  14.     for LoopPro := 1 to Number_of_Planets do
  15.     if (Planet[LoopPro].Owner > 0) and (Planet[LoopPro].Owner <= Number_of_Players) then
  16.       Begin
  17.         Owner_Temp := Planet[LoopPro].Owner;
  18.         Empire[Owner_Temp].Industry_Units :=
  19.            Empire[Owner_Temp].Industry_Units + RoundOff (Planet[LoopPro].Population / 1000 *
  20.            (Planet[LoopPro].Industry_Percent / 100) * sqrt(Planet[LoopPro].Industrial_Level));
  21.         Technology_Percent := 100 - Planet[LoopPro].Industry_Percent;
  22.         Empire[Owner_Temp].Technology_Units :=
  23.            Empire[Owner_Temp].Technology_Units + RoundOff (Planet[LoopPro].Population / 2500 *
  24.            (Technology_Percent / 100) * sqrt(Planet[LoopPro].Industrial_Level));
  25.       End;
  26.   End;
  27.  
  28.  
  29. procedure Reproduce;
  30.  
  31.   Var
  32.    LoopRep : Integer;
  33.  
  34.   Begin
  35.     print ('Increasing populations');
  36.     for LoopRep := 1 to Number_of_Planets do
  37.       Begin
  38.         if (Planet[LoopRep].Owner > 0) and (Planet[LoopRep].Owner <= Number_of_Players) then
  39.            Planet[LoopRep].Population := RoundOff (Planet[LoopRep].Population *
  40.            (Planet[LoopRep].Habitability / 1000 + 1.05));
  41.         if (Planet[LoopRep].Owner = 0) or (Planet[LoopRep].Owner = 31) then
  42.            Planet[LoopRep].Population := RoundOff (Planet[LoopRep].Population *
  43.            (Planet[LoopRep].Habitability / 2000 + 1.05));
  44.      End;
  45.   End;
  46.  
  47. procedure Change_Date;
  48.  
  49.   Var
  50.    NewDate_File : File of Integer;
  51.  
  52.   Begin
  53.     print ('Changing Date');
  54.     CurMonth := CurMonth + 1;
  55.     if CurMonth = 13 then
  56.       Begin
  57.         Year := Year + 1;
  58.         CurMonth := 1;
  59.       End;
  60.   End;
  61.  
  62. procedure Change_Happenings;
  63.  
  64.   Var
  65.    Happenings_File : Text;
  66.  
  67.   Begin
  68.     print ('Updating Happenings');
  69.     assign (Happenings_File, 'Yesterda.Dom');
  70.     Erase (Happenings_File);
  71.     Add_On (' ');
  72.     assign (Happenings_File, 'Today.Dom');
  73.     Rename (Happenings_File, 'Yesterda.Dom');
  74.     assign (Happenings_File, 'Today.Dom');
  75.     rewrite (Happenings_File);
  76.     write (Happenings_File, Month[CurMonth],' ',Year, ^M, ^J);
  77.     write (Happenings_File, '~~~~~~~~~~~~~', ^M, ^J);
  78.     close (Happenings_File);
  79.   End;
  80.  
  81. procedure Determine_Losses (Attack_Damage,Defense_Damage,LoopMS,Destination : Integer);
  82.  
  83.   Var
  84.    LoopDL, Which_Lost, Total_Ships : Integer;
  85.    Which_Type_Lost : Byte;
  86.    k : real;
  87.  
  88.   Begin
  89.     Repeat
  90.      with Squadron[LoopMS] do
  91.       Total_Ships := Ships[1]+Ships[2]+Ships[3]+Ships[4]+Ships[5]+Ships[6]+Ships[7];
  92.      Which_Lost := Random(Total_Ships) + 1;
  93.      with Squadron[LoopMS] do
  94.        Begin
  95.          if Which_Lost <= Ships[1] then Which_Type_Lost := 1;
  96.          total_ships:=ships[1];
  97.          for LoopDL := 2 to Number_of_Ships do
  98.            Begin
  99.              if (Which_Lost>Total_Ships) and (Which_Lost<=Total_Ships+Ships[LoopDL]) then
  100.                Which_Type_Lost := LoopDL;
  101.              Total_Ships := Total_Ships + Ships[LoopDL];
  102.            End;
  103.        end;
  104.      k := Random(100);
  105.      if k <= Defense_Damage / Ship_Damage[Which_Type_Lost] * 100 then
  106.         Squadron[LoopMS].Ships[Which_Type_Lost] :=
  107.         Squadron[LoopMS].Ships[Which_Type_Lost] - 1;
  108.      Defense_Damage := Defense_Damage - Ship_Damage[Which_Type_Lost];
  109.      if (Squadron[LoopMS].Ships[1] = 0) and (Squadron[LoopMS].Ships[2] = 0)
  110.         and (Squadron[LoopMS].Ships[3] = 0) and (Squadron[LoopMS].Ships[4] = 0)
  111.         and (Squadron[LoopMS].Ships[5] = 0) and (Squadron[LoopMS].Ships[6] = 0)
  112.         and (Squadron[LoopMS].Ships[7] = 0)
  113.         then Defense_Damage := 0
  114.     Until Defense_Damage < 1;
  115.  
  116.     Repeat
  117.      with Planet[Destination] do
  118.       Total_Ships := Ships[1]+Ships[2]+Ships[3]+Ships[4]+Ships[5]+Ships[6]+Ships[7]+Defense_Bases;
  119.      Which_Lost := Random(Total_Ships) + 1;
  120.      with Planet[Destination] do
  121.        Begin
  122.          if Which_Lost > (Total_Ships - Defense_Bases) then  { PDB Hit }
  123.            begin
  124.             if (Attack_Damage / PDB_Damage) > 0.75 then
  125.               Defense_Bases := Defense_Bases - 1;
  126.             Attack_Damage := Attack_Damage - PDB_Damage;
  127.            end
  128.             else
  129.            begin
  130.             if Which_Lost <= Ships[1] then Which_Type_Lost := 1;
  131.             Total_Ships := Ships[1];
  132.             for LoopDL := 2 to Number_of_Ships do
  133.               Begin
  134.                 if (Which_Lost>Total_Ships) and (Which_Lost<=Total_Ships+Ships[LoopDL]) then
  135.                   Which_Type_Lost := LoopDL;
  136.                 Total_Ships := Total_Ships + Ships[LoopDL];
  137.               end;
  138.             k := Random(100);
  139.             if k <= Attack_Damage / Ship_Damage[Which_Type_Lost] * 100 then
  140.               Planet[Destination].Ships[Which_Type_Lost] := Planet[Destination].Ships[Which_Type_Lost] - 1;
  141.             Attack_Damage := Attack_Damage - Ship_Damage[Which_Type_Lost];
  142.            end;
  143.      if (Ships[1] = 0) and (Ships[2] = 0)
  144.         and (Ships[3] = 0) and (Ships[4] = 0)
  145.         and (Ships[5] = 0) and (Ships[6] = 0)
  146.         and (Ships[7] = 0)
  147.         then Attack_Damage := 0;
  148.        End;
  149.     Until Attack_Damage < 1;
  150.   End;
  151.  
  152.  procedure New_Owner (Which_Planet, Owner, ExOwner : Integer);
  153.  
  154.    Begin
  155.  
  156.      if Planet[Which_Planet].Radar = 1 then
  157.     Empire[ExOwner].Radars[1] := Empire[ExOwner].Radars[1] - 1;
  158.      if Planet[Which_Planet].Radar = 2 then
  159.     Empire[ExOwner].Radars[2] := Empire[ExOwner].Radars[2] - 1;
  160.      if Planet[Which_Planet].Radar = 3 then
  161.     Empire[ExOwner].Radars[3] := Empire[ExOwner].Radars[3] - 1;
  162.      Planet[Which_Planet].Radar := 0;
  163.  
  164.    End;
  165.  
  166. procedure Fight (Owner, LoopMS, Destination : Integer; Var Messages : Messagerecs);
  167.  
  168.   Var
  169.    Attack_Damage, Defense_Damage, LoopF, LoopRF, ExOwner, Winner : Integer;
  170.    temp_owner       : byte;
  171.  
  172.   Begin
  173.     Repeat
  174.       temp_owner := owner + 30;
  175.       Attack_Damage := 0;
  176.       Defense_Damage := 0;
  177.       Winner := 0;
  178.       for LoopRF := 1 to Number_of_Ships do
  179.         begin
  180.           if Squadron[LoopMS].Ships[LoopRF] > 0 then
  181.             for LoopF := 1 to Squadron[LoopMS].Ships[LoopRF] do
  182.               Attack_Damage := Attack_Damage + Random(Ship_Attack[LoopRF]+1)+Ship_Attack[LoopRF];
  183.           if Planet[Destination].Ships[LoopRF] > 0 then
  184.             for LoopF := 1 to Planet[Destination].Ships[LoopRF] do
  185.               Defense_Damage := Defense_Damage + Random(Ship_Defense[LoopRF]+1)+Ship_Defense[LoopRF];
  186.         end;
  187.         if Planet[Destination].Defense_Bases > 0 then
  188.             for LoopF := 1 to Planet[Destination].Defense_Bases do
  189.               Defense_Damage := Defense_Damage + Random(PDB_Defense+1)+PDB_Defense;
  190.       if (Planet[Destination].Ships[1] = 0) and (Planet[Destination].Ships[2] = 0)
  191.          and (Planet[Destination].Ships[3] = 0) and (Planet[Destination].Ships[4] = 0)
  192.          and (Planet[Destination].Ships[5] = 0) and (Planet[Destination].Ships[6] = 0)
  193.          and (Planet[Destination].Ships[7] = 0)
  194.          then Winner := temp_Owner;
  195.  
  196.       if Winner=0 then Determine_Losses(Attack_Damage,Defense_Damage,LoopMS,Destination);
  197.  
  198.       if (Planet[Destination].Ships[1] = 0) and (Planet[Destination].Ships[2] = 0)
  199.          and (Planet[Destination].Ships[3] = 0) and (Planet[Destination].Ships[4] = 0)
  200.          and (Planet[Destination].Ships[5] = 0) and (Planet[Destination].Ships[6] = 0)
  201.          and (Planet[Destination].Ships[7] = 0)
  202.          then Winner := temp_Owner;
  203.  
  204.       if (Squadron[LoopMS].Ships[1] = 0) and (Squadron[LoopMS].Ships[2] = 0)
  205.          and (Squadron[LoopMS].Ships[3] = 0) and (Squadron[LoopMS].Ships[4] = 0)
  206.          and (Squadron[LoopMS].Ships[5] = 0) and (Squadron[LoopMS].Ships[6] = 0)
  207.          and (Squadron[LoopMS].Ships[7] = 0)
  208.          then Winner := Destination;
  209.  
  210.     Until Winner > 0;
  211.  
  212.     if Winner = Destination then
  213.       Begin
  214.         if (Planet[Destination].Owner > 0) and (Planet[Destination].Owner < 31) then
  215.          begin
  216.           Send_Message (0,Planet[Destination].Owner,Empire[Owner].Empire_Name+' attacked planet '+St(Destination),Messages);
  217.           Send_Message (0,Owner,'You were defeated by #' +
  218.                                  st(Planet[Destination].Owner) +
  219.                                  ' at planet '+St(Destination),Messages);
  220.           Add_On (Empire[Owner].Empire_Name + ' [' + St(Owner) +
  221.                   '] was defeated by #' + st(Planet[Destination].Owner) +
  222.                   ' at planet ' + St(Destination));
  223.          end
  224.         else
  225.          begin
  226.           Send_Message (0,Owner,'You were defeated at planet '+St(Destination),Messages);
  227.           Add_On (Empire[Owner].Empire_Name + ' [' + St(Owner) +   '] was defeated at planet ' + St(Destination));
  228.          end;
  229.         winner := 0;
  230.       End;
  231.     if Winner = temp_Owner then
  232.       Begin
  233.         if (Planet[Destination].Owner > 0) and (Planet[Destination].Owner < 31) then
  234.          begin
  235.           Send_Message (0,Planet[Destination].Owner,Empire[Owner].Empire_Name
  236.                          + ' captured planet '+St(Destination),Messages);
  237.           Send_Message (0,Owner,'You captured planet ' +St(Destination) +
  238.                         ' from #'+st(Planet[Destination].Owner)+'!',Messages);
  239.           Add_On (Empire[Owner].Empire_Name+' ['+St(Owner)+'] captured planet '
  240.                        +St(Destination) + ' from #' +
  241.                        st(Planet[Destination].Owner)+'!');
  242.          end
  243.         else
  244.          begin
  245.           Send_Message (0,Owner,'You captured planet ' +St(Destination) +
  246.                         '!',Messages);
  247.           Add_On (Empire[Owner].Empire_Name+' ['+St(Owner)+'] captured planet '
  248.                   +St(Destination) + '!');
  249.          end;
  250.         ExOwner := Planet[Destination].Owner;
  251.         Planet[Destination].Owner := Owner;
  252.         New_Owner (Destination, Owner, ExOwner);
  253.  
  254.       End;
  255.   End;
  256.  
  257. procedure Add_Ships(LoopMS, Destination : Integer);
  258.  
  259.   Var
  260.    LoopAS : Integer;
  261.  
  262.   Begin
  263.     for LoopAS := 1 to Number_of_Ships do
  264.       Planet[Destination].Ships[LoopAS]:=Planet[Destination].Ships[LoopAS]+Squadron[LoopMS].Ships[LoopAS];
  265.   End;
  266.  
  267. procedure Update_Empire_Stats;
  268.  
  269.   Var
  270.    LoopTES, LoopTES2, LoopTJ : Integer;
  271.  
  272.   Begin
  273.     print ('Update Empires');
  274.     for LoopTES := 1 to Number_of_Players do
  275.       Begin
  276.         Empire[LoopTES].Total_Population := 0;
  277.         Empire[LoopTES].Planets := 0;
  278.         for LoopTJ := 1 to Number_of_Ships do
  279.            Empire[LoopTES].Ships[LoopTJ] := 0;
  280.         for LoopTJ := 1 to Number_of_Radars do
  281.            Empire[LoopTES].Radars[LoopTJ] := 0;
  282.         Empire[LoopTES].Defense_Bases := 0;
  283.         Empire[LoopTES].Intel_Reports := 10;
  284.         for LoopTES2 := 1 to Number_of_Squads do
  285.           with Squadron[LoopTES2] do
  286.             Begin
  287.               if Owner = LoopTES then
  288.                 for LoopTJ := 1 to Number_of_Ships do
  289.                    Empire[LoopTES].Ships[LoopTJ]:=Empire[LoopTES].Ships[LoopTJ]+Ships[LoopTJ];
  290.             End;
  291.         for LoopTES2 := 1 to Number_of_Planets do
  292.           Begin
  293.             if Planet[LoopTES2].Owner = LoopTES then
  294.               Begin
  295.                 Empire[LoopTES].Total_Population := Empire[LoopTES].Total_Population
  296.                  +Planet[LoopTES2].Population;
  297.                 Empire[LoopTES].Planets := Empire[LoopTES].Planets + 1;
  298.                 for LoopTJ := 1 to Number_of_Ships do
  299.                   Empire[LoopTES].Ships[LoopTJ] := Empire[LoopTES].Ships[LoopTJ]
  300.                    +Planet[LoopTES2].Ships[LoopTJ];
  301.                 Empire[LoopTES].Defense_Bases := Empire[LoopTES].Defense_Bases
  302.                    + Planet[LoopTES2].Defense_Bases;
  303.                 if Planet[LoopTES2].Radar > 0 then
  304.                    Empire[LoopTES].Radars[Planet[LoopTES2].Radar] :=
  305.                    Empire[LoopTES].Radars[Planet[LoopTES2].Radar] + 1; {-AtA.}
  306.               End;
  307.           End;
  308.       End;
  309.   End;
  310.  
  311. procedure Total_Scores;
  312.  
  313.   Var
  314.    LoopTS : Integer;
  315.  
  316.   Begin
  317.     print ('Scoring');
  318.     for LoopTS := 1 to Number_of_Players do
  319.      Empire[LoopTS].Points := Score (LoopTS);
  320.   End;
  321.  
  322. procedure Save_Status (Var Messages : Messagerecs);      { -AtA. }
  323.  
  324. Var
  325.    EmpireFile , OldEmpireFile : File of Empirerecord;
  326.    Loop_Empire : Integer;
  327.    PlanetFile , OldPlanetFile : File of Planetrecord;
  328.    Loop_Planet : Integer;
  329.  
  330. begin
  331.     print ('Saving Status');
  332.     assign (EmpireFile, 'Empires.dom');
  333.     assign (OldEmpireFile, 'oldempir.dom');
  334.     Rewrite (EmpireFile);
  335.     Rewrite (OldEmpireFile);
  336.     For Loop_Empire := 1 to Number_of_Players do
  337.     begin
  338.         Write (EmpireFIle,Empire[Loop_Empire]);
  339.         Write (OldEmpireFile,Empire[Loop_Empire]);
  340.     End;
  341.     Close (EmpireFile);
  342.     Close (OldEmpireFile);
  343.  
  344.     assign (PlanetFile, 'Planets.dom');
  345.     assign (OldPlanetFile, 'oldplnts.dom');
  346.     Rewrite (PlanetFile);
  347.     Rewrite (OldPlanetFile);
  348.     For Loop_Planet := 1 to Number_of_Planets do
  349.     begin
  350.         Write (PlanetFIle,Planet[Loop_Planet]);
  351.         Write (OldPlanetFile,Planet[Loop_Planet]);
  352.     End;
  353.     Close (PlanetFile);
  354.     Close (OldPlanetFile);
  355.  
  356.     Save_Messages (Messages);
  357.     Save_Fleets;
  358.     Save_Info;
  359.   End;
  360.  
  361.  
  362. procedure Arrived (Owner, LoopMS, Destination : Integer; Var Messages: Messagerecs);
  363.  
  364.   Var LoopARR : Integer;
  365.  
  366.   Begin
  367.  
  368.     if Planet[Destination].Owner <> Owner then Fight(Owner, LoopMS, Destination, Messages);
  369.     if Planet[Destination].Owner = Owner then Add_Ships(LoopMS, Destination);
  370.     with squadron[loopms] do
  371.       begin
  372.         destination := 0;
  373.         planet_from := 0;
  374.         owner := 0;
  375.         speed := 0;
  376.         distance_left := 0;
  377.         for LoopARR := 1 to Number_of_Ships do Ships[LoopARR] := 0;
  378.       end;
  379.   End;
  380.  
  381. procedure Move_Squads(Var Messages : Messagerecs) ;
  382.  
  383.   Var
  384.    LoopMS, Start : Integer;
  385.    up : Boolean;
  386.  
  387.   Begin
  388.     print ('Moving Squadrons');
  389.     ansic(6);
  390.     print ('  Could take a few minutes...');
  391.     Start := Random(Number_Of_Squads) + 1;
  392.     if Random(100) > 50 then up := true
  393.       else up := false;
  394.     LoopMS := Start;
  395.     while true do
  396.     begin
  397.       with Squadron[LoopMS] do
  398.         if Owner > 0 then
  399.           Begin
  400.             print ('Moved Squadron '+ St(LoopMS));
  401.             Distance_Left := Distance_Left - Speed;
  402.             if Distance_Left <= 0 then
  403.                Arrived(Owner, LoopMS, Destination, Messages);
  404.           End;
  405.       if up then LoopMS := LoopMS + 1
  406.         else LoopMS := LoopMS - 1;
  407.       if LoopMS = Start then
  408.          Exit;
  409.       if LoopMS = 0 then LoopMS := Number_of_Squads;
  410.       if LoopMS = Number_of_Squads + 1 then LoopMS := 1;
  411.     end;
  412.   End;
  413.  
  414. procedure Maintenence;
  415.  Var
  416.     Messages: Messagerecs;
  417.  
  418.   Begin
  419.     cls;
  420.     writeln;
  421.     print ('Maintenance Program is now running...');
  422.     print ('Simply amazing what we''re willing to');
  423.     print ('do for you users.');
  424.     writeln;
  425.     Load_Messages (Messages);
  426.     Production;
  427.     Reproduce;
  428.     Change_Date;
  429.     Change_Happenings;
  430.     Move_Squads(Messages);
  431.     Update_Empire_Stats;
  432.     Total_Scores;
  433.     Save_Status(Messages);
  434.     writeln;
  435.     print ('All done!');
  436.   End;
  437.