00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
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
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;
00054 }
00055 }
00056 else if (prog>=Mis.mEq && (prog!=0))
00057 {
00058 if (Mis.Jt==1) {
00059 BuildVAB(plr,mis,1,0,prog-1);
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;
00068 } else {
00069
00070
00071
00072
00073
00074 BuildVAB(plr,mis,1,0,prog-1);
00075
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) {
00082 BuildVAB(plr,mis,1,0,prog);
00083 CalcSaf(plr,VASqty);
00084 whe[0]=Best();
00085
00086
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:
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:
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;
00152
00153
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
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
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
00182 return(0);
00183 }
00184
00185 void Strategy_One(char plr,int *m_1,int *m_2,int *m_3)
00186 {
00187
00188 switch(Data->P[plr].Track[1])
00189 {
00190 case 0:
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
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;
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
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
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;
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
00327 switch(Data->P[plr].Track[1])
00328 {
00329 case 0:
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
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;
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;
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;
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
00489 if (mis1==14 && mis2==15) {mis2=15;mis1=14;};
00490
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
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 {
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 {
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
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
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 };
00649
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
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]);
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
00684 if (Mis.Days>0) Data->P[plr].Future[pad+i].Men=max;
00685
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
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;
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 {
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 {
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;
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 {
00863 Data->P[plr].Mission[i].MissionCode=0;
00864 }
00865
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
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;
00890 Data->P[plr].Mission[0].Hard[Mission_Probe_DM]=4;
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;
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;
00899 Data->P[plr].Mission[0].Hard[Mission_Probe_DM]=4;
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
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;
00917 }
00918
00919 if (k==3) {
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) {
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) {
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) {
00945 if (Data->P[plr].Mission[1].part==1) {
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) {
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) {
00958 if (Data->P[plr].Mission[1].part==1) {
00959 Data->P[plr].Mission[0].Month=4+Data->Season*6;
00960 Data->P[plr].Mission[1].Month=4+Data->Season*6;
00961 } else {
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
00970