Beispiel #1
0
/**
 * @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);
}
Beispiel #2
0
/**
 * @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;
}
Beispiel #3
0
/**
 * @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;
}
Beispiel #4
0
/**
 * @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;
}