/** * @brief Add a single alien of a given type. */ static void AC_AddOne_f (void) { const char *alienName; teamDef_t *alienType; aliensCont_t *containment; qboolean updateAlive = qtrue; int j; base_t *base = B_GetCurrentSelectedBase(); /* Can be called from everywhere. */ if (!base) return; /* arg parsing */ if (Cmd_Argc() < 2) { Com_Printf("Usage: %s <alientype> [dead:true|false]\n", Cmd_Argv(0)); return; } alienName = Cmd_Argv(1); alienType = Com_GetTeamDefinitionByID(alienName); if (!alienType) { Com_Printf("AC_AddOne_f: Team definition '%s' does not exist.\n", alienName); return; } /* Check that alientType exists */ containment = base->alienscont; for (j = 0; j < ccs.numAliensTD; j++) { aliensCont_t *ac = &containment[j]; assert(ac->teamDef); if (ac->teamDef == alienType) break; } if (j == ccs.numAliensTD) { Com_Printf("AC_AddOne_f: Alien Type '%s' does not exist. Available choices are:\n", alienName); for (j = 0; j < ccs.numAliensTD; j++) Com_Printf("\t* %s\n", containment[j].teamDef->name); return; } if (Cmd_Argc() == 3) updateAlive = Com_ParseBoolean(Com_Argv(2)); /* update alien counter*/ if (B_GetBuildingStatus(base, B_ALIEN_CONTAINMENT)) { containment = base->alienscont; } else { return; } /* call the function that actually changes the persistent datastructure */ AL_AddAliens2(base, alienType, !updateAlive); }
qboolean GAME_ItemIsUseable (const objDef_t *od) { const cgame_export_t *list = GAME_GetCurrentType(); if (INV_IsArmour(od)) { const char *teamDefID = GAME_GetTeamDef(); const teamDef_t *teamDef = Com_GetTeamDefinitionByID((teamDefID)); /* Don't allow armour for other teams */ if (!GAME_IsArmourUseableForTeam(od, teamDef)) return qfalse; } if (list && list->IsItemUseable) return list->IsItemUseable(od); return qtrue; }
/** * @brief Load callback for savin in XML Format * @sa AC_LoadXML * @sa B_SaveXML * @sa SAV_GameLoadXML */ qboolean AC_LoadXML (mxml_node_t * parent) { mxml_node_t *aliencont; mxml_node_t *contNode; int i; aliencont = mxml_GetNode(parent, SAVE_ALIENCONT_ALIENCONT); ccs.breathingMailSent = mxml_GetBool(aliencont, SAVE_ALIENCONT_BREATHINGMAILSENT, qfalse); /* Init alienContainers */ for (i = 0; i < MAX_BASES; i++) { base_t *base = B_GetBaseByIDX(i); AL_FillInContainment(base); } /* Load data */ for (contNode = mxml_GetNode(aliencont, SAVE_ALIENCONT_CONT); contNode; contNode = mxml_GetNextNode(contNode, aliencont, SAVE_ALIENCONT_CONT)) { int j = mxml_GetInt(contNode, SAVE_ALIENCONT_BASEIDX, MAX_BASES); base_t *base = B_GetFoundedBaseByIDX(j); int k; mxml_node_t *alienNode; if (!base) { Com_Printf("AC_LoadXML: Invalid base idx '%i'\n", j); continue; } for (k = 0, alienNode = mxml_GetNode(contNode, SAVE_ALIENCONT_ALIEN); alienNode && k < MAX_ALIENCONT_CAP; alienNode = mxml_GetNextNode(alienNode, contNode, SAVE_ALIENCONT_ALIEN), k++) { const char *const s = mxml_GetString(alienNode, SAVE_ALIENCONT_TEAMID); /* Fill Alien Containment with default values like the tech pointer. */ base->alienscont[k].teamDef = Com_GetTeamDefinitionByID(s); if (base->alienscont[k].teamDef) { base->alienscont[k].amountAlive = mxml_GetInt(alienNode, SAVE_ALIENCONT_AMOUNTALIVE, 0); base->alienscont[k].amountDead = mxml_GetInt(alienNode, SAVE_ALIENCONT_AMOUNTDEAD, 0); } } } return qtrue; }
/** * @sa CL_ParseScriptFirst */ static void CP_ParseAlienTeam (const char *name, const char **text) { const char *errhead = "CP_ParseAlienTeam: unexpected end of file (alienteam "; const char *token; int i; alienTeamCategory_t *alienCategory; /* get it's body */ token = Com_Parse(text); if (!*text || *token != '{') { Com_Printf("CP_ParseAlienTeam: alien team category \"%s\" without body ignored\n", name); return; } if (ccs.numAlienCategories >= ALIENCATEGORY_MAX) { Com_Printf("CP_ParseAlienTeam: maximum number of alien team category reached (%i)\n", ALIENCATEGORY_MAX); return; } /* search for category with same name */ for (i = 0; i < ccs.numAlienCategories; i++) if (Q_streq(name, ccs.alienCategories[i].id)) break; if (i < ccs.numAlienCategories) { Com_Printf("CP_ParseAlienTeam: alien category def \"%s\" with same name found, second ignored\n", name); return; } alienCategory = &ccs.alienCategories[ccs.numAlienCategories++]; Q_strncpyz(alienCategory->id, name, sizeof(alienCategory->id)); do { token = Com_EParse(text, errhead, name); if (!*text) break; if (*token == '}') break; if (Q_streq(token, "equipment")) { linkedList_t **list = &alienCategory->equipment; token = Com_EParse(text, errhead, name); if (!*text || *token != '{') { Com_Printf("CP_ParseAlienTeam: alien team category \"%s\" has equipment with no opening brace\n", name); break; } do { token = Com_EParse(text, errhead, name); if (!*text || *token == '}') break; LIST_AddString(list, token); } while (*text); } else if (Q_streq(token, "category")) { token = Com_EParse(text, errhead, name); if (!*text || *token != '{') { Com_Printf("CP_ParseAlienTeam: alien team category \"%s\" has category with no opening brace\n", name); break; } do { token = Com_EParse(text, errhead, name); if (!*text || *token == '}') break; alienCategory->missionCategories[alienCategory->numMissionCategories] = CP_GetAlienMissionTypeByID(token); if (alienCategory->missionCategories[alienCategory->numMissionCategories] == INTERESTCATEGORY_NONE) Com_Printf("CP_ParseAlienTeam: alien team category \"%s\" is used with no mission category. It won't be used in game.\n", name); alienCategory->numMissionCategories++; } while (*text); } else if (Q_streq(token, "team")) { alienTeamGroup_t *group; token = Com_EParse(text, errhead, name); if (!*text || *token != '{') { Com_Printf("CP_ParseAlienTeam: alien team \"%s\" has team with no opening brace\n", name); break; } if (alienCategory->numAlienTeamGroups >= MAX_ALIEN_GROUP_PER_CATEGORY) { Com_Printf("CP_ParseAlienTeam: maximum number of alien team reached (%i) in category \"%s\"\n", MAX_ALIEN_GROUP_PER_CATEGORY, name); break; } group = &alienCategory->alienTeamGroups[alienCategory->numAlienTeamGroups]; group->idx = alienCategory->numAlienTeamGroups; group->categoryIdx = alienCategory - ccs.alienCategories; alienCategory->numAlienTeamGroups++; do { token = Com_EParse(text, errhead, name); if (!Com_ParseBlockToken(name, text, group, alien_group_vals, cp_campaignPool, token)) { const teamDef_t *teamDef; if (!*text || *token == '}') break; /* This is an alien team */ if (group->numAlienTeams >= MAX_TEAMS_PER_MISSION) Com_Error(ERR_DROP, "CL_ParseAlienTeam: MAX_TEAMS_PER_MISSION hit"); teamDef = Com_GetTeamDefinitionByID(token); if (teamDef) group->alienTeams[group->numAlienTeams++] = teamDef; } } while (*text); } else { Com_Printf("CP_ParseAlienTeam: unknown token \"%s\" ignored (category %s)\n", token, name); continue; } } while (*text); if (LIST_IsEmpty(alienCategory->equipment)) Sys_Error("alien category equipment list is empty"); }