Commit 4078977abb37c79618647161fe3454e197c757c3
1 parent
3ef575ee
Prepare for first release to mod portal
Showing
8 changed files
with
103 additions
and
223 deletions
.vscode/launch.json
0 โ 100644
1 | +{ | ||
2 | + // Use IntelliSense to learn about possible attributes. | ||
3 | + // Hover to view descriptions of existing attributes. | ||
4 | + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 | ||
5 | + "version": "0.2.0", | ||
6 | + "configurations": [ | ||
7 | + { | ||
8 | + "type": "factoriomod", | ||
9 | + "request": "launch", | ||
10 | + "name": "Factorio Mod Debug", | ||
11 | + "modsPath": "C:/Program Files/Factorio/mods", | ||
12 | + "configPath": "C:/Program Files/Factorio/config/config.ini", | ||
13 | + "factorioPath": "C:/Program Files/Factorio/bin/x64/factorio.exe" | ||
14 | + } | ||
15 | + ] | ||
16 | +} | ||
0 | \ No newline at end of file | 17 | \ No newline at end of file |
CHANGELOG.md
0 โ 100644
1 | +# Changelog | ||
2 | +All notable changes to this project will be documented in this file. | ||
3 | + | ||
4 | +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), | ||
5 | +and this project adheres to the versioning of Factorio, so 0.18.x will be at least compatible / tested with Factorio 0.18.x. | ||
6 | + | ||
7 | +## [Released] | ||
8 | + | ||
9 | +## [0.18.0] - 2020-06-06 | ||
10 | +### General | ||
11 | +- Initial Release of the mod | ||
12 | +- Compatible with Factorio >0.18.0; tested on 0.18.30 | ||
13 | +- Based on the 4-Function Calculator found in the [Max Rate Calculator](https://mods.factorio.com/mod/MaxRateCalculator) mod by [Theanderblast](https://mods.factorio.com/user/theanderblast) | ||
14 | + | ||
15 | +### Added | ||
16 | +- History of recent calculations | ||
17 | +- Possibility to copy recent calculations to the current one (with shift+left-click) | ||
18 | +- Substitutes some functions & "constants" of the Lua [math-lib](http://lua-users.org/wiki/MathLibraryTutorial) | ||
19 | + - abs() -> math.abs() | ||
20 | + - acos() -> math.acos() | ||
21 | + - asin() -> math.asin() | ||
22 | + - atan() -> math.atan() | ||
23 | + - ceil() -> math.ceil() | ||
24 | + - floor() -> math.floor() | ||
25 | + - cos() -> math.cos() | ||
26 | + - sin() -> math.sin() | ||
27 | + - tan() -> math.tan() | ||
28 | + - deg() -> math.deg() | ||
29 | + - rad() -> math.rad() | ||
30 | + - exp() -> math.exp() | ||
31 | + - log() -> math.log() | ||
32 | + - min() -> math.min() | ||
33 | + - max() -> math.max() | ||
34 | + - modf() -> math.modf() | ||
35 | + - sqrt() -> math.sqrt() | ||
36 | + - huge -> math.huge | ||
37 | + - pi -> math.pi | ||
38 | +- Allows the use of "%" (percent sign) in the calculation | ||
39 | +- A little easter egg :-) | ||
40 | +- Setting for number of decimal places in result (Default: 2). Exact value will be displayed in the tooltip | ||
41 | +- Setting if triggering the calculation should clear the current equation (Default: no) | ||
42 | + | ||
43 | +### Changed | ||
44 | +- Made the buttons slightly bigger, so that it's better readable on streams. | ||
45 | +- Allows to make "complex" calculations with parentheses | ||
46 | +- Allows pretty much all characters in the equation field | ||
47 | + - but the "=" (equal sign) will trigger the calculation | ||
48 | + | ||
49 | +### Removed | ||
50 | +- Got rid of the memory functions - but introduced the list of recent calculations instead | ||
0 | \ No newline at end of file | 51 | \ No newline at end of file |
README.md
0 โ 100644
1 | +# Calculator UI | ||
2 | + | ||
3 | +Calculator UI is a Factorio mod which adds a calculator to the Factorio game with the goal to have a little bit of usability behind it. | ||
4 | + | ||
5 | +## Based on | ||
6 | +The 4-Function Calculator found in the [Max Rate Calculator](https://mods.factorio.com/mod/MaxRateCalculator) mod by [Theanderblast](https://mods.factorio.com/user/theanderblast). | ||
7 | + | ||
8 | +## Features | ||
9 | +- List of recent calculations | ||
10 | +- Use of parentheses in the equation | ||
11 | +- rounding of numbers (number of decimal places can be set in the settings) | ||
12 | +- copy a recent calculation into the current calculation (by shift+left-click on the equation you want to copy) | ||
13 | +- a nifty little easter egg ;-) | ||
14 | +- use of some advanced function and constants of the Lua [math-lib](http://lua-users.org/wiki/MathLibraryTutorial) (without math.) -> e.g. "pi" instead of "math.pi". | ||
15 | + | ||
16 | +## Installation | ||
17 | +Well ... ehm ... search for the mod ingame and install it :-) | ||
18 | + | ||
19 | +## Usage | ||
20 | +Press the 3 little dots on the shortcuts UI of Factorio to select the "Calculator". Afterwards you can click on the calculator symbol to open it. | ||
21 | + | ||
22 | +## Changelog | ||
23 | +see separate [changelog](changelog.md) | ||
24 | + | ||
25 | +## License | ||
26 | +[MIT](https://choosealicense.com/licenses/mit/) | ||
0 | \ No newline at end of file | 27 | \ No newline at end of file |
calculator.lua
@@ -218,8 +218,8 @@ function fix_equation(equation) | @@ -218,8 +218,8 @@ function fix_equation(equation) | ||
218 | ["tan"] = "math.tan", | 218 | ["tan"] = "math.tan", |
219 | ["deg"] = "math.deg", | 219 | ["deg"] = "math.deg", |
220 | ["rad"] = "math.rad", | 220 | ["rad"] = "math.rad", |
221 | - ["exp"] = "math.log", | ||
222 | - ["exp"] = "math.log", | 221 | + ["exp"] = "math.exp", |
222 | + ["log"] = "math.log", | ||
223 | ["min"] = "math.min", | 223 | ["min"] = "math.min", |
224 | ["max"] = "math.max", | 224 | ["max"] = "math.max", |
225 | ["modf"] = "math.modf", | 225 | ["modf"] = "math.modf", |
@@ -292,6 +292,10 @@ function process_equal_key(player, button) | @@ -292,6 +292,10 @@ function process_equal_key(player, button) | ||
292 | end | 292 | end |
293 | end | 293 | end |
294 | end | 294 | end |
295 | + | ||
296 | + if settings.get_player_settings(player)["calcui-clear-on-calc"].value then | ||
297 | + clear_equation(player) | ||
298 | + end | ||
295 | end | 299 | end |
296 | 300 | ||
297 | -- ---------------------------------------------------------------- | 301 | -- ---------------------------------------------------------------- |
@@ -390,194 +394,4 @@ function calcui_on_gui_location_changed(event) | @@ -390,194 +394,4 @@ function calcui_on_gui_location_changed(event) | ||
390 | local root = get_gui_root(player) | 394 | local root = get_gui_root(player) |
391 | root.calcui.location = event.element.location | 395 | root.calcui.location = event.element.location |
392 | end | 396 | end |
393 | -end | ||
394 | - | ||
395 | - | ||
396 | - | ||
397 | - | ||
398 | - | ||
399 | - | ||
400 | --- -- ---------------------------------------------------------------- | ||
401 | --- local function process_number_key(player, num) | ||
402 | - -- debug_print("process_number_key(" .. num .. ")") | ||
403 | - | ||
404 | - -- if global.calcui_context[player.index].in_left_of_decimal then | ||
405 | - -- val = num / global.calcui_context[player.index].decimal_place | ||
406 | - -- if global.calcui_context[player.index].in_data_entry then | ||
407 | - -- global.calcui_context[player.index].current_value = global.calcui_context[player.index].current_value + val | ||
408 | - -- else | ||
409 | - -- global.calcui_context[player.index].current_value = val | ||
410 | - -- end | ||
411 | - -- global.calcui_context[player.index].decimal_place = global.calcui_context[player.index].decimal_place * 10 | ||
412 | - -- else | ||
413 | - -- if global.calcui_context[player.index].in_data_entry then | ||
414 | - -- global.calcui_context[player.index].current_value = global.calcui_context[player.index].current_value * 10 + num | ||
415 | - -- else | ||
416 | - -- global.calcui_context[player.index].current_value = tonumber(num) | ||
417 | - -- end | ||
418 | - -- end | ||
419 | - -- global.calcui_context[player.index].in_data_entry = true | ||
420 | - -- update_display(player) | ||
421 | --- end | ||
422 | - | ||
423 | --- -- ---------------------------------------------------------------- | ||
424 | --- local function process_decimal_key(player, key) | ||
425 | - -- debug_print("process_decimal_key(" .. key .. ")") | ||
426 | - -- if global.calcui_context[player.index].in_left_of_decimal then | ||
427 | - -- return | ||
428 | - -- end | ||
429 | - | ||
430 | - -- global.calcui_context[player.index].in_left_of_decimal = true | ||
431 | - -- global.calcui_context[player.index].decimal_place = 10 | ||
432 | - -- update_display(player) | ||
433 | --- end | ||
434 | - | ||
435 | --- -- ---------------------------------------------------------------- | ||
436 | --- local function process_change_sign_key(player, key) | ||
437 | - -- global.calcui_context[player.index].current_value = global.calcui_context[player.index].current_value * -1 | ||
438 | - -- update_display(player) | ||
439 | --- end | ||
440 | - | ||
441 | --- -- ---------------------------------------------------------------- | ||
442 | --- local function process_equal_key(player, key) | ||
443 | - -- debug_print("process_equal_key(" .. key .. ") global.calcui_context[player.index].current_func is " .. global.calcui_context[player.index].current_func) | ||
444 | - | ||
445 | - -- global.calcui_context[player.index].in_data_entry = false | ||
446 | - -- doing_decimal = false | ||
447 | - | ||
448 | - -- if global.calcui_context[player.index].current_func == "ADD" then | ||
449 | - -- global.calcui_context[player.index].current_value = global.calcui_context[player.index].operand + global.calcui_context[player.index].current_value | ||
450 | - -- elseif global.calcui_context[player.index].current_func == "SUB" then | ||
451 | - -- global.calcui_context[player.index].current_value = global.calcui_context[player.index].operand - global.calcui_context[player.index].current_value | ||
452 | - -- elseif global.calcui_context[player.index].current_func == "MUL" then | ||
453 | - -- global.calcui_context[player.index].current_value = global.calcui_context[player.index].operand * global.calcui_context[player.index].current_value | ||
454 | - -- elseif global.calcui_context[player.index].current_func == "DIV" then | ||
455 | - -- debug_print("process_equal_key global.calcui_context[player.index].current_value " .. global.calcui_context[player.index].current_value) | ||
456 | - | ||
457 | - -- if global.calcui_context[player.index].current_value == 0 then | ||
458 | - -- debug_print("process_equal_key DIVIDE BY ZERO") | ||
459 | - -- update_display(player, {"calcui_divide_by_zero"}) -- TODO: localize | ||
460 | - -- return | ||
461 | - -- end | ||
462 | - -- global.calcui_context[player.index].current_value = global.calcui_context[player.index].operand / global.calcui_context[player.index].current_value | ||
463 | - -- end | ||
464 | - -- global.calcui_context[player.index].current_func = "" | ||
465 | - -- global.calcui_context[player.index].in_data_entry = false | ||
466 | - -- update_display(player) | ||
467 | --- end | ||
468 | - | ||
469 | --- -- ---------------------------------------------------------------- | ||
470 | --- local function process_func_key(player, key) | ||
471 | - -- debug_print("process_func_key(" .. key .. ")") | ||
472 | - | ||
473 | - -- if global.calcui_context[player.index].current_func ~= "" then | ||
474 | - -- process_equal_key(player, key) | ||
475 | - -- end | ||
476 | - | ||
477 | - -- global.calcui_context[player.index].current_func = key | ||
478 | - -- global.calcui_context[player.index].operand = global.calcui_context[player.index].current_value | ||
479 | - -- global.calcui_context[player.index].in_data_entry = false | ||
480 | - -- global.calcui_context[player.index].in_left_of_decimal = false | ||
481 | --- end | ||
482 | - | ||
483 | --- -- ---------------------------------------------------------------- | ||
484 | --- local function process_mem_key(player, key) | ||
485 | - -- debug_print("process_mem_key(" .. key .. ")") | ||
486 | - -- if calculator_memory == nil then | ||
487 | - -- debug_print("process_mem_key(" .. key .. ") calculator_memory was nil") | ||
488 | - -- calculator_memory = 0 | ||
489 | - -- end | ||
490 | - -- if key == "MS" then | ||
491 | - -- calculator_memory = global.calcui_context[player.index].current_value | ||
492 | - -- elseif key == "M+" then | ||
493 | - -- calculator_memory = calculator_memory + global.calcui_context[player.index].current_value | ||
494 | - -- elseif key == "M-" then | ||
495 | - -- calculator_memory = calculator_memory - global.calcui_context[player.index].current_value | ||
496 | - -- else | ||
497 | - -- global.calcui_context[player.index].current_value = calculator_memory | ||
498 | - -- end | ||
499 | - -- global.calcui_context[player.index].in_data_entry = false | ||
500 | - -- update_display(player) | ||
501 | --- end | ||
502 | - | ||
503 | --- -- ---------------------------------------------------------------- | ||
504 | --- local function process_edit_key(player, key) | ||
505 | - -- debug_print("process_edit_key(" .. key .. ")") | ||
506 | - -- if key == "CE" then | ||
507 | - -- global.calcui_context[player.index].current_value = 0 | ||
508 | - -- elseif key == "C" then | ||
509 | - -- init_calculator(player) | ||
510 | - -- end | ||
511 | - -- global.calcui_context[player.index].in_data_entry = false | ||
512 | - -- update_display(player) | ||
513 | --- end | ||
514 | - | ||
515 | --- -- ---------------------------------------------------------------- | ||
516 | --- local function set_current_value_to_text(player, text) | ||
517 | - -- local last_char = string.sub(text, -1) | ||
518 | - -- if last_char == "+" then | ||
519 | - -- process_func_key(player, "ADD") | ||
520 | - -- elseif last_char == "-" then | ||
521 | - -- process_func_key(player, "SUB") | ||
522 | - -- elseif last_char == "*" then | ||
523 | - -- process_func_key(player, "MUL") | ||
524 | - -- elseif last_char == "/" then | ||
525 | - -- process_func_key(player, "DIV") | ||
526 | - -- else | ||
527 | - -- -- number | ||
528 | - -- local val = tonumber(text) | ||
529 | - -- if val ~= nil then | ||
530 | - -- global.calcui_context[player.index].current_value = val | ||
531 | - -- debug_print("set_current_value_to_text got value " .. text) | ||
532 | - -- local plain_text = true | ||
533 | - -- local dot = string.find(text, '.', 1, plain_text) | ||
534 | - -- if dot ~= nil then | ||
535 | - -- local number_decimal_places = #text - dot | ||
536 | - -- global.calcui_context[player.index].decimal_place = 10 ^ (number_decimal_places + 1) | ||
537 | - -- global.calcui_context[player.index].in_left_of_decimal = true | ||
538 | - -- debug_print("#text " .. #text .. " number_global.calcui_context[player.index].decimal_places " .. | ||
539 | - -- number_decimal_places .. " global.calcui_context[player.index].decimal_place " .. global.calcui_context[player.index].decimal_place .. " dot " .. dot .. " in_lod " .. boolstr(global.calcui_context[player.index].in_left_of_decimal)) | ||
540 | - -- else | ||
541 | - -- debug_print("set_current_value_to_text no dot. set lod to false" ) | ||
542 | - -- global.calcui_context[player.index].in_left_of_decimal = false | ||
543 | - -- end | ||
544 | - -- else | ||
545 | - -- debug_print("got junk") | ||
546 | - -- end | ||
547 | - -- end | ||
548 | --- end | ||
549 | - | ||
550 | --- -- ---------------------------------------------------------------- | ||
551 | --- local function process_backspace_key(player, key) | ||
552 | - -- local root = get_gui_root(player) | ||
553 | - -- debug_print("process_backspace_key(" .. key .. ")") | ||
554 | - -- local old_text = root.calcui.calcui_display.caption | ||
555 | - -- local old_len = #old_text | ||
556 | - -- text = string.sub(old_text, 1, old_len -1) | ||
557 | - -- debug_print("process_backspace_key(" .. key .. ") old_text " .. old_text .. " old_len " .. old_len .. " text " .. text .. | ||
558 | - -- " in_decimal " .. boolstr(global.calcui_context[player.index].in_left_of_decimal) .. " global.calcui_context[player.index].decimal_place " .. global.calcui_context[player.index].decimal_place) | ||
559 | - -- if #text == 0 then | ||
560 | - -- global.calcui_context[player.index].current_value = 0 | ||
561 | - -- else | ||
562 | - -- set_current_value_to_text(player, text) | ||
563 | - -- end | ||
564 | - -- update_display(player) | ||
565 | --- end | ||
566 | - | ||
567 | --- -- ---------------------------------------------------------------- | ||
568 | --- local function calcui_toggle_key(event) | ||
569 | - -- local player = game.players[event.player_index] | ||
570 | - -- toggle_calculator(player) | ||
571 | --- end | ||
572 | - | ||
573 | --- -- ---------------------------------------------------------------- | ||
574 | --- function calcui_clickable_value_clicked(player, val) -- a value in the main Max Rate Calculator has been clicked on. Paste into current value | ||
575 | - -- local root = get_gui_root(player) | ||
576 | - -- if root ~=nil and root.calcui ~= nil then | ||
577 | - -- local text = tostring(val) | ||
578 | - -- set_current_value_to_text(player, text) | ||
579 | - -- update_display(player) | ||
580 | - -- end | ||
581 | --- end | ||
582 | - | ||
583 | --- script.on_event( "calcui_toggle", calcui_toggle_key ) | ||
584 | \ No newline at end of file | 397 | \ No newline at end of file |
398 | +end | ||
585 | \ No newline at end of file | 399 | \ No newline at end of file |
control.lua
@@ -28,7 +28,6 @@ end | @@ -28,7 +28,6 @@ end | ||
28 | 28 | ||
29 | -- ---------------------------------------------------------------- | 29 | -- ---------------------------------------------------------------- |
30 | local function get_gui_root(player) | 30 | local function get_gui_root(player) |
31 | - -- return player.gui.left | ||
32 | return player.gui.screen | 31 | return player.gui.screen |
33 | end | 32 | end |
34 | 33 | ||
@@ -52,10 +51,7 @@ end | @@ -52,10 +51,7 @@ end | ||
52 | local function on_gui_click(event) | 51 | local function on_gui_click(event) |
53 | local event_name = event.element.name | 52 | local event_name = event.element.name |
54 | debug_print("event_name " .. event_name) | 53 | debug_print("event_name " .. event_name) |
55 | - -- local calcui_prefix = "calcui_" | ||
56 | - -- local possible_calcui_prefix = string.sub( event_name, 1, string.len(calcui_prefix) ) | ||
57 | local player = game.players[event.player_index] | 54 | local player = game.players[event.player_index] |
58 | - -- local root = get_gui_root(player) | ||
59 | 55 | ||
60 | local calcui_prefix = "calcui_" | 56 | local calcui_prefix = "calcui_" |
61 | local possible_marcalc_prefix = string.sub( event_name, 1, string.len(calcui_prefix)) | 57 | local possible_marcalc_prefix = string.sub( event_name, 1, string.len(calcui_prefix)) |
@@ -63,25 +59,6 @@ local function on_gui_click(event) | @@ -63,25 +59,6 @@ local function on_gui_click(event) | ||
63 | handle_calcui_click(event, player) | 59 | handle_calcui_click(event, player) |
64 | return | 60 | return |
65 | end | 61 | end |
66 | - | ||
67 | - -- if possible_calcui_prefix == calcui_prefix then | ||
68 | - -- if event_name == "calcui_calculator_button" then | ||
69 | - -- toggle_calculator(player) | ||
70 | - -- return | ||
71 | - -- end | ||
72 | - | ||
73 | - -- if root.calcui_gui_top then | ||
74 | - -- if event_name == "calcui_close_button" then | ||
75 | - -- destroy_calcui_gui(player) | ||
76 | - -- hide_calculator(player) | ||
77 | - -- end | ||
78 | - -- elseif event_name == "calcui_close_button" then | ||
79 | - -- if player.gui.left.calcui_gui_top then | ||
80 | - -- player.gui.left.calcui_gui_top.destroy() | ||
81 | - -- hide_calculator(player) | ||
82 | - -- end | ||
83 | - -- end | ||
84 | - -- end | ||
85 | end | 62 | end |
86 | 63 | ||
87 | -- ---------------------------------------------------------------- | 64 | -- ---------------------------------------------------------------- |
@@ -90,9 +67,6 @@ local function on_gui_confirmed(event) | @@ -90,9 +67,6 @@ local function on_gui_confirmed(event) | ||
90 | player = game.players[event.player_index]; | 67 | player = game.players[event.player_index]; |
91 | if event.element.name == "calcui_display" then | 68 | if event.element.name == "calcui_display" then |
92 | process_equal_key(player) | 69 | process_equal_key(player) |
93 | - if settings.get_player_settings(player)["calcui-enter-clear"].value then | ||
94 | - clear_equation(player) | ||
95 | - end | ||
96 | end | 70 | end |
97 | end | 71 | end |
98 | 72 | ||
@@ -118,4 +92,4 @@ script.on_event( defines.events.on_gui_click, on_gui_click) | @@ -118,4 +92,4 @@ script.on_event( defines.events.on_gui_click, on_gui_click) | ||
118 | script.on_event( defines.events.on_gui_confirmed, on_gui_confirmed) | 92 | script.on_event( defines.events.on_gui_confirmed, on_gui_confirmed) |
119 | script.on_event( defines.events.on_gui_text_changed, calcui_on_gui_text_changed ) | 93 | script.on_event( defines.events.on_gui_text_changed, calcui_on_gui_text_changed ) |
120 | script.on_event( defines.events.on_gui_location_changed, calcui_on_gui_location_changed ) | 94 | script.on_event( defines.events.on_gui_location_changed, calcui_on_gui_location_changed ) |
121 | -commands.add_command( "calcui", "Max Rate Calculator [ debug | nodebug ] ", on_calcui_command ) | ||
122 | \ No newline at end of file | 95 | \ No newline at end of file |
96 | +commands.add_command( "calcui", "Calculator UI [ debug | nodebug ] ", on_calcui_command ) | ||
123 | \ No newline at end of file | 97 | \ No newline at end of file |
locale/en/config.cfg
@@ -3,11 +3,11 @@ calcui_4func=Calculator | @@ -3,11 +3,11 @@ calcui_4func=Calculator | ||
3 | 3 | ||
4 | [mod-setting-name] | 4 | [mod-setting-name] |
5 | calcui-decimal-places=Decimal places | 5 | calcui-decimal-places=Decimal places |
6 | -calcui-enter-clear=Clear equation on enter? | 6 | +calcui-clear-on-calc=Clear equation on calculation |
7 | 7 | ||
8 | [mod-settings-description] | 8 | [mod-settings-description] |
9 | calcui-decimal-places=Number of decimal places in the result | 9 | calcui-decimal-places=Number of decimal places in the result |
10 | -calcui-enter-clear=Should pressing the enter key delete the equation? | 10 | +calcui-clear-on-calc=Should trigger the calculation delete the equation? |
11 | 11 | ||
12 | [calculator-ui] | 12 | [calculator-ui] |
13 | title=Calculator | 13 | title=Calculator |
settings.lua
@@ -11,7 +11,7 @@ data:extend({ | @@ -11,7 +11,7 @@ data:extend({ | ||
11 | { | 11 | { |
12 | type = "bool-setting", | 12 | type = "bool-setting", |
13 | default_value = 0, | 13 | default_value = 0, |
14 | - name = "calcui-enter-clear", | 14 | + name = "calcui-clear-on-calc", |
15 | setting_type = "runtime-per-user", | 15 | setting_type = "runtime-per-user", |
16 | default_value = false | 16 | default_value = false |
17 | } | 17 | } |
thumbnail.png
0 โ 100644
17.7 KB