Преглед на файлове

Fixed the memory leak error when setting texts repeatedly in menus.

Iñigo Valentin преди 3 години
родител
ревизия
e6515c7a4e

+ 14 - 0
V-Gears/include/core/UiTextArea.h

@@ -382,11 +382,25 @@ class UiTextArea : public UiWidget{
         /**
          * Prepares text from a XML node.
          *
+         * Not to be used to set text dinamically from scripts repatedly (i.e. for menus). It can
+         * produce memory leaks, and it's slower. Use {@see SetTextFromNode} for that.
+         *
          * @param[in] node The XML node to get the text from.
          * @param[in] colour The text colour.
          */
         void PrepareTextFromNode(TiXmlNode* node, const Ogre::ColourValue& colour);
 
+        /**
+         * Prepares text from a XML node.
+         *
+         * Use this when setting text dinamically from scripts, instead of
+         * {@see PrepareTextFromNode}.
+         *
+         * @param[in] node The XML node to get the text from.
+         * @param[in] colour The text colour.
+         */
+        void SetTextFromNode(TiXmlNode* node, const Ogre::ColourValue& colour);
+
         /**
          * Prepares text from a string.
          *

+ 188 - 4
V-Gears/src/core/UiTextArea.cpp

@@ -187,6 +187,7 @@ void UiTextArea::Render(){
 void UiTextArea::UpdateTransformation(){
     UiWidget::UpdateTransformation();
     UpdateGeometry();
+    update_transformation_ = false;
 }
 
 void UiTextArea::InputPressed(){next_pressed_ = true;}
@@ -207,7 +208,27 @@ void UiTextArea::SetPadding(
     padding_left_ = left;
 }
 
-void UiTextArea::SetText(const char* text){SetText(Ogre::UTFString(text));}
+void UiTextArea::SetText(const char* text){
+    // Don't call PrepareTextFromNode from here!
+    // Use the non-recursive SetTextFromNode.
+    Ogre::UTFString str_text = Ogre::UTFString(text);
+    text_.clear();
+    TiXmlDocument doc;
+    Ogre::UTFString xml_text = "<container>" + str_text + "</container>";
+    doc.Parse(xml_text.asUTF8_c_str(), 0, TIXML_ENCODING_UTF8);
+    SetTextFromNode(doc.RootElement(), colour_1_);
+    text_state_ = TS_SHOW_TEXT;
+    update_transformation_ = true;
+    if (text_.size() > max_letters_){
+        text_.clear();
+        LOG_ERROR(
+          "Max number of text reached in '" + path_name_ + "'. Can't render text from node. "
+          + "Max number of letters is " + Ogre::StringConverter::toString(max_letters_) + "."
+        );
+    }
+    text_state_ = TS_SHOW_TEXT;
+    update_transformation_ = true;
+}
 
 void UiTextArea::SetText(const Ogre::UTFString& text){
     TiXmlDocument doc;
@@ -561,7 +582,6 @@ float UiTextArea::GetTextWidth() const{
 }
 
 void UiTextArea::PrepareTextFromNode(TiXmlNode* node, const Ogre::ColourValue& colour){
-    Ogre::ColourValue colour_child = colour;
     while (node != NULL){
         switch(node->Type()){
             case TiXmlNode::TINYXML_TEXT:
@@ -572,7 +592,7 @@ void UiTextArea::PrepareTextFromNode(TiXmlNode* node, const Ogre::ColourValue& c
                 break;
             case TiXmlNode::TINYXML_ELEMENT:
                 {
-
+                    Ogre::ColourValue colour_child = colour;
                     Ogre::String name = node->ValueStr();
                     if (name == "colour"){
                         colour_child = Ogre::StringConverter::parseColourValue(
@@ -720,7 +740,7 @@ void UiTextArea::PrepareTextFromNode(TiXmlNode* node, const Ogre::ColourValue& c
                         }
                     }
                     TiXmlNode* node_child = node->FirstChild();
-                    PrepareTextFromNode(node_child, colour_child);
+                    if (node_child != NULL) PrepareTextFromNode(node_child, colour_child);
                 }
             break;
         }
@@ -728,6 +748,170 @@ void UiTextArea::PrepareTextFromNode(TiXmlNode* node, const Ogre::ColourValue& c
     }
 }
 
+void UiTextArea::SetTextFromNode(TiXmlNode* node, const Ogre::ColourValue& colour){
+    switch(node->Type()){
+        case TiXmlNode::TINYXML_TEXT:
+            {
+                TiXmlText* childText = node->ToText();
+                if (childText) PrepareTextFromText(childText->Value(), colour);
+            }
+            break;
+        case TiXmlNode::TINYXML_ELEMENT:
+            {
+                Ogre::ColourValue colour_child = colour;
+                Ogre::String name = node->ValueStr();
+                if (name == "colour"){
+                    colour_child = Ogre::StringConverter::parseColourValue(
+                      node->ToElement()->Attribute("value")
+                    );
+                }
+                else if (name == "pause_ok"){
+                    TextChar new_char;
+                    new_char.pause_ok = true;
+                    text_.push_back(new_char);
+                }
+                else if (name == "pause"){
+                    const std::string* string
+                      = node->ToElement()->Attribute(Ogre::String("time"));
+                    if (string != NULL){
+                        TextChar new_char;
+                        new_char.pause_time = Ogre::StringConverter::parseReal(*string);
+                        text_.push_back(new_char);
+                    }
+                }
+                else if (name == "next_page"){
+                    TextChar new_char;
+                    new_char.next_page = true;
+                    text_.push_back(new_char);
+                }
+                else if (name == "timer"){
+                    timer_ = true;
+                    TextChar new_char;
+                    new_char.skip = true;
+                    new_char.variable = "UITextAreaTimer";
+                    new_char.colour = colour;
+                    Ogre::UTFString var = GetVariable("UITextAreaTimer");
+                    new_char.variable_len = var.size();
+                    text_.push_back(new_char);
+                    for (unsigned int i = 0; i < var.size(); ++ i){
+                        TextChar text_char;
+                        text_char.char_code = var[i];
+                        text_char.colour = colour;
+                        text_.push_back(text_char);
+                    }
+                }
+                else if (name == "variable"){
+                    const std::string* string
+                      = node->ToElement()->Attribute(Ogre::String("name"));
+                    if (string != NULL){
+                        TextChar new_char;
+                        new_char.skip = true;
+                        new_char.variable = *string;
+                        new_char.colour = colour;
+                        Ogre::UTFString var = GetVariable(*string);
+                        new_char.variable_len = var.size();
+                        text_.push_back(new_char);
+                        for (unsigned int i = 0; i < var.size(); ++ i){
+                            TextChar text_char;
+                            text_char.char_code = var[i];
+                            text_char.colour = colour;
+                            text_.push_back(text_char);
+                        }
+                    }
+                }
+                else if (name == "character"){
+                    const std::string* id = node->ToElement()->Attribute(Ogre::String("id"));
+                    const std::string char_name = TextManager::getSingleton().GetCharacterName(
+                      std::stoi(*id)
+                    );
+                    for (unsigned int i = 0; i < char_name.length(); ++ i){
+                        TextChar text_char;
+                        text_char.char_code = char_name.at(i);
+                        text_char.colour = colour;
+                        text_.push_back(text_char);
+                    }
+                }
+                else if (name == "party"){
+                    const std::string* pos = node->ToElement()->Attribute(Ogre::String("pos"));
+                    const std::string char_name
+                      = TextManager::getSingleton().GetPartyCharacterName(std::stoi(*pos));
+                    for (unsigned int i = 0; i < char_name.length(); ++ i){
+                        TextChar text_char;
+                        text_char.char_code = char_name.at(i);
+                        text_char.colour = colour;
+                        text_.push_back(text_char);
+                    }
+                }
+                else if (name == "include"){
+                    const std::string* text_name = node->ToElement()->Attribute(
+                      Ogre::String("name")
+                    );
+                    if (text_name != NULL){
+                        TiXmlNode* text = TextManager::getSingleton().GetText(*text_name);
+                        if (text != NULL) SetTextFromNode(text, colour_child);
+                    }
+                }
+                else if (name == "image"){
+                    Ogre::String name1 = GetString(node, "sprite");
+                    if (name1 != ""){
+                        TiXmlNode* sprites = UiManager::getSingleton().GetPrototype(
+                          "TextAreaSprite"
+                        );
+                        if (sprites != NULL){
+                            sprites = sprites->FirstChild();
+                            while (sprites != NULL){
+                                if (
+                                  sprites->Type() == TiXmlNode::TINYXML_ELEMENT
+                                  && sprites->ValueStr() == "sprite"
+                                ){
+                                    Ogre::String name2 = GetString(sprites, "name");
+                                    if (name1 == name2){
+                                        TextChar new_char;
+                                        UiSprite* sprite = new UiSprite(
+                                          name1, name_ + "." + name1, this
+                                        );
+                                        Ogre::String image = GetString(sprites, "image");
+                                        if (image != "") sprite->SetImage(image);
+                                        Ogre::String y_str = GetString(sprites, "y");
+                                        if (y_str != ""){
+                                            float y_percent = 0;
+                                            float y = 0;
+                                            ParsePercent(y_percent, y, y_str);
+                                            new_char.sprite_y = y;
+                                        }
+                                        Ogre::String width_str = GetString(sprites, "width");
+                                        if (width_str != ""){
+                                            float width_percent = 0;
+                                            float width = 0;
+                                            ParsePercent(width_percent, width, width_str);
+                                            sprite->SetWidth(0, width);
+                                        }
+                                        Ogre::String height_str = GetString(sprites, "height");
+                                        if (height_str != ""){
+                                            float height_percent = 0;
+                                            float height = 0;
+                                            ParsePercent(height_percent, height, height_str);
+                                            sprite->SetHeight(height_percent, height);
+                                        }
+                                        sprite->SetVisible(false);
+                                        AddChild(sprite);
+                                        new_char.sprite = sprite;
+                                        text_.push_back(new_char);
+                                        break;
+                                    }
+                                }
+                                sprites = sprites->NextSibling();
+                            }
+                        }
+                    }
+                }
+                TiXmlNode* node_child = node->FirstChild();
+                if (node_child != NULL) SetTextFromNode(node_child, colour_child);
+            }
+        break;
+    }
+}
+
 void UiTextArea::PrepareTextFromText(
   const Ogre::UTFString& text, const Ogre::ColourValue& colour_child
 ){

BIN
data/RenderSystem_GL.so.1.12.10


+ 5 - 5
data/data/scripts/menu/main_menu.lua

@@ -33,12 +33,12 @@ UiContainer.MainMenu = {
     -- @param button Pressed button string key. "Up", "Left", "Enter" and "Escape" are handled.
     -- @param event Trigger event. Normally, "Press".
     on_button = function(self, button, event)
-        local characters  = ui_manager:get_widget("MainMenu.Container.Characters")
-        local menu  = ui_manager:get_widget("MainMenu.Container.Menu")
-        local menu_cursor = ui_manager:get_widget("MainMenu.Container.Menu.Cursor")
-        local timegil = ui_manager:get_widget("MainMenu.Container.TimeGil")
-        local location = ui_manager:get_widget("MainMenu.Container.Location")
         if UiContainer.current_menu == "main" then
+            local characters  = ui_manager:get_widget("MainMenu.Container.Characters")
+            local menu  = ui_manager:get_widget("MainMenu.Container.Menu")
+            local menu_cursor = ui_manager:get_widget("MainMenu.Container.Menu.Cursor")
+            local timegil = ui_manager:get_widget("MainMenu.Container.TimeGil")
+            local location = ui_manager:get_widget("MainMenu.Container.Location")
             if UiContainer.current_submenu == "" then
                 if button == "Escape" and event == "Press" then
                     script:request_end_sync(Script.UI, "MainMenu", "hide", 0)

+ 82 - 176
data/data/scripts/menu/materia_menu.lua

@@ -81,6 +81,7 @@ UiContainer.MateriaMenu = {
                         self.selecting_slot = Inventory.ITEM_TYPE.ACCESSORY
                     end
                     self.submenu_select(self)]]
+                -- TODO: Triangle->Remove
                 else
                     return 0
                 end
@@ -186,98 +187,6 @@ UiContainer.MateriaMenu = {
         end
     end,
 
-    --- Initializzes the item selection submenu
-    --[[submenu_select = function(self)
-        -- Populate the list
-        self.list_first_visible = 1
-        self.list_position = 1
-        self.list_item_selected = 1
-        if self.populate_item_list(self) == false then
-            print("BEEP")
-            return
-        end
-        UiContainer.current_submenu = "item_select"
-        ui_manager:get_widget("EquipMenu.Container.List.Cursor"):set_visible(true)
-        ui_manager:get_widget("EquipMenu.Container.List.Cursor"):set_default_animation("Position" .. self.list_position)
-        -- TODO: Description and details of first item
-        self.populate_details(self, true)
-        self.calculate_stat_diffs(self)
-    end,]]
-
-    --[[populate_item_list = function(self)
-        local list
-        if self.selecting_slot == Inventory.ITEM_TYPE.WEAPON then
-            list = self.avail_weapons
-        elseif self.selecting_slot == Inventory.ITEM_TYPE.ARMOR then
-            list = self.avail_armors
-        elseif self.selecting_slot == Inventory.ITEM_TYPE.ACCESSORY then
-            list = self.avail_accessories
-        else
-            for i = 1, self.list_position_total do
-                ui_manager:get_widget("EquipMenu.Container.List.Item" .. tostring(i)):set_text("")
-            end
-            return false
-        end
-        if list == nil or #(list) == 0 then
-            -- No items for the list
-            return false
-        end
-        for i = 1, self.list_position_total do
-            if #(list) >= i + self.list_first_visible then
-                local name = Game.Items[list[i + self.list_first_visible] ].name
-                ui_manager:get_widget("EquipMenu.Container.List.Item" .. tostring(i)):set_text(name)
-            else
-                ui_manager:get_widget("EquipMenu.Container.List.Item" .. tostring(i)):set_text("")
-            end
-        end
-    end,]]
-
-    --- Loads the list of equipment available for the current character.
-    --
-    -- Currently equiped items are not added, even if more of them are in the inventory.
-    --[[load_availables = function(self)
-        self.avail_weapons = {}
-        self.avail_armors = {}
-        self.avail_accessories = {}
-        for _, item in ipairs(Inventory) do
-            if item.item ~= nil then
-                local item_type = Game.Items[item.item].type
-                if item_type == Inventory.ITEM_TYPE.WEAPON or item_type == Inventory.ITEM_TYPE.ARMOR or item_type == Inventory.ITEM_TYPE.ACCESSORY then
-                    local equip = Game.Items[item.item].users
-                    for _, ch in ipairs(equip) do
-                        if ch == self.char_id then
-                            if item_type == Inventory.ITEM_TYPE.WEAPON then
-                                if item.item ~= Characters[self.char_id].weapon.id then
-                                    table.insert(self.avail_weapons, item.item)
-                                end
-                            elseif item_type == Inventory.ITEM_TYPE.ARMOR then
-                                if item.item ~= Characters[self.char_id].armor.id then
-                                    table.insert(self.avail_armors, item.item)
-                                end
-                            elseif item_type == Inventory.ITEM_TYPE.ACCESSORY then
-                                if item.item ~= Characters[self.char_id].accessory then
-                                    table.insert(self.avail_accessories, item.item)
-                                end
-                            end
-                        end
-                    end
-                end
-            end
-        end
-    end,]]
-
-    --[[populate_current_stats = function(self)
-        -- TODO: Cap at 255?
-        local stats = Characters[self.char_id].stats
-        ui_manager:get_widget("EquipMenu.Container.Stats.Atk"):set_text(UiContainer.pad_value(stats.atk, 4))
-        ui_manager:get_widget("EquipMenu.Container.Stats.Acc"):set_text(UiContainer.pad_value(stats.acc, 4))
-        ui_manager:get_widget("EquipMenu.Container.Stats.Def"):set_text(UiContainer.pad_value(stats.def, 4))
-        ui_manager:get_widget("EquipMenu.Container.Stats.Eva"):set_text(UiContainer.pad_value(stats.eva, 4))
-        ui_manager:get_widget("EquipMenu.Container.Stats.MAtk"):set_text(UiContainer.pad_value(stats.matk, 4))
-        ui_manager:get_widget("EquipMenu.Container.Stats.MDef"):set_text(UiContainer.pad_value(stats.mdef, 4))
-        ui_manager:get_widget("EquipMenu.Container.Stats.MEva"):set_text(UiContainer.pad_value(stats.meva, 4))
-    end,]]
-
     --- Hiddes the materia details.
     --
     -- Must be called when the cursor goes into an empty slot
@@ -383,7 +292,6 @@ UiContainer.MateriaMenu = {
         if materia.type == Materia.TYPE.MAGIC then
             local attack_index = 1
             for attack_level, attack_id in pairs(materia.magic) do
-                print("LV " .. attack_level .. " ID " .. attack_id)
                 if level >= attack_level then
                     ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Abilities.Ability" .. tostring(attack_index)):set_colour(1, 1, 1)
                 else
@@ -472,97 +380,95 @@ UiContainer.MateriaMenu = {
         end
 
         -- Show effects, if any.
-        --if #(materia.stats) > 0 then
-            local effect_index = 1
-            if materia.stats.str ~= nil and materia.stats.str ~= 0 then
-                ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Stat" .. tostring(effect_index)):set_text("<include name=\"StatStr\" />")
-                ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Stat" .. tostring(effect_index)):set_visible(true)
-                if materia.stats.str < 0 then
-                    ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Val" .. tostring(effect_index)):set_text("<colour value=\"1 0 0\">-" .. UiContainer.pad_value(-1 * materia.stats.str, 2) .. "</colour>")
-                else
-                    ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Val" .. tostring(effect_index)):set_text("<colour value=\"1 1 0\">+" .. UiContainer.pad_value(materia.stats.str, 2) .. "</colour>")
-                end
-                ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Val" .. tostring(effect_index)):set_visible(true)
-                effect_index = effect_index + 1
+        local effect_index = 1
+        if materia.stats.str ~= nil and materia.stats.str ~= 0 then
+            ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Stat" .. tostring(effect_index)):set_text("<include name=\"StatStr\" />")
+            ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Stat" .. tostring(effect_index)):set_visible(true)
+            if materia.stats.str < 0 then
+                ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Val" .. tostring(effect_index)):set_text("<colour value=\"1 0 0\">-" .. UiContainer.pad_value(-1 * materia.stats.str, 2) .. "</colour>")
+            else
+                ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Val" .. tostring(effect_index)):set_text("<colour value=\"1 1 0\">+" .. UiContainer.pad_value(materia.stats.str, 2) .. "</colour>")
             end
-            if materia.stats.vit ~= nil and materia.stats.vit ~= 0 then
-                ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Stat" .. tostring(effect_index)):set_text("<include name=\"StatVit\" />")
-                ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Stat" .. tostring(effect_index)):set_visible(true)
-                if materia.stats.vit < 0 then
-                    ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Val" .. tostring(effect_index)):set_text("<colour value=\"1 0 0\">-" .. UiContainer.pad_value(-1 * materia.stats.vit, 2) .. "</colour>")
-                else
-                    ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Val" .. tostring(effect_index)):set_text("<colour value=\"1 1 0\">+" .. UiContainer.pad_value(materia.stats.vit, 2) .. "</colour>")
-                end
-                ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Val" .. tostring(effect_index)):set_visible(true)
-                effect_index = effect_index + 1
+            ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Val" .. tostring(effect_index)):set_visible(true)
+            effect_index = effect_index + 1
+        end
+        if materia.stats.vit ~= nil and materia.stats.vit ~= 0 then
+            ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Stat" .. tostring(effect_index)):set_text("<include name=\"StatVit\" />")
+            ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Stat" .. tostring(effect_index)):set_visible(true)
+            if materia.stats.vit < 0 then
+                ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Val" .. tostring(effect_index)):set_text("<colour value=\"1 0 0\">-" .. UiContainer.pad_value(-1 * materia.stats.vit, 2) .. "</colour>")
+            else
+                ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Val" .. tostring(effect_index)):set_text("<colour value=\"1 1 0\">+" .. UiContainer.pad_value(materia.stats.vit, 2) .. "</colour>")
             end
-            if materia.stats.mag ~= nil and materia.stats.mag ~= 0 then
-                ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Stat" .. tostring(effect_index)):set_text("<include name=\"StatMag\" />")
-                ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Stat" .. tostring(effect_index)):set_visible(true)
-                if materia.stats.mag < 0 then
-                    ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Val" .. tostring(effect_index)):set_text("<colour value=\"1 0 0\">-" .. UiContainer.pad_value(-1 * materia.stats.mag, 2) .. "</colour>")
-                else
-                    ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Val" .. tostring(effect_index)):set_text("<colour value=\"1 1 0\">+" .. UiContainer.pad_value(materia.stats.mag, 2) .. "</colour>")
-                end
-                ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Val" .. tostring(effect_index)):set_visible(true)
-                effect_index = effect_index + 1
+            ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Val" .. tostring(effect_index)):set_visible(true)
+            effect_index = effect_index + 1
+        end
+        if materia.stats.mag ~= nil and materia.stats.mag ~= 0 then
+            ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Stat" .. tostring(effect_index)):set_text("<include name=\"StatMag\" />")
+            ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Stat" .. tostring(effect_index)):set_visible(true)
+            if materia.stats.mag < 0 then
+                ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Val" .. tostring(effect_index)):set_text("<colour value=\"1 0 0\">-" .. UiContainer.pad_value(-1 * materia.stats.mag, 2) .. "</colour>")
+            else
+                ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Val" .. tostring(effect_index)):set_text("<colour value=\"1 1 0\">+" .. UiContainer.pad_value(materia.stats.mag, 2) .. "</colour>")
             end
-            if materia.stats.spr ~= nil and materia.stats.spr ~= 0 then
-                ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Stat" .. tostring(effect_index)):set_text("<include name=\"StatSpr\" />")
-                ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Stat" .. tostring(effect_index)):set_visible(true)
-                if materia.stats.spr < 0 then
-                    ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Val" .. tostring(effect_index)):set_text("<colour value=\"1 0 0\">-" .. UiContainer.pad_value(-1 * materia.stats.spr, 2) .. "</colour>")
-                else
-                    ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Val" .. tostring(effect_index)):set_text("<colour value=\"1 1 0\">+" .. UiContainer.pad_value(materia.stats.spr, 2) .. "</colour>")
-                end
-                ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Val" .. tostring(effect_index)):set_visible(true)
-                effect_index = effect_index + 1
+            ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Val" .. tostring(effect_index)):set_visible(true)
+            effect_index = effect_index + 1
+        end
+        if materia.stats.spr ~= nil and materia.stats.spr ~= 0 then
+            ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Stat" .. tostring(effect_index)):set_text("<include name=\"StatSpr\" />")
+            ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Stat" .. tostring(effect_index)):set_visible(true)
+            if materia.stats.spr < 0 then
+                ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Val" .. tostring(effect_index)):set_text("<colour value=\"1 0 0\">-" .. UiContainer.pad_value(-1 * materia.stats.spr, 2) .. "</colour>")
+            else
+                ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Val" .. tostring(effect_index)):set_text("<colour value=\"1 1 0\">+" .. UiContainer.pad_value(materia.stats.spr, 2) .. "</colour>")
             end
-            if materia.stats.dex ~= nil and materia.stats.dex ~= 0 then
-                ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Stat" .. tostring(effect_index)):set_text("<include name=\"StatDex\" />")
-                ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Stat" .. tostring(effect_index)):set_visible(true)
-                if materia.stats.dex < 0 then
-                    ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Val" .. tostring(effect_index)):set_text("<colour value=\"1 0 0\">-" .. UiContainer.pad_value(-1 * materia.stats.dex, 2) .. "</colour>")
-                else
-                    ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Val" .. tostring(effect_index)):set_text("<colour value=\"1 1 0\">+" .. UiContainer.pad_value(materia.stats.dex, 2) .. "</colour>")
-                end
-                ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Val" .. tostring(effect_index)):set_visible(true)
-                effect_index = effect_index + 1
+            ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Val" .. tostring(effect_index)):set_visible(true)
+            effect_index = effect_index + 1
+        end
+        if materia.stats.dex ~= nil and materia.stats.dex ~= 0 then
+            ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Stat" .. tostring(effect_index)):set_text("<include name=\"StatDex\" />")
+            ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Stat" .. tostring(effect_index)):set_visible(true)
+            if materia.stats.dex < 0 then
+                ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Val" .. tostring(effect_index)):set_text("<colour value=\"1 0 0\">-" .. UiContainer.pad_value(-1 * materia.stats.dex, 2) .. "</colour>")
+            else
+                ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Val" .. tostring(effect_index)):set_text("<colour value=\"1 1 0\">+" .. UiContainer.pad_value(materia.stats.dex, 2) .. "</colour>")
             end
-            if materia.stats.lck ~= nil and materia.stats.lck ~= 0 then
-                ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Stat" .. tostring(effect_index)):set_text("<include name=\"StatLck\" />")
-                ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Stat" .. tostring(effect_index)):set_visible(true)
-                if materia.stats.lck < 0 then
-                    ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Val" .. tostring(effect_index)):set_text("<colour value=\"1 0 0\">-" .. UiContainer.pad_value(-1 * materia.stats.lck, 2) .. "</colour>")
-                else
-                    ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Val" .. tostring(effect_index)):set_text("<colour value=\"1 1 0\">+" .. UiContainer.pad_value(materia.stats.lck, 2) .. "</colour>")
-                end
-                ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Val" .. tostring(effect_index)):set_visible(true)
-                effect_index = effect_index + 1
+            ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Val" .. tostring(effect_index)):set_visible(true)
+            effect_index = effect_index + 1
+        end
+        if materia.stats.lck ~= nil and materia.stats.lck ~= 0 then
+            ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Stat" .. tostring(effect_index)):set_text("<include name=\"StatLck\" />")
+            ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Stat" .. tostring(effect_index)):set_visible(true)
+            if materia.stats.lck < 0 then
+                ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Val" .. tostring(effect_index)):set_text("<colour value=\"1 0 0\">-" .. UiContainer.pad_value(-1 * materia.stats.lck, 2) .. "</colour>")
+            else
+                ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Val" .. tostring(effect_index)):set_text("<colour value=\"1 1 0\">+" .. UiContainer.pad_value(materia.stats.lck, 2) .. "</colour>")
             end
-            if materia.stats.hp ~= nil and materia.stats.hp ~= 0 then
-                ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Stat" .. tostring(effect_index)):set_text("<include name=\"StatHP\" />")
-                ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Stat" .. tostring(effect_index)):set_visible(true)
-                if materia.stats.hp < 0 then
-                    ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Val" .. tostring(effect_index)):set_text("<colour value=\"1 0 0\">-" .. UiContainer.pad_value(-1 * materia.stats.hp, 2) .. "%</colour>")
-                else
-                    ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Val" .. tostring(effect_index)):set_text("<colour value=\"1 1 0\">+" .. UiContainer.pad_value(materia.stats.hp, 2) .. "%</colour>")
-                end
-                ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Val" .. tostring(effect_index)):set_visible(true)
-                effect_index = effect_index + 1
+            ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Val" .. tostring(effect_index)):set_visible(true)
+            effect_index = effect_index + 1
+        end
+        if materia.stats.hp ~= nil and materia.stats.hp ~= 0 then
+            ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Stat" .. tostring(effect_index)):set_text("<include name=\"StatHP\" />")
+            ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Stat" .. tostring(effect_index)):set_visible(true)
+            if materia.stats.hp < 0 then
+                ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Val" .. tostring(effect_index)):set_text("<colour value=\"1 0 0\">-" .. UiContainer.pad_value(-1 * materia.stats.hp, 2) .. "%</colour>")
+            else
+                ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Val" .. tostring(effect_index)):set_text("<colour value=\"1 1 0\">+" .. UiContainer.pad_value(materia.stats.hp, 2) .. "%</colour>")
             end
-            if materia.stats.mp ~= nil and materia.stats.mp ~= 0 then
-                ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Stat" .. tostring(effect_index)):set_text("<include name=\"StatMP\" />")
-                ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Stat" .. tostring(effect_index)):set_visible(true)
-                if materia.stats.mp < 0 then
-                    ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Val" .. tostring(effect_index)):set_text("<colour value=\"1 0 0\">-" .. UiContainer.pad_value(-1 * materia.stats.mp, 2) .. "%</colour>")
-                else
-                    ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Val" .. tostring(effect_index)):set_text("<colour value=\"1 1 0\">+" .. UiContainer.pad_value(materia.stats.mp, 2) .. "%</colour>")
-                end
-                ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Val" .. tostring(effect_index)):set_visible(true)
-                effect_index = effect_index + 1
+            ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Val" .. tostring(effect_index)):set_visible(true)
+            effect_index = effect_index + 1
+        end
+        if materia.stats.mp ~= nil and materia.stats.mp ~= 0 then
+            ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Stat" .. tostring(effect_index)):set_text("<include name=\"StatMP\" />")
+            ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Stat" .. tostring(effect_index)):set_visible(true)
+            if materia.stats.mp < 0 then
+                ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Val" .. tostring(effect_index)):set_text("<colour value=\"1 0 0\">-" .. UiContainer.pad_value(-1 * materia.stats.mp, 2) .. "%</colour>")
+            else
+                ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Val" .. tostring(effect_index)):set_text("<colour value=\"1 1 0\">+" .. UiContainer.pad_value(materia.stats.mp, 2) .. "%</colour>")
             end
-        --end
+            ui_manager:get_widget("MateriaMenu.Container.Details.Materia.Effects.Val" .. tostring(effect_index)):set_visible(true)
+            effect_index = effect_index + 1
+        end
     end,
 
     --- Hides the item menu and goes back to the main menu.

+ 0 - 2
data/data/scripts/menu/menu_helpers.lua

@@ -1,7 +1,5 @@
 if UiContainer == nil then UiContainer = {} end
 
-print("ADD helpers")
-
 UiContainer.pad_value = function(value, length)
     local str = tostring(value)
     while #(str) < length do

+ 0 - 1
data/data/scripts/menu/name_menu.lua

@@ -50,7 +50,6 @@ UiContainer.NameMenu = {
     -- @param event Trigger event. Normally, "Press".
     on_button = function(self, button, event)
         if UiContainer.current_menu == "name" then
-
             if UiContainer.current_submenu == "confirm" then
                 if button == "Right" then
                     self.confirm_position = self.confirm_position + 1