@@ -72,9 +72,9 @@ function get_modlist_fields(kind, viewscreen)
7272 end
7373end
7474
75- --- @return boolean # true if the mod entry was moved ; false if the mod or mod version was not found.
75+ --- @return boolean # true if the mod entry was copied over ; false if the mod or mod version was not found.
7676--- @return string | nil # loaded version - DISPLAYED_VERSION from the mod's info.txt
77- local function move_mod_entry (viewscreen , to , from , mod_id , mod_version )
77+ local function copy_mod_entry (viewscreen , to , from , mod_id , mod_version )
7878 local to_fields = get_modlist_fields (to , viewscreen )
7979 local from_fields = get_modlist_fields (from , viewscreen )
8080
@@ -106,23 +106,49 @@ local function move_mod_entry(viewscreen, to, from, mod_id, mod_version)
106106 end
107107 end
108108
109- for _ , v in pairs (from_fields ) do
110- v :erase (mod_index )
111- end
112-
113109 return true , loaded_version
114110end
115111
116- --- @return boolean # true if the mod entry was moved ; false if the mod or mod version was not found.
112+ --- @return boolean # true if the mod entry was copied over ; false if the mod or mod version was not found.
117113--- @return string | nil # loaded version - DISPLAYED_VERSION from the mod's info.txt
118114local function enable_mod (viewscreen , mod_id , mod_version )
119- return move_mod_entry (viewscreen , " object_load_order" , " available " , mod_id , mod_version )
115+ return copy_mod_entry (viewscreen , " object_load_order" , " base_available " , mod_id , mod_version )
120116end
121117
122- --- @return boolean # true if the mod entry was moved ; false if the mod or mod version was not found.
118+ --- @return boolean # true if the mod entry was copied over ; false if the mod or mod version was not found.
123119--- @return string | nil # loaded version - DISPLAYED_VERSION from the mod's info.txt
124- local function disable_mod (viewscreen , mod_id , mod_version )
125- return move_mod_entry (viewscreen , " available" , " object_load_order" , mod_id , mod_version )
120+ local function make_available_mod (viewscreen , mod_id , mod_version )
121+ return copy_mod_entry (viewscreen , " available" , " base_available" , mod_id , mod_version )
122+ end
123+
124+ local function clear_mods (viewscreen )
125+ local active_modlist = get_modlist_fields (' object_load_order' , viewscreen )
126+ local avail_modlist = get_modlist_fields (' available' , viewscreen )
127+ for _ , modlist in ipairs ({active_modlist , avail_modlist }) do
128+ for _ , v in pairs (modlist ) do
129+ for i = # v - 1 , 0 , - 1 do
130+ v :erase (i )
131+ end
132+ end
133+ end
134+ end
135+
136+ local function set_available_mods (viewscreen , loaded )
137+ local base_avail = get_modlist_fields (' base_available' , viewscreen )
138+ local unused = {}
139+ for i , id in ipairs (base_avail .id ) do
140+ if not loaded [id .value ] then
141+ local version = base_avail .numeric_version [i ]
142+ table.insert (unused , { id = id .value , version = version })
143+ end
144+ end
145+
146+ for _ , v in ipairs (unused ) do
147+ local success , _ = make_available_mod (viewscreen , v .id , v .version )
148+ if not success then
149+ dfhack .printerr (' failed to show ' .. v .id .. ' in available list' )
150+ end
151+ end
126152end
127153
128154local function get_active_modlist (viewscreen )
@@ -138,21 +164,24 @@ end
138164--- @return string[]
139165--- @return { id : string , new : string } []
140166local function swap_modlist (viewscreen , modlist )
141- local current = get_active_modlist (viewscreen )
142- for _ , v in ipairs (current ) do
143- disable_mod (viewscreen , v .id , v .version )
144- end
167+ clear_mods (viewscreen )
145168
146169 local failures = {}
147170 local changed = {}
171+ local loaded = {}
148172 for _ , v in ipairs (modlist ) do
149173 local success , version = enable_mod (viewscreen , v .id , v .version )
150174 if not success then
151175 table.insert (failures , v .id )
152- elseif version then
153- table.insert (changed , { id = v .id , new = version })
176+ else
177+ if version then
178+ table.insert (changed , { id = v .id , new = version })
179+ end
180+ loaded [v .id ] = true
154181 end
155182 end
183+
184+ set_available_mods (viewscreen , loaded )
156185 return failures , changed
157186end
158187
0 commit comments