LUADOC - Farming Simulator 22

Script v1_7_1_0

Engine v1_7_1_0

Foundation Reference

MapOverlayGenerator

Description
Generator Provides density map based data overlays on top of an in-game map.
Functions

adjustedOverlayResolution

Description
Update the map resolution depending on machine quality (settings)
Definition
adjustedOverlayResolution()
Code
111function MapOverlayGenerator:adjustedOverlayResolution(default, limitToTwo)
112 local profileClass = Utils.getPerformanceClassId()
113
114 if profileClass == GS_PROFILE_LOW then
115 return default
116
117 -- Do not go too big ons ervers to keep latency low within the engine; also avoid high memory use on consoles & mobile
118 elseif profileClass >= GS_PROFILE_VERY_HIGH and not limitToTwo and not GS_IS_CONSOLE_VERSION and not GS_IS_MOBILE_VERSION and not (g_currentMission.missionDynamicInfo.isMultiplayer and g_currentMission:getIsServer()) then
119 return {default[1] * 4, default[2] * 4}
120 else
121 return {default[1] * 2, default[2] * 2}
122 end
123end

buildFarmlandsMapOverlay

Description
Build the map overlay for farm lands.
Definition
buildFarmlandsMapOverlay()
Code
372function MapOverlayGenerator:buildFarmlandsMapOverlay(selectedFarmland)
373 local map = self.farmlandManager:getLocalMap()
374 local farmlands = self.farmlandManager:getFarmlands()
375
376 setOverlayColor(self.farmlandStateOverlay, 1, 1, 1, MapOverlayGenerator.FARMLANDS_ALPHA)
377
378 for k, farmland in pairs(farmlands) do
379 local ownerFarmId = self.farmlandManager:getFarmlandOwner(farmland.id)
380
381 if ownerFarmId ~= FarmlandManager.NOT_BUYABLE_FARM_ID then
382 if selectedFarmland ~= nil and farmland.id == selectedFarmland.id then
383 setDensityMapVisualizationOverlayStateColor(self.farmlandStateOverlay, map, 0, 0, 0, getBitVectorMapNumChannels(map), k, unpack(MapOverlayGenerator.COLOR.FIELD_SELECTED))
384 else
385 local color = MapOverlayGenerator.COLOR.FIELD_UNOWNED
386 if farmland.isOwned then -- assign farm color
387 local ownerFarm = self.farmManager:getFarmById(ownerFarmId)
388 if ownerFarm ~= nil then
389 color = ownerFarm:getColor()
390 end
391 end
392
393 setDensityMapVisualizationOverlayStateColor(self.farmlandStateOverlay, map, 0, 0, 0, getBitVectorMapNumChannels(map), k, unpack(color))
394 end
395 end
396 end
397
398 -- No borders on small maps
399 local profileClass = Utils.getPerformanceClassId()
400 if profileClass >= GS_PROFILE_HIGH then
401 setDensityMapVisualizationOverlayStateBorderColor(self.farmlandStateOverlay, map, 0, getBitVectorMapNumChannels(map), MapOverlayGenerator.FARMLANDS_BORDER_THICKNESS, unpack(MapOverlayGenerator.COLOR.FIELD_BORDER))
402 end
403
404 self:buildFieldMapOverlay(self.farmlandStateOverlay)
405end

buildFruitTypeMapOverlay

Description
Build the map overlay for fruit types.
Definition
buildFruitTypeMapOverlay()
Code
164function MapOverlayGenerator:buildFruitTypeMapOverlay(fruitTypeFilter)
165 for _, displayCropType in ipairs(self.displayCropTypes) do
166 if fruitTypeFilter[displayCropType.fruitTypeIndex] then
167 local foliageId = displayCropType.foliageId
168 if foliageId ~= nil and foliageId ~= 0 then
169 setDensityMapVisualizationOverlayTypeColor(self.foliageStateOverlay, foliageId, unpack(displayCropType.colors[self.isColorBlindMode]))
170 end
171 end
172 end
173end

buildGrowthStateMapOverlay

Description
Build the map overlay for growth states.
Definition
buildGrowthStateMapOverlay()
Code
183function MapOverlayGenerator:buildGrowthStateMapOverlay(growthStateFilter, fruitTypeFilter)
184 for _, displayCropType in ipairs(self.displayCropTypes) do
185 if fruitTypeFilter[displayCropType.fruitTypeIndex] then
186 local foliageId = displayCropType.foliageId
187 local desc = self.fruitTypeManager:getFruitTypeByIndex(displayCropType.fruitTypeIndex)
188
189 if desc.maxHarvestingGrowthState >= 0 then
190 if growthStateFilter[MapOverlayGenerator.GROWTH_STATE_INDEX.WITHERED] then
191 if desc.witheredState ~= nil then
192 local color = self.displayGrowthStates[MapOverlayGenerator.GROWTH_STATE_INDEX.WITHERED].colors[self.isColorBlindMode][1]
193 setDensityMapVisualizationOverlayGrowthStateColor(self.foliageStateOverlay, foliageId, desc.witheredState, color[1], color[2], color[3])
194 end
195 end
196
197 if growthStateFilter[MapOverlayGenerator.GROWTH_STATE_INDEX.HARVESTED] then
198 local color = self.displayGrowthStates[MapOverlayGenerator.GROWTH_STATE_INDEX.HARVESTED].colors[self.isColorBlindMode][1]
199 setDensityMapVisualizationOverlayGrowthStateColor(self.foliageStateOverlay, foliageId, desc.cutState, color[1], color[2], color[3])
200 end
201
202 if growthStateFilter[MapOverlayGenerator.GROWTH_STATE_INDEX.GROWING] then
203 local maxGrowingState = desc.minHarvestingGrowthState - 1
204 if desc.minPreparingGrowthState >= 0 then
205 maxGrowingState = math.min(maxGrowingState, desc.minPreparingGrowthState - 1)
206 end
207
208 local colors = self.displayGrowthStates[MapOverlayGenerator.GROWTH_STATE_INDEX.GROWING].colors[self.isColorBlindMode]
209 for i = 1, maxGrowingState do
210 -- Spready states across colors as different fruits have a different number of growth states
211 local index = math.max(math.floor(#colors / maxGrowingState * i), 1)
212 setDensityMapVisualizationOverlayGrowthStateColor(self.foliageStateOverlay, foliageId, i, colors[index][1], colors[index][2], colors[index][3])
213 end
214 end
215
216 if growthStateFilter[MapOverlayGenerator.GROWTH_STATE_INDEX.TOPPING] then
217 if desc.minPreparingGrowthState >= 0 then
218 local color = self.displayGrowthStates[MapOverlayGenerator.GROWTH_STATE_INDEX.TOPPING].colors[self.isColorBlindMode][1]
219 for i = desc.minPreparingGrowthState, desc.maxPreparingGrowthState do
220 setDensityMapVisualizationOverlayGrowthStateColor(self.foliageStateOverlay, foliageId, i, color[1], color[2], color[3])
221 end
222 end
223 end
224
225 if growthStateFilter[MapOverlayGenerator.GROWTH_STATE_INDEX.HARVEST] then
226 local colors = self.displayGrowthStates[MapOverlayGenerator.GROWTH_STATE_INDEX.HARVEST].colors[self.isColorBlindMode]
227 for i = desc.minHarvestingGrowthState, desc.maxHarvestingGrowthState do
228 local index = math.min(i - desc.minHarvestingGrowthState + 1, #colors)
229 setDensityMapVisualizationOverlayGrowthStateColor(self.foliageStateOverlay, foliageId, i, colors[index][1], colors[index][2], colors[index][3])
230 end
231 end
232 end
233 end
234 end
235
236 local mission = g_currentMission
237 local groundTypeMapId, groundTypeFirstChannel, groundTypeNumChannels = mission.fieldGroundSystem:getDensityMapData(FieldDensityMap.GROUND_TYPE)
238
239 -- local fieldMask = 15
240 local fieldMask = bitShiftLeft(bitShiftLeft(1, groundTypeNumChannels)-1, groundTypeFirstChannel)
241 if growthStateFilter[MapOverlayGenerator.GROWTH_STATE_INDEX.CULTIVATED] then
242 local cultivatorValue = mission.fieldGroundSystem:getFieldGroundValue(FieldGroundType.CULTIVATED)
243 local color = self.displayGrowthStates[MapOverlayGenerator.GROWTH_STATE_INDEX.CULTIVATED].colors[self.isColorBlindMode][1]
244 setDensityMapVisualizationOverlayStateColor(self.foliageStateOverlay, groundTypeMapId, 0, fieldMask, groundTypeFirstChannel, groundTypeNumChannels, cultivatorValue, color[1], color[2], color[3])
245 end
246
247 if growthStateFilter[MapOverlayGenerator.GROWTH_STATE_INDEX.PLOWED] then
248 local color = self.displayGrowthStates[MapOverlayGenerator.GROWTH_STATE_INDEX.PLOWED].colors[self.isColorBlindMode][1]
249 local plowValue = mission.fieldGroundSystem:getFieldGroundValue(FieldGroundType.PLOWED)
250 setDensityMapVisualizationOverlayStateColor(self.foliageStateOverlay, groundTypeMapId, 0, fieldMask, groundTypeFirstChannel, groundTypeNumChannels, plowValue, color[1], color[2], color[3])
251 end
252
253 if growthStateFilter[MapOverlayGenerator.GROWTH_STATE_INDEX.STUBBLE_TILLAGE] then
254 local color = self.displayGrowthStates[MapOverlayGenerator.GROWTH_STATE_INDEX.STUBBLE_TILLAGE].colors[self.isColorBlindMode][1]
255 local stubbleTillageValue = mission.fieldGroundSystem:getFieldGroundValue(FieldGroundType.STUBBLE_TILLAGE)
256 setDensityMapVisualizationOverlayStateColor(self.foliageStateOverlay, groundTypeMapId, 0, fieldMask, groundTypeFirstChannel, groundTypeNumChannels, stubbleTillageValue, color[1], color[2], color[3])
257 end
258
259 if growthStateFilter[MapOverlayGenerator.GROWTH_STATE_INDEX.SEEDBED] then
260 local color = self.displayGrowthStates[MapOverlayGenerator.GROWTH_STATE_INDEX.SEEDBED].colors[self.isColorBlindMode][1]
261 local seedBedValue = mission.fieldGroundSystem:getFieldGroundValue(FieldGroundType.SEEDBED)
262 setDensityMapVisualizationOverlayStateColor(self.foliageStateOverlay, groundTypeMapId, 0, fieldMask, groundTypeFirstChannel, groundTypeNumChannels, seedBedValue, color[1], color[2], color[3])
263 local rolledSeedBedValue = mission.fieldGroundSystem:getFieldGroundValue(FieldGroundType.ROLLED_SEEDBED)
264 setDensityMapVisualizationOverlayStateColor(self.foliageStateOverlay, groundTypeMapId, 0, fieldMask, groundTypeFirstChannel, groundTypeNumChannels, rolledSeedBedValue, color[1], color[2], color[3])
265 end
266end

buildMinimapOverlay

Description
Build the map overlay for minimap
Definition
buildMinimapOverlay()
Code
177function MapOverlayGenerator:buildMinimapOverlay(fruitTypeFilter)
178 self:buildFieldMapOverlay(self.minimapOverlay)
179end

buildSoilStateMapOverlay

Description
Build the map overlay for soil states.
Definition
buildSoilStateMapOverlay()
Code
270function MapOverlayGenerator:buildSoilStateMapOverlay(soilStateFilter)
271 local mission = g_currentMission
272 local groundTypeMapId, groundTypeFirstChannel, groundTypeNumChannels = mission.fieldGroundSystem:getDensityMapData(FieldDensityMap.GROUND_TYPE)
273 -- local fieldMask = 15
274 local fieldMask = bitShiftLeft(bitShiftLeft(1, groundTypeNumChannels)-1, groundTypeFirstChannel)
275
276 if soilStateFilter[MapOverlayGenerator.SOIL_STATE_INDEX.WEEDS] and mission.missionInfo.weedsEnabled then
277 local weedSystem = mission.weedSystem
278 if weedSystem ~= nil and weedSystem:getMapHasWeed() then
279 local weedMapId, _, _ = weedSystem:getDensityMapData()
280
281 local mapColor, mapColorBlind = weedSystem:getColors()
282 local colors = self.isColorBlindMode and mapColorBlind or mapColor
283
284 for k, data in ipairs(colors) do
285 local stateColor = data.color
286 for _, state in ipairs(data.states) do
287 setDensityMapVisualizationOverlayGrowthStateColor(self.foliageStateOverlay, weedMapId, state, stateColor[1], stateColor[2], stateColor[3])
288 end
289 end
290 end
291 end
292
293 if soilStateFilter[MapOverlayGenerator.SOIL_STATE_INDEX.STONES] and mission.missionInfo.stonesEnabled then
294 local stoneSystem = mission.stoneSystem
295 if stoneSystem ~= nil and stoneSystem:getMapHasStones() then
296 local stoneMapId, _, _ = stoneSystem:getDensityMapData()
297
298 local mapColor, mapColorBlind = stoneSystem:getColors()
299 local colors = self.isColorBlindMode and mapColorBlind or mapColor
300
301 for k, data in ipairs(colors) do
302 local stateColor = data.color
303 for _, state in ipairs(data.states) do
304 setDensityMapVisualizationOverlayGrowthStateColor(self.foliageStateOverlay, stoneMapId, state, stateColor[1], stateColor[2], stateColor[3])
305 end
306 end
307 end
308 end
309
310 if soilStateFilter[MapOverlayGenerator.SOIL_STATE_INDEX.NEEDS_PLOWING] and mission.missionInfo.plowingRequiredEnabled then
311 local color = self.displaySoilStates[MapOverlayGenerator.SOIL_STATE_INDEX.NEEDS_PLOWING].colors[self.isColorBlindMode][1]
312 local mapId, plowLevelFirstChannel, plowLevelNumChannels = mission.fieldGroundSystem:getDensityMapData(FieldDensityMap.PLOW_LEVEL)
313
314 setDensityMapVisualizationOverlayStateColor(self.foliageStateOverlay, mapId, groundTypeMapId, fieldMask, plowLevelFirstChannel, plowLevelNumChannels, 0, color[1], color[2], color[3])
315 end
316
317 if soilStateFilter[MapOverlayGenerator.SOIL_STATE_INDEX.NEEDS_ROLLING] then
318 local color = self.displaySoilStates[MapOverlayGenerator.SOIL_STATE_INDEX.NEEDS_ROLLING].colors[self.isColorBlindMode][1]
319 local mapId, rollerLevelFirstChannel, rollerLevelNumChannels = mission.fieldGroundSystem:getDensityMapData(FieldDensityMap.ROLLER_LEVEL)
320
321 setDensityMapVisualizationOverlayStateColor(self.foliageStateOverlay, mapId, 0, fieldMask, rollerLevelFirstChannel, rollerLevelNumChannels, 1, color[1], color[2], color[3])
322 end
323
324 if soilStateFilter[MapOverlayGenerator.SOIL_STATE_INDEX.MULCHED] then
325 local color = self.displaySoilStates[MapOverlayGenerator.SOIL_STATE_INDEX.MULCHED].colors[self.isColorBlindMode][1]
326 local mapId, mulchFirstChannel, mulchNumChannels = mission.fieldGroundSystem:getDensityMapData(FieldDensityMap.STUBBLE_SHRED)
327
328 setDensityMapVisualizationOverlayStateColor(self.foliageStateOverlay, mapId, 0, fieldMask, mulchFirstChannel, mulchNumChannels, 1, color[1], color[2], color[3])
329 end
330
331 if not GS_IS_MOBILE_VERSION then
332 if soilStateFilter[MapOverlayGenerator.SOIL_STATE_INDEX.NEEDS_LIME] and mission.missionInfo.limeRequired then
333 local color = self.displaySoilStates[MapOverlayGenerator.SOIL_STATE_INDEX.NEEDS_LIME].colors[self.isColorBlindMode][1]
334 local mapId, limeLevelFirstChannel, limeLevelNumChannels = mission.fieldGroundSystem:getDensityMapData(FieldDensityMap.LIME_LEVEL)
335
336 setDensityMapVisualizationOverlayStateColor(self.foliageStateOverlay, mapId, groundTypeMapId, fieldMask, limeLevelFirstChannel, limeLevelNumChannels, 0, color[1], color[2], color[3])
337 end
338 end
339
340 if soilStateFilter[MapOverlayGenerator.SOIL_STATE_INDEX.FERTILIZED] then
341 local colors = self.displaySoilStates[MapOverlayGenerator.SOIL_STATE_INDEX.FERTILIZED].colors[self.isColorBlindMode]
342 local sprayMapId, sprayLevelFirstChannel, sprayLevelNumChannels = mission.fieldGroundSystem:getDensityMapData(FieldDensityMap.SPRAY_LEVEL)
343 local maxSprayLevel = mission.fieldGroundSystem:getMaxValue(FieldDensityMap.SPRAY_LEVEL)
344 for level = 1, maxSprayLevel do
345 local color = colors[math.min(level, #colors)]
346 setDensityMapVisualizationOverlayStateColor(self.foliageStateOverlay, sprayMapId, 0, fieldMask, sprayLevelFirstChannel, sprayLevelNumChannels, level, color[1], color[2], color[3])
347 end
348 end
349end

checkOverlayFinished

Description
Check if any overlay is currently being generated and triggers a callback when it's finished.
Definition
checkOverlayFinished()
Code
494function MapOverlayGenerator:checkOverlayFinished()
495 if self.currentOverlayHandle ~= nil then
496 if getIsDensityMapVisualizationOverlayReady(self.currentOverlayHandle) then
497 self.overlayFinishedCallback(self.currentOverlayHandle)
498 self.currentOverlayHandle = nil
499 end
500 end
501end

delete

Description
Delete this instance and any used overlays.
Definition
delete()
Code
102function MapOverlayGenerator:delete()
103 self:reset()
104 delete(self.foliageStateOverlay)
105 delete(self.farmlandStateOverlay)
106 delete(self.minimapOverlay)
107end

generateFarmlandOverlay

Description
Generate a farm land overlay.
Definition
generateFarmlandOverlay(function finishedCallback, table mapPosition)
Arguments
functionfinishedCallbackCalled when generation is finished, signature: function(overlayId)
tablemapPositionMap position vector of a selection position. If the position is within a farm land, it will be highlighted.
Code
488function MapOverlayGenerator:generateFarmlandOverlay(finishedCallback, mapPosition)
489 return self:generateOverlay(MapOverlayGenerator.OVERLAY_TYPE.FARMLANDS, finishedCallback, mapPosition)
490end

generateFruitTypeOverlay

Description
Generate a fruit type overlay.
Definition
generateFruitTypeOverlay(function finishedCallback, table fruitTypeFilter)
Arguments
functionfinishedCallbackCalled when generation is finished, signature: function(overlayId)
tablefruitTypeFilterMap of fruit type indices to booleans. If the value is true, the fruit type will be displayed.
Return Values
boolTrueif overlay generation has started, false if generation is already in progress or an invalid overlay type has been provided
Code
447function MapOverlayGenerator:generateFruitTypeOverlay(finishedCallback, fruitTypeFilter)
448 return self:generateOverlay(MapOverlayGenerator.OVERLAY_TYPE.CROPS, finishedCallback, fruitTypeFilter)
449end

generateGrowthStateOverlay

Description
Generate a growth state overlay.
Definition
generateGrowthStateOverlay(function finishedCallback, table fruitTypeFilter)
Arguments
functionfinishedCallbackCalled when generation is finished, signature: function(overlayId)
tablefruitTypeFilterMap of growth state indices (MapOverlayGenerator.GROWTH_STATE_INDEX members) to booleans. If the value is true, the growth state will be displayed.
Return Values
boolTrueif overlay generation has started, false if generation is already in progress or an invalid overlay type has been provided
Code
468function MapOverlayGenerator:generateGrowthStateOverlay(finishedCallback, growthStateFilter, fruitTypeFilter)
469 return self:generateOverlay(MapOverlayGenerator.OVERLAY_TYPE.GROWTH, finishedCallback, growthStateFilter, fruitTypeFilter)
470end

generateMinimapOverlay

Description
Generate ovrlay for minimap
Definition
generateMinimapOverlay(function finishedCallback, table fruitTypeFilter)
Arguments
functionfinishedCallbackCalled when generation is finished, signature: function(overlayId)
tablefruitTypeFilterMap of fruit type indices to booleans. If the value is true, the fruit type will be displayed.
Return Values
boolTrueif overlay generation has started, false if generation is already in progress or an invalid overlay type has been provided
Code
457function MapOverlayGenerator:generateMinimapOverlay(finishedCallback, fruitTypeFilter)
458 return self:generateOverlay(MapOverlayGenerator.OVERLAY_TYPE.MINIMAP, finishedCallback, fruitTypeFilter)
459end

generateOverlay

Description
Generate a map overlay of a given type. This is an internal generic interfacing method and should not be called externally. Consumers should use one of the specific public methods instead, e.g. MapOverlayGenerator:generateFruitTypeOverlay().
Definition
generateOverlay(int mapOverlayType, function finishedCallback, table overlayState)
Arguments
intmapOverlayTypeOverlay type as one of MapOverlayGenerator.OVERLAY_TYPE.[CROPS|GROWTH|SOIL|FARMLANDS]
functionfinishedCallbackFunction which is called with the overlay ID as its argument when processing is finished, signature: function(overlayId)
tableoverlayStateOverlay state data which defines parameters (e.g. colors) of the map overlays.
Return Values
boolTrueif overlay generation has started, false if generation is already in progress or an invalid overlay type has been provided
Code
417function MapOverlayGenerator:generateOverlay(mapOverlayType, finishedCallback, overlayState, overlayState2)
418 local success = true
419 if self.overlayTypeCheckHash[mapOverlayType] == nil then
420 Logging.warning("Tried generating a map overlay with an invalid overlay type: [%s]", tostring(mapOverlayType))
421 success = false
422 else
423 local overlayHandle = self.overlayHandles[mapOverlayType]
424 self.overlayFinishedCallback = finishedCallback or NO_CALLBACK
425 resetDensityMapVisualizationOverlay(overlayHandle) -- clear any previous overlay state
426
427 self.currentOverlayHandle = overlayHandle
428
429 local builderFunction = self.typeBuilderFunctionMap[mapOverlayType]
430
431 builderFunction(self, overlayState, overlayState2)
432
433 -- generate the map overlay based on the settings made in the build methods
434 generateDensityMapVisualizationOverlay(overlayHandle)
435 self:checkOverlayFinished() -- check now, might already be done
436 end
437
438 return success
439end

generateSoilStateOverlay

Description
Generate a soil state overlay.
Definition
generateSoilStateOverlay(function finishedCallback, table fruitTypeFilter)
Arguments
functionfinishedCallbackCalled when generation is finished, signature: function(overlayId)
tablefruitTypeFilterMap of soil state indices (MapOverlayGenerator.SOIL_STATE_INDEX members) to booleans. If the value is true, the soil state will be displayed.
Return Values
boolTrueif overlay generation has started, false if generation is already in progress or an invalid overlay type has been provided
Code
479function MapOverlayGenerator:generateSoilStateOverlay(finishedCallback, soilStateFilter)
480 return self:generateOverlay(MapOverlayGenerator.OVERLAY_TYPE.SOIL, finishedCallback, soilStateFilter)
481end

getDisplayCropTypes

Description
Get display information for crop types. Override to add new crop types or change information.
Definition
getDisplayCropTypes()
Return Values
Arrayofdisplay information, {i={colors={true=[{r,g,b,a} colorblind], false=[{r,g,b,a} default], iconFilename=path, iconUVs={u1, v1, u2, v2, u3, v3, u4, v4}, description=text, fruitTypeIndex=index}}
Code
529function MapOverlayGenerator:getDisplayCropTypes()
530 local cropTypes = {}
531 -- load crop type icon definitions in order of map configuration
532 for _, fruitType in ipairs(self.missionFruitTypes) do
533 if fruitType.shownOnMap then
534 local fillableIndex = self.fruitTypeManager:getFillTypeIndexByFruitTypeIndex(fruitType.fruitTypeIndex)
535 local fillable = self.fillTypeManager:getFillTypeByIndex(fillableIndex)
536
537 local iconFilename = fillable.hudOverlayFilename
538 local iconUVs = Overlay.DEFAULT_UVS -- default crop type icons are separate files, use full texture
539 local description = fillable.title
540
541 table.insert(cropTypes, {
542 colors = {[false] = fruitType.defaultColor, [true] = fruitType.colorBlindColor},
543 iconFilename = iconFilename,
544 iconUVs = iconUVs,
545 description = description,
546 fruitTypeIndex = fruitType.fruitTypeIndex,
547 foliageId = fruitType.foliageId
548 })
549 end
550 end
551
552 return cropTypes
553end

getDisplayGrowthStates

Description
Get display information for growth states. Growth states can be represented in multiple colors per state, so colors are defined in arrays per color blind mode. Override to add new growth states or change information.
Definition
getDisplayGrowthStates()
Return Values
Arrayofdisplay information, {i={colors={true={i={r,g,b,a}}, false={i={r,g,b,a}}}, description=text}}
Code
561function MapOverlayGenerator:getDisplayGrowthStates()
562 local res = {
563 -- indices are contiguous, so this definition is a valid array:
564 [MapOverlayGenerator.GROWTH_STATE_INDEX.CULTIVATED] = {
565 colors = {
566 [true] = {MapOverlayGenerator.FRUIT_COLOR_CULTIVATED[true]},
567 [false] = {MapOverlayGenerator.FRUIT_COLOR_CULTIVATED[false]}
568 },
569 description = self.l10n:getText(MapOverlayGenerator.L10N_SYMBOL.GROWTH_MAP_CULTIVATED)
570 },
571 [MapOverlayGenerator.GROWTH_STATE_INDEX.STUBBLE_TILLAGE] = {
572 colors = {
573 [true] = {MapOverlayGenerator.FRUIT_COLOR_STUBBLE_TILLAGE[true]},
574 [false] = {MapOverlayGenerator.FRUIT_COLOR_STUBBLE_TILLAGE[false]}
575 },
576 description = self.l10n:getText(MapOverlayGenerator.L10N_SYMBOL.GROWTH_MAP_STUBBLE_TILLAGE)
577 },
578 [MapOverlayGenerator.GROWTH_STATE_INDEX.SEEDBED] = {
579 colors = {
580 [true] = {MapOverlayGenerator.FRUIT_COLOR_SEEDBED[true]},
581 [false] = {MapOverlayGenerator.FRUIT_COLOR_SEEDBED[false]}
582 },
583 description = self.l10n:getText(MapOverlayGenerator.L10N_SYMBOL.GROWTH_MAP_SEEDBED)
584 },
585 [MapOverlayGenerator.GROWTH_STATE_INDEX.GROWING] = {
586 colors = MapOverlayGenerator.FRUIT_COLORS_GROWING,
587 description = self.l10n:getText(MapOverlayGenerator.L10N_SYMBOL.GROWTH_MAP_GROWING)
588 },
589 [MapOverlayGenerator.GROWTH_STATE_INDEX.HARVEST] = {
590 colors = MapOverlayGenerator.FRUIT_COLORS_HARVEST,
591 description = self.l10n:getText(MapOverlayGenerator.L10N_SYMBOL.GROWTH_MAP_HARVEST)
592 },
593 [MapOverlayGenerator.GROWTH_STATE_INDEX.HARVESTED] = {
594 colors = {
595 [true] = {MapOverlayGenerator.FRUIT_COLOR_CUT},
596 [false] = {MapOverlayGenerator.FRUIT_COLOR_CUT}
597 },
598 description = self.l10n:getText(MapOverlayGenerator.L10N_SYMBOL.GROWTH_MAP_HARVESTED)
599 },
600 [MapOverlayGenerator.GROWTH_STATE_INDEX.TOPPING] = {
601 colors = {
602 [true] = {MapOverlayGenerator.FRUIT_COLOR_REMOVE_TOPS[true]},
603 [false] = {MapOverlayGenerator.FRUIT_COLOR_REMOVE_TOPS[false]}
604 },
605 description = self.l10n:getText(MapOverlayGenerator.L10N_SYMBOL.GROWTH_MAP_TOPPING)
606 }
607 }
608
609 if not GS_IS_MOBILE_VERSION then
610 res[MapOverlayGenerator.GROWTH_STATE_INDEX.PLOWED] = {
611 colors = {
612 [true] = {MapOverlayGenerator.FRUIT_COLOR_PLOWED[true]},
613 [false] = {MapOverlayGenerator.FRUIT_COLOR_PLOWED[false]}
614 },
615 description = self.l10n:getText(MapOverlayGenerator.L10N_SYMBOL.GROWTH_MAP_PLOWED)
616 }
617
618 res[MapOverlayGenerator.GROWTH_STATE_INDEX.WITHERED] = {
619 colors = {
620 [true] = {MapOverlayGenerator.FRUIT_COLOR_WITHERED[true]},
621 [false] = {MapOverlayGenerator.FRUIT_COLOR_WITHERED[false]}
622 },
623 description = self.l10n:getText(MapOverlayGenerator.L10N_SYMBOL.GROWTH_MAP_WITHERED)
624 }
625 end
626
627 return res
628end

getDisplaySoilStates

Description
Get display information for soil states. Soil states can be represented in multiple colors per state, so colors are defined in arrays per color blind mode. Override to add new soil states or change information.
Definition
getDisplaySoilStates()
Return Values
Arrayofdisplay information, {i={colors={true={i={r,g,b,a}}, false={i={r,g,b,a}}}, description=text}}
Code
636function MapOverlayGenerator:getDisplaySoilStates()
637 local fertilizerColors = {[true]={}, [false]={}}
638 local mission = g_currentMission
639
640 local maxFertilizerStates = mission.fieldGroundSystem:getMaxValue(FieldDensityMap.SPRAY_LEVEL)
641 for colorBlind, colors in pairs(MapOverlayGenerator.FRUIT_COLORS_FERTILIZED) do
642 for i=#colors, 1, -1 do
643 local color = colors[i]
644 table.insert(fertilizerColors[colorBlind], 1, color)
645
646 if #fertilizerColors[colorBlind] == maxFertilizerStates then
647 break
648 end
649 end
650 end
651
652 local res = {
653 [MapOverlayGenerator.SOIL_STATE_INDEX.FERTILIZED] = {
654 colors = fertilizerColors,
655 description = self.l10n:getText(MapOverlayGenerator.L10N_SYMBOL.SOIL_MAP_FERTILIZED),
656 isActive = true
657 },
658 }
659 if not GS_IS_MOBILE_VERSION then
660 res[MapOverlayGenerator.SOIL_STATE_INDEX.NEEDS_LIME] = {
661 colors = {
662 [true] = {MapOverlayGenerator.FRUIT_COLOR_NEEDS_LIME[true]},
663 [false] = {MapOverlayGenerator.FRUIT_COLOR_NEEDS_LIME[false]}
664 },
665 description = self.l10n:getText(MapOverlayGenerator.L10N_SYMBOL.SOIL_MAP_NEED_LIME),
666 isActive = mission.missionInfo.limeRequired
667 }
668
669 res[MapOverlayGenerator.SOIL_STATE_INDEX.NEEDS_PLOWING] = {
670 colors = {
671 [true] = {MapOverlayGenerator.FRUIT_COLOR_NEEDS_PLOWING[true]},
672 [false] = {MapOverlayGenerator.FRUIT_COLOR_NEEDS_PLOWING[false]}
673 },
674 description = self.l10n:getText(MapOverlayGenerator.L10N_SYMBOL.SOIL_MAP_NEED_PLOWING),
675 isActive = mission.missionInfo.plowingRequiredEnabled
676 }
677
678 res[MapOverlayGenerator.SOIL_STATE_INDEX.NEEDS_ROLLING] = {
679 colors = {
680 [true] = {MapOverlayGenerator.FRUIT_COLOR_NEEDS_ROLLING[true]},
681 [false] = {MapOverlayGenerator.FRUIT_COLOR_NEEDS_ROLLING[false]}
682 },
683 description = self.l10n:getText(MapOverlayGenerator.L10N_SYMBOL.SOIL_MAP_NEED_ROLLING),
684 isActive = true
685 }
686
687 res[MapOverlayGenerator.SOIL_STATE_INDEX.MULCHED] = {
688 colors = {
689 [true] = {MapOverlayGenerator.FRUIT_COLOR_MULCHED[true]},
690 [false] = {MapOverlayGenerator.FRUIT_COLOR_MULCHED[false]}
691 },
692 description = self.l10n:getText(MapOverlayGenerator.L10N_SYMBOL.SOIL_MAP_MULCHED),
693 isActive = true
694 }
695 end
696
697 local weedSystem = mission.weedSystem
698 if weedSystem ~= nil and weedSystem:getMapHasWeed() then
699 local mapColor, mapColorBlind = weedSystem:getColors()
700 local description = weedSystem:getTitle() or ""
701
702 local colors = {[true]={}, [false]={}}
703 for k, data in ipairs(mapColor) do
704 table.insert(colors[true], mapColorBlind[k].color)
705 table.insert(colors[false], data.color)
706 end
707
708 res[MapOverlayGenerator.SOIL_STATE_INDEX.WEEDS] = {
709 colors = colors,
710 description = description,
711 isActive = mission.missionInfo.weedsEnabled
712 }
713 end
714
715 local stoneSystem = mission.stoneSystem
716 if stoneSystem ~= nil and stoneSystem:getMapHasStones() then
717 local mapColor, mapColorBlind = stoneSystem:getColors()
718 local description = stoneSystem:getTitle() or ""
719
720 local colors = {[true]={}, [false]={}}
721 for k, data in ipairs(mapColor) do
722 table.insert(colors[true], mapColorBlind[k].color)
723 table.insert(colors[false], data.color)
724 end
725
726 res[MapOverlayGenerator.SOIL_STATE_INDEX.STONES] = {
727 colors = colors,
728 description = description,
729 isActive = mission.missionInfo.stonesEnabled
730 }
731 end
732
733 return res
734end

new

Description
Create a MapOverlayGenerator instance.
Definition
new(table l10n, table fruitTypeManager, table fillTypeManager, table farmlandManager, table farmManager)
Arguments
tablel10nI18N reference for text localization
tablefruitTypeManagerFruitTypeManager reference for fruit type resolution
tablefillTypeManagerFillTypeManager reference for fruit fill type resolution
tablefarmlandManagerFarmlandManager reference for farm land data access
tablefarmManagerFarmManager reference for farm land ownership data access
Code
43function MapOverlayGenerator.new(l10n, fruitTypeManager, fillTypeManager, farmlandManager, farmManager, weedSystem)
44 local self = setmetatable({}, MapOverlayGenerator_mt)
45
46 self.l10n = l10n
47 self.fruitTypeManager = fruitTypeManager
48 self.fillTypeManager = fillTypeManager
49 self.farmlandManager = farmlandManager
50 self.farmManager = farmManager
51
52 self.missionFruitTypes = {}
53 self.isColorBlindMode = nil
54
55 self.foliageStateOverlay = createDensityMapVisualizationOverlay("foliageState", unpack(self:adjustedOverlayResolution(MapOverlayGenerator.OVERLAY_RESOLUTION.FOLIAGE_STATE)))
56 self.farmlandStateOverlay = createDensityMapVisualizationOverlay("farmlandState", unpack(self:adjustedOverlayResolution(MapOverlayGenerator.OVERLAY_RESOLUTION.FARMLANDS, true)))
57 self.minimapOverlay = createDensityMapVisualizationOverlay("minimap", unpack(self:adjustedOverlayResolution(MapOverlayGenerator.OVERLAY_RESOLUTION.MINIMAP)))
58
59 self.typeBuilderFunctionMap = {
60 [MapOverlayGenerator.OVERLAY_TYPE.CROPS] = self.buildFruitTypeMapOverlay,
61 [MapOverlayGenerator.OVERLAY_TYPE.GROWTH] = self.buildGrowthStateMapOverlay,
62 [MapOverlayGenerator.OVERLAY_TYPE.SOIL] = self.buildSoilStateMapOverlay,
63 [MapOverlayGenerator.OVERLAY_TYPE.FARMLANDS] = self.buildFarmlandsMapOverlay,
64 [MapOverlayGenerator.OVERLAY_TYPE.MINIMAP] = self.buildMinimapOverlay,
65 }
66
67 self.overlayHandles = {
68 [MapOverlayGenerator.OVERLAY_TYPE.CROPS] = self.foliageStateOverlay, -- re-use this handle, these types are mutually exclusive
69 [MapOverlayGenerator.OVERLAY_TYPE.GROWTH] = self.foliageStateOverlay,
70 [MapOverlayGenerator.OVERLAY_TYPE.SOIL] = self.foliageStateOverlay,
71 [MapOverlayGenerator.OVERLAY_TYPE.FARMLANDS] = self.farmlandStateOverlay, -- farmlands are separate
72 [MapOverlayGenerator.OVERLAY_TYPE.MINIMAP] = self.minimapOverlay, -- farmlands are separate
73 }
74
75 self.currentOverlayHandle = nil -- handle of overlay which is currently being generated or nil if none is processing
76 self.overlayFinishedCallback = NO_CALLBACK
77
78 self.overlayTypeCheckHash = {}
79 for k, v in pairs(MapOverlayGenerator.OVERLAY_TYPE) do
80 self.overlayTypeCheckHash[v] = k
81 end
82
83 self.fieldColor = MapOverlayGenerator.FIELD_COLOR
84 self.grassFieldColor = MapOverlayGenerator.FIELD_GRASS_COLOR
85
86 -- Set overlay refresh time limit... block less long in console single- and console/PC MP server mode
87 if GS_IS_CONSOLE_VERSION or (g_currentMission.missionDynamicInfo.isMultiplayer and g_currentMission:getIsServer()) then
88 setDensityMapVisualizationOverlayUpdateTimeLimit(self.foliageStateOverlay, 10)
89 setDensityMapVisualizationOverlayUpdateTimeLimit(self.farmlandStateOverlay, 10)
90 setDensityMapVisualizationOverlayUpdateTimeLimit(self.minimapOverlay, 10)
91 else
92 setDensityMapVisualizationOverlayUpdateTimeLimit(self.foliageStateOverlay, 20)
93 setDensityMapVisualizationOverlayUpdateTimeLimit(self.farmlandStateOverlay, 20)
94 setDensityMapVisualizationOverlayUpdateTimeLimit(self.minimapOverlay, 20)
95 end
96
97 return self
98end

reset

Description
Reset overlay generation state.
Definition
reset()
Code
505function MapOverlayGenerator:reset()
506 resetDensityMapVisualizationOverlay(self.foliageStateOverlay)
507 resetDensityMapVisualizationOverlay(self.farmlandStateOverlay)
508 resetDensityMapVisualizationOverlay(self.minimapOverlay)
509 self.currentOverlayHandle = nil
510end

setColorBlindMode

Description
Set the color blind mode for overlay creation.
Definition
setColorBlindMode()
Code
153function MapOverlayGenerator:setColorBlindMode(isColorBlindMode)
154 self.isColorBlindMode = isColorBlindMode
155end

setMissionFruitTypes

Description
Set the valid fruit types of the current mission.
Definition
setMissionFruitTypes()
Code
127function MapOverlayGenerator:setMissionFruitTypes(missionFruitTypes)
128 self.missionFruitTypes = {}
129 for _, fruitType in ipairs(missionFruitTypes) do
130 -- transfer to new data structure used to display filters:
131 table.insert(self.missionFruitTypes, {
132 foliageId = fruitType.terrainDataPlaneId,
133 fruitTypeIndex = fruitType.index,
134 shownOnMap = fruitType.shownOnMap,
135 defaultColor = fruitType.defaultMapColor,
136 colorBlindColor = fruitType.colorBlindMapColor
137 })
138 end
139
140 self.displayCropTypes = self:getDisplayCropTypes()
141 self.displayGrowthStates = self:getDisplayGrowthStates()
142 self.displaySoilStates = self:getDisplaySoilStates()
143end

update

Description
Update the state each frame. Checks the overlay generation state.
Definition
update()
Code
515function MapOverlayGenerator:update(dt)
516 self:checkOverlayFinished()
517end