CFactoryCAI::CFactoryCAI(CUnit* owner): CCommandAI(owner) { commandQue.SetQueueType(CCommandQueue::BuildQueueType); newUnitCommands.SetQueueType(CCommandQueue::NewUnitQueueType); if (owner->unitDef->canmove) { SCommandDescription c; c.id = CMD_MOVE; c.type = CMDTYPE_ICON_MAP; c.action = "move"; c.name = "Move"; c.tooltip = c.name + ": Order ready built units to move to a position"; c.mouseicon = c.name; possibleCommands.push_back(commandDescriptionCache->GetPtr(c)); } if (owner->unitDef->canPatrol) { SCommandDescription c; c.id = CMD_PATROL; c.type = CMDTYPE_ICON_MAP; c.action = "patrol"; c.name = "Patrol"; c.tooltip = c.name + ": Order ready built units to patrol to one or more waypoints"; c.mouseicon = c.name; possibleCommands.push_back(commandDescriptionCache->GetPtr(c)); } if (owner->unitDef->canFight) { SCommandDescription c; c.id = CMD_FIGHT; c.type = CMDTYPE_ICON_MAP; c.action = "fight"; c.name = "Fight"; c.tooltip = c.name + ": Order ready built units to take action while moving to a position"; c.mouseicon = c.name; possibleCommands.push_back(commandDescriptionCache->GetPtr(c)); } if (owner->unitDef->canGuard) { SCommandDescription c; c.id = CMD_GUARD; c.type = CMDTYPE_ICON_UNIT; c.action = "guard"; c.name = "Guard"; c.tooltip = c.name + ": Order ready built units to guard another unit and attack units attacking it"; c.mouseicon = c.name; possibleCommands.push_back(commandDescriptionCache->GetPtr(c)); } CFactory* fac = static_cast<CFactory*>(owner); for (const auto& bi: fac->unitDef->buildOptions) { const std::string& name = bi.second; const UnitDef* ud = unitDefHandler->GetUnitDefByName(name); if (ud == nullptr) { string errmsg = "MOD ERROR: loading "; errmsg += name.c_str(); errmsg += " for "; errmsg += owner->unitDef->name; throw content_error(errmsg); } { SCommandDescription c; c.id = -ud->id; // build-options are always negative c.type = CMDTYPE_ICON; c.action = "buildunit_" + StringToLower(ud->name); c.name = name; c.mouseicon = c.name; c.tooltip = GetUnitDefBuildOptionToolTip(ud, c.disabled = (ud->maxThisUnit <= 0)); buildOptions[c.id] = 0; possibleCommands.push_back(commandDescriptionCache->GetPtr(c)); } } }
CFactoryCAI::CFactoryCAI(CUnit* owner): CCommandAI(owner) { commandQue.SetQueueType(CCommandQueue::BuildQueueType); newUnitCommands.SetQueueType(CCommandQueue::NewUnitQueueType); CommandDescription c; if (owner->unitDef->canmove) { c.id = CMD_MOVE; c.action = "move"; c.type = CMDTYPE_ICON_MAP; c.name = "Move"; c.mouseicon = c.name; c.tooltip = "Move: Order ready built units to move to a position"; possibleCommands.push_back(c); } if (owner->unitDef->canPatrol) { c.id = CMD_PATROL; c.action = "patrol"; c.type = CMDTYPE_ICON_MAP; c.name = "Patrol"; c.mouseicon = c.name; c.tooltip = "Patrol: Order ready built units to patrol to one or more waypoints"; possibleCommands.push_back(c); } if (owner->unitDef->canFight) { c.id = CMD_FIGHT; c.action = "fight"; c.type = CMDTYPE_ICON_MAP; c.name = "Fight"; c.mouseicon = c.name; c.tooltip = "Fight: Order ready built units to take action while moving to a position"; possibleCommands.push_back(c); } if (owner->unitDef->canGuard) { c.id = CMD_GUARD; c.action = "guard"; c.type = CMDTYPE_ICON_UNIT; c.name = "Guard"; c.mouseicon = c.name; c.tooltip = "Guard: Order ready built units to guard another unit and attack units attacking it"; possibleCommands.push_back(c); } CFactory* fac = static_cast<CFactory*>(owner); map<int, string>::const_iterator bi; for (bi = fac->unitDef->buildOptions.begin(); bi != fac->unitDef->buildOptions.end(); ++bi) { const string name = bi->second; const UnitDef* ud = unitDefHandler->GetUnitDefByName(name); if (ud == NULL) { string errmsg = "MOD ERROR: loading "; errmsg += name.c_str(); errmsg += " for "; errmsg += owner->unitDef->name; throw content_error(errmsg); } CommandDescription c; c.id = -ud->id; // build-options are always negative c.action = "buildunit_" + StringToLower(ud->name); c.type = CMDTYPE_ICON; c.name = name; c.mouseicon = c.name; c.disabled = (ud->maxThisUnit <= 0); c.tooltip = GetUnitDefBuildOptionToolTip(ud, c.disabled); possibleCommands.push_back(c); BuildOption bo; bo.name = name; bo.fullName = name; bo.numQued = 0; buildOptions[c.id] = bo; } }
CBuilderCAI::CBuilderCAI(CUnit* owner): CMobileCAI(owner), building(false), cachedRadiusId(0), cachedRadius(0), buildRetries(0), randomCounter(0), lastPC1(-1), lastPC2(-1), lastPC3(-1), range3D(owner->unitDef->buildRange3D) { ownerBuilder = static_cast<CBuilder*>(owner); if (owner->unitDef->canRepair) { SCommandDescription c; c.id = CMD_REPAIR; c.type = CMDTYPE_ICON_UNIT_OR_AREA; c.action = "repair"; c.name = "Repair"; c.tooltip = c.name + ": Repairs another unit"; c.mouseicon = c.name; possibleCommands.push_back(commandDescriptionCache->GetPtr(c)); } else if (owner->unitDef->canAssist) { SCommandDescription c; c.id = CMD_REPAIR; c.type = CMDTYPE_ICON_UNIT_OR_AREA; c.action = "assist"; c.name = "Assist"; c.tooltip = c.name + ": Help build something"; c.mouseicon = c.name; possibleCommands.push_back(commandDescriptionCache->GetPtr(c)); } if (owner->unitDef->canReclaim) { SCommandDescription c; c.id = CMD_RECLAIM; c.type = CMDTYPE_ICON_UNIT_FEATURE_OR_AREA; c.action = "reclaim"; c.name = "Reclaim"; c.tooltip = c.name + ": Sucks in the metal/energy content of a unit/feature and add it to your storage"; c.mouseicon = c.name; possibleCommands.push_back(commandDescriptionCache->GetPtr(c)); } if (owner->unitDef->canRestore && !mapDamage->disabled) { SCommandDescription c; c.id = CMD_RESTORE; c.type = CMDTYPE_ICON_AREA; c.action = "restore"; c.name = "Restore"; c.tooltip = c.name + ": Restores an area of the map to its original height"; c.mouseicon = c.name; possibleCommands.push_back(commandDescriptionCache->GetPtr(c)); } if (owner->unitDef->canResurrect) { SCommandDescription c; c.id = CMD_RESURRECT; c.type = CMDTYPE_ICON_UNIT_FEATURE_OR_AREA; c.action = "resurrect"; c.name = "Resurrect"; c.tooltip = c.name + ": Resurrects a unit from a feature"; c.mouseicon = c.name; possibleCommands.push_back(commandDescriptionCache->GetPtr(c)); } if (owner->unitDef->canCapture) { SCommandDescription c; c.id = CMD_CAPTURE; c.type = CMDTYPE_ICON_UNIT_OR_AREA; c.action = "capture"; c.name = "Capture"; c.tooltip = c.name + ": Captures a unit from the enemy"; c.mouseicon = c.name; possibleCommands.push_back(commandDescriptionCache->GetPtr(c)); } for (const auto& bi: ownerBuilder->unitDef->buildOptions) { const std::string& name = bi.second; const UnitDef* ud = unitDefHandler->GetUnitDefByName(name); if (ud == nullptr) { string errmsg = "MOD ERROR: loading "; errmsg += name.c_str(); errmsg += " for "; errmsg += owner->unitDef->name; throw content_error(errmsg); } { SCommandDescription c; c.id = -ud->id; //build options are always negative c.type = CMDTYPE_ICON_BUILDING; c.action = "buildunit_" + StringToLower(ud->name); c.name = name; c.mouseicon = c.name; c.tooltip = GetUnitDefBuildOptionToolTip(ud, c.disabled = (ud->maxThisUnit <= 0)); buildOptions.insert(c.id); possibleCommands.push_back(commandDescriptionCache->GetPtr(c)); } } unitHandler->AddBuilderCAI(this); }