diff --git a/BaleCollectorAIDriver.lua b/BaleCollectorAIDriver.lua index 8f4428a56..3c65b2f7e 100644 --- a/BaleCollectorAIDriver.lua +++ b/BaleCollectorAIDriver.lua @@ -23,6 +23,8 @@ without a field course. For unloading, it has the same behavior as the BaleLoaderAIDriver. +It also works with a bale wrapper, find and wrap all wrappable bales. + --]] ---@class BaleCollectorAIDriver : BaleLoaderAIDriver @@ -33,7 +35,7 @@ BaleCollectorAIDriver.myStates = { WAITING_FOR_PATHFINDER = {}, DRIVING_TO_NEXT_BALE = {}, APPROACHING_BALE = {}, - PICKING_UP_BALE = {} + WORKING_ON_BALE = {} } function BaleCollectorAIDriver:init(vehicle) @@ -69,6 +71,7 @@ function BaleCollectorAIDriver:setUpAndStart(startingPoint) self:stop("NO_FIELD_SELECTED") return end + BaleWrapperAIDriver.initializeBaleWrapper(self) self.bales = self:findBales(myField) self:changeToFieldwork() self:collectNextBale() @@ -97,8 +100,15 @@ function BaleCollectorAIDriver:collectNextBale() if #self.bales > 0 then self:findPathToNextBale() else - self:info('No bales found.') - if self:getFillLevel() > 0.1 then + self:info('No bales found, scan the field once more before leaving for the unload course.') + self.bales = self:findBales(self.vehicle.cp.settings.baleCollectionField:get()) + if #self.bales > 0 then + self:info('Found more bales, collecting them') + self:findPathToNextBale() + return + end + self:info('There really is no more bales on the field') + if self.baleLoader and self:getFillLevel() > 0.1 then self:changeToUnloadOrRefill() self:startCourseWithPathfinding(self.unloadRefillCourse, 1) else @@ -113,7 +123,7 @@ function BaleCollectorAIDriver:findBales(fieldId) self:debug('Finding bales on field %d...', fieldId or 0) local balesFound = {} for _, object in pairs(g_currentMission.nodeToObject) do - if BaleToCollect.isValidBale(object) then + if BaleToCollect.isValidBale(object, self.baleWrapper) then local bale = BaleToCollect(object) -- if the bale has a mountObject it is already on the loader so ignore it if (not fieldId or fieldId == 0 or bale:getFieldId() == fieldId) and @@ -224,8 +234,8 @@ function BaleCollectorAIDriver:onLastWaypoint() if self.state == self.states.ON_FIELDWORK_COURSE and self.fieldworkState == self.states.WORKING then if self.baleCollectingState == self.states.DRIVING_TO_NEXT_BALE then self:debug('last waypoint while driving to next bale reached') - self:approachBale() - elseif self.baleCollectingState == self.states.PICKING_UP_BALE then + self:startApproachingBale() + elseif self.baleCollectingState == self.states.WORKING_ON_BALE then self:debug('last waypoint on bale pickup reached, start collecting bales again') self:collectNextBale() elseif self.baleCollectingState == self.states.APPROACHING_BALE then @@ -250,7 +260,7 @@ function BaleCollectorAIDriver:onEndCourse() end end -function BaleCollectorAIDriver:approachBale() +function BaleCollectorAIDriver:startApproachingBale() self:debug('Approaching bale...') self:startCourse(self:getStraightForwardCourse(20), 1) self:setBaleCollectingState(self.states.APPROACHING_BALE) @@ -269,18 +279,44 @@ function BaleCollectorAIDriver:work() self:setSpeed(self.vehicle:getSpeedLimit()) elseif self.baleCollectingState == self.states.APPROACHING_BALE then self:setSpeed(self:getWorkSpeed() / 2) + self:approachBale() + elseif self.baleCollectingState == self.states.WORKING_ON_BALE then + self:workOnBale() + self:setSpeed(0) + end + self:checkFillLevels() +end + +function BaleCollectorAIDriver:approachBale() + if self.baleLoader then if self.baleLoader.spec_baleLoader.grabberMoveState then self:debug('Start picking up bale') - self:setBaleCollectingState(self.states.PICKING_UP_BALE) + self:setBaleCollectingState(self.states.WORKING_ON_BALE) end - elseif self.baleCollectingState == self.states.PICKING_UP_BALE then - self:setSpeed(0) + end + if self.baleWrapper then + BaleWrapperAIDriver.handleBaleWrapper(self) + if self.baleWrapper.spec_baleWrapper.baleWrapperState ~= BaleWrapper.STATE_NONE then + self:debug('Start wrapping bale') + self:setBaleCollectingState(self.states.WORKING_ON_BALE) + end + end +end + +function BaleCollectorAIDriver:workOnBale() + if self.baleLoader then if not self.baleLoader.spec_baleLoader.grabberMoveState then self:debug('Bale picked up, moving on to the next') self:collectNextBale() end end - self:checkFillLevels() + if self.baleWrapper then + BaleWrapperAIDriver.handleBaleWrapper(self) + if self.baleWrapper.spec_baleWrapper.baleWrapperState == BaleWrapper.STATE_NONE then + self:debug('Bale wrapped, moving on to the next') + self:collectNextBale() + end + end end function BaleCollectorAIDriver:calculateTightTurnOffset() diff --git a/BaleLoaderAIDriver.lua b/BaleLoaderAIDriver.lua index 2fc56d296..6d76c682b 100644 --- a/BaleLoaderAIDriver.lua +++ b/BaleLoaderAIDriver.lua @@ -60,7 +60,6 @@ function BaleLoaderAIDriver:init(vehicle) courseplay.debugVehicle(courseplay.DBG_AI_DRIVER,vehicle,'BaleLoaderAIDriver:init()') UnloadableFieldworkAIDriver.init(self, vehicle) self:initStates(BaleLoaderAIDriver.myStates) - self:initializeBaleLoader() self.unloadDoneX, self.unloadDoneZ = 0, 0 end @@ -71,21 +70,25 @@ end function BaleLoaderAIDriver:initializeBaleLoader() self.baleLoader = AIDriverUtil.getImplementWithSpecialization(self.vehicle, BaleLoader) - self:debug('baleloader %s', tostring(self.baleLoader)) - -- Bale loaders have no AI markers (as they are not AIImplements according to Giants) so add a function here - -- to get the markers - self.baleLoader.getAIMarkers = function(object) - return UnloadableFieldworkAIDriver.getAIMarkersFromGrabberNode(object, object.spec_baleLoader) - end + if self.baleLoader then + self:debug('baleloader %s', tostring(self.baleLoader)) + -- Bale loaders have no AI markers (as they are not AIImplements according to Giants) so add a function here + -- to get the markers + self.baleLoader.getAIMarkers = function(object) + return UnloadableFieldworkAIDriver.getAIMarkersFromGrabberNode(object, object.spec_baleLoader) + end - self.manualUnloadNode = WaypointNode(self.vehicle:getName() .. 'unloadNode') - if self.baleLoader.cp.realUnloadOrFillNode then - -- use that realUnloadOrFillNode for now as it includes the balerUnloadDistance config value - -- TODO: can we just use the back marker node here as well? - self.baleFinderProximitySensorPack = BackwardLookingProximitySensorPack( - self.vehicle, self.ppc, self.baleLoader.cp.realUnloadOrFillNode, 5, 1) + self.manualUnloadNode = WaypointNode(self.vehicle:getName() .. 'unloadNode') + if self.baleLoader.cp.realUnloadOrFillNode then + -- use that realUnloadOrFillNode for now as it includes the balerUnloadDistance config value + -- TODO: can we just use the back marker node here as well? + self.baleFinderProximitySensorPack = BackwardLookingProximitySensorPack( + self.vehicle, self.ppc, self.baleLoader.cp.realUnloadOrFillNode, 5, 1) + end + self:debug('Initialized, bale loader: %s', self.baleLoader:getName()) + else + self:debug('Has now bale loader specialization') end - self:debug('Initialized, bale loader: %s', self.baleLoader:getName()) end ---@return boolean true if unload took over the driving diff --git a/BaleToCollect.lua b/BaleToCollect.lua index 2fef3e713..2581c45d9 100644 --- a/BaleToCollect.lua +++ b/BaleToCollect.lua @@ -39,9 +39,21 @@ function BaleToCollect:init(baleObject) end --- Call this before attempting to construct a BaleToCollect to check the validity of the object -function BaleToCollect.isValidBale(object) +---@param baleWrapper table bale wrapper, if exists +function BaleToCollect.isValidBale(object, baleWrapper) -- nodeId is sometimes 0, causing issues for the BaleToCollect constructor - return object.isa and object:isa(Bale) and object.nodeId and entityExists(object.nodeId) + if object.isa and object:isa(Bale) and object.nodeId and entityExists(object.nodeId) then + if baleWrapper then + -- if there is a bale wrapper, the bale must be wrappable and the wrapper does not want to skip this fill type + -- (and yes, this is another typo in Giants code + local wrappedBaleType = baleWrapper:getWrapperBaleType(object) + courseplay.debugFormat(courseplay.DBG_MODE_7, ' bale %d wrapping state: %d, wrapped bale type: %s', + object.id, tostring(object.wrappingState), tostring(wrappedBaleType)) + return wrappedBaleType and object.wrappingState < 0.99 + else + return true + end + end end function BaleToCollect:getFieldId() diff --git a/BaleWrapperAIDriver.lua b/BaleWrapperAIDriver.lua index 4f33ece79..3feeb1d1c 100644 --- a/BaleWrapperAIDriver.lua +++ b/BaleWrapperAIDriver.lua @@ -35,7 +35,7 @@ end function BaleWrapperAIDriver:initializeBaleWrapper() self.baleWrapper = AIDriverUtil.getAIImplementWithSpecialization(self.vehicle, BaleWrapper) - if not self.baler then + if not self.baler and self.baleWrapper then -- Bale wrappers which aren't balers have no AI markers as they have no pick up so add a function here -- to get the markers self.baleWrapper.getAIMarkers = function(object) @@ -47,31 +47,37 @@ end function BaleWrapperAIDriver:driveFieldwork(dt) -- Don't drop the bale in the turn or on temporary alignment or connecting tracks if self:isHandlingAllowed() then - -- stop while wrapping only if we don't have a baler. If we do we should continue driving and working - -- on the next bale, the baler code will take care about stopping if we need to - if self.baleWrapper.spec_baleWrapper.baleWrapperState ~= BaleWrapper.STATE_NONE and not self.baler then - self:setSpeed(0) - end - -- Yes, Giants has a typo in the state - if self.baleWrapper.spec_baleWrapper.baleWrapperState == BaleWrapper.STATE_WRAPPER_FINSIHED then - -- inserts unload threshold after lowering the implement, useful after e.g. transition from connecting track to fieldwork - if self.fieldworkState == self.states.WAITING_FOR_LOWER then - local unloadThreshold = 2500 --delay in msecs, 2.5 secs seems to work well - loweringDropTime = self.vehicle.timer + unloadThreshold - elseif loweringDropTime == nil then - loweringDropTime = 0 - end - -- inserts unload threshold after turn so bales don't drop on headlands - if self.turnStartedAt and self.realTurnDurationMs then - local unloadThreshold = 4000 --delay in msecs, 4 secs seems to work well - turnDropTime = self.turnStartedAt + self.realTurnDurationMs + unloadThreshold - else - turnDropTime = 0 --avoids problems in case of condition variables not existing / empty e.g. before the first turn - end - if self.vehicle.timer > math.max(loweringDropTime,turnDropTime) then --chooses the bigger delay - self.baleWrapper:doStateChange(BaleWrapper.CHANGE_WRAPPER_START_DROP_BALE) - end - end + self:handleBaleWrapper() end return BalerAIDriver.driveFieldwork(self, dt) end + + +function BaleWrapperAIDriver:handleBaleWrapper() + -- stop while wrapping only if we don't have a baler. If we do we should continue driving and working + -- on the next bale, the baler code will take care about stopping if we need to + if self.baleWrapper.spec_baleWrapper.baleWrapperState ~= BaleWrapper.STATE_NONE and not self.baler then + self:setSpeed(0) + end + -- Yes, Giants has a typo in the state + if self.baleWrapper.spec_baleWrapper.baleWrapperState == BaleWrapper.STATE_WRAPPER_FINSIHED then + local loweringDropTime, turnDropTime + -- inserts unload threshold after lowering the implement, useful after e.g. transition from connecting track to fieldwork + if self.fieldworkState == self.states.WAITING_FOR_LOWER then + local unloadThreshold = 2500 --delay in msecs, 2.5 secs seems to work well + loweringDropTime = self.vehicle.timer + unloadThreshold + elseif loweringDropTime == nil then + loweringDropTime = 0 + end + -- inserts unload threshold after turn so bales don't drop on headlands + if self.turnStartedAt and self.realTurnDurationMs then + local unloadThreshold = 4000 --delay in msecs, 4 secs seems to work well + turnDropTime = self.turnStartedAt + self.realTurnDurationMs + unloadThreshold + else + turnDropTime = 0 --avoids problems in case of condition variables not existing / empty e.g. before the first turn + end + if self.vehicle.timer > math.max(loweringDropTime,turnDropTime) then --chooses the bigger delay + self.baleWrapper:doStateChange(BaleWrapper.CHANGE_WRAPPER_START_DROP_BALE) + end + end +end \ No newline at end of file diff --git a/Waypoint.lua b/Waypoint.lua index 90c821887..6c3a6ddbe 100644 --- a/Waypoint.lua +++ b/Waypoint.lua @@ -1050,17 +1050,20 @@ end ---@param dx number direction to extend ---@param dz number direction to extend function Course:extend(length, dx, dz) + self:print() local lastWp = self.waypoints[#self.waypoints] local len = self.waypoints[#self.waypoints - 1].dToNext - dx, dz = dx or lastWp.dx / len, dz or lastWp.dz / len + dx, dz = dx or lastWp.dx, dz or lastWp.dz + print(dx, dz) local wpDistance = 2 - for _ = wpDistance, math.max(length, wpDistance), wpDistance do + for i = wpDistance, math.max(length, wpDistance), wpDistance do lastWp = self.waypoints[#self.waypoints] local x = lastWp.x + dx * wpDistance local z = lastWp.z + dz * wpDistance self:appendWaypoint({x = x, z = z}) end self:enrichWaypointData() + self:print() end --- Create a new (straight) temporary course based on a node diff --git a/base.lua b/base.lua index 67c6b4cc0..cc898fb7e 100644 --- a/base.lua +++ b/base.lua @@ -370,12 +370,6 @@ function courseplay:onLoad(savegame) }; }; - -- WOOD CUTTING: increase max cut length - if CpManager.isDeveloper then - self.cutLengthMax = 15; - self.cutLengthStep = 1; - end; - self.cp.mouseCursorActive = false; -- 2D course diff --git a/config/ValidModeSetup.xml b/config/ValidModeSetup.xml index fcf015216..8a57b9cf3 100644 --- a/config/ValidModeSetup.xml +++ b/config/ValidModeSetup.xml @@ -176,6 +176,9 @@ + + + diff --git a/hud.lua b/hud.lua index 7094acb08..b1f35d9e4 100644 --- a/hud.lua +++ b/hud.lua @@ -231,8 +231,8 @@ function courseplay.hud:setup() [courseplay.MODE_SEED_FERTILIZE] = { 220, 72, 252,40 }; [courseplay.MODE_TRANSPORT] = { 4,108, 36,76 }; [courseplay.MODE_FIELDWORK] = { 40,108, 72,76 }; - [courseplay.MODE_BALE_COLLECTOR] = { 76,108, 108,76 }; - [courseplay.MODE_FIELD_SUPPLY] = { 112,108, 144,76 }; + [courseplay.MODE_BALE_COLLECTOR] = { 76,108, 108,76 }; + [courseplay.MODE_FIELD_SUPPLY] = { 112,108, 144,76 }; [courseplay.MODE_SHOVEL_FILL_AND_EMPTY] = { 148,108, 180,76 }; [courseplay.MODE_BUNKERSILO_COMPACTER] = { 219,431, 251,399 }; }; @@ -323,8 +323,8 @@ function courseplay.hud:setup() [courseplay.MODE_SEED_FERTILIZE] = { 40,144, 72,112 }; [courseplay.MODE_TRANSPORT] = { 76,144, 108,112 }; [courseplay.MODE_FIELDWORK] = { 112,144, 144,112 }; - [courseplay.MODE_BALE_COLLECTOR] = { 148,144, 180,112 }; - [courseplay.MODE_FIELD_SUPPLY] = { 184,144, 216,112 }; + [courseplay.MODE_BALE_COLLECTOR] = { 148,144, 180,112 }; + [courseplay.MODE_FIELD_SUPPLY] = { 184,144, 216,112 }; [courseplay.MODE_SHOVEL_FILL_AND_EMPTY] = { 220,144, 252,112 }; [courseplay.MODE_BUNKERSILO_COMPACTER] = { 219,394, 251,362 }; }; diff --git a/modDesc.xml b/modDesc.xml index 4ee98742a..e4de27e76 100644 --- a/modDesc.xml +++ b/modDesc.xml @@ -1,6 +1,6 @@ - 6.03.00049 + 6.03.00050 <!-- en=English de=German fr=French es=Spanish ru=Russian pl=Polish it=Italian br=Brazilian-Portuguese cs=Chinese(Simplified) ct=Chinese(Traditional) cz=Czech nl=Netherlands hu=Hungary jp=Japanese kr=Korean pt=Portuguese ro=Romanian tr=Turkish --> <en>CoursePlay SIX</en> diff --git a/settings.lua b/settings.lua index c19004894..a9a6688af 100644 --- a/settings.lua +++ b/settings.lua @@ -11,50 +11,57 @@ function courseplay:openCloseHud(vehicle, open) end; end; -function courseplay:setCpMode(vehicle, modeNum, dontSetAIDriver) +function courseplay:setCpMode(vehicle, modeNum) if vehicle.cp.mode ~= modeNum then vehicle.cp.mode = modeNum; courseplay.utils:setOverlayUVsPx(vehicle.cp.hud.currentModeIcon, courseplay.hud.bottomInfo.modeUVsPx[modeNum], courseplay.hud.iconSpriteSize.x, courseplay.hud.iconSpriteSize.y); - if not dontSetAIDriver then - -- another ugly hack: when this is called from loadVehicleCPSettings, - -- setAIDriver fails as not everything is loaded yet, so just for that case, - -- don't call it from here. - courseplay:setAIDriver(vehicle, modeNum) - end + courseplay.infoVehicle(vehicle, 'Setting mode %d', modeNum) + courseplay:setAIDriver(vehicle, modeNum) end; end; function courseplay:setAIDriver(vehicle, mode) + + local errorHandler = function(err) + printCallstack() + courseplay.infoVehicle(vehicle, "Exception, can't init mode %d: %s", mode, tostring(err)) + return err + end + if vehicle.cp.driver then vehicle.cp.driver:delete() end - local status,driver,err + + local status, result if mode == courseplay.MODE_TRANSPORT then - ---@type AIDriver - status,driver,err,errDriverName = xpcall(AIDriver, function(err) printCallstack(); return self,err,"AIDriver" end, vehicle) - --local status, err = xpcall(self.cp.driver.update, function(err) printCallstack(); return err end, self.cp.driver, dt) + status, result = xpcall(AIDriver, errorHandler, vehicle) elseif mode == courseplay.MODE_GRAIN_TRANSPORT then - status,driver,err,errDriverName = xpcall(GrainTransportAIDriver, function(err) printCallstack(); return self,err,"GrainTransportAIDriver" end, vehicle) + status, result = xpcall(GrainTransportAIDriver, errorHandler, vehicle) elseif mode == courseplay.MODE_COMBI then - status,driver,err,errDriverName = xpcall(CombineUnloadAIDriver, function(err) printCallstack(); return self,err,"CombineUnloadAIDriver" end, vehicle) + status, result = xpcall(CombineUnloadAIDriver, errorHandler, vehicle) elseif mode == courseplay.MODE_OVERLOADER then - status,driver,err,errDriverName = xpcall(OverloaderAIDriver, function(err) printCallstack(); return self,err,"OverloaderAIDriver" end, vehicle) + status, result = xpcall(OverloaderAIDriver, errorHandler, vehicle) elseif mode == courseplay.MODE_SHOVEL_FILL_AND_EMPTY then - status,driver,err,errDriverName = xpcall(ShovelModeAIDriver.create, function(err) printCallstack(); return self,err,"ShovelModeAIDriver" end, vehicle) + status, result = xpcall(ShovelModeAIDriver.create, errorHandler, vehicle) elseif mode == courseplay.MODE_SEED_FERTILIZE then - status,driver,err,errDriverName = xpcall(FillableFieldworkAIDriver, function(err) printCallstack(); return self,err,"FillableFieldworkAIDriver" end, vehicle) + status, result = xpcall(FillableFieldworkAIDriver, errorHandler, vehicle) elseif mode == courseplay.MODE_FIELDWORK then - status,driver,err,errDriverName = xpcall(UnloadableFieldworkAIDriver.create, function(err) printCallstack(); return self,err,"UnloadableFieldworkAIDriver" end, vehicle) + status, result = xpcall(UnloadableFieldworkAIDriver.create, errorHandler, vehicle) elseif mode == courseplay.MODE_BALE_COLLECTOR then - status,driver,err,errDriverName = xpcall(BaleCollectorAIDriver, function(err) printCallstack(); return self,err,"BaleCollectorAIDriver" end, vehicle) + status, result = xpcall(BaleCollectorAIDriver, errorHandler, vehicle) elseif mode == courseplay.MODE_BUNKERSILO_COMPACTER then - status,driver,err,errDriverName = xpcall(LevelCompactAIDriver, function(err) printCallstack(); return self,err,"LevelCompactAIDriver" end, vehicle) + status, result = xpcall(LevelCompactAIDriver, errorHandler, vehicle) elseif mode == courseplay.MODE_FIELD_SUPPLY then - status,driver,err,errDriverName = xpcall(FieldSupplyAIDriver, function(err) printCallstack(); return self,err,"FieldSupplyAIDriver" end, vehicle) + status, result = xpcall(FieldSupplyAIDriver, errorHandler, vehicle) end - vehicle.cp.driver = driver - if not status then - courseplay.infoVehicle(vehicle, "Exception, can't init %s, %s", errDriverName,tostring(err)) + if status then + vehicle.cp.driver = result + else + -- give it another try as a fallback level + courseplay.infoVehicle(vehicle, 'Retrying initialization in mode 5') + status, result = xpcall(AIDriver, errorHandler, vehicle) + vehicle.cp.driver = status and result or nil + vehicle.cp.mode = courseplay.MODE_TRANSPORT end end @@ -1817,6 +1824,7 @@ function StartingPointSetting:init(vehicle) 'COURSEPLAY_START_AT_POINT', 'COURSEPLAY_START_AT_POINT', vehicle, values, texts) end +-- TODO: this should probably part of the specific driver mode? function StartingPointSetting:getValuesForMode(mode) if mode == courseplay.MODE_COMBI or mode == courseplay.MODE_OVERLOADER then return { diff --git a/translations/translation_br.xml b/translations/translation_br.xml index b61f8d90d..0f52a8003 100644 --- a/translations/translation_br.xml +++ b/translations/translation_br.xml @@ -25,7 +25,7 @@ <text name="COURSEPLAY_MODE_4" text="Tipo: Fertilizar e semear" /> <text name="COURSEPLAY_MODE_5" text="Tipo: Transferir (dirigir do início ao fim da rota)" /> <text name="COURSEPLAY_MODE_6" text="Tipo: Trabalho no campo" /> - <text name="COURSEPLAY_MODE_7" text="Tipo: Ceifadeira auto-descarrega" /> + <text name="COURSEPLAY_MODE_7" text="Type: Collect or wrap bales" /> <text name="COURSEPLAY_MODE_8" text="Type: Transporte de produtos Líquidos" /> <text name="COURSEPLAY_MODE_9" text="Tipo: Encher e esvaziar pá carregadeira" /> <text name="COURSEPLAY_MODE_10" text="Tipo: Nivelar e compactar" /> diff --git a/translations/translation_cs.xml b/translations/translation_cs.xml index 69f50b744..ad8b66337 100644 --- a/translations/translation_cs.xml +++ b/translations/translation_cs.xml @@ -25,7 +25,7 @@ <text name="COURSEPLAY_MODE_4" text="模式4:田间作业(施肥和播种)" /> <text name="COURSEPLAY_MODE_5" text="模式5:转移(从起点到终点)" /> <text name="COURSEPLAY_MODE_6" text="模式6:田间作业(收割和收集)" /> - <text name="COURSEPLAY_MODE_7" text="模式7:收割机自助卸载" /> + <text name="COURSEPLAY_MODE_7" text="Type: Collect or wrap bales" /> <text name="COURSEPLAY_MODE_8" text="模式8:液体运输" /> <text name="COURSEPLAY_MODE_9" text="模式9:铲车模式" /> <text name="COURSEPLAY_MODE_10" text="模式10:平整和压实" /> @@ -283,7 +283,7 @@ <text name="COURSEPLAY_CURRENT_POINT" text="当前点" /> <text name="COURSEPLAY_NEXT_POINT" text="下一个路径点" /> <text name="COURSEPLAY_UNLOAD" text="Unloading" /> - <text name="COURSEPLAY_COLLECT_BALES" text="Collect bales" /> + <text name="COURSEPLAY_COLLECT_BALES" text="Collect or wrap bales" /> <text name="COURSEPLAY_FIELD_EDGE_PATH" text="选择地块范围编号" /> <text name="COURSEPLAY_FIELD" text="地块范围路径编号:" /> <text name="COURSEPLAY_CURRENTLY_LOADED_COURSE" text="当前任务" /> diff --git a/translations/translation_cz.xml b/translations/translation_cz.xml index 2b6a8760d..fe4542784 100644 --- a/translations/translation_cz.xml +++ b/translations/translation_cz.xml @@ -25,7 +25,7 @@ <text name="COURSEPLAY_MODE_4" text="Mod: Hnojení a setí" /> <text name="COURSEPLAY_MODE_5" text="Mod: Průjezd (projede trasu bez zastavení)" /> <text name="COURSEPLAY_MODE_6" text="Mod: Polní práce" /> - <text name="COURSEPLAY_MODE_7" text="Mod: Kombajn se jede sám vysypat" /> + <text name="COURSEPLAY_MODE_7" text="Type: Collect or wrap bales" /> <text name="COURSEPLAY_MODE_8" text="Mod: Převoz kapalin" /> <text name="COURSEPLAY_MODE_9" text="Mod: Nakladač" /> <text name="COURSEPLAY_MODE_10" text="Mod: Nahrnování a dusání" /> diff --git a/translations/translation_de.xml b/translations/translation_de.xml index 1ea904561..01a3f8ae0 100644 --- a/translations/translation_de.xml +++ b/translations/translation_de.xml @@ -25,7 +25,7 @@ <text name="COURSEPLAY_MODE_4" text="Typ: Düngen und Säen" /> <text name="COURSEPLAY_MODE_5" text="Typ: Überführung (Route abfahren)" /> <text name="COURSEPLAY_MODE_6" text="Typ: Feldarbeit" /> - <text name="COURSEPLAY_MODE_7" text="Typ: Drescher fährt selbst abtanken" /> + <text name="COURSEPLAY_MODE_7" text="Type: Collect or wrap bales" /> <text name="COURSEPLAY_MODE_8" text="Typ: Feldversorgung" /> <text name="COURSEPLAY_MODE_9" text="Typ: Schaufel befüllen und entleeren" /> <text name="COURSEPLAY_MODE_10" text="Typ: Bunkersilo befüllen und verdichten" /> @@ -283,7 +283,7 @@ <text name="COURSEPLAY_CURRENT_POINT" text="aktuellen Wegpunkt" /> <text name="COURSEPLAY_NEXT_POINT" text="nächsten passenden Wegpunkt" /> <text name="COURSEPLAY_UNLOAD" text="Unloading" /> - <text name="COURSEPLAY_COLLECT_BALES" text="Collect bales" /> + <text name="COURSEPLAY_COLLECT_BALES" text="Collect or wrap bales" /> <text name="COURSEPLAY_FIELD_EDGE_PATH" text="Feldrandkurs" /> <text name="COURSEPLAY_FIELD" text="Feld" /> <text name="COURSEPLAY_CURRENTLY_LOADED_COURSE" text="(aktuell geladener Kurs)" /> diff --git a/translations/translation_en.xml b/translations/translation_en.xml index 39c4c516f..3a0f2939f 100644 --- a/translations/translation_en.xml +++ b/translations/translation_en.xml @@ -25,7 +25,7 @@ <text name="COURSEPLAY_MODE_4" text="Type: Fertilize and seeding" /> <text name="COURSEPLAY_MODE_5" text="Type: Transfer (drive from start to finish)" /> <text name="COURSEPLAY_MODE_6" text="Type: Fieldwork" /> - <text name="COURSEPLAY_MODE_7" text="Type: Combine self-unloading" /> + <text name="COURSEPLAY_MODE_7" text="Type: Collect or wrap bales" /> <text name="COURSEPLAY_MODE_8" text="Type: Field Supply" /> <text name="COURSEPLAY_MODE_9" text="Type: Fill and empty shovel" /> <text name="COURSEPLAY_MODE_10" text="Type: Leveling and compacting" /> @@ -284,7 +284,7 @@ <text name="COURSEPLAY_CURRENT_POINT" text="Current waypoint" /> <text name="COURSEPLAY_NEXT_POINT" text="Next closest waypoint" /> <text name="COURSEPLAY_UNLOAD" text="Unloading" /> - <text name="COURSEPLAY_COLLECT_BALES" text="Collect bales" /> + <text name="COURSEPLAY_COLLECT_BALES" text="Collect or wrap bales" /> <text name="COURSEPLAY_FIELD_EDGE_PATH" text="Field edge path" /> <text name="COURSEPLAY_FIELD" text="Field" /> <text name="COURSEPLAY_CURRENTLY_LOADED_COURSE" text="(Currently loaded course)" /> diff --git a/translations/translation_es.xml b/translations/translation_es.xml index 908df402c..dc86f9798 100644 --- a/translations/translation_es.xml +++ b/translations/translation_es.xml @@ -25,7 +25,7 @@ <text name="COURSEPLAY_MODE_4" text="Modo: Fertilizar y sembrar" /> <text name="COURSEPLAY_MODE_5" text="Modo: Traslado (conducir de un punto a otro)" /> <text name="COURSEPLAY_MODE_6" text="Modo: Trabajo de campo" /> - <text name="COURSEPLAY_MODE_7" text="Modo: Cosechadora ir a remolque y descargar" /> + <text name="COURSEPLAY_MODE_7" text="Type: Collect or wrap bales" /> <text name="COURSEPLAY_MODE_8" text="Modo: Transporte de producto líquido" /> <text name="COURSEPLAY_MODE_9" text="Modo: Cargar y descargar con pala" /> <text name="COURSEPLAY_MODE_10" text="Modo: Nivelando y compactando" /> diff --git a/translations/translation_fr.xml b/translations/translation_fr.xml index 8b3d131d5..9ee720db4 100644 --- a/translations/translation_fr.xml +++ b/translations/translation_fr.xml @@ -25,7 +25,7 @@ <text name="COURSEPLAY_MODE_4" text="Fertiliser, pulvériser et semer" /> <text name="COURSEPLAY_MODE_5" text="Aller à" /> <text name="COURSEPLAY_MODE_6" text="Travail dans la parcelle" /> - <text name="COURSEPLAY_MODE_7" text="Ramasser les balles" /> + <text name="COURSEPLAY_MODE_7" text="Type: Collect or wrap bales" /> <text name="COURSEPLAY_MODE_8" text="Ravitaillement à la parcelle" /> <text name="COURSEPLAY_MODE_9" text="Charger et décharger avec un godet" /> <text name="COURSEPLAY_MODE_10" text="Nivellement et tassement" /> diff --git a/translations/translation_hu.xml b/translations/translation_hu.xml index beb963981..a62d3c04f 100644 --- a/translations/translation_hu.xml +++ b/translations/translation_hu.xml @@ -25,7 +25,7 @@ <text name="COURSEPLAY_MODE_4" text="Típus: Szórás és vetés" /> <text name="COURSEPLAY_MODE_5" text="Típus: Szállitás (Vezetés a célig)" /> <text name="COURSEPLAY_MODE_6" text="Típus: Földmunkák, gyűjtés, szállítás" /> - <text name="COURSEPLAY_MODE_7" text="Típus: A kombájn megy kirakodni" /> + <text name="COURSEPLAY_MODE_7" text="Type: Collect or wrap bales" /> <text name="COURSEPLAY_MODE_8" text="Típus: Folyékony anyag szállítás" /> <text name="COURSEPLAY_MODE_9" text="Típus: Rakodás (kanalat tölt és ürít)" /> <text name="COURSEPLAY_MODE_10" text="Típus: Szintezés és tömörítés" /> diff --git a/translations/translation_it.xml b/translations/translation_it.xml index dbe550a72..2dc26841e 100644 --- a/translations/translation_it.xml +++ b/translations/translation_it.xml @@ -25,7 +25,7 @@ <text name="COURSEPLAY_MODE_4" text="Modalità: Concimazione e semina" /> <text name="COURSEPLAY_MODE_5" text="Modalità: Trasferimento (vai dall'inizio alla fine)" /> <text name="COURSEPLAY_MODE_6" text="Modalità: Lavoro in campo" /> - <text name="COURSEPLAY_MODE_7" text="Modalità: Auto-scarico (La trebbia va a scaricare nel rimorchio)" /> + <text name="COURSEPLAY_MODE_7" text="Type: Collect or wrap bales" /> <text name="COURSEPLAY_MODE_8" text="Modalità: Trasporto liquidi" /> <text name="COURSEPLAY_MODE_9" text="Modalità: Movimento pala" /> <text name="COURSEPLAY_MODE_10" text="Modalità: Livellare e compattare trincea" /> diff --git a/translations/translation_jp.xml b/translations/translation_jp.xml index b63f8a143..9386d6fb6 100644 --- a/translations/translation_jp.xml +++ b/translations/translation_jp.xml @@ -25,7 +25,7 @@ <text name="COURSEPLAY_MODE_4" text="タイプ: 散布/播種" /> <text name="COURSEPLAY_MODE_5" text="タイプ: 回送 (スタートポイントからエンドポイントへ)" /> <text name="COURSEPLAY_MODE_6" text="タイプ: フィールドワーク" /> - <text name="COURSEPLAY_MODE_7" text="タイプ: コンバイン セルフアンロード" /> + <text name="COURSEPLAY_MODE_7" text="Type: Collect or wrap bales" /> <text name="COURSEPLAY_MODE_8" text="タイプ: 液体輸送" /> <text name="COURSEPLAY_MODE_9" text="タイプ: バケット/ローダー" /> <text name="COURSEPLAY_MODE_10" text="タイプ: レベリング/圧縮" /> @@ -283,7 +283,7 @@ <text name="COURSEPLAY_CURRENT_POINT" text="記憶中のウェイポイント" /> <text name="COURSEPLAY_NEXT_POINT" text="次のウェイポイント" /> <text name="COURSEPLAY_UNLOAD" text="アンロード中" /> - <text name="COURSEPLAY_COLLECT_BALES" text="Collect bales" /> + <text name="COURSEPLAY_COLLECT_BALES" text="Collect or wrap bales" /> <text name="COURSEPLAY_FIELD_EDGE_PATH" text="フィールド境界線" /> <text name="COURSEPLAY_FIELD" text="フィールド" /> <text name="COURSEPLAY_CURRENTLY_LOADED_COURSE" text="(現在読み込まれているコース)" /> diff --git a/translations/translation_nl.xml b/translations/translation_nl.xml index ad6193956..23959d78d 100644 --- a/translations/translation_nl.xml +++ b/translations/translation_nl.xml @@ -25,7 +25,7 @@ <text name="COURSEPLAY_MODE_4" text="Type: Kunstmest en zaaien" /> <text name="COURSEPLAY_MODE_5" text="Type: Verladen (van start naar finish)" /> <text name="COURSEPLAY_MODE_6" text="Type: Veldwerk" /> - <text name="COURSEPLAY_MODE_7" text="Type: Combine zelflossen" /> + <text name="COURSEPLAY_MODE_7" text="Type: Collect or wrap bales" /> <text name="COURSEPLAY_MODE_8" text="Type: Vloeibare lading transport" /> <text name="COURSEPLAY_MODE_9" text="Type: Vullen en legen shovel" /> <text name="COURSEPLAY_MODE_10" text="Type: Egaliseren en comprimeren" /> @@ -279,7 +279,7 @@ <text name="COURSEPLAY_CURRENT_POINT" text="huidige markering" /> <text name="COURSEPLAY_NEXT_POINT" text="volgende markering" /> <text name="COURSEPLAY_UNLOAD" text="Unloading" /> - <text name="COURSEPLAY_COLLECT_BALES" text="Collect bales" /> + <text name="COURSEPLAY_COLLECT_BALES" text="Collect or wrap bales" /> <text name="COURSEPLAY_FIELD_EDGE_PATH" text="Veldrand route" /> <text name="COURSEPLAY_FIELD" text="Veld" /> <text name="COURSEPLAY_CURRENTLY_LOADED_COURSE" text="(huidige route)" /> diff --git a/translations/translation_pl.xml b/translations/translation_pl.xml index 98c8f720e..e1cebece0 100644 --- a/translations/translation_pl.xml +++ b/translations/translation_pl.xml @@ -25,7 +25,7 @@ <text name="COURSEPLAY_MODE_4" text="Tryb: Użyźnianie i siew" /> <text name="COURSEPLAY_MODE_5" text="Tryb: Transport (jazda od początku do końca)" /> <text name="COURSEPLAY_MODE_6" text="Tryb: Prace polowe" /> - <text name="COURSEPLAY_MODE_7" text="Tryb: Kombajn (samoczynny rozładunek)" /> + <text name="COURSEPLAY_MODE_7" text="Type: Collect or wrap bales" /> <text name="COURSEPLAY_MODE_8" text="Tryb: Transport płynnego produktu" /> <text name="COURSEPLAY_MODE_9" text="Tryb: Napełnij i rozładuj łychę" /> <text name="COURSEPLAY_MODE_10" text="Tryb: Wyrównywanie i ugniatanie" /> diff --git a/translations/translation_pt.xml b/translations/translation_pt.xml index f4e2d9d74..ddd8d86fa 100644 --- a/translations/translation_pt.xml +++ b/translations/translation_pt.xml @@ -25,7 +25,7 @@ <text name="COURSEPLAY_MODE_4" text="Tipo: Fertilizar e semear" /> <text name="COURSEPLAY_MODE_5" text="Tipo: Transferir (conduzir do início ao fim do percurso)" /> <text name="COURSEPLAY_MODE_6" text="Tipo: Trabalhar no campo" /> - <text name="COURSEPLAY_MODE_7" text="Tipo: Ceifeira descarrega no atrelado" /> + <text name="COURSEPLAY_MODE_7" text="Type: Collect or wrap bales" /> <text name="COURSEPLAY_MODE_8" text="Tipo: Transporte de estrume líquido" /> <text name="COURSEPLAY_MODE_9" text="Tipo: Carregar e descarregar a pá" /> <text name="COURSEPLAY_MODE_10" text="Tipo: Nivelar e Compactar" /> diff --git a/translations/translation_ru.xml b/translations/translation_ru.xml index f0596ba86..b68c5f366 100644 --- a/translations/translation_ru.xml +++ b/translations/translation_ru.xml @@ -25,7 +25,7 @@ <text name="COURSEPLAY_MODE_4" text="УДОБРЕНИЕ И ПОСЕВ" /> <text name="COURSEPLAY_MODE_5" text="ПЕРЕГОН ТЕХНИКИ" /> <text name="COURSEPLAY_MODE_6" text="РАЗНЫЕ ПОЛЕВЫЕ РАБОТЫ" /> - <text name="COURSEPLAY_MODE_7" text="САМОРАЗГУЗКА КОМБАЙНА" /> + <text name="COURSEPLAY_MODE_7" text="Type: Collect or wrap bales" /> <text name="COURSEPLAY_MODE_8" text="ДОСТАВКА НА ПОЛЕ" /> <!-- Field Supply --> <text name="COURSEPLAY_MODE_9" text="РАБОТЫ ДЛЯ ПОГРУЗЧИКА" /> <text name="COURSEPLAY_MODE_10" text="ВЫРАВНИВАНИЕ И УПЛОТНЕНИЕ" /> diff --git a/translations/translation_sl.xml b/translations/translation_sl.xml index 56db05325..31553e04d 100644 --- a/translations/translation_sl.xml +++ b/translations/translation_sl.xml @@ -25,7 +25,7 @@ <text name="COURSEPLAY_MODE_4" text="Način: Gnojenje in sejanje" /> <text name="COURSEPLAY_MODE_5" text="Način: Prevoz (vozi od začetka do konca)" /> <text name="COURSEPLAY_MODE_6" text="Način: delo na polju" /> - <text name="COURSEPLAY_MODE_7" text="Način: Combine avtomatska izpraznitev" /> + <text name="COURSEPLAY_MODE_7" text="Type: Collect or wrap bales" /> <text name="COURSEPLAY_MODE_8" text="Način: Liquid product transport" /> <text name="COURSEPLAY_MODE_9" text="Način: Napolni in izprazni kiblo" /> <text name="COURSEPLAY_MODE_10" text="Način: Ravnanje in stiskanje (silaže)" /> @@ -283,7 +283,7 @@ <text name="COURSEPLAY_CURRENT_POINT" text="trenutna točka" /> <text name="COURSEPLAY_NEXT_POINT" text="next waypoint" /> <!-- TODO: TRANSLATE --> <text name="COURSEPLAY_UNLOAD" text="Unloading" /> - <text name="COURSEPLAY_COLLECT_BALES" text="Collect bales" /> + <text name="COURSEPLAY_COLLECT_BALES" text="Collect or wrap bales" /> <text name="COURSEPLAY_FIELD_EDGE_PATH" text="Pot okrog polja" /> <text name="COURSEPLAY_FIELD" text="Polje" /> <text name="COURSEPLAY_CURRENTLY_LOADED_COURSE" text="(trenutno naložena pot)" />