137 const char* errhead =
"B_ParseBuildings: unexpected end of file (names ";
142 if (!*text || *token !=
'{') {
143 cgi->Com_Printf(
"B_ParseBuildings: building \"%s\" without body ignored\n",
name);
148 cgi->Com_Error(
ERR_DROP,
"B_ParseBuildings: too many buildings");
151 for (
int i = 0;
i <
ccs.numBuildingTemplates;
i++) {
153 cgi->Com_Printf(
"B_ParseBuildings: Second building with same name found (%s) - second ignored\n",
name);
159 building = &
ccs.buildingTemplates[
ccs.numBuildingTemplates];
166 building->
tpl = building;
168 building->
base =
nullptr;
172 building->
size[0] = 1;
173 building->
size[1] = 1;
175 ccs.numBuildingTemplates++;
178 token =
cgi->Com_EParse(text, errhead,
name);
186 token =
cgi->Com_EParse(text, errhead,
name);
192 cgi->Com_Printf(
"didn't find buildingType '%s'\n", token);
195 if (
Q_streq(token,
"depends")) {
196 cgi->Com_EParse(text, errhead,
name);
201 cgi->Com_Printf(
"B_ParseBuildings: unknown token \"%s\" ignored (building %s)\n", token,
name);
206 cgi->Com_Printf(
"B_ParseBuildings: Invalid size for building %s (%i, %i)\n", building->
id, (
int)building->
size[0], (
int)building->
size[1]);
207 ccs.numBuildingTemplates--;
212 cgi->Com_Error(
ERR_DROP,
"B_ParseBuildings: Could not find building with id %s\n",
name);
216 building->
tech = techLink;
220 token =
cgi->Com_EParse(text, errhead,
name);
226 if (
Q_streq(token,
"depends")) {
228 if (!dependsBuilding)
229 cgi->Com_Error(
ERR_DROP,
"Could not find building depend of %s\n", building->
id);
247 for (
i = 0, b =
ccs.buildingTemplates;
i <
ccs.numBuildingTemplates;
i++, b++) {
250 cgi->Com_Printf(
"...... no name for building '%s' given\n", b->
id);
254 cgi->Com_Printf(
"...... no image for building '%s' given\n", b->
id);
258 cgi->Com_Printf(
"...... no pedia link for building '%s' given\n", b->
id);
261 cgi->Com_Printf(
"...... could not get pedia entry tech (%s) for building '%s'\n", b->
pedia, b->
id);
278 for (
int i = 0;
i <
ccs.numBuildingTemplates;
i++) {
280 if (
Q_streq(buildingTemplate->
id, buildingName))
281 return buildingTemplate;
294 if (!buildingName || buildingName[0] ==
'\0') {
295 cgi->Com_Printf(
"No, or empty building ID\n");
300 if (!buildingTemplate)
301 cgi->Com_Printf(
"Building %s not found\n", buildingName);
302 return buildingTemplate;
311 for (
int i = 0;
i <
ccs.numBuildingTemplates;
i++) {
314 return buildingTemplate;
346 const char* command =
nullptr;
348 assert(buildingTemplate);
356 command = buildingTemplate->
onEnable;
365 cgi->Com_Error(
ERR_DROP,
"B_FireEvent: Invalid Event\n");
369 cgi->Cmd_ExecuteString(
"%s %i %i", command, base->
idx, buildingTemplate->
buildingType);
DateTime class definition.
Share stuff between the different cgame implementations.
Class describing a point of time.
static const int SECONDS_PER_DAY
int getTimeAsSeconds() const
Return the time part of the DateTime as seconds.
int getDateAsDays() const
Return the date part of the DateTime as days.
bool B_GetBuildingStatus(const base_t *const base, const buildingType_t buildingType)
Get the status associated to a building.
bool B_FireEvent(const building_t *buildingTemplate, const base_t *base, buildingEvent_t eventType)
Run eventhandler script for a building.
bool B_CheckBuildingDependencesStatus(const building_t *building)
Check that the dependences of a building is operationnal.
static const struct buildingTypeMapping_s buildingTypeMapping[]
buildingType_t B_GetBuildingTypeByBuildingID(const char *buildingID)
Returns the building type for a given building identified by its building id from the ufo script file...
static const value_t valid_building_vars[]
Holds the names of valid entries in the basemanagement.ufo file.
bool B_BuildingScriptSanityCheck(void)
Checks the parsed buildings for errors.
const building_t * B_GetBuildingTemplateByType(buildingType_t type)
Returns the building template in the global building-types list for a buildingType.
building_t * B_GetBuildingTemplateSilent(const char *buildingName)
Returns the building in the global building-types list that has the unique name buildingID.
bool B_IsBuildingBuiltUp(const building_t *building)
Returns if a building is fully buildt up.
float B_GetConstructionTimeRemain(const building_t *building)
Returns the time remaining time of a building construction.
void B_ParseBuildings(const char *name, const char **text, bool link)
Copies an entry from the building description file into the list of building types.
building_t * B_GetBuildingTemplate(const char *buildingName)
Returns the building in the global building-types list that has the unique name buildingID.
Header for base building related stuff.
buildingEvent_t
Building events.
buildingType_t
All different building types.
memPool_t * cp_campaignPool
Header file for single player campaign control.
const cgame_import_t * cgi
technology_t * RS_GetTechByID(const char *id)
return a pointer to the technology identified by given id string
technology_t * RS_GetTechByProvided(const char *idProvided)
returns a pointer to the item tech (as listed in "provides")
Campaign geoscape time header.
const char * Com_Parse(const char *data_p[], char *target, size_t size, bool replaceWhitespaces)
Parse a token out of a string.
Shared parsing functions.
QGL_EXTERN int GLboolean GLfloat * v
QGL_EXTERN GLint GLenum type
QGL_EXTERN GLuint GLsizei GLsizei GLint GLenum GLchar * name
#define MEMBER_SIZEOF(TYPE, MEMBER)
#define Q_strvalid(string)
A base with all it's data.
A building with all it's data.
const struct building_s * dependsBuilding
buildingType_t buildingType
struct technology_s * tech
This is the technology parsed from research.ufo.