/** * @sa CL_ParseClientData */ static void CP_ParseCampaign (const char *name, const char **text) { const char *errhead = "CP_ParseCampaign: unexpected end of file (campaign "; campaign_t *cp; const char *token; int i; salary_t *s; /* search for campaigns with same name */ for (i = 0; i < ccs.numCampaigns; i++) if (Q_streq(name, ccs.campaigns[i].id)) break; if (i < ccs.numCampaigns) { Com_Printf("CP_ParseCampaign: campaign def \"%s\" with same name found, second ignored\n", name); return; } if (ccs.numCampaigns >= MAX_CAMPAIGNS) { Com_Printf("CP_ParseCampaign: Max campaigns reached (%i)\n", MAX_CAMPAIGNS); return; } /* initialize the campaign */ cp = &ccs.campaigns[ccs.numCampaigns++]; OBJZERO(*cp); cp->idx = ccs.numCampaigns - 1; Q_strncpyz(cp->id, name, sizeof(cp->id)); /* some default values */ cp->team = TEAM_PHALANX; Q_strncpyz(cp->researched, "researched_human", sizeof(cp->researched)); /* get it's body */ token = Com_Parse(text); if (!*text || *token != '{') { Com_Printf("CP_ParseCampaign: campaign def \"%s\" without body ignored\n", name); ccs.numCampaigns--; return; } /* some default values */ s = &cp->salaries; s->base[EMPL_SOLDIER] = 3000; s->rankBonus[EMPL_SOLDIER] = 500; s->base[EMPL_WORKER] = 3000; s->rankBonus[EMPL_WORKER] = 500; s->base[EMPL_SCIENTIST] = 3000; s->rankBonus[EMPL_SCIENTIST] = 500; s->base[EMPL_PILOT] = 3000; s->rankBonus[EMPL_PILOT] = 500; s->aircraftFactor = 1; s->aircraftDivisor = 25; s->baseUpkeep = 20000; s->adminInitial = 1000; s->admin[EMPL_SOLDIER] = 75; s->admin[EMPL_WORKER] = 75; s->admin[EMPL_SCIENTIST] = 75; s->admin[EMPL_PILOT] = 75; s->debtInterest = 0.005; do { token = Com_EParse(text, errhead, name); if (!*text) break; if (*token == '}') break; /* check for some standard values */ if (Com_ParseBlockToken(name, text, cp, campaign_vals, NULL, token)) { continue; } else if (Q_streq(token, "salary")) { CP_ParseSalary(token, text, s); } else if (Q_streq(token, "events")) { token = Com_EParse(text, errhead, name); if (!*text) return; cp->events = CP_GetEventsByID(token); } else { Com_Printf("CP_ParseCampaign: unknown token \"%s\" ignored (campaign %s)\n", token, name); Com_EParse(text, errhead, name); } } while (*text); if (cp->difficulty < -4) cp->difficulty = -4; else if (cp->difficulty > 4) cp->difficulty = 4; }
/** * @sa CL_ParseClientData */ static void CP_ParseCampaign (const char *name, const char **text) { const char *errhead = "CP_ParseCampaign: unexpected end of file (campaign "; campaign_t *cp; const char *token; int i; salary_t *s; bool drop = false; /* search for campaigns with same name */ for (i = 0; i < ccs.numCampaigns; i++) if (Q_streq(name, ccs.campaigns[i].id)) break; if (i < ccs.numCampaigns) { Com_Printf("CP_ParseCampaign: campaign def \"%s\" with same name found, second ignored\n", name); return; } if (ccs.numCampaigns >= MAX_CAMPAIGNS) { Com_Printf("CP_ParseCampaign: Max campaigns reached (%i)\n", MAX_CAMPAIGNS); return; } /* initialize the campaign */ cp = &ccs.campaigns[ccs.numCampaigns++]; OBJZERO(*cp); cp->idx = ccs.numCampaigns - 1; Q_strncpyz(cp->id, name, sizeof(cp->id)); /* some default values */ cp->team = TEAM_PHALANX; Q_strncpyz(cp->researched, "researched_human", sizeof(cp->researched)); cp->researchRate = 0.8f; cp->produceRate = 1.0f; cp->healingRate = 1.0f; cp->ufoReductionRate = NON_OCCURRENCE_PROBABILITY; cp->initialInterest = INITIAL_OVERALL_INTEREST; /* get it's body */ token = Com_Parse(text); if (!*text || *token != '{') { Com_Printf("CP_ParseCampaign: campaign def \"%s\" without body ignored\n", name); ccs.numCampaigns--; return; } /* set undefined markers */ s = &cp->salaries; for (i = 0; i < MAX_EMPL; i++) { s->base[i] = -1; s->rankBonus[i] = -1; s->admin[i] = -1; } s->aircraftFactor = -1; s->aircraftDivisor = -1; s->baseUpkeep = -1; s->adminInitial = -1; s->debtInterest = -1; do { token = cgi->Com_EParse(text, errhead, name); if (!*text) break; if (*token == '}') break; /* check for some standard values */ if (Com_ParseBlockToken(name, text, cp, campaign_vals, NULL, token)) { continue; } else if (Q_streq(token, "salary")) { CP_ParseSalary(token, text, s); } else if (Q_streq(token, "events")) { token = cgi->Com_EParse(text, errhead, name); if (!*text) return; cp->events = CP_GetEventsByID(token); } else { Com_Printf("CP_ParseCampaign: unknown token \"%s\" ignored (campaign %s)\n", token, name); cgi->Com_EParse(text, errhead, name); } } while (*text); if (cp->difficulty < -4) cp->difficulty = -4; else if (cp->difficulty > 4) cp->difficulty = 4; /* checking for undefined values */ for (i = 0; i < MAX_EMPL; i++) { if (s->base[i] == -1 || s->rankBonus[i] == -1 || s->admin[i] == -1) { drop = true; break; } } if (drop || s->aircraftFactor == -1 || s->aircraftDivisor == -1 || s->baseUpkeep == -1 || s->adminInitial == -1 || s->debtInterest == -1) { Com_Printf("CP_ParseCampaign: check salary definition. Campaign def \"%s\" ignored\n", name); ccs.numCampaigns--; return; } }