diff --git a/Moose Development/Moose/Actions/Act_Route.lua b/Moose Development/Moose/Actions/Act_Route.lua index ec5e9fff3..21b1fa04a 100644 --- a/Moose Development/Moose/Actions/Act_Route.lua +++ b/Moose Development/Moose/Actions/Act_Route.lua @@ -82,6 +82,7 @@ do -- ACT_ROUTE -- @field Tasking.Task#TASK TASK -- @field Wrapper.Unit#UNIT ProcessUnit -- @field Core.Zone#ZONE_BASE Zone + -- @field Core.Point#COORDINATE Coordinate -- @extends Core.Fsm#FSM_PROCESS ACT_ROUTE = { ClassName = "ACT_ROUTE", @@ -96,12 +97,13 @@ do -- ACT_ROUTE -- Inherits from BASE local self = BASE:Inherit( self, FSM_PROCESS:New( "ACT_ROUTE" ) ) -- Core.Fsm#FSM_PROCESS + self:AddTransition( "*", "Reset", "None" ) self:AddTransition( "None", "Start", "Routing" ) - self:AddTransition( "*", "Report", "Reporting" ) - self:AddTransition( "*", "Route", "Routing" ) + self:AddTransition( "*", "Report", "*" ) + self:AddTransition( "Routing", "Route", "Routing" ) self:AddTransition( "Routing", "Pause", "Pausing" ) - self:AddTransition( "*", "Abort", "Aborted" ) self:AddTransition( "Routing", "Arrive", "Arrived" ) + self:AddTransition( "*", "Cancel", "Cancelled" ) self:AddTransition( "Arrived", "Success", "Success" ) self:AddTransition( "*", "Fail", "Failed" ) self:AddTransition( "", "", "" ) @@ -109,11 +111,69 @@ do -- ACT_ROUTE self:AddEndState( "Arrived" ) self:AddEndState( "Failed" ) + self:AddEndState( "Cancelled" ) - self:SetStartState( "None" ) + self:SetStartState( "None" ) + + self:SetRouteMode( "C" ) return self end + + --- Set a Cancel Menu item. + -- @param #ACT_ROUTE self + -- @return #ACT_ROUTE + function ACT_ROUTE:SetMenuCancel( MenuGroup, MenuText, ParentMenu, MenuTime ) + + MENU_GROUP_COMMAND:New( + MenuGroup, + MenuText, + ParentMenu, + self.MenuCancel, + self + ):SetTime(MenuTime) + + return self + end + + --- Set the route mode. + -- There are 2 route modes supported: + -- + -- * SetRouteMode( "B" ): Route mode is Bearing and Range. + -- * SetRouteMode( "C" ): Route mode is LL or MGRS according coordinate system setup. + -- + -- @param #ACT_ROUTE self + -- @return #ACT_ROUTE + function ACT_ROUTE:SetRouteMode( RouteMode ) + + self.RouteMode = RouteMode + + return self + end + + --- Get the routing text to be displayed. + -- The route mode determines the text displayed. + -- @param #ACT_ROUTE self + -- @return #string + function ACT_ROUTE:GetRouteText( FromCoordinate ) + + local RouteText = "" + + if self.RouteMode == "B" then + RouteText = "Route to " .. FromCoordinate:GetBRText( self.Coordinate ) .. " km." + end + + if self.RouteMode == "C" then + RouteText = "Route to " .. self.Coordinate:ToString() + end + + return RouteText + end + + + function ACT_ROUTE:MenuCancel() + self:Cancel() + end --- Task Events @@ -189,15 +249,15 @@ do -- ACT_ROUTE_POINT --- Creates a new routing state machine. - -- The task will route a controllable to a PointVec2 until the controllable is within the Range. + -- The task will route a controllable to a Coordinate until the controllable is within the Range. -- @param #ACT_ROUTE_POINT self - -- @param Core.Point#POINT_VEC2 The PointVec2 to Target. + -- @param Core.Point#COORDINATE The Coordinate to Target. -- @param #number Range The Distance to Target. -- @param Core.Zone#ZONE_BASE Zone - function ACT_ROUTE_POINT:New( PointVec2, Range ) + function ACT_ROUTE_POINT:New( Coordinate, Range ) local self = BASE:Inherit( self, ACT_ROUTE:New() ) -- #ACT_ROUTE_POINT - self.PointVec2 = PointVec2 + self.Coordinate = Coordinate self.Range = Range or 0 self.DisplayInterval = 30 @@ -208,34 +268,38 @@ do -- ACT_ROUTE_POINT return self end + --- Creates a new routing state machine. + -- The task will route a controllable to a Coordinate until the controllable is within the Range. + -- @param #ACT_ROUTE_POINT self function ACT_ROUTE_POINT:Init( FsmRoute ) - self.PointVec2 = FsmRoute.PointVec2 + self.Coordinate = FsmRoute.Coordinate self.Range = FsmRoute.Range or 0 self.DisplayInterval = 30 self.DisplayCount = 30 self.DisplayMessage = true self.DisplayTime = 10 -- 10 seconds is the default + self:SetStartState("None") end - --- Set PointVec2 + --- Set Coordinate -- @param #ACT_ROUTE_POINT self - -- @param Core.Point#POINT_VEC2 PointVec2 The PointVec2 to route to. - function ACT_ROUTE_POINT:SetPointVec2( PointVec2 ) - self:F2( { PointVec2 } ) - self.PointVec2 = PointVec2 + -- @param Core.Point#COORDINATE Coordinate The Coordinate to route to. + function ACT_ROUTE_POINT:SetCoordinate( Coordinate ) + self:F2( { Coordinate } ) + self.Coordinate = Coordinate end - --- Get PointVec2 + --- Get Coordinate -- @param #ACT_ROUTE_POINT self - -- @return Core.Point#POINT_VEC2 PointVec2 The PointVec2 to route to. - function ACT_ROUTE_POINT:GetPointVec2() - self:F2( { self.PointVec2 } ) - return self.PointVec2 + -- @return Core.Point#COORDINATE Coordinate The Coordinate to route to. + function ACT_ROUTE_POINT:GetCoordinate() + self:F2( { self.Coordinate } ) + return self.Coordinate end - --- Set Range around PointVec2 + --- Set Range around Coordinate -- @param #ACT_ROUTE_POINT self -- @param #number Range The Range to consider the arrival. Default is 10000 meters. function ACT_ROUTE_POINT:SetRange( Range ) @@ -243,7 +307,7 @@ do -- ACT_ROUTE_POINT self.Range = Range or 10000 end - --- Get Range around PointVec2 + --- Get Range around Coordinate -- @param #ACT_ROUTE_POINT self -- @return #number The Range to consider the arrival. Default is 10000 meters. function ACT_ROUTE_POINT:GetRange() @@ -257,7 +321,7 @@ do -- ACT_ROUTE_POINT function ACT_ROUTE_POINT:onfuncHasArrived( ProcessUnit ) if ProcessUnit:IsAlive() then - local Distance = self.PointVec2:Get2DDistance( ProcessUnit:GetPointVec2() ) + local Distance = self.Coordinate:Get2DDistance( ProcessUnit:GetCoordinate() ) if Distance <= self.Range then local RouteText = "You have arrived." @@ -277,10 +341,10 @@ do -- ACT_ROUTE_POINT -- @param #string Event -- @param #string From -- @param #string To - function ACT_ROUTE_POINT:onenterReporting( ProcessUnit, From, Event, To ) + function ACT_ROUTE_POINT:onafterReport( ProcessUnit, From, Event, To ) - local TaskUnitPointVec2 = ProcessUnit:GetPointVec2() - local RouteText = "Route to " .. TaskUnitPointVec2:GetBRText( self.PointVec2 ) .. " km." + local TaskUnitCoordinate = ProcessUnit:GetCoordinate() + local RouteText = self:GetRouteText( TaskUnitCoordinate ) self:Message( RouteText ) end @@ -362,13 +426,13 @@ do -- ACT_ROUTE_ZONE -- @param #string Event -- @param #string From -- @param #string To - function ACT_ROUTE_ZONE:onenterReporting( ProcessUnit, From, Event, To ) + function ACT_ROUTE_ZONE:onafterReport( ProcessUnit, From, Event, To ) local ZoneVec2 = self.Zone:GetVec2() - local ZonePointVec2 = POINT_VEC2:New( ZoneVec2.x, ZoneVec2.y ) + local ZoneCoordinate = COORDINATE:New( ZoneVec2.x, ZoneVec2.y ) local TaskUnitVec2 = ProcessUnit:GetVec2() - local TaskUnitPointVec2 = POINT_VEC2:New( TaskUnitVec2.x, TaskUnitVec2.y ) - local RouteText = "Route to " .. TaskUnitPointVec2:GetBRText( ZonePointVec2 ) .. " km." + local TaskUnitCoordinate = COORDINATE:New( TaskUnitVec2.x, TaskUnitVec2.y ) + local RouteText = self:GetRouteText( TaskUnitCoordinate ) self:Message( RouteText ) end diff --git a/Moose Development/Moose/Core/Cargo.lua b/Moose Development/Moose/Core/Cargo.lua index 88635422f..02f4c344b 100644 --- a/Moose Development/Moose/Core/Cargo.lua +++ b/Moose Development/Moose/Core/Cargo.lua @@ -385,6 +385,13 @@ function CARGO:GetPointVec2() return self.CargoObject:GetPointVec2() end +--- Get the current Coordinate of the cargo. +-- @param #CARGO self +-- @return Core.Point#COORDINATE +function CARGO:GetCoordinate() + return self.CargoObject:GetCoordinate() +end + --- Set the weight of the cargo. -- @param #CARGO self -- @param #number Weight The weight in kg. diff --git a/Moose Development/Moose/Tasking/Task_CARGO.lua b/Moose Development/Moose/Tasking/Task_CARGO.lua index 5edc328fc..22a331949 100644 --- a/Moose Development/Moose/Tasking/Task_CARGO.lua +++ b/Moose Development/Moose/Tasking/Task_CARGO.lua @@ -185,12 +185,14 @@ do -- TASK_CARGO Fsm:AddTransition( { "Assigned", "WaitingForCommand", "ArrivedAtPickup", "ArrivedAtDeploy", "Boarded", "UnBoarded", "Landed", "Boarding" }, "SelectAction", "*" ) Fsm:AddTransition( "*", "RouteToPickup", "RoutingToPickup" ) - Fsm:AddProcess ( "RoutingToPickup", "RouteToPickupPoint", ACT_ROUTE_POINT:New(), { Arrived = "ArriveAtPickup" } ) + Fsm:AddProcess ( "RoutingToPickup", "RouteToPickupPoint", ACT_ROUTE_POINT:New(), { Arrived = "ArriveAtPickup", Cancelled = "CancelRouteToPickup" } ) Fsm:AddTransition( "Arrived", "ArriveAtPickup", "ArrivedAtPickup" ) + Fsm:AddTransition( "Cancelled", "CancelRouteToPickup", "WaitingForCommand" ) Fsm:AddTransition( "*", "RouteToDeploy", "RoutingToDeploy" ) - Fsm:AddProcess ( "RoutingToDeploy", "RouteToDeployZone", ACT_ROUTE_ZONE:New(), { Arrived = "ArriveAtDeploy" } ) + Fsm:AddProcess ( "RoutingToDeploy", "RouteToDeployZone", ACT_ROUTE_ZONE:New(), { Arrived = "ArriveAtDeploy", Cancelled = "CancelRouteToDeploy" } ) Fsm:AddTransition( "Arrived", "ArriveAtDeploy", "ArrivedAtDeploy" ) + Fsm:AddTransition( "Cancelled", "CancelRouteToDeploy", "WaitingForCommand" ) Fsm:AddTransition( { "ArrivedAtPickup", "ArrivedAtDeploy", "Landing" }, "Land", "Landing" ) Fsm:AddTransition( "Landing", "Landed", "Landed" ) @@ -219,6 +221,7 @@ do -- TASK_CARGO local MenuTime = timer.getTime() TaskUnit.Menu = MENU_GROUP:New( TaskUnit:GetGroup(), Task:GetName() .. " @ " .. TaskUnit:GetName() ):SetTime( MenuTime ) + Task.SetCargo:ForEachCargo( @@ -227,6 +230,17 @@ do -- TASK_CARGO if Cargo:IsAlive() then +-- if Task:is( "RoutingToPickup" ) then +-- MENU_GROUP_COMMAND:New( +-- TaskUnit:GetGroup(), +-- "Cancel Route " .. Cargo.Name, +-- TaskUnit.Menu, +-- self.MenuRouteToPickupCancel, +-- self, +-- Cargo +-- ):SetTime(MenuTime) +-- end + if Cargo:IsUnLoaded() then if Cargo:IsInRadius( TaskUnit:GetPointVec2() ) then MENU_GROUP_COMMAND:New( @@ -308,7 +322,7 @@ do -- TASK_CARGO function Fsm:MenuRouteToPickup( Cargo ) self:__RouteToPickup( 1.0, Cargo ) end - + function Fsm:MenuRouteToDeploy( DeployZone ) self:__RouteToDeploy( 1.0, DeployZone ) end @@ -351,6 +365,17 @@ do -- TASK_CARGO end + --- + -- @param #FSM_PROCESS self + -- @param Wrapper.Unit#UNIT TaskUnit + -- @param Tasking.Task_Cargo#TASK_CARGO Task + function Fsm:onafterCancelRouteToPickup( TaskUnit, Task ) + self:E( { TaskUnit = TaskUnit, Task = Task and Task:GetClassNameAndID() } ) + + self:__SelectAction( -0.1 ) + end + + --- Route to DeployZone -- @param #FSM_PROCESS self -- @param Wrapper.Unit#UNIT TaskUnit @@ -379,8 +404,18 @@ do -- TASK_CARGO end + --- + -- @param #FSM_PROCESS self + -- @param Wrapper.Unit#UNIT TaskUnit + -- @param Tasking.Task_Cargo#TASK_CARGO Task + function Fsm:onafterCancelRouteToDeploy( TaskUnit, Task ) + self:E( { TaskUnit = TaskUnit, Task = Task and Task:GetClassNameAndID() } ) + + self:__SelectAction( -0.1 ) + end + + - --- -- @param #FSM_PROCESS self -- @param Wrapper.Unit#UNIT TaskUnit -- @param Tasking.Task_Cargo#TASK_CARGO Task @@ -594,14 +629,17 @@ do -- TASK_CARGO -- @param AI.AI_Cargo#AI_CARGO Cargo The cargo. -- @param Wrapper.Unit#UNIT TaskUnit -- @return #TASK_CARGO - function TASK_CARGO:SetCargoPickup( Cargo, TaskUnit ) + function TASK_CARGO:SetCargoPickup( Cargo, TaskUnit ) self:F({Cargo, TaskUnit}) local ProcessUnit = self:GetUnitProcess( TaskUnit ) local ActRouteCargo = ProcessUnit:GetProcess( "RoutingToPickup", "RouteToPickupPoint" ) -- Actions.Act_Route#ACT_ROUTE_POINT - ActRouteCargo:SetPointVec2( Cargo:GetPointVec2() ) + ActRouteCargo:Reset() + ActRouteCargo:SetCoordinate( Cargo:GetCoordinate() ) ActRouteCargo:SetRange( Cargo:GetBoardingRange() ) + ActRouteCargo:SetMenuCancel( TaskUnit:GetGroup(), "Cancel Routing to Cargo " .. Cargo:GetName(), TaskUnit.Menu ) + ActRouteCargo:Start() return self end @@ -615,7 +653,10 @@ do -- TASK_CARGO local ProcessUnit = self:GetUnitProcess( TaskUnit ) local ActRouteDeployZone = ProcessUnit:GetProcess( "RoutingToDeploy", "RouteToDeployZone" ) -- Actions.Act_Route#ACT_ROUTE_ZONE + ActRouteDeployZone:Reset() ActRouteDeployZone:SetZone( DeployZone ) + ActRouteDeployZone:SetMenuCancel( TaskUnit:GetGroup(), "Cancel Routing to Deploy Zone" .. DeployZone:GetName(), TaskUnit.Menu ) + ActRouteDeployZone:Start() return self end