use crate::{
geometry::{Point2, Point3},
ids::AbilityId,
FromProto, IntoProto,
};
use num_traits::{FromPrimitive, ToPrimitive};
use rustc_hash::FxHashMap;
use sc2_proto::{
error::ActionResult as ProtoActionResult,
raw::{ActionRawUnitCommand_oneof_target as ProtoTarget, ActionRaw_oneof_action as ProtoRawAction},
sc2api::{Action as ProtoAction, ActionChat_Channel, ActionError as ProtoActionError},
};
#[derive(Default, Clone)]
pub(crate) struct Commander {
pub commands: FxHashMap<(AbilityId, Target, bool), Vec<u64>>,
pub autocast: FxHashMap<AbilityId, Vec<u64>>,
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
pub enum Target {
Pos(Point2),
Tag(u64),
None,
}
#[doc(hidden)]
#[derive(Debug, Clone)]
pub enum Action {
UnitCommand(AbilityId, Target, Vec<u64>, bool),
CameraMove(Point3),
ToggleAutocast(AbilityId, Vec<u64>),
Chat(String, bool),
}
impl IntoProto<ProtoAction> for &Action {
fn into_proto(self) -> ProtoAction {
let mut action = ProtoAction::new();
match self {
Action::Chat(message, team_only) => {
let chat_action = action.mut_action_chat();
chat_action.set_channel({
if *team_only {
ActionChat_Channel::Team
} else {
ActionChat_Channel::Broadcast
}
});
chat_action.set_message(message.to_string());
}
Action::UnitCommand(ability, target, units, queue) => {
let unit_command = action.mut_action_raw().mut_unit_command();
unit_command.set_ability_id(ability.to_i32().unwrap());
match target {
Target::Pos(pos) => unit_command.set_target_world_space_pos(pos.into_proto()),
Target::Tag(tag) => unit_command.set_target_unit_tag(*tag),
Target::None => {}
}
unit_command.set_unit_tags(units.to_vec());
unit_command.set_queue_command(*queue);
}
Action::CameraMove(pos) => {
let camera_move = action.mut_action_raw().mut_camera_move();
camera_move.set_center_world_space(pos.into_proto());
}
Action::ToggleAutocast(ability, units) => {
let toggle_autocast = action.mut_action_raw().mut_toggle_autocast();
toggle_autocast.set_ability_id(ability.to_i32().unwrap());
toggle_autocast.set_unit_tags(units.to_vec());
}
}
action
}
}
impl FromProto<&ProtoAction> for Option<Action> {
fn from_proto(action: &ProtoAction) -> Self {
if action.has_action_raw() {
match &action.get_action_raw().action {
Some(ProtoRawAction::unit_command(unit_command)) => Some(Action::UnitCommand(
{
let id = unit_command.get_ability_id();
AbilityId::from_i32(id)
.unwrap_or_else(|| panic!("There's no `AbilityId` with value {}", id))
},
match &unit_command.target {
Some(ProtoTarget::target_world_space_pos(pos)) => {
Target::Pos(Point2::from_proto(pos))
}
Some(ProtoTarget::target_unit_tag(tag)) => Target::Tag(*tag),
None => Target::None,
},
unit_command.get_unit_tags().to_vec(),
unit_command.get_queue_command(),
)),
Some(ProtoRawAction::camera_move(camera_move)) => Some(Action::CameraMove(
Point3::from_proto(camera_move.get_center_world_space()),
)),
Some(ProtoRawAction::toggle_autocast(toggle_autocast)) => Some(Action::ToggleAutocast(
{
let id = toggle_autocast.get_ability_id();
AbilityId::from_i32(id)
.unwrap_or_else(|| panic!("There's no `AbilityId` with value {}", id))
},
toggle_autocast.get_unit_tags().to_vec(),
)),
None => unreachable!(),
}
} else if action.has_action_chat() {
let chat = action.get_action_chat();
Some(Action::Chat(chat.get_message().to_string(), {
match chat.get_channel() {
ActionChat_Channel::Broadcast => false,
ActionChat_Channel::Team => true,
}
}))
} else {
None
}
}
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
pub struct ActionError {
pub unit: u64,
pub ability: AbilityId,
pub result: ActionResult,
}
impl FromProto<&ProtoActionError> for ActionError {
fn from_proto(e: &ProtoActionError) -> Self {
Self {
unit: e.get_unit_tag(),
ability: {
let id = e.get_ability_id();
AbilityId::from_u64(id).unwrap_or_else(|| panic!("There's no `AbilityId` with value {}", id))
},
result: ActionResult::from_proto(e.get_result()),
}
}
}
#[allow(missing_docs)]
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
pub enum ActionResult {
Success,
NotSupported,
Error,
CantQueueThatOrder,
Retry,
Cooldown,
QueueIsFull,
RallyQueueIsFull,
NotEnoughMinerals,
NotEnoughVespene,
NotEnoughTerrazine,
NotEnoughCustom,
NotEnoughFood,
FoodUsageImpossible,
NotEnoughLife,
NotEnoughShields,
NotEnoughEnergy,
LifeSuppressed,
ShieldsSuppressed,
EnergySuppressed,
NotEnoughCharges,
CantAddMoreCharges,
TooMuchMinerals,
TooMuchVespene,
TooMuchTerrazine,
TooMuchCustom,
TooMuchFood,
TooMuchLife,
TooMuchShields,
TooMuchEnergy,
MustTargetUnitWithLife,
MustTargetUnitWithShields,
MustTargetUnitWithEnergy,
CantTrade,
CantSpend,
CantTargetThatUnit,
CouldntAllocateUnit,
UnitCantMove,
TransportIsHoldingPosition,
BuildTechRequirementsNotMet,
CantFindPlacementLocation,
CantBuildOnThat,
CantBuildTooCloseToDropOff,
CantBuildLocationInvalid,
CantSeeBuildLocation,
CantBuildTooCloseToCreepSource,
CantBuildTooCloseToResources,
CantBuildTooFarFromWater,
CantBuildTooFarFromCreepSource,
CantBuildTooFarFromBuildPowerSource,
CantBuildOnDenseTerrain,
CantTrainTooFarFromTrainPowerSource,
CantLandLocationInvalid,
CantSeeLandLocation,
CantLandTooCloseToCreepSource,
CantLandTooCloseToResources,
CantLandTooFarFromWater,
CantLandTooFarFromCreepSource,
CantLandTooFarFromBuildPowerSource,
CantLandTooFarFromTrainPowerSource,
CantLandOnDenseTerrain,
AddOnTooFarFromBuilding,
MustBuildRefineryFirst,
BuildingIsUnderConstruction,
CantFindDropOff,
CantLoadOtherPlayersUnits,
NotEnoughRoomToLoadUnit,
CantUnloadUnitsThere,
CantWarpInUnitsThere,
CantLoadImmobileUnits,
CantRechargeImmobileUnits,
CantRechargeUnderConstructionUnits,
CantLoadThatUnit,
NoCargoToUnload,
LoadAllNoTargetsFound,
NotWhileOccupied,
CantAttackWithoutAmmo,
CantHoldAnyMoreAmmo,
TechRequirementsNotMet,
MustLockdownUnitFirst,
MustTargetUnit,
MustTargetInventory,
MustTargetVisibleUnit,
MustTargetVisibleLocation,
MustTargetWalkableLocation,
MustTargetPawnableUnit,
YouCantControlThatUnit,
YouCantIssueCommandsToThatUnit,
MustTargetResources,
RequiresHealTarget,
RequiresRepairTarget,
NoItemsToDrop,
CantHoldAnyMoreItems,
CantHoldThat,
TargetHasNoInventory,
CantDropThisItem,
CantMoveThisItem,
CantPawnThisUnit,
MustTargetCaster,
CantTargetCaster,
MustTargetOuter,
CantTargetOuter,
MustTargetYourOwnUnits,
CantTargetYourOwnUnits,
MustTargetFriendlyUnits,
CantTargetFriendlyUnits,
MustTargetNeutralUnits,
CantTargetNeutralUnits,
MustTargetEnemyUnits,
CantTargetEnemyUnits,
MustTargetAirUnits,
CantTargetAirUnits,
MustTargetGroundUnits,
CantTargetGroundUnits,
MustTargetStructures,
CantTargetStructures,
MustTargetLightUnits,
CantTargetLightUnits,
MustTargetArmoredUnits,
CantTargetArmoredUnits,
MustTargetBiologicalUnits,
CantTargetBiologicalUnits,
MustTargetHeroicUnits,
CantTargetHeroicUnits,
MustTargetRoboticUnits,
CantTargetRoboticUnits,
MustTargetMechanicalUnits,
CantTargetMechanicalUnits,
MustTargetPsionicUnits,
CantTargetPsionicUnits,
MustTargetMassiveUnits,
CantTargetMassiveUnits,
MustTargetMissile,
CantTargetMissile,
MustTargetWorkerUnits,
CantTargetWorkerUnits,
MustTargetEnergyCapableUnits,
CantTargetEnergyCapableUnits,
MustTargetShieldCapableUnits,
CantTargetShieldCapableUnits,
MustTargetFlyers,
CantTargetFlyers,
MustTargetBuriedUnits,
CantTargetBuriedUnits,
MustTargetCloakedUnits,
CantTargetCloakedUnits,
MustTargetUnitsInAStasisField,
CantTargetUnitsInAStasisField,
MustTargetUnderConstructionUnits,
CantTargetUnderConstructionUnits,
MustTargetDeadUnits,
CantTargetDeadUnits,
MustTargetRevivableUnits,
CantTargetRevivableUnits,
MustTargetHiddenUnits,
CantTargetHiddenUnits,
CantRechargeOtherPlayersUnits,
MustTargetHallucinations,
CantTargetHallucinations,
MustTargetInvulnerableUnits,
CantTargetInvulnerableUnits,
MustTargetDetectedUnits,
CantTargetDetectedUnits,
CantTargetUnitWithEnergy,
CantTargetUnitWithShields,
MustTargetUncommandableUnits,
CantTargetUncommandableUnits,
MustTargetPreventDefeatUnits,
CantTargetPreventDefeatUnits,
MustTargetPreventRevealUnits,
CantTargetPreventRevealUnits,
MustTargetPassiveUnits,
CantTargetPassiveUnits,
MustTargetStunnedUnits,
CantTargetStunnedUnits,
MustTargetSummonedUnits,
CantTargetSummonedUnits,
MustTargetUser1,
CantTargetUser1,
MustTargetUnstoppableUnits,
CantTargetUnstoppableUnits,
MustTargetResistantUnits,
CantTargetResistantUnits,
MustTargetDazedUnits,
CantTargetDazedUnits,
CantLockdown,
CantMindControl,
MustTargetDestructibles,
CantTargetDestructibles,
MustTargetItems,
CantTargetItems,
NoCalldownAvailable,
WaypointListFull,
MustTargetRace,
CantTargetRace,
MustTargetSimilarUnits,
CantTargetSimilarUnits,
CantFindEnoughTargets,
AlreadySpawningLarva,
CantTargetExhaustedResources,
CantUseMinimap,
CantUseInfoPanel,
OrderQueueIsFull,
CantHarvestThatResource,
HarvestersNotRequired,
AlreadyTargeted,
CantAttackWeaponsDisabled,
CouldntReachTarget,
TargetIsOutOfRange,
TargetIsTooClose,
TargetIsOutOfArc,
CantFindTeleportLocation,
InvalidItemClass,
CantFindCancelOrder,
}
impl FromProto<ProtoActionResult> for ActionResult {
fn from_proto(result: ProtoActionResult) -> Self {
match result {
ProtoActionResult::Success => ActionResult::Success,
ProtoActionResult::NotSupported => ActionResult::NotSupported,
ProtoActionResult::Error => ActionResult::Error,
ProtoActionResult::CantQueueThatOrder => ActionResult::CantQueueThatOrder,
ProtoActionResult::Retry => ActionResult::Retry,
ProtoActionResult::Cooldown => ActionResult::Cooldown,
ProtoActionResult::QueueIsFull => ActionResult::QueueIsFull,
ProtoActionResult::RallyQueueIsFull => ActionResult::RallyQueueIsFull,
ProtoActionResult::NotEnoughMinerals => ActionResult::NotEnoughMinerals,
ProtoActionResult::NotEnoughVespene => ActionResult::NotEnoughVespene,
ProtoActionResult::NotEnoughTerrazine => ActionResult::NotEnoughTerrazine,
ProtoActionResult::NotEnoughCustom => ActionResult::NotEnoughCustom,
ProtoActionResult::NotEnoughFood => ActionResult::NotEnoughFood,
ProtoActionResult::FoodUsageImpossible => ActionResult::FoodUsageImpossible,
ProtoActionResult::NotEnoughLife => ActionResult::NotEnoughLife,
ProtoActionResult::NotEnoughShields => ActionResult::NotEnoughShields,
ProtoActionResult::NotEnoughEnergy => ActionResult::NotEnoughEnergy,
ProtoActionResult::LifeSuppressed => ActionResult::LifeSuppressed,
ProtoActionResult::ShieldsSuppressed => ActionResult::ShieldsSuppressed,
ProtoActionResult::EnergySuppressed => ActionResult::EnergySuppressed,
ProtoActionResult::NotEnoughCharges => ActionResult::NotEnoughCharges,
ProtoActionResult::CantAddMoreCharges => ActionResult::CantAddMoreCharges,
ProtoActionResult::TooMuchMinerals => ActionResult::TooMuchMinerals,
ProtoActionResult::TooMuchVespene => ActionResult::TooMuchVespene,
ProtoActionResult::TooMuchTerrazine => ActionResult::TooMuchTerrazine,
ProtoActionResult::TooMuchCustom => ActionResult::TooMuchCustom,
ProtoActionResult::TooMuchFood => ActionResult::TooMuchFood,
ProtoActionResult::TooMuchLife => ActionResult::TooMuchLife,
ProtoActionResult::TooMuchShields => ActionResult::TooMuchShields,
ProtoActionResult::TooMuchEnergy => ActionResult::TooMuchEnergy,
ProtoActionResult::MustTargetUnitWithLife => ActionResult::MustTargetUnitWithLife,
ProtoActionResult::MustTargetUnitWithShields => ActionResult::MustTargetUnitWithShields,
ProtoActionResult::MustTargetUnitWithEnergy => ActionResult::MustTargetUnitWithEnergy,
ProtoActionResult::CantTrade => ActionResult::CantTrade,
ProtoActionResult::CantSpend => ActionResult::CantSpend,
ProtoActionResult::CantTargetThatUnit => ActionResult::CantTargetThatUnit,
ProtoActionResult::CouldntAllocateUnit => ActionResult::CouldntAllocateUnit,
ProtoActionResult::UnitCantMove => ActionResult::UnitCantMove,
ProtoActionResult::TransportIsHoldingPosition => ActionResult::TransportIsHoldingPosition,
ProtoActionResult::BuildTechRequirementsNotMet => ActionResult::BuildTechRequirementsNotMet,
ProtoActionResult::CantFindPlacementLocation => ActionResult::CantFindPlacementLocation,
ProtoActionResult::CantBuildOnThat => ActionResult::CantBuildOnThat,
ProtoActionResult::CantBuildTooCloseToDropOff => ActionResult::CantBuildTooCloseToDropOff,
ProtoActionResult::CantBuildLocationInvalid => ActionResult::CantBuildLocationInvalid,
ProtoActionResult::CantSeeBuildLocation => ActionResult::CantSeeBuildLocation,
ProtoActionResult::CantBuildTooCloseToCreepSource => ActionResult::CantBuildTooCloseToCreepSource,
ProtoActionResult::CantBuildTooCloseToResources => ActionResult::CantBuildTooCloseToResources,
ProtoActionResult::CantBuildTooFarFromWater => ActionResult::CantBuildTooFarFromWater,
ProtoActionResult::CantBuildTooFarFromCreepSource => ActionResult::CantBuildTooFarFromCreepSource,
ProtoActionResult::CantBuildTooFarFromBuildPowerSource => {
ActionResult::CantBuildTooFarFromBuildPowerSource
}
ProtoActionResult::CantBuildOnDenseTerrain => ActionResult::CantBuildOnDenseTerrain,
ProtoActionResult::CantTrainTooFarFromTrainPowerSource => {
ActionResult::CantTrainTooFarFromTrainPowerSource
}
ProtoActionResult::CantLandLocationInvalid => ActionResult::CantLandLocationInvalid,
ProtoActionResult::CantSeeLandLocation => ActionResult::CantSeeLandLocation,
ProtoActionResult::CantLandTooCloseToCreepSource => ActionResult::CantLandTooCloseToCreepSource,
ProtoActionResult::CantLandTooCloseToResources => ActionResult::CantLandTooCloseToResources,
ProtoActionResult::CantLandTooFarFromWater => ActionResult::CantLandTooFarFromWater,
ProtoActionResult::CantLandTooFarFromCreepSource => ActionResult::CantLandTooFarFromCreepSource,
ProtoActionResult::CantLandTooFarFromBuildPowerSource => {
ActionResult::CantLandTooFarFromBuildPowerSource
}
ProtoActionResult::CantLandTooFarFromTrainPowerSource => {
ActionResult::CantLandTooFarFromTrainPowerSource
}
ProtoActionResult::CantLandOnDenseTerrain => ActionResult::CantLandOnDenseTerrain,
ProtoActionResult::AddOnTooFarFromBuilding => ActionResult::AddOnTooFarFromBuilding,
ProtoActionResult::MustBuildRefineryFirst => ActionResult::MustBuildRefineryFirst,
ProtoActionResult::BuildingIsUnderConstruction => ActionResult::BuildingIsUnderConstruction,
ProtoActionResult::CantFindDropOff => ActionResult::CantFindDropOff,
ProtoActionResult::CantLoadOtherPlayersUnits => ActionResult::CantLoadOtherPlayersUnits,
ProtoActionResult::NotEnoughRoomToLoadUnit => ActionResult::NotEnoughRoomToLoadUnit,
ProtoActionResult::CantUnloadUnitsThere => ActionResult::CantUnloadUnitsThere,
ProtoActionResult::CantWarpInUnitsThere => ActionResult::CantWarpInUnitsThere,
ProtoActionResult::CantLoadImmobileUnits => ActionResult::CantLoadImmobileUnits,
ProtoActionResult::CantRechargeImmobileUnits => ActionResult::CantRechargeImmobileUnits,
ProtoActionResult::CantRechargeUnderConstructionUnits => {
ActionResult::CantRechargeUnderConstructionUnits
}
ProtoActionResult::CantLoadThatUnit => ActionResult::CantLoadThatUnit,
ProtoActionResult::NoCargoToUnload => ActionResult::NoCargoToUnload,
ProtoActionResult::LoadAllNoTargetsFound => ActionResult::LoadAllNoTargetsFound,
ProtoActionResult::NotWhileOccupied => ActionResult::NotWhileOccupied,
ProtoActionResult::CantAttackWithoutAmmo => ActionResult::CantAttackWithoutAmmo,
ProtoActionResult::CantHoldAnyMoreAmmo => ActionResult::CantHoldAnyMoreAmmo,
ProtoActionResult::TechRequirementsNotMet => ActionResult::TechRequirementsNotMet,
ProtoActionResult::MustLockdownUnitFirst => ActionResult::MustLockdownUnitFirst,
ProtoActionResult::MustTargetUnit => ActionResult::MustTargetUnit,
ProtoActionResult::MustTargetInventory => ActionResult::MustTargetInventory,
ProtoActionResult::MustTargetVisibleUnit => ActionResult::MustTargetVisibleUnit,
ProtoActionResult::MustTargetVisibleLocation => ActionResult::MustTargetVisibleLocation,
ProtoActionResult::MustTargetWalkableLocation => ActionResult::MustTargetWalkableLocation,
ProtoActionResult::MustTargetPawnableUnit => ActionResult::MustTargetPawnableUnit,
ProtoActionResult::YouCantControlThatUnit => ActionResult::YouCantControlThatUnit,
ProtoActionResult::YouCantIssueCommandsToThatUnit => ActionResult::YouCantIssueCommandsToThatUnit,
ProtoActionResult::MustTargetResources => ActionResult::MustTargetResources,
ProtoActionResult::RequiresHealTarget => ActionResult::RequiresHealTarget,
ProtoActionResult::RequiresRepairTarget => ActionResult::RequiresRepairTarget,
ProtoActionResult::NoItemsToDrop => ActionResult::NoItemsToDrop,
ProtoActionResult::CantHoldAnyMoreItems => ActionResult::CantHoldAnyMoreItems,
ProtoActionResult::CantHoldThat => ActionResult::CantHoldThat,
ProtoActionResult::TargetHasNoInventory => ActionResult::TargetHasNoInventory,
ProtoActionResult::CantDropThisItem => ActionResult::CantDropThisItem,
ProtoActionResult::CantMoveThisItem => ActionResult::CantMoveThisItem,
ProtoActionResult::CantPawnThisUnit => ActionResult::CantPawnThisUnit,
ProtoActionResult::MustTargetCaster => ActionResult::MustTargetCaster,
ProtoActionResult::CantTargetCaster => ActionResult::CantTargetCaster,
ProtoActionResult::MustTargetOuter => ActionResult::MustTargetOuter,
ProtoActionResult::CantTargetOuter => ActionResult::CantTargetOuter,
ProtoActionResult::MustTargetYourOwnUnits => ActionResult::MustTargetYourOwnUnits,
ProtoActionResult::CantTargetYourOwnUnits => ActionResult::CantTargetYourOwnUnits,
ProtoActionResult::MustTargetFriendlyUnits => ActionResult::MustTargetFriendlyUnits,
ProtoActionResult::CantTargetFriendlyUnits => ActionResult::CantTargetFriendlyUnits,
ProtoActionResult::MustTargetNeutralUnits => ActionResult::MustTargetNeutralUnits,
ProtoActionResult::CantTargetNeutralUnits => ActionResult::CantTargetNeutralUnits,
ProtoActionResult::MustTargetEnemyUnits => ActionResult::MustTargetEnemyUnits,
ProtoActionResult::CantTargetEnemyUnits => ActionResult::CantTargetEnemyUnits,
ProtoActionResult::MustTargetAirUnits => ActionResult::MustTargetAirUnits,
ProtoActionResult::CantTargetAirUnits => ActionResult::CantTargetAirUnits,
ProtoActionResult::MustTargetGroundUnits => ActionResult::MustTargetGroundUnits,
ProtoActionResult::CantTargetGroundUnits => ActionResult::CantTargetGroundUnits,
ProtoActionResult::MustTargetStructures => ActionResult::MustTargetStructures,
ProtoActionResult::CantTargetStructures => ActionResult::CantTargetStructures,
ProtoActionResult::MustTargetLightUnits => ActionResult::MustTargetLightUnits,
ProtoActionResult::CantTargetLightUnits => ActionResult::CantTargetLightUnits,
ProtoActionResult::MustTargetArmoredUnits => ActionResult::MustTargetArmoredUnits,
ProtoActionResult::CantTargetArmoredUnits => ActionResult::CantTargetArmoredUnits,
ProtoActionResult::MustTargetBiologicalUnits => ActionResult::MustTargetBiologicalUnits,
ProtoActionResult::CantTargetBiologicalUnits => ActionResult::CantTargetBiologicalUnits,
ProtoActionResult::MustTargetHeroicUnits => ActionResult::MustTargetHeroicUnits,
ProtoActionResult::CantTargetHeroicUnits => ActionResult::CantTargetHeroicUnits,
ProtoActionResult::MustTargetRoboticUnits => ActionResult::MustTargetRoboticUnits,
ProtoActionResult::CantTargetRoboticUnits => ActionResult::CantTargetRoboticUnits,
ProtoActionResult::MustTargetMechanicalUnits => ActionResult::MustTargetMechanicalUnits,
ProtoActionResult::CantTargetMechanicalUnits => ActionResult::CantTargetMechanicalUnits,
ProtoActionResult::MustTargetPsionicUnits => ActionResult::MustTargetPsionicUnits,
ProtoActionResult::CantTargetPsionicUnits => ActionResult::CantTargetPsionicUnits,
ProtoActionResult::MustTargetMassiveUnits => ActionResult::MustTargetMassiveUnits,
ProtoActionResult::CantTargetMassiveUnits => ActionResult::CantTargetMassiveUnits,
ProtoActionResult::MustTargetMissile => ActionResult::MustTargetMissile,
ProtoActionResult::CantTargetMissile => ActionResult::CantTargetMissile,
ProtoActionResult::MustTargetWorkerUnits => ActionResult::MustTargetWorkerUnits,
ProtoActionResult::CantTargetWorkerUnits => ActionResult::CantTargetWorkerUnits,
ProtoActionResult::MustTargetEnergyCapableUnits => ActionResult::MustTargetEnergyCapableUnits,
ProtoActionResult::CantTargetEnergyCapableUnits => ActionResult::CantTargetEnergyCapableUnits,
ProtoActionResult::MustTargetShieldCapableUnits => ActionResult::MustTargetShieldCapableUnits,
ProtoActionResult::CantTargetShieldCapableUnits => ActionResult::CantTargetShieldCapableUnits,
ProtoActionResult::MustTargetFlyers => ActionResult::MustTargetFlyers,
ProtoActionResult::CantTargetFlyers => ActionResult::CantTargetFlyers,
ProtoActionResult::MustTargetBuriedUnits => ActionResult::MustTargetBuriedUnits,
ProtoActionResult::CantTargetBuriedUnits => ActionResult::CantTargetBuriedUnits,
ProtoActionResult::MustTargetCloakedUnits => ActionResult::MustTargetCloakedUnits,
ProtoActionResult::CantTargetCloakedUnits => ActionResult::CantTargetCloakedUnits,
ProtoActionResult::MustTargetUnitsInAStasisField => ActionResult::MustTargetUnitsInAStasisField,
ProtoActionResult::CantTargetUnitsInAStasisField => ActionResult::CantTargetUnitsInAStasisField,
ProtoActionResult::MustTargetUnderConstructionUnits => {
ActionResult::MustTargetUnderConstructionUnits
}
ProtoActionResult::CantTargetUnderConstructionUnits => {
ActionResult::CantTargetUnderConstructionUnits
}
ProtoActionResult::MustTargetDeadUnits => ActionResult::MustTargetDeadUnits,
ProtoActionResult::CantTargetDeadUnits => ActionResult::CantTargetDeadUnits,
ProtoActionResult::MustTargetRevivableUnits => ActionResult::MustTargetRevivableUnits,
ProtoActionResult::CantTargetRevivableUnits => ActionResult::CantTargetRevivableUnits,
ProtoActionResult::MustTargetHiddenUnits => ActionResult::MustTargetHiddenUnits,
ProtoActionResult::CantTargetHiddenUnits => ActionResult::CantTargetHiddenUnits,
ProtoActionResult::CantRechargeOtherPlayersUnits => ActionResult::CantRechargeOtherPlayersUnits,
ProtoActionResult::MustTargetHallucinations => ActionResult::MustTargetHallucinations,
ProtoActionResult::CantTargetHallucinations => ActionResult::CantTargetHallucinations,
ProtoActionResult::MustTargetInvulnerableUnits => ActionResult::MustTargetInvulnerableUnits,
ProtoActionResult::CantTargetInvulnerableUnits => ActionResult::CantTargetInvulnerableUnits,
ProtoActionResult::MustTargetDetectedUnits => ActionResult::MustTargetDetectedUnits,
ProtoActionResult::CantTargetDetectedUnits => ActionResult::CantTargetDetectedUnits,
ProtoActionResult::CantTargetUnitWithEnergy => ActionResult::CantTargetUnitWithEnergy,
ProtoActionResult::CantTargetUnitWithShields => ActionResult::CantTargetUnitWithShields,
ProtoActionResult::MustTargetUncommandableUnits => ActionResult::MustTargetUncommandableUnits,
ProtoActionResult::CantTargetUncommandableUnits => ActionResult::CantTargetUncommandableUnits,
ProtoActionResult::MustTargetPreventDefeatUnits => ActionResult::MustTargetPreventDefeatUnits,
ProtoActionResult::CantTargetPreventDefeatUnits => ActionResult::CantTargetPreventDefeatUnits,
ProtoActionResult::MustTargetPreventRevealUnits => ActionResult::MustTargetPreventRevealUnits,
ProtoActionResult::CantTargetPreventRevealUnits => ActionResult::CantTargetPreventRevealUnits,
ProtoActionResult::MustTargetPassiveUnits => ActionResult::MustTargetPassiveUnits,
ProtoActionResult::CantTargetPassiveUnits => ActionResult::CantTargetPassiveUnits,
ProtoActionResult::MustTargetStunnedUnits => ActionResult::MustTargetStunnedUnits,
ProtoActionResult::CantTargetStunnedUnits => ActionResult::CantTargetStunnedUnits,
ProtoActionResult::MustTargetSummonedUnits => ActionResult::MustTargetSummonedUnits,
ProtoActionResult::CantTargetSummonedUnits => ActionResult::CantTargetSummonedUnits,
ProtoActionResult::MustTargetUser1 => ActionResult::MustTargetUser1,
ProtoActionResult::CantTargetUser1 => ActionResult::CantTargetUser1,
ProtoActionResult::MustTargetUnstoppableUnits => ActionResult::MustTargetUnstoppableUnits,
ProtoActionResult::CantTargetUnstoppableUnits => ActionResult::CantTargetUnstoppableUnits,
ProtoActionResult::MustTargetResistantUnits => ActionResult::MustTargetResistantUnits,
ProtoActionResult::CantTargetResistantUnits => ActionResult::CantTargetResistantUnits,
ProtoActionResult::MustTargetDazedUnits => ActionResult::MustTargetDazedUnits,
ProtoActionResult::CantTargetDazedUnits => ActionResult::CantTargetDazedUnits,
ProtoActionResult::CantLockdown => ActionResult::CantLockdown,
ProtoActionResult::CantMindControl => ActionResult::CantMindControl,
ProtoActionResult::MustTargetDestructibles => ActionResult::MustTargetDestructibles,
ProtoActionResult::CantTargetDestructibles => ActionResult::CantTargetDestructibles,
ProtoActionResult::MustTargetItems => ActionResult::MustTargetItems,
ProtoActionResult::CantTargetItems => ActionResult::CantTargetItems,
ProtoActionResult::NoCalldownAvailable => ActionResult::NoCalldownAvailable,
ProtoActionResult::WaypointListFull => ActionResult::WaypointListFull,
ProtoActionResult::MustTargetRace => ActionResult::MustTargetRace,
ProtoActionResult::CantTargetRace => ActionResult::CantTargetRace,
ProtoActionResult::MustTargetSimilarUnits => ActionResult::MustTargetSimilarUnits,
ProtoActionResult::CantTargetSimilarUnits => ActionResult::CantTargetSimilarUnits,
ProtoActionResult::CantFindEnoughTargets => ActionResult::CantFindEnoughTargets,
ProtoActionResult::AlreadySpawningLarva => ActionResult::AlreadySpawningLarva,
ProtoActionResult::CantTargetExhaustedResources => ActionResult::CantTargetExhaustedResources,
ProtoActionResult::CantUseMinimap => ActionResult::CantUseMinimap,
ProtoActionResult::CantUseInfoPanel => ActionResult::CantUseInfoPanel,
ProtoActionResult::OrderQueueIsFull => ActionResult::OrderQueueIsFull,
ProtoActionResult::CantHarvestThatResource => ActionResult::CantHarvestThatResource,
ProtoActionResult::HarvestersNotRequired => ActionResult::HarvestersNotRequired,
ProtoActionResult::AlreadyTargeted => ActionResult::AlreadyTargeted,
ProtoActionResult::CantAttackWeaponsDisabled => ActionResult::CantAttackWeaponsDisabled,
ProtoActionResult::CouldntReachTarget => ActionResult::CouldntReachTarget,
ProtoActionResult::TargetIsOutOfRange => ActionResult::TargetIsOutOfRange,
ProtoActionResult::TargetIsTooClose => ActionResult::TargetIsTooClose,
ProtoActionResult::TargetIsOutOfArc => ActionResult::TargetIsOutOfArc,
ProtoActionResult::CantFindTeleportLocation => ActionResult::CantFindTeleportLocation,
ProtoActionResult::InvalidItemClass => ActionResult::InvalidItemClass,
ProtoActionResult::CantFindCancelOrder => ActionResult::CantFindCancelOrder,
}
}
}