aimis.c

Go to the documentation of this file.
00001 /*
00002     Copyright (C) 2005 Michael K. McCarty & Fritz Bronner
00003 
00004     This program is free software; you can redistribute it and/or modify
00005     it under the terms of the GNU General Public License as published by
00006     the Free Software Foundation; either version 2 of the License, or
00007     (at your option) any later version.
00008 
00009     This program is distributed in the hope that it will be useful,
00010     but WITHOUT ANY WARRANTY; without even the implied warranty of
00011     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00012     GNU General Public License for more details.
00013 
00014     You should have received a copy of the GNU General Public License
00015     along with this program; if not, write to the Free Software
00016     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00017 */
00018 // Interplay's BUZZ ALDRIN's RACE into SPACE
00019 //
00020 // Formerly -=> LiftOff : Race to the Moon :: IBM version MCGA
00021 // Copyright 1991 by Strategic Visions, Inc.
00022 // Designed by Fritz Bronner
00023 // Programmed by Michael K McCarty
00024 //
00025 // AI Master Routines
00026 
00027 #include "Buzz_inc.h"
00028 #include "externs.h"
00029 
00030 struct cStr {i16 cost,sf,i;} Mew[5];
00031 int whe[2],rck[2];
00032 char pc[2],bc[2],Alt_A[2]={0,0},Alt_B[2]={0,0},Alt_C[2]={0,0};
00033 extern struct VInfo VAS[7][4];
00034 extern char VASqty;
00035 extern struct mStr Mis;
00036 extern enum Opponent_Status Cur_Status;
00037 void Strategy_One(char plr,int *m_1,int *m_2,int *m_3);
00038 void Strategy_Two(char plr,int *m_1,int *m_2,int *m_3);
00039 void Strategy_Thr(char plr,int *m_1,int *m_2,int *m_3);
00040 
00041 void AIVabCheck(char plr,char mis,char prog)
00042 {
00043   VASqty=0;
00044   //prog=1; 0=UnM : 1=1Mn ...
00045   GetMisType(mis);
00046   whe[0]=whe[1]=-1;
00047 
00048   if (prog==5) {
00049     if(Mis.Jt==0 && Mis.LM==0 && Mis.Doc==0) {
00050       BuildVAB(plr,mis,1,0,prog-1);
00051       CalcSaf(plr,VASqty);
00052       whe[0]=Best();
00053       if (Mew[whe[0]].i<60) whe[0]=0;  // Weed out low safety's
00054     }
00055   }
00056   else if (prog>=Mis.mEq && (prog!=0)) // && (Mis.mVab[0]&0x80 || Mis.mVab[1]&0x80)) )
00057   {
00058     if (Mis.Jt==1) {                        // Joint mission
00059       BuildVAB(plr,mis,1,0,prog-1);           // first launch
00060       CalcSaf(plr,VASqty);
00061       whe[0]=Best();
00062       if (Mew[whe[0]].i<60) whe[0]=0;
00063 
00064       BuildVAB(plr,mis,1,1,prog-1);
00065       CalcSaf(plr,VASqty);
00066       whe[1]=Best();
00067       if (Mew[whe[1]].i<60) whe[1]=0;  // Weed out low safety's
00068     } else {
00069      // RectFill(100,100,200,190,5);
00070      // PrintAt(110,110,"MIS ");DispNum(0,0,mis);
00071      // PrintAt(110,120,"PRG ");DispNum(0,0,prog);
00072      // PauseMouse();
00073 
00074       BuildVAB(plr,mis,1,0,prog-1);
00075 //        PrintAt(110,130,"VAS ");DispNum(0,0,VASQTY);
00076       CalcSaf(plr,VASqty);
00077       whe[0]=Best();
00078       if (Mew[whe[0]].i<60) whe[0]=0;
00079     }
00080   }
00081   else if (prog==0 && prog==Mis.mEq) {  // Unmanned Vechicle
00082     BuildVAB(plr,mis,1,0,prog);             //  plr,mcode,ty=1,part,prog
00083     CalcSaf(plr,VASqty);
00084     whe[0]=Best();
00085        // if (Mew[whe[0]].i<30) whe[0]=0;
00086    // ShowVA(whe[0]);
00087   }
00088   return;
00089 }
00090 
00091 char Best(void)
00092 {
00093   int i,j,ct,ct1;
00094   char valid[5];
00095   for (i=0;i<5;i++) valid[i]=0;
00096 
00097   for (i=1;i<VASqty+1;i++) {
00098     ct=ct1=0;
00099     for (j=0;j<4;j++) {
00100       if (strncmp("NONE",&VAS[i][j].name[0],4)!=0) ct1++;
00101       if (VAS[i][j].qty>=0) ct+=VAS[i][j].sf;
00102     }
00103     if (ct1>0) valid[i]= ct/ct1;
00104   }
00105   ct1=0;
00106   for (i=1;i<VASqty+1;i++) ct1=(valid[i]>valid[ct1])?i:ct1;
00107   return ct1;
00108 }
00109 
00110 
00111 int ICost(char plr,char h,char i)
00112 {
00113   int cost=0;
00114   switch(h) {
00115     case 0: case 2:     // Capsules & LM's
00116        cost=cost+Data->P[plr].Manned[i].MaxRD-Data->P[plr].Manned[i].Safety;
00117        cost=cost/3.5;
00118        cost=cost*Data->P[plr].Manned[i].RDCost;
00119      if (Data->P[plr].Manned[i].Num<0) cost+=Data->P[plr].Manned[i].InitCost;
00120      if (Data->P[plr].Manned[i].Num==0) cost+=Data->P[plr].Manned[i].UnitCost;
00121      break;
00122     case 1:   // Kickers
00123        cost=cost+Data->P[plr].Misc[i].MaxRD-Data->P[plr].Misc[i].Safety;
00124        cost=cost/3.5;
00125        cost=cost*Data->P[plr].Misc[i].RDCost;
00126      if (Data->P[plr].Misc[i].Num<0) cost+=Data->P[plr].Misc[i].InitCost;
00127      if (Data->P[plr].Misc[i].Num==0) cost+=Data->P[plr].Misc[i].UnitCost;
00128      break;
00129     case 3:
00130      if (i<4) {
00131        cost=cost+Data->P[plr].Probe[i].MaxRD-Data->P[plr].Probe[i].Safety;
00132        cost=cost/3.5;
00133        cost=cost*Data->P[plr].Probe[i].RDCost;
00134        if (Data->P[plr].Probe[i].Num<0) cost+=Data->P[plr].Probe[i].InitCost;
00135        if (Data->P[plr].Probe[i].Num==0) cost+=Data->P[plr].Probe[i].UnitCost;
00136      } else {
00137        if (Data->P[plr].Misc[4].Num<0) cost+=Data->P[plr].Misc[4].InitCost;
00138        if (Data->P[plr].Misc[4].Num==0) cost+=Data->P[plr].Misc[4].UnitCost;
00139      }
00140      break;
00141     default: break;
00142   }
00143   return cost;
00144 }
00145 
00146 
00147 void CalcSaf(char plr,char vs)
00148 {
00149   int i,j,k,sum=0,co=0,t=0;
00150 
00151   for (i=0;i<14;i++) Mew[i].cost=Mew[i].sf=0; // Clear thing
00152 
00153     // Do first part
00154 
00155    for (j=1;j<vs+1;j++) {
00156       for (k=0;k<4;k++) {
00157     if (VAS[j][k].qty>=0) sum+=VAS[j][k].sf;
00158     if (strncmp("NONE",&VAS[j][k].name[0],4)!=0) t++;
00159     if (VAS[j][k].wt>0)  co+=ICost(plr,k,VAS[j][k].dex);
00160       }
00161       Mew[j].cost+=co; co=0;
00162       Mew[j].sf+=sum;  sum=0;
00163       if (t>0) Mew[j].i=Mew[j].sf/t; t=0;
00164    }
00165   return;
00166 }
00167 
00168 char Panic_Level(char plr,int *m_1,int *m_2)
00169 {
00170  // PANIC level manned docking/EVA/duration
00171  if (Alt_B[plr]<=1 && Data->P[plr].Track[1]==4 && PreChe(plr,24)==0 && PreChe(plr,26)==0 &&
00172      Data->P[plr].Mission[0].MissionCode!=15 && Data->P[plr].Mission[1].MissionCode!=20)
00173   {
00174    *m_1=15;*m_2=20;++Alt_B[plr];return(1);
00175   }
00176  // PANIC lunar pass/probe landing/lunar fly-by
00177  if (Data->P[plr].Track[1]==5 && !PreChe(plr,1) && !PreChe(plr,7) && Cur_Status==Ahead && Alt_A[plr]<=2)
00178   {
00179    *m_1=7;if (Data->P[plr].DurLevel<=2) *m_2=25;else *m_2=8;++Alt_A[plr];return(1);
00180   }
00181    // PANIC level duration/pass/lunar orbital/LM_pts
00182  return(0);
00183 }
00184 
00185 void Strategy_One(char plr,int *m_1,int *m_2,int *m_3)
00186 {
00187  //AI version 12/26/92
00188  switch(Data->P[plr].Track[1])
00189   {  
00190    case 0:// mission 26 -> if manned docking and eva  -> DurLevel+1
00191           *m_1=15;*m_2=15;++Data->P[plr].Track[1];*m_3=7;break;
00192    case 1:*m_1=15;if (PreChe(plr,26)==0) *m_2=20;else *m_2=14;++Data->P[plr].Track[1];*m_3=7;break;
00193    case 2:if (PreChe(plr,24) && PreChe(plr,26))
00194            {*m_1=25;*m_2=27;++Data->P[plr].Track[1];}
00195             else {*m_1=15;*m_2=20;++Data->P[plr].Track[1];}
00196           if (Data->P[plr].Probe[2].Safety>Data->P[plr].Probe[2].MaxRD-10)
00197            *m_3=8;
00198           break;
00199    case 3:*m_1=27;if (Cur_Status==Behind) *m_2=25;
00200           if (Data->P[plr].Probe[2].Safety>Data->P[plr].Probe[2].MaxRD-10)
00201            *m_3=8;
00202           ++Data->P[plr].Track[1];break;
00203    case 4:switch(Data->P[plr].DurLevel)
00204            {
00205             case 0: case 1:*m_1=25;*m_2=26;break;
00206             case 2:*m_1=27;*m_2=(Data->P[plr].Probe[1].Safety>=Data->P[plr].Probe[1].MaxRD-10)? 7: 15;*m_3=7;break;
00207             case 3: case 4:case 5:*m_1=15;*m_2=7;*m_3=8;++Data->P[plr].Track[1];break;
00208             default:break;
00209            }
00210           if (Data->P[plr].Cash<=0) Data->P[plr].Cash=0;
00211            Data->P[plr].Cash+=Data->P[plr].Rocket[2].InitCost+25;
00212           if (GenPur(plr,1,2)) RDafford(plr,1,2);
00213            else RDafford(plr,1,2);
00214           if (Data->P[plr].Rocket[2].Num>=0) Data->P[plr].Track[5]=1;
00215           Data->P[plr].Buy[1][2]=0;RDafford(plr,1,2);
00216           break;
00217    case 5:*m_1=43;if (Cur_Status==Behind) *m_2=46; 
00218           //lunar pass
00219           ++Data->P[plr].Track[1];
00220           break;
00221    case 6:if (Data->P[plr].Manned[6].Safety>Data->P[plr].Manned[6].MaxRD-10)
00222            *m_1=48; else *m_1=46; //lunar orbit
00223           ++Data->P[plr].Track[1];
00224           break;
00225    case 7:if (PreChe(plr,19)==0) {*m_1=43;Data->P[plr].Track[1]=6;}
00226            else if (PreChe(plr,20)==0 && Data->P[plr].Mission[0].MissionCode!=46) *m_1=46;
00227             else *m_1=48;
00228           ++Data->P[plr].Track[1];
00229           break;
00230    case 8:if (PreChe(plr,20)==0) {if (Cur_Status==Behind) *m_1=48;else *m_1=46;}
00231            else if (Data->P[plr].LMpts==0 && Data->P[plr].Mission[0].MissionCode!=48) *m_1=48;
00232             else *m_1=53;
00233           ++Data->P[plr].Track[1];
00234           break;
00235    case 9:if (Data->P[plr].Misc[4].Safety>=80)
00236            {
00237             switch(Data->P[plr].LMpts)
00238              {
00239               case 0:case 1:if (Data->P[plr].Mission[0].MissionCode==48) *m_1=53; 
00240                       else {*m_1=48;}break;
00241               case 2: case 3:*m_1=53;break;
00242               default:*m_1=53;break;
00243              }
00244            }
00245            else {
00246                *m_1=15;
00247                if (Data->P[plr].Misc[4].Safety<60) *m_2=14; else *m_2=15;
00248                }
00249           break;
00250      default:break;
00251     }
00252  return;
00253 }
00254 
00255 void Strategy_Two(char plr,int *m_1,int *m_2,int *m_3)
00256 {
00257  // AI version 12/28/92
00258  switch(Data->P[plr].Track[1])
00259   {  
00260    case 0:*m_1=15;*m_2=15;++Data->P[plr].Track[1];*m_3=7;break;
00261    case 1:*m_1=15;*m_2=14;++Data->P[plr].Track[1];*m_3=7;break;
00262    case 2:if (PreChe(plr,24) && PreChe(plr,26))
00263            {*m_1=25;*m_2=27;++Data->P[plr].Track[1];}
00264             else {*m_1=15;*m_2=20;++Data->P[plr].Track[1];}
00265           if (Data->P[plr].Probe[2].Safety>Data->P[plr].Probe[2].MaxRD-10)
00266            *m_3=8;
00267           break;
00268    case 3:*m_1=25;*m_2=27;
00269           if (Data->P[plr].Probe[2].Safety>Data->P[plr].Probe[2].MaxRD-10)
00270            *m_3=8;else *m_3=7;
00271           ++Data->P[plr].Track[1];break;
00272    case 4:switch(Data->P[plr].DurLevel)
00273            {
00274             case 0: case 1:*m_1=25;*m_2=26;*m_3=7;break;
00275             case 2:*m_1=27;*m_2=(Data->P[plr].Probe[1].Safety>=Data->P[plr].Probe[1].MaxRD-10)? 7: 15;*m_3=7;break;
00276             case 3: case 4:case 5:*m_1=15;*m_2=7;*m_3=8;++Data->P[plr].Track[1];break;
00277             default:break;
00278            }
00279           if (Data->P[plr].Cash<=0) Data->P[plr].Cash=0;
00280            Data->P[plr].Cash+=Data->P[plr].Rocket[2].InitCost+25;
00281           if (GenPur(plr,1,2)) RDafford(plr,1,2);
00282            else RDafford(plr,1,2);
00283           if (Data->P[plr].Rocket[2].Num>=0) Data->P[plr].Track[5]=1;
00284           Data->P[plr].Buy[1][2]=0;RDafford(plr,1,2);
00285           break;
00286    case 5:*m_1=43;if (Cur_Status==Behind) *m_2=46; 
00287           //lunar pass
00288           ++Data->P[plr].Track[1];
00289           break;
00290    case 6:if (Data->P[plr].Manned[6].Safety>Data->P[plr].Manned[6].MaxRD-10)
00291            *m_1=46; //lunar orbit
00292           ++Data->P[plr].Track[1];
00293           break;
00294    case 7:if (PreChe(plr,19)==0) {*m_1=43;Data->P[plr].Track[1]=6;}
00295            else if (PreChe(plr,20)==0 && Data->P[plr].Mission[0].MissionCode!=46) *m_1=46;
00296             else *m_1=48;
00297           ++Data->P[plr].Track[1];
00298           break;
00299    case 8:if (PreChe(plr,20)==0) {if (Cur_Status==Behind) *m_1=48;else *m_1=46;}
00300            else if (Data->P[plr].LMpts==0 && Data->P[plr].Mission[0].MissionCode!=48) *m_1=48;
00301             else *m_1=53;
00302           ++Data->P[plr].Track[1];
00303           break;
00304    case 9:if (Data->P[plr].Misc[4].Safety>=80)
00305            {
00306             switch(Data->P[plr].LMpts)
00307              {
00308               case 0:case 1:if (Data->P[plr].Mission[0].MissionCode==48) *m_1=53; 
00309                       else {*m_1=48;}break;
00310               case 2: case 3:*m_1=53;break;
00311               default:*m_1=53;break;
00312              }
00313            }
00314            else {
00315                *m_1=15;
00316                if (Data->P[plr].Misc[4].Safety<60) *m_2=14; else *m_2=15;
00317                }
00318           break;
00319      default:break;
00320     }
00321  return;
00322 }
00323 
00324 void Strategy_Thr(char plr,int *m_1,int *m_2,int *m_3)
00325 {
00326  //new version undated
00327  switch(Data->P[plr].Track[1])
00328   {  
00329    case 0:// mission 26 -> if manned docking and eva  -> DurLevel+1
00330           *m_1=15;*m_2=15;++Data->P[plr].Track[1];*m_3=7;break;
00331    case 1:*m_1=15;if (PreChe(plr,26)==0) *m_2=20;else *m_2=14;++Data->P[plr].Track[1];*m_3=7;break;
00332    case 2:if (PreChe(plr,24) && PreChe(plr,26))
00333            {*m_1=25;*m_2=27;++Data->P[plr].Track[1];}
00334             else {*m_1=15;*m_2=20;++Data->P[plr].Track[1];}
00335           if (Data->P[plr].Probe[2].Safety>Data->P[plr].Probe[2].MaxRD-10)
00336            *m_3=8;
00337           break;
00338    case 3:*m_1=27;if (Cur_Status==Behind) *m_2=25;
00339           if (Data->P[plr].Probe[2].Safety>Data->P[plr].Probe[2].MaxRD-10)
00340            *m_3=8;
00341           ++Data->P[plr].Track[1];break;
00342    case 4:switch(Data->P[plr].DurLevel)
00343            {
00344             case 0: case 1:*m_1=25;*m_2=26;break;
00345             case 2:*m_1=27;*m_2=(Data->P[plr].Probe[1].Safety>=Data->P[plr].Probe[1].MaxRD-10)? 7: 15;*m_3=7;break;
00346             case 3: case 4:case 5:*m_1=15;*m_2=7;*m_3=8;++Data->P[plr].Track[1];break;
00347             default:break;
00348            }
00349           if (Data->P[plr].Cash<=0) Data->P[plr].Cash=0;
00350            Data->P[plr].Cash+=Data->P[plr].Rocket[2].InitCost+25;
00351           if (GenPur(plr,1,2)) RDafford(plr,1,2);
00352            else RDafford(plr,1,2);
00353           if (Data->P[plr].Rocket[2].Num>=0) Data->P[plr].Track[5]=1;
00354           Data->P[plr].Buy[1][2]=0;RDafford(plr,1,2);
00355           break;
00356    case 5:*m_1=43;if (Cur_Status==Behind) *m_2=46; 
00357           //lunar pass
00358           ++Data->P[plr].Track[1];
00359           break;
00360    case 6:if (Data->P[plr].Manned[6].Safety>Data->P[plr].Manned[6].MaxRD-10)
00361            *m_1=46; //lunar orbit
00362           ++Data->P[plr].Track[1];
00363           break;
00364    case 7:if (PreChe(plr,19)==0) {*m_1=43;Data->P[plr].Track[1]=6;}
00365            else if (PreChe(plr,20)==0 && Data->P[plr].Mission[0].MissionCode!=46) *m_1=46;
00366             else *m_1=48;
00367           ++Data->P[plr].Track[1];
00368           break;
00369    case 8:if (PreChe(plr,20)==0) {if (Cur_Status==Behind) *m_1=48;else *m_1=46;}
00370            else if (Data->P[plr].LMpts==0 && Data->P[plr].Mission[0].MissionCode!=48) *m_1=48;
00371             else *m_1=53;
00372           ++Data->P[plr].Track[1];
00373           break;
00374    case 9:if (Data->P[plr].Misc[4].Safety>=80)
00375            {
00376             switch(Data->P[plr].LMpts)
00377              {
00378               case 0:case 1:if (Data->P[plr].Mission[0].MissionCode==48) *m_1=53; 
00379                       else {*m_1=48;}break;
00380               case 2: case 3:*m_1=53;break;
00381               default:*m_1=53;break;
00382              }
00383            }
00384            else {
00385                *m_1=15;
00386                if (Data->P[plr].Misc[4].Safety<60) *m_2=14; else *m_2=15;
00387                }
00388           break;
00389      default:break;
00390     }
00391  return;
00392 }
00393 
00394 void NewAI(char plr,char frog)
00395 {
00396  char i,spc[2],prg[2],P_pad,B_pad,hsf,Panic_Check=0;
00397  int mis1,mis2,mis3,val;
00398 
00399  spc[0] = 0; /* XXX check uninitialized */
00400 
00401  prg[0]=frog;
00402  mis1=mis2=mis3=P_pad=B_pad=0;
00403  GenPur(plr,2,frog-1);
00404  if (Data->P[plr].AILunar<4)
00405   {
00406     mis1=0;mis2=0;mis3=0;hsf=0;
00407     for(i=0;i<3;i++)
00408      if (Data->P[plr].Probe[hsf].Safety<=Data->P[plr].Probe[i].Safety) hsf=i;
00409    RDafford(plr,0,hsf);
00410     if (Data->P[plr].Probe[hsf].Safety<90)
00411      {
00412       if (GenPur(plr,0,hsf)) RDafford(plr,0,hsf);
00413         else RDafford(plr,0,hsf);
00414      }
00415    Data->P[plr].Misc[4].Num=2;
00416    Panic_Check=Panic_Level(plr,&mis1,&mis2);
00417   if (!Panic_Check)
00418    {
00419     if (Data->P[plr].Track[3]==1) Strategy_One(plr,&mis1,&mis2,&mis3);
00420      else if (Data->P[plr].Track[3]==2) Strategy_Two(plr,&mis1,&mis2,&mis3);
00421       else Strategy_Thr(plr,&mis1,&mis2,&mis3);
00422     if (mis1==53)
00423     switch(Data->P[plr].AILunar)
00424       {
00425        case 1:mis1=53; //Apollo behind Gemini
00426               if (frog==2 && (Data->P[plr].AISec==8 || Data->P[plr].AISec==9))
00427                {
00428                 val=Data->P[plr].AISec;
00429                 if (val<7) val=val-4;
00430                  else val=val-5;
00431                 if (Data->P[plr].Manned[val-1].Safety>=Data->P[plr].Manned[val-1].MaxRD-10)
00432                  {
00433                   mis2=53;
00434                   spc[0]=val;
00435                  }
00436                }
00437               break;
00438        case 2:mis1=55;mis2=0;break;
00439        case 3:mis1=56;mis2=0;break;
00440        default:break;
00441       }
00442    }
00443   }
00444  else
00445   {
00446    switch(Data->P[plr].Track[1])
00447     {
00448      case 0:mis1=25;mis2=20;++Data->P[plr].Track[1];break;
00449      case 1:mis1=25;mis2=25;++Data->P[plr].Track[1];break;
00450      case 2:if (Data->P[plr].Cash<=0) Data->P[plr].Cash=0;
00451             Data->P[plr].Cash+=Data->P[plr].Rocket[3].InitCost+25;
00452             if (GenPur(plr,1,3)) RDafford(plr,1,3);
00453               else RDafford(plr,1,3);
00454             if (Data->P[plr].Rocket[3].Num>=0) Data->P[plr].Track[5]=1;
00455             Data->P[plr].Buy[1][3]=0;RDafford(plr,1,3);
00456             mis1=25;++Data->P[plr].Track[1];break;
00457      case 3:switch(Data->P[plr].DurLevel)
00458              {
00459               case 0: case 1:mis1=25;mis2=25;break;
00460               case 2:mis1=25;mis2=7;++Data->P[plr].Track[1];break;
00461               case 3: case 4:case 5:mis1=7;mis2=7;++Data->P[plr].Track[1];break;
00462               default:break;
00463              }
00464             break;
00465      case 4:mis1=25;mis2=7;++Data->P[plr].Track[1];break;
00466      case 5:switch(Data->P[plr].DurLevel)
00467              {
00468               case 0:case 1:case 2:mis1=25;break;
00469               case 3:mis1=(PreChe(plr,18)==0) ? 26 : 25;break;
00470               case 4:case 5:if (PreChe(plr,1)==plr || PreChe(plr,7)==plr) mis1=43;
00471                              else {mis1=7;mis2=8;}
00472                      break;
00473               default:break;
00474              }
00475             ++Data->P[plr].Track[1];
00476             break;
00477      case 6:mis1=43;++Data->P[plr].Track[1];break;
00478      case 7:if (PreChe(plr,19)==0) mis1=43;
00479              else mis1=46;
00480             ++Data->P[plr].Track[1];
00481             break;
00482      case 8:mis1=46;++Data->P[plr].Track[1];break;
00483      case 9:if (PreChe(plr,20)==0) mis1=46;++Data->P[plr].Track[1];break;
00484      case 10:if (PreChe(plr,20)==0) mis1=46; else mis1=54;break;
00485      default:break;
00486     }
00487   };
00488  // unmanned/manned klugge
00489  if (mis1==14 && mis2==15) {mis2=15;mis1=14;};
00490  //lunar fly-by/probe landing klugge
00491  if (mis1==7 && mis2==7)
00492    if (Data->P[plr].Probe[2].Safety>Data->P[plr].Probe[2].MaxRD-15) mis2=8;
00493 
00494  GetMisType(mis1);
00495  // deal with lunar modules
00496  if (Mis.LM==1) {
00497    if (Data->P[plr].Track[2]>0)
00498      {
00499       if (GenPur(plr,2,Data->P[plr].Track[2])) RDafford(plr,2,Data->P[plr].Track[2]);
00500         else RDafford(plr,2,Data->P[plr].Track[2]);  }                     
00501    else
00502     {
00503      Data->P[plr].Track[2]=6;
00504      if (GenPur(plr,2,Data->P[plr].Track[2])) RDafford(plr,2,Data->P[plr].Track[2]);
00505         else RDafford(plr,2,Data->P[plr].Track[2]);
00506     }
00507  }
00508  if (Mis.Jt==1)
00509     { // JOINT LAUNCH
00510      P_pad=-1;
00511      if (Data->P[plr].Future[0].MissionCode==0 && Data->P[plr].LaunchFacility[0]==1 &&
00512       Data->P[plr].Future[1].MissionCode==0 && Data->P[plr].LaunchFacility[1]==1) P_pad=0;
00513      if (mis1>0)
00514       if (P_pad!=-1)
00515         AIFuture(plr,mis1,P_pad,(char *)&prg);
00516     }
00517     else
00518      { // SINGLE LAUNCH
00519       if (mis1==54) prg[0]=5;
00520       if (mis1==7 || mis1==8) prg[0]=0;
00521       B_pad=-1;P_pad=-1;
00522       if (Data->P[plr].Future[0].MissionCode==0 && Data->P[plr].LaunchFacility[0]==1) P_pad=0;
00523       if (Data->P[plr].Future[1].MissionCode==0 && Data->P[plr].LaunchFacility[1]==1)
00524        {if (P_pad==0) B_pad=1; else P_pad=1;}
00525       if (Data->P[plr].Future[2].MissionCode==0 && Data->P[plr].LaunchFacility[2]==1)
00526        {
00527         if (P_pad!=0 && B_pad!=1)
00528           {
00529            if (P_pad==1) B_pad=2; 
00530             else if (P_pad==0 && B_pad==-1) B_pad=2;
00531            else P_pad=2;
00532            }
00533         };
00534       if (mis1>0)
00535       {
00536          if (P_pad!=-1)
00537           AIFuture(plr,mis1,P_pad,(char *)&prg);
00538       }
00539       if (mis2>0)
00540         {
00541        if (mis2==7 || mis2==8) prg[0]=0;
00542          else prg[0]=frog;
00543        if (mis2==53) prg[0]=spc[0];
00544          if (B_pad!=-1)
00545           AIFuture(plr,mis2,B_pad,(char *)&prg);
00546         }
00547      if (mis3>0)
00548         {
00549        prg[0]=frog;
00550          if (B_pad!=-1)
00551           AIFuture(plr,mis3,2,(char *)&prg);
00552         }
00553      }
00554       if (Data->P[plr].Future[2].MissionCode==0 && Data->P[plr].LaunchFacility[2]==1)
00555         {
00556        if ((mis1==0 && frog==2 && (Data->P[plr].Manned[2].Safety>=Data->P[plr].Manned[2].MaxRD-10)) ||
00557          (Data->P[plr].Manned[3].Safety>=Data->P[plr].Manned[3].MaxRD-10))
00558           {
00559            if (PreChe(plr,27)==0 && PreChe(other(plr),27)==0) mis3=2;
00560             else if (PreChe(plr,18)==0 && PreChe(other(plr),18)==0) mis3=4;
00561            if (mis3==0) {
00562             if (PreChe(plr,27)==0 && PreChe(other(plr),27)==1) mis3=2;
00563              else if (PreChe(plr,18)==0 && PreChe(other(plr),18)==1) mis3=4;
00564        }
00565            frog=prg[0]=Data->P[plr].AISec-6;
00566           }
00567          if (mis3==0)
00568           if (mis1!=7 && mis1!=8)
00569            {
00570             if (mis1==7) mis3=8;
00571              else if (mis1==8) mis3=7;
00572               if (Data->P[plr].Probe[2].Safety>Data->P[plr].Probe[2].MaxRD-15)
00573                if (PreChe(plr,7)==0 || Data->P[plr].Misc[5].Safety<85)
00574                 {
00575                  if (mis3==0) mis3=8;
00576                 }
00577             if ((Data->P[plr].Probe[1].Safety>Data->P[plr].Probe[1].MaxRD-15) && mis3==0)
00578              { 
00579                 if (PreChe(plr,1)==0 && PreChe(other(plr),1)==0 && Data->P[plr].Mission[2].MissionCode!=7) mis3=7;
00580                else if (PreChe(plr,2)==0 && PreChe(other(plr),2)==0 && Data->P[plr].Mission[2].MissionCode!=11) mis3=11;
00581                 else if (PreChe(plr,3)==0 && PreChe(other(plr),3)==0 && Data->P[plr].Mission[2].MissionCode!=9) mis3=9;
00582                  else if (PreChe(plr,4)==0 && PreChe(other(plr),4)==0 && Data->P[plr].Mission[2].MissionCode!=10) mis3=10;
00583                 else if (PreChe(plr,5)==0 && PreChe(other(plr),5)==0 && Data->P[plr].Mission[2].MissionCode!=12) mis3=12;
00584                else if (PreChe(plr,6)==0 && PreChe(other(plr),6)==0 && Data->P[plr].Mission[2].MissionCode!=13) mis3=13;
00585               if (mis3==0)
00586                {
00587                 if (PreChe(plr,1)==0 && PreChe(other(plr),1)==1 && Data->P[plr].Mission[2].MissionCode!=7) mis3=7;
00588                  else if (PreChe(plr,2)==0 && PreChe(other(plr),2)==1 && Data->P[plr].Mission[2].MissionCode!=11) mis3=11;
00589                   else if (PreChe(plr,3)==0 && PreChe(other(plr),3)==1 && Data->P[plr].Mission[2].MissionCode!=9) mis3=9;
00590                    else if (PreChe(plr,4)==0 && PreChe(other(plr),4)==1 && Data->P[plr].Mission[2].MissionCode!=10) mis3=10;
00591                   else if (PreChe(plr,5)==0 && PreChe(other(plr),5)==1 && Data->P[plr].Mission[2].MissionCode!=12) mis3=12;
00592                  else if (PreChe(plr,6)==0 && PreChe(other(plr),6)==1 && Data->P[plr].Mission[2].MissionCode!=13) mis3=13;
00593                }
00594             }
00595          }
00596           if (mis3==0)
00597             {
00598              if (GenPur(plr,0,0)) RDafford(plr,0,0);
00599               else RDafford(plr,0,0);
00600              if (GenPur(plr,1,0)) RDafford(plr,1,0);
00601               else RDafford(plr,1,0);
00602              if (Data->P[plr].Probe[0].Num>=1 && Data->P[plr].Rocket[0].Num>=1) mis3=1;
00603             }
00604           if (mis3!=2 || mis3!=4) prg[0]=0;
00605           if (mis3>0) AIFuture(plr,mis3,2,(char *)&prg);
00606      }
00607  AILaunch(plr);
00608  return;
00609 }
00610 
00611 void AIFuture(char plr,char mis,char pad,char *prog)
00612 {
00613   int i,j;
00614   char prime,back,max,men;
00615   char fake_prog[2];
00616 
00617   if (prog == NULL) {
00618       memset (fake_prog, 0, sizeof fake_prog);
00619       prog = fake_prog;
00620   }
00621 
00622   GetMisType(mis);
00623 
00624   for (i=0;i<(Mis.Jt+1);i++) {
00625     Data->P[plr].Future[pad+i].MissionCode=mis;
00626     Data->P[plr].Future[pad+i].part=i;
00627     // duration
00628     if (Data->P[plr].DurLevel<=5 && Data->P[plr].Future[pad+i].Duration==0) {
00629       if (Mis.Dur==1) Data->P[plr].Future[pad+i].Duration=
00630         maxx(Mis.Days,minn(Data->P[plr].DurLevel+1,6)); 
00631       else Data->P[plr].Future[pad+i].Duration=Mis.Days;
00632     }
00633    if (Data->P[plr].Mission[0].Duration==Data->P[plr].Future[pad+i].Duration ||
00634        Data->P[plr].Mission[1].Duration==Data->P[plr].Future[pad+i].Duration)
00635        ++Data->P[plr].Future[pad+i].Duration;
00636 
00637    if (pad==1 && Data->P[plr].Future[0].Duration==Data->P[plr].Future[pad+i].Duration)
00638      ++Data->P[plr].Future[pad+i].Duration;
00639 
00640    if (Data->P[plr].Future[pad+i].Duration>=6)
00641      Data->P[plr].Future[pad+i].Duration=6;
00642 
00643    // one man capsule duration klugge
00644    if (Data->P[plr].Future[pad+i].Prog==1)
00645     {
00646     if (Data->P[plr].DurLevel==0) Data->P[plr].Future[pad+i].Duration=1;
00647       else Data->P[plr].Future[pad+i].Duration=2;
00648     }; // limit duration 'C' one man capsule
00649    // lunar mission klugge
00650    if (Mis.Lun==1 || Data->P[plr].Future[pad+i].MissionCode==55 ||
00651     Data->P[plr].Future[pad+i].MissionCode==56 || Data->P[plr].Future[pad+i].MissionCode==53) Data->P[plr].Future[pad+i].Duration=4;
00652    // unmanned duration klugge
00653    if (Mis.Days==0) Data->P[plr].Future[pad+i].Duration=0;
00654     Data->P[plr].Future[pad+i].Joint=Mis.Jt;
00655     Data->P[plr].Future[pad+i].Month=0;
00656    if (mis==1) prog[i]=0;
00657    Data->P[plr].Future[pad+i].Prog=prog[0];
00658     if (prog[i]>0 && Mis.Days>0)
00659       {
00660        for (j=1;j<6;j++) DumpAstro(plr,j);
00661        TransAstro(plr,prog[i]); //indexed OK
00662        if (Data->P[plr].Future[pad+i].PCrew!=0)
00663          prime=Data->P[plr].Future[pad+i].PCrew-1; else prime=-1;
00664        if (Data->P[plr].Future[pad+i].BCrew!=0)
00665          back=Data->P[plr].Future[pad+i].BCrew-1; else back=-1;
00666        max=prog[i];
00667        if (prog[i]>3) max=prog[i]-1;
00668        Data->P[plr].Future[pad+i].Men=max;
00669        men= Data->P[plr].Future[pad+i].Men;
00670        if (prime!=-1)
00671          for (j=0;j<men;j++)
00672            Data->P[plr].Pool[Data->P[plr].Crew[prog[i]][prime][j]-1].Prime=0;
00673        if (back!=-1)
00674          for (j=0;j<men;j++)
00675            Data->P[plr].Pool[Data->P[plr].Crew[prog[i]][back][j]-1].Prime=0;
00676        Data->P[plr].Future[pad+i].PCrew=0;Data->P[plr].Future[pad+i].BCrew=0;
00677         pc[i]=-1;bc[i]=-1;
00678        for (j=0;j<8;j++)
00679          if (pc[i]==-1 && Data->P[plr].Crew[prog[i]][j][0]!=0 && Data->P[plr].Pool[Data->P[plr].Crew[prog[i]][j][0]-1].Prime==0)
00680           pc[i]=j;
00681        if (pc[i]==-1)
00682          {
00683          // astronaut/duration klugge
00684           if (Mis.Days>0) Data->P[plr].Future[pad+i].Men=max;
00685           // no astronauts available have to go unmanned
00686           Data->P[plr].Future[pad+i].Men=0;
00687           Data->P[plr].Future[pad+i].PCrew=0;
00688           Data->P[plr].Future[pad+i].BCrew=0;
00689           return;
00690          }
00691        Data->P[plr].Future[pad+i].PCrew=pc[i]+1;
00692        bc[i]=-1;
00693        for (j=0;j<8;j++)
00694           if (bc[i]==-1 && j!=pc[i] && Data->P[plr].Crew[prog[i]][j][0]!=0 && Data->P[plr].Pool[Data->P[plr].Crew[prog[i]][j][0]-1].Prime==0)
00695             bc[i]=j;
00696        Data->P[plr].Future[pad+i].BCrew=bc[i]+1;
00697        for (j=0;j<men;j++)
00698           Data->P[plr].Pool[Data->P[plr].Crew[prog[i]][pc[i]][j]-1].Prime=4;
00699        for (j=0;j<men;j++)
00700           Data->P[plr].Pool[Data->P[plr].Crew[prog[i]][bc[i]][j]-1].Prime=2;
00701       }
00702     else
00703       {
00704        Data->P[plr].Future[pad+i].Men=0;
00705        Data->P[plr].Future[pad+i].PCrew=0;
00706        Data->P[plr].Future[pad+i].BCrew=0;
00707       }
00708   }
00709  // joint mission 55 and 56 men klugge
00710  if (mis==55 || mis==56)
00711   {
00712    Data->P[plr].Future[pad+1].Men=Data->P[plr].Future[pad].Men;
00713    Data->P[plr].Future[pad+1].PCrew=Data->P[plr].Future[pad].PCrew;
00714    Data->P[plr].Future[pad+1].BCrew=Data->P[plr].Future[pad].BCrew;
00715    Data->P[plr].Future[pad+1].Prog=Data->P[plr].Future[pad].Prog;
00716    Data->P[plr].Future[pad].Men=0;Data->P[plr].Future[pad].PCrew=0;
00717    Data->P[plr].Future[pad].BCrew=0;Data->P[plr].Future[pad].Prog=0;
00718    Data->P[plr].Future[pad+1].Duration=Data->P[plr].Future[pad].Duration;
00719    Data->P[plr].Future[pad].Duration=0;
00720   }
00721  return;
00722 }
00723 
00724 char Search(char plr,char m)
00725 {
00726   return (Data->P[plr].M[m]);
00727 }
00728 
00729 void GetHard(char plr)
00730 {
00731  int bwgt[7],prwt[8],i;
00732  char rck;
00733  for (i=0;i<8;i++) {
00734    prwt[i]=(i<3) ? (Data->P[plr].Probe[i].UnitWeight) : Data->P[plr].Manned[i-3].UnitWeight;}
00735  for (i=0;i<7;i++) {
00736   bwgt[i]=(i>3) ?
00737        (Data->P[plr].Rocket[i-4].MaxPay+Data->P[plr].Rocket[4].MaxPay)
00738       : Data->P[plr].Rocket[i].MaxPay; }
00739  rck=-1;
00740  for (i=0;i<7;i++)
00741    if (rck==-1 && bwgt[i] > prwt[Data->P[plr].WList[0].Asp]) rck=i;
00742  if (rck<2) i=GenPur(plr,1,rck);
00743    else {i=GenPur(plr,1,4);i=GenPur(plr,1,rck-4);}
00744  return;
00745 }
00746 
00747 char BoostCheck(char plr)
00748 {
00749  char check = 0; /* XXX check unintialized */
00750  if (Data->P[plr].Rocket[4].Num>=2 && Data->P[plr].Rocket[4].Safety>75) check=1;
00751    else
00752     {
00753      if (Data->P[plr].Rocket[4].Num==2) RDafford(plr,1,4);
00754        else check=GenPur(plr,1,4);
00755      if (check==1) RDafford(plr,1,4);
00756      check=0;
00757     }
00758  return(check);
00759 }
00760 
00761 void Scheduler(char plr)
00762 {
00763  char mis,prim,z,i,tmoon[4][2];
00764  mis=Data->P[plr].WList[0].Vle;
00765  GetMisType(mis);
00766   if (Mis.Jt==1)
00767     { // JOINT LAUNCH
00768       prim=-1;
00769       for (i=0;i<2;i++)
00770         if (Data->P[plr].Future[i].MissionCode==0 && Data->P[plr].LaunchFacility[i]==1 &&
00771       Data->P[plr].Future[i+1].MissionCode==0 && Data->P[plr].LaunchFacility[i+1]==1) prim=i;
00772       if (prim!=-1)
00773         {
00774          tmoon[0][0]=Data->P[plr].WList[0].Asp;tmoon[0][1]=Data->P[plr].WList[0].Asp;tmoon[1][0]=Mis.Days;tmoon[1][1]=Mis.Days;
00775          AIFuture(plr,Data->P[plr].WList[0].Vle,prim,(char *)&tmoon[0]);
00776         }
00777     }
00778     else
00779       { // SINGLE LAUNCH
00780        z=-1;prim=-1;
00781        if (Data->P[plr].Future[0].MissionCode==0 && Data->P[plr].LaunchFacility[0]==1) prim=0;
00782        if (Data->P[plr].Future[1].MissionCode==0 && Data->P[plr].LaunchFacility[1]==1)
00783          {if (prim==0) z=1; else prim=1;}
00784        if (Data->P[plr].Future[2].MissionCode==0 && Data->P[plr].LaunchFacility[2]==1)
00785          {if (prim==1) z=2; else prim=2;}
00786        if (prim!=-1)
00787         {
00788          tmoon[0][0]=Data->P[plr].WList[0].Asp;tmoon[0][1]=-1;tmoon[1][0]=Mis.Days;tmoon[1][1]=-1;
00789          AIFuture(plr,Data->P[plr].WList[0].Vle,prim,(char *)&tmoon[0]);
00790         }
00791        if (z!=-1)
00792          if (Data->P[plr].WList[0].Vle>=1)
00793           {
00794            mis=Data->P[plr].WList[0].Vle;
00795            GetMisType(mis);
00796            tmoon[0][0]=Data->P[plr].WList[0].Asp;tmoon[0][1]=-1;tmoon[1][0]=Mis.Days;tmoon[1][1]=-1;
00797            AIFuture(plr,Data->P[plr].WList[0].Vle,z,(char *)&tmoon[0]);
00798           }
00799       }
00800  for (i=0;i<3;i++) if (Data->P[plr].Future[i].MissionCode==0) AIFuture(plr,1,i,0);
00801  return;
00802 }
00803 
00804 void AILaunch(char plr)
00805 {
00806   int i,j,k=0,l=0,JR=0,wgt,bwgt[7];
00807   char boos[7],bdex[7];
00808 
00809 
00810   for (i=0;i<7;i++) {
00811     bdex[i]=i;
00812     boos[i]=(i>3) ?
00813        (Data->P[plr].Rocket[i-4].Safety+Data->P[plr].Rocket[4].Safety)>>1
00814       : Data->P[plr].Rocket[i].Safety;
00815     bwgt[i]=(i>3) ?
00816        (Data->P[plr].Rocket[i-4].MaxPay+Data->P[plr].Rocket[4].MaxPay)
00817       : Data->P[plr].Rocket[i].MaxPay;
00818 
00819     if (boos[i]<60) boos[i]=-1;  // Get Rid of any Unsafe rkt systems
00820    if (Data->P[plr].Rocket[4].Num<1) for (j=4;j<7;j++)boos[j]=-1;
00821    for (j=0;j<4;j++) if (Data->P[plr].Rocket[j].Num<1) boos[j]=-1;
00822   }
00823 
00824   for (i=0;i<3;i++)
00825    {
00826      if (Data->P[plr].Mission[i].MissionCode==28 && Data->P[plr].DMod==0)
00827       {
00828        Data->P[plr].Mission[i].MissionCode=0;
00829        return;
00830       }
00831      if (Data->P[plr].Mission[i].MissionCode>0 && Data->P[plr].Mission[i].part==0)
00832      {
00833        whe[0]=whe[1]=-1;
00834        if (Data->P[plr].Mission[i].Joint==1) AIVabCheck(plr,Data->P[plr].Mission[i].MissionCode,Data->P[plr].Mission[i+1].Prog);
00835        else AIVabCheck(plr,Data->P[plr].Mission[i].MissionCode,Data->P[plr].Mission[i].Prog);
00836        if (whe[0]>0)
00837          {
00838           if (Data->P[plr].Mission[i].Prog==0) BuildVAB(plr,Data->P[plr].Mission[i].MissionCode,1,0,Data->P[plr].Mission[i].Prog);
00839            else BuildVAB(plr,Data->P[plr].Mission[i].MissionCode,1,0,Data->P[plr].Mission[i].Prog-1);
00840           for (j=Mission_Capsule; j <= Mission_Probe_DM; j++) 
00841                 Data->P[plr].Mission[i].Hard[j] = VAS[whe[0]][j].dex;
00842 
00843           wgt=0;for (j=0;j<4;j++) wgt+=VAS[whe[0]][j].wt;
00844           rck[0]=-1;
00845           for (k=0;k<7;k++)
00846           if (boos[k]!=-1 && bwgt[k]>=wgt) {
00847            if (rck[0]==-1) rck[0]=bdex[k];
00848              else if (boos[k]>= boos[rck[0]]) rck[0]=bdex[k];
00849           }
00850           if (rck[0]==-1) ClrMiss(plr,i-Data->P[plr].Mission[i].part);
00851            else
00852             {
00853              if (Data->P[plr].Mission[i].MissionCode==1) rck[0]=0;
00854           if (Data->P[plr].Mission[i].MissionCode>=7 &&
00855               Data->P[plr].Mission[i].MissionCode<=13) rck[0]=1;
00856           if (Data->P[plr].Mission[i].MissionCode==3) rck[0]=1;
00857           if (Data->P[plr].Mission[i].MissionCode==15) rck[0]=1;
00858              Data->P[plr].Mission[i].Hard[Mission_PrimaryBooster] = rck[0]+1;
00859             }
00860          }
00861        else
00862         {   // Clear Mission
00863          Data->P[plr].Mission[i].MissionCode=0;
00864         }
00865       // joint mission part
00866       if (whe[1]>0 && Data->P[plr].Mission[i+1].part==1)
00867         {
00868          if (Data->P[plr].Mission[i].Prog==0) BuildVAB(plr,Data->P[plr].Mission[i].MissionCode,1,1,Data->P[plr].Mission[i].Prog);
00869            else BuildVAB(plr,Data->P[plr].Mission[i].MissionCode,1,1,Data->P[plr].Mission[i].Prog-1);
00870          for (j=Mission_Capsule ; j <= Mission_Probe_DM; j++) 
00871             Data->P[plr].Mission[i+1].Hard[j] = VAS[whe[1]][j].dex;
00872          wgt=0;for (j=0;j<4;j++) wgt+=VAS[whe[1]][j].wt;
00873          rck[1]=-1;
00874          for (k=0;k<7;k++)
00875          if (boos[k]!=-1 && bwgt[k]>=wgt) {
00876            if (rck[1]==-1) rck[1]=bdex[k];
00877              else if (boos[k]>= boos[rck[1]]) rck[1]=bdex[k];
00878          }
00879          if (rck[1]==-1) rck[1]=Data->P[plr].Mission[i].Hard[Mission_PrimaryBooster]-1;
00880          Data->P[plr].Mission[i+1].Hard[Mission_PrimaryBooster]=rck[1]+1;
00881         }
00882      }
00883  }
00884 
00885 // JOINT MISSION KLUGGE MISSION 55 & 56
00886 if (Data->P[plr].Mission[0].MissionCode==55)
00887  {
00888   Data->P[plr].Mission[1].Hard[Mission_Capsule]=Data->P[plr].Mission[1].Prog-1;
00889   Data->P[plr].Mission[0].Hard[Mission_LM]=6; // LM
00890   Data->P[plr].Mission[0].Hard[Mission_Probe_DM]=4; // DM
00891   Data->P[plr].Misc[1].Safety=maxx(Data->P[plr].Misc[1].Safety,Data->P[plr].Misc[1].MaxRD);
00892   Data->P[plr].Mission[1].Hard[Mission_Kicker]=1; // kicker second part
00893  };
00894 
00895 if (Data->P[plr].Mission[0].MissionCode==56)
00896  {
00897   Data->P[plr].Mission[1].Hard[Mission_Capsule]=Data->P[plr].Mission[1].Prog-1;
00898   Data->P[plr].Mission[0].Hard[Mission_LM]=6; // LM
00899   Data->P[plr].Mission[0].Hard[Mission_Probe_DM]=4; // DM
00900   Data->P[plr].Misc[1].Safety=maxx(Data->P[plr].Misc[1].Safety,Data->P[plr].Misc[1].MaxRD);
00901   Data->P[plr].Mission[0].Hard[Mission_Kicker]=1;
00902     Data->P[plr].Mission[1].Hard[Mission_Kicker]=1;
00903  };
00904 
00905   // lunar module klugge
00906   for (i=0;i<3;i++)
00907    if (Data->P[plr].Mission[i].Hard[Mission_LM]>=5)
00908      {
00909       Data->P[plr].Mission[i].Hard[Mission_LM]= Data->P[plr].Manned[5].Safety>=Data->P[plr].Manned[6].Safety ? 5 : 6;
00910      }
00911   JR=0;k=0;
00912   for (l=0;l<3;l++) {
00913     if (Data->P[plr].Mission[l].Joint==1) JR=1;
00914     if (Data->P[plr].Mission[l].MissionCode>0 &&
00915     Data->P[plr].Mission[l].part==0) k++;
00916     Data->P[plr].Mission[l].Rushing=0;   // Clear Data
00917   }
00918 
00919   if (k==3) {   // Three non joint missions
00920     Data->P[plr].Mission[0].Month=2+Data->Season*6;
00921     Data->P[plr].Mission[1].Month=3+Data->Season*6;
00922     Data->P[plr].Mission[2].Month=4+Data->Season*6;
00923   };
00924 
00925   if (k==2 && JR==0) {     // Two non joint missions
00926     l=3;
00927     if (Data->P[plr].Mission[0].MissionCode>0) {
00928       Data->P[plr].Mission[0].Month=l+Data->Season*6; l+=2; };
00929     if (Data->P[plr].Mission[1].MissionCode>0) {
00930       Data->P[plr].Mission[1].Month=l+Data->Season*6; l+=2; };
00931     if (Data->P[plr].Mission[2].MissionCode>0)
00932       Data->P[plr].Mission[2].Month=l+Data->Season*6;
00933   };
00934 
00935   if (k==1 && JR==0) {     // Single Mission Non joint
00936     if (Data->P[plr].Mission[0].MissionCode>0)
00937       Data->P[plr].Mission[0].Month=4+Data->Season*6;
00938     if (Data->P[plr].Mission[1].MissionCode>0)
00939       Data->P[plr].Mission[1].Month=4+Data->Season*6;
00940     if (Data->P[plr].Mission[2].MissionCode>0)
00941       Data->P[plr].Mission[2].Month=4+Data->Season*6;
00942   };
00943 
00944   if (k==2 && JR==1) {  // Two launches, one Joint;
00945     if (Data->P[plr].Mission[1].part==1) {  // Joint first
00946       Data->P[plr].Mission[0].Month=3+Data->Season*6;
00947       Data->P[plr].Mission[1].Month=3+Data->Season*6;
00948       Data->P[plr].Mission[2].Month=5+Data->Season*6;
00949     };
00950     if (Data->P[plr].Mission[2].part==1) { // Joint second
00951       Data->P[plr].Mission[0].Month=3+Data->Season*6;
00952       Data->P[plr].Mission[1].Month=5+Data->Season*6;
00953       Data->P[plr].Mission[2].Month=5+Data->Season*6;
00954     };
00955   };
00956 
00957   if (k==1 && JR==1) { //  Single Joint Launch
00958     if (Data->P[plr].Mission[1].part==1) {   // found on pad 1+2
00959       Data->P[plr].Mission[0].Month=4+Data->Season*6;
00960       Data->P[plr].Mission[1].Month=4+Data->Season*6;
00961     } else {   // found on pad 2+3
00962       Data->P[plr].Mission[1].Month=4+Data->Season*6;
00963       Data->P[plr].Mission[2].Month=4+Data->Season*6;
00964     };
00965   }
00966   return;
00967 }
00968 
00969 /* EOF */
00970 

Generated on Fri Sep 28 00:35:44 2007 for raceintospace by  doxygen 1.5.3