commit a74ab513236ac45ee5a03730ecf7064e6d509e08 Author: Andrey Stepanov Date: Sun Jan 12 14:43:59 2025 +0500 create formspec diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..2bb9ad2 --- /dev/null +++ b/LICENSE @@ -0,0 +1,176 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS \ No newline at end of file diff --git a/NOTICE b/NOTICE new file mode 100644 index 0000000..bf3c520 --- /dev/null +++ b/NOTICE @@ -0,0 +1,40 @@ +"physiology" mod for Luanti + +Copyright 2025 Andrey Stepanov + +This product depends on "unified_inventory" Luanti mod +maintained by Maciej Kasatkin and licensed under GNU LGPLv2+. +(https://content.luanti.org/packages/RealBadAngel/unified_inventory/), + +Textures +-------- + +From ACE3 mod https://ace3.acemod.org/ (GPLv2): + +- `textures/advanced_treatment_active.png` +- `textures/advanced_treatment_inactive.png` +- `bandage_fracture_active.png` +- `bandage_fracture_inactive.png` +- `examine_patient_active.png` +- `examine_patient_inactive.png` +- `medication_active.png` +- `medication_inactive.png` +- `triage_card_active.png` +- `triage_card_inactive.png` + +From https://pictures.pibig.info: + +- `textures/redcross.png` + +Andrey Stepanov (CC BY-SA 4.0): + +- `textures/body.png` +- `textures/head.png` +- `textures/left_hand.png` +- `textures/left_leg.png` +- `textures/right_hand.png` +- `textures/right_leg.png` + +Text documents are licensed under Creative Commons +Attribution-ShareAlike 4.0 International (CC BY-SA 4.0). To view a copy +of this license, visit https://creativecommons.org/licenses/by-sa/4.0/ diff --git a/README.md b/README.md new file mode 100644 index 0000000..a2c6e84 --- /dev/null +++ b/README.md @@ -0,0 +1,7 @@ +# physiology + +Мод медицины для Luanti. + +> Мод находится в процессе разработки + +![Скриншот интерфейса](doc/formspec.png) diff --git a/doc/formspec.png b/doc/formspec.png new file mode 100644 index 0000000..3bb97e4 Binary files /dev/null and b/doc/formspec.png differ diff --git a/init.lua b/init.lua new file mode 100644 index 0000000..9cf30ec --- /dev/null +++ b/init.lua @@ -0,0 +1,297 @@ +--[[ +Copyright 2025 Andrey Stepanov + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +]]-- + + +local S = core.get_translator("physiology") +local ui = unified_inventory + + +local _contexts = {} + +local function get_context(name) + local context = _contexts[name] or {} + _contexts[name] = context + return context +end + +core.register_on_leaveplayer( + function(player) + _contexts[player:get_player_name()] = nil + end +) + + +local pfp = { + padding = 0.1, + group_btn_w = 0.7, + group_btn_step = 0.9, + section_bg = "#22222266", + body_scale = 0.8, +} + + +local function draw_group_btn(button, active, x) + local suffix = nil + if active == true then + suffix = "active" + else + suffix = "inactive" + end + + local formspec = { + "image_button[", + x, ",0;", + pfp.group_btn_w, ",", pfp.group_btn_w, ";", + button.name, "_", suffix, ".png;", + button.name, ";", + ";", + "false;", + "false;", + "]", + "tooltip[", + button.name, ";", + button.label, + "]" + } + + return table.concat(formspec) +end + + +local function group_default_formspec(perplayer_formspec) + local fp = perplayer_formspec + local form_width = (fp.formw - fp.form_header_x * 2) / 3 + local formspec = { + "box[", + "0,0;", + form_width - pfp.padding, ",3.2;", + pfp.section_bg, + "]" + } + return table.concat(formspec) +end + +local group_buttons = { + { + name = "triage_card", + label = S("Triage Card"), + get_formspec = group_default_formspec, + }, + { + name = "examine_patient", + label = S("Examine patient"), + get_formspec = group_default_formspec, + }, + { + name = "bandage_fracture", + label = S("Bandage & Fracture"), + get_formspec = group_default_formspec, + }, + { + name = "medication", + label = S("Medication"), + get_formspec = group_default_formspec, + }, + { + name = "advanced_treatment", + label = S("Advanced treatment"), + get_formspec = group_default_formspec, + }, +} + + +local function draw_groups(active_group, perplayer_formspec) + local formspec = {} + + for i, button in ipairs(group_buttons) do + local is_active = false + if active_group == button.name then + is_active = true + end + table.insert(formspec, draw_group_btn(button, is_active, pfp.padding+(i-1)*pfp.group_btn_step)) + end + local container = { + "container[", + "0,", pfp.group_btn_step, + "]" + } + table.insert( + formspec, + table.concat(container) + ) + table.insert( + formspec, + group_default_formspec(perplayer_formspec) + ) + table.insert( + formspec, + "container_end[]" + ) + return table.concat(formspec) +end + + +ui.register_page( + "health", + { + get_formspec = function(player, perplayer_formspec) + local active_group = get_context(player:get_player_name()).active_group or group_buttons[1].name + + local fp = perplayer_formspec + local form_width = fp.formw - fp.form_header_x * 2 + local section_width = form_width / 3 + local body_center = section_width * 1.5 + local leg_w = pfp.body_scale * 0.8 + local leg_offset = pfp.body_scale * 0.02 + local formspec = { + perplayer_formspec.standard_inv_bg, + "container[", + fp.form_header_x, ",", fp.form_header_y, ";", + "]", + "box[", + "0,0;", + form_width, ",", 0.4, ";", + "orange", + "]", + "label[", + pfp.padding, ",0.2;", + player:get_player_name(), + "]", + "container[0,0.65]", + "label[", + pfp.padding, ",0;", + S("EXAMINE & TREATMENT"), + "]", + "label[", + section_width + pfp.padding, ",0;", + S("STATUS"), + "]", + "label[", + section_width * 2 + pfp.padding, ",0;", + S("OVERVIEW"), + "]", + "box[", + "0,0.14;", + form_width, ",0.02;", + "darkgray", + "]", + "container[0,0.35]", + draw_groups( + active_group, + perplayer_formspec + ), + "image_button[", + body_center - pfp.body_scale/2, ",0;", + pfp.body_scale, ",", pfp.body_scale, ";", + "head.png;head;;", + "false;false;", + "]", + "tooltip[", + "head;", + S("Head"), + "]", + "image_button[", + body_center - pfp.body_scale/2, ",", pfp.body_scale, ";", + pfp.body_scale, ",", pfp.body_scale*2, ";", + "body.png;body;;", + "false;false;", + "]", + "tooltip[", + "body;", + S("Body"), + "]", + "image_button[", + body_center - pfp.body_scale*1.5, ",", pfp.body_scale, ";", + pfp.body_scale, ",", pfp.body_scale*1.8, ";", + "right_hand.png;right_hand;;", + "false;false;", + "]", + "tooltip[", + "right_hand;", + S("Right Hand"), + "]", + "image_button[", + body_center + pfp.body_scale/2, ",", pfp.body_scale, ";", + pfp.body_scale, ",", pfp.body_scale*1.8, ";", + "left_hand.png;left_hand;;", + "false;false;", + "]", + "tooltip[", + "left_hand;", + S("Left Hand"), + "]", + "image_button[", + body_center - leg_w - leg_offset, ",", pfp.body_scale*3, ";", + leg_w, ",", pfp.body_scale*1.8, ";", + "right_leg.png;right_leg;;", + "false;false;", + "]", + "tooltip[", + "right_leg;", + S("Right Leg"), + "]", + "image_button[", + body_center + leg_offset, ",", pfp.body_scale*3, ";", + leg_w, ",", pfp.body_scale*1.8, ";", + "left_leg.png;left_leg;;", + "false;false;", + "]", + "tooltip[", + "left_leg;", + S("Left Leg"), + "]", + "box[", + section_width * 2, ",0;", + section_width, ",9;", + pfp.section_bg, + "]", + "container_end[]", + "container_end[]", + "container_end[]" + } + return { + formspec = table.concat(formspec), + draw_inventory = true, + draw_item_list = false + } + end + } +) + +ui.register_button( + "health", + { + type = "image", + image = "redcross.png", + tooltip = S("Health") + } +) + +core.register_on_player_receive_fields( + function(player, formname, fields) + if formname ~= "" then + return + end + + for _, btn in ipairs(group_buttons) do + if fields[btn.name] then + get_context(player:get_player_name()).active_group = btn.name + ui.set_inventory_formspec(player, "health") + return + end + end + end +) diff --git a/locale/physiology.ru.tr b/locale/physiology.ru.tr new file mode 100644 index 0000000..8f6c1bc --- /dev/null +++ b/locale/physiology.ru.tr @@ -0,0 +1,16 @@ +# textdomain: physiology +Health=Здоровье +EXAMINE & TREATMENT=ОБСЛЕДОВАНИЕ И ЛЕЧЕНИЕ +STATUS=СОСТОЯНИЕ +OVERVIEW=ПАРАМЕТРЫ +Triage Card=Карта пациента +Examine patient=Обследование +Bandage & Fracture=Повязки и переломы +Medication=Медикаменты +Advanced treatment=Специальное лечение +Head=Голова +Body=Туловище +Right Hand=Правая рука +Left Hand=Левая рука +Right Leg=Правая нога +Left Leg=Левая нога diff --git a/mod.conf b/mod.conf new file mode 100644 index 0000000..c399d7d --- /dev/null +++ b/mod.conf @@ -0,0 +1,3 @@ +name = physiology +description = Health and nutrition +depends = unified_inventory \ No newline at end of file diff --git a/textures/advanced_treatment_active.png b/textures/advanced_treatment_active.png new file mode 100644 index 0000000..6feef89 Binary files /dev/null and b/textures/advanced_treatment_active.png differ diff --git a/textures/advanced_treatment_inactive.png b/textures/advanced_treatment_inactive.png new file mode 100644 index 0000000..50f7be7 Binary files /dev/null and b/textures/advanced_treatment_inactive.png differ diff --git a/textures/bandage_fracture_active.png b/textures/bandage_fracture_active.png new file mode 100644 index 0000000..b032395 Binary files /dev/null and b/textures/bandage_fracture_active.png differ diff --git a/textures/bandage_fracture_inactive.png b/textures/bandage_fracture_inactive.png new file mode 100644 index 0000000..04448f4 Binary files /dev/null and b/textures/bandage_fracture_inactive.png differ diff --git a/textures/body.png b/textures/body.png new file mode 100644 index 0000000..ae30cd2 Binary files /dev/null and b/textures/body.png differ diff --git a/textures/examine_patient_active.png b/textures/examine_patient_active.png new file mode 100644 index 0000000..353e8a5 Binary files /dev/null and b/textures/examine_patient_active.png differ diff --git a/textures/examine_patient_inactive.png b/textures/examine_patient_inactive.png new file mode 100644 index 0000000..427834c Binary files /dev/null and b/textures/examine_patient_inactive.png differ diff --git a/textures/head.png b/textures/head.png new file mode 100644 index 0000000..08aad4b Binary files /dev/null and b/textures/head.png differ diff --git a/textures/left_hand.png b/textures/left_hand.png new file mode 100644 index 0000000..e74d6f5 Binary files /dev/null and b/textures/left_hand.png differ diff --git a/textures/left_leg.png b/textures/left_leg.png new file mode 100644 index 0000000..0178858 Binary files /dev/null and b/textures/left_leg.png differ diff --git a/textures/medication_active.png b/textures/medication_active.png new file mode 100644 index 0000000..b86d7c4 Binary files /dev/null and b/textures/medication_active.png differ diff --git a/textures/medication_inactive.png b/textures/medication_inactive.png new file mode 100644 index 0000000..7c66876 Binary files /dev/null and b/textures/medication_inactive.png differ diff --git a/textures/redcross.png b/textures/redcross.png new file mode 100644 index 0000000..1e36156 Binary files /dev/null and b/textures/redcross.png differ diff --git a/textures/right_hand.png b/textures/right_hand.png new file mode 100644 index 0000000..d18b2bf Binary files /dev/null and b/textures/right_hand.png differ diff --git a/textures/right_leg.png b/textures/right_leg.png new file mode 100644 index 0000000..b7bf7fc Binary files /dev/null and b/textures/right_leg.png differ diff --git a/textures/triage_card_active.png b/textures/triage_card_active.png new file mode 100644 index 0000000..531fc90 Binary files /dev/null and b/textures/triage_card_active.png differ diff --git a/textures/triage_card_inactive.png b/textures/triage_card_inactive.png new file mode 100644 index 0000000..7869bee Binary files /dev/null and b/textures/triage_card_inactive.png differ