/* fills the list with Templates that can be manufactured in the Factory - based on size. There is a limit on how many can be manufactured at any one time. */ void fillTemplateList(std::vector<DROID_TEMPLATE *> &pList, STRUCTURE *psFactory) { const int player = psFactory->player; pList.clear(); BODY_SIZE iCapacity = (BODY_SIZE)psFactory->capacity; /* Add the templates to the list*/ for (DROID_TEMPLATE &i : localTemplates) { DROID_TEMPLATE *psCurr = &i; // Must add droids if currently in production. if (!getProduction(psFactory, psCurr).quantity) { //can only have (MAX_CMDDROIDS) in the world at any one time if (psCurr->droidType == DROID_COMMAND) { if (checkProductionForCommand(player) + checkCommandExist(player) >= (MAX_CMDDROIDS)) { continue; } } if (!psCurr->enabled || !validTemplateForFactory(psCurr, psFactory, false) || !researchedTemplate(psCurr, player, includeRedundantDesigns)) { continue; } } //check the factory can cope with this sized body if (((asBodyStats + psCurr->asParts[COMP_BODY])->size <= iCapacity)) { pList.push_back(psCurr); } else if (bMultiPlayer && (iCapacity == SIZE_HEAVY)) { // Special case for Super heavy bodyies (Super Transporter) if ((asBodyStats + psCurr->asParts[COMP_BODY])->size == SIZE_SUPER_HEAVY) { pList.push_back(psCurr); } } } }
/* Build a droid template in the specified factory */ static QScriptValue js_buildDroid(QScriptContext *context, QScriptEngine *) { QScriptValue structVal = context->argument(1); int id = structVal.property("id").toInt32(); int player = structVal.property("player").toInt32(); QScriptValue templName = context->argument(0); DROID_TEMPLATE *psTemplate = getTemplateFromTranslatedNameNoPlayer(templName.toString().toUtf8().constData()); STRUCTURE *psStruct = IdToStruct(id, player); SCRIPT_ASSERT(context, psStruct != NULL, "No factory object found for id %d, player %d", id, player); SCRIPT_ASSERT(context, psTemplate != NULL, "No template object found for %s sent to %s", templName.toString().toUtf8().constData(), objInfo(psStruct)); SCRIPT_ASSERT(context, (psStruct->pStructureType->type == REF_FACTORY || psStruct->pStructureType->type == REF_CYBORG_FACTORY || psStruct->pStructureType->type == REF_VTOL_FACTORY), "Structure %s is not a factory", objInfo(psStruct)); SCRIPT_ASSERT(context, validTemplateForFactory(psTemplate, psStruct), "Invalid template - %s for factory - %s", psTemplate->aName, psStruct->pStructureType->pName); return QScriptValue(structSetManufacture(psStruct, psTemplate, ModeQueue)); }
/* fills the list with Templates that can be manufactured in the Factory - based on size. There is a limit on how many can be manufactured at any one time. Pass back the number available. */ void fillTemplateList(std::vector<DROID_TEMPLATE *> &pList, STRUCTURE *psFactory) { const int player = psFactory->player; pList.clear(); DROID_TEMPLATE *psCurr; UDWORD iCapacity = psFactory->capacity; /* Add the templates to the list*/ for (std::list<DROID_TEMPLATE>::iterator i = localTemplates.begin(); i != localTemplates.end(); ++i) { psCurr = &*i; // Must add droids if currently in production. if (!getProduction(psFactory, psCurr).quantity) { //can only have (MAX_CMDDROIDS) in the world at any one time if (psCurr->droidType == DROID_COMMAND) { if (checkProductionForCommand(player) + checkCommandExist(player) >= (MAX_CMDDROIDS)) { continue; } } if (!psCurr->enabled || !validTemplateForFactory(psCurr, psFactory, false) || !researchedTemplate(psCurr, player, includeRedundantDesigns)) { continue; } } //check the factory can cope with this sized body if (!((asBodyStats + psCurr->asParts[COMP_BODY])->size > iCapacity) ) { pList.push_back(psCurr); } } }
bool scrSkCanBuildTemplate(void) { STRUCTURE *psStructure; DROID_TEMPLATE *psTempl; SDWORD player; if (!stackPopParams(3, VAL_INT, &player, ST_STRUCTURE, &psStructure, ST_TEMPLATE, &psTempl)) { return false; } // is factory big enough? if (!validTemplateForFactory(psTempl, psStructure, false)) { goto failTempl; } if ((asBodyStats + psTempl->asParts[COMP_BODY])->size > psStructure->capacity) { goto failTempl; } // is every component from template available? // body available. if (apCompLists[player][COMP_BODY][psTempl->asParts[COMP_BODY]] != AVAILABLE) { goto failTempl; } // propulsion method available. if (apCompLists[player][COMP_PROPULSION][psTempl->asParts[COMP_PROPULSION]] != AVAILABLE) { goto failTempl; } // weapon/sensor switch (droidTemplateType(psTempl)) { case DROID_CYBORG: // cyborg-type thang.. no need to check weapon. case DROID_CYBORG_SUPER: // super cyborg-type thang break; case DROID_WEAPON: if (apCompLists[player][COMP_WEAPON][ psTempl->asWeaps[0] ] != AVAILABLE) { goto failTempl; } break; case DROID_SENSOR: if (apCompLists[player][COMP_SENSOR][psTempl->asParts[COMP_SENSOR]] != AVAILABLE) { goto failTempl; } break; case DROID_ECM: if (apCompLists[player][COMP_ECM][psTempl->asParts[COMP_ECM]] != AVAILABLE) { goto failTempl; } break; case DROID_REPAIR: if (apCompLists[player][COMP_REPAIRUNIT][psTempl->asParts[COMP_REPAIRUNIT]] != AVAILABLE) { goto failTempl; } break; case DROID_CYBORG_REPAIR: if (apCompLists[player][COMP_REPAIRUNIT][psTempl->asParts[COMP_REPAIRUNIT]] != AVAILABLE) { goto failTempl; } break; case DROID_COMMAND: if (apCompLists[player][COMP_BRAIN][psTempl->asParts[COMP_BRAIN]] != AVAILABLE) { goto failTempl; } break; case DROID_CONSTRUCT: if (apCompLists[player][COMP_CONSTRUCT][psTempl->asParts[COMP_CONSTRUCT]] != AVAILABLE) { goto failTempl; } break; case DROID_CYBORG_CONSTRUCT: if (apCompLists[player][COMP_CONSTRUCT][psTempl->asParts[COMP_CONSTRUCT]] != AVAILABLE) { goto failTempl; } break; case DROID_PERSON: // person case DROID_TRANSPORTER: // guess what this is! case DROID_SUPERTRANSPORTER: case DROID_DEFAULT: // Default droid case DROID_ANY: default: debug(LOG_FATAL, "scrSkCanBuildTemplate: Unhandled template type"); abort(); break; } scrFunctionResult.v.bval = true; if (!stackPushResult(VAL_BOOL, &scrFunctionResult)) // yes { return false; } return true; failTempl: scrFunctionResult.v.bval = false; if (!stackPushResult(VAL_BOOL, &scrFunctionResult)) // no { return false; } return true; }
BOOL scrSkCanBuildTemplate(void) { STRUCTURE *psStructure; DROID_TEMPLATE *psTempl; SDWORD player, structure, templ; if (!stackPopParams(3,VAL_INT, &player,ST_STRUCTURE, &structure, ST_TEMPLATE, &templ)) { return FALSE; } psTempl = (DROID_TEMPLATE*) templ; psStructure = (STRUCTURE *) structure; // is factory big enough? if(!validTemplateForFactory(psTempl, psStructure) ) { goto failTempl; } if ((asBodyStats + psTempl->asParts[COMP_BODY])->size > ((FACTORY*)psStructure->pFunctionality)->capacity ) { goto failTempl; } // is every component from template available? // body available. if( apCompLists[player][COMP_BODY][psTempl->asParts[COMP_BODY]] != AVAILABLE ) { goto failTempl; } // propulsion method available. if( apCompLists[player][COMP_PROPULSION][psTempl->asParts[COMP_PROPULSION]] != AVAILABLE ) { goto failTempl; } // weapon/sensor switch (droidTemplateType(psTempl)) { case DROID_CYBORG: // cyborg-type thang.. no need to check weapon. case DROID_CYBORG_SUPER: // super cyborg-type thang break; case DROID_WEAPON: if( apCompLists[player][COMP_WEAPON][ psTempl->asWeaps[0] ] != AVAILABLE ) { goto failTempl; } break; case DROID_SENSOR: if( apCompLists[player][COMP_SENSOR][psTempl->asParts[COMP_SENSOR]] != AVAILABLE ) { goto failTempl; } break; case DROID_ECM: if( apCompLists[player][COMP_ECM][psTempl->asParts[COMP_ECM]] != AVAILABLE ) { goto failTempl; } break; case DROID_REPAIR: if( apCompLists[player][COMP_REPAIRUNIT][psTempl->asParts[COMP_REPAIRUNIT]] != AVAILABLE ) { goto failTempl; } break; case DROID_COMMAND: case DROID_CONSTRUCT: // Constructor droid case DROID_PERSON: // person case DROID_CYBORG_CONSTRUCT: // cyborg-construct thang case DROID_CYBORG_REPAIR: // cyborg-repair thang case DROID_TRANSPORTER: // guess what this is! case DROID_DEFAULT: // Default droid case DROID_ANY: default: DBERROR(("scrSkCanBuildTemplate: Unhandled template type")); break; } if (!stackPushResult(VAL_BOOL, TRUE)) // yes { return FALSE; } return TRUE; failTempl: if (!stackPushResult(VAL_BOOL, FALSE)) // no { return FALSE; } return TRUE; }