SHOW:
|
|
- or go back to the newest paste.
1 | --config | |
2 | MinProcenttoBoost = 10 -- means min Tank amount vor max Inj Rate | |
3 | MinProcentforLowMode = 75 -- means min Energycelllevel for produce over mrfneed | |
4 | MRFBuffer = 0.1 -- for produce over mrfneed (for KRF = 0. ; MRF = 1) | |
5 | xRC = 1 -- Amount of the Rotary-Condenstrator(Leave it on 1, if u dont use D-T-Fuel) | |
6 | ||
7 | ---===================================--Fusion-Reaktor-Proramm--v0.9.4 by Dispelnator--============================================ | |
8 | ||
9 | --Ty for using my Mekanism-Fusion-Reactor-Programm, | |
10 | --Its my first Lua Program, so please tell me better Solutions of this Code. | |
11 | ||
12 | --I need help with a Function to calc the current Tritium Production | |
13 | --Means if tank on day < 50 then injection rate = tritium input then the tank goes over 75 % | |
14 | ||
15 | --You need minimum ProjectRed and Mekanism(+Tools,Generators)+ draconicevolution (for flux and fluid gates) for this Program | |
16 | ||
17 | --BundeledCable list: | |
18 | -- Red for Laser (fireup) | |
19 | -- Yellow for Alarm and Hohlraum-Insert | |
20 | -- Black 2 power laser via Tesseract/cubes... | |
21 | --The fuel usage is Injection-Rate/2 => For INJ-RATE = 98 you need 49 mb Tritium and 49 mb Deuterium (per tick) => ca. 9.8 MRF | |
22 | --For more Power u need Draconic Fluid-Gate and Rotary-Condenstrator*x and a Chemical Infuser (D-T-Fuel) | |
23 | --1 Rotary-Condenstrator = max 256mb/t means ca. + 25.6 MRF/t | |
24 | --Actually u can use Draconic-Energy-Core for Energy Storage but Induction-Matrix from Mekanism is better. | |
25 | --Actually u can use only Dynamic-Tanks but its the best one | |
26 | -- | |
27 | -- | |
28 | --Everything around the monitor I have taken from Krakaen's Big-Reactor-Program and | |
29 | --Thor_s_Crafter helped me with most buggs in the program | |
30 | --Some Videos about their Big-Reactor-Programs: | |
31 | --Krakaen : https://www.youtube.com/watch?v=SbbT7ncyS2M | |
32 | --Thor_s_Crafter: https://www.youtube.com/watch?v=XNlsU0tSHOc | |
33 | ||
34 | ---================================================ Edit at own Risk =============================================================== | |
35 | ||
36 | FirstProcent = 0 | |
37 | SecondProcent = 0 | |
38 | k = 0.09961964844 | |
39 | InjRate = 0 | |
40 | DTFuelInjRate = 0 | |
41 | FuelInjRate = 0 | |
42 | MRFProduce = 0 | |
43 | amountTanks = 0 | |
44 | MRFLaser = 0 | |
45 | MRFMaxLaser = 0 | |
46 | MRFNeed = 0 | |
47 | Charge = 0 | |
48 | InjRate2 = 2 | |
49 | w = 0 | |
50 | ||
51 | currentChargeLevel = 1 | |
52 | currentInjRate = 1 | |
53 | ||
54 | local TType = "" | |
55 | local EType = "" | |
56 | local ChargeStatus = "UNCHARGED" | |
57 | local ReactorStatus = "OFFLINE" | |
58 | ||
59 | local TankLevel = false | |
60 | local TankLevel1 = false | |
61 | local TankLevel2 = false | |
62 | local DraconicFluidGate = false | |
63 | local DraconicFluxGate = false | |
64 | local Auto = false | |
65 | local ChargeOn = false | |
66 | local FireUpOK = false | |
67 | local refresh = true | |
68 | ||
69 | local ChargeOnOffcolor = colors.green | |
70 | local FireUpcolor = colors.green | |
71 | local powerUpcolor = colors.green | |
72 | local ChargeTextcolor = colors.red | |
73 | local RectorTextcolor = colors.red | |
74 | ||
75 | rs.setBundledOutput("back", 0) | |
76 | ||
77 | -- tabels | |
78 | ||
79 | local Tanktypes = {"dynamic_tank"} | |
80 | local EnergyStoragetypesMekanism = {"Basic Energy Cube", "Advanced Energy Cube", "Elite Energy Cube", "Ultimate Energy Cube" } | |
81 | local EnergyStoragetypesMekanismIM = {"Induction Matrix"} | |
82 | local EnergyStoragetypesDraconic = {"draconic_rf_storage"} | |
83 | local Tanks = {} | |
84 | ||
85 | local button={} | |
86 | local filleds = {} | |
87 | local boxes = {} | |
88 | local lines = {} | |
89 | local texts = {} | |
90 | ||
91 | local FirstTankStats = {} | |
92 | local SecondTankStats = {} | |
93 | ||
94 | local GeneralBox = {} | |
95 | local ReactorBox = {} | |
96 | local TankBox = {} | |
97 | local GraphicBox = {} | |
98 | ||
99 | function initPeripherals() | |
100 | local peripheralList = peripheral.getNames() | |
101 | for i=1,#peripheralList do | |
102 | -- Reactor | |
103 | if peripheral.getType(peripheralList[i]) == "Reactor Logic Adapter" then | |
104 | FReactor = peripheral.wrap(peripheralList[i]) | |
105 | end | |
106 | -- Laser Amplifier | |
107 | if peripheral.getType(peripheralList[i]) == "Laser Amplifier" then | |
108 | LaserAmp = peripheral.wrap(peripheralList[i]) | |
109 | end | |
110 | -- Fluid-Gate | |
111 | if peripheral.getType(peripheralList[i]) == "fluid_gate" then | |
112 | DTFuelInj = peripheral.wrap(peripheralList[i]) | |
113 | DraconicFluidGate = true | |
114 | end | |
115 | -- Flux-Gate | |
116 | if peripheral.getType(peripheralList[i]) == "flux_gate" then | |
117 | FluxGate = peripheral.wrap(peripheralList[i]) | |
118 | DraconicFluxGate = true | |
119 | end | |
120 | -- Energystorage | |
121 | for k,v in pairs(EnergyStoragetypesMekanism) do | |
122 | if peripheral.getType(peripheralList[i]) == v then | |
123 | RFStorage = peripheral.wrap(peripheralList[i]) | |
124 | EType = "mekanism" | |
125 | end | |
126 | end | |
127 | for k,v in pairs(EnergyStoragetypesMekanismIM) do | |
128 | if peripheral.getType(peripheralList[i]) == v then | |
129 | RFStorage = peripheral.wrap(peripheralList[i]) | |
130 | EType = "mekanismIM" | |
131 | end | |
132 | end | |
133 | for k,v in pairs(EnergyStoragetypesDraconic) do | |
134 | if peripheral.getType(peripheralList[i]) == v then | |
135 | RFStorage = peripheral.wrap(peripheralList[i]) | |
136 | EType = "draconic" | |
137 | end | |
138 | end | |
139 | -- Monitor | |
140 | if peripheral.getType(peripheralList[i]) == "monitor" then | |
141 | mon = peripheral.wrap(peripheralList[i]) | |
142 | TType = "TankInfo" | |
143 | end | |
144 | -- Tanks | |
145 | for k,v in pairs(Tanktypes) do | |
146 | if peripheral.getType(peripheralList[i]) == v then | |
147 | Tanks[amountTanks]=peripheral.wrap(peripheralList[i]) | |
148 | amountTanks = amountTanks + 1 | |
149 | end | |
150 | end | |
151 | end | |
152 | amountTanks = amountTanks - 1 | |
153 | end | |
154 | ||
155 | initPeripherals() | |
156 | ||
157 | term.redirect(mon) | |
158 | mon.clear() | |
159 | mon.setTextScale(0.5) | |
160 | mon.setTextColor(colors.white) | |
161 | mon.setBackgroundColor(colors.black) | |
162 | mon.setCursorPos(1,1) | |
163 | ||
164 | MRFLaser = LaserAmp.getEnergy()/2500000 | |
165 | ||
166 | if MRFLaser < 400 and ChargeOn == true then | |
167 | ChargeStatus = "CHARGING" | |
168 | ChargeOnOffcolor = colors.orange | |
169 | ChargeTextcolor = colors.orange | |
170 | elseif MRFLaser < 400 and ChargeOn == false then | |
171 | ChargeStatus = "UNCHARGED" | |
172 | ChargeOnOffcolor = colors.green | |
173 | ChargeTextcolor = colors.red | |
174 | else | |
175 | ChargeStatus = "CHARGED" | |
176 | ChargeOnOffcolor = colors.gray | |
177 | ChargeTextcolor = colors.green | |
178 | end | |
179 | ||
180 | function recalcInj() | |
181 | if DraconicFluidGate == true then | |
182 | DTFuelInj.setOverrideEnabled(true) | |
183 | DTFuelInjRate = DTFuelInj.getFlow() | |
184 | InjRateMax = xRC * 256 + 98 | |
185 | else | |
186 | InjRateMax = 98 | |
187 | end | |
188 | FuelInjRate = FReactor.getInjectionRate() | |
189 | ||
190 | end | |
191 | ||
192 | if DraconicFluxGate == true then | |
193 | FluxGate.setOverrideEnabled(true) | |
194 | end | |
195 | ||
196 | function clearTable() | |
197 | button = {} | |
198 | end | |
199 | ||
200 | -- All the things that make my buttons work | |
201 | ||
202 | function setButton(name, title, func, xmin, ymin, xmax, ymax, elem, elem2, color) | |
203 | button[name] = {} | |
204 | button[name]["title"] = title | |
205 | button[name]["func"] = func | |
206 | button[name]["active"] = false | |
207 | button[name]["xmin"] = xmin | |
208 | button[name]["ymin"] = ymin | |
209 | button[name]["xmax"] = xmax | |
210 | button[name]["ymax"] = ymax | |
211 | button[name]["color"] = color | |
212 | button[name]["elem"] = elem | |
213 | button[name]["elem2"] = elem2 | |
214 | end | |
215 | ||
216 | -- stuff and things for buttons | |
217 | ||
218 | function fill(text, color, bData) | |
219 | mon.setBackgroundColor(color) | |
220 | mon.setTextColor(colors.white) | |
221 | local yspot = math.floor((bData["ymin"] + bData["ymax"]) /2) | |
222 | local xspot = math.floor((bData["xmax"] - bData["xmin"] - string.len(bData["title"])) /2) +1 | |
223 | for j = bData["ymin"], bData["ymax"] do | |
224 | mon.setCursorPos(bData["xmin"], j) | |
225 | if j == yspot then | |
226 | for k = 0, bData["xmax"] - bData["xmin"] - string.len(bData["title"]) +1 do | |
227 | if k == xspot then | |
228 | mon.write(bData["title"]) | |
229 | else | |
230 | mon.write(" ") | |
231 | end | |
232 | end | |
233 | else | |
234 | for i = bData["xmin"], bData["xmax"] do | |
235 | mon.write(" ") | |
236 | end | |
237 | end | |
238 | end | |
239 | mon.setBackgroundColor(colors.black) | |
240 | end | |
241 | ||
242 | -- stuff and things for buttons | |
243 | ||
244 | function screen() | |
245 | local currColor | |
246 | for name,data in pairs(button) do | |
247 | local on = data["active"] | |
248 | currColor = data["color"] | |
249 | fill(name, currColor, data) | |
250 | end | |
251 | end | |
252 | ||
253 | -- stuff and things for buttons | |
254 | ||
255 | function flash(name) | |
256 | screen() | |
257 | end | |
258 | ||
259 | -- magical handler for clicky clicks | |
260 | ||
261 | function checkxy(x, y) | |
262 | for name, data in pairs(button) do | |
263 | if y>=data["ymin"] and y <= data["ymax"] then | |
264 | if x>=data["xmin"] and x<= data["xmax"] then | |
265 | data["func"](data["elem"], data["elem2"]) | |
266 | flash(data['name']) | |
267 | return true | |
268 | --data["active"] = not data["active"] | |
269 | --print(name) | |
270 | end | |
271 | end | |
272 | end | |
273 | return false | |
274 | end | |
275 | ||
276 | -- Draw function : put's all the beautiful magic in the screen | |
277 | ||
278 | function draw() | |
279 | ||
280 | for key,value in pairs(filleds) do | |
281 | paintutils.drawFilledBox(value[1] , value[2], value[3], value[4], value[5]) | |
282 | end | |
283 | ||
284 | for key,value in pairs(boxes) do | |
285 | paintutils.drawBox(value[1] , value[2], value[3], value[4], value[5]) | |
286 | end | |
287 | ||
288 | for key,value in pairs(lines) do | |
289 | paintutils.drawLine(value[1] , value[2], value[3], value[4], value[5]) | |
290 | end | |
291 | ||
292 | for key,value in pairs(texts) do | |
293 | mon.setCursorPos(value[1], value[2]) | |
294 | mon.setTextColor(value[4]) | |
295 | mon.setBackgroundColor(value[5]) | |
296 | mon.write(value[3]) | |
297 | end | |
298 | screen() | |
299 | resetDraw() | |
300 | end | |
301 | ||
302 | -- Resets the elements to draw to only draw the neccessity | |
303 | ||
304 | function resetDraw() | |
305 | filleds = {} | |
306 | boxes = {} | |
307 | lines = {} | |
308 | texts = {} | |
309 | end | |
310 | ||
311 | -- Handles all the clicks for the buttons | |
312 | ||
313 | function clickEvent() | |
314 | local myEvent={os.pullEvent("monitor_touch")} | |
315 | checkxy(myEvent[3], myEvent[4]) | |
316 | end | |
317 | ||
318 | -- Power up the reactor (M&N are a good source of food right?) | |
319 | ||
320 | function powerUp(m,n) | |
321 | if FReactor.isIgnited() == false then | |
322 | Auto = true | |
323 | ChargeOn = true | |
324 | powerUpcolor = colors.green | |
325 | calcLaserAmplifier() | |
326 | else | |
327 | powerUpcolor = colors.gray | |
328 | end | |
329 | end | |
330 | ||
331 | -- Turns Fusion-Reactor off | |
332 | ||
333 | function powerDown(m,n) | |
334 | Power = false | |
335 | ChargeOn = false | |
336 | Auto = false | |
337 | rs.setBundledOutput("back", 0) | |
338 | calcInjRate() | |
339 | end | |
340 | ||
341 | function addDrawBoxes() | |
342 | local w, h = mon.getSize() | |
343 | Factor = math.floor((w/100)*2) | |
344 | ||
345 | GeneralBox["startX"] = 2 | |
346 | GeneralBox["startY"] = 3 | |
347 | GeneralBox["endX"] = ((w-(Factor*2))/3) - Factor | |
348 | GeneralBox["endY"] = (((h - (Factor*2))/3 + 1)/4)*3 | |
349 | GeneralBox["height"] = GeneralBox["endY"] - GeneralBox["startY"] - (Factor*2) - 2 | |
350 | GeneralBox["width"] = GeneralBox["endX"] - GeneralBox["startX"] - (Factor*2) - 2 | |
351 | GeneralBox["inX"] = GeneralBox["startX"] + Factor + 1 | |
352 | GeneralBox["inY"] = GeneralBox["startY"] + Factor + 1 | |
353 | ||
354 | table.insert(boxes, {GeneralBox["startX"] , GeneralBox["startY"], GeneralBox["endX"], GeneralBox["endY"], colors.gray}) | |
355 | name = "LASER" | |
356 | table.insert(lines, {GeneralBox["startX"] + Factor , GeneralBox["startY"], GeneralBox["startX"] + (Factor*2) + #name+1, GeneralBox["startY"], colors.black}) | |
357 | table.insert(texts, {GeneralBox["startX"] + (Factor*2), GeneralBox["startY"], name, colors.white, colors.black}) | |
358 | ||
359 | TankBox["startX"] = GeneralBox["startX"] | |
360 | TankBox["startY"] = (h - Factor) - ((GeneralBox["endY"] - GeneralBox["startY"])/3)*2 | |
361 | TankBox["endX"] = GeneralBox["endX"] | |
362 | TankBox["endY"] = h - 1 | |
363 | TankBox["height"] = TankBox["endY"] - TankBox["startY"] - (Factor*2) - 2 | |
364 | TankBox["width"] = TankBox["endX"] - TankBox["startX"] - (Factor*2) - 2 | |
365 | TankBox["inX"] = TankBox["startX"] + Factor + 1 | |
366 | TankBox["inY"] = TankBox["startY"] + Factor + 1 | |
367 | ||
368 | table.insert(boxes, {TankBox["startX"] , TankBox["startY"], TankBox["endX"], TankBox["endY"], colors.gray}) | |
369 | name = "TANKS" | |
370 | table.insert(lines, {TankBox["startX"] + Factor , TankBox["startY"], TankBox["startX"] + (Factor*2) + #name+1, TankBox["startY"], colors.black}) | |
371 | table.insert(texts, {TankBox["startX"] + (Factor*2), TankBox["startY"], name, colors.white, colors.black}) | |
372 | ||
373 | ReactorBox["startX"] = GeneralBox["startX"] | |
374 | ReactorBox["startY"] = GeneralBox["endY"] + Factor | |
375 | ReactorBox["endX"] = GeneralBox["endX"] | |
376 | ReactorBox["endY"] = TankBox["startY"] - Factor | |
377 | ReactorBox["height"] = ReactorBox["endY"] - ReactorBox["startY"] - (Factor*2) - 2 | |
378 | ReactorBox["width"] = ReactorBox["endX"] - ReactorBox["startX"] - (Factor*2) - 2 | |
379 | ReactorBox["inX"] = ReactorBox["startX"] + Factor + 1 | |
380 | ReactorBox["inY"] = ReactorBox["startY"] + Factor + 1 | |
381 | ||
382 | table.insert(boxes, {ReactorBox["startX"] , ReactorBox["startY"], ReactorBox["endX"], ReactorBox["endY"], colors.gray}) | |
383 | name = "REACTOR" | |
384 | table.insert(lines, {ReactorBox["startX"] + Factor , ReactorBox["startY"], ReactorBox["startX"] + (Factor*2) + #name+1, ReactorBox["startY"], colors.black}) | |
385 | table.insert(texts, {ReactorBox["startX"] + (Factor*2), ReactorBox["startY"], name, colors.white, colors.black}) | |
386 | ||
387 | GraphicBox["startX"] = GeneralBox["endX"] + Factor | |
388 | GraphicBox["startY"] = GeneralBox["startY"] | |
389 | GraphicBox["endX"] = w - 2 | |
390 | GraphicBox["endY"] = TankBox["endY"] | |
391 | GraphicBox["height"] = GraphicBox["endY"]-GraphicBox["startY"] - (Factor*2) - 2 | |
392 | GraphicBox["width"] = GraphicBox["endX"]-GraphicBox["startX"] - (Factor*2) - 2 | |
393 | GraphicBox["inX"] = GraphicBox["startX"] + Factor | |
394 | GraphicBox["inY"] = GraphicBox["startY"] + 2 | |
395 | GraphicBox["sectionHeight"] = math.floor(GraphicBox["height"]/6) | |
396 | ||
397 | table.insert(boxes, {GraphicBox["startX"] , GraphicBox["startY"], GraphicBox["endX"], GraphicBox["endY"], colors.gray}) | |
398 | name = "GRAPHICS/BUTTONS" | |
399 | table.insert(lines, {GraphicBox["startX"] + Factor , GraphicBox["startY"], GraphicBox["startX"] + (Factor*2) + #name+1, GraphicBox["startY"], colors.black}) | |
400 | table.insert(texts, {GraphicBox["startX"] + (Factor*2), GraphicBox["startY"], name, colors.white, colors.black}) | |
401 | ||
402 | name = "FUSION-PLANT" | |
403 | table.insert(texts, {(w/2)-(#name/2), 1, name, colors.white, colors.black}) | |
404 | ||
405 | local names = {} | |
406 | names[1] = "CHARGE LEVEL" | |
407 | names[2] = "INJECTION RATE" | |
408 | names[3] = "ENERGY STORED" | |
409 | ||
410 | for i=1,5,1 do | |
411 | table.insert(texts, {GraphicBox["inX"] + Factor, GraphicBox["inY"] + (GraphicBox["sectionHeight"]*i) +i + 1, names[i], colors.white, colors.black}) | |
412 | table.insert(filleds, {GraphicBox["inX"] + Factor, GraphicBox["inY"] + (GraphicBox["sectionHeight"]*i) +i + 2, GraphicBox["inX"] + GraphicBox["width"] - 1, GraphicBox["inY"] + (GraphicBox["sectionHeight"]*(i+1)) +i, colors.lightGray}) | |
413 | end | |
414 | ||
415 | refresh = true | |
416 | while refresh do | |
417 | recalcInj() | |
418 | if FReactor.isIgnited() == false then | |
419 | powerUpcolor = colors.green | |
420 | FireUpcolor = colors.green | |
421 | ReactorStatus = "OFFLINE" | |
422 | RectorTextcolor = colors.red | |
423 | else | |
424 | powerUpcolor = colors.gray | |
425 | FireUpcolor = colors.gray | |
426 | ReactorStatus = "ONLINE" | |
427 | RectorTextcolor = colors.green | |
428 | end | |
429 | ||
430 | setButton("CHARG","CHARGE", ChargeOnOff, GraphicBox["inX"] + Factor, GraphicBox["inY"] + 1, GraphicBox["inX"] + (GraphicBox["width"]/4 - 1), GraphicBox["inY"] + 3, 0, 0, ChargeOnOffcolor) | |
431 | setButton("START INJ","START INJ", FireUp, GraphicBox["inX"] + (GraphicBox["width"]/4 + Factor - 1), GraphicBox["inY"] + 1, GraphicBox["inX"] + ((GraphicBox["width"]/4)*2 - 1) , GraphicBox["inY"] + 3,0, 0, FireUpcolor) | |
432 | setButton("AUTO-CHARGE","AUTO-CHARGE", powerUp, GraphicBox["inX"] + ((GraphicBox["width"]/4)*2 + Factor - 1), GraphicBox["inY"] + 1, GraphicBox["inX"] + ((GraphicBox["width"]/4)*3 - 1), GraphicBox["inY"] + 3,0, 0, powerUpcolor) | |
433 | setButton("SHUT-DOWN","SHUT-DOWN", powerDown, GraphicBox["inX"] + ((GraphicBox["width"]/4)*3 + Factor - 1), GraphicBox["inY"] + 1, GraphicBox["inX"] + (GraphicBox["width"] - 1), GraphicBox["inY"] + 3,0, 0, colors.red) | |
434 | ||
435 | if FireUpOK == true then | |
436 | sleep(10) | |
437 | rs.setBundledOutput("back",colors.subtract(rs.getBundledOutput("back"), colors.yellow)) | |
438 | if FReactor.isIgnited() == false then | |
439 | rs.setBundledOutput("back", colors.red, 1) | |
440 | sleep(1) | |
441 | rs.setBundledOutput("back", 0, colors.red) | |
442 | end | |
443 | FireUpOK = false | |
444 | end | |
445 | ||
446 | if (FirstProcent < 25 and FirstProcent >= MinProcenttoBoost) or (SecondProcent < 25 and SecondProcent >= MinProcenttoBoost) then | |
447 | for w = 0, 0 do | |
448 | TankLevel = false | |
449 | TankLevel1 = false | |
450 | TankLevel2 = true | |
451 | end | |
452 | elseif (FirstProcent >= 25 and FirstProcent <= 75) or (SecondProcent >= 25 and SecondProcent <= 75) then | |
453 | for w = 0, 0 do | |
454 | TankLevel = false | |
455 | TankLevel1 = true | |
456 | TankLevel2 = false | |
457 | end | |
458 | elseif (FirstProcent > 75 and SecondProcent > 75) then | |
459 | for w = 0, 0 do | |
460 | TankLevel = true | |
461 | TankLevel1 = false | |
462 | TankLevel2 = false | |
463 | end | |
464 | elseif (FirstProcent < MinProcenttoBoost or SecondProcent < MinProcenttoBoost) then | |
465 | for w = 0, 0 do | |
466 | TankLevel = false | |
467 | TankLevel1 = false | |
468 | TankLevel2 = false | |
469 | end | |
470 | end | |
471 | parallel.waitForAny(refreshStats, loop, clickEvent) | |
472 | end | |
473 | ||
474 | end | |
475 | ||
476 | function loop() | |
477 | while true do | |
478 | calcInjRate() | |
479 | end | |
480 | end | |
481 | function refreshStats() | |
482 | calcInjRate() | |
483 | calcLaserAmplifier() | |
484 | ||
485 | -- Laser Visualisierung | |
486 | ||
487 | local i = 1 | |
488 | ||
489 | local infotoAdd = "STATUS: " | |
490 | local infotoAdd1 = "CHARGE-LEVEL: " | |
491 | ||
492 | if currentChargeLevel ~= MRFLaser then | |
493 | currentChargeLevel = MRFLaser | |
494 | ||
495 | if MRFLaser > 400 then | |
496 | MRFLaserT = 400 | |
497 | else | |
498 | MRFLaserT = MRFLaser | |
499 | end | |
500 | ||
501 | MRFLaserText = math.floor((MRFLaserT/400)*100) | |
502 | ||
503 | table.insert(lines, {GeneralBox["inX"] , GeneralBox["inY"],GeneralBox["inX"] + GeneralBox["width"] , GeneralBox["inY"], colors.black}) | |
504 | table.insert(texts, {GeneralBox["inX"] + 1, GeneralBox["inY"] - 1, infotoAdd, colors.white, colors.black}) | |
505 | table.insert(texts, {GeneralBox["inX"] + 1 + #infotoAdd, GeneralBox["inY"] - 1, ChargeStatus .. " ", ChargeTextcolor, colors.black}) | |
506 | table.insert(texts, {GeneralBox["inX"] + 1 , GeneralBox["inY"] + Factor - 1, infotoAdd1 .. MRFLaserText .. "% ", colors.white, colors.black}) | |
507 | table.insert(filleds, {GraphicBox["inX"] + Factor, GraphicBox["inY"] + (GraphicBox["sectionHeight"]*i) + i + 2, GraphicBox["inX"] + GraphicBox["width"] - 1, GraphicBox["inY"] + (GraphicBox["sectionHeight"]*(i+1)) +i, colors.lightGray}) | |
508 | ||
509 | width = math.floor((GraphicBox["width"] / 400)*MRFLaserT) | |
510 | table.insert(filleds, {GraphicBox["inX"] + Factor, GraphicBox["inY"] + (GraphicBox["sectionHeight"]*i) +i + 2, GraphicBox["inX"] + width - 1, GraphicBox["inY"] + (GraphicBox["sectionHeight"]*(i+1)) +i, colors.green}) | |
511 | ||
512 | end | |
513 | ||
514 | -- Reactor Visualisierung | |
515 | ||
516 | local i = 2 | |
517 | ||
518 | local infotoAdd = "STATUS: " | |
519 | local infotoAdd1 = "INJ-RATE: " | |
520 | local infotoAdd2 = "PLASMA-HEAT: " | |
521 | local infotoAdd3 = "CASE-HEAT: " | |
522 | local infotoAdd4 = "ENERGY/T: " | |
523 | local infotoAdd5 = "ENERGYSTORAGE: " | |
524 | local infotoAdd6 = "WATER: " | |
525 | local infotoAdd7 = "STEAM: " | |
526 | ||
527 | if InjRateText > (xRC*256+98) then | |
528 | InjRateT = (xRC*256+98) | |
529 | else | |
530 | InjRateT = InjRateText | |
531 | end | |
532 | ||
533 | table.insert(lines, {ReactorBox["inX"] , ReactorBox["inY"],ReactorBox["inX"] + ReactorBox["width"] , ReactorBox["inY"], colors.black}) | |
534 | table.insert(texts, {ReactorBox["inX"] + 1, ReactorBox["inY"] - 1, infotoAdd, colors.white, colors.black}) | |
535 | table.insert(texts, {ReactorBox["inX"] + 1 + #infotoAdd, ReactorBox["inY"] - 1, ReactorStatus .. " ", RectorTextcolor, colors.black}) | |
536 | table.insert(texts, {ReactorBox["inX"] + 1 , ReactorBox["inY"] + Factor - 1, infotoAdd1 .. InjRateT .. " ", colors.white, colors.black}) | |
537 | table.insert(texts, {ReactorBox["inX"] + 1 , ReactorBox["inY"] + 2*Factor - 1, infotoAdd2 .. PlasmaHeat .. " GK ", colors.white, colors.black}) | |
538 | table.insert(texts, {ReactorBox["inX"] + 1 , ReactorBox["inY"] + 3*Factor - 1, infotoAdd3 .. CaseHeat .. " GK ", colors.white, colors.black}) | |
539 | table.insert(texts, {ReactorBox["inX"] + 1 , ReactorBox["inY"] + 4*Factor - 1, infotoAdd4 .. RFOutputT .. " MRF/t ", colors.white, colors.black}) | |
540 | table.insert(texts, {ReactorBox["inX"] + 1 , ReactorBox["inY"] + 5*Factor - 1, infotoAdd5 .. RFStoragePercent .. "% ", colors.white, colors.black}) | |
541 | table.insert(texts, {ReactorBox["inX"] + 1 , ReactorBox["inY"] + 6*Factor - 1, infotoAdd6 .. "--- ", colors.white, colors.black}) | |
542 | table.insert(texts, {ReactorBox["inX"] + 1 , ReactorBox["inY"] + 7*Factor - 1, infotoAdd7 .. "--- ", colors.white, colors.black}) | |
543 | ||
544 | table.insert(filleds, {GraphicBox["inX"] + Factor, GraphicBox["inY"] + (GraphicBox["sectionHeight"]*i) +i + 2, GraphicBox["inX"] + GraphicBox["width"] - 1, GraphicBox["inY"] + (GraphicBox["sectionHeight"]*(i+1)) +i, colors.lightGray}) | |
545 | width = math.floor((GraphicBox["width"] / InjRateMax)*InjRateT) | |
546 | table.insert(filleds, {GraphicBox["inX"] + Factor, GraphicBox["inY"] + (GraphicBox["sectionHeight"]*i) +i + 2, GraphicBox["inX"] + width - 1, GraphicBox["inY"] + (GraphicBox["sectionHeight"]*(i+1)) +i, colors.green}) | |
547 | ||
548 | local i = 3 | |
549 | ||
550 | table.insert(filleds, {GraphicBox["inX"] + Factor, GraphicBox["inY"] + (GraphicBox["sectionHeight"]*i) +i + 2, GraphicBox["inX"] + GraphicBox["width"] - 1, GraphicBox["inY"] + (GraphicBox["sectionHeight"]*(i+1)) +i, colors.lightGray}) | |
551 | width = math.floor(GraphicBox["width"]*(RFStoragePercent/100)) | |
552 | table.insert(filleds, {GraphicBox["inX"] + Factor, GraphicBox["inY"] + (GraphicBox["sectionHeight"]*i) +i + 2, GraphicBox["inX"] + width - 1, GraphicBox["inY"] + (GraphicBox["sectionHeight"]*(i+1)) +i, colors.green}) | |
553 | ||
554 | -- Tank Visualisierung | |
555 | ||
556 | local i = 4 | |
557 | ||
558 | local infotoAdd = " : " | |
559 | ||
560 | table.insert(lines, {TankBox["inX"] , TankBox["inY"],TankBox["inX"] + TankBox["width"] , TankBox["inY"], colors.black}) | |
561 | table.insert(texts, {TankBox["inX"] + 1, TankBox["inY"] - 1, FirstTankText .. infotoAdd .. FirstProcent .."% ", colors.white, colors.black}) | |
562 | table.insert(texts, {TankBox["inX"] + 1, TankBox["inY"] + Factor - 1, SecondTankText .. infotoAdd .. SecondProcent .. "% ", colors.white, colors.black}) | |
563 | ||
564 | table.insert(texts, {GraphicBox["inX"] + Factor, GraphicBox["inY"] + (GraphicBox["sectionHeight"]*i) +i + 1, FirstTankName, colors.white, colors.black}) | |
565 | table.insert(filleds, {GraphicBox["inX"] + Factor, GraphicBox["inY"] + (GraphicBox["sectionHeight"]*i) +i + 2, GraphicBox["inX"] + GraphicBox["width"] - 1, GraphicBox["inY"] + (GraphicBox["sectionHeight"]*(i+1)) +i, colors.lightGray}) | |
566 | width = math.floor(GraphicBox["width"]*(FirstProcent/100)) | |
567 | table.insert(filleds, {GraphicBox["inX"] + Factor, GraphicBox["inY"] + (GraphicBox["sectionHeight"]*i) +i + 2, GraphicBox["inX"] + width - 1, GraphicBox["inY"] + (GraphicBox["sectionHeight"]*(i+1)) +i, FirstTankcolor}) | |
568 | ||
569 | local i = 5 | |
570 | ||
571 | table.insert(texts, {GraphicBox["inX"] + Factor, GraphicBox["inY"] + (GraphicBox["sectionHeight"]*i) +i + 1, SecondTankName, colors.white, colors.black}) | |
572 | table.insert(filleds, {GraphicBox["inX"] + Factor, GraphicBox["inY"] + (GraphicBox["sectionHeight"]*i) +i + 2, GraphicBox["inX"] + GraphicBox["width"] - 1, GraphicBox["inY"] + (GraphicBox["sectionHeight"]*(i+1)) +i, colors.lightGray}) | |
573 | width = math.floor(GraphicBox["width"]*(SecondProcent/100)) | |
574 | table.insert(filleds, {GraphicBox["inX"] + Factor, GraphicBox["inY"] + (GraphicBox["sectionHeight"]*i) +i + 2, GraphicBox["inX"] + width - 1, GraphicBox["inY"] + (GraphicBox["sectionHeight"]*(i+1)) +i, SecondTankcolor}) | |
575 | ||
576 | draw() | |
577 | sleep(1) | |
578 | end | |
579 | ||
580 | ||
581 | -- Calcs MRFProduce | |
582 | ||
583 | function calcMRFProduce() | |
584 | if EType == "mekanism" then | |
585 | local MRFNeed = RFStorage.getOutput()/2500000 | |
586 | RFStoraged = RFStorage.getEnergy()/2500000 | |
587 | RFMaxStorage = RFStorage.getMaxEnergy()/2500000 | |
588 | RFStoragePercent = math.floor(RFStoraged / RFMaxStorage * 100) | |
589 | if RFStoragePercent > MinProcentforLowMode then | |
590 | MRFProduce = MRFNeed + MRFBuffer -- LowRF Mode but everytime over RFOutput | |
591 | else | |
592 | MRFProduce = RFMaxStorage -- MaxRF Mode | |
593 | end | |
594 | end | |
595 | if EType == "mekanismIM" then | |
596 | local MRFNeed = RFStorage.getOutput()/2500000 | |
597 | RFStoraged = RFStorage.getEnergy()/2500000 | |
598 | RFMaxStorage = RFStorage.getMaxEnergy()/2500000 | |
599 | RFMaxTransfer = RFStorage.getTransferCap()/2500000 | |
600 | RFStoragePercent = math.floor(RFStoraged / RFMaxStorage * 100) | |
601 | if RFStoragePercent > MinProcentforLowMode then | |
602 | MRFProduce = MRFNeed + MRFBuffer -- LowRF Mode but everytime over RFOutput | |
603 | else | |
604 | MRFProduce = RFMaxTransfer -- MaxRF Mode | |
605 | end | |
606 | end | |
607 | if EType == "draconic" then | |
608 | RFStoraged = RFStorage.getEnergyStored()/1000000 | |
609 | RFMaxStorage = RFStorage.getMaxEnergyStored()/1000000 | |
610 | RFStoragePercent = math.floor(RFStoraged / RFMaxStorage * 100) | |
611 | local MRFNeed = RFMaxStorage - RFStoraged | |
612 | MRFProduce = MRFNeed + MRFBuffer | |
613 | end | |
614 | end | |
615 | ||
616 | -- Stats of Tanks | |
617 | ||
618 | function calcTankStats() | |
619 | - | local FirstTankInfo = Tanks[0].getTankInfo() |
619 | + | local FirstTankInfo = Tanks[0] |
620 | - | local SecondTankInfo = Tanks[1].getTankInfo() |
620 | + | local SecondTankInfo = Tanks[1] |
621 | - | if FirstTankInfo[1]["contents"] == nil then |
621 | + | if FirstTankInfo[1].getItem() == nil then |
622 | FirstTankText ="NO FLUID " | |
623 | FirstTankName = "NO FLUID " | |
624 | FirstTankLiquid = "NO FLUID " | |
625 | FirstAmount = 0 | |
626 | FirstProcent = 0 | |
627 | FirstTankcolor = colors.lightGray | |
628 | else | |
629 | FirstTankStats = FirstTankInfo[1] | |
630 | - | local FirstCapacity = FirstTankStats["capacity"] |
630 | + | local FirstCapacity = FirstTankStats.size() |
631 | - | FirstTankName = FirstTankStats["contents"]["rawName"] |
631 | + | FirstTankName = FirstTankStats.getItem().getName() |
632 | - | FirstTankLiquid = FirstTankStats["contents"]["name"] |
632 | + | FirstTankLiquid = FirstTankStats.getItem().getName() |
633 | - | FirstAmount = FirstTankStats["contents"]["amount"] |
633 | + | FirstAmount = FirstTankStats.getItem().getSize() |
634 | FirstProcent = math.floor(FirstAmount / FirstCapacity * 100) | |
635 | end | |
636 | ||
637 | - | if SecondTankInfo[1]["contents"] == nil then |
637 | + | if SecondTankInfo[1].getItem() == nil then |
638 | SecondTankText ="NO FLUID " | |
639 | SecondTankName = "NO FLUID " | |
640 | SecondTankLiquid = "NO FLUID " | |
641 | SecondAmount = 0 | |
642 | SecondProcent = 0 | |
643 | SecondTankcolor = colors.lightGray | |
644 | else | |
645 | SecondTankStats = SecondTankInfo[1] | |
646 | - | local SecondCapacity = SecondTankStats["capacity"] |
646 | + | local SecondCapacity = SecondTankStats.size() |
647 | - | SecondTankName = SecondTankStats["contents"]["rawName"] |
647 | + | SecondTankName = SecondTankStats.getItem().getName() |
648 | - | SecondTankLiquid = SecondTankStats["contents"]["name"] |
648 | + | SecondTankLiquid = SecondTankStats.getItem().getName() |
649 | - | SecondAmount = SecondTankStats["contents"]["amount"] |
649 | + | SecondAmount = SecondTankStats.getItem().getSize() |
650 | SecondProcent = math.floor(SecondAmount / SecondCapacity * 100) | |
651 | end | |
652 | ||
653 | if FirstTankName == "Liquid Tritium" or SecondTankName == "Liquid Deuterium" then | |
654 | FirstTankcolor = colors.cyan | |
655 | FirstTankText = "L.TRITIUM " | |
656 | SecondTankcolor = colors.red | |
657 | SecondTankText = "L.DEUTERIUM " | |
658 | elseif FirstTankName == "Liquid Deuterium" or SecondTankName == "Liquid Tritium" then | |
659 | FirstTankcolor = colors.red | |
660 | FirstTankText = "L.DEUTERIUM " | |
661 | SecondTankcolor = colors.cyan | |
662 | SecondTankText = "L.TRITIUM " | |
663 | end | |
664 | ||
665 | if FirstTankName == "NO FLUID " then | |
666 | FirstTankText ="NO FLUID " | |
667 | FirstTankcolor = colors.lightGray | |
668 | elseif SecondTankName == "NO FLUID " then | |
669 | SecondTankText ="NO FLUID " | |
670 | SecondTankcolor = colors.lightGray | |
671 | end | |
672 | end | |
673 | ||
674 | -- Calcs and Sets Inj Rate | |
675 | ||
676 | function calcInjRate() | |
677 | recalcInj() | |
678 | calcMRFProduce() | |
679 | calcTankStats() | |
680 | InjRate1 = math.ceil(RFMaxTransfer/k) | |
681 | InjRate2 = math.ceil(MRFProduce/k) | |
682 | ||
683 | if Power == true then | |
684 | ||
685 | if TankLevel2 == true then | |
686 | InjRate = math.floor(InjRateMax/4) | |
687 | elseif TankLevel1 == true then | |
688 | InjRate = math.floor(InjRateMax/4)*3 | |
689 | elseif TankLevel == true then | |
690 | InjRate = InjRate2 | |
691 | end | |
692 | if InjRate > InjRate1 then | |
693 | InjRate = InjRate1 | |
694 | end | |
695 | if (TankLevel == false and TankLevel1 == false and TankLevel2 == false) or InjRate < 2 then | |
696 | InjRate = 2 | |
697 | end | |
698 | if DraconicFluidGate == true then -- if Fluidgate ispresent then D-T-Fuel => main Fuel | |
699 | calcDTFuelInjRate() | |
700 | DTFuelInj.setFlowOverride(DTFuelInjRate) | |
701 | InjRateMax = (xRC*256+98) | |
702 | else -- else normal | |
703 | calcFuelInjRate() | |
704 | InjRateMax = 98 | |
705 | end | |
706 | elseif Power == false then | |
707 | if DraconicFluidGate == true then -- if Fluidgate ispresent 0 | |
708 | DTFuelInj.setFlowOverride(0) | |
709 | FuelInjRate = 0 | |
710 | else -- else FuelInjRate = 0 | |
711 | FuelInjRate = 0 | |
712 | end | |
713 | end | |
714 | ||
715 | InjRateText = FuelInjRate + DTFuelInjRate | |
716 | FReactor.setInjectionRate(FuelInjRate) | |
717 | RFOutputT = round((FReactor.getProducing()/2500000), 1) | |
718 | PlasmaHeat = round((FReactor.getPlasmaHeat()/1000000000), 1) | |
719 | CaseHeat = round((FReactor.getCaseHeat()/1000000000), 1) | |
720 | sleep(1) | |
721 | end | |
722 | ||
723 | -- Calcs DTFuelInjRate (max= 256 mb/t because its maximum of one rotary Conden ) | |
724 | ||
725 | function calcDTFuelInjRate() | |
726 | if InjRate > (xRC*256) then | |
727 | calcFuelInjRate() | |
728 | DTFuelInjRate = (xRC*256) | |
729 | else | |
730 | FuelInjRate = 0 | |
731 | DTFuelInjRate = InjRate | |
732 | end | |
733 | end | |
734 | ||
735 | -- Calcs InjRate for Fusion-Reactor | |
736 | ||
737 | function calcFuelInjRate() | |
738 | if DraconicFluidGate == true then | |
739 | FuelInjRate = InjRate - (xRC*256) | |
740 | else | |
741 | DTFuelInjRate = 0 | |
742 | FuelInjRate = InjRate | |
743 | end | |
744 | if FuelInjRate%2 == 1 then -- Its possible to set InjRate Of Fusion-Reactor to 7, 9, 11, ... in Fusion-Reactor-GUI not possible!!! Maybe Bug?? | |
745 | FuelInjRate = FuelInjRate + 1 | |
746 | end | |
747 | if FuelInjRate > 98 then -- Its possible to set InjRate Of Fusion-Reactor over 98!!! Maybe Bug??? (For CheatMode set FuelInjRate = 354 for 1,56 GRF!!!) | |
748 | FuelInjRate = 98 | |
749 | end | |
750 | end | |
751 | ||
752 | -- Laser Amplifier | |
753 | ||
754 | function calcLaserAmplifier() | |
755 | MRFMaxLaser = LaserAmp.getMaxEnergy()/2500000 | |
756 | MRFLaser = LaserAmp.getEnergy()/2500000 | |
757 | if MRFLaser < 400 and ChargeOn == true then | |
758 | Charge = 10000000 | |
759 | ChargeStatus = "CHARGING" | |
760 | ChargeOnOffcolor = colors.orange | |
761 | ChargeTextcolor = colors.orange | |
762 | elseif MRFLaser < 400 and ChargeOn == false then | |
763 | Charge = 0 | |
764 | ChargeStatus = "UNCHARGED" | |
765 | ChargeOnOffcolor = colors.green | |
766 | ChargeTextcolor = colors.red | |
767 | else | |
768 | Charge = 0 | |
769 | ChargeStatus = "CHARGED" | |
770 | ChargeOnOffcolor = colors.gray | |
771 | ChargeTextcolor = colors.green | |
772 | end | |
773 | if DraconicFluxGate == true then | |
774 | ChargeLaser = FluxGate.setFlowOverride(Charge) | |
775 | elseif MRFLaser < 400 and DraconicFluxGate == false then | |
776 | rs.setBundledOutput("back",colors.combine(rs.getBundledOutput("back"), colors.black)) | |
777 | end | |
778 | if MRFLaser >= 400 then | |
779 | if Auto == true then | |
780 | if DraconicFluidGate == true then -- if Fluidgate ispresent = 2 | |
781 | DTFuelInj.setFlowOverride(2) | |
782 | FReactor.setInjectionRate(0) | |
783 | else -- else FuelInjRate = 2 | |
784 | FReactor.setInjectionRate(2) | |
785 | end | |
786 | FireUp() | |
787 | elseif MRFLaser >= 400 and Auto == false and DraconicFluxGate == true then | |
788 | FluxGate.setFlowOverride(0) | |
789 | rs.setBundledOutput("back",colors.subtract(rs.getBundledOutput("back"), colors.black)) | |
790 | end | |
791 | end | |
792 | end | |
793 | ||
794 | -- Alarm + Hohlraum insert | |
795 | ||
796 | function FireUp() | |
797 | if FReactor.isIgnited() == false then | |
798 | Auto = false | |
799 | Power = true | |
800 | FireUpOK = true | |
801 | rs.setBundledOutput("back",colors.combine(rs.getBundledOutput("back"), colors.yellow)) | |
802 | FireUpcolor = colors.green | |
803 | calcInjRate() | |
804 | else | |
805 | FireUpcolor = colors.gray | |
806 | end | |
807 | end | |
808 | ||
809 | function ChargeOnOff() | |
810 | ChargeOn = true | |
811 | calcLaserAmplifier() | |
812 | end | |
813 | ||
814 | ||
815 | ||
816 | ||
817 | --============================================================ | |
818 | -- add comma to separate thousands | |
819 | -- From Lua-users.org/wiki/FormattingNumbers | |
820 | -- | |
821 | -- | |
822 | function comma_value(amount) | |
823 | local formatted = amount | |
824 | while true do | |
825 | formatted, zz = string.gsub(formatted, "^(-?%d+)(%d%d%d)", '%1,%2') | |
826 | if (zz==0) then | |
827 | break | |
828 | end | |
829 | end | |
830 | return formatted | |
831 | end | |
832 | ||
833 | ---============================================================ | |
834 | -- rounds a number to the nearest decimal places | |
835 | -- From Lua-users.org/wiki/FormattingNumbers | |
836 | -- | |
837 | -- | |
838 | function round(val, decimal) | |
839 | if (decimal) then | |
840 | return math.floor( (val * 10^decimal) + 0.5) / (10^decimal) | |
841 | else | |
842 | return math.floor(val+0.5) | |
843 | end | |
844 | end | |
845 | ||
846 | --=================================================================== | |
847 | -- given a numeric value formats output with comma to separate thousands | |
848 | -- and rounded to given decimal places | |
849 | -- From Lua-users.org/wiki/FormattingNumbers | |
850 | -- | |
851 | function format_num(amount, decimal, prefix, neg_prefix) | |
852 | local str_amount, formatted, famount, remain | |
853 | ||
854 | decimal = decimal or 2 -- default 2 decimal places | |
855 | neg_prefix = neg_prefix or "-" -- default negative sign | |
856 | ||
857 | famount = math.abs(round(amount,decimal)) | |
858 | famount = math.floor(famount) | |
859 | ||
860 | remain = round(math.abs(amount) - famount, decimal) | |
861 | ||
862 | -- comma to separate the thousands | |
863 | formatted = comma_value(famount) | |
864 | ||
865 | -- attach the decimal portion | |
866 | if (decimal > 0) then | |
867 | remain = string.sub(tostring(remain),3) | |
868 | formatted = formatted .. "." .. remain .. | |
869 | string.rep("0", decimal - string.len(remain)) | |
870 | end | |
871 | ||
872 | -- attach prefix string e.g '$' | |
873 | formatted = (prefix or "") .. formatted | |
874 | ||
875 | -- if value is negative then format accordingly | |
876 | if (amount<0) then | |
877 | if (neg_prefix=="()") then | |
878 | formatted = "("..formatted ..")" | |
879 | else | |
880 | formatted = neg_prefix .. formatted | |
881 | end | |
882 | end | |
883 | ||
884 | return formatted | |
885 | end | |
886 | ||
887 | addDrawBoxes() |