static int PopFile(void) { IncludeStruct *i; /* Assume we own the file for now */ RunDisabled &= ~RUN_NOTOWNER; if (!Hush && NumIfs) Eprint("%s", ErrMsg[E_MISS_ENDIF]); if (!IStackPtr) return E_EOF; i = &IStack[IStackPtr-1]; if (i->chain) { int oldRunDisabled = RunDisabled; if (NextChainedFile(i) == OK) { return OK; } RunDisabled = oldRunDisabled; } if (IStackPtr <= 1) { return E_EOF; } IStackPtr--; LineNo = i->LineNo; IfFlags = i->IfFlags; NumIfs = i->NumIfs; CLine = i->CLine; fp = NULL; STRSET(FileName, i->filename); if (!i->ownedByMe) { RunDisabled |= RUN_NOTOWNER; } if (!CLine && (i->offset != -1L)) { /* We must open the file, then seek to specified position */ if (strcmp(i->filename, "-")) { fp = fopen(i->filename, "r"); if (!fp || !CheckSafety()) return E_CANT_OPEN; if (PurgeMode) OpenPurgeFile(i->filename, "a"); } else { fp = stdin; if (PurgeMode) PurgeFP = stdout; } if (fp != stdin) (void) fseek(fp, i->offset, 0); /* Trust that it works... */ } free((char *) i->filename); return OK; }
int OpenFile(char const *fname) { CachedFile *h = CachedFiles; int r; if (PurgeMode) { if (PurgeFP != NULL && PurgeFP != stdout) { fclose(PurgeFP); } PurgeFP = NULL; } /* Assume we own the file for now */ RunDisabled &= ~RUN_NOTOWNER; /* If it's in the cache, get it from there. */ while (h) { if (!strcmp(fname, h->filename)) { if (DebugFlag & DB_TRACE_FILES) { fprintf(ErrFp, "Reading `%s': Found in cache\n", fname); } CLine = h->cache; STRSET(FileName, fname); LineNo = 0; if (!h->ownedByMe) { RunDisabled |= RUN_NOTOWNER; } if (FileName) return OK; else return E_NO_MEM; } h = h->next; } /* If it's a dash, then it's stdin */ if (!strcmp(fname, "-")) { fp = stdin; if (PurgeMode) { PurgeFP = stdout; } if (DebugFlag & DB_TRACE_FILES) { fprintf(ErrFp, "Reading `-': Reading stdin\n"); } } else { fp = fopen(fname, "r"); if (DebugFlag & DB_TRACE_FILES) { fprintf(ErrFp, "Reading `%s': Opening file on disk\n", fname); } if (PurgeMode) { OpenPurgeFile(fname, "w"); } } if (!fp || !CheckSafety()) return E_CANT_OPEN; CLine = NULL; if (ShouldCache) { LineNo = 0; r = CacheFile(fname); if (r == OK) { fp = NULL; CLine = CachedFiles->cache; } else { if (strcmp(fname, "-")) { fp = fopen(fname, "r"); if (!fp || !CheckSafety()) return E_CANT_OPEN; if (PurgeMode) OpenPurgeFile(fname, "w"); } else { fp = stdin; if (PurgeMode) PurgeFP = stdout; } } } STRSET(FileName, fname); LineNo = 0; if (FileName) return OK; else return E_NO_MEM; }
void AIMaster(char plr) { int val, i, P_total = 0, O_total = 0; char prg[2]; if (plr == 0) { Level_Check = (Data->Def.Lev1 == 0) ? 0 : 1; } else if (plr == 1) { Level_Check = (Data->Def.Lev2 == 0) ? 0 : 1; } // Randomly select the AI strategy P_total = brandom(100); if (Data->P[plr].AIStrategy[AI_STRATEGY] == 0) { if (P_total < 33) { Data->P[plr].AIStrategy[AI_STRATEGY] = 1; } else if (P_total < 66) { Data->P[plr].AIStrategy[AI_STRATEGY] = 2; } else { Data->P[plr].AIStrategy[AI_STRATEGY] = 3; } } Cur_Status = Equal; // *** check status *** for (i = 0; i < Data->P[plr].PastMissionCount; i++) { P_total += Data->P[plr].History[i].Prestige; } for (i = 0; i < Data->P[other(plr)].PastMissionCount; i++) { O_total += Data->P[other(plr)].History[i].Prestige; } if (P_total > O_total) { Cur_Status = Ahead; } else if (P_total == O_total) { Cur_Status = Equal; } else if (P_total < O_total) { Cur_Status = Behind; } if (Data->Year == 59 && Data->Season == 1) { Data->P[plr].AIStrategy[AI_BEGINNING_STRATEGY] = 0; } if (Data->P[plr].AstroDelay <= 0) { AIAstroPur(plr); } if (Data->P[plr].AIStat == 1) if (Data->Prestige[Prestige_OrbitalSatellite].Place == plr || Data->Prestige[Prestige_OrbitalSatellite].mPlace == plr) { Data->P[plr].AIStat = 2; } if (Data->P[plr].AIStat == 1 && PrestigeCheck(plr, Prestige_LunarFlyby) == 0 && Cur_Status == Behind) { Data->P[plr].AIStat = 2; } if (Data->P[plr].AIStat == 2 && Data->Year >= 61 && Data->Season == 0) { Data->P[plr].AIStat = 3; } if (Data->P[plr].AIStat <= 2) { if (GenPur(plr, PROBE_HARDWARE, PROBE_HW_ORBITAL)) { RDafford(plr, PROBE_HARDWARE, PROBE_HW_ORBITAL); } else { RDafford(plr, PROBE_HARDWARE, PROBE_HW_ORBITAL); } if (GenPur(plr, ROCKET_HARDWARE, ROCKET_HW_ONE_STAGE)) { RDafford(plr, ROCKET_HARDWARE, ROCKET_HW_ONE_STAGE); } else { RDafford(plr, ROCKET_HARDWARE, ROCKET_HW_ONE_STAGE); } Data->P[plr].Buy[PROBE_HARDWARE][PROBE_HW_ORBITAL] = 0; Data->P[plr].Buy[ROCKET_HARDWARE][ROCKET_HW_ONE_STAGE] = 0; Data->P[plr].Buy[MANNED_HARDWARE][MANNED_HW_ONE_MAN_CAPSULE] = 0; if (Data->Year <= 59) { Data->P[plr].Probe[PROBE_HW_ORBITAL].Num++; Data->P[plr].Rocket[ROCKET_HW_ONE_STAGE].Num++; AIFuture(plr, Mission_Orbital_Satellite, 0, 0); } KeepRD(plr, 5); Data->P[plr].Buy[PROBE_HARDWARE][PROBE_HW_ORBITAL] = 0; Data->P[plr].Buy[ROCKET_HARDWARE][ROCKET_HW_ONE_STAGE] = 0; Data->P[plr].Buy[MANNED_HARDWARE][MANNED_HW_ONE_MAN_CAPSULE] = 0; RDafford(plr, MANNED_HARDWARE, MANNED_HW_ONE_MAN_CAPSULE); RDafford(plr, ROCKET_HARDWARE, ROCKET_HW_ONE_STAGE); if (Data->P[plr].AIStat < 2) { AIPur(plr); } prg[0] = 1; if (NoFail(plr) == 0) { if ((Data->Year == 59 && Data->Season == 1) || Data->Year >= 60) { switch (Data->P[plr].AIStrategy[AI_BEGINNING_STRATEGY]) { case 0: if (Data->P[plr].Manned[MISC_HW_EVA_SUITS].Safety > Data->P[plr].Manned[MISC_HW_EVA_SUITS].MaxRD - 20) { AIFuture(plr, Mission_Earth_Orbital_EVA, 0, (char *)&prg); } else { AIFuture(plr, Mission_SubOrbital, 0, (char *)&prg); } Data->P[plr].Manned[MANNED_HW_ONE_MAN_CAPSULE].Safety += 10; Data->P[plr].Manned[MISC_HW_EVA_SUITS].Safety += 10; ++Data->P[plr].AIStrategy[AI_BEGINNING_STRATEGY]; break; case 1: if (PrestigeCheck(plr, Prestige_MannedSpaceMission) == 0 && PrestigeCheck(other(plr), Prestige_MannedSpaceMission) == 0) { // && Data->P[plr].Manned[MANNED_HW_TWO_MAN_CAPSULE].Safety>Data->P[plr].Manned[MANNED_HW_TWO_MAN_CAPSULE].MaxRD-25) AIFuture(plr, Mission_SubOrbital, 0, (char *)&prg); } else if (PrestigeCheck(plr, Prestige_MannedOrbital) == 0 && PrestigeCheck(other(plr), Prestige_MannedOrbital) == 0) { // && Data->P[plr].Manned[MANNED_HW_TWO_MAN_CAPSULE].Safety>Data->P[plr].Manned[MANNED_HW_TWO_MAN_CAPSULE].MaxRD-25) AIFuture(plr, Mission_Earth_Orbital, 0, (char *)&prg); } else if (PrestigeCheck(plr, Prestige_MannedSpaceMission) == 0 && PrestigeCheck(other(plr), Prestige_MannedSpaceMission) == 1) { // && Data->P[plr].Manned[MANNED_HW_TWO_MAN_CAPSULE].Safety>Data->P[plr].Manned[MANNED_HW_TWO_MAN_CAPSULE].MaxRD-25) AIFuture(plr, Mission_Earth_Orbital, 0, (char *)&prg); } else if (PrestigeCheck(plr, Prestige_MannedOrbital) == 0 && PrestigeCheck(other(plr), Prestige_MannedOrbital) == 1) { // && Data->P[plr].Manned[MANNED_HW_TWO_MAN_CAPSULE].Safety>Data->P[plr].Manned[MANNED_HW_TWO_MAN_CAPSULE].MaxRD-25) AIFuture(plr, Mission_SubOrbital, 0, (char *)&prg); } ++Data->P[plr].AIStrategy[AI_BEGINNING_STRATEGY]; break; case 2: if (PrestigeCheck(plr, Prestige_MannedSpaceMission) == 0 && PrestigeCheck(other(plr), Prestige_MannedSpaceMission) == 0) { // && Data->P[plr].Manned[MANNED_HW_TWO_MAN_CAPSULE].Safety>Data->P[plr].Manned[MANNED_HW_TWO_MAN_CAPSULE].MaxRD-25) AIFuture(plr, Mission_SubOrbital, 0, (char *)&prg); } else if (PrestigeCheck(plr, Prestige_MannedOrbital) == 0 && PrestigeCheck(other(plr), Prestige_MannedOrbital) == 0) { // && Data->P[plr].Manned[MANNED_HW_TWO_MAN_CAPSULE].Safety>Data->P[plr].Manned[MANNED_HW_TWO_MAN_CAPSULE].MaxRD-25) AIFuture(plr, Mission_Earth_Orbital, 0, (char *)&prg); } else if (PrestigeCheck(plr, Prestige_MannedSpaceMission) == 0 && PrestigeCheck(other(plr), Prestige_MannedSpaceMission) == 1) { // && Data->P[plr].Manned[MANNED_HW_TWO_MAN_CAPSULE].Safety>Data->P[plr].Manned[MANNED_HW_TWO_MAN_CAPSULE].MaxRD-25) AIFuture(plr, Mission_Earth_Orbital, 0, (char *)&prg); } else if (PrestigeCheck(plr, Prestige_MannedOrbital) == 0 && PrestigeCheck(other(plr), Prestige_MannedOrbital) == 1) { // && Data->P[plr].Manned[MANNED_HW_TWO_MAN_CAPSULE].Safety>Data->P[plr].Manned[MANNED_HW_TWO_MAN_CAPSULE].MaxRD-25) AIFuture(plr, Mission_Earth_Orbital_EVA, 0, (char *)&prg); //2 } else { Data->P[plr].AIStat = 3; } ++Data->P[plr].AIStrategy[AI_BEGINNING_STRATEGY]; break; default: break; } if (Data->P[plr].Manned[MANNED_HW_ONE_MAN_CAPSULE].Num >= 2 && Data->P[plr].Rocket[ROCKET_HW_ONE_STAGE].Num >= 2) { if (Data->P[plr].Future[0].MissionCode == Mission_SubOrbital) { AIFuture(plr, Mission_Earth_Orbital, 1, (char *)&prg); } else if (Data->P[plr].Future[0].MissionCode == Mission_Earth_Orbital) { AIFuture(plr, Mission_SubOrbital, 1, (char *)&prg); } else if (Data->P[plr].Future[0].MissionCode == Mission_Earth_Orbital_EVA) { AIFuture(plr, Mission_Earth_Orbital, 1, (char *)&prg); } }; }; }; AILaunch(plr); } if (GenPur(plr, MISC_HARDWARE, MISC_HW_EVA_SUITS)) { RDafford(plr, MISC_HARDWARE, MISC_HW_EVA_SUITS); } else { RDafford(plr, MISC_HARDWARE, MISC_HW_EVA_SUITS); } Data->P[plr].Buy[MISC_HARDWARE][MISC_HW_EVA_SUITS] = 0; RDafford(plr, MISC_HARDWARE, MISC_HW_EVA_SUITS); if (Data->P[plr].AIStat >= 2) { CheckVoting(plr); // gets AIPrim,AISec,AILunar if (Data->P[plr].AIPrim == 0) { ProgramVoting(plr); } } // primary/secondary programs if (Data->P[plr].AIPrim == 8) { Data->P[plr].AIPrim = 6; Data->P[plr].AISec = 8; } if (Data->P[plr].AIPrim == 6) { Data->P[plr].AISec = 8; } if (Data->P[plr].AIPrim == 9) { Data->P[plr].AIPrim = 6; Data->P[plr].AISec = 9; } if (Data->P[plr].AILunar == 4) { Data->P[plr].AIPrim = 6; Data->P[plr].AISec = (Data->P[plr].Manned[MANNED_HW_TWO_MAN_CAPSULE].Safety >= Data->P[plr].Manned[MANNED_HW_FOUR_MAN_CAPSULE].Safety) ? 6 : 10; } // boosters if (Data->P[plr].AIStat >= 2) { if (GenPur(plr, ROCKET_HARDWARE, ROCKET_HW_BOOSTERS)) { RDafford(plr, ROCKET_HARDWARE, ROCKET_HW_BOOSTERS); } else { RDafford(plr, ROCKET_HARDWARE, ROCKET_HW_BOOSTERS); } } if (CheckSafety(plr, Data->P[plr].AIPrim) >= CheckSafety(plr, Data->P[plr].AISec)) { KeepRD(plr, Data->P[plr].AIPrim); } else { KeepRD(plr, Data->P[plr].AISec); } // larger rocket klugge if (Data->P[plr].AIStrategy[AI_LARGER_ROCKET_STRATEGY] == 1) { if (Level_Check != 0) { Data->P[plr].Cash += 25; // temporary } if (Data->P[plr].AILunar < 4) { if (GenPur(plr, ROCKET_HARDWARE, ROCKET_HW_THREE_STAGE)) { RDafford(plr, ROCKET_HARDWARE, ROCKET_HW_THREE_STAGE); } else { RDafford(plr, ROCKET_HARDWARE, ROCKET_HW_THREE_STAGE); } Data->P[plr].Buy[ROCKET_HARDWARE][ROCKET_HW_THREE_STAGE] = 0; RDafford(plr, ROCKET_HARDWARE, ROCKET_HW_THREE_STAGE); } else { if (Level_Check != 0) { Data->P[plr].Cash += 25; } if (GenPur(plr, ROCKET_HARDWARE, ROCKET_HW_MEGA_STAGE)) { RDafford(plr, ROCKET_HARDWARE, ROCKET_HW_MEGA_STAGE); } else { RDafford(plr, ROCKET_HARDWARE, ROCKET_HW_MEGA_STAGE); } Data->P[plr].Buy[ROCKET_HARDWARE][ROCKET_HW_MEGA_STAGE] = 0; RDafford(plr, ROCKET_HARDWARE, ROCKET_HW_MEGA_STAGE); } } if (Data->Year >= 62) if (Data->P[plr].AIStrategy[AI_LUNAR_MODULE] < 5) { PickModule(plr); } if (Data->P[plr].AILunar > 0 && Data->P[plr].AILunar < 4) { if (Data->P[plr].AIStrategy[AI_LUNAR_MODULE] > 0) { if (GenPur(plr, MANNED_HARDWARE, Data->P[plr].AIStrategy[AI_LUNAR_MODULE])) { RDafford(plr, MANNED_HARDWARE, Data->P[plr].AIStrategy[AI_LUNAR_MODULE]); } else { RDafford(plr, MANNED_HARDWARE, Data->P[plr].AIStrategy[AI_LUNAR_MODULE]); } Data->P[plr].Buy[MANNED_HARDWARE][Data->P[plr].AIStrategy[AI_LUNAR_MODULE]] = 0; RDafford(plr, MANNED_HARDWARE, Data->P[plr].AIStrategy[AI_LUNAR_MODULE]); } } for (i = 0; i < 3; i++) if (Data->P[plr].LaunchFacility[i] > 1) if (Data->P[plr].LaunchFacility[i] <= Data->P[plr].Cash) { Data->P[plr].Cash -= Data->P[plr].LaunchFacility[i]; Data->P[plr].LaunchFacility[i] = 1; } Data->P[plr].LaunchFacility[0] = 1; Data->P[plr].LaunchFacility[1] = 1; Data->P[plr].LaunchFacility[2] = 1; if (Data->P[plr].AIStat == 3) { switch (Data->P[plr].AILunar) { case 1: MoonProgram(plr, 1); break; case 2: MoonProgram(plr, 2); break; case 3: MoonProgram(plr, 3); break; case 4: MoonProgram(plr, 4); if (GenPur(plr, ROCKET_HARDWARE, ROCKET_HW_MEGA_STAGE)) { RDafford(plr, ROCKET_HARDWARE, ROCKET_HW_MEGA_STAGE); } RDafford(plr, ROCKET_HARDWARE, ROCKET_HW_MEGA_STAGE); break; default: break; } } if (Data->P[plr].AIStat >= 2 && Data->Year >= 61 && Data->P[plr].AIStrategy[AI_END_STAGE_LOCATION] >= 2) { if ((Data->P[plr].Probe[PROBE_HW_ORBITAL].Safety >= Data->P[plr].Probe[PROBE_HW_ORBITAL].MaxRD - 20) || Data->P[plr].Probe[PROBE_HW_INTERPLANETARY].Num >= 0) { Data->P[plr].Cash += Data->P[plr].Probe[PROBE_HW_INTERPLANETARY].InitCost + 30; if (Data->P[plr].Probe[PROBE_HW_INTERPLANETARY].Num <= 0) { if (GenPur(plr, PROBE_HARDWARE, PROBE_HW_INTERPLANETARY)) { RDafford(plr, PROBE_HARDWARE, PROBE_HW_INTERPLANETARY); } else { RDafford(plr, PROBE_HARDWARE, PROBE_HW_INTERPLANETARY); } } Data->P[plr].Buy[PROBE_HARDWARE][PROBE_HW_INTERPLANETARY] = 0; RDafford(plr, PROBE_HARDWARE, PROBE_HW_INTERPLANETARY); } if ((Data->P[plr].Probe[PROBE_HW_INTERPLANETARY].Safety >= Data->P[plr].Probe[PROBE_HW_INTERPLANETARY].MaxRD - 20) || Data->P[plr].Probe[PROBE_HW_LUNAR].Num >= 0) { Data->P[plr].Cash += Data->P[plr].Probe[PROBE_HW_LUNAR].InitCost + 30; if (Data->P[plr].Probe[PROBE_HW_LUNAR].Num <= 0) { if (GenPur(plr, PROBE_HARDWARE, PROBE_HW_LUNAR)) { RDafford(plr, PROBE_HARDWARE, PROBE_HW_LUNAR); } else { RDafford(plr, PROBE_HARDWARE, PROBE_HW_LUNAR); } } Data->P[plr].Buy[PROBE_HARDWARE][PROBE_HW_LUNAR] = 0; RDafford(plr, PROBE_HARDWARE, PROBE_HW_LUNAR); } if (GenPur(plr, ROCKET_HARDWARE, ROCKET_HW_TWO_STAGE)) { RDafford(plr, ROCKET_HARDWARE, ROCKET_HW_TWO_STAGE); } else { RDafford(plr, ROCKET_HARDWARE, ROCKET_HW_TWO_STAGE); } } if (PrestigeCheck(plr, Prestige_MannedSpaceMission) || PrestigeCheck(plr, Prestige_MannedOrbital)) { Data->P[plr].AIStat = 3; } // **** end stages *** if (Data->P[plr].AIStat == 3) { if (Data->P[plr].AILunar < 4) { if (CheckSafety(plr, Data->P[plr].AIPrim) > CheckSafety(plr, Data->P[plr].AISec)) { val = Data->P[plr].AIPrim; } else { val = Data->P[plr].AISec; } if (val < 7) { val = val - 4; } else { val = val - 5; } if (Data->P[plr].Manned[val - 1].Safety >= Data->P[plr].Manned[val - 1].MaxRD - 15) { NewAI(plr, val); } } else if (Data->P[plr].AILunar == 4) { if (Data->P[plr].Manned[MANNED_HW_FOUR_MAN_CAPSULE].Safety >= Data->P[plr].Manned[MANNED_HW_FOUR_MAN_CAPSULE].MaxRD - 10) { Data->P[plr].AISec = 10; } else { Data->P[plr].AISec = 6; } if (CheckSafety(plr, Data->P[plr].AIPrim) > CheckSafety(plr, Data->P[plr].AISec)) { val = Data->P[plr].AIPrim; } else { val = Data->P[plr].AISec; } if (val < 7) { val = val - 4; } else { val = val - 5; } if (Data->P[plr].Manned[val - 1].Safety >= Data->P[plr].Manned[val - 1].MaxRD - 15) { NewAI(plr, val); } else { Data->P[plr].Probe[PROBE_HW_ORBITAL].Num += 2; Data->P[plr].Rocket[ROCKET_HW_ONE_STAGE].Num += 2; AIFuture(plr, Mission_Orbital_Satellite, 0, 0); AIFuture(plr, Mission_Orbital_Satellite, 1, 0); AIFuture(plr, Mission_Orbital_Satellite, 2, 0); } } if (CheckSafety(plr, Data->P[plr].AIPrim) > CheckSafety(plr, Data->P[plr].AISec)) { val = Data->P[plr].AIPrim; if (val < 7) { val = val - 4; } else { val = val - 5; } if (CheckSafety(plr, Data->P[plr].AIPrim) > Data->P[plr].Manned[val - 1].MaxRD - 10) if (Data->P[plr].Manned[val - 1].Num >= 1) { KeepRD(plr, Data->P[plr].AISec); } } else { val = Data->P[plr].AISec; if (val < 7) { val = val - 4; } else { val = val - 5; } if (CheckSafety(plr, Data->P[plr].AISec) > Data->P[plr].Manned[val - 1].MaxRD - 10) if (Data->P[plr].Manned[val - 1].Num >= 1) { KeepRD(plr, Data->P[plr].AIPrim); } } } RDPrograms(plr); return; }