initial commit
This commit is contained in:
commit
a811ec65f0
11 changed files with 566 additions and 0 deletions
2
.gitattributes
vendored
Normal file
2
.gitattributes
vendored
Normal file
|
@ -0,0 +1,2 @@
|
|||
# Normalize EOL for all files that Git considers text files.
|
||||
* text=auto eol=lf
|
9
.gitignore
vendored
Normal file
9
.gitignore
vendored
Normal file
|
@ -0,0 +1,9 @@
|
|||
# Godot 4+ specific ignores
|
||||
.godot/
|
||||
|
||||
# builds
|
||||
target/
|
||||
|
||||
# direnv
|
||||
/.envrc
|
||||
/.direnv/
|
39
export_presets.cfg
Normal file
39
export_presets.cfg
Normal file
|
@ -0,0 +1,39 @@
|
|||
[preset.0]
|
||||
|
||||
name="Linux/X11"
|
||||
platform="Linux/X11"
|
||||
runnable=true
|
||||
dedicated_server=false
|
||||
custom_features=""
|
||||
export_filter="all_resources"
|
||||
include_filter=""
|
||||
exclude_filter="target/*"
|
||||
export_path="target/MindustryTools.x86_64"
|
||||
encryption_include_filters=""
|
||||
encryption_exclude_filters=""
|
||||
encrypt_pck=false
|
||||
encrypt_directory=false
|
||||
|
||||
[preset.0.options]
|
||||
|
||||
custom_template/debug=""
|
||||
custom_template/release=""
|
||||
debug/export_console_wrapper=0
|
||||
binary_format/embed_pck=true
|
||||
texture_format/bptc=true
|
||||
texture_format/s3tc=true
|
||||
texture_format/etc=false
|
||||
texture_format/etc2=false
|
||||
binary_format/architecture="x86_64"
|
||||
ssh_remote_deploy/enabled=false
|
||||
ssh_remote_deploy/host="user@host_ip"
|
||||
ssh_remote_deploy/port="22"
|
||||
ssh_remote_deploy/extra_args_ssh=""
|
||||
ssh_remote_deploy/extra_args_scp=""
|
||||
ssh_remote_deploy/run_script="#!/usr/bin/env bash
|
||||
export DISPLAY=:0
|
||||
unzip -o -q \"{temp_dir}/{archive_name}\" -d \"{temp_dir}\"
|
||||
\"{temp_dir}/{exe_name}\" {cmd_args}"
|
||||
ssh_remote_deploy/cleanup_script="#!/usr/bin/env bash
|
||||
kill $(pgrep -x -f \"{temp_dir}/{exe_name} {cmd_args}\")
|
||||
rm -rf \"{temp_dir}\""
|
61
flake.lock
Normal file
61
flake.lock
Normal file
|
@ -0,0 +1,61 @@
|
|||
{
|
||||
"nodes": {
|
||||
"flake-utils": {
|
||||
"inputs": {
|
||||
"systems": "systems"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1701680307,
|
||||
"narHash": "sha256-kAuep2h5ajznlPMD9rnQyffWG8EM/C73lejGofXvdM8=",
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"rev": "4022d587cbbfd70fe950c1e2083a02621806a725",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1704161960,
|
||||
"narHash": "sha256-QGua89Pmq+FBAro8NriTuoO/wNaUtugt29/qqA8zeeM=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "63143ac2c9186be6d9da6035fa22620018c85932",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "NixOS",
|
||||
"ref": "nixpkgs-unstable",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"root": {
|
||||
"inputs": {
|
||||
"flake-utils": "flake-utils",
|
||||
"nixpkgs": "nixpkgs"
|
||||
}
|
||||
},
|
||||
"systems": {
|
||||
"locked": {
|
||||
"lastModified": 1681028828,
|
||||
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||
"owner": "nix-systems",
|
||||
"repo": "default",
|
||||
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-systems",
|
||||
"repo": "default",
|
||||
"type": "github"
|
||||
}
|
||||
}
|
||||
},
|
||||
"root": "root",
|
||||
"version": 7
|
||||
}
|
122
flake.nix
Normal file
122
flake.nix
Normal file
|
@ -0,0 +1,122 @@
|
|||
{
|
||||
inputs = {
|
||||
nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
|
||||
flake-utils.url = "github:numtide/flake-utils";
|
||||
};
|
||||
|
||||
outputs = { self, nixpkgs, flake-utils, ... }:
|
||||
let
|
||||
inherit (builtins) substring;
|
||||
version = "${substring 0 8 self.lastModifiedDate}_${self.shortRev or "dirty"}";
|
||||
|
||||
mkGodotEmailTemplates = { stdenv, fetchurl, unzip, lib, ... }:
|
||||
stdenv.mkDerivation rec {
|
||||
pname = "godot-email-templates";
|
||||
version = "4.2.1-stable";
|
||||
src = fetchurl {
|
||||
url = "https://github.com/godotengine/godot/releases/download/${version}/Godot_v${version}_export_templates.tpz";
|
||||
hash = "sha256-xfFA61eEY6L6FAfzXjfBeqNKS4R7nTDinDhHuV5t2gc=";
|
||||
};
|
||||
nativeBuildInputs = [ unzip ];
|
||||
unpackPhase = ''
|
||||
mkdir $out
|
||||
unzip $src
|
||||
mv templates $out/${lib.replaceStrings ["-"] ["."] version}
|
||||
'';
|
||||
};
|
||||
|
||||
mkMindustryTools =
|
||||
{ stdenv
|
||||
, lib
|
||||
, vulkan-loader
|
||||
, libGL
|
||||
, libX11
|
||||
, libXcursor
|
||||
, libXinerama
|
||||
, libXext
|
||||
, libXrandr
|
||||
, libXrender
|
||||
, libXi
|
||||
, libXfixes
|
||||
, libxkbcommon
|
||||
, alsa-lib
|
||||
, libpulseaudio
|
||||
, dbus
|
||||
, speechd
|
||||
, fontconfig
|
||||
, udev
|
||||
, makeWrapper
|
||||
, autoPatchelfHook
|
||||
, godot_4
|
||||
, godotEmailTemplates
|
||||
, ...
|
||||
}:
|
||||
stdenv.mkDerivation {
|
||||
pname = "mindustry-tools";
|
||||
inherit version;
|
||||
|
||||
src = ./.;
|
||||
|
||||
nativeBuildInputs = [
|
||||
autoPatchelfHook
|
||||
makeWrapper
|
||||
godot_4
|
||||
];
|
||||
|
||||
runtimeDependencies = [
|
||||
vulkan-loader
|
||||
libGL
|
||||
libX11
|
||||
libXcursor
|
||||
libXinerama
|
||||
libXext
|
||||
libXrandr
|
||||
libXrender
|
||||
libXi
|
||||
libXfixes
|
||||
libxkbcommon
|
||||
alsa-lib
|
||||
libpulseaudio
|
||||
dbus
|
||||
dbus.lib
|
||||
speechd
|
||||
fontconfig
|
||||
fontconfig.lib
|
||||
udev
|
||||
];
|
||||
|
||||
buildPhase = ''
|
||||
export HOME=$(pwd)
|
||||
mkdir -p .local/share/godot/export_templates/
|
||||
cp -r ${godotEmailTemplates}/* .local/share/godot/export_templates
|
||||
godot4 --headless --export-release "Linux/X11" mindustry-tools
|
||||
# godot4 --headless --export-debug "Linux/X11" mindustry-tools
|
||||
'';
|
||||
|
||||
installPhase = ''
|
||||
install -m755 -D mindustry-tools $out/bin/mindustry-tools
|
||||
'';
|
||||
};
|
||||
in
|
||||
flake-utils.lib.eachDefaultSystem (system:
|
||||
let
|
||||
inherit (builtins) mapAttrs;
|
||||
pkgs = import nixpkgs { inherit system; };
|
||||
|
||||
godotEmailTemplates = pkgs.callPackage mkGodotEmailTemplates { };
|
||||
mindustryTools = pkgs.callPackage mkMindustryTools { inherit godotEmailTemplates; };
|
||||
|
||||
mkApp = drv: flake-utils.lib.mkApp { inherit drv; };
|
||||
packages = {
|
||||
default = mindustryTools;
|
||||
email-templates = godotEmailTemplates;
|
||||
};
|
||||
in
|
||||
{
|
||||
check = packages;
|
||||
|
||||
inherit packages;
|
||||
|
||||
apps = mapAttrs (name: mkApp) packages;
|
||||
});
|
||||
}
|
24
project.godot
Normal file
24
project.godot
Normal file
|
@ -0,0 +1,24 @@
|
|||
; Engine configuration file.
|
||||
; It's best edited using the editor UI and not directly,
|
||||
; since the parameters that go here are not all obvious.
|
||||
;
|
||||
; Format:
|
||||
; [section] ; section goes between []
|
||||
; param=value ; assign values to parameters
|
||||
|
||||
config_version=5
|
||||
|
||||
[application]
|
||||
|
||||
config/name="MindustryTools"
|
||||
config/version="0.0.1"
|
||||
run/main_scene="res://src/energy/EnergyTable.tscn"
|
||||
config/features=PackedStringArray("4.2", "GL Compatibility")
|
||||
boot_splash/show_image=false
|
||||
boot_splash/fullsize=false
|
||||
boot_splash/use_filter=false
|
||||
|
||||
[rendering]
|
||||
|
||||
renderer/rendering_method="gl_compatibility"
|
||||
renderer/rendering_method.mobile="gl_compatibility"
|
45
src/energy/EnergyTable.gd
Normal file
45
src/energy/EnergyTable.gd
Normal file
|
@ -0,0 +1,45 @@
|
|||
extends Control
|
||||
|
||||
const table_row = preload("res://src/energy/EnergyTableRow.tscn")
|
||||
@onready var table_body = $VBoxContainer/TableBody/VBoxContainer
|
||||
@onready var total_energy_label = $VBoxContainer/TableSummary/HBoxContainer/TotalEnergyLabel
|
||||
|
||||
var data = [{ }]
|
||||
|
||||
|
||||
func render_total_energy_label():
|
||||
var total_energy = 0
|
||||
for data_row in data:
|
||||
total_energy += data_row["instance"].energy
|
||||
|
||||
total_energy_label.text = str(total_energy)
|
||||
|
||||
func _on_energy_changed(_value: int):
|
||||
render_total_energy_label()
|
||||
|
||||
func _on_table_row_deleted(instance: Node):
|
||||
table_body.remove_child(instance)
|
||||
for i in range(0, data.size()):
|
||||
var data_row = data[i]
|
||||
if data_row["instance"] == instance:
|
||||
data.pop_at(i)
|
||||
break
|
||||
render_total_energy_label()
|
||||
|
||||
func add_row(data_row: Dictionary):
|
||||
var instance = table_row.instantiate()
|
||||
table_body.add_child(instance)
|
||||
instance.energy_changed.connect(_on_energy_changed)
|
||||
instance.deleted.connect(_on_table_row_deleted)
|
||||
data_row["instance"] = instance
|
||||
|
||||
func _ready():
|
||||
for data_row in data:
|
||||
add_row(data_row)
|
||||
|
||||
render_total_energy_label()
|
||||
|
||||
func _on_add_building_button_pressed():
|
||||
var new_row = {}
|
||||
data.append(new_row)
|
||||
add_row(new_row)
|
87
src/energy/EnergyTable.tscn
Normal file
87
src/energy/EnergyTable.tscn
Normal file
|
@ -0,0 +1,87 @@
|
|||
[gd_scene load_steps=2 format=3 uid="uid://cbegq3jfbfb6t"]
|
||||
|
||||
[ext_resource type="Script" path="res://src/energy/EnergyTable.gd" id="1_k0c5x"]
|
||||
|
||||
[node name="EnergyTable" type="Control"]
|
||||
layout_mode = 3
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
script = ExtResource("1_k0c5x")
|
||||
|
||||
[node name="VBoxContainer" type="VBoxContainer" parent="."]
|
||||
layout_mode = 1
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
|
||||
[node name="TableHeader" type="PanelContainer" parent="VBoxContainer"]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer/TableHeader"]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="Label" type="Label" parent="VBoxContainer/TableHeader/HBoxContainer"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
text = "Название"
|
||||
|
||||
[node name="Label2" type="Label" parent="VBoxContainer/TableHeader/HBoxContainer"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
text = "Энергия/сек за ед."
|
||||
|
||||
[node name="Label3" type="Label" parent="VBoxContainer/TableHeader/HBoxContainer"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
text = "Кол-во ед."
|
||||
|
||||
[node name="Label4" type="Label" parent="VBoxContainer/TableHeader/HBoxContainer"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
text = "Энергия/сек"
|
||||
|
||||
[node name="TableBody" type="PanelContainer" parent="VBoxContainer"]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="VBoxContainer" type="VBoxContainer" parent="VBoxContainer/TableBody"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
|
||||
[node name="TableSummary" type="PanelContainer" parent="VBoxContainer"]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer/TableSummary"]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="Label" type="Label" parent="VBoxContainer/TableSummary/HBoxContainer"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
text = "ИТОГО"
|
||||
|
||||
[node name="Label2" type="Label" parent="VBoxContainer/TableSummary/HBoxContainer"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
|
||||
[node name="Label3" type="Label" parent="VBoxContainer/TableSummary/HBoxContainer"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
|
||||
[node name="TotalEnergyLabel" type="Label" parent="VBoxContainer/TableSummary/HBoxContainer"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
text = "0"
|
||||
|
||||
[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer"]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="AddBuildingButton" type="Button" parent="VBoxContainer/HBoxContainer"]
|
||||
layout_mode = 2
|
||||
text = "Добавить здание"
|
||||
|
||||
[connection signal="pressed" from="VBoxContainer/HBoxContainer/AddBuildingButton" to="." method="_on_add_building_button_pressed"]
|
35
src/energy/EnergyTableRow.gd
Normal file
35
src/energy/EnergyTableRow.gd
Normal file
|
@ -0,0 +1,35 @@
|
|||
extends HBoxContainer
|
||||
|
||||
@export var unit_name: String
|
||||
@export var energy_per_unit: int
|
||||
@export var unit_count: int = 1
|
||||
|
||||
signal energy_changed(new_value)
|
||||
var energy: int:
|
||||
get:
|
||||
return energy
|
||||
set(value):
|
||||
if value != energy:
|
||||
energy = value
|
||||
energy_changed.emit(value)
|
||||
$EnergyLabel.text = str(energy)
|
||||
|
||||
func render_energy():
|
||||
energy = unit_count * energy_per_unit
|
||||
|
||||
func _ready():
|
||||
$UnitNameLineEdit.text = unit_name
|
||||
$EnergyPerUnitLineEdit.text = str(energy_per_unit)
|
||||
$UnitCountLineEdit.text = str(unit_count)
|
||||
render_energy()
|
||||
|
||||
func _on_unit_count_line_edit_text_changed(new_text):
|
||||
unit_count = int(new_text)
|
||||
render_energy()
|
||||
|
||||
func _on_energy_per_unit_line_edit_text_changed(new_text):
|
||||
energy_per_unit = int(new_text)
|
||||
render_energy()
|
||||
|
||||
func _on_unit_name_line_edit_text_changed(new_text):
|
||||
unit_name = new_text
|
110
src/energy/EnergyTableRow.tscn
Normal file
110
src/energy/EnergyTableRow.tscn
Normal file
|
@ -0,0 +1,110 @@
|
|||
[gd_scene load_steps=2 format=3 uid="uid://cvc75dbbiut78"]
|
||||
|
||||
[sub_resource type="GDScript" id="GDScript_obfag"]
|
||||
script/source = "extends HBoxContainer
|
||||
|
||||
@export var unit_name: String
|
||||
@export var energy_per_unit: int
|
||||
@export var unit_count: int = 1
|
||||
|
||||
@onready var unit_name_line_edit = $UnitNameLineEdit
|
||||
@onready var unit_count_line_edit = $UnitCountLineEdit
|
||||
@onready var energy_per_unit_line_edit = $EnergyPerUnitLineEdit
|
||||
@onready var energy_label = $HBoxContainer/EnergyLabel
|
||||
|
||||
signal deleted(instance: Node)
|
||||
signal energy_changed(new_value: int)
|
||||
|
||||
|
||||
var energy: int:
|
||||
get:
|
||||
return energy
|
||||
set(value):
|
||||
if value != energy:
|
||||
energy = value
|
||||
energy_changed.emit(value)
|
||||
energy_label.text = str(energy)
|
||||
|
||||
|
||||
func render_energy():
|
||||
energy = unit_count * energy_per_unit
|
||||
|
||||
func _ready():
|
||||
unit_name_line_edit.text = unit_name
|
||||
energy_per_unit_line_edit.text = str(energy_per_unit)
|
||||
unit_count_line_edit.text = str(unit_count)
|
||||
render_energy()
|
||||
|
||||
func _on_unit_count_line_edit_text_changed(new_text):
|
||||
unit_count = int(new_text)
|
||||
render_energy()
|
||||
|
||||
func _on_energy_per_unit_line_edit_text_changed(new_text):
|
||||
energy_per_unit = int(new_text)
|
||||
render_energy()
|
||||
|
||||
func _on_unit_name_line_edit_text_changed(new_text):
|
||||
unit_name = new_text
|
||||
|
||||
func _on_delete_row_button_pressed():
|
||||
deleted.emit(self)
|
||||
"
|
||||
|
||||
[node name="EnergyTableRow" type="HBoxContainer"]
|
||||
anchors_preset = 10
|
||||
anchor_right = 1.0
|
||||
offset_bottom = 35.0
|
||||
grow_horizontal = 2
|
||||
script = SubResource("GDScript_obfag")
|
||||
|
||||
[node name="UnitNameLineEdit" type="LineEdit" parent="."]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
placeholder_text = "Турбинный конденсатор"
|
||||
middle_mouse_paste_enabled = false
|
||||
drag_and_drop_selection_enabled = false
|
||||
flat = true
|
||||
caret_blink = true
|
||||
|
||||
[node name="EnergyPerUnitLineEdit" type="LineEdit" parent="."]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
placeholder_text = "180"
|
||||
virtual_keyboard_type = 2
|
||||
middle_mouse_paste_enabled = false
|
||||
drag_and_drop_selection_enabled = false
|
||||
flat = true
|
||||
select_all_on_focus = true
|
||||
caret_blink = true
|
||||
|
||||
[node name="UnitCountLineEdit" type="LineEdit" parent="."]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
placeholder_text = "4"
|
||||
virtual_keyboard_type = 2
|
||||
middle_mouse_paste_enabled = false
|
||||
drag_and_drop_selection_enabled = false
|
||||
flat = true
|
||||
select_all_on_focus = true
|
||||
caret_blink = true
|
||||
|
||||
[node name="HBoxContainer" type="HBoxContainer" parent="."]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
|
||||
[node name="EnergyLabel" type="Label" parent="HBoxContainer"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
text = "0"
|
||||
|
||||
[node name="DeleteRowButton" type="Button" parent="HBoxContainer"]
|
||||
layout_mode = 2
|
||||
tooltip_text = "Удалить здание"
|
||||
theme_override_colors/font_color = Color(1, 0.215686, 0.137255, 1)
|
||||
text = "✖"
|
||||
flat = true
|
||||
|
||||
[connection signal="text_changed" from="UnitNameLineEdit" to="." method="_on_unit_name_line_edit_text_changed"]
|
||||
[connection signal="text_changed" from="EnergyPerUnitLineEdit" to="." method="_on_energy_per_unit_line_edit_text_changed"]
|
||||
[connection signal="text_changed" from="UnitCountLineEdit" to="." method="_on_unit_count_line_edit_text_changed"]
|
||||
[connection signal="pressed" from="HBoxContainer/DeleteRowButton" to="." method="_on_delete_row_button_pressed"]
|
32
src/main.tscn
Normal file
32
src/main.tscn
Normal file
|
@ -0,0 +1,32 @@
|
|||
[gd_scene format=3 uid="uid://bwvm6y1nt53yk"]
|
||||
|
||||
[node name="Control" type="Control"]
|
||||
layout_mode = 3
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
|
||||
[node name="TabContainer" type="TabContainer" parent="."]
|
||||
layout_mode = 1
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
|
||||
[node name="VBoxContainer" type="VBoxContainer" parent="TabContainer"]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="AddBlockButton" type="Button" parent="TabContainer/VBoxContainer"]
|
||||
layout_mode = 2
|
||||
text = "Добавить блок"
|
||||
|
||||
[node name="VFlowContainer" type="VFlowContainer" parent="TabContainer"]
|
||||
visible = false
|
||||
layout_mode = 2
|
||||
|
||||
[node name="AddBlockButton" type="Button" parent="TabContainer/VFlowContainer"]
|
||||
layout_mode = 2
|
||||
text = "Добавить блок"
|
Loading…
Reference in a new issue