|
31 | 31 | /datum/file_storage/disk/removable, |
32 | 32 | /datum/file_storage/network |
33 | 33 | ) |
34 | | - var/datum/file_storage/current_filesource = /datum/file_storage/disk |
| 34 | + var/datum/file_storage/current_filesource |
35 | 35 |
|
36 | 36 | var/selected_fab_type = FABRICATOR_CLASS_PROTOLATHE |
37 | 37 | var/search_string |
38 | 38 | var/current_page = 1 |
39 | 39 |
|
| 40 | + var/list/cached_recipe_data = list() |
| 41 | + |
40 | 42 | /datum/computer_file/program/design_writer/on_startup(var/mob/living/user, var/datum/extension/interactive/os/new_host) |
41 | | - ..() |
| 43 | + . = ..() |
42 | 44 | for(var/T in file_sources) |
43 | 45 | file_sources[T] = new T(new_host) |
44 | | - current_filesource = file_sources[initial(current_filesource)] |
| 46 | + |
| 47 | + var/datum/computer_network/network = new_host.get_network() |
| 48 | + if(network) |
| 49 | + // Autoselect a research server if available. |
| 50 | + var/list/accesses = new_host.get_access(user) |
| 51 | + var/list/file_servers = network.get_file_server_tags(MF_ROLE_DESIGN, accesses) |
| 52 | + if(file_servers.len) |
| 53 | + var/datum/file_storage/network/net_fs = file_sources[/datum/file_storage/network] |
| 54 | + net_fs.server = file_servers[1] |
| 55 | + current_filesource = net_fs |
| 56 | + |
| 57 | + if(!current_filesource) |
| 58 | + current_filesource = file_sources[/datum/file_storage/disk] |
| 59 | + |
| 60 | + cache_recipes() |
45 | 61 |
|
46 | 62 | /datum/computer_file/program/design_writer/on_shutdown() |
47 | 63 | for(var/T in file_sources) |
48 | 64 | var/datum/file_storage/FS = file_sources[T] |
49 | 65 | qdel(FS) |
50 | 66 | file_sources[T] = null |
51 | | - current_filesource = initial(current_filesource) |
| 67 | + current_filesource = null |
52 | 68 | ui_header = null |
53 | 69 |
|
54 | 70 | current_design = null |
|
57 | 73 |
|
58 | 74 | current_page = 1 |
59 | 75 | search_string = null |
| 76 | + cached_recipe_data.Cut() |
60 | 77 |
|
61 | 78 | prog_mode = MODE_LISTING |
62 | 79 | error = null |
|
81 | 98 | if(prog_mode == MODE_LISTING) |
82 | 99 | if(href_list["PRG_select_fab_type"]) |
83 | 100 | var/choice = input(user, "Select the fabricator category you would like to view.") as null|anything in SSfabrication.research_recipes |
84 | | - if(choice && CanInteract(usr,state)) |
| 101 | + if(choice && (choice != selected_fab_type) && CanInteract(usr,state)) |
85 | 102 | selected_fab_type = choice |
86 | 103 | current_page = 1 |
| 104 | + cache_recipes() |
87 | 105 | return TOPIC_REFRESH |
88 | 106 |
|
89 | 107 | if(href_list["PRG_search"]) |
90 | 108 | var/new_search_string = sanitize(input(user, "Enter a new search string.", "Research search") as text|null) |
91 | | - if(CanInteract(user, state)) |
| 109 | + if(CanInteract(user, state) && (new_search_string != search_string)) |
92 | 110 | search_string = new_search_string |
93 | 111 | current_page = 1 |
| 112 | + cache_recipes() |
94 | 113 | return TOPIC_REFRESH |
95 | 114 | return TOPIC_HANDLED |
96 | 115 |
|
|
142 | 161 | if(!network) |
143 | 162 | return TOPIC_REFRESH |
144 | 163 | // Helper for some user-friendliness. Try to select the first available mainframe. |
145 | | - var/list/file_servers = network.get_file_server_tags() |
| 164 | + var/list/file_servers = network.get_file_server_tags(MF_ROLE_DESIGN, computer.get_access(user)) |
146 | 165 | if(!file_servers.len) |
147 | 166 | return TOPIC_REFRESH |
148 | 167 | var/datum/file_storage/network/N = current_filesource |
|
154 | 173 | var/datum/computer_network/network = computer.get_network() |
155 | 174 | if(!network) |
156 | 175 | return |
157 | | - var/list/file_servers = network.get_file_server_tags(user) |
| 176 | + var/list/file_servers = network.get_file_server_tags(MF_ROLE_DESIGN, computer.get_access(user)) |
158 | 177 | var/file_server = input(usr, "Choose a fileserver to view files on:", "Select File Server") as null|anything in file_servers |
159 | 178 | if(file_server) |
160 | 179 | var/datum/file_storage/network/N = file_sources[/datum/file_storage/network] |
|
236 | 255 | var/feedback = current_design.select_theory(selected, analyzed, user) |
237 | 256 | if(feedback) |
238 | 257 | to_chat(user, SPAN_WARNING(feedback)) |
| 258 | + if(current_design.progressing) |
| 259 | + // Little bit of feedback that they've progressed the design |
| 260 | + sound_to(user, 'sound/effects/bells.ogg') |
239 | 261 | return TOPIC_REFRESH |
240 | 262 |
|
241 | 263 | if(href_list["PRG_discard_theory"]) |
|
250 | 272 | current_design.use_free_point(href_list["PRG_add_point"]) |
251 | 273 | return TOPIC_REFRESH |
252 | 274 |
|
| 275 | +/datum/computer_file/program/design_writer/proc/cache_recipes() |
| 276 | + cached_recipe_data.Cut() |
| 277 | + if(!selected_fab_type) |
| 278 | + return |
| 279 | + var/list/recipe_list = SSfabrication.research_recipes[selected_fab_type] |
| 280 | + if(islist(recipe_list)) |
| 281 | + for(var/datum/fabricator_recipe/recipe in recipe_list) |
| 282 | + var/recipe_name = recipe.get_product_name() |
| 283 | + if(search_string && !findtextEx_char(lowertext(recipe_name), lowertext(search_string))) |
| 284 | + continue |
| 285 | + |
| 286 | + var/list/recipe_data = list( |
| 287 | + "name" = recipe_name, |
| 288 | + "ref" = "\ref[recipe]" |
| 289 | + ) |
| 290 | + |
| 291 | + cached_recipe_data += list(recipe_data) |
| 292 | + |
253 | 293 | /datum/computer_file/program/design_writer/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = global.default_topic_state) |
254 | 294 | . = ..() |
255 | 295 | if(!.) |
|
267 | 307 | data["search_string"] = search_string || "No search filter set." |
268 | 308 | data["recipe_listing"] = list() |
269 | 309 |
|
270 | | - var/list/recipe_list = SSfabrication.research_recipes[selected_fab_type] |
271 | | - if(islist(recipe_list)) |
272 | | - var/max_pages = CEILING(length(recipe_list)/RECIPES_PER_PAGE) |
| 310 | + if(length(cached_recipe_data)) |
| 311 | + |
| 312 | + var/total_recipes = length(cached_recipe_data) |
| 313 | + |
| 314 | + var/max_pages = CEILING(total_recipes/RECIPES_PER_PAGE) |
273 | 315 | current_page = clamp(current_page, 1, max_pages) |
274 | | - data["current_page"] = current_page |
275 | | - |
276 | | - var/curr_index = (current_page - 1)*RECIPES_PER_PAGE + 1 |
277 | | - recipe_list = recipe_list.Copy(curr_index) |
278 | | - |
279 | | - var/recipe_no = 0 |
280 | | - while(recipe_no <= RECIPES_PER_PAGE && (curr_index <= length(recipe_list))) |
281 | | - var/datum/fabricator_recipe/recipe = recipe_list[curr_index] |
282 | | - var/recipe_name = recipe.get_product_name() |
283 | | - curr_index += 1 |
284 | | - if(search_string && !findtextEx_char(lowertext(recipe_name), lowertext(search_string))) |
285 | | - continue |
286 | | - var/list/recipe_data = list( |
287 | | - "name" = recipe_name, |
288 | | - "ref" = "\ref[recipe]" |
289 | | - ) |
290 | | - data["recipe_listing"] += list(recipe_data) |
291 | | - recipe_no += 1 |
292 | | - |
293 | | - if(curr_index > length(recipe_list)) |
294 | | - data["max_page"] = TRUE |
| 316 | + var/start_index = (current_page - 1)*RECIPES_PER_PAGE + 1 |
| 317 | + |
| 318 | + data["recipe_listing"] = cached_recipe_data.Copy(start_index, min(total_recipes, start_index + RECIPES_PER_PAGE)) |
295 | 319 |
|
| 320 | + if(current_page == max_pages) |
| 321 | + data["max_page"] = TRUE |
| 322 | + |
| 323 | + data["current_page"] = current_page |
| 324 | + |
296 | 325 | else if(prog_mode == MODE_RECIPE) |
297 | 326 | if(current_recipe) |
298 | 327 | data["current_recipe"] = current_recipe.get_product_name() |
|
0 commit comments