local ffu = require "filefilterutil" local metadatautil = require "metadatautil" function data() return { --[[info = { },]] categories = { { key = "climate", name = _("Climate") }, { key = "vehicles", name = _("Vehicles") }, { key = "nameList", name = _("Town names") }, { key = "environment", name = _("Environment") }, { key = "difficulty", name = _("Difficulty") }, }, options = { climate = { { "temperate", _("Temperate") }, { "dry", _("Dry") }, { "tropical", _("Tropical") } }, vehicles = { { "all", _("All") }, { "europe", _("European") }, { "usa", _("American") }, { "asia", _("Asian") } }, nameList = { { "europe", _("European") }, { "england", _("English") }, { "france", _("French") }, { "germany", _("German") }, { "italy", _("Italian") }, { "korea", _("Korean") }, { "netherlands", _("Dutch") }, { "norway", _("Norwegian") }, { "russia", _("Russian") }, { "spain", _("Spanish") }, { "sweden", _("Swedish") }, { "usa", _("American") }, { "asia", _("Asian") } }, environment = { { "temperate", _("Temperate") }, { "dry", _("Dry") }, { "tropical", _("Tropical") } }, difficulty = { { "easy", _("Easy") }, { "medium", _("Medium") }, { "hard", _("Hard") } }, }, runFn = function (settings) local baseNonUsa = function (fileName, data) return ffu.package.base(fileName, data) and not string.find(fileName, "/usa/") end local baseNonAsia = function (fileName, data) return ffu.package.base(fileName, data) and not string.find(fileName, "/asia/") end local baseNonTropical = function (fileName, data) return ffu.package.base(fileName, data) and not string.find(fileName, "/tropical/") end local baseTemperate = function (fileName, data) return ffu.package.base(fileName, data) and not string.find(fileName, "/temperate/") end local baseUsa = function (fileName, data) return ffu.package.base(fileName, data) and string.find(fileName, "/usa/") end local baseTropical = function (fileName, data) return ffu.package.base(fileName, data) and string.find(fileName, "/tropical/") end local baseAsia = function (fileName, data) return ffu.package.base(fileName, data) and string.find(fileName, "/asia/") end local baseOrMod = ffu.util.combineOr({ffu.util.combineAnd({ baseNonTropical, baseNonUsa, baseNonAsia }), ffu.package.mod }) local usaOrMod = ffu.util.combineOr({ baseUsa, ffu.package.mod }) local tropicalOrMod = ffu.util.combineOr({ baseTropical, ffu.package.mod }) local asiaOrMod = ffu.util.combineOr({ baseAsia, ffu.package.mod }) if settings.climate == "dry" then game.config.climate = "dry.clima.lua" elseif settings.climate == "tropical" then game.config.climate = "tropical.clima.lua" end addFileFilter("model/car", function (fileName, data) return not string.match(fileName, "res/models/model/placeholders/missing_car.mdl") end) addFileFilter("model/person", function (fileName, data) return not string.match(fileName, "res/models/model/placeholders/missing_person.mdl") end) addFileFilter("construction", function (fileName, data) return not string.match(fileName, "res/construction/placeholders/generic.con") end) addFileFilter("model/vehicle", function (fileName, data) if string.match(fileName, "res/models/model/placeholders/missing_road_vehicle.mdl") then return false end if string.match(fileName, "res/models/model/placeholders/missing_tram.mdl") then return false end if string.match(fileName, "res/models/model/placeholders/missing_air_vehicle.mdl") then return false end if string.match(fileName, "res/models/model/placeholders/missing_water_vehicle.mdl") then return false end if string.match(fileName, "res/models/model/placeholders/missing_rail_vehicle.mdl") then return false end return true end) if settings.vehicles == "europe" then addFileFilter("model/vehicle", function (fileName, data) local extraVehicles = { ["res/models/model/vehicle/bus/usa/schneider_pb2.mdl"] = true, ["res/models/model/vehicle/bus/usa/wright_streetcar_rtv.mdl"] = true, ["res/models/model/vehicle/bus/asia/gaggenau_c40.mdl"] = true, ["res/models/model/vehicle/bus/asia/bk_670.mdl"] = true, ["res/models/model/vehicle/bus/asia/maz_103.mdl"] = true, ["res/models/model/vehicle/tram/usa/skoda_10t.mdl"] = true, ["res/models/model/vehicle/tram/asia/lvs_86.mdl"] = true, ["res/models/model/vehicle/tram/asia/vityaz_m.mdl"] = true, ["res/models/model/vehicle/truck/asia/isuzu_elf_tld20_universal.mdl"] = true, ["res/models/model/vehicle/truck/asia/isuzu_elf_tld20_tanker.mdl"] = true, ["res/models/model/vehicle/truck/asia/faw_jiefang_j6p_universal.mdl"] = true, ["res/models/model/vehicle/truck/asia/faw_jiefang_j6p_tanker.mdl"] = true, ["res/models/model/vehicle/truck/asia/faw_jiefang_j6p_stake.mdl"] = true, ["res/models/model/vehicle/truck/asia/faw_jiefang_j6p_tipper.mdl"] = true, } if extraVehicles[fileName] ~= nil then return extraVehicles[fileName] end if baseOrMod(fileName, data) then return true end return false end) addFileFilter("model/car", function (fileName, data) local extraVehicles = { ["res/models/model/vehicle/car/ford_model_t.mdl"] = true, ["res/models/model/vehicle/car/citroen_hp5_typ_c.mdl"] = true, ["res/models/model/vehicle/car/ford_fordor_1934.mdl"] = true, ["res/models/model/vehicle/car/avant.mdl"] = true, ["res/models/model/vehicle/car/beetle_1948.mdl"] = true, ["res/models/model/vehicle/car/vw_type_2_t1.mdl"] = true, ["res/models/model/vehicle/car/trabant.mdl"] = true, ["res/models/model/vehicle/car/renault_4_f4_fourgonnette.mdl"] = true, ["res/models/model/vehicle/car/nissan_datsun_240z.mdl"] = true, ["res/models/model/vehicle/car/vw_golf_1.mdl"] = true, ["res/models/model/vehicle/car/corolla.mdl"] = true, ["res/models/model/vehicle/car/opel_kadett_e_carevan.mdl"] = true, ["res/models/model/vehicle/car/opel_limo.mdl"] = true, ["res/models/model/vehicle/car/subaru_legacy_kombi.mdl"] = true, ["res/models/model/vehicle/car/vw_touran.mdl"] = true, ["res/models/model/vehicle/car/toyota_mirai.mdl"] = true, ["res/models/model/vehicle/car/coach_01.mdl"] = true, ["res/models/model/vehicle/car/coach_02.mdl"] = true, ["res/models/model/vehicle/car/coach_03.mdl"] = true, ["res/models/model/vehicle/car/coach_04.mdl"] = true, ["res/models/model/vehicle/car/coach_05.mdl"] = true, ["res/models/model/vehicle/car/coach_06.mdl"] = true, } if extraVehicles[fileName] ~= nil then return extraVehicles[fileName] end if ffu.package.mod(fileName, data) then return true end return false end) addFileFilter("multipleUnit", baseOrMod) elseif settings.vehicles == "usa" then addFileFilter("model/vehicle", function (fileName, data) local extraVehicles = { ["res/models/model/vehicle/bus/asia/maz_103.mdl"] = true, ["res/models/model/vehicle/bus/man_sl_192.mdl"] = true, ["res/models/model/vehicle/bus/volvo_5000.mdl"] = true, ["res/models/model/vehicle/tram/usa/skoda_10t.mdl"] = true, ["res/models/model/vehicle/tram/be5_6.mdl"] = true, ["res/models/model/vehicle/truck/asia/amo_f15_universal.mdl"] = true, ["res/models/model/vehicle/truck/asia/amo_f15_tanker.mdl"] = true, ["res/models/model/vehicle/truck/asia/isuzu_elf_tld20_universal.mdl"] = true, ["res/models/model/vehicle/truck/asia/isuzu_elf_tld20_tanker.mdl"] = true, ["res/models/model/vehicle/truck/asia/gaz_3307_universal.mdl"] = true, ["res/models/model/vehicle/truck/asia/gaz_3307_tanker.mdl"] = true, ["res/models/model/vehicle/truck/asia/gaz_3307_tipper.mdl"] = true, ["res/models/model/vehicle/truck/asia/faw_jiefang_j6p_universal.mdl"] = true, ["res/models/model/vehicle/truck/asia/faw_jiefang_j6p_tanker.mdl"] = true, ["res/models/model/vehicle/truck/asia/faw_jiefang_j6p_stake.mdl"] = true, ["res/models/model/vehicle/truck/asia/faw_jiefang_j6p_tipper.mdl"] = true, ["res/models/model/vehicle/truck/benz1912_lkw.mdl"] = true, ["res/models/model/vehicle/truck/benz1912_lkw_stake.mdl"] = true, ["res/models/model/vehicle/truck/opel_blitz_1930.mdl"] = true, ["res/models/model/vehicle/truck/opel_blitz_tanker.mdl"] = true, ["res/models/model/vehicle/truck/opel_blitz_tipper.mdl"] = true, ["res/models/model/vehicle/truck/man_19_304_1970.mdl"] = true, ["res/models/model/vehicle/truck/man_19_304_tanker.mdl"] = true, ["res/models/model/vehicle/truck/man_19_304_tipper.mdl"] = true, ["res/models/model/vehicle/bus/ecitaro.mdl"] = true, ["res/models/model/vehicle/truck/urban_etruck.mdl"] = true, ["res/models/model/vehicle/tram/caf_urbos3.mdl"] = true, ["res/models/model/vehicle/waggon/tankcar_2000.mdl"] = true, ["res/models/model/vehicle/waggon/stake_car_2000.mdl"] = true, ["res/models/model/vehicle/waggon/gondola_2000.mdl"] = true, ["res/models/model/vehicle/waggon/boxcar_2000.mdl"] = true, } if extraVehicles[fileName] ~= nil then return extraVehicles[fileName] end if usaOrMod(fileName, data) then return true end if string.starts(fileName, "res/models/model/vehicle/plane/") then return true end if string.starts(fileName, "res/models/model/vehicle/ship/") then return true end return false end) addFileFilter("model/car", function (fileName, data) local extraVehicles = { ["res/models/model/vehicle/car/ford_model_t.mdl"] = true, ["res/models/model/vehicle/car/citroen_hp5_typ_c.mdl"] = true, ["res/models/model/vehicle/car/ford_fordor_1934.mdl"] = true, ["res/models/model/vehicle/car/chevrolet_master_deluxe.mdl"] = true, ["res/models/model/vehicle/car/ford_f_series.mdl"] = true, ["res/models/model/vehicle/car/vw_type_2_t1.mdl"] = true, ["res/models/model/vehicle/car/cadillac_s62_deville.mdl"] = true, ["res/models/model/vehicle/car/renault_4_f4_fourgonnette.mdl"] = true, ["res/models/model/vehicle/car/vw_golf_1.mdl"] = true, ["res/models/model/vehicle/car/pickup_1978.mdl"] = true, ["res/models/model/vehicle/car/corolla.mdl"] = true, ["res/models/model/vehicle/car/lincoln_town_car.mdl"] = true, ["res/models/model/vehicle/car/subaru_legacy_kombi.mdl"] = true, ["res/models/model/vehicle/car/vw_touran.mdl"] = true, ["res/models/model/vehicle/car/toyota_mirai.mdl"] = true, ["res/models/model/vehicle/car/coach_01.mdl"] = true, ["res/models/model/vehicle/car/coach_02.mdl"] = true, ["res/models/model/vehicle/car/coach_03.mdl"] = true, ["res/models/model/vehicle/car/coach_04.mdl"] = true, ["res/models/model/vehicle/car/coach_05.mdl"] = true, ["res/models/model/vehicle/car/coach_06.mdl"] = true, } if extraVehicles[fileName] ~= nil then return extraVehicles[fileName] end if ffu.package.mod(fileName, data) then return true end return false end) addFileFilter("multipleUnit", usaOrMod) elseif settings.vehicles == "asia" then addFileFilter("model/vehicle", function (fileName, data) local extraVehicles = { ["res/models/model/vehicle/bus/man_sl_192.mdl"] = true, ["res/models/model/vehicle/bus/volvo_5000.mdl"] = true, ["res/models/model/vehicle/tram/usa/skoda_10t.mdl"] = true, ["res/models/model/vehicle/tram/be5_6.mdl"] = true, ["res/models/model/vehicle/truck/benz1912_lkw.mdl"] = true, ["res/models/model/vehicle/truck/benz1912_lkw_stake.mdl"] = true, ["res/models/model/vehicle/truck/opel_blitz_1930.mdl"] = true, ["res/models/model/vehicle/truck/opel_blitz_tanker.mdl"] = true, ["res/models/model/vehicle/truck/opel_blitz_tipper.mdl"] = true, ["res/models/model/vehicle/truck/man_19_304_1970.mdl"] = true, ["res/models/model/vehicle/truck/man_19_304_tanker.mdl"] = true, ["res/models/model/vehicle/truck/man_19_304_tipper.mdl"] = true, ["res/models/model/vehicle/truck/40_tons.mdl"] = true, ["res/models/model/vehicle/truck/40_tons_stake.mdl"] = true, ["res/models/model/vehicle/truck/40_tons_tanker.mdl"] = true, ["res/models/model/vehicle/bus/ecitaro.mdl"] = true, ["res/models/model/vehicle/truck/urban_etruck.mdl"] = true, ["res/models/model/vehicle/tram/caf_urbos3.mdl"] = true, ["res/models/model/vehicle/waggon/tankcar_2000.mdl"] = true, ["res/models/model/vehicle/waggon/stake_car_2000.mdl"] = true, ["res/models/model/vehicle/waggon/gondola_2000.mdl"] = true, ["res/models/model/vehicle/waggon/boxcar_2000.mdl"] = true, } if extraVehicles[fileName] ~= nil then return extraVehicles[fileName] end if asiaOrMod(fileName, data) then return true end if string.starts(fileName, "res/models/model/vehicle/plane/") then return true end if string.starts(fileName, "res/models/model/vehicle/ship/") then return true end return false end) addFileFilter("model/car", function (fileName, data) local extraVehicles = { ["res/models/model/vehicle/car/ford_model_t.mdl"] = true, ["res/models/model/vehicle/car/citroen_hp5_typ_c.mdl"] = true, ["res/models/model/vehicle/car/ford_fordor_1934.mdl"] = true, ["res/models/model/vehicle/car/vw_type_2_t1.mdl"] = true, ["res/models/model/vehicle/car/renault_4_f4_fourgonnette.mdl"] = true, ["res/models/model/vehicle/car/vw_golf_1.mdl"] = true, ["res/models/model/vehicle/car/corolla.mdl"] = true, ["res/models/model/vehicle/car/subaru_legacy_kombi.mdl"] = true, ["res/models/model/vehicle/car/vw_touran.mdl"] = true, ["res/models/model/vehicle/car/toyota_mirai.mdl"] = true, ["res/models/model/vehicle/car/kim_10_50.mdl"] = true, ["res/models/model/vehicle/car/tatra_600.mdl"] = true, ["res/models/model/vehicle/car/gaz_22_wolga.mdl"] = true, ["res/models/model/vehicle/car/lada_riva_2107.mdl"] = true, ["res/models/model/vehicle/car/vw_santana.mdl"] = true, ["res/models/model/vehicle/car/haval_h6.mdl"] = true, ["res/models/model/vehicle/car/coach_01.mdl"] = true, ["res/models/model/vehicle/car/coach_02.mdl"] = true, ["res/models/model/vehicle/car/coach_03.mdl"] = true, ["res/models/model/vehicle/car/coach_04.mdl"] = true, ["res/models/model/vehicle/car/coach_05.mdl"] = true, ["res/models/model/vehicle/car/coach_06.mdl"] = true, } if extraVehicles[fileName] ~= nil then return extraVehicles[fileName] end if ffu.package.mod(fileName, data) then return true end return false end) addFileFilter("multipleUnit", asiaOrMod) end local filterAndKeepShared = function (fileName, data) if string.find(fileName, "/shared/") then return true end if settings.climate == "dry" and usaOrMod(fileName, data) then return true elseif settings.climate == "tropical" and tropicalOrMod(fileName, data) then return true elseif settings.climate ~= "dry" and settings.climate ~= "tropical" and baseOrMod(fileName, data) then return true end return false end addFileFilter("terrainMaterial", filterAndKeepShared) addFileFilter("grass", filterAndKeepShared) if settings.climate == "dry" then addFileFilter("autoGroundTex", function (fileName, data) return usaOrMod(fileName, data) end) elseif settings.climate == "tropical" then addFileFilter("autoGroundTex", function (fileName, data) return tropicalOrMod(fileName, data) end) else addFileFilter("autoGroundTex", function (fileName, data) return baseOrMod(fileName, data) end) end local cfg = game.config.nameList cfg.folder = settings.nameList local function reorderAsset(keyword, offset) return function(fileName, data) if not data.metadata.categoryList then return true end local cat = data.metadata.categoryList.categories if cat then for k, v in pairs(cat) do if v == keyword then data.metadata.order.value = data.metadata.order.value + offset end end end return true end end local defaultPreprocessFn = function(modules, change) if change.added then modules[change.slotId] = change.module else modules[change.slotId] = nil end return modules end addModifier("loadConstruction", function(fileName, data) if data.preProcessFn == nil then data.preProcessFn = defaultPreprocessFn end return data end) if settings.climate == "temperate" then addFileFilter("model/tree", baseOrMod) addFileFilter("model/rock", reorderAsset("temperate.clima.lua", -100)) addFileFilter("construction", function (fileName, data) if fileName == "res/construction/asset/default_brush_tree_palms.con" then return false end if fileName == "res/construction/asset/default_brush_tree_cacti.con" then return false end if string.find(fileName, "construction/asset/tropical/") or string.find(fileName, "construction/asset/desert/") then return false end return true end) elseif settings.climate == "dry" then addFileFilter("model/tree", usaOrMod) addFileFilter("model/rock", reorderAsset("dry.clima.lua", -100)) addFileFilter("construction", function (fileName, data) if fileName == "res/construction/asset/default_brush_tree_palms.con" then return false end if string.find(fileName, "construction/asset/tropical/") or string.find(fileName, "construction/asset/temperate/") then return false end return true end) elseif settings.climate == "tropical" then addFileFilter("model/tree", tropicalOrMod) addFileFilter("model/rock", reorderAsset("tropical.clima.lua", -100)) addFileFilter("construction", function (fileName, data) if fileName == "res/construction/asset/default_brush_tree_cacti.con" then return false end if string.find(fileName, "construction/asset/desert/") or string.find(fileName, "construction/asset/temperate/") then return false end return true end) end if settings.vehicles == "usa" then addFileFilter("trafficLight", usaOrMod) else addFileFilter("trafficLight", baseOrMod) end if settings.environment == "dry" then addFileFilter("railroadCrossing", function (fileName, data) if fileName == "res/config/railroad_crossing/era_a_us_crossing.lua" or fileName == "res/config/railroad_crossing/era_b_us_crossing.lua" or fileName == "res/config/railroad_crossing/era_c_us_crossing.lua" then return true end if ffu.package.mod(fileName, data) then return true end return false end) elseif settings.environment == "tropical" then addFileFilter("railroadCrossing", function (fileName, data) if fileName == "res/config/railroad_crossing/era_a_ru_crossing.lua" or fileName == "res/config/railroad_crossing/era_b_ru_crossing.lua" or fileName == "res/config/railroad_crossing/era_c_ru_crossing.lua" then return true end if ffu.package.mod(fileName, data) then return true end return false end) else addFileFilter("railroadCrossing", function (fileName, data) if fileName == "res/config/railroad_crossing/era_a_eu_crossing.lua" or fileName == "res/config/railroad_crossing/era_b_eu_crossing.lua" or fileName == "res/config/railroad_crossing/era_c_eu_crossing.lua" then return true end if ffu.package.mod(fileName, data) then return true end return false end) end if settings.difficulty == "medium" then game.config.difficulty = "MEDIUM" elseif settings.difficulty == "hard" then game.config.difficulty = "HARD" end if settings.environment == "dry" then game.config.environment = "desert.lua" elseif settings.environment == "tropical" then game.config.environment = "tropical.lua" end addModifier("loadModel", metadatautil.addEmissionMetadata) addModifier("loadModel", function(fileName, data) local tv = data.metadata.transportVehicle if tv then if tv.seats and not data.metadata.seatProvider then local sp = { } sp.seats = tv.seats if tv.carrier == "AIR" then sp.drivingLicense = "AIR" end if tv.carrier == "RAIL" then sp.drivingLicense = "RAIL" end if tv.carrier == "ROAD" then sp.drivingLicense = "BUS" end if tv.carrier == "TRAM" then sp.drivingLicense = "TRAM" end if tv.carrier == "WATER" then sp.drivingLicense = "WATER" end sp.crewModels = tv.crewModels data.metadata.seatProvider = sp for k,v in pairs(data.metadata.seatProvider.seats) do if v.animation == nil then v.animation = v.standing and "idle" or "sitting" end end end end return data end) addModifier("loadModel", function(fileName, data) if data.collider and data.collider.params and data.collider.params.center then local c = data.collider.params.center data.collider.transf = { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, c[1], c[2], c[3], 1 } end return data end) addModifier("loadGroundTex", function(fileName, data) local tropicalMap = { ["dirt.lua"] = "tropical/dirt.lua", ["rock.lua"] = "tropical/rock.lua", ["scree.lua"] = "tropical/scree.lua", ["grass_light_green.lua"] = "tropical/grass_light_green.lua", ["grass_brown.lua"] = "tropical/grass_brown.lua", ["grass_green.lua"] = "tropical/grass_green.lua", ["grass_gravel.lua"] = "tropical/grass_gravel.lua", ["gravel_01.lua"] = "tropical/gravel_01.lua", } local usaMap = { ["dirt.lua"] = "usa/dirt.lua", ["rock.lua"] = "usa/rock.lua", ["scree.lua"] = "usa/scree.lua", ["tropical/scree.lua"] = "usa/scree.lua", ["grass_light_green.lua"] = "shared/grass_cutted_01.lua", ["grass_brown.lua"] = "usa/soil_sand_03.lua", ["grass_green.lua"] = "usa/sand_red_01.lua", ["grass_gravel.lua"] = "usa/grass_gravel.lua", ["gravel_01.lua"] = "usa/gravel_01.lua", } local map = { } local replaceMateirals = function(mimap) if settings.climate == "dry" then for k, v in pairs(mimap) do if usaMap[v] ~= nil then mimap[k] = usaMap[v] end if map[v] ~= nil then mimap[k] = map[v] end end elseif settings.climate == "tropical" then for k, v in pairs(mimap) do if tropicalMap[v] ~= nil then mimap[k] = tropicalMap[v] end if map[v] ~= nil then mimap[k] = map[v] end end end end if data.indexMap ~= nil then replaceMateirals(data.indexMap) else replaceMateirals(data.materialIndexMap) end return data end) addModifier("loadStreet", function(fileName, data) local numLanes = data.numLanes if numLanes and not data.laneConfig then local numLanesPlusSidewalks = numLanes + 2 local laneConfig = {} for i=1,numLanesPlusSidewalks do laneConfig[i] = { forward = i > numLanesPlusSidewalks / 2 } end data.laneConfig = laneConfig end return data end) end, postRunFn = function(settings, params) local tracks = api.res.trackTypeRep.getAll() for __, trackName in pairs(tracks) do local mod = api.type.ModuleDesc.new() local track = api.res.trackTypeRep.get(api.res.trackTypeRep.find(trackName)) if trackName ~= "standard.lua" and trackName ~= "high_speed.lua" then for __, catenary in pairs({false, true}) do mod.fileName = "trainstation_" .. tostring(trackName) .. (catenary and "catenary" or "") mod.availability.yearFrom = track.yearFrom mod.availability.yearTo = track.yearTo mod.cost.price = math.round(track.cost / 75 * 18000) mod.description.name = track.name .. (catenary and _(" with catenary") or "") mod.description.description = track.desc .. (catenary and _(" (with catenary)") or "") mod.description.icon = track.icon if mod.description.icon ~= "" then -- mod.description.icon = string.gsub(mod.description.icon, ".tga", "") -- mod.description.icon = mod.description.icon .. "_module" .. (catenary and "_catenary" or "") .. ".tga" end mod.type = "track" mod.order.value = 0 + 10 * (catenary and 1 or 0) mod.metadata = { track = true, } mod.category.categories = { "tracks", } mod.updateScript.fileName = "construction/station/rail/modular_station/trackmodule.updateFn" mod.updateScript.params = { trackType = trackName, catenary = catenary } mod.getModelsScript.fileName = "construction/station/rail/modular_station/trackmodule.getModelsFn" mod.getModelsScript.params = { trackType = trackName, catenary = catenary } api.res.moduleRep.add(mod.fileName, mod, true) end end end end } end