char REvent(char plr) { FILE *fin; int32_t NoMods=1,i=0,j=0; int16_t m; if (NoMods==1) { m=0; if (Data->P[plr].Budget<40) Data->P[plr].Budget=40; if (Data->P[plr].Budget<=50) j=0; if (Data->P[plr].Budget>50 && Data->P[plr].Budget<=90) j=1; if (Data->P[plr].Budget>90 && Data->P[plr].Budget<=110) j=2; if (Data->P[plr].Budget>110 && Data->P[plr].Budget<=140) j=3; if (Data->P[plr].Budget>140 && Data->P[plr].Budget<=160) j=4; if (Data->P[plr].Budget>160) j=5; fin=sOpen("NTABLE.DAT","rb",0); fseek(fin,(sizeof (i16)) * ((plr*60) + (j*10) + random(10)) ,SEEK_SET); fread(&m,sizeof m,1,fin); Swap16bit(m); // m=BudgetMods[Data->P[plr].Level][(j*10)+random(10)]; // orig code fclose(fin); Data->P[plr].Budget+=m; /*grSetColor(15); PrintAt(200,30,"BUDGET MOD: "); if (m<0) {PrintAt(0,0,"-");m*=-1;}; DispNum(0,0,m); PrintAt(200,40,"BUDGET: "); DispNum(0,0,Data->P[plr].Budget); DispNum(100,10,Data->Events[Data->Count]);*/ } /* end if */ if (Data->Year<=60 && Data->Events[Data->Count]>44) return 1; if (Data->Year<=62 && Data->Events[Data->Count]>63) return 1; if (Data->Year<=65 && Data->Events[Data->Count]>80) return 1; switch(Data->Events[Data->Count]) { case 0: NoMods=0;break; // Nothing Event case 1: case 44: case 59: case 63: // Nothing Events case 67: case 68: case 69: case 70: case 71: case 72: case 73: case 74: case 75: case 81: case 86: case 87: case 88: case 90: case 97: case 98: break; // Cash Modifier Events -------------------------- case 30: case 32: evflag=random(10)+1; Data->P[plr].Cash+=evflag; break; case 31: evflag=random(6)+random(6)+random(6)+3; Data->P[plr].Cash+=evflag; break; case 33:if (Data->P[plr].Cash<10) return 1; evflag=Data->P[plr].Cash/10; Data->P[plr].Cash-=evflag; break; // Budget Modifier Events ------------------------ case 9: case 76: // Budget increase of 15 MB Data->P[plr].Budget+=15; NoMods=0; break; case 45: // increase budget by total two 10 side dice this year evflag=random(10)+random(10)+2; Data->P[plr].Budget+=evflag; NoMods=0; break; case 46: // increase budget by 5 MB's Data->P[plr].Budget+=5; NoMods=0; break; case 91: // increase budget by 20MB's in the budget if (Data->Year>65) return 1; Data->P[plr].Budget+=20; NoMods=0; break; case 92: // 20% or 20MB's whichever is less if ((Data->P[plr].Budget/5) < 20) evflag=Data->P[plr].Budget*4/5; else evflag=20; Data->P[plr].Budget-=evflag; break; case 95: // 30% or 30MB's whichever is less if ((Data->P[plr].Budget/3) < 30) evflag=Data->P[plr].Budget*7/10; else evflag=30; Data->P[plr].Budget-=evflag; evflag=Data->P[plr].Budget; break; case 96: // 25% or 25Mb's whichever is less if (Data->Year>72) return 1; if ((Data->P[plr].Budget/4) < 25) evflag=Data->P[plr].Budget*3/4; else evflag=25; Data->P[plr].Budget-=evflag; evflag=Data->P[plr].Budget; break; case 99:// deduct 5 M.B.s from budget Data->P[plr].Budget-=5; break; // RD Modifier Events ---------------------------- case 2: case 12: case 13: case 14: // RD improve by 1 : season case 15: case 16: case 17: case 18: Data->P[plr].RDMods+=1; break; case 3: case 61: case 62:// Minus one on all R&D for ONE year Data->P[plr].RDMods-=1; Data->P[plr].RDYear=-1; break; case 19: // minus 2 on each die roll for R&D this turn Data->P[plr].RDMods-=2; break; case 41: // R&D will decrease for one year Data->P[plr].RDMods-=2; Data->P[plr].RDYear-=2; break; case 42: case 43: /* increment R&D cost by 1 on particular program */ evflag=RDMods(plr,0,1,1); if (evflag==0) return 1; break; // Improve/Subtract Tech to Other players ------------------- case 5: case 47: // Improve tech of plr prog to other's prog evflag=Steal(plr,0,1); if (evflag==0) return 1; break; case 6: case 7: // Lower tech of plr prog to other's prog evflag=Steal(plr,0,-1); if (evflag==0) return 1; break; // Special Events ------------------------------------------- case 8: // Allow females into space program Data->P[plr].Female=1; break; // Launch Affected ------------------------------------------ case 4: // Next Launch must be a manned launch. If the launch // is not so then -10 on Budget //Data->P[plr].Plans=1; break; case 10: /* Launch window for Launch #x is blocked */ { int choice[3] = {0,0,0}; evflag=0; if (Data->P[plr].Mission[0].MissionCode > 0) choice[evflag++] = 1; if (Data->P[plr].Mission[1].MissionCode > 0) choice[evflag++] = 2; if (Data->P[plr].Mission[2].MissionCode > 0) choice[evflag++] = 3; if (evflag==0) return 1; evflag = choice[random(evflag)] - 1; xMODE |= xMODE_CLOUDS; ClrMiss(plr,evflag+3); } break; case 35: // may launch only one mission this year ??? Season?!? evflag=0; if (Data->P[plr].Mission[0].Joint==1 || Data->P[plr].Mission[1].Joint==1) return 1; if (Data->P[plr].Mission[0].MissionCode > 0) evflag+=1; if (Data->P[plr].Mission[1].MissionCode > 0) evflag+=2; if (Data->P[plr].Mission[2].MissionCode > 0) evflag+=4; if (evflag==0) return 1; switch (evflag) { case 1: evflag=0;break; case 2: evflag=0;break; case 3: ClrMiss(plr,1+3);break; case 4: evflag=0;break; case 5: ClrMiss(plr,2+3);break; case 6: ClrMiss(plr,2+3);break; case 7: ClrMiss(plr,1+3);ClrMiss(plr,2+3);break; }; if (evflag==0) return 1; break; case 36: /* damage launch facility */ if (Data->P[plr].Mission[0].MissionCode==0) Data->P[plr].LaunchFacility[0]=15; else return 1; break; // Program Saving cards ------------------------------------ case 11: /* Select program and set safety save to 1 */ evflag=SaveMods(plr,0); if (evflag==0) return 1; break; case 77: // set Save for Capsule Program evflag=SaveMods(plr,3); if (evflag==0) return 1; break; case 93: // set Save for LEM Program evflag=SaveMods(plr,4); if (evflag==0) return 1; break; case 20: /* the most advanced rocket program is affected. drop the safety factor in half. */ evflag=0; for (i=3;i>=0;i--) if (Data->P[plr].Rocket[i].Num>=0 && Data->P[plr].Rocket[i].Safety>50) evflag++; if (evflag==0) return 1; for (i=3;i>=0;i--) if (Data->P[plr].Rocket[i].Num>=0 && Data->P[plr].Rocket[i].Safety>50) { evflag=Data->P[plr].Rocket[i].Safety/2; Data->P[plr].Rocket[i].Safety-=evflag; strcpy(&Name[0],&Data->P[plr].Rocket[i].Name[0]); break; }; break; case 21: // Probes' and Sats' Max SF and RD up 5% */ for (i=1;i<3;i++) { Data->P[plr].Probe[i].MaxRD+=5; Data->P[plr].Probe[i].MaxSafety+=5; }; for (i=1;i<3;i++) { if (Data->P[plr].Probe[i].MaxSafety>=99) Data->P[plr].Probe[i].MaxSafety=99; if (Data->P[plr].Probe[i].MaxRD>Data->P[plr].Probe[i].MaxSafety) Data->P[plr].Probe[i].MaxRD=Data->P[plr].Probe[i].MaxSafety; }; break; case 22: case 84: /* roll six 6-sided dice and add to the current safety factor of the program */ x=random(6)+random(6)+random(6)+random(6)+random(6)+random(6)+6; evflag=NMod(plr,3,1,x); if (evflag==0) return 1; evflag=x; break; case 23: /* this applies to the most advanced rocket program. roll six 6-sided dice and add to the current safety factor. */ x=random(6)+random(6)+random(6)+random(6)+random(6)+random(6)+6; evflag=NMod(plr,2,1,x); if (evflag==0) return 1; evflag=x; break; case 24: /* this for most adv. satellites, roll four 6-sided dice and add to safety factor. */ x=random(6)+random(6)+random(6)+random(6)+4; evflag=NMod(plr,1,1,x); if (evflag==0) return 1; evflag=x; break; case 94: /* this for most adv capsule, roll four 6-sided dice and add to safety factor. */ x=random(6)+random(6)+random(6)+random(6)+4; evflag=NMod(plr,3,1,x); if (evflag==0) return 1; evflag=x; break; case 25: /* the blank is all rockets. R&D can't cure it. the options are to launch one rocket at this setback, or cancel launch. - 20% if no visit to repairs.*/ evflag=DamMod(plr,2,-20,15); if (evflag==0) return 1; break; case 26: /* select most advanced manned program and reduce safety by 25% */ evflag=NMod(plr,3,-1,25); if (evflag==0) return 1; evflag=25; break; case 27: /* select most advanced probe program and reduce safety by 15% */ evflag=NMod(plr,1,-1,15); if (evflag==0) return 1; evflag=15; break; case 79: evflag=NMod(plr,0,-1,20); if (evflag==0) return 1; evflag=20; break; case 28: // hardware cost 50% less this season Data->P[plr].TurnOnly=3; break; case 29: // set the delay of the rockets to 2 == one year for (i=0;i<5;i++) Data->P[plr].Rocket[i].Delay=2; break; case 34: /* 20% loss most advanced capsule */ evflag=NMod(plr,3,-1,20); if (evflag==0) return 1; evflag=20; break; case 37: /* cost 10MB repear or 10% safety loss on the most advanced probe */ evflag=DamMod(plr,1,-10,10); if (evflag==0) return 1; break; case 38: case 39: /* most adv. rocket program 10 MB's or 5% safety loss */ evflag=DamMod(plr,2,-5,10); if (evflag==0) return 1; break; case 40: /* blank a program 10 MB's or 10% safety loss */ evflag=DamMod(plr,0,-10,10); if (evflag==0) return 1; break; case 54: /* most advanced rocket program 15 MB's or 20% safety loss */ evflag=DamMod(plr,2,-20,15); if (evflag==0) return 1; break; case 55: /* most advanced rocket program 20 MB's or 10% safety loss */ evflag=DamMod(plr,3,-10,20); if (evflag==0) return 1; break; case 48: // safety increased for rockets up 5% evflag=SaveMods(plr,2); if (evflag==0) return 1; break; // Astronaut Portion ------------------------------------ case 49: /* pick random astronaut retire, budget minus 5 MB's */ evflag=0; for (i=0;i<Data->P[plr].AstroCount;i++){ if (!(Data->P[plr].Pool[i].Status==AST_ST_DEAD || Data->P[plr].Pool[i].Status==AST_ST_RETIRED)) evflag++; } if (evflag==0) return 1; Data->P[plr].Budget-=5; i=random(Data->P[plr].AstroCount); while (Data->P[plr].Pool[i].Status==AST_ST_DEAD || Data->P[plr].Pool[i].Status==AST_ST_RETIRED) i=random(Data->P[plr].AstroCount); Data->P[plr].Pool[i].RDelay=2; Data->P[plr].Pool[i].Mood=10; strcpy(&Name[0],&Data->P[plr].Pool[i].Name[0]); if (plr==1) { Data->P[plr].Pool[i].Status=AST_ST_RETIRED; Data->P[plr].Pool[i].RDelay=0; }; if (Data->P[plr].Pool[i].Status==AST_ST_RETIRED) Replace_Snaut(plr); break; case 50: // backup crew will fly mission evflag=0; for (i=0;i<3;i++) if (Data->P[plr].Mission[i].MissionCode>0) evflag++; if (evflag==0) return 1; i=0; while (Data->P[plr].Mission[i].MissionCode==0) i++; Data->P[plr].Mission[i].PCrew=0; Data->P[plr].Mission[i].Crew=Data->P[plr].Mission[i].BCrew; evflag=i; break; case 51: /* astronaut killed delay all manned missons = 1 */ evflag=0; for (i=0;i<Data->P[plr].AstroCount;i++) if (!(Data->P[plr].Pool[i].Status==AST_ST_DEAD || Data->P[plr].Pool[i].Status==AST_ST_RETIRED)) evflag++; if (evflag==0) return 1; Data->P[plr].Budget-=5; i=random(Data->P[plr].AstroCount); while (Data->P[plr].Pool[i].Status==AST_ST_DEAD || Data->P[plr].Pool[i].Status==AST_ST_RETIRED) i=random(Data->P[plr].AstroCount); strcpy(&Name[0],&Data->P[plr].Pool[i].Name[0]); Data->P[plr].Pool[i].Status=AST_ST_DEAD; Data->P[plr].Other=2; xMODE |= xMODE_SPOT_ANIM; //trigger spot anim //cancel manned missions ClrMiss(plr,0+3);ClrMiss(plr,1+3);ClrMiss(plr,2+3); break; case 52: evflag=0; for (i=0;i<Data->P[plr].AstroCount;i++) if (!(Data->P[plr].Pool[i].Status==AST_ST_DEAD || Data->P[plr].Pool[i].Status==AST_ST_RETIRED)) evflag++; if (evflag==0) return 1; i=random(Data->P[plr].AstroCount); while (Data->P[plr].Pool[i].Status==AST_ST_DEAD || Data->P[plr].Pool[i].Status==AST_ST_RETIRED) i=random(Data->P[plr].AstroCount); strcpy(&Name[0],&Data->P[plr].Pool[i].Name[0]); Data->P[plr].Pool[i].Status=AST_ST_DEAD; Data->P[plr].Other=2; Replace_Snaut(plr); break; case 60: case 53: evflag=0; for (i=0;i<Data->P[plr].AstroCount;i++) if (!(Data->P[plr].Pool[i].Status==AST_ST_DEAD || Data->P[plr].Pool[i].Status==AST_ST_RETIRED)) evflag++; if (evflag==0) return 1; i=random(Data->P[plr].AstroCount); while (Data->P[plr].Pool[i].Status==AST_ST_DEAD || Data->P[plr].Pool[i].Status==AST_ST_RETIRED) i=random(Data->P[plr].AstroCount); strcpy(&Name[0],&Data->P[plr].Pool[i].Name[0]); Data->P[plr].Pool[i].Status=AST_ST_INJURED; Data->P[plr].Pool[i].IDelay=2; Data->P[plr].Pool[i].Special=4; Replace_Snaut(plr); break; case 56: /* hardware 50% less this season */ Data->P[plr].TurnOnly=3; break; case 57: for (i=0;i<3;i++) { if (i==0 && plr==0) strcpy(&Data->P[plr].Pool[Data->P[plr].AstroCount].Name[0],"MANKE"); else if (i==1 && plr==0) strcpy(&Data->P[plr].Pool[Data->P[plr].AstroCount].Name[0],"POWELL"); else if (i==2 && plr==0) strcpy(&Data->P[plr].Pool[Data->P[plr].AstroCount].Name[0],"YEAGER"); else if (i==0 && plr==1) strcpy(&Data->P[plr].Pool[Data->P[plr].AstroCount].Name[0],"ILYUSHIN"); else if (i==1 && plr==1) strcpy(&Data->P[plr].Pool[Data->P[plr].AstroCount].Name[0],"SHIBORIN"); else if (i==2 && plr==1) strcpy(&Data->P[plr].Pool[Data->P[plr].AstroCount].Name[0],"DOLGOV"); /* The original bonus astronauts & cosmonauts were: REEVES, CHAMBERLAIN, YEAGER & STIPPOV, SCHLICKBERND, FARGOV -Leon */ Data->P[plr].Pool[Data->P[plr].AstroCount].Status=AST_ST_TRAIN_BASIC_1; Data->P[plr].Pool[Data->P[plr].AstroCount].Face=random(10)+1; Data->P[plr].Pool[Data->P[plr].AstroCount].Service=1; Data->P[plr].Pool[Data->P[plr].AstroCount].Compat=random(10)+1; Data->P[plr].Pool[Data->P[plr].AstroCount].CR=random(2)+1; Data->P[plr].Pool[Data->P[plr].AstroCount].CL=random(2)+1; Data->P[plr].Pool[Data->P[plr].AstroCount].Group=9; Data->P[plr].Pool[Data->P[plr].AstroCount].Mood=85+5*random(4); Data->P[plr].AstroCount++; }; break; case 58: // 50% chance explosion on pad Data->P[plr].TurnOnly=5; break; case 64: /* launch facility repair 10MB's */ for (j=0;j<20;j++) { i=rand()%3; if (Data->P[plr].LaunchFacility[i]==1 && Data->P[plr].Mission[i].MissionCode==0) break; } if (j==20) return 1; /* get which of the three facilities damaged */ Data->P[plr].LaunchFacility[i]=10; break; case 65: // Gemini or Voskhod will cost additional 2MB's per spacecraft if (Data->P[plr].Manned[1].Num<0) return 1; Data->P[plr].Manned[1].UnitCost+=2; // Used to say "InitCost", which effectively disabled this newscast -Leon break; case 83: // Apollo or Soyuz will cost additional 3MB's per spacecraft if (Data->P[plr].Manned[2].Num<0) return 1; Data->P[plr].Manned[2].UnitCost+=3; break; case 66:// mission delay evflag=0; for (i=0;i<3;i++) { if (Data->P[plr].Mission[i].MissionCode>0) { GetMisType(Data->P[plr].Mission[i].MissionCode); if (!Mis.Jt) evflag++; } } if (evflag==0) return 1; i=random(3); while(Data->P[plr].Mission[i].MissionCode==0 || Data->P[plr].Mission[i].Joint==1) i=random(3); evflag=i; memcpy(&Data->P[plr].Future[i],&Data->P[plr].Mission[i],sizeof(struct MissionType)); memset(&Data->P[plr].Mission[i],0x00,sizeof(struct MissionType)); for (i=0;i<Data->P[plr].Future[evflag].Men+1;i++) { j=Data->P[plr].Crew[Data->P[plr].Future[evflag].Prog][Data->P[plr].Future[evflag].PCrew-1][i]-1; Data->P[plr].Pool[j].Prime++; j=Data->P[plr].Crew[Data->P[plr].Future[evflag].Prog][Data->P[plr].Future[evflag].BCrew-1][i]-1; Data->P[plr].Pool[j].Prime++; } break; case 78: /* most advanced capsule 10MB's or 10% safety */ evflag=DamMod(plr,3,-10,10); if (evflag==0) return 1; break; case 80: // Can't Deliver any Cap/Mods this year for (i=0;i<5;i++) Data->P[plr].Manned[i].Delay=2; break; case 82: // Duration E Mission Required Data->P[plr].FuturePlans=5; break; case 85: // Primary Crew Scrubbed - Backup Will Fly evflag=0; for (i=0;i<3;i++) if (Data->P[plr].Mission[i].MissionCode>0) evflag++; if (evflag==0) return 1; i=0; while (Data->P[plr].Mission[i].MissionCode==0) i++; Data->P[plr].Mission[i].Crew=Data->P[plr].Mission[i].BCrew; evflag=i; break; case 89: /* random astronaut not active */ evflag=0; for (i=0;i<Data->P[plr].AstroCount;i++) if (Data->P[plr].Pool[i].Status==AST_ST_ACTIVE) evflag++; if (evflag==0) return 1; i=random(Data->P[plr].AstroCount); while(Data->P[plr].Pool[i].Status!=AST_ST_ACTIVE) i=random(Data->P[plr].AstroCount); strcpy(&Name[0],&Data->P[plr].Pool[i].Name[0]); Data->P[plr].Pool[i].Status= AST_ST_INJURED; Data->P[plr].Pool[i].IDelay=2; break; default: break; } // End of Switch return 0; }
void AILaunch(char plr) { int i, j, k = 0, l = 0, JR = 0, wgt, bwgt[7]; char boos[7], bdex[7]; for (i = 0; i < 7; i++) { bdex[i] = i; boos[i] = (i > 3) ? RocketBoosterSafety(Data->P[plr].Rocket[i - 4].Safety, Data->P[plr].Rocket[4].Safety) : Data->P[plr].Rocket[i].Safety; bwgt[i] = (i > 3) ? (Data->P[plr].Rocket[i - 4].MaxPay + Data->P[plr].Rocket[4].MaxPay) : Data->P[plr].Rocket[i].MaxPay; if (boos[i] < 60) { boos[i] = -1; // Get Rid of any Unsafe rkt systems } if (Data->P[plr].Rocket[4].Num < 1) for (j = 4; j < 7; j++) { boos[j] = -1; } for (j = 0; j < 4; j++) if (Data->P[plr].Rocket[j].Num < 1) { boos[j] = -1; } } for (i = 0; i < 3; i++) { if (Data->P[plr].Mission[i].MissionCode == 28 && Data->P[plr].DMod == 0) { Data->P[plr].Mission[i].MissionCode = 0; return; } if (Data->P[plr].Mission[i].MissionCode > 0 && Data->P[plr].Mission[i].part == 0) { whe[0] = whe[1] = -1; if (Data->P[plr].Mission[i].Joint == 1) { AIVabCheck(plr, Data->P[plr].Mission[i].MissionCode, Data->P[plr].Mission[i + 1].Prog); } else { AIVabCheck(plr, Data->P[plr].Mission[i].MissionCode, Data->P[plr].Mission[i].Prog); } if (whe[0] > 0) { if (Data->P[plr].Mission[i].Prog == 0) { BuildVAB(plr, Data->P[plr].Mission[i].MissionCode, 1, 0, Data->P[plr].Mission[i].Prog); } else { BuildVAB(plr, Data->P[plr].Mission[i].MissionCode, 1, 0, Data->P[plr].Mission[i].Prog - 1); } for (j = Mission_Capsule; j <= Mission_Probe_DM; j++) { Data->P[plr].Mission[i].Hard[j] = VAS[whe[0]][j].dex; } wgt = 0; for (j = 0; j < 4; j++) { wgt += VAS[whe[0]][j].wt; } rck[0] = -1; for (k = 0; k < 7; k++) if (boos[k] != -1 && bwgt[k] >= wgt) { if (rck[0] == -1) { rck[0] = bdex[k]; } else if (boos[k] >= boos[rck[0]]) { rck[0] = bdex[k]; } } if (rck[0] == -1) { ClrMiss(plr, i - Data->P[plr].Mission[i].part); } else { if (Data->P[plr].Mission[i].MissionCode == 1) { rck[0] = 0; } if (Data->P[plr].Mission[i].MissionCode >= 7 && Data->P[plr].Mission[i].MissionCode <= 13) { rck[0] = 1; } if (Data->P[plr].Mission[i].MissionCode == 3) { rck[0] = 1; } if (Data->P[plr].Mission[i].MissionCode == 15) { rck[0] = 1; } Data->P[plr].Mission[i].Hard[Mission_PrimaryBooster] = rck[0] + 1; } } else { // Clear Mission Data->P[plr].Mission[i].MissionCode = 0; } // joint mission part if (whe[1] > 0 && Data->P[plr].Mission[i + 1].part == 1) { if (Data->P[plr].Mission[i].Prog == 0) { BuildVAB(plr, Data->P[plr].Mission[i].MissionCode, 1, 1, Data->P[plr].Mission[i].Prog); } else { BuildVAB(plr, Data->P[plr].Mission[i].MissionCode, 1, 1, Data->P[plr].Mission[i].Prog - 1); } for (j = Mission_Capsule ; j <= Mission_Probe_DM; j++) { Data->P[plr].Mission[i + 1].Hard[j] = VAS[whe[1]][j].dex; } wgt = 0; for (j = 0; j < 4; j++) { wgt += VAS[whe[1]][j].wt; } rck[1] = -1; for (k = 0; k < 7; k++) if (boos[k] != -1 && bwgt[k] >= wgt) { if (rck[1] == -1) { rck[1] = bdex[k]; } else if (boos[k] >= boos[rck[1]]) { rck[1] = bdex[k]; } } if (rck[1] == -1) { rck[1] = Data->P[plr].Mission[i].Hard[Mission_PrimaryBooster] - 1; } Data->P[plr].Mission[i + 1].Hard[Mission_PrimaryBooster] = rck[1] + 1; } } } // JOINT MISSION KLUGGE MISSION 55 & 56 if (Data->P[plr].Mission[0].MissionCode == 55) { Data->P[plr].Mission[1].Hard[Mission_Capsule] = Data->P[plr].Mission[1].Prog - 1; Data->P[plr].Mission[0].Hard[Mission_LM] = 6; // LM Data->P[plr].Mission[0].Hard[Mission_Probe_DM] = 4; // DM Data->P[plr].Misc[1].Safety = maxx(Data->P[plr].Misc[1].Safety, Data->P[plr].Misc[1].MaxRD); Data->P[plr].Mission[1].Hard[Mission_Kicker] = 1; // kicker second part }; if (Data->P[plr].Mission[0].MissionCode == 56) { Data->P[plr].Mission[1].Hard[Mission_Capsule] = Data->P[plr].Mission[1].Prog - 1; Data->P[plr].Mission[0].Hard[Mission_LM] = 6; // LM Data->P[plr].Mission[0].Hard[Mission_Probe_DM] = 4; // DM Data->P[plr].Misc[1].Safety = maxx(Data->P[plr].Misc[1].Safety, Data->P[plr].Misc[1].MaxRD); Data->P[plr].Mission[0].Hard[Mission_Kicker] = 1; Data->P[plr].Mission[1].Hard[Mission_Kicker] = 1; }; // lunar module klugge for (i = 0; i < 3; i++) if (Data->P[plr].Mission[i].Hard[Mission_LM] >= 5) { Data->P[plr].Mission[i].Hard[Mission_LM] = Data->P[plr].Manned[5].Safety >= Data->P[plr].Manned[6].Safety ? 5 : 6; } JR = 0; k = 0; for (l = 0; l < 3; l++) { if (Data->P[plr].Mission[l].Joint == 1) { JR = 1; } if (Data->P[plr].Mission[l].MissionCode > 0 && Data->P[plr].Mission[l].part == 0) { k++; } Data->P[plr].Mission[l].Rushing = 0; // Clear Data } if (k == 3) { // Three non joint missions Data->P[plr].Mission[0].Month = 2 + Data->Season * 6; Data->P[plr].Mission[1].Month = 3 + Data->Season * 6; Data->P[plr].Mission[2].Month = 4 + Data->Season * 6; }; if (k == 2 && JR == 0) { // Two non joint missions l = 3; if (Data->P[plr].Mission[0].MissionCode > 0) { Data->P[plr].Mission[0].Month = l + Data->Season * 6; l += 2; }; if (Data->P[plr].Mission[1].MissionCode > 0) { Data->P[plr].Mission[1].Month = l + Data->Season * 6; l += 2; }; if (Data->P[plr].Mission[2].MissionCode > 0) { Data->P[plr].Mission[2].Month = l + Data->Season * 6; } }; if (k == 1 && JR == 0) { // Single Mission Non joint if (Data->P[plr].Mission[0].MissionCode > 0) { Data->P[plr].Mission[0].Month = 4 + Data->Season * 6; } if (Data->P[plr].Mission[1].MissionCode > 0) { Data->P[plr].Mission[1].Month = 4 + Data->Season * 6; } if (Data->P[plr].Mission[2].MissionCode > 0) { Data->P[plr].Mission[2].Month = 4 + Data->Season * 6; } }; if (k == 2 && JR == 1) { // Two launches, one Joint; if (Data->P[plr].Mission[1].part == 1) { // Joint first Data->P[plr].Mission[0].Month = 3 + Data->Season * 6; Data->P[plr].Mission[1].Month = 3 + Data->Season * 6; Data->P[plr].Mission[2].Month = 5 + Data->Season * 6; }; if (Data->P[plr].Mission[2].part == 1) { // Joint second Data->P[plr].Mission[0].Month = 3 + Data->Season * 6; Data->P[plr].Mission[1].Month = 5 + Data->Season * 6; Data->P[plr].Mission[2].Month = 5 + Data->Season * 6; }; }; if (k == 1 && JR == 1) { // Single Joint Launch if (Data->P[plr].Mission[1].part == 1) { // found on pad 1+2 Data->P[plr].Mission[0].Month = 4 + Data->Season * 6; Data->P[plr].Mission[1].Month = 4 + Data->Season * 6; } else { // found on pad 2+3 Data->P[plr].Mission[1].Month = 4 + Data->Season * 6; Data->P[plr].Mission[2].Month = 4 + Data->Season * 6; }; } return; }
void ShowPad(char plr, char pad) { char temp; music_start((plr == 1) ? M_USMIL : M_USSRMIL); PadDraw(plr, pad); temp = CheckCrewOK(plr, pad); if (temp == 1) { //found mission no crews ClrMiss(plr, pad + 3); return; } helpText = "i028"; keyHelpText = "k028"; WaitForMouseUp(); while (1) { key = 0; GetMouse(); if ((Data->P[plr].LaunchFacility[pad] == 1 && x >= 169 && y >= 181 && x <= 314 && y <= 193 && mousebuttons > 0 && Data->P[plr].Mission[pad].MissionCode) || (Data->P[plr].LaunchFacility[pad] == 1 && Data->P[plr].Mission[pad].MissionCode && key == 'S')) { // Scrub Mission InBox(169, 181, 314, 193); key = 0; WaitForMouseUp(); ClrMiss(plr, pad); OutBox(169, 181, 314, 193); key = 0; if (Data->P[plr].Mission[pad].MissionCode == Mission_None) { return; } } else if ((Data->P[plr].LaunchFacility[pad] <= Data->P[plr].Cash && Data->P[plr].LaunchFacility[pad] > 1 && x >= 169 && y >= 181 && x <= 314 && y <= 193 && mousebuttons > 0) || (key == 'F' && Data->P[plr].LaunchFacility[pad] > 1 && Data->P[plr].LaunchFacility[pad] <= Data->P[plr].Cash)) { // Scrub Mission InBox(169, 181, 314, 193); key = 0; WaitForMouseUp(); if (Data->P[plr].Cash >= Data->P[plr].LaunchFacility[pad]) { temp = Help("i115"); if (temp == 1) { Data->P[plr].Cash -= Data->P[plr].LaunchFacility[pad]; Data->P[plr].LaunchFacility[pad] = 1; } } else { Help("i116"); } OutBox(169, 181, 314, 193); key = 0; if (temp == 1) { return; } } else if ((x >= 245 && y >= 5 && x <= 314 && y <= 17 && mousebuttons > 0) || key == K_ENTER) { InBox(245, 5, 314, 17); key = 0; WaitForMouseUp(); OutBox(245, 5, 314, 17); if (key > 0) { delay(150); } key = 0; return; /* Done */ }; } }
void MisAnn(char plr, char pad) { int i, j, bud; struct mStr Mis2; char k, hold, Digit[4], HelpFlag = 0; char pad_str[2] = {'A' + pad, '\0'}; for (i = 0; i < 768; i++) { pal[i] = 0; } gxClearDisplay(0, 0); PortPal(plr); ShBox(41, 20, 281, 184); InBox(46, 25, 276, 179); InBox(46, 25, 117, 65); Flag(47, 26, plr); InBox(122, 25, 276, 65); grSetColor(9); PrintAt(127, 33, "SCHEDULED LAUNCH"); //was 154,33 grSetColor(34); PrintAt(127, 40, "LAUNCH FACILITY: "); grSetColor(1); PrintAt(0, 0, "PAD "); PrintAt(0, 0, pad_str); grSetColor(34); PrintAt(127, 47, "DATE: "); grSetColor(1); PrintAt(0, 0, Month[Data->P[plr].Mission[pad].Month]); PrintAt(0, 0, "19"); DispNum(0, 0, Data->Year); grSetColor(1); GetMisType(Data->P[plr].Mission[pad].MissionCode); memcpy(&Mis2, &Mis, sizeof Mis); if ((Mis.mVab[0] & 0x10) == 0x10 && Data->P[plr].DMod <= 0) { i = 0; while (dg[Mis2.Index][i] != 0 && Mis.Doc == 1) { GetMisType(dg[Mis2.Index][i]); i++; } if (dg[Mis2.Index][i] == 0) { Data->P[plr].Mission[pad].MissionCode = 4; // new mission } else { Data->P[plr].Mission[pad].MissionCode = Mis.Index; // new mission } GetMisType(Data->P[plr].Mission[pad].MissionCode); HelpFlag = 1; } PrintAt(127, 54, Mis.Abbr); int MisCod; MisCod = Data->P[plr].Mission[pad].MissionCode; if ((MisCod > 24 && MisCod < 32) || MisCod == 33 || MisCod == 34 || MisCod == 35 || MisCod == 37 || MisCod == 40 || MisCod == 41) // Show duration level only on missions with a Duration step - Leon { switch (Data->P[plr].Mission[pad].Duration) { case 1: PrintAt(0, 0, ""); break; case 2: PrintAt(0, 0, " (B)"); break; case 3: PrintAt(0, 0, " (C)"); break; case 4: PrintAt(0, 0, " (D)"); break; case 5: PrintAt(0, 0, " (E)"); break; case 6: PrintAt(0, 0, " (F)"); break; default: PrintAt(0, 0, ""); break; } } IOBox(57, 68, 118, 84); IOBox(131, 68, 197, 84); IOBox(205, 68, 266, 84); grSetColor(1); PrintAt(65, 78, "CONTINUE"); PrintAt(139, 78, "PLAY FULL"); PrintAt(221, 78, "SCRUB"); grSetColor(9); MisCod = Data->P[plr].Mission[i].MissionCode; PrintAt(65, 78, "C"); PrintAt(139, 78, "P"); PrintAt(221, 78, "S"); //IOBox(85,68,158,84);IOBox(172,68,245,84); //grSetColor(1);PrintAt(102,78,"CONTINUE");PrintAt(189,78,"SCRUB"); //grSetColor(9); //PrintAt(102,78,"C");PrintAt(189,78,"S"); if (Data->P[plr].Mission[pad].Joint == 0) { PrintAt(128, 91, "SINGLE LAUNCH"); } else { PrintAt(131, 91, "JOINT LAUNCH"); PrintAt(49, 101, "PART ONE"); PrintAt(102, 101, "PAD "); //DispNum(0,0,pad); switch (pad) { case 0: PrintAt(0, 0, "A"); break; case 1: PrintAt(0, 0, "B"); break; case 2: PrintAt(0, 0, "C"); break; }; PrintAt(160, 101, "PART TWO"); PrintAt(213, 101, "PAD "); //DispNum(0,0,pad+1); switch (pad + 1) { case 0: PrintAt(0, 0, "A"); break; case 1: PrintAt(0, 0, "B"); break; case 2: PrintAt(0, 0, "C"); break; }; } for (i = 0; i < Data->P[plr].Mission[pad].Joint + 1; i++) { k = 0; if (i == 0) { bud = 49; } else { bud = 160; } for (j = Mission_Capsule; j <= Mission_PrimaryBooster; j++) { hold = Data->P[plr].Mission[pad + i].Hard[j]; switch (j) { case 0: if (hold > -1) { grSetColor(7); PrintAt(bud, 109 + 14 * k, "CAPSULE: "); grSetColor(1); PrintAt(0, 0, &Data->P[plr].Manned[hold].Name[0]); grSetColor(11); PrintAt(bud, 116 + 14 * k, "SAFETY FACTOR: "); Data->P[plr].Manned[hold].Damage != 0 ? grSetColor(9) : grSetColor(1); //Damaged Equipment, Nikakd, 10/8/10 sprintf(&Digit[0], "%d", Data->P[plr].Manned[hold].Safety + Data->P[plr].Manned[hold].Damage); PrintAt(0, 0, &Digit[0]); PrintAt(0, 0, "%"); // PrintAt(144+i*111,116+14*k,"%"); ++k; }; break; case 1: if (hold > -1) { grSetColor(7); PrintAt(bud, 109 + 14 * k, "KICKER: "); grSetColor(1); PrintAt(0, 0, &Data->P[plr].Misc[hold].Name[0]); grSetColor(11); PrintAt(bud, 116 + 14 * k, "SAFETY FACTOR: "); Data->P[plr].Misc[hold].Damage != 0 ? grSetColor(9) : grSetColor(1); //Damaged Equipment, Nikakd, 10/8/10 sprintf(&Digit[0], "%d", Data->P[plr].Misc[hold].Safety + Data->P[plr].Misc[hold].Damage); PrintAt(0, 0, &Digit[0]); PrintAt(0, 0, "%"); // DispNum(0,0,Data->P[plr].Misc[hold].Safety); // PrintAt(144+i*111,116+14*k,"%"); ++k; }; break; case 2: if (hold > -1) { grSetColor(7); PrintAt(bud, 109 + 14 * k, "LM: "); grSetColor(1); PrintAt(0, 0, &Data->P[plr].Manned[hold].Name[0]); grSetColor(11); PrintAt(bud, 116 + 14 * k, "SAFETY FACTOR: "); Data->P[plr].Manned[hold].Damage != 0 ? grSetColor(9) : grSetColor(1); //Damaged Equipment, Nikakd, 10/8/10 sprintf(&Digit[0], "%d", Data->P[plr].Manned[hold].Safety + Data->P[plr].Manned[hold].Damage); PrintAt(0, 0, &Digit[0]); PrintAt(0, 0, "%"); //DispNum(0,0,Data->P[plr].Manned[hold].Safety); //PrintAt(144+i*111,116+14*k,"%"); ++k; }; break; case 3: if (hold > -1) { if (hold < 3) { grSetColor(7); PrintAt(bud, 109 + 14 * k, "PROBE: "); grSetColor(1); PrintAt(0, 0, &Data->P[plr].Probe[hold].Name[0]); grSetColor(11); PrintAt(bud, 116 + 14 * k, "SAFETY FACTOR: "); Data->P[plr].Probe[hold].Damage != 0 ? grSetColor(9) : grSetColor(1); //Damaged Equipment, Nikakd, 10/8/10 sprintf(&Digit[0], "%d", Data->P[plr].Probe[hold].Safety + Data->P[plr].Probe[hold].Damage); PrintAt(0, 0, &Digit[0]); PrintAt(0, 0, "%"); //DispNum(0,0,Data->P[plr].Probe[hold].Safety); //PrintAt(144+i*111,116+14*k,"%"); ++k; } else if (hold == 4) { grSetColor(7); PrintAt(bud, 109 + 14 * k, "DOCKING: "); grSetColor(1); PrintAt(0, 0, &Data->P[plr].Misc[hold].Name[0]); grSetColor(11); PrintAt(bud, 116 + 14 * k, "SAFETY FACTOR: "); Data->P[plr].Misc[hold].Damage != 0 ? grSetColor(9) : grSetColor(1); //Damaged Equipment, Nikakd, 10/8/10 sprintf(&Digit[0], "%d", Data->P[plr].Misc[hold].Safety + Data->P[plr].Misc[hold].Damage); PrintAt(0, 0, &Digit[0]); PrintAt(0, 0, "%"); //DispNum(0,0,Data->P[plr].Misc[hold].Safety); //PrintAt(144+i*111,116+14*k,"%"); ++k; } }; break; case 4: if (hold > -1) { if (hold < 5) { grSetColor(7); PrintAt(bud, 109 + 14 * k, "ROCKET: "); grSetColor(1); PrintAt(0, 0, &Data->P[plr].Rocket[hold - 1].Name[0]); grSetColor(11); PrintAt(bud, 116 + 14 * k, "SAFETY FACTOR: "); Data->P[plr].Rocket[hold - 1].Damage != 0 ? grSetColor(9) : grSetColor(1); //Damaged Equipment, Nikakd, 10/8/10 sprintf(&Digit[0], "%d", Data->P[plr].Rocket[hold - 1].Safety + Data->P[plr].Rocket[hold - 1].Damage); PrintAt(0, 0, &Digit[0]); PrintAt(0, 0, "%"); //DispNum(0,0,Data->P[plr].Rocket[hold-1].Safety); //PrintAt(144+i*111,116+14*k,"%"); ++k; } else { grSetColor(7); PrintAt(bud, 109 + 14 * k, "ROCKET: "); grSetColor(1); PrintAt(0, 0, &Data->P[plr].Rocket[hold - 5].Name[0]); PrintAt(0, 0, " W/B"); grSetColor(11); PrintAt(bud, 116 + 14 * k, "SAFETY FACTOR: "); (Data->P[plr].Rocket[hold - 5].Damage != 0 || Data->P[plr].Rocket[4].Damage != 0) ? grSetColor(9) : grSetColor(1); //Damaged Equipment && Booster's Safety Mod, Nikakd, 10/8/10 sprintf(&Digit[0], "%d", RocketBoosterSafety(Data->P[plr].Rocket[hold - 5].Safety + Data->P[plr].Rocket[hold - 5].Damage, Data->P[plr].Rocket[4].Safety + Data->P[plr].Rocket[4].Damage)); PrintAt(0, 0, &Digit[0]); PrintAt(0, 0, "%"); // DispNum(0,0,(Data->P[plr].Rocket[hold-5].Safety+Data->P[plr].Rocket[4].Safety)/2); // PrintAt(144+i*111,116+14*k,"%"); ++k; } } break; default: break; } } } FadeIn(2, pal, 10, 0, 0); WaitForMouseUp(); if (HelpFlag) { Help("i156"); // Notification of being an Help } while (1) { key = 0; GetMouse(); if ((x >= 59 && y >= 70 && x <= 116 && y <= 82 && mousebuttons > 0) || key == K_ENTER || key == 'C') { InBox(59, 70, 116, 82); WaitForMouseUp(); OutBox(59, 70, 116, 82); FadeOut(2, pal, 10, 0, 0); BIG = 0; return; } else if ((x >= 133 && y >= 70 && x <= 195 && y <= 82 && mousebuttons > 0) || key == K_ENTER || key == 'P') { InBox(133, 70, 195, 82); WaitForMouseUp(); OutBox(133, 70, 195, 82); FadeOut(2, pal, 10, 0, 0); BIG = 1; return; } else if ((x >= 207 && y >= 70 && x <= 264 && y <= 82 && mousebuttons > 0) || key == 'S') { InBox(207, 70, 264, 82); WaitForMouseUp(); OutBox(207, 70, 264, 82); { ClrMiss(plr, pad); } if (Data->P[plr].Mission[pad].MissionCode == 0) { FadeOut(2, pal, 10, 0, 0); return; } } }; }