View difference between Paste ID: phTWaNmj and NY6MU58s
SHOW: | | - or go back to the newest paste.
1
-- pay attention to the fact that things return error now instead of origin values
2
-- especially on reassembling on restart of server and things of the sort
3
4
5
6
-- ****************************************************** --
7
-- ****************************************************** --
8
-- **             Reactor Madness Program              ** --
9
-- **                 for Big Reactor                  ** --
10
-- **                Written by krakaen                ** --
11
-- **                  Video Tutorial                  ** --
12
-- ** 	https://www.youtube.com/watch?v=SbbT7ncyS2M    ** --
13
-- ****************************************************** --
14
-- ****************************************************** --
15
16
-- ******** Version 0.1 Changelog (02/16/2016) ********
17
-- Changed currentRFTotal to 1 (makes power show at start)
18
19
-- ******** Version 0.2 Changelog (02/16/2016) ********
20
-- Added fuel usage (mb/t)
21
-- Added function round
22
-- Added function comma_value
23
-- Added function format_num
24
25
-- ******** Version 0.3 Changelog (02/17/2016) ********
26
-- Change Rod looking for 0 instead of 1
27
28
-- ******** Version 0.4 Changelog (10/18/2016) ********
29
-- Change rodLevel to do a Math.ceil instead of Math.floor
30
31
-- ******** Version 0.5 Changelog (03/01/2017) ********
32
-- Change drawBoxed and drawFilledBox for drawLines with for loop
33
-- to get compatibility with 1.60+
34
35
-- ******** Version 0.6 Changelog (03/22/2017) ********
36
-- Added Custom error handling
37
-- fixed typo in controlsSize for controlsSize
38
39
-- ******** Version 0.7 Changelog (05/15/2018) ********
40
-- Added new functions for extreme reactor handling. Will work on both new and old versions
41
42
-- ******** Version 0.8 Changelog (31/10/2020) ********
43
-- Added new functions for Bigger reactor handling. Will work on both new, newer and old versions
44
45
-- ******** Version 0.9 Changelog (24/04/2021) ********
46
-- Added new functions for newer Bigger reactor handling. Will work on both new, newer and old versions. 
47
48
-- ******** Version 0.10 Changelog (19/09/2021) ********
49
-- Added fix to calculate size of power tank on Extreme Reactor and fixed the total RB decimal issue. 
50
51
-- you need to give the index to be able to use the program
52
-- ex : NameOfProgram Index   (reactor Krakaen) 
53
54
local args = { ... }
55
56
local button = {}
57
local filleds = {}
58
local boxes = {}
59
local lines = {}
60
local texts = {}
61
62
local refresh = true
63
64
local infosSize = {}
65
local controlsSize = {}
66
local numbersSize = {}
67
local currentRfTotal = 1
68
local currentRfTick = 1
69
local currentFuelConsumedLastTick = 0.00001
70
71
72
local rfPerTickMax = 1
73
local rfTotalMax = 10000000
74
local minPowerRod = 0
75
local maxPowerRod = 100
76
local currentRodLevel = 1
77
78
local index = ""
79
80
local reactors = {}
81
local monitors = {}
82
83
local VERSION = "NONE"
84
85
function checkVersionTooOld()
86
	local uselessMonitors = {peripheral.find("monitor")}
87
end
88
89
function checkMBFunctionAvailability()
90
	local uselessMbConnected = reactors[1].mbIsConnected()
91
	local uselessMbAssembled = reactors[1].mbIsAssembled()
92
end
93
94
function checkEnergyCapacityFunction()
95
	local uselessEnergyCapacity = reactors[1].getEnergyStats().energyCapacity
96
end
97
98
-- VERSIONS - BIG, EXTREME, BIGGERv1, BIGGERv2
99
function initReactor()
100
	if pcall(checkVersionTooOld) then
101
		monitors = {peripheral.find("monitor")}
102
103
		-- allow 5 seconds to detect if the reactor is on the network
104
		print("Detecting reactor. This may take up to 5 seconds.")
105
		local looptyloop = 0
106
		while looptyloop ~= 5 do
107
			if peripheral.find("BigReactors-Reactor") ~= nil then
108
				reactors = {peripheral.find("BigReactors-Reactor")}
109
				if pcall(checkEnergyCapacityFunction) then
110
					rfTotalMax = reactors[1].getEnergyStats().energyCapacity
111
				end
112
				if pcall(checkMBFunctionAvailability) then
113
					VERSION = "EXTREME"
114
				else 
115
					VERSION = "BIG"
116
				end
117
				break
118-
			elseif peripheral.find("bigger-reactor") ~= nil then
118+
			elseif peripheral.find("extreme-reactors") ~= nil then
119-
				reactors = {peripheral.find("bigger-reactor")}
119+
				reactors = {peripheral.find("extreme-reactors")}
120
				VERSION = "BIGGERv1"
121
				break
122
			elseif peripheral.find("BiggerReactors_Reactor") ~= nil then
123
				reactors = {peripheral.find("BiggerReactors_Reactor")}
124
				VERSION = "BIGGERv2"
125
				rfTotalMax = reactors[1].battery().capacity()
126
				break
127
			end
128
129
			sleep(1)
130
			looptyloop = looptyloop + 1
131
		end
132
133
		if monitors[1] == nil then
134
			error("The Monitor is not being detected, make sure the connections(modem) are activated", 0)
135
		end
136
137
		if reactors[1] == nil then
138
			error("The Reactor is not being detected, make sure the connections(modem) are activated. The problem could also be related to chunk protection on some public servers, ask an admin about it.", 0)
139
		end
140
	else
141
		error("The version of ComputerCraft is too old to use this program, sorry", 0)
142
	end
143
	print("Reactor detected. Program Starting.")
144
end
145
146
if (#args == 0) then
147
	error("No index Given, Make sure to start the 'start' program and not the 'reactor' program", 0)
148
end
149
150
if (#args == 1) then
151
	index = args[1]
152
end
153
154
initReactor() -- Init and Verify that everything is okay to start the program
155
156
local mon = monitors[1]
157
158
-- Use the black thingy sponge to clear the chalkboard
159
160
term.redirect(mon)
161
mon.clear()
162
mon.setTextColor(colors.white)
163
mon.setBackgroundColor(colors.black)
164
165
function clearTable()
166
	button = {}
167
end
168
169
170
-- All the things that make my buttons work
171
172
function setButton(name, title, func, xmin, ymin, xmax, ymax, elem, elem2, color)
173
	button[name] = {}
174
	button[name]["title"] = title
175
  	button[name]["func"] = func
176
   	button[name]["active"] = false
177
   	button[name]["xmin"] = xmin
178
   	button[name]["ymin"] = ymin
179
   	button[name]["xmax"] = xmax
180
   	button[name]["ymax"] = ymax
181
   	button[name]["color"] = color
182
   	button[name]["elem"] = elem
183
   	button[name]["elem2"] = elem2
184
end
185
186
-- stuff and things for buttons
187
188
function fill(text, color, bData)
189
   mon.setBackgroundColor(color)
190
   mon.setTextColor(colors.white)
191
   local yspot = math.floor((bData["ymin"] + bData["ymax"]) /2)
192
   local xspot = math.floor((bData["xmax"] - bData["xmin"] - string.len(bData["title"])) /2) +1
193
   for j = bData["ymin"], bData["ymax"] do
194
      mon.setCursorPos(bData["xmin"], j)
195
      if j == yspot then
196
         for k = 0, bData["xmax"] - bData["xmin"] - string.len(bData["title"]) +1 do
197
            if k == xspot then
198
               mon.write(bData["title"])
199
            else
200
               mon.write(" ")
201
            end
202
         end
203
      else
204
         for i = bData["xmin"], bData["xmax"] do
205
            mon.write(" ")
206
         end
207
      end
208
   end
209
   mon.setBackgroundColor(colors.black)
210
end
211
212
-- stuff and things for buttons
213
214
function screen()
215
   local currColor
216
   for name,data in pairs(button) do
217
      local on = data["active"]
218
      currColor = data["color"]
219
      fill(name, currColor, data)
220
   end
221
end
222
223
-- stuff and things for buttons
224
225
function flash(name)
226
	screen()
227
end
228
229
-- magical handler for clicky clicks
230
231
function checkxy(x, y)
232
   for name, data in pairs(button) do
233
      if y>=data["ymin"] and  y <= data["ymax"] then
234
         if x>=data["xmin"] and x<= data["xmax"] then
235
            data["func"](data["elem"], data["elem2"])
236
            flash(data['name'])
237
            return true
238
            --data["active"] = not data["active"]
239
            --print(name)
240
         end
241
      end
242
   end
243
   return false
244
end
245
246
-- Don't question my code, it works on my machine...
247
248
function label(w, h, text)
249
   mon.setCursorPos(w, h)
250
   mon.write(text)
251
end
252
253
-- Draw function : put's all the beautiful magic in the screen
254
255
function draw()
256
	for key,value in pairs(filleds) do
257
		local counter = 1
258
		for i=value[2],value[4],1 do
259
			paintutils.drawLine(value[1] , value[2]+counter, value[3], value[2]+counter, value[5])
260
			counter = counter + 1
261
		end
262
	end
263
264
	for key,value in pairs(boxes) do
265
		paintutils.drawLine(value[1] , value[2], value[1], value[4], value[5])
266
		paintutils.drawLine(value[1] , value[2], value[3], value[2], value[5])
267
		paintutils.drawLine(value[1] , value[4], value[3], value[4], value[5])
268
		paintutils.drawLine(value[3] , value[2], value[3], value[4], value[5])
269
	end
270
271
	for key,value in pairs(lines) do
272
		paintutils.drawLine(value[1] , value[2], value[3], value[4], value[5])
273
	end
274
275
	for key,value in pairs(texts) do
276
		mon.setCursorPos(value[1], value[2])
277
		mon.setTextColor(value[4])
278
		mon.setBackgroundColor(value[5])
279
		mon.write(value[3])
280
	end
281
	screen()
282
	resetDraw()
283
end
284
285
-- Resets the elements to draw to only draw the neccessity
286
287
function resetDraw()
288
	filleds = {}
289
	boxes = {}
290
	lines = {}
291
	texts = {}
292
end
293
294
-- Handles all the clicks for the buttons
295
296
function clickEvent()
297
	local myEvent={os.pullEvent("monitor_touch")}
298
	checkxy(myEvent[3], myEvent[4])
299
end
300
301
-- Power up the reactor (M&N are a good source of food right?)
302
303
function powerUp(m,n)
304
	local reactor = reactors[1]
305
	reactor.setActive(true)
306
end
307
308
-- Power down the reactor (M&N are a good source of food right?)
309
310
function powerDown(m,n)
311
	local reactor = reactors[1]
312
	reactor.setActive(false)
313
end
314
315
-- Handles and calculate the Min and Max of the power limitation
316
317
function modifyRods(limit, number)
318
	local tempLevel = 0
319
320
	if limit == "min" then
321
		tempLevel = minPowerRod + number
322
		if tempLevel <= 0 then
323
			minPowerRod = 0
324
		end
325
326
		if tempLevel >= maxPowerRod then
327
			minPowerRod = maxPowerRod -10
328
		end
329
330
		if tempLevel < maxPowerRod and tempLevel > 0 then
331
			minPowerRod = tempLevel
332
		end
333
	else
334
		tempLevel = maxPowerRod + number
335
		if tempLevel <= minPowerRod then
336
			maxPowerRod = minPowerRod +10
337
		end
338
339
		if tempLevel >= 100 then
340
			maxPowerRod = 100
341
		end
342
343
		if tempLevel > minPowerRod and tempLevel < 100 then
344
			maxPowerRod = tempLevel
345
		end
346
	end
347
348
	table.insert(lines, {controlsSize['inX'], controlsSize['inY'] +(controlsSize['sectionHeight']*1)+4, controlsSize['inX'] + controlsSize['width'], controlsSize['inY']+(controlsSize['sectionHeight']*1)+4, colors.black})
349
350
	table.insert(texts, {controlsSize['inX']+5, controlsSize['inY'] +(controlsSize['sectionHeight']*1)+4, minPowerRod .. '%', colors.lightBlue, colors.black})
351
	table.insert(texts, {controlsSize['inX']+13, controlsSize['inY'] +(controlsSize['sectionHeight']*1)+4, '--', colors.white, colors.black})
352
	table.insert(texts, {controlsSize['inX']+20, controlsSize['inY'] +(controlsSize['sectionHeight']*1)+4, maxPowerRod .. '%', colors.purple, colors.black})
353
354
	setInfoToFile()
355
	adjustRodsLevel()
356
end
357
358
-- Calculate and adjusts the level of the rods
359
-- TOMODIFY
360
function adjustRodsLevel()
361
	local reactor = reactors[1]
362
363
	local allStats = getAllStats()
364
	local currentRfTotal = allStats["rfTotal"]
365
	local reactorRodsLevel = allStats["reactorRodsLevel"]
366
367
	differenceMinMax = maxPowerRod - minPowerRod
368
369
	maxPower = (rfTotalMax/100) * maxPowerRod
370
	minPower = (rfTotalMax/100) * minPowerRod
371
372
	if currentRfTotal >= maxPower then
373
		currentRfTotal = maxPower
374
	end
375
376
	if currentRfTotal <= minPower then
377
		currentRfTotal = minPower
378
	end
379
380
	currentRfTotal = currentRfTotal - (rfTotalMax/100) * minPowerRod
381
382
	local rfInBetween = (rfTotalMax/100) * differenceMinMax
383
	local rodLevel = math.ceil((currentRfTotal/rfInBetween)*100)
384
	if VERSION == "EXTREME" then
385
		for key,value in pairs(reactorRodsLevel) do 
386
			reactorRodsLevel[key] = rodLevel
387
		end
388
		reactor.setControlRodsLevels(reactorRodsLevel)
389
	else
390
		reactor.setAllControlRodLevels(rodLevel)
391
	end
392
end
393
394
-- Creates the frame and the basic of the visual
395
-- Also adds the variables informations for placement of stuff and things
396
397
function addDrawBoxesSingleReactor()
398
	local w, h = mon.getSize()
399
	local margin = math.floor((w/100)*2)
400
401
	infosSize['startX'] = margin + 1
402
	infosSize['startY'] =  margin + 1
403
	infosSize['endX'] = (((w-(margin*2))/3)*2)-margin
404
	infosSize['endY'] = h - margin
405
	infosSize['height'] = infosSize['endY']-infosSize['startY']-(margin*2)-2
406
	infosSize['width'] = infosSize['endX']-infosSize['startX']-(margin*2)-2
407
	infosSize['inX'] = infosSize['startX'] + margin +1
408
	infosSize['inY'] = infosSize['startY'] + margin +1
409
	infosSize['sectionHeight'] = math.floor(infosSize['height']/3)
410
411
	table.insert(boxes, {infosSize['startX'] , infosSize['startY'], infosSize['endX'], infosSize['endY'], colors.gray})
412
	local name = "INFOS"
413
	table.insert(lines, {infosSize['startX'] + margin , infosSize['startY'], infosSize['startX'] + (margin*2) + #name+1, infosSize['startY'], colors.black})
414
	table.insert(texts, {infosSize['startX'] + (margin*2), infosSize['startY'], name, colors.white, colors.black})
415
416
	local names = {}
417
	names[1] = 'ENERGY LAST TICK'
418
	names[2] = 'ENERGY STORED'
419
	names[3] = 'CONTROL ROD LEVEL'
420
421
	for i=0,2,1 do
422
		table.insert(texts, {infosSize['inX'] + margin, infosSize['inY'] + (infosSize['sectionHeight']*i) +i, names[i+1], colors.white, colors.black})
423
		table.insert(filleds, {infosSize['inX'] , infosSize['inY'] + 2 + (infosSize['sectionHeight']*i) +i, infosSize['inX'] + infosSize['width'], infosSize['inY'] + (infosSize['sectionHeight']*(i+1))-2 +i, colors.lightGray})
424
	end
425
426
427
	-- Controls
428
429
	controlsSize['startX'] = infosSize['endX'] + margin + 1
430
	controlsSize['startY'] =  margin + 1
431
	controlsSize['endX'] = w-margin
432
	controlsSize['endY'] = (((h - (margin*2))/3)*2) +1
433
	controlsSize['height'] = controlsSize['endY']-controlsSize['startY']-(margin)-1
434
	controlsSize['width'] = controlsSize['endX']-controlsSize['startX']-(margin*2)-2
435
	controlsSize['inX'] = controlsSize['startX'] + margin +1
436
	controlsSize['inY'] = controlsSize['startY'] + margin
437
438
	table.insert(boxes, {controlsSize['startX'] , controlsSize['startY'], controlsSize['endX'], controlsSize['endY'], colors.gray})
439
	name = "CONTROLS"
440
	table.insert(lines, {controlsSize['startX'] + margin , controlsSize['startY'], controlsSize['startX'] + (margin*2) + #name+1, controlsSize['startY'], colors.black})
441
	table.insert(texts, {controlsSize['startX'] + (margin*2), controlsSize['startY'], name, colors.white, colors.black})
442
443
	controlsSize['sectionHeight'] = math.floor(controlsSize['height']/4)
444
445
	reactor = reactors[1]
446
447
	mon.setTextColor(colors.white)
448
	setButton("ON","ON", powerUp, controlsSize['inX'], controlsSize['inY'], controlsSize['inX'] + math.floor(controlsSize['width']/2) -1, controlsSize['inY'] +2, 0, 0, colors.green)
449
	setButton("OFF","OFF", powerDown, controlsSize['inX'] + math.floor(controlsSize['width']/2) +2, controlsSize['inY'], controlsSize['inX'] + controlsSize['width'], controlsSize['inY'] +2,0, 0, colors.red)
450
451
	table.insert(texts, {controlsSize['inX']+8, controlsSize['inY'] +(controlsSize['sectionHeight']*1)+1, 'AUTO-CONTROL', colors.white, colors.black})
452
453
	table.insert(texts, {controlsSize['inX']+5, controlsSize['inY'] +(controlsSize['sectionHeight']*1)+3, 'MIN', colors.lightBlue, colors.black})
454
	table.insert(texts, {controlsSize['inX']+5, controlsSize['inY'] +(controlsSize['sectionHeight']*1)+4, minPowerRod..'%', colors.lightBlue, colors.black})
455
456
	table.insert(texts, {controlsSize['inX']+13, controlsSize['inY'] +(controlsSize['sectionHeight']*1)+4, '--', colors.white, colors.black})
457
	table.insert(texts, {controlsSize['inX']+20, controlsSize['inY'] +(controlsSize['sectionHeight']*1)+3, 'MAX', colors.purple, colors.black})
458
	table.insert(texts, {controlsSize['inX']+20, controlsSize['inY'] +(controlsSize['sectionHeight']*1)+4, maxPowerRod..'%', colors.purple, colors.black})
459
	mon.setTextColor(colors.white)
460
461
	setButton("low-10","-10", modifyRods, controlsSize['inX'], controlsSize['inY'] +(controlsSize['sectionHeight']*2)+2, controlsSize['inX'] + math.floor(controlsSize['width']/2) -1, controlsSize['inY'] +(controlsSize['sectionHeight']*2)+4, "min", -10, colors.lightBlue)
462
	setButton("high-10","-10", modifyRods, controlsSize['inX'] + math.floor(controlsSize['width']/2) +2, controlsSize['inY'] +(controlsSize['sectionHeight']*2)+2, controlsSize['inX'] + controlsSize['width'], controlsSize['inY'] +(controlsSize['sectionHeight']*2)+4, "max", -10, colors.purple)
463
464
	setButton("low+10","+10", modifyRods, controlsSize['inX'], controlsSize['inY'] +(controlsSize['sectionHeight']*3)+2, controlsSize['inX'] + math.floor(controlsSize['width']/2) -1, controlsSize['inY'] +(controlsSize['sectionHeight']*3)+4, "min", 10, colors.lightBlue)
465
	setButton("high+10","+10", modifyRods, controlsSize['inX'] + math.floor(controlsSize['width']/2) +2, controlsSize['inY'] +(controlsSize['sectionHeight']*3)+2, controlsSize['inX'] + controlsSize['width'], controlsSize['inY'] +(controlsSize['sectionHeight']*3)+4, "max", 10, colors.purple)
466
467
	-- Numbers
468
469
	numbersSize['startX'] = infosSize['endX'] + margin + 1
470
	numbersSize['startY'] = controlsSize['endY'] + margin + 1
471
	numbersSize['endX'] = w-margin
472
	numbersSize['endY'] = h-margin
473
	numbersSize['height'] = numbersSize['endY']-numbersSize['startY']-(margin)-1
474
	numbersSize['width'] = numbersSize['endX']-numbersSize['startX']-(margin*2)-2
475
	numbersSize['inX'] = numbersSize['startX'] + margin +1
476
	numbersSize['inY'] = numbersSize['startY'] + margin
477
478
	table.insert(boxes, {numbersSize['startX'] , numbersSize['startY'], numbersSize['endX'], numbersSize['endY'], colors.gray})
479
	name = "NUMBERS"
480
	table.insert(lines, {numbersSize['startX'] + margin , numbersSize['startY'], numbersSize['startX'] + (margin*2) + #name+1, numbersSize['startY'], colors.black})
481
	table.insert(texts, {numbersSize['startX'] + (margin*2), numbersSize['startY'], name, colors.white, colors.black})
482
483
	refresh = true
484
	while refresh do
485
		parallel.waitForAny(refreshSingleReactor,clickEvent)
486
	end
487
end
488
489
-- Gets the stats needed for the program to function based on the version of the reactor
490
-- TOMODIFY
491
function getAllStats()
492
	local stats = {}
493
	local reactor = reactors[1]
494
495
	if VERSION == "EXTREME" then 
496
		local reactorEnergyStats = reactor.getEnergyStats()
497
		local reactorFuelStats = reactor.getFuelStats()
498
499
		stats["reactorRodsLevel"] = reactor.getControlRodsLevels()
500
		stats["rfTotal"] = math.floor(reactorEnergyStats["energyStored"])
501
		stats["rfPerTick"] = math.floor(reactorEnergyStats["energyProducedLastTick"])
502
		stats["rodLevel"] = stats["reactorRodsLevel"][0]
503
		stats["fuelPerTick"] = round(reactorFuelStats["fuelConsumedLastTick"], 2)
504
	elseif VERSION == "BIG" or VERSION == "BIGGERv1" then  
505
		stats["rfTotal"] = math.floor(reactor.getEnergyStored())
506
		stats["rfPerTick"] = math.floor(reactor.getEnergyProducedLastTick())
507
		stats["rodLevel"] = math.floor(reactor.getControlRodLevel(0))
508
		stats["fuelPerTick"] = reactor.getFuelConsumedLastTick()
509
	elseif VERSION == "BIGGERv2" then 
510
		stats["rfTotal"] = reactor.battery().stored()
511
		stats["rfPerTick"] = math.floor(reactor.battery().producedLastTick())
512
		stats["rodLevel"] = math.floor(reactor.getControlRod(0).level())
513
		stats["fuelPerTick"] = reactor.fuelTank().burnedLastTick()
514
	end
515
	
516
	return stats 
517
end
518
519
-- Makes and Handles the draw function for less lag in the visual
520
function refreshSingleReactor()
521
	local rfPerTick = 0
522
	local rfTotal = 0
523
	local reactor = reactors[1]
524
525
	local allStats = getAllStats()
526
	rfTotal = allStats["rfTotal"]
527
	rfPerTick = allStats["rfPerTick"]
528
	rodLevel = allStats["rodLevel"]
529
	fuelPerTick = allStats["fuelPerTick"]
530
531
	local i = 0
532
	local infotoAdd = 'RF PER TICK : '
533
534
	if currentRfTick ~= rfPerTick then
535
		currentRfTick = rfPerTick
536
		if rfPerTick > rfPerTickMax then
537
			rfPerTickMax = rfPerTick
538
		end
539
540
		table.insert(lines, {numbersSize['inX'] , numbersSize['inY'],numbersSize['inX'] + numbersSize['width'] , numbersSize['inY'], colors.black})
541
		table.insert(texts, {numbersSize['inX'], numbersSize['inY'], infotoAdd .. rfPerTick .. " RF", colors.white, colors.black})
542
		table.insert(filleds, {infosSize['inX'] , infosSize['inY'] + 1 + (infosSize['sectionHeight']*i) +i, infosSize['inX'] + infosSize['width'], infosSize['inY'] + (infosSize['sectionHeight']*(i+1))-2 +i, colors.lightGray})
543
544
		width = math.floor((infosSize['width'] / rfPerTickMax)*rfPerTick)
545
		table.insert(filleds, {infosSize['inX'] , infosSize['inY'] + 1 + (infosSize['sectionHeight']*i) +i, infosSize['inX'] + width, infosSize['inY'] + (infosSize['sectionHeight']*(i+1))-2 +i, colors.green})
546
547
	end
548
549
	i = 1
550
	infotoAdd = 'ENERGY STORED : '
551
	if currentRfTotal ~= rfTotal then
552
		currentRfTotal = rfTotal
553
554
		table.insert(filleds, {infosSize['inX'] , infosSize['inY'] + 1 + (infosSize['sectionHeight']*i) +i, infosSize['inX'] + infosSize['width'], infosSize['inY'] + (infosSize['sectionHeight']*(i+1))-2 +i, colors.lightGray})
555
556
		width = math.floor((infosSize['width'] / rfTotalMax)*rfTotal)
557
		table.insert(filleds, {infosSize['inX'] , infosSize['inY'] + 1 + (infosSize['sectionHeight']*i) +i, infosSize['inX'] + width, infosSize['inY'] + (infosSize['sectionHeight']*(i+1))-2 +i, colors.green})
558
		table.insert(lines, {numbersSize['inX'] , numbersSize['inY'] +2 ,numbersSize['inX'] + numbersSize['width'] , numbersSize['inY'] +2, colors.black})
559
		table.insert(texts, {numbersSize['inX'], numbersSize['inY']+ 2 , infotoAdd .. rfTotal .. " RF", colors.white, colors.black})
560
	end
561
562
	i = 2
563
	infotoAdd = 'CONTROL ROD LEVEL : '
564
	if currentRodLevel ~= rodLevel then
565
		currentRodLevel = rodLevel
566
567
		table.insert(filleds, {infosSize['inX'] , infosSize['inY'] + 1 + (infosSize['sectionHeight']*i) +i, infosSize['inX'] + infosSize['width'], infosSize['inY'] + (infosSize['sectionHeight']*(i+1))-2 +i, colors.lightGray})
568
569
		width = math.floor((infosSize['width'] / 100)*rodLevel)
570
		table.insert(filleds, {infosSize['inX'] , infosSize['inY'] + 1 + (infosSize['sectionHeight']*i) +i, infosSize['inX'] + width, infosSize['inY'] + (infosSize['sectionHeight']*(i+1))-2 +i, colors.green})
571
		table.insert(lines, {numbersSize['inX'] , numbersSize['inY']+4 ,numbersSize['inX'] + numbersSize['width'] , numbersSize['inY'] +4, colors.black})
572
		table.insert(texts, {numbersSize['inX'], numbersSize['inY']+ 4 , infotoAdd .. rodLevel .. "%", colors.white, colors.black})
573
	end
574
575
	i = 3
576
	infotoAdd = 'FUEL USAGE : '
577
	if currentFuelConsumedLastTick ~= fuelPerTick then
578
		currentFuelConsumedLastTick = fuelPerTick
579
580
		table.insert(lines, {numbersSize['inX'] , numbersSize['inY']+6 ,numbersSize['inX'] + numbersSize['width'] , numbersSize['inY'] +6, colors.black})
581
		table.insert(texts, {numbersSize['inX'], numbersSize['inY']+ 6 , infotoAdd .. format_num(tonumber(fuelPerTick),3) .. "mb/t", colors.white, colors.black})
582
	end
583
584
	mon.setTextColor(colors.white)
585
	adjustRodsLevel()
586
587
	draw()
588
589
	sleep(2)
590
end
591
592
--
593
-- ** Get the informations from the index file
594
-- line 1 = min ROD
595
-- line 2 = max ROD
596
--
597
598
function getInfoFromFile()
599
600
	 if (fs.exists(index..".txt") == false) then
601
	 	file = io.open(index..".txt","w")
602
	    file:write("0")
603
	    file:write("\n")
604
	    file:write("100")
605
	    file:close()
606
	else
607
		file = fs.open(index..".txt","r")
608
		minPowerRod = tonumber(file.readLine())
609
		maxPowerRod = tonumber(file.readLine())
610
	    file.close()
611
	end
612
end
613
614
-- Save informations to the index file
615
616
function setInfoToFile()
617
	file = io.open(index..".txt","w")
618
	file:write(minPowerRod .. "\n" .. maxPowerRod)
619
    file:flush()
620
    file:close()
621
end
622
623
---============================================================
624
-- add comma to separate thousands
625
-- From Lua-users.org/wiki/FormattingNumbers
626
--
627
--
628
function comma_value(amount)
629
  local formatted = amount
630
  while true do
631
    formatted, k = string.gsub(formatted, "^(-?%d+)(%d%d%d)", '%1,%2')
632
    if (k==0) then
633
      break
634
    end
635
  end
636
  return formatted
637
end
638
639
---============================================================
640
-- rounds a number to the nearest decimal places
641
-- From Lua-users.org/wiki/FormattingNumbers
642
--
643
--
644
function round(val, decimal)
645
  if (decimal) then
646
    return math.floor( (val * 10^decimal) + 0.5) / (10^decimal)
647
  else
648
    return math.floor(val+0.5)
649
  end
650
end
651
652
--===================================================================
653
-- given a numeric value formats output with comma to separate thousands
654
-- and rounded to given decimal places
655
-- From Lua-users.org/wiki/FormattingNumbers
656
--
657
function format_num(amount, decimal, prefix, neg_prefix)
658
  local str_amount,  formatted, famount, remain
659
660
  decimal = decimal or 2  -- default 2 decimal places
661
  neg_prefix = neg_prefix or "-" -- default negative sign
662
663
  famount = math.abs(round(amount,decimal))
664
  famount = math.floor(famount)
665
666
  remain = round(math.abs(amount) - famount, decimal)
667
668
        -- comma to separate the thousands
669
  formatted = comma_value(famount)
670
671
        -- attach the decimal portion
672
  if (decimal > 0) then
673
    remain = string.sub(tostring(remain),3)
674
    formatted = formatted .. "." .. remain ..
675
                string.rep("0", decimal - string.len(remain))
676
  end
677
678
        -- attach prefix string e.g '$'
679
  formatted = (prefix or "") .. formatted
680
681
        -- if value is negative then format accordingly
682
  if (amount<0) then
683
    if (neg_prefix=="()") then
684
      formatted = "("..formatted ..")"
685
    else
686
      formatted = neg_prefix .. formatted
687
    end
688
  end
689
690
  return formatted
691
end
692
693
-- Clear and make the pixel smaller because we are not blind
694
695
mon.setBackgroundColor(colors.black)
696
mon.clear()
697
mon.setTextScale(0.5)
698
699
-- Get the information from the index file
700
getInfoFromFile()
701
702
703
-- Add's the visual and starts the Loop
704
addDrawBoxesSingleReactor()