# MFF-Berater: Fix zur Berechnung rekursiv benötigter Baumerei

a guest
Jun 13th, 2014
106
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
1. // Replaces the existing calcTotalrecursive-Method
2. function calcTotalRecursive() {
3.     try {
4.         if (DEVMODE_FUNCTION) {
5.             var trackingHandle = tracking.start("berater", "calcTotalRecursive", [recursionCount]);
6.         }
7.         totalRecursive = new Array(new Object(), new Object(), new Object(), new Object());
8.         // Type is set to '1', so only forestry products are inspected
9.         var type = 1;
10.         // Iterate over all products starting with those which are no pre-product. It is important that an inspected product won't be needed by a non-yet-inspected product!
11.         for (var i = prodNameSort[type].length - 1; i >= 0; i--) {
12.             // Id of currently inspected product
13.             var id = prodNameSort[type][i];
14.             // If this product is directly or recursivly needed...
15.             if (prodMinRack[type][id] > 0 || totalRecursive[type][id] > 0) {
16.                 // If this product requires other products... (e.g. tree logs DON'T!)
17.                 if (prodRequire[type][id]) {
18.                     // Iterate over pre-products
19.                     for (var j = 0; j < prodRequire[type][id].length; j++) {
20.                         // Cache the currently inspected pre-product
21.                         var req = prodRequire[type][id][j];
22.                         if (!totalRecursive[req[0]][req[1]]) {
23.                             // Initialize result storage of pre-product, if necessary
24.                             totalRecursive[req[0]][req[1]] = 0;
25.                         }
26.                         /**
27.                     Some magic is done here:
28.                     - At first, we add the directly and recursivly needed products. If the latter not initialized, we assume 0.
29.                     - Second, we divide the sum by the amount yielded product per production cycle, e.g. a 'Waschzuber' is 1 and 'Bretter (Gemeine Fichte)' is 5.
30.                     - Third, we (should) multiply the result by the amount of products needed to initiate the production process.
31.                     - Fourth, we round up to the next integer, because we can't spend fractions of pre-products.
32.                     - At last, we sometimes don't want to round to the next integer, but to the next number e.g. dividable by 5. For instance, the
33.                         production process of 30 'Bonbons' needs 5 'Honig' to start. The formula therefore would be: Math.ceil(x / 5) * 5, where
34.                         x is our result of third. As the mathematicians might have recognized, we can reduce req[2] (amount of products needed to
35.                         initiate the production process).
36.                     */
37.                         totalRecursive[req[0]][req[1]] += Math.ceil((prodMinRack[type][id] + (totalRecursive[type][id] ? totalRecursive[type][id] : 0)) / prodYield[type][id]) * req[2]; // Anzahl rekursiv benötigte Stämme = (direkt + rekursiv benötigte Bretter) / Bretter je Stamm
38.                     }
39.                 }
40.             }
41.         }
42.         if (DEVMODE_FUNCTION) {
43.             tracking.end("berater", trackingHandle);
44.         }
45.     } catch (err) {
46.         GM_logError("calcTotalRecursive\ntype=" + type + " iProd=" + iProd + " help=" + implode(help) + " i=" + i + "\n" + err);
47.     }
48. }
49.
50. // German menu-item translation in function startScript()
51. texte["de"]["settings_valMinRackRecursive"] = ["Rekursive Produkte", "Berechne die rekursiv benötigten Produkte (in der Baumerei) und addiere sie zur Liste der (direkt) benötigten Produkte hinzu."];