@@ -72,9 +72,9 @@ function get_modlist_fields(kind, viewscreen)
72
72
end
73
73
end
74
74
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.
76
76
--- @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 )
78
78
local to_fields = get_modlist_fields (to , viewscreen )
79
79
local from_fields = get_modlist_fields (from , viewscreen )
80
80
@@ -106,23 +106,49 @@ local function move_mod_entry(viewscreen, to, from, mod_id, mod_version)
106
106
end
107
107
end
108
108
109
- for _ , v in pairs (from_fields ) do
110
- v :erase (mod_index )
111
- end
112
-
113
109
return true , loaded_version
114
110
end
115
111
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.
117
113
--- @return string | nil # loaded version - DISPLAYED_VERSION from the mod's info.txt
118
114
local 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 )
120
116
end
121
117
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.
123
119
--- @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
126
152
end
127
153
128
154
local function get_active_modlist (viewscreen )
@@ -138,21 +164,24 @@ end
138
164
--- @return string[]
139
165
--- @return { id : string , new : string } []
140
166
local 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 )
145
168
146
169
local failures = {}
147
170
local changed = {}
171
+ local loaded = {}
148
172
for _ , v in ipairs (modlist ) do
149
173
local success , version = enable_mod (viewscreen , v .id , v .version )
150
174
if not success then
151
175
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
154
181
end
155
182
end
183
+
184
+ set_available_mods (viewscreen , loaded )
156
185
return failures , changed
157
186
end
158
187
0 commit comments