/** * @sa CL_ParseScriptFirst * @note write into cp_campaignPool - free on every game restart and reparse */ void CL_ParseCampaignEvents (const char *name, const char **text) { const char *errhead = "CL_ParseCampaignEvents: unexpected end of file (events "; const char *token; campaignEvents_t* events; if (ccs.numCampaignEventDefinitions >= MAX_CAMPAIGNS) { Com_Printf("CL_ParseCampaignEvents: max events def limit hit\n"); return; } token = cgi->Com_EParse(text, errhead, name); if (!*text) return; if (!*text || token[0] != '{') { Com_Printf("CL_ParseCampaignEvents: events def '%s' without body ignored\n", name); return; } events = &ccs.campaignEvents[ccs.numCampaignEventDefinitions]; OBJZERO(*events); Com_DPrintf(DEBUG_CLIENT, "...found events %s\n", name); events->id = Mem_PoolStrDup(name, cp_campaignPool, 0); ccs.numCampaignEventDefinitions++; do { campaignEvent_t *event; token = cgi->Com_EParse(text, errhead, name); if (!*text) break; if (*token == '}') break; if (events->numCampaignEvents >= MAX_CAMPAIGNEVENTS) { Com_Printf("CL_ParseCampaignEvents: max events per event definition limit hit\n"); return; } /* initialize the eventMail */ event = &events->campaignEvents[events->numCampaignEvents++]; OBJZERO(*event); Mem_PoolStrDupTo(token, (char**) ((char*)event + (int)offsetof(campaignEvent_t, tech)), cp_campaignPool, 0); token = cgi->Com_EParse(text, errhead, name); if (!*text) return; cgi->Com_EParseValue(event, token, V_INT, offsetof(campaignEvent_t, interest), sizeof(int)); if (event->interest < 0) Sys_Error("Illegal interest value in events definition '%s' for tech '%s'", events->id, event->tech); } while (*text); }
/** * @brief Parse 2D objects like text and images * @return 1 - increase the command position of the sequence by one * @sa seq2D_vals * @sa CL_SequenceFind2D */ static int SEQ_ExecuteObj2D (sequenceContext_t *context, const char *name, const char *data) { seq2D_t *s2d; const value_t *vp; int i; /* get sequence text */ s2d = SEQ_Find2D(context, name); if (!s2d) { /* create new sequence text */ for (i = 0, s2d = context->obj2Ds; i < context->numObj2Ds; i++, s2d++) if (!s2d->inuse) break; if (i >= context->numObj2Ds) { if (context->numObj2Ds >= MAX_SEQ2DS) Com_Error(ERR_FATAL, "Too many sequence 2d objects"); s2d = &context->obj2Ds[context->numObj2Ds++]; } /* allocate */ OBJZERO(*s2d); for (i = 0; i < 4; i++) s2d->color[i] = 1.0f; s2d->inuse = true; Q_strncpyz(s2d->font, "f_big", sizeof(s2d->font)); /* default font */ Q_strncpyz(s2d->name, name, sizeof(s2d->name)); } /* get values */ while (*data) { for (vp = seq2D_vals; vp->string; vp++) if (Q_streq(data, vp->string)) { data += strlen(data) + 1; switch (vp->type) { case V_TRANSLATION_STRING: data++; case V_HUNK_STRING: Mem_PoolStrDupTo(data, &Com_GetValue<char*>(s2d, vp), cl_genericPool, 0); break; default: Com_EParseValue(s2d, data, vp->type, vp->ofs, vp->size); break; } break; } if (!vp->string) Com_Printf("SEQ_ExecuteObj2D: unknown token '%s'\n", data); data += strlen(data) + 1; } return 1; }
/** * @brief parses the models.ufo and all files where UI models (menu_model) are defined * @sa CL_ParseClientData */ bool UI_ParseUIModel (const char* name, const char** text) { const char* errhead = "UI_ParseUIModel: unexpected end of file (names "; /* search for a UI models with same name */ for (int i = 0; i < ui_global.numModels; i++) if (Q_streq(ui_global.models[i].id, name)) { Com_Printf("UI_ParseUIModel: menu_model \"%s\" with same name found, second ignored\n", name); return false; } if (ui_global.numModels >= UI_MAX_MODELS) { Com_Printf("UI_ParseUIModel: Max UI models reached\n"); return false; } /* initialize the model */ uiModel_t* model = &ui_global.models[ui_global.numModels]; OBJZERO(*model); Vector4Set(model->color, 1, 1, 1, 1); model->id = Mem_PoolStrDup(name, ui_sysPool, 0); Com_DPrintf(DEBUG_CLIENT, "Found UI model %s (%i)\n", model->id, ui_global.numModels); /* get it's body */ const char* token = Com_Parse(text); if (!*text || token[0] != '{') { Com_Printf("UI_ParseUIModel: Model \"%s\" without body ignored\n", model->id); return false; } ui_global.numModels++; do { const value_t* v = nullptr; /* get the name type */ token = Com_EParse(text, errhead, name); if (!*text) return false; if (token[0] == '}') break; v = UI_FindPropertyByName(uiModelProperties, token); if (!v) { Com_Printf("UI_ParseUIModel: unknown token \"%s\" ignored (UI model %s)\n", token, name); return false; } if (v->type == V_NULL) { if (Q_streq(v->string, "need")) { token = Com_EParse(text, errhead, name); if (!*text) return false; if (model->next != nullptr) Sys_Error("UI_ParseUIModel: second 'need' token found in model %s", name); model->next = UI_GetUIModel(token); if (!model->next) Com_Printf("Could not find UI model %s", token); } } else { token = Com_EParse(text, errhead, name); if (!*text) return false; switch (v->type) { case V_HUNK_STRING: Mem_PoolStrDupTo(token, &Com_GetValue<char*>(model, v), ui_sysPool, 0); break; default: Com_EParseValue(model, token, v->type, v->ofs, v->size); break; } } } while (*text); return true; }
/** * @sa CL_ParseClientData */ bool UI_ParseFont (const char* name, const char** text) { const char* errhead = "UI_ParseFont: unexpected end of file (font"; /* search for font with same name */ if (UI_GetFontByID(name)) { Com_Printf("UI_ParseFont: font \"%s\" with same name found, second ignored\n", name); return false; } if (numFonts >= MAX_FONTS) { Com_Printf("UI_ParseFont: Max fonts reached\n"); return false; } /* initialize the UI */ uiFont_t* font = &fonts[numFonts]; OBJZERO(*font); font->name = Mem_PoolStrDup(name, ui_sysPool, 0); Com_DPrintf(DEBUG_CLIENT, "...found font %s (%i)\n", font->name, numFonts); /* get it's body */ const char* token = Com_Parse(text); if (!*text || *token != '{') { Com_Printf("UI_ParseFont: font \"%s\" without body ignored\n", name); return false; } numFonts++; do { /* get the name type */ token = Com_EParse(text, errhead, name); if (!*text) return false; if (*token == '}') break; const value_t* v; for (v = fontValues; v->string; v++) if (Q_streq(token, v->string)) { /* found a definition */ token = Com_EParse(text, errhead, name); if (!*text) return false; switch (v->type) { case V_TRANSLATION_STRING: token++; case V_HUNK_STRING: Mem_PoolStrDupTo(token, &Com_GetValue<char*>(font, v), ui_sysPool, 0); break; default: Com_EParseValue(font, token, v->type, v->ofs, v->size); break; } break; } if (!v->string) Com_Printf("UI_ParseFont: unknown token \"%s\" ignored (font %s)\n", token, name); } while (*text); UI_RegisterFont(font); return true; }