diff --git a/Moose Development/Moose/Core/Database.lua b/Moose Development/Moose/Core/Database.lua index ecb2d28e1..8ae42a151 100644 --- a/Moose Development/Moose/Core/Database.lua +++ b/Moose Development/Moose/Core/Database.lua @@ -1424,6 +1424,7 @@ end -- @param #DATABASE self -- @param Ops.OpsGroup#OPSGROUP opsgroup The OPS group added to the DB. function DATABASE:AddOpsGroup(opsgroup) + env.info("Adding OPSGROUP "..tostring(opsgroup.groupname)) self.FLIGHTGROUPS[opsgroup.groupname]=opsgroup end @@ -1439,6 +1440,7 @@ function DATABASE:GetOpsGroup(groupname) groupname=groupname:GetName() end + env.info("Getting OPSGROUP "..tostring(groupname)) return self.FLIGHTGROUPS[groupname] end diff --git a/Moose Development/Moose/Ops/ArmyGroup.lua b/Moose Development/Moose/Ops/ArmyGroup.lua index 95a622aa5..93df801d9 100644 --- a/Moose Development/Moose/Ops/ArmyGroup.lua +++ b/Moose Development/Moose/Ops/ArmyGroup.lua @@ -171,6 +171,9 @@ function ARMYGROUP:New(group) -- Start check zone timer. self.timerCheckZone=TIMER:New(self._CheckInZones, self):Start(2, 30) + + -- Add OPSGROUP to _DATABASE. + _DATABASE:AddOpsGroup(self) return self end @@ -477,22 +480,24 @@ function ARMYGROUP:onafterStatus(From, Event, To) if self.cargoTransport then - local text=string.format("Cargo: %s %s --> %s", self.carrierStatus, self.cargoTransport.pickupzone:GetName(), self.cargoTransport.deployzone:GetName()) - + -- Debug + local text=string.format("Carrier [%s]: %s --> %s", self.carrierStatus, self.cargoTransport.pickupzone:GetName(), self.cargoTransport.deployzone:GetName()) for _,_cargo in pairs(self.cargoTransport.cargos) do local cargo=_cargo --Ops.OpsGroup#OPSGROUP.CargoGroup local name=cargo.opsgroup:GetName() local gstatus=cargo.opsgroup:GetState() local cstatus=cargo.opsgroup.cargoStatus - text=text..string.format("\n- %s [%s]: %s", name, gstatus, cstatus) - end - + text=text..string.format("\n- %s [%s]: %s", name, gstatus, cstatus) + --self:I({template=cargo.opsgroup.template}) + end self:I(self.lid..text) if self:IsNotCarrier() then env.info("FF not carrier ==> pickup") + + --TODO: Check if there is still cargo left. Maybe someone else already picked it up or it got destroyed. -- Initiate the cargo transport process. self:Pickup(self.cargoTransport.pickupzone) @@ -500,6 +505,8 @@ function ARMYGROUP:onafterStatus(From, Event, To) elseif self:IsPickingup() then env.info("FF picking up") + + --TODO: Check if there is still cargo left. Maybe someone else already picked it up or it got destroyed. elseif self:IsLoading() then @@ -509,7 +516,7 @@ function ARMYGROUP:onafterStatus(From, Event, To) for _,_cargo in pairs(self.cargoTransport.cargos) do local cargo=_cargo --Ops.OpsGroup#OPSGROUP.CargoGroup - if cargo.opsgroup.carrierGroup:GetName()==self:GetName() and cargo.opsgroup.cargoStatus==OPSGROUP.CargoStatus.BOARDING then + if cargo.opsgroup.carrierGroup and cargo.opsgroup.carrierGroup:GetName()==self:GetName() and cargo.opsgroup.cargoStatus==OPSGROUP.CargoStatus.BOARDING then boarding=true end @@ -523,15 +530,32 @@ function ARMYGROUP:onafterStatus(From, Event, To) elseif self:IsLoaded() then - env.info("FF loaded") + env.info("FF loaded (nothing to do?)") elseif self:IsTransporting() then - env.info("FF transporting") + env.info("FF transporting (nothing to do)") elseif self:IsUnloading() then - env.info("FF unloading") + env.info("FF unloading ==> Checking if all cargo was delivered") + + local delivered=true + for _,_cargo in pairs(self.cargoTransport.cargos) do + local cargo=_cargo --Ops.OpsGroup#OPSGROUP.CargoGroup + + if (cargo.opsgroup.carrierGroup and cargo.opsgroup.carrierGroup:GetName()==self:GetName()) and not cargo.delivered then + delivered=false + break + end + + end + + -- Boarding finished ==> Transport cargo. + if delivered then + env.info("FF unloading finished ==> Unloaded") + self:Unloaded() + end end diff --git a/Moose Development/Moose/Ops/FlightGroup.lua b/Moose Development/Moose/Ops/FlightGroup.lua index 7417a35cc..9cefad402 100644 --- a/Moose Development/Moose/Ops/FlightGroup.lua +++ b/Moose Development/Moose/Ops/FlightGroup.lua @@ -332,6 +332,9 @@ function FLIGHTGROUP:New(group) -- Start check zone timer. self.timerCheckZone=TIMER:New(self._CheckInZones, self):Start(3, 10) + -- Add OPSGROUP to _DATABASE. + _DATABASE:AddOpsGroup(self) + return self end @@ -2603,9 +2606,7 @@ function FLIGHTGROUP:onafterStop(From, Event, To) -- Call OPSGROUP function. self:GetParent(self).onafterStop(self, From, Event, To) - - -- Remove flight from data base. - _DATABASE.FLIGHTGROUPS[self.groupname]=nil + end ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- diff --git a/Moose Development/Moose/Ops/NavyGroup.lua b/Moose Development/Moose/Ops/NavyGroup.lua index 782788c2f..5cf389465 100644 --- a/Moose Development/Moose/Ops/NavyGroup.lua +++ b/Moose Development/Moose/Ops/NavyGroup.lua @@ -188,6 +188,9 @@ function NAVYGROUP:New(group) -- Start check zone timer. self.timerCheckZone=TIMER:New(self._CheckInZones, self):Start(2, 60) + + -- Add OPSGROUP to _DATABASE. + _DATABASE:AddOpsGroup(self) return self end diff --git a/Moose Development/Moose/Ops/OpsGroup.lua b/Moose Development/Moose/Ops/OpsGroup.lua index 8b13d0d86..ef76d7532 100644 --- a/Moose Development/Moose/Ops/OpsGroup.lua +++ b/Moose Development/Moose/Ops/OpsGroup.lua @@ -410,6 +410,7 @@ OPSGROUP.CargoStatus={ -- @field #string status Status of the cargo group. See @{#OPSGROUP.CargoStatus}. -- @field Core.Zone#ZONE pickupzone Zone where the cargo is picked up. -- @field Core.Zone#ZONE deployzone Zone where the cargo is dropped off. +-- @field #boolean delivered If true, group was delivered. --- OpsGroup version. -- @field #string version @@ -555,6 +556,7 @@ function OPSGROUP:New(group) self:AddTransition("*", "Loaded", "*") -- Carrier loaded all assigned cargo into carrier. self:AddTransition("*", "Transport", "*") -- Carrier is transporting cargo. self:AddTransition("*", "Deploy", "*") -- Carrier is dropping off cargo. + self:AddTransition("*", "Unloaded", "*") -- Carrier unloaded all its cargo. ------------------------ --- Pseudo Functions --- @@ -581,7 +583,7 @@ function OPSGROUP:New(group) -- Add to data base. - _DATABASE:AddOpsGroup(self) + --_DATABASE:AddOpsGroup(self) return self end @@ -4419,8 +4421,11 @@ function OPSGROUP:onafterStop(From, Event, To) self:E(self.lid..text) end + -- Remove flight from data base. + _DATABASE.FLIGHTGROUPS[self.groupname]=nil + -- Debug output. - self:I(self.lid.."STOPPED! Unhandled events, cleared scheduler and removed from database.") + self:I(self.lid.."STOPPED! Unhandled events, cleared scheduler and removed from database") end ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- @@ -4496,12 +4501,13 @@ function OPSGROUP:CreateCargoGroupData(group, Pickupzone, Deployzone) else opsgroup=ARMYGROUP:New(group) end - + else + env.info("FF found opsgroup in createcargo") end end - local cargo={} --#OPSGROUP.Cargo + local cargo={} --#OPSGROUP.CargoGroup cargo.opsgroup=opsgroup cargo.status="Unknown" @@ -4631,22 +4637,29 @@ function OPSGROUP:onafterLoading(From, Event, To) for _,_cargo in pairs(self.cargoTransport.cargos) do local cargo=_cargo --#OPSGROUP.CargoGroup - local weight=cargo.opsgroup:GetWeightTotal() + if not cargo.delivered then - local carrier=_findCarrier(weight) - - if carrier then - - -- Set cargo status. - cargo.opsgroup.cargoStatus=OPSGROUP.CargoStatus.ASSIGNED - - -- Order cargo group to board the carrier. - env.info("FF order group to board carrier") - cargo.opsgroup:Board(self, carrier) + local weight=cargo.opsgroup:GetWeightTotal() - else - - env.info("FF cannot board carrier") + local carrier=_findCarrier(weight) + + if carrier then + + -- Set cargo status. + cargo.opsgroup.cargoStatus=OPSGROUP.CargoStatus.ASSIGNED + + -- Order cargo group to board the carrier. + env.info("FF order group to board carrier") + cargo.opsgroup:Board(self, carrier) + + --TODO: only one group for testing + break + + else + + env.info("FF cannot board carrier") + + end end end @@ -4744,26 +4757,33 @@ end function OPSGROUP:onafterDeploy(From, Event, To, Zone) env.info("FF deploy at zone ".. (Zone and Zone:GetName() or "Not given!")) + -- Set carrier status to UNLOADING. self.carrierStatus=OPSGROUP.CarrierStatus.UNLOADING for _,_cargo in pairs(self.cargoTransport.cargos) do local cargo=_cargo --#OPSGROUP.CargoGroup - env.info("FF deploy cargo "..cargo.opsgroup:GetName()) - - local zone=Zone or cargo.deployzone --Core.Zone#ZONE + if cargo.opsgroup.cargoStatus==OPSGROUP.CargoStatus.LOADED and cargo.opsgroup.carrierGroup:GetName()==self.groupname then - --if zone:IsCoordinateInZone(self:GetCoordinate()) then - - local Coordinate=zone:GetRandomCoordinate() - local Heading=math.random(0,359) + env.info("FF deploy cargo "..cargo.opsgroup:GetName()) + + local zone=Zone or cargo.deployzone --Core.Zone#ZONE - -- Unload. - env.info("FF unload cargo "..cargo.opsgroup:GetName()) - cargo.opsgroup:Unboard(Coordinate, Heading) - --self:Unload(cargo.opsgroup, Coordinate, Heading) - - --end + --if zone:IsCoordinateInZone(self:GetCoordinate()) then + + local Coordinate=zone:GetRandomCoordinate() + local Heading=math.random(0,359) + + cargo.delivered=true + + -- Unload. + env.info("FF unload cargo "..cargo.opsgroup:GetName()) + cargo.opsgroup:Unboard(Coordinate, Heading) + --self:Unload(cargo.opsgroup, Coordinate, Heading) + + --end + + end end @@ -4786,6 +4806,46 @@ function OPSGROUP:onafterUnload(From, Event, To, CargoGroup, Coordinate, Heading end +--- On after "Unloaded" event. +-- @param #OPSGROUP self +-- @param #string From From state. +-- @param #string Event Event. +-- @param #string To To state. +-- @param Core.Zone#ZONE Zone Deploy zone. +function OPSGROUP:onafterUnloaded(From, Event, To) + env.info("FF unloaded") + + local pickup=false + for _,_cargo in pairs(self.cargoTransport.cargos) do + local cargo=_cargo --Ops.OpsGroup#OPSGROUP.CargoGroup + + -- Check for waiting or undelivered non cargo groups. + --if cargo.opsgroup.cargoStatus==OPSGROUP.CargoStatus.WAITING or (cargo.opsgroup.cargoStatus==OPSGROUP.CargoStatus.NOTCARGO and not cargo.delivered) then + if not cargo.delivered then + pickup=true + break + end + + end + + if pickup then + + env.info("FF cargo left ==> pickup") + self:Pickup(self.cargoTransport.pickupzone) + + else + + -- No current transport assignment. + self.cargoTransport=nil + + env.info("FF all delivered ==> check group done") + self:_CheckGroupDone() + + end + +end + + --- -- Cargo Group Functions ---