├── requirements.txt ├── setup.cfg ├── doc ├── source │ ├── _templates │ │ ├── searchbox.html │ │ └── globaltoc.html │ ├── changelog_link.rst │ ├── api.rst │ ├── contributing.rst │ ├── release.rst │ ├── index.rst │ ├── design.rst │ ├── using.rst │ └── conf.py ├── requirements.txt ├── Makefile └── make.bat ├── tests ├── data │ ├── not_a_valid.defold │ ├── science.defold │ ├── simple.defold │ ├── not_a_valid_text.defold │ ├── embedded.defold │ ├── nested.defold │ └── special_character.defold ├── validate_deftree.py ├── profiling │ ├── profile_deftree.py │ └── profile.defold └── test_deftree.py ├── .travis.yml ├── tools ├── pre-release.sh └── release.sh ├── LICENSE ├── .gitignore ├── setup.py ├── README.rst ├── CHANGELOG.rst └── deftree └── __init__.py /requirements.txt: -------------------------------------------------------------------------------- 1 | typing -------------------------------------------------------------------------------- /setup.cfg: -------------------------------------------------------------------------------- 1 | [bdist_wheel] -------------------------------------------------------------------------------- /doc/source/_templates/searchbox.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /doc/requirements.txt: -------------------------------------------------------------------------------- 1 | sphinx_autodoc_typehints -------------------------------------------------------------------------------- /doc/source/changelog_link.rst: -------------------------------------------------------------------------------- 1 | :tocdepth: 1 2 | 3 | Changelog 4 | ######### 5 | 6 | .. include:: ../../CHANGELOG.rst 7 | -------------------------------------------------------------------------------- /tests/data/not_a_valid.defold: -------------------------------------------------------------------------------- 1 | animations: { 2 | flip_horizontal: 0 3 | flip_vertical: 0 4 | } 5 | extrude_borders: 2 6 | -------------------------------------------------------------------------------- /tests/data/science.defold: -------------------------------------------------------------------------------- 1 | embedded_instances { 2 | rotation { 3 | x: -5.6546542E-15 4 | y: 4.1751063E-15 5 | z: 1.0E-6 6 | w: 1.0 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: python 2 | python: 3 | - "3.3" 4 | - "3.4" 5 | - "3.5" 6 | - "3.6" 7 | before_install: 8 | - sudo pip install -r requirements.txt 9 | script: 10 | - python -m unittest discover -s tests/ -------------------------------------------------------------------------------- /tests/data/simple.defold: -------------------------------------------------------------------------------- 1 | animations { 2 | id: "anim" 3 | start_tile: 1 4 | end_tile: 1 5 | playback: PLAYBACK_ONCE_FORWARD 6 | fps: 30 7 | flip_horizontal: 0 8 | flip_vertical: 0 9 | } 10 | extrude_borders: 2 11 | -------------------------------------------------------------------------------- /tools/pre-release.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | cd .. 3 | python -m coverage run --omit=tests/test_deftree.py -m unittest discover -s tests/ 4 | python -m coverage report 5 | python -m coverage html 6 | 7 | open htmlcov/index.html 8 | 9 | 10 | cd doc 11 | make html 12 | open build/html/index.html 13 | -------------------------------------------------------------------------------- /tests/data/not_a_valid_text.defold: -------------------------------------------------------------------------------- 1 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. 2 | Duis sed feugiat sapien. Donec eu consectetur ante. Nunc, 3 | Sed at dui ut massa bibendum blandit eget vel velit. 4 | Suspendisse lobortis sagittis sapien at vulputate. Sed 5 | facilisis erat ultrices pharetra dignissim. Sed metus neque, 6 | aliquam non ullamcorper non, sagittis sit amet purus. -------------------------------------------------------------------------------- /doc/source/_templates/globaltoc.html: -------------------------------------------------------------------------------- 1 | {# 2 | basic/globaltoc.html 3 | ~~~~~~~~~~~~~~~~~~~~ 4 | 5 | Sphinx sidebar template: global table of contents. 6 | 7 | :copyright: Copyright 2007-2017 by the Sphinx team, see AUTHORS. 8 | :license: BSD, see LICENSE for details. 9 | #} 10 |

{{ _('DefTree') }}

11 | {{ toctree(includehidden=True) }} -------------------------------------------------------------------------------- /tests/data/embedded.defold: -------------------------------------------------------------------------------- 1 | embedded_components { 2 | id: "sprite" 3 | type: "sprite" 4 | data: "tile_set: \"\"\n" 5 | "default_animation: \"\"\n" 6 | "material: \"/builtins/materials/sprite.material\"\n" 7 | "blend_mode: BLEND_MODE_ALPHA\n" 8 | "" 9 | position { 10 | x: 0.0 11 | y: 0.0 12 | z: 0.0 13 | } 14 | rotation { 15 | x: 0.0 16 | y: 0.0 17 | z: 0.0 18 | w: 1.0 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /doc/source/api.rst: -------------------------------------------------------------------------------- 1 | DefTree API 2 | =========== 3 | 4 | .. toctree:: 5 | :maxdepth: 2 6 | 7 | Element 8 | ******* 9 | 10 | .. autoclass:: deftree.Element 11 | :members: 12 | 13 | Attribute 14 | ********* 15 | 16 | .. autoclass:: deftree.Attribute 17 | :members: 18 | 19 | DefTree 20 | ******* 21 | 22 | .. autoclass:: deftree.DefTree 23 | :members: 24 | 25 | Helpers 26 | ******* 27 | 28 | .. autofunction:: deftree.parse 29 | .. autofunction:: deftree.from_string 30 | .. autofunction:: deftree.is_element 31 | .. autofunction:: deftree.is_attribute 32 | .. autofunction:: deftree.to_string 33 | .. autofunction:: deftree.dump 34 | .. autofunction:: deftree.validate 35 | -------------------------------------------------------------------------------- /doc/Makefile: -------------------------------------------------------------------------------- 1 | # Minimal makefile for Sphinx documentation 2 | # 3 | 4 | # You can set these variables from the command line. 5 | SPHINXOPTS = 6 | SPHINXBUILD = /Users/mattias.hedberg/.pyenv/versions/3.5.0/bin/python3.5 -c "import sys,sphinx;sys.exit(sphinx.main(sys.argv))" 7 | SPHINXPROJ = DefTree 8 | SOURCEDIR = source 9 | BUILDDIR = build 10 | 11 | # Put it first so that "make" without argument is like "make help". 12 | help: 13 | @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) 14 | 15 | .PHONY: help Makefile 16 | 17 | # Catch-all target: route all unknown targets to Sphinx using the new 18 | # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). 19 | %: Makefile 20 | @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) -------------------------------------------------------------------------------- /tests/data/nested.defold: -------------------------------------------------------------------------------- 1 | name: "default" 2 | scale_along_z: 0 3 | embedded_instances { 4 | id: "go" 5 | data: "embedded_components {\n" 6 | " id: \"sprite\"\n" 7 | " type: \"sprite\"\n" 8 | " data: \"tile_set: \\\"\\\"\\n" 9 | "default_animation: \\\"\\\"\\n" 10 | "material: \\\"/builtins/materials/sprite.material\\\"\\n" 11 | "blend_mode: BLEND_MODE_ALPHA\\n" 12 | "\"\n" 13 | " position {\n" 14 | " x: -5\n" 15 | " y: -1.0\n" 16 | " z: -10.0\n" 17 | " }\n" 18 | " rotation {\n" 19 | " x: 10.0\n" 20 | " y: 1.0\n" 21 | " z: 0.15\n" 22 | " w: 4.0\n" 23 | " }\n" 24 | "}\n" 25 | "" 26 | position { 27 | x: 10.0 28 | y: 0.15 29 | z: 4.1751063E-15 30 | } 31 | rotation { 32 | x: -5.6546542E-15 33 | y: -1.0 34 | z: -10.0 35 | w: 1.0 36 | } 37 | scale3 { 38 | x: 1.0 39 | y: 1.0 40 | z: 1.0 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /doc/make.bat: -------------------------------------------------------------------------------- 1 | @ECHO OFF 2 | 3 | pushd %~dp0 4 | 5 | REM Command file for Sphinx documentation 6 | 7 | if "%SPHINXBUILD%" == "" ( 8 | set SPHINXBUILD=sphinx-build 9 | ) 10 | set SOURCEDIR=source 11 | set BUILDDIR=build 12 | set SPHINXPROJ=DefTree 13 | 14 | if "%1" == "" goto help 15 | 16 | %SPHINXBUILD% >NUL 2>NUL 17 | if errorlevel 9009 ( 18 | echo. 19 | echo.The 'sphinx-build' command was not found. Make sure you have Sphinx 20 | echo.installed, then set the SPHINXBUILD environment variable to point 21 | echo.to the full path of the 'sphinx-build' executable. Alternatively you 22 | echo.may add the Sphinx directory to PATH. 23 | echo. 24 | echo.If you don't have Sphinx installed, grab it from 25 | echo.http://sphinx-doc.org/ 26 | exit /b 1 27 | ) 28 | 29 | %SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% 30 | goto end 31 | 32 | :help 33 | %SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% 34 | 35 | :end 36 | popd 37 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Mattias Hedberg 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /doc/source/contributing.rst: -------------------------------------------------------------------------------- 1 | :tocdepth: 1 2 | 3 | Contributing 4 | ============ 5 | 6 | Bug fixes, feature additions, tests, documentation and more can be contributed via issues_ and/or `pull requests`_. All contributions are welcome. 7 | 8 | .. _issues: https://github.com/Jerakin/DefTree/issues 9 | .. _pull requests: https://github.com/Jerakin/DefTree/pulls 10 | 11 | Bug fixes, feature additions, etc. 12 | ********************************** 13 | 14 | Please send a pull request to the master branch. Please include documentation_ and tests_ for new or changed features. Tests or documentation without bug fixes or feature additions are welcome too. 15 | 16 | .. _documentation: https://deftree.readthedocs.io 17 | .. _tests: https://deftree.readthedocs.io 18 | 19 | - Fork the DefTree repository. 20 | - Create a branch from master. 21 | - Develop bug fixes, features, tests, etc. 22 | - Run the test suite. 23 | - Create a pull request to pull the changes from your branch to the DefTree master. 24 | 25 | 26 | Guidelines 27 | ********** 28 | - Separate code commits from reformatting commits. 29 | - Provide tests for any newly added code. 30 | - Follow PEP8. 31 | 32 | Reporting Issues 33 | **************** 34 | When reporting issues, please include code that will reproduce the issue. The best reproductions are self-contained scripts with minimal dependencies. 35 | -------------------------------------------------------------------------------- /tests/data/special_character.defold: -------------------------------------------------------------------------------- 1 | script: "" 2 | background_color { 3 | x: 0.0 4 | y: 0.0 5 | z: 0.0 6 | w: 0.0 7 | } 8 | nodes { 9 | position { 10 | x: 0.0 11 | y: 0.0 12 | z: 0.0 13 | w: 1.0 14 | } 15 | rotation { 16 | x: 0.0 17 | y: 0.0 18 | z: 0.0 19 | w: 1.0 20 | } 21 | scale { 22 | x: 1.0 23 | y: 1.0 24 | z: 1.0 25 | w: 1.0 26 | } 27 | size { 28 | x: 200.0 29 | y: 100.0 30 | z: 0.0 31 | w: 1.0 32 | } 33 | color { 34 | x: 1.0 35 | y: 1.0 36 | z: 1.0 37 | w: 1.0 38 | } 39 | type: TYPE_TEXT 40 | blend_mode: BLEND_MODE_ALPHA 41 | text: "\" !\"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~\"\342\222\266 \342\223\220 \342\222\234\n" 42 | "" 43 | font: "" 44 | id: "password" 45 | xanchor: XANCHOR_NONE 46 | yanchor: YANCHOR_NONE 47 | pivot: PIVOT_CENTER 48 | outline { 49 | x: 1.0 50 | y: 1.0 51 | z: 1.0 52 | w: 1.0 53 | } 54 | shadow { 55 | x: 1.0 56 | y: 1.0 57 | z: 1.0 58 | w: 1.0 59 | } 60 | adjust_mode: ADJUST_MODE_FIT 61 | line_break: false 62 | layer: "" 63 | inherit_alpha: true 64 | alpha: 1.0 65 | outline_alpha: 1.0 66 | shadow_alpha: 1.0 67 | template_node_child: false 68 | text_leading: 1.0 69 | text_tracking: 0.0 70 | overridden_fields: 1 71 | overridden_fields: 9 72 | } 73 | material: "/builtins/materials/gui.material" 74 | adjust_reference: ADJUST_REFERENCE_PARENT 75 | max_nodes: 512 76 | -------------------------------------------------------------------------------- /tests/validate_deftree.py: -------------------------------------------------------------------------------- 1 | import os 2 | import timeit 3 | import deftree 4 | 5 | root_path = os.path.join(os.path.dirname(__file__), "data") 6 | 7 | 8 | def validate_project(project): 9 | acceptable_formats = ["go", "collections", "gui", "atlas", "material", "tilemap", "spinescene", "texture_profile", 10 | "render", "font", "animationset", "cubemap", "collectionfactory", "factory", 11 | "collectionproxy", "collisionobject", "label", "inputbinding", "model", "particlefx", "sound", 12 | "spinemodel", "sprite", "tilesource"] 13 | 14 | acceptable_formats.extend(["defold"]) 15 | print("Starting Validation of project") 16 | for path_root, folders, files in os.walk(project): 17 | for f in files: 18 | if "{0}build{0}".format(os.sep) not in path_root and os.path.splitext(f)[-1][1:] in acceptable_formats: 19 | print("Validating", f) 20 | defold_file = os.path.join(path_root, f) 21 | try: 22 | tree = deftree.parse(defold_file) 23 | root = tree.get_root() 24 | except deftree.ParseError: 25 | print(" Couldn't parse: ", f) 26 | continue 27 | if not deftree.validate(deftree.to_string(root), defold_file): 28 | print(" Error in: {}".format(defold_file)) 29 | 30 | print("Validation of project ended") 31 | 32 | 33 | validate_project(root_path) 34 | 35 | -------------------------------------------------------------------------------- /doc/source/release.rst: -------------------------------------------------------------------------------- 1 | Written for the authors bad memory 2 | 3 | Docs 4 | **** 5 | 6 | Install sphinx and the read the docs theme 7 | 8 | .. code:: bash 9 | 10 | pip install Sphinx 11 | 12 | pip install sphinx_rtd_theme 13 | 14 | 15 | Build and verify documentation 16 | 17 | .. code:: bash 18 | 19 | cd doc 20 | make html 21 | 22 | 23 | 24 | Run unittests 25 | ************* 26 | 27 | Install coverage 28 | 29 | .. code:: bash 30 | 31 | pip install coverage 32 | 33 | 34 | Run unittests with coverage 35 | 36 | .. code:: bash 37 | 38 | coverage run --omit=tests/test_deftree.py -m unittest discover -s tests/ 39 | coverage report 40 | 41 | 42 | 43 | PyPi 44 | **** 45 | 46 | Install dependencies 47 | 48 | .. code:: bash 49 | 50 | pip install twine 51 | pip install wheel 52 | 53 | Build the wheel 54 | 55 | .. code:: bash 56 | 57 | python setup.py bdist_wheel 58 | 59 | Upload to PyPi 60 | 61 | .. code:: bash 62 | 63 | twine upload dist/* 64 | 65 | 66 | Git 67 | *** 68 | 69 | * Tag the release with "release/x.x.x" 70 | * Update the __version__ in deftree.py 71 | * Update CHANGELOG.rst 72 | * Push to repository 73 | * Build documentation on deftree.readthedocs.io 74 | 75 | Step by step 76 | ************ 77 | 78 | * Update version in deftree.py 79 | * Update CHANGELOG.rst 80 | * Do a commit 81 | * Tag the release with "release/x.x.x" 82 | * Push commit 83 | * Push tag 84 | * Build wheel 85 | * Upload wheel 86 | * Build documentation 87 | * Create a git release -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | #PyCharm 2 | .idea/ 3 | 4 | # Byte-compiled / optimized / DLL files 5 | __pycache__/ 6 | *.py[cod] 7 | *$py.class 8 | 9 | # C extensions 10 | *.so 11 | 12 | # Distribution / packaging 13 | .Python 14 | env/ 15 | build/ 16 | develop-eggs/ 17 | dist/ 18 | downloads/ 19 | eggs/ 20 | .eggs/ 21 | lib/ 22 | lib64/ 23 | parts/ 24 | sdist/ 25 | var/ 26 | *.egg-info/ 27 | .installed.cfg 28 | *.egg 29 | 30 | # PyInstaller 31 | # Usually these files are written by a python script from a template 32 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 33 | *.manifest 34 | *.spec 35 | 36 | # Installer logs 37 | pip-log.txt 38 | pip-delete-this-directory.txt 39 | 40 | # Unit test / coverage reports 41 | htmlcov/ 42 | .tox/ 43 | .coverage 44 | .coverage.* 45 | .cache 46 | nosetests.xml 47 | coverage.xml 48 | *,cover 49 | .hypothesis/ 50 | 51 | # Translations 52 | *.mo 53 | *.pot 54 | 55 | # Django stuff: 56 | *.log 57 | local_settings.py 58 | 59 | # Flask stuff: 60 | instance/ 61 | .webassets-cache 62 | 63 | # Scrapy stuff: 64 | .scrapy 65 | 66 | # Sphinx documentation 67 | docs/_build/ 68 | 69 | # PyBuilder 70 | target/ 71 | 72 | # IPython Notebook 73 | .ipynb_checkpoints 74 | 75 | # pyenv 76 | .python-version 77 | 78 | # celery beat schedule file 79 | celerybeat-schedule 80 | 81 | # dotenv 82 | .env 83 | 84 | # virtualenv 85 | .venv/ 86 | venv/ 87 | ENV/ 88 | 89 | # Spyder project settings 90 | .spyderproject 91 | 92 | # Rope project settings 93 | .ropeproject 94 | profiling.csv 95 | token.txt 96 | -------------------------------------------------------------------------------- /doc/source/index.rst: -------------------------------------------------------------------------------- 1 | .. DefTree documentation master file, created by 2 | sphinx-quickstart on Sun Oct 2 12:21:40 2016. 3 | You can adapt this file completely to your liking, but it should at least 4 | contain the root `toctree` directive. 5 | 6 | .. toctree:: 7 | :hidden: 8 | 9 | api 10 | using 11 | design 12 | contributing 13 | changelog_link 14 | 15 | DefTree |version| 16 | ================= 17 | DefTree is a python module for modifying Defold_ documents. The first implementation was inspired by the xml.ElementTree library. 18 | 19 | DefTree reads any Defold document into an object tree hierarchy and follow the these three main concepts 20 | 21 | 1. DefTree represents the complete Defold document as a tree. 22 | 23 | 2. Element represents a single node or block in this tree. 24 | 25 | 3. Attribute represent a name value pair. 26 | 27 | 28 | Installation 29 | ************ 30 | 31 | .. note:: DefTree is only supported by python >= 3.3.0 32 | 33 | DefTree is a native python implementation and thus should work under the most common platforms that supports python. 34 | The package is distributed in the wheel format and is easily installed with pip. 35 | 36 | .. code:: bash 37 | 38 | pip install deftree 39 | 40 | 41 | You need to install the backport of the standard library typing_ module if you are running Python versions older than 3.5 42 | 43 | 44 | .. code:: bash 45 | 46 | pip install typing 47 | 48 | Old Versions 49 | ************ 50 | Old distributions may be accessed via PyPI_. 51 | 52 | .. _Defold: http://www.defold.com/ 53 | .. _typing: https://pypi.org/project/typing/ 54 | .. _PyPi: https://pypi.python.org/pypi/deftree 55 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | from setuptools import setup 2 | # To use a consistent encoding 3 | from codecs import open 4 | from os import path 5 | import re 6 | 7 | here = path.abspath(path.dirname(__file__)) 8 | 9 | # Get the long description from the README file 10 | with open(path.join(here, 'README.rst'), encoding='utf-8') as f: 11 | long_description = f.read() 12 | 13 | 14 | def read(*parts): 15 | with open(path.join(here, *parts), 'r') as fp: 16 | return fp.read() 17 | 18 | 19 | def find_version(*file_paths): 20 | version_file = read(*file_paths) 21 | version_match = re.search(r"^__version__ = ['\"]([^'\"]*)['\"]", 22 | version_file, re.M) 23 | if version_match: 24 | return version_match.group(1) 25 | raise RuntimeError("Unable to find version string.") 26 | 27 | setup( 28 | name='deftree', 29 | version=find_version("deftree/__init__.py"), 30 | description='Python module to modify Defold files', 31 | long_description=long_description, 32 | url='https://github.com/Jerakin/DefTree', 33 | author='Mattias.Hedberg', 34 | author_email='hedberg.a.mattias@gmail.com', 35 | python_requires='>=3', 36 | classifiers=[ 37 | 'Development Status :: 4 - Beta', 38 | 'Intended Audience :: Developers', 39 | 'Topic :: Software Development :: Build Tools', 40 | 41 | 'License :: OSI Approved :: MIT License', 42 | 43 | 'Programming Language :: Python :: 3.3', 44 | 'Programming Language :: Python :: 3.4', 45 | 'Programming Language :: Python :: 3.5', 46 | 'Programming Language :: Python :: 3.6', 47 | ], 48 | 49 | keywords='defold deftree development', 50 | packages=["deftree"] 51 | 52 | ) 53 | -------------------------------------------------------------------------------- /tests/profiling/profile_deftree.py: -------------------------------------------------------------------------------- 1 | # This is used to see so I don't make stupid changes 2 | 3 | import deftree 4 | import os 5 | import timeit 6 | import csv 7 | import datetime 8 | import cProfile 9 | 10 | 11 | root_path = os.path.dirname(__file__) 12 | profiling_document = os.path.join(root_path, 'profile.defold') 13 | csv_profile_data = os.path.join(root_path, 'profiling.csv') 14 | 15 | 16 | def timing_parse(): 17 | print("Warning: This can take anything between 0 seconds to minutes") 18 | times = 300 19 | value = timeit.timeit( 20 | stmt="deftree.parse('{}')".format(profiling_document), 21 | setup="import deftree; import os", number=times) 22 | 23 | print("Total time spent: {}, Number of times ran: {}".format(value, times)) 24 | return value/times 25 | 26 | 27 | def store_timing_data(): 28 | if not os.path.exists(csv_profile_data): 29 | with open(csv_profile_data, "w", newline='') as csvfile: 30 | _writer = csv.writer(csvfile, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL) 31 | _writer.writerow(['sep=,']) 32 | _writer.writerow(["Date", "Version", "Average Time", "profile.defold modified"]) 33 | 34 | with open(csv_profile_data, "a", newline='') as csvfile: 35 | now = datetime.datetime.now() 36 | profile_doc = datetime.datetime.fromtimestamp(os.path.getmtime(profiling_document)) 37 | 38 | _writer = csv.writer(csvfile, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL) 39 | _writer.writerow( 40 | [now.strftime("%Y-%m-%d"), deftree.__version__, timing_parse(), profile_doc.strftime("%Y-%m-%d %H:%M")]) 41 | 42 | 43 | def profile_parse(): 44 | cProfile.run('for x in range(200): deftree.parse("{}")'.format(profiling_document)) 45 | 46 | store_timing_data() 47 | -------------------------------------------------------------------------------- /README.rst: -------------------------------------------------------------------------------- 1 | ####### 2 | DefTree 3 | ####### 4 | 5 | .. image:: https://travis-ci.org/Jerakin/DefTree.svg?branch=master 6 | :target: https://travis-ci.org/Jerakin/DefTree 7 | 8 | .. image:: https://img.shields.io/github/release/jerakin/deftree.svg 9 | :target: https://github.com/jerakin/deftree/releases 10 | 11 | DefTree is a python module for modifying `Defold `_ documents. 12 | 13 | 14 | Install 15 | ======= 16 | 17 | .. code:: bash 18 | 19 | pip install deftree 20 | 21 | Dependencies 22 | ============ 23 | 24 | You need to install the backport of the standard library typing module if you are running Python versions older than 3.5 25 | 26 | .. code:: bash 27 | 28 | pip install typing 29 | 30 | Example Usage 31 | ============= 32 | 33 | Changing an atlas extrude border setting 34 | 35 | .. code:: python 36 | 37 | import deftree 38 | tree = deftree.parse(path) # parse the document into a DefTree 39 | root = tree.get_root() # returns the root from the tree 40 | root.set_attribute("extrude_borders", 2) # sets the attribute "extrude_boarders" to 2 41 | tree.write() # writes the file to the parsed files path 42 | 43 | API 44 | === 45 | 46 | You can find the `API `_ on `readthedocs `_. 47 | 48 | 49 | Contributing 50 | ============ 51 | 52 | Please take a look at the `contributing `_ guidelines if you're interested in helping! 53 | 54 | 55 | More information 56 | ================ 57 | 58 | Around the web, the initial post on `forum.defold.com `_, the package on `PyPi `_ and of course the repo on 59 | `github `_. 60 | -------------------------------------------------------------------------------- /doc/source/design.rst: -------------------------------------------------------------------------------- 1 | :tocdepth: 1 2 | 3 | Design 4 | ====== 5 | Here I would like to go over some important details concerning implementation that may help when working with DefTree. 6 | 7 | Defold Value vs Python Value 8 | **************************** 9 | 10 | To simplify working with attributes I decided to split how the value looks for Defold and how it looks for python. 11 | Not only does this simplify working with attributes it also enables us to do some sanity checking to ensure that we do not set a value that was an int to a float, as this would make the file corrupt for the Defold editor. 12 | 13 | Defold will always enclose a string within two quotes like "/main/defold.png". To make it easier for us to work with it DefTree reports this as /main/defold.png, i.e. without the quotes. As an example, let us assume we have a file that looks as follows: 14 | 15 | .. code:: json 16 | 17 | nodes { 18 | id: "sprite" 19 | blend_mode: BLEND_MODE_ALPHA 20 | inherit_alpha: true 21 | } 22 | 23 | This enables the user to do this: 24 | 25 | .. code:: python 26 | 27 | tree = root.parse(my_atlas) 28 | root.get_root() 29 | 30 | for ele in root.get_element("nodes"): 31 | node_id = ele.get_attribute("id") 32 | alpha = ele.get_attribute("inherit_alpha") 33 | if node_id == "sprite" and alpha: 34 | ... 35 | 36 | in contrast to: 37 | 38 | .. code:: python 39 | 40 | tree = root.parse(my_atlas) 41 | root.get_root() 42 | 43 | for ele in root.get_element("nodes"): 44 | node_id= ele.get_attribute("id") 45 | alpha = ele.get_attribute("inherit_alpha") 46 | if node_id == "/"sprite/"" and alpha == "true": # or '"sprite"' 47 | ... 48 | 49 | The former is a lot more readable and not as error prone, as I see it. 50 | 51 | Attribute types 52 | --------------- 53 | The attribute's type is decided on creation and follow the logic below: 54 | 55 | If the value is of type(bool) or a string equal to "true" or "false" it is considered a bool. 56 | 57 | If the value consists of only capital letters and underscore (regex'd against :code:`[A-Z_]+`) it is considered an enum. 58 | 59 | If the value is of type(float) or it looks like a float (regex'd against :code:`[-\d]+\.\d+[eE-]+\d+|[-\d]+\.\d+`) it is considered a float. 60 | 61 | If the value is of type(int) or can be converted with int() it is considered an int. 62 | 63 | Else it is considered a string. 64 | -------------------------------------------------------------------------------- /tools/release.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | BUMP_VERSION=$1 3 | 4 | # ------------------------------------------------------------------------------------------------------------ 5 | # CHECK THAT GIT IS CLEAN 6 | 7 | if ! git diff-index --quiet HEAD --; 8 | then 9 | echo "GIT IS DIRTY" 10 | exit 1 11 | fi 12 | 13 | branch=$(git rev-parse --abbrev-ref HEAD) 14 | 15 | if ! [ $branch == "master" ]; 16 | then 17 | echo "Releases are only allowed on master" 18 | exit 1 19 | fi 20 | 21 | 22 | # ------------------------------------------------------------------------------------------------------------ 23 | # UPDATE THE VERSION NUMBER 24 | 25 | # Grep the version number 26 | STRING_VERSION=$(grep --regexp='__version__\s=\s".*"' ../deftree.py) 27 | 28 | #remove __version__ 29 | VERSION=${STRING_VERSION/"__version__ = "/} 30 | 31 | # Remove quotation marks before and after 32 | VERSION=${VERSION##\"} 33 | VERSION=${VERSION%%\"} 34 | 35 | echo "OLD VERSION: ${VERSION}" 36 | 37 | # Split the version on dot 38 | a=( ${VERSION//./ } ) 39 | 40 | # Update the version number 41 | if [ "$BUMP_VERSION" == "mayor" ] 42 | then 43 | ((a[0]++)) 44 | a[1]=0 45 | a[2]=0 46 | 47 | elif [ "$BUMP_VERSION" == "minor" ] 48 | then 49 | ((a[1]++)) 50 | a[2]=0 51 | 52 | elif [ "$BUMP_VERSION" == "patch" ] 53 | then 54 | ((a[2]++)) 55 | 56 | else 57 | echo "NO VERSION SPECIFIED" 58 | exit 1 59 | fi 60 | 61 | NEW_VERSION="${a[0]}.${a[1]}.${a[2]}" 62 | 63 | 64 | echo "Updating from ${VERSION} to ${NEW_VERSION}" 65 | 66 | # Update the __version__ 67 | sed -i '' "s/$STRING_VERSION/__version__ = \"${NEW_VERSION}\"/" ../CHANGELOG.rst 68 | 69 | # ------------------------------------------------------------------------------------------------------------ 70 | # UPDATE THE CHANGELOG 71 | 72 | UNRELEASED_TAG=$(grep -e UNRELEASED ../deftree.py) 73 | 74 | if [ UNRELEASED_TAG ] 75 | then 76 | CHANGLOG_TITLE="\`${NEW_VERSION} \`_" 77 | sed -i '' "s#UNRELEASED#$CHANGLOG_TITLE#" ../CHANGELOG.rst 78 | fi 79 | 80 | # ------------------------------------------------------------------------------------------------------------ 81 | # COMMIT CHANGES AND ADD TAG 82 | 83 | git add ../CHANGELOG.rst 84 | git add ../deftree.py 85 | 86 | git commit -m "release ${NEW_VERSION}" 87 | 88 | git push origin master 89 | 90 | git tag "release/${NEW_VERSION}" 91 | 92 | git push origin "release/${NEW_VERSION}" 93 | 94 | 95 | # ------------------------------------------------------------------------------------------------------------ 96 | # PyPi 97 | 98 | python ../setup.py bdist_wheel 99 | twine upload "../dist/deftree-${NEW_VERSION}-py3-none-any.whl" 100 | 101 | 102 | # ------------------------------------------------------------------------------------------------------------ 103 | # Trigger Document build 104 | # TOKEN=$(cat token.txt) 105 | # curl -X POST -d "branches=master" -d "token=${TOKEN}" http://www.readthedocs.org/api/v2/webhook/deftree/29031/ -------------------------------------------------------------------------------- /doc/source/using.rst: -------------------------------------------------------------------------------- 1 | :tocdepth: 1 2 | Using DefTree 3 | ============= 4 | If you are not familiar with Defold files this is how the syntax looks, it is in a `Google Protobuf`_ format. 5 | 6 | .. code:: javascript 7 | 8 | elementname { 9 | attributename: attributevalue 10 | position { 11 | x: 0.0 12 | y: 0.0 13 | z: 0.0 14 | } 15 | type: TYPE_BOX 16 | blend_mode: BLEND_MODE_ALPHA 17 | texture: "atlas/logo" 18 | id: "logo" 19 | } 20 | 21 | 22 | Parsing Defold Documents 23 | ************************ 24 | 25 | Parsing from a file is done by calling the parse method 26 | 27 | .. code:: python 28 | 29 | import deftree 30 | tree = deftree.parse(path) # parse the document into a DefTree 31 | root = tree.get_root() # returns the root from the tree 32 | 33 | Or alternatively we can first create a DefTree instance 34 | 35 | .. code:: python 36 | 37 | tree = deftree.Deftree() 38 | root = tree.parse(path) 39 | 40 | We can also parse a document from a string 41 | 42 | .. code:: python 43 | 44 | tree = deftree.from_string(document_as_string) # parse the document into a DefTree 45 | root = tree.get_root() # returns the root from the tree 46 | 47 | Finding interesting elements 48 | **************************** 49 | 50 | Element has some useful methods that help iterate recursively over all 51 | the sub-tree below it (its children, their children, and so on). For 52 | example, Element.iter(): 53 | 54 | .. code:: python 55 | 56 | for child in root.iter(): 57 | print(child.name) 58 | 59 | We can also iterate only elements by calling Element.iter_elements() 60 | 61 | .. code:: python 62 | 63 | for child in root.iter_elements(): 64 | print(child.name) 65 | 66 | for child in root.iter_elements("nodes"): # iter_elements also supports filtering on name 67 | print(child.name) 68 | 69 | Element.get_attribute() finds the first attributes with the given name 70 | in that element. 71 | 72 | .. code:: python 73 | 74 | attribute = element.get_attribute("id") 75 | 76 | 77 | Modifying existing scenes 78 | ************************* 79 | 80 | DefTree provides a simple way to edit Defold documents and write them 81 | to files. The DefTree.write() method serves this purpose. Once created, 82 | an Element object may be manipulated by directly changing its fields, 83 | as well as adding new children (for example with Element.insert()). 84 | 85 | E.g. if we want to find all box-nodes in a gui and change its layers. 86 | 87 | .. code:: python 88 | 89 | for element in root.iter_elements("nodes") 90 | if element.get_attribute("type") == "TYPE_BOX": 91 | element.set_attribute("layer", 'new_layer') 92 | 93 | We can also add new attributes and elements all together. 94 | 95 | .. code:: python 96 | 97 | new_element = root.add_element("layers") 98 | new_element.add_attribute("name", 'new_layer') 99 | 100 | DefTree Attributes that are of number types support basic math functions directly 101 | 102 | .. code:: python 103 | 104 | new_element = root.get_element("position") 105 | attribute = new_element.get_attribute("x") 106 | attribute += 10 107 | 108 | You can either use the set value if you are getting, or you can use its .value property 109 | 110 | .. code:: python 111 | 112 | attribute = element.get_attribute("layer") 113 | attribute.value = "new_layer" 114 | 115 | We will probably then overwrite the file 116 | 117 | .. code:: python 118 | 119 | tree.write(tree.get_document_path()) 120 | 121 | .. _Google Protobuf: https://developers.google.com/protocol-buffers/ 122 | -------------------------------------------------------------------------------- /doc/source/conf.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # -*- coding: utf-8 -*- 3 | # 4 | # DefTree documentation build configuration file, created by 5 | # sphinx-quickstart on Sun Oct 2 12:21:40 2016. 6 | # 7 | # This file is execfile()d with the current directory set to its 8 | # containing dir. 9 | # 10 | # Note that not all possible configuration values are present in this 11 | # autogenerated file. 12 | # 13 | # All configuration values have a default; values that are commented out 14 | # serve to show the default. 15 | 16 | # If extensions (or modules to document with autodoc) are in another directory, 17 | # add these directories to sys.path here. If the directory is relative to the 18 | # documentation root, use os.path.abspath to make it absolute, like shown here. 19 | # 20 | import os 21 | import sys 22 | sys.path.insert(0, os.path.abspath('../..')) 23 | import deftree 24 | # -- General configuration ------------------------------------------------ 25 | 26 | # Add any Sphinx extension module names here, as strings. They can be 27 | # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom 28 | # ones. 29 | extensions = [ 30 | 'sphinx.ext.autodoc', 31 | 'sphinx_autodoc_typehints', 32 | 'sphinx.ext.coverage' 33 | ] 34 | html_sidebars = {'**': ['globaltoc.html']} 35 | 36 | # Add any paths that contain templates here, relative to this directory. 37 | templates_path = ['_templates'] 38 | 39 | source_suffix = '.rst' 40 | 41 | # The encoding of source files. 42 | # 43 | # source_encoding = 'utf-8-sig' 44 | 45 | # The master toctree document. 46 | master_doc = 'index' 47 | 48 | using = "using" 49 | api = "api" 50 | changelog = "changelog_link" 51 | design = "design" 52 | 53 | # General information about the project. 54 | project = 'DefTree' 55 | copyright = '2018, mattias.hedberg' 56 | author = 'mattias.hedberg' 57 | 58 | # The short X.Y version. 59 | version = deftree.__version__ 60 | # The full version, including alpha/beta/rc tags. 61 | release = deftree.__version__ 62 | 63 | 64 | language = None 65 | 66 | # If true, the current module name will be prepended to all description 67 | # unit titles (such as .. function::). 68 | # 69 | add_module_names = True 70 | 71 | # The name of the Pygments (syntax highlighting) style to use. 72 | pygments_style = 'sphinx' 73 | 74 | todo_include_todos = False 75 | 76 | 77 | # -- Options for HTML output ---------------------------------------------- 78 | 79 | # The theme to use for HTML and HTML Help pages. See the documentation for 80 | # a list of builtin themes. 81 | # 82 | on_rtd = os.environ.get('READTHEDOCS', None) == 'True' 83 | if not on_rtd: # only import and set the theme if we're building docs locally 84 | # html_theme = 'alabaster' 85 | html_theme = 'sphinx_rtd_theme' 86 | 87 | 88 | # Theme options are theme-specific and customize the look and feel of a theme 89 | # further. For a list of options available for each theme, see the 90 | # documentation. 91 | # 92 | html_theme_options = {'navigation_depth': 1} 93 | 94 | html_static_path = ['_static'] 95 | 96 | html_show_sourcelink = False 97 | 98 | htmlhelp_basename = 'DefTreedoc' 99 | 100 | # Grouping the document tree into LaTeX files. List of tuples 101 | # (source start file, target name, title, 102 | # author, documentclass [howto, manual, or own class]). 103 | latex_documents = [ 104 | (master_doc, 'DefTree.tex', 'DefTree Documentation', 105 | 'mattias.hedberg', 'manual'), 106 | ] 107 | 108 | # -- Options for manual page output --------------------------------------- 109 | 110 | # One entry per manual page. List of tuples 111 | # (source start file, name, description, authors, manual section). 112 | man_pages = [ 113 | (master_doc, 'deftree', 'DefTree Documentation', 114 | [author], 1), 115 | (api, 'API', 'DefTree API', 116 | [author], 2), 117 | (using, 'Using', 'Using DefTree', 118 | [author], 3), 119 | (design, 'Design', 'Design', 120 | [author], 4), 121 | (changelog, 'Changelog', 'Changelog for DefTree', 122 | [author], 5) 123 | ] 124 | 125 | # If true, show URL addresses after external links. 126 | # 127 | # man_show_urls = False 128 | 129 | 130 | # -- Options for Texinfo output ------------------------------------------- 131 | 132 | # Grouping the document tree into Texinfo files. List of tuples 133 | # (source start file, target name, title, author, 134 | # dir menu entry, description, category) 135 | texinfo_documents = [ 136 | (master_doc, 'DefTree', 'DefTree Documentation', 137 | author, 'DefTree', 'Python interface for Defold files.', 138 | 'Miscellaneous'), 139 | ] 140 | -------------------------------------------------------------------------------- /CHANGELOG.rst: -------------------------------------------------------------------------------- 1 | ------------------------------------------------------------------------------------------ 2 | `2.1.4 `_ 3 | ------------------------------------------------------------------------------------------ 4 | 5 | Changed 6 | ===== 7 | - Fixed a small issue with the typing 8 | 9 | ------------------------------------------------------------------------------------------ 10 | `2.1.3 `_ 11 | ------------------------------------------------------------------------------------------ 12 | 13 | Changed 14 | ===== 15 | - `#6 `_ Science annotation are now serialized properly 16 | 17 | ------------------------------------------------------------------------------------------ 18 | `2.1.1 `_ 19 | ------------------------------------------------------------------------------------------ 20 | 21 | Added 22 | ===== 23 | - Added split and rsplit for DefTreeString 24 | - Added \_\_contains__ for DefTreeString 25 | - `#5 `_ Added type hints for arguments 26 | 27 | ------------------------------------------------------------------------------------------ 28 | `2.1.0 `_ 29 | ------------------------------------------------------------------------------------------ 30 | 31 | Added 32 | ===== 33 | - Added type hints for return types, helps IDEs with autocomplete 34 | 35 | Changed 36 | ======= 37 | - DefTree.write() argument file_path is now optional, uses the parsers file path as default 38 | 39 | ------------------------------------------------------------------------------------------ 40 | `2.0.0 `_ 41 | ------------------------------------------------------------------------------------------ 42 | 43 | Added 44 | ===== 45 | - Added the following functions for the DefTreeString implementation: endswith, startswith, strip, rstrip, count, index, rindex, replace 46 | - Added Attribute implementation for len() 47 | 48 | Changed 49 | ======= 50 | - repr() for Elements and Attributes now returns a proper formatted representations of the object 51 | - \_\_str\_\_ on Attributes removed, now defaults back to repr() 52 | - uses python standard library copy for getting a copy of a elements 53 | 54 | Removed 55 | ======= 56 | - Removed Element._set_attribute_name(), name of attributes should be changed with Attribute.name 57 | 58 | .... 59 | 60 | ------------------------------------------------------------------------------------------ 61 | `1.1.1 `_ 62 | ------------------------------------------------------------------------------------------ 63 | 64 | Changed 65 | ======= 66 | - Fixed a bug where a negative number would be evaluated as a string 67 | 68 | .... 69 | 70 | ------------------------------------------------------------------------------------------ 71 | `1.1.0 `_ 72 | ------------------------------------------------------------------------------------------ 73 | Added 74 | ===== 75 | - Added Element.iter_attributes to iterate over the elements and its children's elements attributes 76 | 77 | Changed 78 | ======= 79 | - Only imports re.compile from re instead of the whole of re 80 | - The string value of an attribute can now be get with Attribute.string 81 | - The Attribute.value and the value Attribute() returns should be the same 82 | - Now reports the python value when calling the __str__ method instead of the defold value 83 | - is_element and is_attribute are no longer flagged as internal 84 | - improved type checking when setting attribute values 85 | 86 | .... 87 | 88 | ------------------------------------------------------------------------------------------ 89 | `1.0.2 `_ 90 | ------------------------------------------------------------------------------------------ 91 | Changed 92 | ======= 93 | - How DefTree determines if a string is a string, int or float. Fix for bigger numbers with science annotation 94 | 95 | .... 96 | 97 | ------------------------------------------------------------------------------------------ 98 | `1.0.1 `_ 99 | ------------------------------------------------------------------------------------------ 100 | Added 101 | ===== 102 | - Added Element.add_element(name) 103 | - Added Element.add_attribute(name, value) 104 | - Added Element.set_attribute(name, value) 105 | - Added Element.elements() - for getting top level elements of Element 106 | - Added Element.attribute() - for getting top level attribute of Element 107 | - Exposed deftree.dump and deftree.validate in the documentation 108 | - Added DefTree.get_document_path() to get the path of the document that was parsed 109 | - Attribute are now sub classed into different types this to make it easier when editing values as Defold is picky 110 | 111 | Changed 112 | ======= 113 | - Element.iter_all() is now Element.iter() 114 | - Element.iter_find_elements(name) is now Element.iter_elements(name) 115 | - Changed how attributes reports their value. They should now be easier to work with, without any need add quotationmarks and such. 116 | 117 | Removed 118 | ======= 119 | - Removed SubElement() factory, now use element.add_element() 120 | - Removed Element.iter_attributes() 121 | - Removed Element.iter_find_attributes() 122 | - Removed NaiveDefParser as it was obsolete and inferior 123 | - Removed Example folder 124 | 125 | .... 126 | 127 | ------------------------------------------------------------------------------------------ 128 | `0.2.0 `_ 129 | ------------------------------------------------------------------------------------------ 130 | 131 | Added 132 | ===== 133 | - Raises ParseError when reading invalid documents 134 | 135 | Changed 136 | ======= 137 | - Updated docstrings to be easier to read. 138 | - Refactored internal usage of a level variable to track how deep the item were in the tree 139 | 140 | Removed 141 | ======= 142 | - Removed Element.add(), use Element.append() Element.insert() 143 | - Removed Element.items(), use Element.iter_all() 144 | 145 | .... 146 | 147 | ------------------------------------------------------------------------------------------ 148 | `0.1.1 `_ 149 | ------------------------------------------------------------------------------------------ 150 | 151 | Added 152 | ===== 153 | - Licence to github repository 154 | - Setup files for PyPi to github repository 155 | - Example usage 156 | - Unittesting with `unittest `_ 157 | - Coverage exclusion for usage with `Coverage.py `_ 158 | - Using __all__ to define public api, in case of wild import 159 | 160 | Changed 161 | ======= 162 | - Elements \_\_setitem__ raises exception on invalid types 163 | - Elements \_\_next__ implementation was broken 164 | - serialize() is now a class method 165 | 166 | .... 167 | 168 | 169 | ------------------------------------------------------------------------------------------------------------------- 170 | `0.1.0 `_ 171 | ------------------------------------------------------------------------------------------------------------------- 172 | 173 | Added 174 | ===== 175 | - First release of DefTree -------------------------------------------------------------------------------- /tests/test_deftree.py: -------------------------------------------------------------------------------- 1 | import os 2 | import shutil 3 | import unittest 4 | 5 | # hack the import 6 | import sys 7 | if os.path.dirname(os.path.dirname(__file__)) not in sys.path: 8 | sys.path.append(os.path.dirname(os.path.dirname(__file__))) 9 | 10 | import deftree 11 | 12 | 13 | def is_valid(path): 14 | tree = deftree.parse(path) 15 | root = tree.get_root() 16 | return deftree.validate(deftree.to_string(root), path) 17 | 18 | 19 | class TestDefTreeParsing(unittest.TestCase): 20 | root_path = os.path.join(os.path.dirname(__file__), "data") 21 | 22 | @classmethod 23 | def setUpClass(cls): 24 | os.makedirs(os.path.join(cls.root_path, "_copy"), exist_ok=True) 25 | 26 | @classmethod 27 | def tearDownClass(cls): 28 | shutil.rmtree(os.path.join(cls.root_path, "_copy")) 29 | 30 | def test_parsing_embedded_data(self): 31 | path = os.path.join(self.root_path, "embedded.defold") 32 | self.assertTrue(is_valid(path), "Failed validating - embedded.defold") 33 | 34 | def test_parsing_nested_embedded_data(self): 35 | path = os.path.join(self.root_path, "nested.defold") 36 | self.assertTrue(is_valid(path), "Failed validating - nested.defold") 37 | 38 | def test_parsing_with_special_characters(self): 39 | path = os.path.join(self.root_path, "special_character.defold") 40 | self.assertTrue(is_valid(path), "Failed validating - special_character.defold") 41 | 42 | def test_parsing_invalid_document(self): 43 | with self.assertRaises(deftree.ParseError): 44 | is_valid(os.path.join(self.root_path, "not_a_valid.defold")) 45 | with self.assertRaises(deftree.ParseError): 46 | is_valid(os.path.join(self.root_path, "not_a_valid_text.defold")) 47 | 48 | def test_document_path(self): 49 | path = os.path.join(self.root_path, "embedded.defold") 50 | tree = deftree.parse(path) 51 | self.assertTrue(tree.get_document_path() == path) 52 | 53 | def test_parse_from_string(self): 54 | string_doc = """profiles {\n name: "Landscape"\n qualifiers {\n width: 1280\n height: 720\n }\n}""" 55 | string_tree = deftree.from_string(string_doc) 56 | string_root = string_tree.get_root() 57 | 58 | tree = deftree.DefTree() 59 | root = tree.get_root() 60 | profiles = root.add_element("profiles") 61 | profiles.add_attribute("name", '"Landscape"') 62 | qualifiers = profiles.add_element("qualifiers") 63 | qualifiers.add_attribute("width", "1280") 64 | qualifiers.add_attribute("height", "720") 65 | self.assertTrue(deftree.validate(deftree.to_string(string_root), deftree.to_string(root))) 66 | 67 | def test_writing_with_changed_attribute(self): 68 | path = os.path.join(self.root_path, "simple.defold") 69 | output_path = os.path.join(self.root_path, "_copy", "edit.defold") 70 | tree = deftree.parse(path) 71 | root = tree.get_root() 72 | root.set_attribute("extrude_borders", 99) 73 | tree.write(output_path) 74 | self.assertTrue(deftree.validate(deftree.to_string(root), output_path)) 75 | 76 | def test_writing_to_original_source(self): 77 | test_value = 55 78 | path = os.path.join(self.root_path, "_copy", "simple.defold") 79 | shutil.copy(os.path.join(self.root_path, "simple.defold"), path) 80 | 81 | # Read in copied document and fps to 60, write it 82 | tree = deftree.parse(path) 83 | root = tree.get_root() 84 | a = root.get_element("animations") 85 | attribute = a.get_attribute("fps") 86 | attribute.value = test_value 87 | tree.write() 88 | 89 | # Read in the document again and verify that the value have been changed 90 | tree = deftree.parse(path) 91 | root = tree.get_root() 92 | a = root.get_element("animations") 93 | attribute = a.get_attribute("fps") 94 | self.assertTrue(attribute.value == test_value) 95 | 96 | 97 | class TestDefTreeDisk(unittest.TestCase): 98 | root_path = os.path.join(os.path.dirname(__file__), "data") 99 | 100 | @classmethod 101 | def setUpClass(cls): 102 | os.makedirs(os.path.join(cls.root_path, "_copy"), exist_ok=True) 103 | 104 | @classmethod 105 | def tearDownClass(cls): 106 | shutil.rmtree(os.path.join(cls.root_path, "_copy")) 107 | 108 | def test_writing_empty_file(self): 109 | output_path = os.path.join(self.root_path, "_copy", "empty.defold") 110 | tree = deftree.DefTree() 111 | tree.write(output_path) 112 | self.assertTrue(os.path.exists(output_path), "Failed writing file") 113 | 114 | def test_writing_to_unknown_location_raises_FileNotFoundError(self): 115 | output_path = os.path.join(self.root_path, "_copy", "unknown", "rewrite.defold") 116 | tree = deftree.DefTree() 117 | with self.assertRaises(FileNotFoundError): 118 | tree.write(output_path) 119 | 120 | def test_rewrite_file(self): 121 | path = os.path.join(self.root_path, "simple.defold") 122 | output_path = os.path.join(self.root_path, "_copy", "rewrite.defold") 123 | shutil.copy(path, output_path) 124 | 125 | tree = deftree.parse(output_path) 126 | tree.write(output_path) 127 | self.assertTrue(is_valid(output_path), "Failed rewriting file") 128 | 129 | def test_clear_element(self): 130 | tree = deftree.DefTree() 131 | root = tree.get_root() 132 | parent = root.add_element("parent") 133 | parent.add_attribute("id", "true") 134 | parent.add_attribute("name", "element") 135 | parent.clear() 136 | self.assertIsNone(parent.get_attribute("id"), "Failed clearing element") 137 | 138 | def test_length_of_element(self): 139 | tree = deftree.DefTree() 140 | root = tree.get_root() 141 | self.assertTrue(len(root) == 0, "Fail checking length of Element, more than one child") 142 | root.add_element("parent") 143 | self.assertTrue(len(root) == 1, "Failed checking length of Element, too many children") 144 | 145 | def test_repr_of_element(self): 146 | tree = deftree.DefTree() 147 | root = tree.get_root() 148 | obj = root.add_element("parent") 149 | Element = deftree.Element 150 | self.assertTrue(eval('"{}"'.format(repr(obj))) == str(obj)) 151 | 152 | 153 | class TestDefTreeIteration(unittest.TestCase): 154 | def test_iterating_elements(self): 155 | tree = deftree.DefTree() 156 | root = tree.get_root() 157 | parent = root.add_element("parent") 158 | child = parent.add_attribute("id", True) 159 | child_element = parent.add_element("child") 160 | unique_child_element = parent.add_element("unique_child") 161 | child_element1 = child_element.add_element("child") 162 | self.assertIn(parent, root.iter_elements()) 163 | self.assertIn(child_element1, root.iter_elements()) 164 | self.assertNotIn(child, root.iter_elements()) 165 | 166 | self.assertIn(child_element, parent.elements()) 167 | self.assertNotIn(child_element1, parent.elements()) 168 | 169 | self.assertIn(unique_child_element, parent.elements("unique_child")) 170 | self.assertNotIn(child_element, parent.elements("unique_child")) 171 | 172 | def test_iterating_direct_attributes(self): 173 | tree = deftree.DefTree() 174 | root = tree.get_root() 175 | parent_element = root.add_element("parent") 176 | child_attribute = parent_element.add_attribute("id", True) 177 | self.assertIn(child_attribute, parent_element.attributes()) 178 | self.assertNotIn(parent_element, root.attributes()) 179 | 180 | def test_iterating_attributes(self): 181 | tree = deftree.DefTree() 182 | root = tree.get_root() 183 | parent_element = root.add_element("parent") 184 | child_element = parent_element.add_element("child") 185 | child_attribute = child_element.add_attribute("id", True) 186 | self.assertIn(child_attribute, parent_element.iter_attributes("id")) 187 | 188 | def test_iter_element_with_filter(self): 189 | tree = deftree.DefTree() 190 | root = tree.get_root() 191 | parent = root.add_element("parent") 192 | child = parent.add_element("child") 193 | self.assertIn(child, root.iter_elements("child")) 194 | 195 | def test_iter_all(self): 196 | tree = deftree.DefTree() 197 | root = tree.get_root() 198 | parent = root.add_element("parent") 199 | attr_child = root.add_attribute("attr", "value") 200 | child1 = parent.add_element("child") 201 | child2 = parent.add_element("child") 202 | child3 = child1.add_element("child") 203 | child4 = child2.add_element("child") 204 | self.assertIn(parent, root.iter()) 205 | self.assertIn(attr_child, root.iter()) 206 | self.assertIn(child1, root.iter()) 207 | self.assertIn(child2, root.iter()) 208 | self.assertIn(child3, root.iter()) 209 | self.assertIn(child4, root.iter()) 210 | 211 | self.assertNotIn(child4, child1.iter()) 212 | 213 | def test_getting_the_next_child(self): 214 | tree = deftree.DefTree() 215 | root = tree.get_root() 216 | check_against = ["first", "second", "third", "forth", "fifth"] 217 | root.add_attribute("first", "bah") 218 | root.add_attribute("second", "true") 219 | root.add_attribute("third", "atr") 220 | root.add_attribute("forth", "atr") 221 | root.add_attribute("fifth", "atr") 222 | for name in check_against: 223 | self.assertTrue(next(root).name == name) 224 | 225 | def test_getting_stop_iteration_on_next(self): 226 | tree = deftree.DefTree() 227 | root = tree.get_root() 228 | check_against = ["first", "second", "missing"] 229 | root.add_attribute("first", "bah") 230 | root.add_attribute("second", "true") 231 | with self.assertRaises(StopIteration): 232 | for _ in check_against: 233 | next(root) 234 | 235 | def test_getitem_return_index_error(self): 236 | tree = deftree.DefTree() 237 | root = tree.get_root() 238 | root.add_attribute("first", "bah") 239 | with self.assertRaises(IndexError): 240 | a = root[2] 241 | 242 | def test_index_return_value_error(self): 243 | tree = deftree.DefTree() 244 | root = tree.get_root() 245 | attr = root.add_attribute("first", "bah") 246 | parent = root.add_element("parent") 247 | parent.add_attribute("second", "bah") 248 | with self.assertRaises(ValueError): 249 | parent.index(attr) 250 | 251 | 252 | class TestDefTree(unittest.TestCase): 253 | def test_asserts(self): 254 | tree = deftree.DefTree() 255 | root = tree.get_root() 256 | attribute = root.add_attribute("attr", 1) 257 | element = root.add_element("element") 258 | with self.assertRaises(TypeError): 259 | deftree.assert_is_element_or_attribute("str") 260 | 261 | with self.assertRaises(TypeError): 262 | deftree.assert_is_element(attribute) 263 | 264 | with self.assertRaises(TypeError): 265 | deftree.assert_is_attribute(element) 266 | 267 | try: 268 | deftree.assert_is_element_or_attribute(element) 269 | deftree.assert_is_element_or_attribute(attribute) 270 | except TypeError: 271 | self.fail() 272 | 273 | try: 274 | deftree.assert_is_element(element) 275 | except TypeError: 276 | self.fail() 277 | 278 | try: 279 | deftree.assert_is_attribute(attribute) 280 | except TypeError: 281 | self.fail() 282 | 283 | 284 | class TestDefTreeElement(unittest.TestCase): 285 | def test_adding_attributes_to_element(self): 286 | tree = deftree.DefTree() 287 | root = tree.get_root() 288 | root.add_attribute("my_attribute", "my_value") 289 | self.assertTrue((root.get_attribute("my_attribute") == "my_value"), "Failed adding attribute") 290 | 291 | def test_adding_sub_element(self): 292 | tree = deftree.DefTree() 293 | root = tree.get_root() 294 | element = root.add_element("my_element") 295 | self.assertTrue((root.get_element("my_element") == element), "Failed adding element") 296 | 297 | def test_getting_invalid_element_return_none(self): 298 | tree = deftree.DefTree() 299 | root = tree.get_root() 300 | self.assertIsNone(root.get_element("Nothing"), "Failed adding element") 301 | 302 | def test_removing_children(self): 303 | tree = deftree.DefTree() 304 | root = tree.get_root() 305 | parent = root.add_element("parent") 306 | child1 = parent.add_element("child1") 307 | child2 = parent.add_element("child2") 308 | parent.remove(child2) 309 | self.assertIn(child1, parent, "child1 is not found") 310 | self.assertNotIn(child2, root, "Failed deleting child") 311 | 312 | def test_copy_element(self): 313 | tree = deftree.DefTree() 314 | root = tree.get_root() 315 | parent = root.add_element("parent") 316 | child1 = parent.add_attribute("child", True) 317 | copy_of_parent = parent.copy() 318 | self.assertTrue(parent.get_attribute("child").value == copy_of_parent.get_attribute("child").value) 319 | child1.value = False 320 | self.assertFalse(hex(id(parent.get_attribute("child"))) == hex(id(copy_of_parent.get_attribute("child")))) 321 | self.assertTrue(len(root) == 1) 322 | 323 | 324 | class TestDefTreeAttributes(unittest.TestCase): 325 | def test_getting_missing_attribute(self): 326 | tree = deftree.DefTree() 327 | root = tree.get_root() 328 | self.assertIsNone(root.get_attribute("missing_attribute"), "Failed when returning missing attribute") 329 | 330 | def test_deftree_attribute_numbers_assignment(self): 331 | tree = deftree.DefTree() 332 | root = tree.get_root() 333 | number = root.add_attribute("number", 0) 334 | self.assertTrue(number == 0, "Comparing number to int") 335 | number += 4 336 | self.assertTrue(number == 4, "Number after adding not correct") 337 | number -= 1 338 | self.assertTrue(number == 3, "Comparing number to int") 339 | number *= 3 340 | self.assertTrue(number == 9, "Comparing number to int") 341 | 342 | self.assertTrue(isinstance(number, deftree.DefTreeNumber), 343 | "DefTreeNumber after arithmetics are not DefTreeNumber") 344 | 345 | def test_deftree_attribute_numbers_comparision(self): 346 | tree = deftree.DefTree() 347 | root = tree.get_root() 348 | number = root.add_attribute("number", 0.0) 349 | science = root.add_attribute("science", "4.1751063E-15") 350 | science2 = root.add_attribute("science2", "4.6049512E-4") 351 | self.assertTrue(science == 4.1751063e-15, "Comparing number to int") 352 | self.assertTrue(science2 == 4.6049512E-4, "Comparing number to int") 353 | self.assertTrue(number == 0, "Comparing number to int") 354 | self.assertTrue(number == 0.0, "Comparing number to float") 355 | self.assertTrue(number < 1.0, "Less than comparision") 356 | self.assertTrue(number > -1.0, "More than comparision") 357 | self.assertTrue(number >= 0, "More or equal to comparision") 358 | self.assertTrue(number <= 0, "More or equal to comparision") 359 | 360 | def test_deftree_attribute_number_types(self): 361 | tree = deftree.DefTree() 362 | root = tree.get_root() 363 | number_float_float = root.add_attribute("number_float_float", 0.0) 364 | number_float_float_neg = root.add_attribute("number_float_float", -10.0) 365 | number_float_string = root.add_attribute("number_float_string", "0.0") 366 | number_float_string_neg = root.add_attribute("number_float_float", "-10.0") 367 | number_float_science_long = root.add_attribute("number_float_science_long", "4.1751063E-15") 368 | number_float_science_short = root.add_attribute("number_float_science_short", "4.6049512E-1") 369 | number_int_int = root.add_attribute("number_int_int", 4) 370 | number_int_string = root.add_attribute("number_int_string", "4") 371 | self.assertTrue(isinstance(number_float_float, deftree.DefTreeFloat)) 372 | self.assertTrue(isinstance(number_float_string, deftree.DefTreeFloat)) 373 | self.assertTrue(isinstance(number_float_science_long, deftree.DefTreeFloat)) 374 | self.assertTrue(isinstance(number_float_science_short, deftree.DefTreeFloat)) 375 | self.assertTrue(isinstance(number_float_float_neg, deftree.DefTreeFloat)) 376 | self.assertTrue(isinstance(number_float_string_neg, deftree.DefTreeFloat)) 377 | self.assertTrue(isinstance(number_int_int, deftree.DefTreeInt)) 378 | self.assertTrue(isinstance(number_int_string, deftree.DefTreeInt)) 379 | 380 | def test_deftree_attribute_string_comparision(self): 381 | tree = deftree.DefTree() 382 | root = tree.get_root() 383 | the_string = "my_string" 384 | fake_parsed_string = root.add_attribute("Attribute", '"{}"'.format(the_string)) 385 | self.assertTrue(fake_parsed_string == the_string, "Comparing strings, fake parsed") 386 | my_string_attribute = root.add_attribute("Attribute2", the_string) 387 | self.assertTrue(my_string_attribute == the_string, "Comparing strings, normally added") 388 | self.assertTrue(isinstance(fake_parsed_string, deftree.DefTreeString)) 389 | self.assertTrue(isinstance(my_string_attribute, deftree.DefTreeString)) 390 | 391 | def test_deftree_attribute_enum_comparision(self): 392 | tree = deftree.DefTree() 393 | root = tree.get_root() 394 | the_enum = "MY_FAKE_ENUM" 395 | not_an_enum = "nOT_AN_ENUM" 396 | my_enum = root.add_attribute("Attribute", the_enum) 397 | self.assertTrue(my_enum == the_enum, "Comparing enums") 398 | not_enum = root.add_attribute("Attribute2", not_an_enum) 399 | self.assertTrue(isinstance(my_enum, deftree.DefTreeEnum)) 400 | self.assertFalse(isinstance(not_enum, deftree.DefTreeEnum)) 401 | 402 | def test_deftree_attribute_bool_comparision(self): 403 | tree = deftree.DefTree() 404 | root = tree.get_root() 405 | my_string_true = root.add_attribute("Attribute1", "true") 406 | my_string_false = root.add_attribute("Attribute2", "false") 407 | my_bool_true = root.add_attribute("Attribute3", True) 408 | my_bool_false = root.add_attribute("Attribute4", False) 409 | self.assertTrue(my_string_true == True) 410 | self.assertTrue(my_bool_true == True) 411 | self.assertTrue(my_string_false == False) 412 | self.assertTrue(my_bool_false == False) 413 | self.assertFalse(isinstance(my_string_true.__class__, deftree.DefTreeBool)) 414 | 415 | def test_defstring_attribute_contains_comparision(self): 416 | tree = deftree.DefTree() 417 | root = tree.get_root() 418 | the_string = "my_string" 419 | attribute = root.add_attribute("Attribute", '"{}"'.format(the_string)) 420 | self.assertTrue("my" in attribute) 421 | 422 | def test_repr_of_attribute(self): 423 | tree = deftree.DefTree() 424 | root = tree.get_root() 425 | obj = root.add_attribute("name", "value") 426 | self.assertTrue(eval('"{}"'.format(repr(obj))) == str(obj)) 427 | 428 | def test_attribute_set_number(self): 429 | tree = deftree.DefTree() 430 | root = tree.get_root() 431 | number = root.add_attribute("number", 0.0) 432 | self.assertTrue(number == 0, "Comparing number to int") 433 | self.assertTrue(number == 0.0, "Comparing number to float") 434 | 435 | root.set_attribute("number", 0.0) 436 | self.assertTrue(number == 0, "Comparing number to int") 437 | self.assertTrue(number == 0.0, "Comparing number to float") 438 | 439 | root.set_attribute("number", "1.0") 440 | self.assertTrue(number == 1, "Comparing number to int") 441 | self.assertTrue(number == 1.0, "Comparing number to float") 442 | 443 | root.set_attribute("number", 2) 444 | self.assertTrue(number == 2, "Comparing number to int") 445 | self.assertTrue(number == 2.0, "Comparing number to float") 446 | 447 | with self.assertRaises(ValueError): 448 | root.set_attribute("number", "") 449 | 450 | def test_attribute_set_string(self): 451 | tree = deftree.DefTree() 452 | root = tree.get_root() 453 | the_string = "my_string" 454 | root.add_attribute("Attribute", '"{}"'.format(the_string)) 455 | 456 | root.set_attribute("Attribute", "str") 457 | self.assertTrue(root.get_attribute("Attribute") == "str") 458 | 459 | root.set_attribute("Attribute", '"str"') 460 | self.assertTrue(root.get_attribute("Attribute") == "str") 461 | 462 | with self.assertRaises(ValueError): 463 | root.set_attribute("Attribute", False) 464 | 465 | with self.assertRaises(ValueError): 466 | root.set_attribute("Attribute", 1.0) 467 | 468 | def test_attribute_set_enum(self): 469 | tree = deftree.DefTree() 470 | root = tree.get_root() 471 | the_enum = "MY_FAKE_ENUM" 472 | not_an_enum = "nOT_AN_ENUM" 473 | my_enum = root.add_attribute("Attribute", the_enum) 474 | self.assertTrue(my_enum == the_enum, "Comparing enums") 475 | 476 | with self.assertRaises(ValueError): 477 | root.set_attribute("Attribute", not_an_enum) 478 | with self.assertRaises(ValueError): 479 | root.set_attribute("Attribute", 1.0) 480 | with self.assertRaises(ValueError): 481 | root.set_attribute("Attribute", False) 482 | 483 | def test_attribute_set_bool(self): 484 | tree = deftree.DefTree() 485 | root = tree.get_root() 486 | root.add_attribute("Attribute", "true") 487 | self.assertTrue(root.get_attribute("Attribute") == True) 488 | root.set_attribute("Attribute", True) 489 | self.assertTrue(root.get_attribute("Attribute") == True) 490 | root.set_attribute("Attribute", 1) 491 | self.assertTrue(root.get_attribute("Attribute") == True) 492 | root.set_attribute("Attribute", "false") 493 | self.assertTrue(root.get_attribute("Attribute") == False) 494 | root.set_attribute("Attribute", False) 495 | self.assertTrue(root.get_attribute("Attribute") == False) 496 | root.set_attribute("Attribute", 0) 497 | self.assertTrue(root.get_attribute("Attribute") == False) 498 | with self.assertRaises(ValueError): 499 | root.set_attribute("Attribute", "str") 500 | with self.assertRaises(ValueError): 501 | root.set_attribute("Attribute", "") 502 | with self.assertRaises(ValueError): 503 | root.set_attribute("Attribute", None) 504 | 505 | def test_attribute_number_representation(self): 506 | tree = deftree.DefTree() 507 | root = tree.get_root() 508 | d_number = root.add_attribute("number", 10) 509 | self.assertTrue(d_number == 10) 510 | self.assertTrue(d_number.value == 10) 511 | self.assertTrue(d_number.string == "10") 512 | 513 | def test_attribute_enum_representation(self): 514 | tree = deftree.DefTree() 515 | root = tree.get_root() 516 | d_enum = root.add_attribute("enum", "ENUM") 517 | self.assertTrue(d_enum == "ENUM") 518 | self.assertTrue(d_enum.value == "ENUM") 519 | self.assertTrue(d_enum.string == "ENUM") 520 | 521 | def test_attribute_string_representation(self): 522 | tree = deftree.DefTree() 523 | root = tree.get_root() 524 | d_string = root.add_attribute("string", "deftree") 525 | self.assertTrue(d_string == "deftree") 526 | self.assertTrue(d_string.value == "deftree") 527 | self.assertTrue(d_string.string == '"deftree"') 528 | 529 | def test_attribute_string_manipulation(self): 530 | tree = deftree.DefTree() 531 | root = tree.get_root() 532 | string_test_1 = root.add_attribute("string", "string_my_long_test_string") 533 | string_test_2 = root.add_attribute("string", " string_my_long_test_string ") 534 | self.assertTrue(string_test_1.endswith("string")) 535 | self.assertTrue(string_test_1.startswith("string_my_")) 536 | self.assertTrue(string_test_1.index("string") == 0) 537 | self.assertTrue(string_test_1.rindex("string") == 20) 538 | self.assertTrue(string_test_1.count("_") == 4) 539 | self.assertTrue(string_test_1.replace("long", "cool") == "string_my_cool_test_string") 540 | self.assertTrue(string_test_2.strip() == "string_my_long_test_string") 541 | self.assertTrue(string_test_2.rstrip() == " string_my_long_test_string") 542 | 543 | def test_attribute_length(self): 544 | tree = deftree.DefTree() 545 | root = tree.get_root() 546 | my_string = "string_my_long_test_string" 547 | string_test = root.add_attribute("string", my_string) 548 | number_test = root.add_attribute("number", 10) 549 | self.assertTrue(len(string_test) == len(my_string)) 550 | 551 | def test_attribute_change_value(self): 552 | tree = deftree.DefTree() 553 | root = tree.get_root() 554 | attribute = root.add_attribute("attribute", 1) 555 | self.assertTrue(attribute == 1) 556 | 557 | attribute.value = 2 558 | self.assertTrue(attribute == 2) 559 | 560 | def test_attribute_bool_representation(self): 561 | tree = deftree.DefTree() 562 | root = tree.get_root() 563 | d_bool = root.add_attribute("bool", True) 564 | self.assertTrue(d_bool == True) 565 | self.assertTrue(d_bool.value is True) 566 | self.assertTrue(d_bool.string == "true") 567 | 568 | def test_science_notation(self): 569 | string_doc = """profiles {\n name: "Landscape"\n qualifiers {\n width: 1.0E-6\n height: 4.1751063E-15\n }\n}\n""" 570 | string_tree = deftree.from_string(string_doc) 571 | string_root = string_tree.get_root() 572 | self.assertTrue(deftree.validate(deftree.to_string(string_root), string_doc)) 573 | 574 | 575 | class PublicAPITests(unittest.TestCase): 576 | """Ensures that the correct values are exposed in the public API.""" 577 | 578 | def test_module_all_attribute(self): 579 | self.assertTrue(hasattr(deftree, '__all__')) 580 | target_api = ["DefTree", "to_string", "parse", "dump", "validate", "is_element", "is_attribute", "from_string"] 581 | self.assertEqual(set(deftree.__all__), set(target_api)) 582 | 583 | 584 | def run(): # pragma: no cover 585 | suite = unittest.TestLoader().loadTestsFromTestCase(TestDefTree) 586 | unittest.TextTestRunner(verbosity=1).run(suite) 587 | 588 | 589 | if __name__ == '__main__': # pragma: no cover 590 | run() 591 | -------------------------------------------------------------------------------- /deftree/__init__.py: -------------------------------------------------------------------------------- 1 | """ 2 | Defold files are an inherently hierarchical data format and the most natural way to 3 | represent this is through a tree. This module uses three classes for this purpose: 4 | 5 | 1. DefTree represents the whole document as a tree 6 | 7 | 2. Element represents a single node in this tree 8 | 9 | 3. Attribute represent a name value pair 10 | """ 11 | from re import compile as re_compile 12 | from sys import stdout 13 | from typing import Iterator, Union 14 | 15 | __version__ = "2.1.4" 16 | __all__ = ["DefTree", "to_string", "parse", "dump", "validate", "is_attribute", "is_element", "from_string"] 17 | 18 | 19 | class ParseError(SyntaxError): 20 | pass 21 | 22 | 23 | class _DefParser: 24 | _pattern = r'(?:data:)|(?:^|\s)(\w+):\s+(.+(?:\s+".*)*)|(\w*)\W{|(})' 25 | _regex = re_compile(_pattern) 26 | 27 | def __init__(self, root_element): 28 | self.file_path = None 29 | self.root = root_element 30 | self._element_chain = [self.root] 31 | 32 | def parse(self, source) -> 'Element': 33 | """Loads an external Defold section into this DefTree 34 | 35 | :param source: path to the file. 36 | :returns Element: root Element""" 37 | self.file_path = source 38 | document = self._open(self.file_path) 39 | return self._parse(document) 40 | 41 | @classmethod 42 | def serialize(cls, element, internal=False): 43 | """Returns a string of the element""" 44 | assert_is_element(element) 45 | 46 | def construct_string(node): 47 | """Recursive function that formats the text""" 48 | nonlocal output_string 49 | nonlocal level 50 | for child in node: 51 | element_level = cls._get_level(child) 52 | if is_element(child): 53 | if child.name == "data" and not internal: 54 | value = cls._escape_element(child) 55 | output_string += "{}{}: {}\n".format(" " * element_level, child.name, value) 56 | else: 57 | level += 1 58 | output_string += "{}{} {{\n".format(" " * element_level, child.name) 59 | construct_string(child) 60 | elif is_attribute(child): 61 | output_string += "{}{}: {}\n".format(" " * element_level, child.name, child.string) 62 | 63 | if level > element_level and not child.name == "data": 64 | level -= 1 65 | output_string += "{}{}".format(" " * level, "}\n") 66 | 67 | level = 0 68 | output_string = "" 69 | construct_string(element) 70 | return output_string 71 | 72 | def from_string(self, source) -> 'Element': 73 | """Parses an Defold section from a string constant 74 | 75 | :param source: string to parse. 76 | :returns Element: root Element""" 77 | 78 | return self._parse(source) 79 | 80 | @staticmethod 81 | def _open(path): 82 | """Returns the documents data as a string""" 83 | 84 | with open(path, "r") as document: 85 | current_document = document.read() 86 | return current_document 87 | 88 | def _parse(self, input_doc): 89 | document = input_doc 90 | last_index = True 91 | while last_index: 92 | try: 93 | last_index = self._tree_builder(document) 94 | except IndexError: 95 | self._raise_parse_error() 96 | 97 | if last_index: 98 | document = document[last_index:] 99 | return self.root 100 | 101 | @staticmethod 102 | def _get_level(child): 103 | element_level = -1 104 | 105 | def count_up(child_object, count): 106 | parent = child_object.get_parent() 107 | if not parent: 108 | return count 109 | 110 | return count_up(parent, count+1) 111 | return count_up(child, element_level) 112 | 113 | def _tree_builder(self, document): 114 | """Searches the document for a match and builds the tree""" 115 | regex_match = self._regex.search(document) 116 | if not regex_match and len(document) > 25: 117 | # If there are more characters than 25 left and we can't find a match we assume that the file is broken 118 | self._raise_parse_error() 119 | 120 | if regex_match: 121 | element_name = regex_match.group(3) 122 | attribute_name, attribute_value = regex_match.group(1, 2) 123 | element_exit = regex_match.group(4) 124 | 125 | if element_name: 126 | last_element = self._element_chain[-1] 127 | element = last_element.add_element(element_name) 128 | self._element_chain.append(element) 129 | elif attribute_name and attribute_value: 130 | # Attribute called "data" is handled differently because its value is a document and 131 | # need to be parsed differently 132 | 133 | if attribute_name == "data": 134 | attribute_value = bytes(attribute_value, "utf-8").decode("unicode_escape").replace('\n"\n "', 135 | "\n")[1:-1] 136 | last_element = self._element_chain[-1] 137 | element = last_element.add_element("data") 138 | self._element_chain.append(element) 139 | self._parse(attribute_value) 140 | self._element_chain.pop() 141 | else: 142 | last_element = self._element_chain[-1] 143 | last_element.add_attribute(attribute_name, attribute_value) 144 | 145 | elif element_exit: 146 | self._element_chain.pop() 147 | 148 | return regex_match.end() 149 | return False 150 | 151 | @classmethod 152 | def _escape_element(cls, ele): 153 | def yield_attributes(element_parent): 154 | for child in element_parent: 155 | if is_attribute(child): 156 | yield child 157 | else: 158 | yield from yield_attributes(child) 159 | data_elements = dict() 160 | data_elements[cls._get_level(ele)] = [ele] 161 | 162 | for x in ele.iter_elements(): 163 | if is_element(x) and x.name == "data": 164 | lvl = cls._get_level(x) 165 | if lvl not in data_elements: 166 | data_elements[lvl] = [] 167 | data_elements[lvl].append(x) 168 | 169 | while data_elements: 170 | for x in data_elements[max(data_elements)]: 171 | for a in yield_attributes(x): 172 | if isinstance(a, DefTreeString) and a.string.startswith('"') and a.string.endswith('"'): 173 | a._value = a.string.replace('"', '\\"') 174 | _root = DefTree().get_root() 175 | attr = _root.add_attribute("data", "") 176 | parent = x.get_parent() 177 | index = parent.index(x) 178 | parent.remove(x) 179 | parent.insert(index, attr) 180 | x._parent = None 181 | text = cls.serialize(x, True) 182 | _root.set_attribute("data", '"{}"'.format(text.replace('\"', '\\\"').replace('\n', "\\\n"))) 183 | del data_elements[max(data_elements)] 184 | 185 | return '"{}"'.format(cls.serialize(ele).replace("\n", '\\n\"\n \"')) 186 | 187 | def _raise_parse_error(self): 188 | if self.file_path: 189 | raise ParseError("Error when parsing file: {}".format(self.file_path)) from None 190 | raise ParseError("Error when parsing supplied document") from None 191 | 192 | 193 | class Element: 194 | """Element class. This class defines the Element interface""" 195 | __float_regex = re_compile("[-\d]+\.\d+[eE-]+\d+|[-\d]+\.\d+") 196 | __enum_regex = re_compile('[A-Z_]+') 197 | 198 | def __init__(self, name: Union['bytes', 'str']): 199 | self.name = name 200 | self._parent = None 201 | self.__index = -1 202 | self._children = list() 203 | 204 | def __iter__(self): 205 | self.__index = -1 206 | for child in self._children: 207 | yield child 208 | 209 | def __next__(self): 210 | try: 211 | result = self._children[self.__index + 1] 212 | except IndexError: 213 | raise StopIteration 214 | self.__index += 1 215 | return result 216 | 217 | def __getitem__(self, index: 'int'): 218 | return self._children[index] 219 | 220 | def __setitem__(self, index: 'int', item: Union['Element', 'Attribute']): 221 | assert_is_element_or_attribute(item) 222 | self._children[index] = item 223 | 224 | def __delitem__(self, index: 'int'): # pragma: no cover 225 | del self._children[index] 226 | 227 | def __len__(self): 228 | return len(self._children) 229 | 230 | def __repr__(self): 231 | return '{0}({1!r})'.format(self.__class__.__name__, self.name) 232 | 233 | def __get_type(self, x): 234 | 235 | num_match = self.__float_regex.match(str(x)) 236 | if num_match: 237 | if isinstance(x, float) or len(num_match.group(0)) == len(x): 238 | return float 239 | else: 240 | return str 241 | try: 242 | int(x) 243 | except ValueError: 244 | return str 245 | return int 246 | 247 | def _makeelement(self, name): 248 | """Returns a new element. 249 | Do not call this method, use the add_element factory function instead.""" 250 | return self.__class__(name) 251 | 252 | def add_element(self, name: Union['bytes', 'str']) -> 'Element': 253 | """Creates an :class:`.Element` instance with name as a child to self.""" 254 | element = self._makeelement(name) 255 | self.append(element) 256 | return element 257 | 258 | def _make_attribute(self, name, v): 259 | if v is None: 260 | return DefTreeString(self, name, "") 261 | 262 | enum_match = self.__enum_regex.match(str(v)) 263 | if isinstance(v, bool) or v == "true" or v == "false": 264 | return DefTreeBool(self, name, v) 265 | elif enum_match and len(enum_match.group(0)) == len(v): 266 | return DefTreeEnum(self, name, v) 267 | 268 | a_type = self.__get_type(v) 269 | if a_type is int: 270 | return DefTreeInt(self, name, v) 271 | elif a_type is float: 272 | return DefTreeFloat(self, name, v) 273 | return DefTreeString(self, name, v) 274 | 275 | def add_attribute(self, name: Union['bytes', 'str'], value: Union['bytes', 'str', 'float', 'int', 'bool']) -> Union[ 276 | 'DefTreeBool', 'DefTreeEnum', 'DefTreeFloat', 'DefTreeInt', 'DefTreeString']: 277 | """Creates an :class:`.Attribute` instance with name and value as a child to self.""" 278 | 279 | attr = self._make_attribute(name, value) 280 | return attr 281 | 282 | def index(self, item: Union['Element', "Attribute"]) -> 'int': 283 | """Returns the index of the item in this element, raises `ValueError` if not found.""" 284 | for i, child in enumerate(self._children): 285 | if child is item: 286 | return i 287 | raise ValueError("{} is not in children".format(item)) 288 | 289 | def insert(self, index: 'int', item: Union['Element', 'Attribute']): 290 | """Inserts the item at the given position in this element. 291 | Raises `TypeError` if item is not a :class:`.Element` or :class:`.Attribute`""" 292 | assert_is_element_or_attribute(item) 293 | item._parent = self 294 | self._children.insert(index, item) 295 | 296 | def append(self, item: Union['Element', 'Attribute']): 297 | """Inserts the item at the end of this element's internal list of children. 298 | Raises `TypeError` if item is not a :class:`.Element` or :class:`.Attribute`""" 299 | assert_is_element_or_attribute(item) 300 | item._parent = self 301 | self._children.append(item) 302 | 303 | def iter(self) -> Iterator[Union['Element', 'Attribute']]: 304 | """Creates a tree iterator with the current element as the root. The iterator iterates over this 305 | element and all elements below it in document (depth first) order. 306 | Both :class:`.Element` and :class:`.Attribute` are returned from the iterator.""" 307 | 308 | def yield_all(element): 309 | for child in element: 310 | if is_element(child): 311 | yield child 312 | yield from yield_all(child) 313 | else: 314 | yield child 315 | 316 | return yield_all(self) 317 | 318 | def iter_elements(self, name: Union['bytes', 'str']=None) -> Iterator['Element']: 319 | """iter_elements([name]) 320 | Creates a tree iterator with the current element as the root. The iterator iterates over this 321 | element and all elements below it, in document (depth first) order. If the optional argument name 322 | is not None only :class:`.Element` with a name equal to name is returned.""" 323 | 324 | def yield_elements(element): 325 | for child in element: 326 | if is_element(child): 327 | if name is None or child.name == name: 328 | yield child 329 | yield from yield_elements(child) 330 | else: 331 | yield from yield_elements(child) 332 | 333 | return yield_elements(self) 334 | 335 | def iter_attributes(self, name: Union['bytes', 'str']=None) -> Iterator['Attribute']: 336 | """iter_attributes([name]) 337 | Creates a tree iterator with the current element as the root. The iterator iterates over this 338 | element and all elements below it, in document (depth first) order. If the optional argument name is not None 339 | only :class:`.Attribute` with a name equal to name is returned.""" 340 | 341 | def yield_attributes(element): 342 | for child in element: 343 | if is_element(child): 344 | yield from yield_attributes(child) 345 | else: 346 | if name is None or child.name == name: 347 | yield child 348 | 349 | return yield_attributes(self) 350 | 351 | def attributes(self, name: Union['bytes', 'str'] = None, 352 | value: Union['bytes', 'str', 'float', 'int', 'bool'] = None) -> Iterator['Attribute']: 353 | """attributes([name, value]) 354 | Iterates over the current element and returns all attributes. 355 | Only :class:`.Attributes`. Name and value are optional and used for filters.""" 356 | 357 | def yield_attributes(attribute_name): 358 | for child in self: 359 | if is_attribute(child) and (attribute_name is None or child.name == attribute_name) and ( 360 | value is None or child == value): 361 | yield child 362 | 363 | return yield_attributes(name) 364 | 365 | def elements(self, name: Union['bytes', 'str']=None) -> Iterator['Element']: 366 | """elements([name]) 367 | Iterates over the current element and returns all elements. If the optional argument name is not None only 368 | :class:`.Element` with a name equal to name is returned.""" 369 | def yield_elements(elements_name): 370 | for child in self: 371 | if is_element(child) and (elements_name is None or child.name == elements_name): 372 | yield child 373 | return yield_elements(name) 374 | 375 | def get_attribute(self, name: Union['bytes', 'str'], 376 | value: Union['bytes', 'str', 'float', 'int', 'bool'] = None) -> 'Attribute': 377 | """get_attribute(name, [value]) 378 | Returns the first :class:`Attribute` instance whose name matches name and if value is not None whose value equal 379 | value. If no matching attribute is found it returns None.""" 380 | 381 | for child in self: 382 | if is_attribute(child) and child.name == name and (value is None or child == value): 383 | return child 384 | 385 | def get_element(self, name: Union['bytes', 'str']) ->'Element': 386 | """Returns the first :class:`Element` whose name matches name, if none is found returns None.""" 387 | 388 | for child in self: 389 | if is_element(child) and child.name == name: 390 | return child 391 | 392 | def set_attribute(self, name: Union['bytes', 'str'], value: Union['bytes', 'str', 'float', 'int', 'bool']): 393 | """Sets the first :class:`Attribute` with name to value.""" 394 | 395 | element = self.get_attribute(name) 396 | element.value = value 397 | 398 | def clear(self): 399 | """Resets an element. This function removes all children, clears all attributes""" 400 | 401 | self.name = None 402 | self._parent = None 403 | self._children = list() 404 | 405 | def remove(self, child: Union['Element', 'Attribute']): 406 | """Removes child from the element. Compares on instance identity not name. 407 | Raises `TypeError` if child is not a :class:`.Element` or :class:`.Attribute`""" 408 | 409 | assert_is_element_or_attribute(child) 410 | for index, _child in enumerate(self): 411 | if child is _child: 412 | del self._children[index] 413 | 414 | def copy(self) -> 'Element': 415 | """Returns a deep copy of the current :class:`.Element`.""" 416 | 417 | from copy import deepcopy 418 | return deepcopy(self) 419 | 420 | def get_parent(self) -> 'Element': 421 | """Returns the parent of the current :class:`.Element`""" 422 | 423 | return self._parent 424 | 425 | 426 | class Attribute: 427 | """Attribute class. This class defines the Attribute interface.""" 428 | 429 | def __init__(self, parent: 'Element', name: Union['bytes', 'str'], value): 430 | self._name = name 431 | self._value = "" 432 | self.value = value # To trigger the setter 433 | self._parent = None 434 | parent.append(self) 435 | 436 | @property 437 | def name(self): 438 | """The name of the attribute, used to set and get the name""" 439 | 440 | return self._name 441 | 442 | @name.setter 443 | def name(self, v: Union['bytes', 'str']): 444 | self._name = v 445 | 446 | @property 447 | def string(self): 448 | return str(self._value) 449 | 450 | @property 451 | def value(self): 452 | """The value of the attribute, used to set and get the attributes value""" 453 | 454 | return self._value 455 | 456 | @value.setter 457 | def value(self, v): 458 | self._value = v 459 | 460 | def __repr__(self): 461 | return '{0}({1!r}, {2!r})'.format(self.__class__.__name__, self.name, self.value) 462 | 463 | def __eq__(self, other): 464 | return self.value == other 465 | 466 | def __len__(self): 467 | return len(self.value) 468 | 469 | def get_parent(self) -> 'Element': 470 | """Returns the parent element of the attribute.""" 471 | 472 | return self._parent 473 | 474 | 475 | class DefTreeNumber(Attribute): 476 | def __init__(self, parent, name, value): 477 | super(DefTreeNumber, self).__init__(parent, name, value) 478 | 479 | def __lt__(self, other): 480 | return self.value < other 481 | 482 | def __le__(self, other): 483 | return self.value <= other 484 | 485 | def __gt__(self, other): 486 | return self.value > other 487 | 488 | def __ge__(self, other): 489 | return self.value >= other 490 | 491 | def __sub__(self, other): 492 | self.value -= other 493 | return self 494 | 495 | def __add__(self, other): 496 | self.value += other 497 | return self 498 | 499 | def __mul__(self, other): 500 | self.value *= other 501 | return self 502 | 503 | def __truediv__(self, other): # pragma: no cover 504 | return NotImplemented 505 | 506 | def __floordiv__(self, other): # pragma: no cover 507 | return NotImplemented 508 | 509 | def __mod__(self, other): # pragma: no cover 510 | return NotImplemented 511 | 512 | def __divmod__(self, other): # pragma: no cover 513 | return NotImplemented 514 | 515 | def __pow__(self, other, modulo): # pragma: no cover 516 | return NotImplemented 517 | 518 | def __lshift__(self, other): # pragma: no cover 519 | return NotImplemented 520 | 521 | def __rshift__(self, other): # pragma: no cover 522 | return NotImplemented 523 | 524 | def __and__(self, other): # pragma: no cover 525 | return NotImplemented 526 | 527 | def __xor__(self, other): # pragma: no cover 528 | return NotImplemented 529 | 530 | def __or__(self, other): # pragma: no cover 531 | return NotImplemented 532 | 533 | 534 | class DefTreeFloat(DefTreeNumber): 535 | def __init__(self, parent, name, value): 536 | super(DefTreeFloat, self).__init__(parent, name, value) 537 | 538 | @property 539 | def value(self) -> float: 540 | return self._value 541 | 542 | @value.setter 543 | def value(self, v): 544 | self._value = float(v) 545 | 546 | @property 547 | def string(self): 548 | if "e" in str(self._value): 549 | coefficient, exponent = str(self._value).split("e") 550 | if "." not in coefficient: 551 | coefficient += ".0" 552 | exponent = int(exponent) 553 | return "{}E{}".format(coefficient, exponent) 554 | 555 | return str(self._value) 556 | 557 | 558 | class DefTreeInt(DefTreeNumber): 559 | def __init__(self, parent, name, value): 560 | super(DefTreeInt, self).__init__(parent, name, value) 561 | 562 | @property 563 | def value(self) -> int: 564 | return self._value 565 | 566 | @value.setter 567 | def value(self, v): 568 | self._value = int(v) 569 | 570 | 571 | class DefTreeString(Attribute): 572 | def __init__(self, parent, name, value): 573 | super(DefTreeString, self).__init__(parent, name, value) 574 | 575 | def __contains__(self, param): 576 | return True if param in self.value else False 577 | 578 | @property 579 | def value(self) -> str: 580 | return self._value[1:-1] 581 | 582 | @value.setter 583 | def value(self, v): 584 | if not isinstance(v, str): 585 | raise ValueError("Expected string got {}".format(type(v))) 586 | if v.endswith('"') and v.startswith('"'): 587 | self._value = v 588 | else: 589 | self._value = '"{}"'.format(v) 590 | 591 | def endswith(self, suffix, start=None, end=None): 592 | return self.value.endswith(suffix, start, end) 593 | 594 | def startswith(self, prefix, start=None, end=None): 595 | return self.value.startswith(prefix, start, end) 596 | 597 | def strip(self, chars=None): 598 | return self.value.strip(chars) 599 | 600 | def rstrip(self, chars=None): 601 | return self.value.rstrip(chars) 602 | 603 | def count(self, sub, start=None, end=None): 604 | return self.value.count(sub, start, end) 605 | 606 | def index(self, sub, start=None, end=None): 607 | return self.value.index(sub, start, end) 608 | 609 | def rindex(self, sub, start=None, end=None): 610 | return self.value.rindex(sub, start, end) 611 | 612 | def replace(self, old, new, count=-1): 613 | return self.value.replace(old, new, count) 614 | 615 | def split(self, sep, maxsplit=-1): 616 | return self.value.split(sep, maxsplit) 617 | 618 | def rsplit(self, sep, maxsplit=-1): 619 | return self.value.rsplit(sep, maxsplit) 620 | 621 | 622 | class DefTreeEnum(Attribute): 623 | __enum_regex = re_compile('[A-Z_]+') 624 | 625 | def __init__(self, parent, name, value): 626 | super(DefTreeEnum, self).__init__(parent, name, value) 627 | 628 | @property 629 | def value(self) -> 'DefTreeEnum': 630 | return self._value 631 | 632 | @value.setter 633 | def value(self, v): 634 | enum_match = self.__enum_regex.match(str(v)) 635 | if not (isinstance(v, str) and enum_match and len(enum_match.group(0)) == len(v)): 636 | raise ValueError("Unsupported value, enum expected to be an all upper case string.") 637 | self._value = v 638 | 639 | 640 | class DefTreeBool(Attribute): 641 | def __init__(self, parent, name, value): 642 | super(DefTreeBool, self).__init__(parent, name, value) 643 | 644 | @property 645 | def string(self): 646 | return "true" if self._value == True else "false" 647 | 648 | @property 649 | def value(self) -> bool: 650 | return self._value 651 | 652 | @value.setter 653 | def value(self, v): 654 | if v in ["true", True]: 655 | self._value = True 656 | elif v in ["false", False]: 657 | self._value = False 658 | else: 659 | raise ValueError("Unsupported boolean value.") 660 | 661 | 662 | class DefTree: 663 | """DefTree class. This class represents an entire element hierarchy.""" 664 | 665 | def __init__(self): 666 | self.root = Element("root") 667 | self._parser = _DefParser 668 | 669 | def get_document_path(self) -> str: 670 | """Returns the path to the parsed document.""" 671 | return self._parser.file_path 672 | 673 | def get_root(self) -> 'Element': 674 | """Returns the root :class:`.Element`""" 675 | 676 | return self.root 677 | 678 | def write(self, file_path: Union['bytes', 'str']=None): 679 | """write([file_path]) 680 | Writes the element tree to a file, as plain text. uses the parsed file as a default""" 681 | file_path = file_path or self.get_document_path() 682 | with open(file_path, "w") as document: 683 | document.write(self._parser.serialize(self.root)) 684 | 685 | def dump(self): # pragma: no cover 686 | """Writes the the DefTree structure to sys.stdout. This function should be used for debugging only.""" 687 | 688 | stdout.write(self._parser.serialize(self.root)) 689 | 690 | def parse(self, source: Union['bytes', 'str']) -> 'Element': 691 | """parse(source, [parser]) 692 | Parses a Defold document into this :class:`.DefTree`. It returns the root :class:`.Element` of the DefTree. 693 | `source` is a file_path.""" 694 | 695 | self._parser = _DefParser 696 | self._parser.file_path = source 697 | parser = self._parser(self.root) 698 | return parser.parse(source) 699 | 700 | def from_string(self, text: Union['bytes', 'str']) -> 'DefTree': 701 | """from_string(text, [parser]) 702 | Parses a Defold document section from a string constant which it returns. 703 | `parser` is an optional parser instance. If not given the standard parser is used. 704 | Returns the root of :class:`.DefTree`.""" 705 | 706 | self._parser = _DefParser 707 | parser = self._parser(self.root) 708 | return parser.from_string(text) 709 | 710 | 711 | def is_element(item: 'Element') -> bool: 712 | """Returns True if the item is an :class:`.Element` else returns False""" 713 | if isinstance(item, Element): 714 | return True 715 | return False 716 | 717 | 718 | def is_attribute(item: Attribute) -> bool: 719 | """Returns True if the item is an :class:`.Attribute` else returns False""" 720 | if issubclass(item.__class__, Attribute): 721 | return True 722 | return False 723 | 724 | 725 | def to_string(element: Element) -> str: 726 | """to_string(element, [parser]) 727 | Generates a string representation of the Element, including all children. 728 | `element` is a :class:`.Element` instance.""" 729 | 730 | assert_is_element(element) 731 | return _DefParser.serialize(element) 732 | 733 | 734 | def parse(source: Union['bytes', 'str']) -> DefTree: 735 | """Parses a Defold document into a DefTree which it returns. `source` is a file_path. 736 | `parser` is an optional parser instance. If not given the standard parser is used.""" 737 | 738 | tree = DefTree() 739 | tree.parse(source) 740 | return tree 741 | 742 | 743 | def from_string(text: Union['bytes', 'str']) -> DefTree: 744 | """from_string(text, [parser]) 745 | Parses a Defold document section from a string constant which it returns. `parser` is an optional parser instance. 746 | If not given the standard parser is used. Returns the root of :class:`.DefTree`.""" 747 | 748 | tree = DefTree() 749 | tree.from_string(text) 750 | return tree 751 | 752 | 753 | def dump(element: Element): # pragma: no cover 754 | """dump(element, [parser]) 755 | Writes the element tree or element structure to sys.stdout. This function should be used for debugging only. 756 | *element* is either an :class:`.DefTree`, or :class:`.Element`.""" 757 | 758 | if isinstance(element, DefTree): 759 | element = element.get_root() 760 | stdout.write(_DefParser.serialize(element)) 761 | 762 | 763 | def validate(string: Union['bytes', 'str'], path_or_string: Union['bytes', 'str'], verbose=False) -> bool: 764 | """validate(string, path_or_string, [verbose]) 765 | Verifies that a document in string format equals a document in path_or_string. 766 | If Verbose is True it echoes the result. This function should be used for debugging only. 767 | Returns a bool representing the result""" 768 | 769 | from hashlib import md5 770 | from os import path as os_path 771 | is_valid = False 772 | 773 | def _generate_hash(input_string): 774 | m = md5() 775 | m.update(input_string) 776 | my_hash = m.hexdigest() 777 | return my_hash 778 | 779 | if os_path.isfile(path_or_string): 780 | with open(path_or_string, 'r') as read_file: 781 | buf = read_file.read() 782 | source_hash = _generate_hash(buf.encode('utf-8')) 783 | else: 784 | source_hash = _generate_hash(path_or_string.encode('utf-8')) 785 | 786 | string_hash = _generate_hash(string.encode('utf-8')) 787 | if string_hash == source_hash: 788 | is_valid = True 789 | if verbose: # pragma: no cover 790 | stdout.write("Is the input the same as the output: %s" % is_valid) 791 | return is_valid 792 | 793 | 794 | def assert_is_element_or_attribute(item: Union['Element', 'Attribute']): 795 | if not (is_attribute(item) or is_element(item)): 796 | raise TypeError('expected an Element or Attribute, not %s' % type(item).__name__) 797 | 798 | 799 | def assert_is_element(item: 'Element'): 800 | if not is_element(item): 801 | raise TypeError('expected an Element, not %s' % type(item).__name__) 802 | 803 | 804 | def assert_is_attribute(item: 'Attribute'): 805 | if not is_attribute(item): 806 | raise TypeError('expected an Attribute, not %s' % type(item).__name__) 807 | -------------------------------------------------------------------------------- /tests/profiling/profile.defold: -------------------------------------------------------------------------------- 1 | script: "/main/mockup.gui_script" 2 | fonts { 3 | name: "larryfont" 4 | font: "/assets/fonts/vera.font" 5 | } 6 | fonts { 7 | name: "vera_italic" 8 | font: "/assets/fonts/vera_italic.font" 9 | } 10 | fonts { 11 | name: "vera" 12 | font: "/assets/fonts/vera.font" 13 | } 14 | textures { 15 | name: "gui" 16 | texture: "/assets/atlas/gui.atlas" 17 | } 18 | textures { 19 | name: "icons" 20 | texture: "/assets/atlas/icons.atlas" 21 | } 22 | background_color { 23 | x: 0.0 24 | y: 0.0 25 | z: 0.0 26 | w: 1.0 27 | } 28 | nodes { 29 | position { 30 | x: 360.0 31 | y: 700.0 32 | z: 0.0 33 | w: 1.0 34 | } 35 | rotation { 36 | x: 0.0 37 | y: 0.0 38 | z: 0.0 39 | w: 1.0 40 | } 41 | scale { 42 | x: 1.0 43 | y: 1.0 44 | z: 1.0 45 | w: 1.0 46 | } 47 | size { 48 | x: 22.0 49 | y: 21.0 50 | z: 0.0 51 | w: 1.0 52 | } 53 | color { 54 | x: 1.0 55 | y: 1.0 56 | z: 1.0 57 | w: 1.0 58 | } 59 | type: TYPE_BOX 60 | blend_mode: BLEND_MODE_ALPHA 61 | texture: "gui/mockup_arrowBeige_left" 62 | id: "story_popup" 63 | xanchor: XANCHOR_NONE 64 | yanchor: YANCHOR_NONE 65 | pivot: PIVOT_CENTER 66 | adjust_mode: ADJUST_MODE_FIT 67 | layer: "gui" 68 | inherit_alpha: true 69 | slice9 { 70 | x: 0.0 71 | y: 0.0 72 | z: 0.0 73 | w: 0.0 74 | } 75 | clipping_mode: CLIPPING_MODE_NONE 76 | clipping_visible: true 77 | clipping_inverted: false 78 | alpha: 0.0 79 | template_node_child: false 80 | size_mode: SIZE_MODE_AUTO 81 | } 82 | nodes { 83 | position { 84 | x: 0.0 85 | y: 0.0 86 | z: 0.0 87 | w: 1.0 88 | } 89 | rotation { 90 | x: 0.0 91 | y: 0.0 92 | z: 0.0 93 | w: 1.0 94 | } 95 | scale { 96 | x: 1.0 97 | y: 1.0 98 | z: 1.0 99 | w: 1.0 100 | } 101 | size { 102 | x: 400.0 103 | y: 300.0 104 | z: 0.0 105 | w: 1.0 106 | } 107 | color { 108 | x: 1.0 109 | y: 1.0 110 | z: 1.0 111 | w: 1.0 112 | } 113 | type: TYPE_BOX 114 | blend_mode: BLEND_MODE_ALPHA 115 | texture: "gui/mockup_panel_brown" 116 | id: "story_panel" 117 | xanchor: XANCHOR_NONE 118 | yanchor: YANCHOR_NONE 119 | pivot: PIVOT_CENTER 120 | adjust_mode: ADJUST_MODE_FIT 121 | parent: "story_popup" 122 | layer: "gui" 123 | inherit_alpha: false 124 | slice9 { 125 | x: 65.0 126 | y: 25.0 127 | z: 25.0 128 | w: 50.0 129 | } 130 | clipping_mode: CLIPPING_MODE_NONE 131 | clipping_visible: true 132 | clipping_inverted: false 133 | alpha: 1.0 134 | template_node_child: false 135 | size_mode: SIZE_MODE_MANUAL 136 | } 137 | nodes { 138 | position { 139 | x: 0.0 140 | y: 40.0 141 | z: 0.0 142 | w: 1.0 143 | } 144 | rotation { 145 | x: 0.0 146 | y: -180.0 147 | z: -90.0 148 | w: 1.0 149 | } 150 | scale { 151 | x: 1.0 152 | y: 1.0 153 | z: 1.0 154 | w: 1.0 155 | } 156 | size { 157 | x: 180.0 158 | y: 360.0 159 | z: 0.0 160 | w: 1.0 161 | } 162 | color { 163 | x: 1.0 164 | y: 1.0 165 | z: 1.0 166 | w: 1.0 167 | } 168 | type: TYPE_BOX 169 | blend_mode: BLEND_MODE_ALPHA 170 | texture: "gui/mockup_panelInset_beige" 171 | id: "background" 172 | xanchor: XANCHOR_NONE 173 | yanchor: YANCHOR_NONE 174 | pivot: PIVOT_CENTER 175 | adjust_mode: ADJUST_MODE_FIT 176 | parent: "story_panel" 177 | layer: "gui" 178 | inherit_alpha: true 179 | slice9 { 180 | x: 25.0 181 | y: 25.0 182 | z: 25.0 183 | w: 50.0 184 | } 185 | clipping_mode: CLIPPING_MODE_NONE 186 | clipping_visible: true 187 | clipping_inverted: false 188 | alpha: 1.0 189 | template_node_child: false 190 | size_mode: SIZE_MODE_MANUAL 191 | } 192 | nodes { 193 | position { 194 | x: 0.0 195 | y: 0.0 196 | z: 0.0 197 | w: 1.0 198 | } 199 | rotation { 200 | x: 0.0 201 | y: 180.0 202 | z: -90.0 203 | w: 1.0 204 | } 205 | scale { 206 | x: 1.0 207 | y: 1.0 208 | z: 1.0 209 | w: 1.0 210 | } 211 | size { 212 | x: 0.0 213 | y: 0.0 214 | z: 0.0 215 | w: 1.0 216 | } 217 | color { 218 | x: 1.0 219 | y: 1.0 220 | z: 1.0 221 | w: 1.0 222 | } 223 | type: TYPE_BOX 224 | blend_mode: BLEND_MODE_ALPHA 225 | texture: "" 226 | id: "story_rotation_fix" 227 | xanchor: XANCHOR_NONE 228 | yanchor: YANCHOR_NONE 229 | pivot: PIVOT_CENTER 230 | adjust_mode: ADJUST_MODE_FIT 231 | parent: "background" 232 | layer: "empty" 233 | inherit_alpha: true 234 | slice9 { 235 | x: 0.0 236 | y: 0.0 237 | z: 0.0 238 | w: 0.0 239 | } 240 | clipping_mode: CLIPPING_MODE_NONE 241 | clipping_visible: true 242 | clipping_inverted: false 243 | alpha: 1.0 244 | template_node_child: false 245 | size_mode: SIZE_MODE_MANUAL 246 | } 247 | nodes { 248 | position { 249 | x: 0.0 250 | y: 57.613 251 | z: 0.0 252 | w: 1.0 253 | } 254 | rotation { 255 | x: 0.0 256 | y: 0.0 257 | z: 0.0 258 | w: 1.0 259 | } 260 | scale { 261 | x: 0.6 262 | y: 0.6 263 | z: 1.0 264 | w: 1.0 265 | } 266 | size { 267 | x: 600.0 268 | y: 200.0 269 | z: 0.0 270 | w: 1.0 271 | } 272 | color { 273 | x: 0.10196079 274 | y: 0.10196079 275 | z: 0.10196079 276 | w: 1.0 277 | } 278 | type: TYPE_TEXT 279 | blend_mode: BLEND_MODE_ALPHA 280 | text: "You found a sword!" 281 | font: "larryfont" 282 | id: "popup_text" 283 | xanchor: XANCHOR_NONE 284 | yanchor: YANCHOR_NONE 285 | pivot: PIVOT_CENTER 286 | outline { 287 | x: 1.0 288 | y: 1.0 289 | z: 1.0 290 | w: 1.0 291 | } 292 | shadow { 293 | x: 1.0 294 | y: 1.0 295 | z: 1.0 296 | w: 1.0 297 | } 298 | adjust_mode: ADJUST_MODE_FIT 299 | line_break: true 300 | parent: "story_rotation_fix" 301 | layer: "larryfont" 302 | inherit_alpha: true 303 | alpha: 1.0 304 | outline_alpha: 1.0 305 | shadow_alpha: 1.0 306 | template_node_child: false 307 | text_leading: 1.0 308 | text_tracking: 0.0 309 | } 310 | nodes { 311 | position { 312 | x: 134.776 313 | y: -64.208 314 | z: 0.0 315 | w: 1.0 316 | } 317 | rotation { 318 | x: 0.0 319 | y: 0.0 320 | z: 0.0 321 | w: 1.0 322 | } 323 | scale { 324 | x: 1.0 325 | y: 1.0 326 | z: 1.0 327 | w: 1.0 328 | } 329 | size { 330 | x: 1.0 331 | y: 1.0 332 | z: 0.0 333 | w: 1.0 334 | } 335 | color { 336 | x: 1.0 337 | y: 1.0 338 | z: 1.0 339 | w: 1.0 340 | } 341 | type: TYPE_SPINE 342 | blend_mode: BLEND_MODE_ALPHA 343 | id: "player_preview" 344 | xanchor: XANCHOR_NONE 345 | yanchor: YANCHOR_NONE 346 | pivot: PIVOT_CENTER 347 | adjust_mode: ADJUST_MODE_FIT 348 | parent: "story_rotation_fix" 349 | layer: "player" 350 | inherit_alpha: true 351 | clipping_mode: CLIPPING_MODE_NONE 352 | clipping_visible: true 353 | clipping_inverted: false 354 | alpha: 1.0 355 | template_node_child: false 356 | size_mode: SIZE_MODE_AUTO 357 | spine_scene: "player" 358 | spine_default_animation: "idle" 359 | spine_skin: "" 360 | } 361 | nodes { 362 | position { 363 | x: -6.621 364 | y: -19.204 365 | z: 0.0 366 | w: 1.0 367 | } 368 | rotation { 369 | x: 0.0 370 | y: 0.0 371 | z: 0.0 372 | w: 1.0 373 | } 374 | scale { 375 | x: 1.5 376 | y: 1.5 377 | z: 1.0 378 | w: 1.0 379 | } 380 | size { 381 | x: 34.0 382 | y: 37.0 383 | z: 0.0 384 | w: 1.0 385 | } 386 | color { 387 | x: 1.0 388 | y: 1.0 389 | z: 1.0 390 | w: 1.0 391 | } 392 | type: TYPE_BOX 393 | blend_mode: BLEND_MODE_ALPHA 394 | texture: "icons/mockup_cursorSword_gold" 395 | id: "item_icon" 396 | xanchor: XANCHOR_NONE 397 | yanchor: YANCHOR_NONE 398 | pivot: PIVOT_CENTER 399 | adjust_mode: ADJUST_MODE_FIT 400 | parent: "story_rotation_fix" 401 | layer: "icons" 402 | inherit_alpha: true 403 | slice9 { 404 | x: 0.0 405 | y: 0.0 406 | z: 0.0 407 | w: 0.0 408 | } 409 | clipping_mode: CLIPPING_MODE_NONE 410 | clipping_visible: true 411 | clipping_inverted: false 412 | alpha: 1.0 413 | template_node_child: false 414 | size_mode: SIZE_MODE_AUTO 415 | } 416 | nodes { 417 | position { 418 | x: 138.932 419 | y: -100.0 420 | z: 0.0 421 | w: 1.0 422 | } 423 | rotation { 424 | x: 0.0 425 | y: 0.0 426 | z: 0.0 427 | w: 1.0 428 | } 429 | scale { 430 | x: 1.0 431 | y: 1.0 432 | z: 1.0 433 | w: 1.0 434 | } 435 | size { 436 | x: 70.0 437 | y: 70.0 438 | z: 0.0 439 | w: 1.0 440 | } 441 | color { 442 | x: 1.0 443 | y: 1.0 444 | z: 1.0 445 | w: 1.0 446 | } 447 | type: TYPE_BOX 448 | blend_mode: BLEND_MODE_ALPHA 449 | texture: "gui/mockup_buttonSquare_blue" 450 | id: "exit_button" 451 | xanchor: XANCHOR_NONE 452 | yanchor: YANCHOR_NONE 453 | pivot: PIVOT_CENTER 454 | adjust_mode: ADJUST_MODE_FIT 455 | parent: "story_panel" 456 | layer: "gui" 457 | inherit_alpha: true 458 | slice9 { 459 | x: 20.0 460 | y: 20.0 461 | z: 20.0 462 | w: 22.0 463 | } 464 | clipping_mode: CLIPPING_MODE_NONE 465 | clipping_visible: true 466 | clipping_inverted: false 467 | alpha: 1.0 468 | template_node_child: false 469 | size_mode: SIZE_MODE_MANUAL 470 | } 471 | nodes { 472 | position { 473 | x: 0.0 474 | y: 0.0 475 | z: 0.0 476 | w: 1.0 477 | } 478 | rotation { 479 | x: 0.0 480 | y: 0.0 481 | z: 0.0 482 | w: 1.0 483 | } 484 | scale { 485 | x: 1.0 486 | y: 1.0 487 | z: 1.0 488 | w: 1.0 489 | } 490 | size { 491 | x: 32.0 492 | y: 30.0 493 | z: 0.0 494 | w: 1.0 495 | } 496 | color { 497 | x: 1.0 498 | y: 1.0 499 | z: 1.0 500 | w: 1.0 501 | } 502 | type: TYPE_BOX 503 | blend_mode: BLEND_MODE_ALPHA 504 | texture: "gui/mockup_iconCross_beige" 505 | id: "cross" 506 | xanchor: XANCHOR_NONE 507 | yanchor: YANCHOR_NONE 508 | pivot: PIVOT_CENTER 509 | adjust_mode: ADJUST_MODE_FIT 510 | parent: "exit_button" 511 | layer: "gui" 512 | inherit_alpha: true 513 | slice9 { 514 | x: 0.0 515 | y: 0.0 516 | z: 0.0 517 | w: 0.0 518 | } 519 | clipping_mode: CLIPPING_MODE_NONE 520 | clipping_visible: true 521 | clipping_inverted: false 522 | alpha: 1.0 523 | template_node_child: false 524 | size_mode: SIZE_MODE_MANUAL 525 | } 526 | nodes { 527 | position { 528 | x: -54.089 529 | y: -100.0 530 | z: 0.0 531 | w: 1.0 532 | } 533 | rotation { 534 | x: 0.0 535 | y: 0.0 536 | z: 0.0 537 | w: 1.0 538 | } 539 | scale { 540 | x: 1.0 541 | y: 1.0 542 | z: 1.0 543 | w: 1.0 544 | } 545 | size { 546 | x: 250.0 547 | y: 70.0 548 | z: 0.0 549 | w: 1.0 550 | } 551 | color { 552 | x: 1.0 553 | y: 1.0 554 | z: 1.0 555 | w: 1.0 556 | } 557 | type: TYPE_BOX 558 | blend_mode: BLEND_MODE_ALPHA 559 | texture: "gui/mockup_buttonSquare_blue" 560 | id: "accept_button" 561 | xanchor: XANCHOR_NONE 562 | yanchor: YANCHOR_NONE 563 | pivot: PIVOT_CENTER 564 | adjust_mode: ADJUST_MODE_FIT 565 | parent: "story_panel" 566 | layer: "gui" 567 | inherit_alpha: true 568 | slice9 { 569 | x: 20.0 570 | y: 20.0 571 | z: 20.0 572 | w: 22.0 573 | } 574 | clipping_mode: CLIPPING_MODE_NONE 575 | clipping_visible: true 576 | clipping_inverted: false 577 | alpha: 1.0 578 | template_node_child: false 579 | size_mode: SIZE_MODE_MANUAL 580 | } 581 | nodes { 582 | position { 583 | x: 0.0 584 | y: 1.307 585 | z: 0.0 586 | w: 1.0 587 | } 588 | rotation { 589 | x: 0.0 590 | y: 0.0 591 | z: 0.0 592 | w: 1.0 593 | } 594 | scale { 595 | x: 0.8 596 | y: 0.8 597 | z: 1.0 598 | w: 1.0 599 | } 600 | size { 601 | x: 200.0 602 | y: 100.0 603 | z: 0.0 604 | w: 1.0 605 | } 606 | color { 607 | x: 1.0 608 | y: 1.0 609 | z: 1.0 610 | w: 1.0 611 | } 612 | type: TYPE_TEXT 613 | blend_mode: BLEND_MODE_ALPHA 614 | text: "Cool Story Bro" 615 | font: "larryfont" 616 | id: "button_text" 617 | xanchor: XANCHOR_NONE 618 | yanchor: YANCHOR_NONE 619 | pivot: PIVOT_CENTER 620 | outline { 621 | x: 1.0 622 | y: 1.0 623 | z: 1.0 624 | w: 1.0 625 | } 626 | shadow { 627 | x: 1.0 628 | y: 1.0 629 | z: 1.0 630 | w: 1.0 631 | } 632 | adjust_mode: ADJUST_MODE_FIT 633 | line_break: false 634 | parent: "accept_button" 635 | layer: "larryfont" 636 | inherit_alpha: true 637 | alpha: 1.0 638 | outline_alpha: 1.0 639 | shadow_alpha: 1.0 640 | template_node_child: false 641 | text_leading: 1.0 642 | text_tracking: 0.0 643 | } 644 | nodes { 645 | position { 646 | x: 196.151 647 | y: 145.854 648 | z: 0.0 649 | w: 1.0 650 | } 651 | rotation { 652 | x: 0.0 653 | y: 0.0 654 | z: 0.0 655 | w: 1.0 656 | } 657 | scale { 658 | x: 1.0 659 | y: 1.0 660 | z: 1.0 661 | w: 1.0 662 | } 663 | size { 664 | x: 35.0 665 | y: 38.0 666 | z: 0.0 667 | w: 1.0 668 | } 669 | color { 670 | x: 1.0 671 | y: 1.0 672 | z: 1.0 673 | w: 1.0 674 | } 675 | type: TYPE_BOX 676 | blend_mode: BLEND_MODE_ALPHA 677 | texture: "gui/mockup_buttonRound_blue" 678 | id: "story_exit_button" 679 | xanchor: XANCHOR_NONE 680 | yanchor: YANCHOR_NONE 681 | pivot: PIVOT_CENTER 682 | adjust_mode: ADJUST_MODE_FIT 683 | parent: "story_popup" 684 | layer: "gui" 685 | inherit_alpha: false 686 | slice9 { 687 | x: 0.0 688 | y: 0.0 689 | z: 0.0 690 | w: 0.0 691 | } 692 | clipping_mode: CLIPPING_MODE_NONE 693 | clipping_visible: true 694 | clipping_inverted: false 695 | alpha: 1.0 696 | template_node_child: false 697 | size_mode: SIZE_MODE_AUTO 698 | } 699 | nodes { 700 | position { 701 | x: 0.0 702 | y: 0.0 703 | z: 0.0 704 | w: 1.0 705 | } 706 | rotation { 707 | x: 0.0 708 | y: 0.0 709 | z: 0.0 710 | w: 1.0 711 | } 712 | scale { 713 | x: 1.0 714 | y: 1.0 715 | z: 1.0 716 | w: 1.0 717 | } 718 | size { 719 | x: 16.0 720 | y: 15.0 721 | z: 0.0 722 | w: 1.0 723 | } 724 | color { 725 | x: 1.0 726 | y: 1.0 727 | z: 1.0 728 | w: 1.0 729 | } 730 | type: TYPE_BOX 731 | blend_mode: BLEND_MODE_ALPHA 732 | texture: "gui/mockup_iconCross_grey" 733 | id: "story_exit_icon" 734 | xanchor: XANCHOR_NONE 735 | yanchor: YANCHOR_NONE 736 | pivot: PIVOT_CENTER 737 | adjust_mode: ADJUST_MODE_FIT 738 | parent: "story_exit_button" 739 | layer: "gui" 740 | inherit_alpha: true 741 | slice9 { 742 | x: 0.0 743 | y: 0.0 744 | z: 0.0 745 | w: 0.0 746 | } 747 | clipping_mode: CLIPPING_MODE_NONE 748 | clipping_visible: true 749 | clipping_inverted: false 750 | alpha: 1.0 751 | template_node_child: false 752 | size_mode: SIZE_MODE_AUTO 753 | } 754 | nodes { 755 | position { 756 | x: 0.0 757 | y: 1280.0 758 | z: 0.0 759 | w: 1.0 760 | } 761 | rotation { 762 | x: 0.0 763 | y: 0.0 764 | z: 0.0 765 | w: 1.0 766 | } 767 | scale { 768 | x: 1.0 769 | y: 1.0 770 | z: 1.0 771 | w: 1.0 772 | } 773 | size { 774 | x: 0.0 775 | y: 0.0 776 | z: 0.0 777 | w: 1.0 778 | } 779 | color { 780 | x: 1.0 781 | y: 1.0 782 | z: 1.0 783 | w: 1.0 784 | } 785 | type: TYPE_BOX 786 | blend_mode: BLEND_MODE_ALPHA 787 | texture: "gui/mockup_arrowBeige_left" 788 | id: "stats" 789 | xanchor: XANCHOR_NONE 790 | yanchor: YANCHOR_NONE 791 | pivot: PIVOT_CENTER 792 | adjust_mode: ADJUST_MODE_FIT 793 | layer: "gui" 794 | inherit_alpha: true 795 | slice9 { 796 | x: 0.0 797 | y: 0.0 798 | z: 0.0 799 | w: 0.0 800 | } 801 | clipping_mode: CLIPPING_MODE_NONE 802 | clipping_visible: true 803 | clipping_inverted: false 804 | alpha: 1.0 805 | template_node_child: false 806 | size_mode: SIZE_MODE_MANUAL 807 | } 808 | nodes { 809 | position { 810 | x: 0.0 811 | y: 0.0 812 | z: 0.0 813 | w: 1.0 814 | } 815 | rotation { 816 | x: 0.0 817 | y: 0.0 818 | z: 0.0 819 | w: 1.0 820 | } 821 | scale { 822 | x: 1.0 823 | y: 1.0 824 | z: 1.0 825 | w: 1.0 826 | } 827 | size { 828 | x: 720.0 829 | y: 50.0 830 | z: 0.0 831 | w: 1.0 832 | } 833 | color { 834 | x: 1.0 835 | y: 1.0 836 | z: 1.0 837 | w: 1.0 838 | } 839 | type: TYPE_BOX 840 | blend_mode: BLEND_MODE_ALPHA 841 | texture: "gui/mockup_panel_brown" 842 | id: "stats_panel" 843 | xanchor: XANCHOR_NONE 844 | yanchor: YANCHOR_NONE 845 | pivot: PIVOT_NW 846 | adjust_mode: ADJUST_MODE_FIT 847 | parent: "stats" 848 | layer: "gui" 849 | inherit_alpha: false 850 | slice9 { 851 | x: 65.0 852 | y: 25.0 853 | z: 25.0 854 | w: 50.0 855 | } 856 | clipping_mode: CLIPPING_MODE_NONE 857 | clipping_visible: true 858 | clipping_inverted: false 859 | alpha: 1.0 860 | template_node_child: false 861 | size_mode: SIZE_MODE_MANUAL 862 | } 863 | nodes { 864 | position { 865 | x: 712.713 866 | y: -6.429 867 | z: 0.0 868 | w: 1.0 869 | } 870 | rotation { 871 | x: 0.0 872 | y: -180.0 873 | z: -90.0 874 | w: 1.0 875 | } 876 | scale { 877 | x: 1.0 878 | y: 1.0 879 | z: 1.0 880 | w: 1.0 881 | } 882 | size { 883 | x: 80.0 884 | y: 270.0 885 | z: 0.0 886 | w: 1.0 887 | } 888 | color { 889 | x: 1.0 890 | y: 1.0 891 | z: 1.0 892 | w: 1.0 893 | } 894 | type: TYPE_BOX 895 | blend_mode: BLEND_MODE_ALPHA 896 | texture: "gui/mockup_panelInset_beige" 897 | id: "stats_background" 898 | xanchor: XANCHOR_NONE 899 | yanchor: YANCHOR_NONE 900 | pivot: PIVOT_SW 901 | adjust_mode: ADJUST_MODE_FIT 902 | parent: "stats_panel" 903 | layer: "gui" 904 | inherit_alpha: true 905 | slice9 { 906 | x: 25.0 907 | y: 25.0 908 | z: 25.0 909 | w: 50.0 910 | } 911 | clipping_mode: CLIPPING_MODE_NONE 912 | clipping_visible: true 913 | clipping_inverted: false 914 | alpha: 1.0 915 | template_node_child: false 916 | size_mode: SIZE_MODE_MANUAL 917 | } 918 | nodes { 919 | position { 920 | x: 0.0 921 | y: 0.0 922 | z: 0.0 923 | w: 1.0 924 | } 925 | rotation { 926 | x: 0.0 927 | y: 180.0 928 | z: 90.0 929 | w: 1.0 930 | } 931 | scale { 932 | x: 1.0 933 | y: 1.0 934 | z: 1.0 935 | w: 1.0 936 | } 937 | size { 938 | x: 0.0 939 | y: 0.0 940 | z: 0.0 941 | w: 1.0 942 | } 943 | color { 944 | x: 1.0 945 | y: 1.0 946 | z: 1.0 947 | w: 1.0 948 | } 949 | type: TYPE_BOX 950 | blend_mode: BLEND_MODE_ALPHA 951 | texture: "" 952 | id: "rotation_correction" 953 | xanchor: XANCHOR_NONE 954 | yanchor: YANCHOR_NONE 955 | pivot: PIVOT_CENTER 956 | adjust_mode: ADJUST_MODE_FIT 957 | parent: "stats_background" 958 | layer: "empty" 959 | inherit_alpha: true 960 | slice9 { 961 | x: 0.0 962 | y: 0.0 963 | z: 0.0 964 | w: 0.0 965 | } 966 | clipping_mode: CLIPPING_MODE_NONE 967 | clipping_visible: true 968 | clipping_inverted: false 969 | alpha: 1.0 970 | template_node_child: false 971 | size_mode: SIZE_MODE_MANUAL 972 | } 973 | nodes { 974 | position { 975 | x: 136.369 976 | y: 66.884 977 | z: 0.0 978 | w: 1.0 979 | } 980 | rotation { 981 | x: 0.0 982 | y: 0.0 983 | z: 180.0 984 | w: 1.0 985 | } 986 | scale { 987 | x: 1.0 988 | y: 1.0 989 | z: 1.0 990 | w: 1.0 991 | } 992 | size { 993 | x: 120.0 994 | y: 18.0 995 | z: 0.0 996 | w: 1.0 997 | } 998 | color { 999 | x: 1.0 1000 | y: 1.0 1001 | z: 1.0 1002 | w: 1.0 1003 | } 1004 | type: TYPE_BOX 1005 | blend_mode: BLEND_MODE_ALPHA 1006 | texture: "gui/mockup_barBack" 1007 | id: "snot_bg" 1008 | xanchor: XANCHOR_NONE 1009 | yanchor: YANCHOR_NONE 1010 | pivot: PIVOT_W 1011 | adjust_mode: ADJUST_MODE_FIT 1012 | parent: "rotation_correction" 1013 | layer: "gui" 1014 | inherit_alpha: true 1015 | slice9 { 1016 | x: 9.0 1017 | y: 0.0 1018 | z: 9.0 1019 | w: 0.0 1020 | } 1021 | clipping_mode: CLIPPING_MODE_NONE 1022 | clipping_visible: true 1023 | clipping_inverted: false 1024 | alpha: 1.0 1025 | template_node_child: false 1026 | size_mode: SIZE_MODE_MANUAL 1027 | } 1028 | nodes { 1029 | position { 1030 | x: 0.0 1031 | y: 0.0 1032 | z: 0.0 1033 | w: 1.0 1034 | } 1035 | rotation { 1036 | x: 0.0 1037 | y: 0.0 1038 | z: 0.0 1039 | w: 1.0 1040 | } 1041 | scale { 1042 | x: 1.0 1043 | y: 1.0 1044 | z: 1.0 1045 | w: 1.0 1046 | } 1047 | size { 1048 | x: 55.0 1049 | y: 18.0 1050 | z: 0.0 1051 | w: 1.0 1052 | } 1053 | color { 1054 | x: 1.0 1055 | y: 1.0 1056 | z: 1.0 1057 | w: 1.0 1058 | } 1059 | type: TYPE_BOX 1060 | blend_mode: BLEND_MODE_ALPHA 1061 | texture: "gui/mockup_barGreen" 1062 | id: "snot_meter" 1063 | xanchor: XANCHOR_NONE 1064 | yanchor: YANCHOR_NONE 1065 | pivot: PIVOT_W 1066 | adjust_mode: ADJUST_MODE_FIT 1067 | parent: "snot_bg" 1068 | layer: "gui" 1069 | inherit_alpha: true 1070 | slice9 { 1071 | x: 9.0 1072 | y: 0.0 1073 | z: 9.0 1074 | w: 0.0 1075 | } 1076 | clipping_mode: CLIPPING_MODE_NONE 1077 | clipping_visible: true 1078 | clipping_inverted: false 1079 | alpha: 1.0 1080 | template_node_child: false 1081 | size_mode: SIZE_MODE_MANUAL 1082 | } 1083 | nodes { 1084 | position { 1085 | x: -3.276 1086 | y: 0.982 1087 | z: 0.0 1088 | w: 1.0 1089 | } 1090 | rotation { 1091 | x: 0.0 1092 | y: 0.0 1093 | z: 0.0 1094 | w: 1.0 1095 | } 1096 | scale { 1097 | x: 0.4 1098 | y: 0.4 1099 | z: 1.0 1100 | w: 1.0 1101 | } 1102 | size { 1103 | x: 200.0 1104 | y: 100.0 1105 | z: 0.0 1106 | w: 1.0 1107 | } 1108 | color { 1109 | x: 0.28627452 1110 | y: 0.14509805 1111 | z: 0.0 1112 | w: 1.0 1113 | } 1114 | type: TYPE_TEXT 1115 | blend_mode: BLEND_MODE_ALPHA 1116 | text: "Snot in nose" 1117 | font: "vera" 1118 | id: "snot_desc" 1119 | xanchor: XANCHOR_NONE 1120 | yanchor: YANCHOR_NONE 1121 | pivot: PIVOT_E 1122 | outline { 1123 | x: 1.0 1124 | y: 1.0 1125 | z: 1.0 1126 | w: 1.0 1127 | } 1128 | shadow { 1129 | x: 1.0 1130 | y: 1.0 1131 | z: 1.0 1132 | w: 1.0 1133 | } 1134 | adjust_mode: ADJUST_MODE_FIT 1135 | line_break: false 1136 | parent: "snot_bg" 1137 | layer: "vera" 1138 | inherit_alpha: true 1139 | alpha: 1.0 1140 | outline_alpha: 1.0 1141 | shadow_alpha: 1.0 1142 | template_node_child: false 1143 | text_leading: 1.0 1144 | text_tracking: 0.0 1145 | } 1146 | nodes { 1147 | position { 1148 | x: 136.369 1149 | y: 44.901 1150 | z: 0.0 1151 | w: 1.0 1152 | } 1153 | rotation { 1154 | x: 0.0 1155 | y: 0.0 1156 | z: 180.0 1157 | w: 1.0 1158 | } 1159 | scale { 1160 | x: 1.0 1161 | y: 1.0 1162 | z: 1.0 1163 | w: 1.0 1164 | } 1165 | size { 1166 | x: 120.0 1167 | y: 18.0 1168 | z: 0.0 1169 | w: 1.0 1170 | } 1171 | color { 1172 | x: 1.0 1173 | y: 1.0 1174 | z: 1.0 1175 | w: 1.0 1176 | } 1177 | type: TYPE_BOX 1178 | blend_mode: BLEND_MODE_ALPHA 1179 | texture: "gui/mockup_barBack" 1180 | id: "companion_mana_bg" 1181 | xanchor: XANCHOR_NONE 1182 | yanchor: YANCHOR_NONE 1183 | pivot: PIVOT_W 1184 | adjust_mode: ADJUST_MODE_FIT 1185 | parent: "rotation_correction" 1186 | layer: "gui" 1187 | inherit_alpha: true 1188 | slice9 { 1189 | x: 9.0 1190 | y: 0.0 1191 | z: 9.0 1192 | w: 0.0 1193 | } 1194 | clipping_mode: CLIPPING_MODE_NONE 1195 | clipping_visible: true 1196 | clipping_inverted: false 1197 | alpha: 1.0 1198 | template_node_child: false 1199 | size_mode: SIZE_MODE_MANUAL 1200 | } 1201 | nodes { 1202 | position { 1203 | x: 0.0 1204 | y: 0.0 1205 | z: 0.0 1206 | w: 1.0 1207 | } 1208 | rotation { 1209 | x: 0.0 1210 | y: 0.0 1211 | z: 0.0 1212 | w: 1.0 1213 | } 1214 | scale { 1215 | x: 1.0 1216 | y: 1.0 1217 | z: 1.0 1218 | w: 1.0 1219 | } 1220 | size { 1221 | x: 90.0 1222 | y: 18.0 1223 | z: 0.0 1224 | w: 1.0 1225 | } 1226 | color { 1227 | x: 1.0 1228 | y: 1.0 1229 | z: 1.0 1230 | w: 1.0 1231 | } 1232 | type: TYPE_BOX 1233 | blend_mode: BLEND_MODE_ALPHA 1234 | texture: "gui/mockup_barBlue" 1235 | id: "companion_mana_meter" 1236 | xanchor: XANCHOR_NONE 1237 | yanchor: YANCHOR_NONE 1238 | pivot: PIVOT_W 1239 | adjust_mode: ADJUST_MODE_FIT 1240 | parent: "companion_mana_bg" 1241 | layer: "gui" 1242 | inherit_alpha: true 1243 | slice9 { 1244 | x: 9.0 1245 | y: 0.0 1246 | z: 9.0 1247 | w: 0.0 1248 | } 1249 | clipping_mode: CLIPPING_MODE_NONE 1250 | clipping_visible: true 1251 | clipping_inverted: false 1252 | alpha: 1.0 1253 | template_node_child: false 1254 | size_mode: SIZE_MODE_MANUAL 1255 | } 1256 | nodes { 1257 | position { 1258 | x: -3.276 1259 | y: 0.982 1260 | z: 0.0 1261 | w: 1.0 1262 | } 1263 | rotation { 1264 | x: 0.0 1265 | y: 0.0 1266 | z: 0.0 1267 | w: 1.0 1268 | } 1269 | scale { 1270 | x: 0.4 1271 | y: 0.4 1272 | z: 1.0 1273 | w: 1.0 1274 | } 1275 | size { 1276 | x: 200.0 1277 | y: 100.0 1278 | z: 0.0 1279 | w: 1.0 1280 | } 1281 | color { 1282 | x: 0.28627452 1283 | y: 0.14509805 1284 | z: 0.0 1285 | w: 1.0 1286 | } 1287 | type: TYPE_TEXT 1288 | blend_mode: BLEND_MODE_ALPHA 1289 | text: "Companion Mana" 1290 | font: "vera" 1291 | id: "comp_mana_desc" 1292 | xanchor: XANCHOR_NONE 1293 | yanchor: YANCHOR_NONE 1294 | pivot: PIVOT_E 1295 | outline { 1296 | x: 1.0 1297 | y: 1.0 1298 | z: 1.0 1299 | w: 1.0 1300 | } 1301 | shadow { 1302 | x: 1.0 1303 | y: 1.0 1304 | z: 1.0 1305 | w: 1.0 1306 | } 1307 | adjust_mode: ADJUST_MODE_FIT 1308 | line_break: false 1309 | parent: "companion_mana_bg" 1310 | layer: "vera" 1311 | inherit_alpha: true 1312 | alpha: 1.0 1313 | outline_alpha: 1.0 1314 | shadow_alpha: 1.0 1315 | template_node_child: false 1316 | text_leading: 1.0 1317 | text_tracking: 0.0 1318 | } 1319 | nodes { 1320 | position { 1321 | x: 136.369 1322 | y: 22.391 1323 | z: 0.0 1324 | w: 1.0 1325 | } 1326 | rotation { 1327 | x: 0.0 1328 | y: 0.0 1329 | z: 180.0 1330 | w: 1.0 1331 | } 1332 | scale { 1333 | x: 1.0 1334 | y: 1.0 1335 | z: 1.0 1336 | w: 1.0 1337 | } 1338 | size { 1339 | x: 120.0 1340 | y: 18.0 1341 | z: 0.0 1342 | w: 1.0 1343 | } 1344 | color { 1345 | x: 1.0 1346 | y: 1.0 1347 | z: 1.0 1348 | w: 1.0 1349 | } 1350 | type: TYPE_BOX 1351 | blend_mode: BLEND_MODE_ALPHA 1352 | texture: "gui/mockup_barBack" 1353 | id: "companion_hp_bg" 1354 | xanchor: XANCHOR_NONE 1355 | yanchor: YANCHOR_NONE 1356 | pivot: PIVOT_W 1357 | adjust_mode: ADJUST_MODE_FIT 1358 | parent: "rotation_correction" 1359 | layer: "gui" 1360 | inherit_alpha: true 1361 | slice9 { 1362 | x: 9.0 1363 | y: 0.0 1364 | z: 9.0 1365 | w: 0.0 1366 | } 1367 | clipping_mode: CLIPPING_MODE_NONE 1368 | clipping_visible: true 1369 | clipping_inverted: false 1370 | alpha: 1.0 1371 | template_node_child: false 1372 | size_mode: SIZE_MODE_MANUAL 1373 | } 1374 | nodes { 1375 | position { 1376 | x: 0.0 1377 | y: 0.0 1378 | z: 0.0 1379 | w: 1.0 1380 | } 1381 | rotation { 1382 | x: 0.0 1383 | y: 0.0 1384 | z: 0.0 1385 | w: 1.0 1386 | } 1387 | scale { 1388 | x: 1.0 1389 | y: 1.0 1390 | z: 1.0 1391 | w: 1.0 1392 | } 1393 | size { 1394 | x: 110.0 1395 | y: 18.0 1396 | z: 0.0 1397 | w: 1.0 1398 | } 1399 | color { 1400 | x: 1.0 1401 | y: 1.0 1402 | z: 1.0 1403 | w: 1.0 1404 | } 1405 | type: TYPE_BOX 1406 | blend_mode: BLEND_MODE_ALPHA 1407 | texture: "gui/mockup_barRed" 1408 | id: "companion_hp_meter" 1409 | xanchor: XANCHOR_NONE 1410 | yanchor: YANCHOR_NONE 1411 | pivot: PIVOT_W 1412 | adjust_mode: ADJUST_MODE_FIT 1413 | parent: "companion_hp_bg" 1414 | layer: "gui" 1415 | inherit_alpha: true 1416 | slice9 { 1417 | x: 9.0 1418 | y: 0.0 1419 | z: 9.0 1420 | w: 0.0 1421 | } 1422 | clipping_mode: CLIPPING_MODE_NONE 1423 | clipping_visible: true 1424 | clipping_inverted: false 1425 | alpha: 1.0 1426 | template_node_child: false 1427 | size_mode: SIZE_MODE_MANUAL 1428 | } 1429 | nodes { 1430 | position { 1431 | x: -3.276 1432 | y: 0.982 1433 | z: 0.0 1434 | w: 1.0 1435 | } 1436 | rotation { 1437 | x: 0.0 1438 | y: 0.0 1439 | z: 0.0 1440 | w: 1.0 1441 | } 1442 | scale { 1443 | x: 0.4 1444 | y: 0.4 1445 | z: 1.0 1446 | w: 1.0 1447 | } 1448 | size { 1449 | x: 200.0 1450 | y: 100.0 1451 | z: 0.0 1452 | w: 1.0 1453 | } 1454 | color { 1455 | x: 0.28627452 1456 | y: 0.14509805 1457 | z: 0.0 1458 | w: 1.0 1459 | } 1460 | type: TYPE_TEXT 1461 | blend_mode: BLEND_MODE_ALPHA 1462 | text: "Companion Health" 1463 | font: "vera" 1464 | id: "comp_hp_desc" 1465 | xanchor: XANCHOR_NONE 1466 | yanchor: YANCHOR_NONE 1467 | pivot: PIVOT_E 1468 | outline { 1469 | x: 1.0 1470 | y: 1.0 1471 | z: 1.0 1472 | w: 1.0 1473 | } 1474 | shadow { 1475 | x: 1.0 1476 | y: 1.0 1477 | z: 1.0 1478 | w: 1.0 1479 | } 1480 | adjust_mode: ADJUST_MODE_FIT 1481 | line_break: false 1482 | parent: "companion_hp_bg" 1483 | layer: "vera" 1484 | inherit_alpha: true 1485 | alpha: 1.0 1486 | outline_alpha: 1.0 1487 | shadow_alpha: 1.0 1488 | template_node_child: false 1489 | text_leading: 1.0 1490 | text_tracking: 0.0 1491 | } 1492 | nodes { 1493 | position { 1494 | x: 6.922 1495 | y: 5.933 1496 | z: 0.0 1497 | w: 1.0 1498 | } 1499 | rotation { 1500 | x: 0.0 1501 | y: 0.0 1502 | z: 0.0 1503 | w: 1.0 1504 | } 1505 | scale { 1506 | x: 0.5 1507 | y: 0.5 1508 | z: 1.0 1509 | w: 1.0 1510 | } 1511 | size { 1512 | x: 16.0 1513 | y: 15.0 1514 | z: 0.0 1515 | w: 1.0 1516 | } 1517 | color { 1518 | x: 1.0 1519 | y: 1.0 1520 | z: 1.0 1521 | w: 1.0 1522 | } 1523 | type: TYPE_BOX 1524 | blend_mode: BLEND_MODE_ALPHA 1525 | texture: "gui/mockup_iconCross_blue" 1526 | id: "box" 1527 | xanchor: XANCHOR_NONE 1528 | yanchor: YANCHOR_NONE 1529 | pivot: PIVOT_CENTER 1530 | adjust_mode: ADJUST_MODE_FIT 1531 | parent: "stats_background" 1532 | layer: "gui" 1533 | inherit_alpha: true 1534 | slice9 { 1535 | x: 0.0 1536 | y: 0.0 1537 | z: 0.0 1538 | w: 0.0 1539 | } 1540 | clipping_mode: CLIPPING_MODE_NONE 1541 | clipping_visible: true 1542 | clipping_inverted: false 1543 | alpha: 1.0 1544 | template_node_child: false 1545 | size_mode: SIZE_MODE_AUTO 1546 | } 1547 | nodes { 1548 | position { 1549 | x: 6.922 1550 | y: 261.965 1551 | z: 0.0 1552 | w: 1.0 1553 | } 1554 | rotation { 1555 | x: 0.0 1556 | y: 0.0 1557 | z: 0.0 1558 | w: 1.0 1559 | } 1560 | scale { 1561 | x: 0.5 1562 | y: 0.5 1563 | z: 1.0 1564 | w: 1.0 1565 | } 1566 | size { 1567 | x: 16.0 1568 | y: 15.0 1569 | z: 0.0 1570 | w: 1.0 1571 | } 1572 | color { 1573 | x: 1.0 1574 | y: 1.0 1575 | z: 1.0 1576 | w: 1.0 1577 | } 1578 | type: TYPE_BOX 1579 | blend_mode: BLEND_MODE_ALPHA 1580 | texture: "gui/mockup_iconCross_blue" 1581 | id: "box1" 1582 | xanchor: XANCHOR_NONE 1583 | yanchor: YANCHOR_NONE 1584 | pivot: PIVOT_CENTER 1585 | adjust_mode: ADJUST_MODE_FIT 1586 | parent: "stats_background" 1587 | layer: "gui" 1588 | inherit_alpha: true 1589 | slice9 { 1590 | x: 0.0 1591 | y: 0.0 1592 | z: 0.0 1593 | w: 0.0 1594 | } 1595 | clipping_mode: CLIPPING_MODE_NONE 1596 | clipping_visible: true 1597 | clipping_inverted: false 1598 | alpha: 1.0 1599 | template_node_child: false 1600 | size_mode: SIZE_MODE_AUTO 1601 | } 1602 | nodes { 1603 | position { 1604 | x: 172.192 1605 | y: -28.0 1606 | z: 0.0 1607 | w: 1.0 1608 | } 1609 | rotation { 1610 | x: 0.0 1611 | y: 0.0 1612 | z: 0.0 1613 | w: 1.0 1614 | } 1615 | scale { 1616 | x: 1.0 1617 | y: 1.0 1618 | z: 1.0 1619 | w: 1.0 1620 | } 1621 | size { 1622 | x: 150.0 1623 | y: 18.0 1624 | z: 0.0 1625 | w: 1.0 1626 | } 1627 | color { 1628 | x: 1.0 1629 | y: 1.0 1630 | z: 1.0 1631 | w: 1.0 1632 | } 1633 | type: TYPE_BOX 1634 | blend_mode: BLEND_MODE_ALPHA 1635 | texture: "gui/mockup_barBack" 1636 | id: "player_mana_bg" 1637 | xanchor: XANCHOR_NONE 1638 | yanchor: YANCHOR_NONE 1639 | pivot: PIVOT_W 1640 | adjust_mode: ADJUST_MODE_FIT 1641 | parent: "stats_panel" 1642 | layer: "gui" 1643 | inherit_alpha: true 1644 | slice9 { 1645 | x: 9.0 1646 | y: 0.0 1647 | z: 9.0 1648 | w: 0.0 1649 | } 1650 | clipping_mode: CLIPPING_MODE_NONE 1651 | clipping_visible: true 1652 | clipping_inverted: false 1653 | alpha: 1.0 1654 | template_node_child: false 1655 | size_mode: SIZE_MODE_MANUAL 1656 | } 1657 | nodes { 1658 | position { 1659 | x: 0.0 1660 | y: 0.0 1661 | z: 0.0 1662 | w: 1.0 1663 | } 1664 | rotation { 1665 | x: 0.0 1666 | y: 0.0 1667 | z: 0.0 1668 | w: 1.0 1669 | } 1670 | scale { 1671 | x: 1.0 1672 | y: 1.0 1673 | z: 1.0 1674 | w: 1.0 1675 | } 1676 | size { 1677 | x: 100.0 1678 | y: 18.0 1679 | z: 0.0 1680 | w: 1.0 1681 | } 1682 | color { 1683 | x: 1.0 1684 | y: 1.0 1685 | z: 1.0 1686 | w: 1.0 1687 | } 1688 | type: TYPE_BOX 1689 | blend_mode: BLEND_MODE_ALPHA 1690 | texture: "gui/mockup_barBlue" 1691 | id: "player_mana_meter" 1692 | xanchor: XANCHOR_NONE 1693 | yanchor: YANCHOR_NONE 1694 | pivot: PIVOT_W 1695 | adjust_mode: ADJUST_MODE_FIT 1696 | parent: "player_mana_bg" 1697 | layer: "gui" 1698 | inherit_alpha: true 1699 | slice9 { 1700 | x: 9.0 1701 | y: 0.0 1702 | z: 9.0 1703 | w: 0.0 1704 | } 1705 | clipping_mode: CLIPPING_MODE_NONE 1706 | clipping_visible: true 1707 | clipping_inverted: false 1708 | alpha: 1.0 1709 | template_node_child: false 1710 | size_mode: SIZE_MODE_MANUAL 1711 | } 1712 | nodes { 1713 | position { 1714 | x: 0.0 1715 | y: 16.049 1716 | z: 0.0 1717 | w: 1.0 1718 | } 1719 | rotation { 1720 | x: 0.0 1721 | y: 0.0 1722 | z: 0.0 1723 | w: 1.0 1724 | } 1725 | scale { 1726 | x: 0.4 1727 | y: 0.4 1728 | z: 1.0 1729 | w: 1.0 1730 | } 1731 | size { 1732 | x: 200.0 1733 | y: 100.0 1734 | z: 0.0 1735 | w: 1.0 1736 | } 1737 | color { 1738 | x: 1.0 1739 | y: 0.8000001 1740 | z: 0.6 1741 | w: 1.0 1742 | } 1743 | type: TYPE_TEXT 1744 | blend_mode: BLEND_MODE_ALPHA 1745 | text: "Mana" 1746 | font: "vera" 1747 | id: "player_mana_desc" 1748 | xanchor: XANCHOR_NONE 1749 | yanchor: YANCHOR_NONE 1750 | pivot: PIVOT_W 1751 | outline { 1752 | x: 1.0 1753 | y: 1.0 1754 | z: 1.0 1755 | w: 1.0 1756 | } 1757 | shadow { 1758 | x: 1.0 1759 | y: 1.0 1760 | z: 1.0 1761 | w: 1.0 1762 | } 1763 | adjust_mode: ADJUST_MODE_FIT 1764 | line_break: false 1765 | parent: "player_mana_bg" 1766 | layer: "vera" 1767 | inherit_alpha: true 1768 | alpha: 1.0 1769 | outline_alpha: 1.0 1770 | shadow_alpha: 1.0 1771 | template_node_child: false 1772 | text_leading: 1.0 1773 | text_tracking: 0.0 1774 | } 1775 | nodes { 1776 | position { 1777 | x: 9.279 1778 | y: -28.0 1779 | z: 0.0 1780 | w: 1.0 1781 | } 1782 | rotation { 1783 | x: 0.0 1784 | y: 0.0 1785 | z: 0.0 1786 | w: 1.0 1787 | } 1788 | scale { 1789 | x: 1.0 1790 | y: 1.0 1791 | z: 1.0 1792 | w: 1.0 1793 | } 1794 | size { 1795 | x: 150.0 1796 | y: 18.0 1797 | z: 0.0 1798 | w: 1.0 1799 | } 1800 | color { 1801 | x: 1.0 1802 | y: 1.0 1803 | z: 1.0 1804 | w: 1.0 1805 | } 1806 | type: TYPE_BOX 1807 | blend_mode: BLEND_MODE_ALPHA 1808 | texture: "gui/mockup_barBack" 1809 | id: "player_hp_bg" 1810 | xanchor: XANCHOR_NONE 1811 | yanchor: YANCHOR_NONE 1812 | pivot: PIVOT_W 1813 | adjust_mode: ADJUST_MODE_FIT 1814 | parent: "stats_panel" 1815 | layer: "gui" 1816 | inherit_alpha: true 1817 | slice9 { 1818 | x: 9.0 1819 | y: 0.0 1820 | z: 9.0 1821 | w: 0.0 1822 | } 1823 | clipping_mode: CLIPPING_MODE_NONE 1824 | clipping_visible: true 1825 | clipping_inverted: false 1826 | alpha: 1.0 1827 | template_node_child: false 1828 | size_mode: SIZE_MODE_MANUAL 1829 | } 1830 | nodes { 1831 | position { 1832 | x: 0.0 1833 | y: 0.0 1834 | z: 0.0 1835 | w: 1.0 1836 | } 1837 | rotation { 1838 | x: 0.0 1839 | y: 0.0 1840 | z: 0.0 1841 | w: 1.0 1842 | } 1843 | scale { 1844 | x: 1.0 1845 | y: 1.0 1846 | z: 1.0 1847 | w: 1.0 1848 | } 1849 | size { 1850 | x: 120.0 1851 | y: 18.0 1852 | z: 0.0 1853 | w: 1.0 1854 | } 1855 | color { 1856 | x: 1.0 1857 | y: 1.0 1858 | z: 1.0 1859 | w: 1.0 1860 | } 1861 | type: TYPE_BOX 1862 | blend_mode: BLEND_MODE_ALPHA 1863 | texture: "gui/mockup_barRed" 1864 | id: "player_hp_meter" 1865 | xanchor: XANCHOR_NONE 1866 | yanchor: YANCHOR_NONE 1867 | pivot: PIVOT_W 1868 | adjust_mode: ADJUST_MODE_FIT 1869 | parent: "player_hp_bg" 1870 | layer: "gui" 1871 | inherit_alpha: true 1872 | slice9 { 1873 | x: 9.0 1874 | y: 0.0 1875 | z: 9.0 1876 | w: 0.0 1877 | } 1878 | clipping_mode: CLIPPING_MODE_NONE 1879 | clipping_visible: true 1880 | clipping_inverted: false 1881 | alpha: 1.0 1882 | template_node_child: false 1883 | size_mode: SIZE_MODE_MANUAL 1884 | } 1885 | nodes { 1886 | position { 1887 | x: 0.0 1888 | y: 16.049 1889 | z: 0.0 1890 | w: 1.0 1891 | } 1892 | rotation { 1893 | x: 0.0 1894 | y: 0.0 1895 | z: 0.0 1896 | w: 1.0 1897 | } 1898 | scale { 1899 | x: 0.4 1900 | y: 0.4 1901 | z: 1.0 1902 | w: 1.0 1903 | } 1904 | size { 1905 | x: 200.0 1906 | y: 100.0 1907 | z: 0.0 1908 | w: 1.0 1909 | } 1910 | color { 1911 | x: 1.0 1912 | y: 0.8000001 1913 | z: 0.6 1914 | w: 1.0 1915 | } 1916 | type: TYPE_TEXT 1917 | blend_mode: BLEND_MODE_ALPHA 1918 | text: "Health" 1919 | font: "vera" 1920 | id: "player_hp_desc" 1921 | xanchor: XANCHOR_NONE 1922 | yanchor: YANCHOR_NONE 1923 | pivot: PIVOT_W 1924 | outline { 1925 | x: 1.0 1926 | y: 1.0 1927 | z: 1.0 1928 | w: 1.0 1929 | } 1930 | shadow { 1931 | x: 1.0 1932 | y: 1.0 1933 | z: 1.0 1934 | w: 1.0 1935 | } 1936 | adjust_mode: ADJUST_MODE_FIT 1937 | line_break: false 1938 | parent: "player_hp_bg" 1939 | layer: "vera" 1940 | inherit_alpha: true 1941 | alpha: 1.0 1942 | outline_alpha: 1.0 1943 | shadow_alpha: 1.0 1944 | template_node_child: false 1945 | text_leading: 1.0 1946 | text_tracking: 0.0 1947 | } 1948 | nodes { 1949 | position { 1950 | x: 360.0 1951 | y: 259.394 1952 | z: 0.0 1953 | w: 1.0 1954 | } 1955 | rotation { 1956 | x: 0.0 1957 | y: 0.0 1958 | z: 0.0 1959 | w: 1.0 1960 | } 1961 | scale { 1962 | x: 1.0 1963 | y: 1.0 1964 | z: 1.0 1965 | w: 1.0 1966 | } 1967 | size { 1968 | x: 0.0 1969 | y: 0.0 1970 | z: 0.0 1971 | w: 1.0 1972 | } 1973 | color { 1974 | x: 1.0 1975 | y: 1.0 1976 | z: 1.0 1977 | w: 1.0 1978 | } 1979 | type: TYPE_BOX 1980 | blend_mode: BLEND_MODE_ALPHA 1981 | texture: "gui/mockup_arrowBeige_left" 1982 | id: "inventory" 1983 | xanchor: XANCHOR_NONE 1984 | yanchor: YANCHOR_NONE 1985 | pivot: PIVOT_CENTER 1986 | adjust_mode: ADJUST_MODE_FIT 1987 | layer: "" 1988 | inherit_alpha: true 1989 | slice9 { 1990 | x: 0.0 1991 | y: 0.0 1992 | z: 0.0 1993 | w: 0.0 1994 | } 1995 | clipping_mode: CLIPPING_MODE_NONE 1996 | clipping_visible: true 1997 | clipping_inverted: false 1998 | alpha: 1.0 1999 | template_node_child: false 2000 | size_mode: SIZE_MODE_MANUAL 2001 | } 2002 | nodes { 2003 | position { 2004 | x: 0.0 2005 | y: 0.0 2006 | z: 0.0 2007 | w: 1.0 2008 | } 2009 | rotation { 2010 | x: 0.0 2011 | y: 0.0 2012 | z: 0.0 2013 | w: 1.0 2014 | } 2015 | scale { 2016 | x: 1.0 2017 | y: 1.0 2018 | z: 1.0 2019 | w: 1.0 2020 | } 2021 | size { 2022 | x: 700.0 2023 | y: 500.0 2024 | z: 0.0 2025 | w: 1.0 2026 | } 2027 | color { 2028 | x: 1.0 2029 | y: 1.0 2030 | z: 1.0 2031 | w: 1.0 2032 | } 2033 | type: TYPE_BOX 2034 | blend_mode: BLEND_MODE_ALPHA 2035 | texture: "gui/mockup_panel_brown" 2036 | id: "inv_panel" 2037 | xanchor: XANCHOR_NONE 2038 | yanchor: YANCHOR_NONE 2039 | pivot: PIVOT_CENTER 2040 | adjust_mode: ADJUST_MODE_FIT 2041 | parent: "inventory" 2042 | layer: "" 2043 | inherit_alpha: true 2044 | slice9 { 2045 | x: 65.0 2046 | y: 25.0 2047 | z: 25.0 2048 | w: 50.0 2049 | } 2050 | clipping_mode: CLIPPING_MODE_NONE 2051 | clipping_visible: true 2052 | clipping_inverted: false 2053 | alpha: 1.0 2054 | template_node_child: false 2055 | size_mode: SIZE_MODE_MANUAL 2056 | } 2057 | nodes { 2058 | position { 2059 | x: 167.0 2060 | y: -148.908 2061 | z: 0.0 2062 | w: 1.0 2063 | } 2064 | rotation { 2065 | x: 0.0 2066 | y: 0.0 2067 | z: 0.0 2068 | w: 1.0 2069 | } 2070 | scale { 2071 | x: 1.0 2072 | y: 1.0 2073 | z: 1.0 2074 | w: 1.0 2075 | } 2076 | size { 2077 | x: 340.0 2078 | y: 180.0 2079 | z: 0.0 2080 | w: 1.0 2081 | } 2082 | color { 2083 | x: 1.0 2084 | y: 1.0 2085 | z: 1.0 2086 | w: 1.0 2087 | } 2088 | type: TYPE_BOX 2089 | blend_mode: BLEND_MODE_ALPHA 2090 | texture: "gui/mockup_panelInset_beige" 2091 | id: "items_background" 2092 | xanchor: XANCHOR_NONE 2093 | yanchor: YANCHOR_NONE 2094 | pivot: PIVOT_CENTER 2095 | adjust_mode: ADJUST_MODE_FIT 2096 | parent: "inv_panel" 2097 | layer: "empty" 2098 | inherit_alpha: true 2099 | slice9 { 2100 | x: 25.0 2101 | y: 25.0 2102 | z: 25.0 2103 | w: 50.0 2104 | } 2105 | clipping_mode: CLIPPING_MODE_STENCIL 2106 | clipping_visible: true 2107 | clipping_inverted: false 2108 | alpha: 1.0 2109 | template_node_child: false 2110 | size_mode: SIZE_MODE_MANUAL 2111 | } 2112 | nodes { 2113 | position { 2114 | x: 0.0 2115 | y: 0.0 2116 | z: 0.0 2117 | w: 1.0 2118 | } 2119 | rotation { 2120 | x: 0.0 2121 | y: 0.0 2122 | z: 0.0 2123 | w: 1.0 2124 | } 2125 | scale { 2126 | x: 1.0 2127 | y: 1.0 2128 | z: 1.0 2129 | w: 1.0 2130 | } 2131 | size { 2132 | x: 0.0 2133 | y: 0.0 2134 | z: 0.0 2135 | w: 1.0 2136 | } 2137 | color { 2138 | x: 1.0 2139 | y: 1.0 2140 | z: 1.0 2141 | w: 1.0 2142 | } 2143 | type: TYPE_BOX 2144 | blend_mode: BLEND_MODE_ALPHA 2145 | texture: "gui/mockup_arrowBeige_left" 2146 | id: "items_list" 2147 | xanchor: XANCHOR_NONE 2148 | yanchor: YANCHOR_NONE 2149 | pivot: PIVOT_CENTER 2150 | adjust_mode: ADJUST_MODE_FIT 2151 | parent: "items_background" 2152 | layer: "gui" 2153 | inherit_alpha: true 2154 | slice9 { 2155 | x: 0.0 2156 | y: 0.0 2157 | z: 0.0 2158 | w: 0.0 2159 | } 2160 | clipping_mode: CLIPPING_MODE_NONE 2161 | clipping_visible: true 2162 | clipping_inverted: false 2163 | alpha: 1.0 2164 | template_node_child: false 2165 | size_mode: SIZE_MODE_MANUAL 2166 | } 2167 | nodes { 2168 | position { 2169 | x: -122.103 2170 | y: 38.881 2171 | z: 0.0 2172 | w: 1.0 2173 | } 2174 | rotation { 2175 | x: 0.0 2176 | y: 0.0 2177 | z: 0.0 2178 | w: 1.0 2179 | } 2180 | scale { 2181 | x: 1.0 2182 | y: 1.0 2183 | z: 1.0 2184 | w: 1.0 2185 | } 2186 | size { 2187 | x: 69.0 2188 | y: 67.0 2189 | z: 0.0 2190 | w: 1.0 2191 | } 2192 | color { 2193 | x: 1.0 2194 | y: 1.0 2195 | z: 1.0 2196 | w: 1.0 2197 | } 2198 | type: TYPE_BOX 2199 | blend_mode: BLEND_MODE_ALPHA 2200 | texture: "gui/mockup_panelInset_blue" 2201 | id: "i_slot_1" 2202 | xanchor: XANCHOR_NONE 2203 | yanchor: YANCHOR_NONE 2204 | pivot: PIVOT_CENTER 2205 | adjust_mode: ADJUST_MODE_FIT 2206 | parent: "items_list" 2207 | layer: "empty" 2208 | inherit_alpha: true 2209 | slice9 { 2210 | x: 0.0 2211 | y: 0.0 2212 | z: 0.0 2213 | w: 0.0 2214 | } 2215 | clipping_mode: CLIPPING_MODE_NONE 2216 | clipping_visible: true 2217 | clipping_inverted: false 2218 | alpha: 1.0 2219 | template_node_child: false 2220 | size_mode: SIZE_MODE_MANUAL 2221 | } 2222 | nodes { 2223 | position { 2224 | x: 0.0 2225 | y: 0.0 2226 | z: 0.0 2227 | w: 1.0 2228 | } 2229 | rotation { 2230 | x: 0.0 2231 | y: 0.0 2232 | z: 0.0 2233 | w: 1.0 2234 | } 2235 | scale { 2236 | x: 0.7 2237 | y: 0.5 2238 | z: 1.0 2239 | w: 1.0 2240 | } 2241 | size { 2242 | x: 53.0 2243 | y: 108.0 2244 | z: 0.0 2245 | w: 1.0 2246 | } 2247 | color { 2248 | x: 1.0 2249 | y: 1.0 2250 | z: 1.0 2251 | w: 1.0 2252 | } 2253 | type: TYPE_BOX 2254 | blend_mode: BLEND_MODE_ALPHA 2255 | texture: "icons/mockup_manaPot" 2256 | id: "i_icon_1" 2257 | xanchor: XANCHOR_NONE 2258 | yanchor: YANCHOR_NONE 2259 | pivot: PIVOT_CENTER 2260 | adjust_mode: ADJUST_MODE_FIT 2261 | parent: "i_slot_1" 2262 | layer: "icons" 2263 | inherit_alpha: true 2264 | slice9 { 2265 | x: 0.0 2266 | y: 0.0 2267 | z: 0.0 2268 | w: 0.0 2269 | } 2270 | clipping_mode: CLIPPING_MODE_NONE 2271 | clipping_visible: true 2272 | clipping_inverted: false 2273 | alpha: 1.0 2274 | template_node_child: false 2275 | size_mode: SIZE_MODE_AUTO 2276 | } 2277 | nodes { 2278 | position { 2279 | x: -122.103 2280 | y: -39.558 2281 | z: 0.0 2282 | w: 1.0 2283 | } 2284 | rotation { 2285 | x: 0.0 2286 | y: 0.0 2287 | z: 0.0 2288 | w: 1.0 2289 | } 2290 | scale { 2291 | x: 1.0 2292 | y: 1.0 2293 | z: 1.0 2294 | w: 1.0 2295 | } 2296 | size { 2297 | x: 69.0 2298 | y: 67.0 2299 | z: 0.0 2300 | w: 1.0 2301 | } 2302 | color { 2303 | x: 1.0 2304 | y: 1.0 2305 | z: 1.0 2306 | w: 1.0 2307 | } 2308 | type: TYPE_BOX 2309 | blend_mode: BLEND_MODE_ALPHA 2310 | texture: "gui/mockup_panelInset_blue" 2311 | id: "i_slot_2" 2312 | xanchor: XANCHOR_NONE 2313 | yanchor: YANCHOR_NONE 2314 | pivot: PIVOT_CENTER 2315 | adjust_mode: ADJUST_MODE_FIT 2316 | parent: "items_list" 2317 | layer: "gui" 2318 | inherit_alpha: true 2319 | slice9 { 2320 | x: 0.0 2321 | y: 0.0 2322 | z: 0.0 2323 | w: 0.0 2324 | } 2325 | clipping_mode: CLIPPING_MODE_NONE 2326 | clipping_visible: true 2327 | clipping_inverted: false 2328 | alpha: 1.0 2329 | template_node_child: false 2330 | size_mode: SIZE_MODE_MANUAL 2331 | } 2332 | nodes { 2333 | position { 2334 | x: 0.0 2335 | y: 0.0 2336 | z: 0.0 2337 | w: 1.0 2338 | } 2339 | rotation { 2340 | x: 0.0 2341 | y: -180.0 2342 | z: 0.0 2343 | w: 1.0 2344 | } 2345 | scale { 2346 | x: 0.5 2347 | y: 0.5 2348 | z: 1.0 2349 | w: 1.0 2350 | } 2351 | size { 2352 | x: 53.0 2353 | y: 108.0 2354 | z: 0.0 2355 | w: 1.0 2356 | } 2357 | color { 2358 | x: 1.0 2359 | y: 1.0 2360 | z: 1.0 2361 | w: 1.0 2362 | } 2363 | type: TYPE_BOX 2364 | blend_mode: BLEND_MODE_ALPHA 2365 | texture: "icons/mockup_manaPot" 2366 | id: "i_icon_2" 2367 | xanchor: XANCHOR_NONE 2368 | yanchor: YANCHOR_NONE 2369 | pivot: PIVOT_CENTER 2370 | adjust_mode: ADJUST_MODE_FIT 2371 | parent: "i_slot_2" 2372 | layer: "icons" 2373 | inherit_alpha: true 2374 | slice9 { 2375 | x: 0.0 2376 | y: 0.0 2377 | z: 0.0 2378 | w: 0.0 2379 | } 2380 | clipping_mode: CLIPPING_MODE_NONE 2381 | clipping_visible: true 2382 | clipping_inverted: false 2383 | alpha: 1.0 2384 | template_node_child: false 2385 | size_mode: SIZE_MODE_AUTO 2386 | } 2387 | nodes { 2388 | position { 2389 | x: -45.96 2390 | y: -39.558 2391 | z: 0.0 2392 | w: 1.0 2393 | } 2394 | rotation { 2395 | x: 0.0 2396 | y: 0.0 2397 | z: 0.0 2398 | w: 1.0 2399 | } 2400 | scale { 2401 | x: 1.0 2402 | y: 1.0 2403 | z: 1.0 2404 | w: 1.0 2405 | } 2406 | size { 2407 | x: 69.0 2408 | y: 67.0 2409 | z: 0.0 2410 | w: 1.0 2411 | } 2412 | color { 2413 | x: 1.0 2414 | y: 1.0 2415 | z: 1.0 2416 | w: 1.0 2417 | } 2418 | type: TYPE_BOX 2419 | blend_mode: BLEND_MODE_ALPHA 2420 | texture: "gui/mockup_panelInset_blue" 2421 | id: "i_slot_5" 2422 | xanchor: XANCHOR_NONE 2423 | yanchor: YANCHOR_NONE 2424 | pivot: PIVOT_CENTER 2425 | adjust_mode: ADJUST_MODE_FIT 2426 | parent: "items_list" 2427 | layer: "gui" 2428 | inherit_alpha: true 2429 | slice9 { 2430 | x: 0.0 2431 | y: 0.0 2432 | z: 0.0 2433 | w: 0.0 2434 | } 2435 | clipping_mode: CLIPPING_MODE_NONE 2436 | clipping_visible: true 2437 | clipping_inverted: false 2438 | alpha: 1.0 2439 | template_node_child: false 2440 | size_mode: SIZE_MODE_MANUAL 2441 | } 2442 | nodes { 2443 | position { 2444 | x: 0.0 2445 | y: 0.0 2446 | z: 0.0 2447 | w: 1.0 2448 | } 2449 | rotation { 2450 | x: 0.0 2451 | y: 0.0 2452 | z: 0.0 2453 | w: 1.0 2454 | } 2455 | scale { 2456 | x: 1.5 2457 | y: 1.5 2458 | z: 1.0 2459 | w: 1.0 2460 | } 2461 | size { 2462 | x: 34.0 2463 | y: 37.0 2464 | z: 0.0 2465 | w: 1.0 2466 | } 2467 | color { 2468 | x: 1.0 2469 | y: 1.0 2470 | z: 1.0 2471 | w: 1.0 2472 | } 2473 | type: TYPE_BOX 2474 | blend_mode: BLEND_MODE_ALPHA 2475 | texture: "icons/mockup_cursorSword_gold" 2476 | id: "i_icon_5" 2477 | xanchor: XANCHOR_NONE 2478 | yanchor: YANCHOR_NONE 2479 | pivot: PIVOT_CENTER 2480 | adjust_mode: ADJUST_MODE_FIT 2481 | parent: "i_slot_5" 2482 | layer: "icons" 2483 | inherit_alpha: true 2484 | slice9 { 2485 | x: 0.0 2486 | y: 0.0 2487 | z: 0.0 2488 | w: 0.0 2489 | } 2490 | clipping_mode: CLIPPING_MODE_NONE 2491 | clipping_visible: true 2492 | clipping_inverted: false 2493 | alpha: 0.0 2494 | template_node_child: false 2495 | size_mode: SIZE_MODE_AUTO 2496 | } 2497 | nodes { 2498 | position { 2499 | x: -45.96 2500 | y: 38.881 2501 | z: 0.0 2502 | w: 1.0 2503 | } 2504 | rotation { 2505 | x: 0.0 2506 | y: 0.0 2507 | z: 0.0 2508 | w: 1.0 2509 | } 2510 | scale { 2511 | x: 1.0 2512 | y: 1.0 2513 | z: 1.0 2514 | w: 1.0 2515 | } 2516 | size { 2517 | x: 69.0 2518 | y: 67.0 2519 | z: 0.0 2520 | w: 1.0 2521 | } 2522 | color { 2523 | x: 1.0 2524 | y: 1.0 2525 | z: 1.0 2526 | w: 1.0 2527 | } 2528 | type: TYPE_BOX 2529 | blend_mode: BLEND_MODE_ALPHA 2530 | texture: "gui/mockup_panelInset_blue" 2531 | id: "i_slot_4" 2532 | xanchor: XANCHOR_NONE 2533 | yanchor: YANCHOR_NONE 2534 | pivot: PIVOT_CENTER 2535 | adjust_mode: ADJUST_MODE_FIT 2536 | parent: "items_list" 2537 | layer: "gui" 2538 | inherit_alpha: true 2539 | slice9 { 2540 | x: 0.0 2541 | y: 0.0 2542 | z: 0.0 2543 | w: 0.0 2544 | } 2545 | clipping_mode: CLIPPING_MODE_NONE 2546 | clipping_visible: true 2547 | clipping_inverted: false 2548 | alpha: 1.0 2549 | template_node_child: false 2550 | size_mode: SIZE_MODE_MANUAL 2551 | } 2552 | nodes { 2553 | position { 2554 | x: 0.0 2555 | y: 0.0 2556 | z: 0.0 2557 | w: 1.0 2558 | } 2559 | rotation { 2560 | x: 0.0 2561 | y: 0.0 2562 | z: 0.0 2563 | w: 1.0 2564 | } 2565 | scale { 2566 | x: 1.5 2567 | y: 1.5 2568 | z: 1.0 2569 | w: 1.0 2570 | } 2571 | size { 2572 | x: 34.0 2573 | y: 37.0 2574 | z: 0.0 2575 | w: 1.0 2576 | } 2577 | color { 2578 | x: 1.0 2579 | y: 1.0 2580 | z: 1.0 2581 | w: 1.0 2582 | } 2583 | type: TYPE_BOX 2584 | blend_mode: BLEND_MODE_ALPHA 2585 | texture: "icons/mockup_cursorSword_gold" 2586 | id: "i_icon_4" 2587 | xanchor: XANCHOR_NONE 2588 | yanchor: YANCHOR_NONE 2589 | pivot: PIVOT_CENTER 2590 | adjust_mode: ADJUST_MODE_FIT 2591 | parent: "i_slot_4" 2592 | layer: "icons" 2593 | inherit_alpha: true 2594 | slice9 { 2595 | x: 0.0 2596 | y: 0.0 2597 | z: 0.0 2598 | w: 0.0 2599 | } 2600 | clipping_mode: CLIPPING_MODE_NONE 2601 | clipping_visible: true 2602 | clipping_inverted: false 2603 | alpha: 0.0 2604 | template_node_child: false 2605 | size_mode: SIZE_MODE_AUTO 2606 | } 2607 | nodes { 2608 | position { 2609 | x: 29.897 2610 | y: 38.881 2611 | z: 0.0 2612 | w: 1.0 2613 | } 2614 | rotation { 2615 | x: 0.0 2616 | y: 0.0 2617 | z: 0.0 2618 | w: 1.0 2619 | } 2620 | scale { 2621 | x: 1.0 2622 | y: 1.0 2623 | z: 1.0 2624 | w: 1.0 2625 | } 2626 | size { 2627 | x: 69.0 2628 | y: 67.0 2629 | z: 0.0 2630 | w: 1.0 2631 | } 2632 | color { 2633 | x: 1.0 2634 | y: 1.0 2635 | z: 1.0 2636 | w: 1.0 2637 | } 2638 | type: TYPE_BOX 2639 | blend_mode: BLEND_MODE_ALPHA 2640 | texture: "gui/mockup_panelInset_blue" 2641 | id: "i_slot_" 2642 | xanchor: XANCHOR_NONE 2643 | yanchor: YANCHOR_NONE 2644 | pivot: PIVOT_CENTER 2645 | adjust_mode: ADJUST_MODE_FIT 2646 | parent: "items_list" 2647 | layer: "gui" 2648 | inherit_alpha: true 2649 | slice9 { 2650 | x: 0.0 2651 | y: 0.0 2652 | z: 0.0 2653 | w: 0.0 2654 | } 2655 | clipping_mode: CLIPPING_MODE_NONE 2656 | clipping_visible: true 2657 | clipping_inverted: false 2658 | alpha: 1.0 2659 | template_node_child: false 2660 | size_mode: SIZE_MODE_MANUAL 2661 | } 2662 | nodes { 2663 | position { 2664 | x: 0.0 2665 | y: 0.0 2666 | z: 0.0 2667 | w: 1.0 2668 | } 2669 | rotation { 2670 | x: 0.0 2671 | y: 0.0 2672 | z: 0.0 2673 | w: 1.0 2674 | } 2675 | scale { 2676 | x: 0.7 2677 | y: 0.5 2678 | z: 1.0 2679 | w: 1.0 2680 | } 2681 | size { 2682 | x: 53.0 2683 | y: 108.0 2684 | z: 0.0 2685 | w: 1.0 2686 | } 2687 | color { 2688 | x: 1.0 2689 | y: 1.0 2690 | z: 1.0 2691 | w: 1.0 2692 | } 2693 | type: TYPE_BOX 2694 | blend_mode: BLEND_MODE_ALPHA 2695 | texture: "icons/mockup_manaPot" 2696 | id: "i_icon_" 2697 | xanchor: XANCHOR_NONE 2698 | yanchor: YANCHOR_NONE 2699 | pivot: PIVOT_CENTER 2700 | adjust_mode: ADJUST_MODE_FIT 2701 | parent: "i_slot_" 2702 | layer: "icons" 2703 | inherit_alpha: true 2704 | slice9 { 2705 | x: 0.0 2706 | y: 0.0 2707 | z: 0.0 2708 | w: 0.0 2709 | } 2710 | clipping_mode: CLIPPING_MODE_NONE 2711 | clipping_visible: true 2712 | clipping_inverted: false 2713 | alpha: 1.0 2714 | template_node_child: false 2715 | size_mode: SIZE_MODE_AUTO 2716 | } 2717 | nodes { 2718 | position { 2719 | x: 29.897 2720 | y: -39.558 2721 | z: 0.0 2722 | w: 1.0 2723 | } 2724 | rotation { 2725 | x: 0.0 2726 | y: 0.0 2727 | z: 0.0 2728 | w: 1.0 2729 | } 2730 | scale { 2731 | x: 1.0 2732 | y: 1.0 2733 | z: 1.0 2734 | w: 1.0 2735 | } 2736 | size { 2737 | x: 69.0 2738 | y: 67.0 2739 | z: 0.0 2740 | w: 1.0 2741 | } 2742 | color { 2743 | x: 1.0 2744 | y: 1.0 2745 | z: 1.0 2746 | w: 1.0 2747 | } 2748 | type: TYPE_BOX 2749 | blend_mode: BLEND_MODE_ALPHA 2750 | texture: "gui/mockup_panelInset_blue" 2751 | id: "i_slot_3" 2752 | xanchor: XANCHOR_NONE 2753 | yanchor: YANCHOR_NONE 2754 | pivot: PIVOT_CENTER 2755 | adjust_mode: ADJUST_MODE_FIT 2756 | parent: "items_list" 2757 | layer: "gui" 2758 | inherit_alpha: true 2759 | slice9 { 2760 | x: 0.0 2761 | y: 0.0 2762 | z: 0.0 2763 | w: 0.0 2764 | } 2765 | clipping_mode: CLIPPING_MODE_NONE 2766 | clipping_visible: true 2767 | clipping_inverted: false 2768 | alpha: 1.0 2769 | template_node_child: false 2770 | size_mode: SIZE_MODE_MANUAL 2771 | } 2772 | nodes { 2773 | position { 2774 | x: 0.0 2775 | y: 0.0 2776 | z: 0.0 2777 | w: 1.0 2778 | } 2779 | rotation { 2780 | x: 0.0 2781 | y: -180.0 2782 | z: 0.0 2783 | w: 1.0 2784 | } 2785 | scale { 2786 | x: 0.5 2787 | y: 0.5 2788 | z: 1.0 2789 | w: 1.0 2790 | } 2791 | size { 2792 | x: 53.0 2793 | y: 108.0 2794 | z: 0.0 2795 | w: 1.0 2796 | } 2797 | color { 2798 | x: 1.0 2799 | y: 1.0 2800 | z: 1.0 2801 | w: 1.0 2802 | } 2803 | type: TYPE_BOX 2804 | blend_mode: BLEND_MODE_ALPHA 2805 | texture: "icons/mockup_manaPot" 2806 | id: "i_icon_3" 2807 | xanchor: XANCHOR_NONE 2808 | yanchor: YANCHOR_NONE 2809 | pivot: PIVOT_CENTER 2810 | adjust_mode: ADJUST_MODE_FIT 2811 | parent: "i_slot_3" 2812 | layer: "icons" 2813 | inherit_alpha: true 2814 | slice9 { 2815 | x: 0.0 2816 | y: 0.0 2817 | z: 0.0 2818 | w: 0.0 2819 | } 2820 | clipping_mode: CLIPPING_MODE_NONE 2821 | clipping_visible: true 2822 | clipping_inverted: false 2823 | alpha: 1.0 2824 | template_node_child: false 2825 | size_mode: SIZE_MODE_AUTO 2826 | } 2827 | nodes { 2828 | position { 2829 | x: 109.04 2830 | y: -39.558 2831 | z: 0.0 2832 | w: 1.0 2833 | } 2834 | rotation { 2835 | x: 0.0 2836 | y: 0.0 2837 | z: 0.0 2838 | w: 1.0 2839 | } 2840 | scale { 2841 | x: 1.0 2842 | y: 1.0 2843 | z: 1.0 2844 | w: 1.0 2845 | } 2846 | size { 2847 | x: 69.0 2848 | y: 67.0 2849 | z: 0.0 2850 | w: 1.0 2851 | } 2852 | color { 2853 | x: 1.0 2854 | y: 1.0 2855 | z: 1.0 2856 | w: 1.0 2857 | } 2858 | type: TYPE_BOX 2859 | blend_mode: BLEND_MODE_ALPHA 2860 | texture: "gui/mockup_panelInset_blue" 2861 | id: "i_slot_6" 2862 | xanchor: XANCHOR_NONE 2863 | yanchor: YANCHOR_NONE 2864 | pivot: PIVOT_CENTER 2865 | adjust_mode: ADJUST_MODE_FIT 2866 | parent: "items_list" 2867 | layer: "gui" 2868 | inherit_alpha: true 2869 | slice9 { 2870 | x: 0.0 2871 | y: 0.0 2872 | z: 0.0 2873 | w: 0.0 2874 | } 2875 | clipping_mode: CLIPPING_MODE_NONE 2876 | clipping_visible: true 2877 | clipping_inverted: false 2878 | alpha: 1.0 2879 | template_node_child: false 2880 | size_mode: SIZE_MODE_MANUAL 2881 | } 2882 | nodes { 2883 | position { 2884 | x: 0.0 2885 | y: 0.0 2886 | z: 0.0 2887 | w: 1.0 2888 | } 2889 | rotation { 2890 | x: 0.0 2891 | y: 0.0 2892 | z: 0.0 2893 | w: 1.0 2894 | } 2895 | scale { 2896 | x: 1.5 2897 | y: 1.5 2898 | z: 1.0 2899 | w: 1.0 2900 | } 2901 | size { 2902 | x: 34.0 2903 | y: 37.0 2904 | z: 0.0 2905 | w: 1.0 2906 | } 2907 | color { 2908 | x: 1.0 2909 | y: 1.0 2910 | z: 1.0 2911 | w: 1.0 2912 | } 2913 | type: TYPE_BOX 2914 | blend_mode: BLEND_MODE_ALPHA 2915 | texture: "icons/mockup_cursorSword_gold" 2916 | id: "i_icon_6" 2917 | xanchor: XANCHOR_NONE 2918 | yanchor: YANCHOR_NONE 2919 | pivot: PIVOT_CENTER 2920 | adjust_mode: ADJUST_MODE_FIT 2921 | parent: "i_slot_6" 2922 | layer: "icons" 2923 | inherit_alpha: true 2924 | slice9 { 2925 | x: 0.0 2926 | y: 0.0 2927 | z: 0.0 2928 | w: 0.0 2929 | } 2930 | clipping_mode: CLIPPING_MODE_NONE 2931 | clipping_visible: true 2932 | clipping_inverted: false 2933 | alpha: 0.0 2934 | template_node_child: false 2935 | size_mode: SIZE_MODE_AUTO 2936 | } 2937 | nodes { 2938 | position { 2939 | x: 109.04 2940 | y: 38.881 2941 | z: 0.0 2942 | w: 1.0 2943 | } 2944 | rotation { 2945 | x: 0.0 2946 | y: 0.0 2947 | z: 0.0 2948 | w: 1.0 2949 | } 2950 | scale { 2951 | x: 1.0 2952 | y: 1.0 2953 | z: 1.0 2954 | w: 1.0 2955 | } 2956 | size { 2957 | x: 69.0 2958 | y: 67.0 2959 | z: 0.0 2960 | w: 1.0 2961 | } 2962 | color { 2963 | x: 1.0 2964 | y: 1.0 2965 | z: 1.0 2966 | w: 1.0 2967 | } 2968 | type: TYPE_BOX 2969 | blend_mode: BLEND_MODE_ALPHA 2970 | texture: "gui/mockup_panelInset_blue" 2971 | id: "i_slot_7" 2972 | xanchor: XANCHOR_NONE 2973 | yanchor: YANCHOR_NONE 2974 | pivot: PIVOT_CENTER 2975 | adjust_mode: ADJUST_MODE_FIT 2976 | parent: "items_list" 2977 | layer: "gui" 2978 | inherit_alpha: true 2979 | slice9 { 2980 | x: 0.0 2981 | y: 0.0 2982 | z: 0.0 2983 | w: 0.0 2984 | } 2985 | clipping_mode: CLIPPING_MODE_NONE 2986 | clipping_visible: true 2987 | clipping_inverted: false 2988 | alpha: 1.0 2989 | template_node_child: false 2990 | size_mode: SIZE_MODE_MANUAL 2991 | } 2992 | nodes { 2993 | position { 2994 | x: 0.0 2995 | y: 0.0 2996 | z: 0.0 2997 | w: 1.0 2998 | } 2999 | rotation { 3000 | x: 0.0 3001 | y: 0.0 3002 | z: 0.0 3003 | w: 1.0 3004 | } 3005 | scale { 3006 | x: 1.5 3007 | y: 1.5 3008 | z: 1.0 3009 | w: 1.0 3010 | } 3011 | size { 3012 | x: 34.0 3013 | y: 37.0 3014 | z: 0.0 3015 | w: 1.0 3016 | } 3017 | color { 3018 | x: 1.0 3019 | y: 1.0 3020 | z: 1.0 3021 | w: 1.0 3022 | } 3023 | type: TYPE_BOX 3024 | blend_mode: BLEND_MODE_ALPHA 3025 | texture: "icons/mockup_cursorSword_gold" 3026 | id: "i_icon_7" 3027 | xanchor: XANCHOR_NONE 3028 | yanchor: YANCHOR_NONE 3029 | pivot: PIVOT_CENTER 3030 | adjust_mode: ADJUST_MODE_FIT 3031 | parent: "i_slot_7" 3032 | layer: "icons" 3033 | inherit_alpha: true 3034 | slice9 { 3035 | x: 0.0 3036 | y: 0.0 3037 | z: 0.0 3038 | w: 0.0 3039 | } 3040 | clipping_mode: CLIPPING_MODE_NONE 3041 | clipping_visible: true 3042 | clipping_inverted: false 3043 | alpha: 0.0 3044 | template_node_child: false 3045 | size_mode: SIZE_MODE_AUTO 3046 | } 3047 | nodes { 3048 | position { 3049 | x: 188.04 3050 | y: -39.558 3051 | z: 0.0 3052 | w: 1.0 3053 | } 3054 | rotation { 3055 | x: 0.0 3056 | y: 0.0 3057 | z: 0.0 3058 | w: 1.0 3059 | } 3060 | scale { 3061 | x: 1.0 3062 | y: 1.0 3063 | z: 1.0 3064 | w: 1.0 3065 | } 3066 | size { 3067 | x: 69.0 3068 | y: 67.0 3069 | z: 0.0 3070 | w: 1.0 3071 | } 3072 | color { 3073 | x: 1.0 3074 | y: 1.0 3075 | z: 1.0 3076 | w: 1.0 3077 | } 3078 | type: TYPE_BOX 3079 | blend_mode: BLEND_MODE_ALPHA 3080 | texture: "gui/mockup_panelInset_blue" 3081 | id: "i_slot_10" 3082 | xanchor: XANCHOR_NONE 3083 | yanchor: YANCHOR_NONE 3084 | pivot: PIVOT_CENTER 3085 | adjust_mode: ADJUST_MODE_FIT 3086 | parent: "items_list" 3087 | layer: "gui" 3088 | inherit_alpha: true 3089 | slice9 { 3090 | x: 0.0 3091 | y: 0.0 3092 | z: 0.0 3093 | w: 0.0 3094 | } 3095 | clipping_mode: CLIPPING_MODE_NONE 3096 | clipping_visible: true 3097 | clipping_inverted: false 3098 | alpha: 1.0 3099 | template_node_child: false 3100 | size_mode: SIZE_MODE_MANUAL 3101 | } 3102 | nodes { 3103 | position { 3104 | x: 0.0 3105 | y: 0.0 3106 | z: 0.0 3107 | w: 1.0 3108 | } 3109 | rotation { 3110 | x: 0.0 3111 | y: 0.0 3112 | z: 0.0 3113 | w: 1.0 3114 | } 3115 | scale { 3116 | x: 1.5 3117 | y: 1.5 3118 | z: 1.0 3119 | w: 1.0 3120 | } 3121 | size { 3122 | x: 34.0 3123 | y: 37.0 3124 | z: 0.0 3125 | w: 1.0 3126 | } 3127 | color { 3128 | x: 1.0 3129 | y: 1.0 3130 | z: 1.0 3131 | w: 1.0 3132 | } 3133 | type: TYPE_BOX 3134 | blend_mode: BLEND_MODE_ALPHA 3135 | texture: "icons/mockup_cursorSword_gold" 3136 | id: "i_icon_10" 3137 | xanchor: XANCHOR_NONE 3138 | yanchor: YANCHOR_NONE 3139 | pivot: PIVOT_CENTER 3140 | adjust_mode: ADJUST_MODE_FIT 3141 | parent: "i_slot_10" 3142 | layer: "icons" 3143 | inherit_alpha: true 3144 | slice9 { 3145 | x: 0.0 3146 | y: 0.0 3147 | z: 0.0 3148 | w: 0.0 3149 | } 3150 | clipping_mode: CLIPPING_MODE_NONE 3151 | clipping_visible: true 3152 | clipping_inverted: false 3153 | alpha: 0.0 3154 | template_node_child: false 3155 | size_mode: SIZE_MODE_AUTO 3156 | } 3157 | nodes { 3158 | position { 3159 | x: 188.04 3160 | y: 38.881 3161 | z: 0.0 3162 | w: 1.0 3163 | } 3164 | rotation { 3165 | x: 0.0 3166 | y: 0.0 3167 | z: 0.0 3168 | w: 1.0 3169 | } 3170 | scale { 3171 | x: 1.0 3172 | y: 1.0 3173 | z: 1.0 3174 | w: 1.0 3175 | } 3176 | size { 3177 | x: 69.0 3178 | y: 67.0 3179 | z: 0.0 3180 | w: 1.0 3181 | } 3182 | color { 3183 | x: 1.0 3184 | y: 1.0 3185 | z: 1.0 3186 | w: 1.0 3187 | } 3188 | type: TYPE_BOX 3189 | blend_mode: BLEND_MODE_ALPHA 3190 | texture: "gui/mockup_panelInset_blue" 3191 | id: "i_slot_11" 3192 | xanchor: XANCHOR_NONE 3193 | yanchor: YANCHOR_NONE 3194 | pivot: PIVOT_CENTER 3195 | adjust_mode: ADJUST_MODE_FIT 3196 | parent: "items_list" 3197 | layer: "gui" 3198 | inherit_alpha: true 3199 | slice9 { 3200 | x: 0.0 3201 | y: 0.0 3202 | z: 0.0 3203 | w: 0.0 3204 | } 3205 | clipping_mode: CLIPPING_MODE_NONE 3206 | clipping_visible: true 3207 | clipping_inverted: false 3208 | alpha: 1.0 3209 | template_node_child: false 3210 | size_mode: SIZE_MODE_MANUAL 3211 | } 3212 | nodes { 3213 | position { 3214 | x: 0.0 3215 | y: 0.0 3216 | z: 0.0 3217 | w: 1.0 3218 | } 3219 | rotation { 3220 | x: 0.0 3221 | y: 0.0 3222 | z: 0.0 3223 | w: 1.0 3224 | } 3225 | scale { 3226 | x: 1.5 3227 | y: 1.5 3228 | z: 1.0 3229 | w: 1.0 3230 | } 3231 | size { 3232 | x: 34.0 3233 | y: 37.0 3234 | z: 0.0 3235 | w: 1.0 3236 | } 3237 | color { 3238 | x: 1.0 3239 | y: 1.0 3240 | z: 1.0 3241 | w: 1.0 3242 | } 3243 | type: TYPE_BOX 3244 | blend_mode: BLEND_MODE_ALPHA 3245 | texture: "icons/mockup_cursorSword_gold" 3246 | id: "i_icon_11" 3247 | xanchor: XANCHOR_NONE 3248 | yanchor: YANCHOR_NONE 3249 | pivot: PIVOT_CENTER 3250 | adjust_mode: ADJUST_MODE_FIT 3251 | parent: "i_slot_11" 3252 | layer: "icons" 3253 | inherit_alpha: true 3254 | slice9 { 3255 | x: 0.0 3256 | y: 0.0 3257 | z: 0.0 3258 | w: 0.0 3259 | } 3260 | clipping_mode: CLIPPING_MODE_NONE 3261 | clipping_visible: true 3262 | clipping_inverted: false 3263 | alpha: 0.0 3264 | template_node_child: false 3265 | size_mode: SIZE_MODE_AUTO 3266 | } 3267 | nodes { 3268 | position { 3269 | x: 268.04 3270 | y: -39.558 3271 | z: 0.0 3272 | w: 1.0 3273 | } 3274 | rotation { 3275 | x: 0.0 3276 | y: 0.0 3277 | z: 0.0 3278 | w: 1.0 3279 | } 3280 | scale { 3281 | x: 1.0 3282 | y: 1.0 3283 | z: 1.0 3284 | w: 1.0 3285 | } 3286 | size { 3287 | x: 69.0 3288 | y: 67.0 3289 | z: 0.0 3290 | w: 1.0 3291 | } 3292 | color { 3293 | x: 1.0 3294 | y: 1.0 3295 | z: 1.0 3296 | w: 1.0 3297 | } 3298 | type: TYPE_BOX 3299 | blend_mode: BLEND_MODE_ALPHA 3300 | texture: "gui/mockup_panelInset_blue" 3301 | id: "i_slot_8" 3302 | xanchor: XANCHOR_NONE 3303 | yanchor: YANCHOR_NONE 3304 | pivot: PIVOT_CENTER 3305 | adjust_mode: ADJUST_MODE_FIT 3306 | parent: "items_list" 3307 | layer: "gui" 3308 | inherit_alpha: true 3309 | slice9 { 3310 | x: 0.0 3311 | y: 0.0 3312 | z: 0.0 3313 | w: 0.0 3314 | } 3315 | clipping_mode: CLIPPING_MODE_NONE 3316 | clipping_visible: true 3317 | clipping_inverted: false 3318 | alpha: 1.0 3319 | template_node_child: false 3320 | size_mode: SIZE_MODE_MANUAL 3321 | } 3322 | nodes { 3323 | position { 3324 | x: 0.0 3325 | y: 0.0 3326 | z: 0.0 3327 | w: 1.0 3328 | } 3329 | rotation { 3330 | x: 0.0 3331 | y: 0.0 3332 | z: 0.0 3333 | w: 1.0 3334 | } 3335 | scale { 3336 | x: 1.5 3337 | y: 1.5 3338 | z: 1.0 3339 | w: 1.0 3340 | } 3341 | size { 3342 | x: 34.0 3343 | y: 37.0 3344 | z: 0.0 3345 | w: 1.0 3346 | } 3347 | color { 3348 | x: 1.0 3349 | y: 1.0 3350 | z: 1.0 3351 | w: 1.0 3352 | } 3353 | type: TYPE_BOX 3354 | blend_mode: BLEND_MODE_ALPHA 3355 | texture: "icons/mockup_cursorSword_gold" 3356 | id: "i_icon_8" 3357 | xanchor: XANCHOR_NONE 3358 | yanchor: YANCHOR_NONE 3359 | pivot: PIVOT_CENTER 3360 | adjust_mode: ADJUST_MODE_FIT 3361 | parent: "i_slot_8" 3362 | layer: "icons" 3363 | inherit_alpha: true 3364 | slice9 { 3365 | x: 0.0 3366 | y: 0.0 3367 | z: 0.0 3368 | w: 0.0 3369 | } 3370 | clipping_mode: CLIPPING_MODE_NONE 3371 | clipping_visible: true 3372 | clipping_inverted: false 3373 | alpha: 0.0 3374 | template_node_child: false 3375 | size_mode: SIZE_MODE_AUTO 3376 | } 3377 | nodes { 3378 | position { 3379 | x: 268.04 3380 | y: 38.881 3381 | z: 0.0 3382 | w: 1.0 3383 | } 3384 | rotation { 3385 | x: 0.0 3386 | y: 0.0 3387 | z: 0.0 3388 | w: 1.0 3389 | } 3390 | scale { 3391 | x: 1.0 3392 | y: 1.0 3393 | z: 1.0 3394 | w: 1.0 3395 | } 3396 | size { 3397 | x: 69.0 3398 | y: 67.0 3399 | z: 0.0 3400 | w: 1.0 3401 | } 3402 | color { 3403 | x: 1.0 3404 | y: 1.0 3405 | z: 1.0 3406 | w: 1.0 3407 | } 3408 | type: TYPE_BOX 3409 | blend_mode: BLEND_MODE_ALPHA 3410 | texture: "gui/mockup_panelInset_blue" 3411 | id: "i_slot_9" 3412 | xanchor: XANCHOR_NONE 3413 | yanchor: YANCHOR_NONE 3414 | pivot: PIVOT_CENTER 3415 | adjust_mode: ADJUST_MODE_FIT 3416 | parent: "items_list" 3417 | layer: "gui" 3418 | inherit_alpha: true 3419 | slice9 { 3420 | x: 0.0 3421 | y: 0.0 3422 | z: 0.0 3423 | w: 0.0 3424 | } 3425 | clipping_mode: CLIPPING_MODE_NONE 3426 | clipping_visible: true 3427 | clipping_inverted: false 3428 | alpha: 1.0 3429 | template_node_child: false 3430 | size_mode: SIZE_MODE_MANUAL 3431 | } 3432 | nodes { 3433 | position { 3434 | x: 0.0 3435 | y: 0.0 3436 | z: 0.0 3437 | w: 1.0 3438 | } 3439 | rotation { 3440 | x: 0.0 3441 | y: 0.0 3442 | z: 0.0 3443 | w: 1.0 3444 | } 3445 | scale { 3446 | x: 1.5 3447 | y: 1.5 3448 | z: 1.0 3449 | w: 1.0 3450 | } 3451 | size { 3452 | x: 34.0 3453 | y: 37.0 3454 | z: 0.0 3455 | w: 1.0 3456 | } 3457 | color { 3458 | x: 1.0 3459 | y: 1.0 3460 | z: 1.0 3461 | w: 1.0 3462 | } 3463 | type: TYPE_BOX 3464 | blend_mode: BLEND_MODE_ALPHA 3465 | texture: "icons/mockup_cursorSword_gold" 3466 | id: "i_icon_9" 3467 | xanchor: XANCHOR_NONE 3468 | yanchor: YANCHOR_NONE 3469 | pivot: PIVOT_CENTER 3470 | adjust_mode: ADJUST_MODE_FIT 3471 | parent: "i_slot_9" 3472 | layer: "icons" 3473 | inherit_alpha: true 3474 | slice9 { 3475 | x: 0.0 3476 | y: 0.0 3477 | z: 0.0 3478 | w: 0.0 3479 | } 3480 | clipping_mode: CLIPPING_MODE_NONE 3481 | clipping_visible: true 3482 | clipping_inverted: false 3483 | alpha: 0.0 3484 | template_node_child: false 3485 | size_mode: SIZE_MODE_AUTO 3486 | } 3487 | nodes { 3488 | position { 3489 | x: -175.388 3490 | y: 117.202 3491 | z: 0.0 3492 | w: 1.0 3493 | } 3494 | rotation { 3495 | x: 0.0 3496 | y: 0.0 3497 | z: 0.0 3498 | w: 1.0 3499 | } 3500 | scale { 3501 | x: 1.0 3502 | y: 1.0 3503 | z: 1.0 3504 | w: 1.0 3505 | } 3506 | size { 3507 | x: 320.0 3508 | y: 240.0 3509 | z: 0.0 3510 | w: 1.0 3511 | } 3512 | color { 3513 | x: 1.0 3514 | y: 1.0 3515 | z: 1.0 3516 | w: 1.0 3517 | } 3518 | type: TYPE_BOX 3519 | blend_mode: BLEND_MODE_ALPHA 3520 | texture: "gui/mockup_panelInset_beige" 3521 | id: "info_box" 3522 | xanchor: XANCHOR_NONE 3523 | yanchor: YANCHOR_NONE 3524 | pivot: PIVOT_CENTER 3525 | adjust_mode: ADJUST_MODE_FIT 3526 | parent: "inv_panel" 3527 | layer: "gui" 3528 | inherit_alpha: true 3529 | slice9 { 3530 | x: 60.0 3531 | y: 25.0 3532 | z: 25.0 3533 | w: 50.0 3534 | } 3535 | clipping_mode: CLIPPING_MODE_NONE 3536 | clipping_visible: true 3537 | clipping_inverted: false 3538 | alpha: 1.0 3539 | template_node_child: false 3540 | size_mode: SIZE_MODE_MANUAL 3541 | } 3542 | nodes { 3543 | position { 3544 | x: 0.0 3545 | y: 84.924 3546 | z: 0.0 3547 | w: 1.0 3548 | } 3549 | rotation { 3550 | x: 0.0 3551 | y: 0.0 3552 | z: 0.0 3553 | w: 1.0 3554 | } 3555 | scale { 3556 | x: 1.0 3557 | y: 1.0 3558 | z: 1.0 3559 | w: 1.0 3560 | } 3561 | size { 3562 | x: 200.0 3563 | y: 100.0 3564 | z: 0.0 3565 | w: 1.0 3566 | } 3567 | color { 3568 | x: 1.0 3569 | y: 1.0 3570 | z: 1.0 3571 | w: 1.0 3572 | } 3573 | type: TYPE_TEXT 3574 | blend_mode: BLEND_MODE_ALPHA 3575 | text: "_____________" 3576 | font: "larryfont" 3577 | id: "seperator" 3578 | xanchor: XANCHOR_NONE 3579 | yanchor: YANCHOR_NONE 3580 | pivot: PIVOT_CENTER 3581 | outline { 3582 | x: 1.0 3583 | y: 1.0 3584 | z: 1.0 3585 | w: 1.0 3586 | } 3587 | shadow { 3588 | x: 1.0 3589 | y: 1.0 3590 | z: 1.0 3591 | w: 1.0 3592 | } 3593 | adjust_mode: ADJUST_MODE_FIT 3594 | line_break: false 3595 | parent: "info_box" 3596 | layer: "larryfont" 3597 | inherit_alpha: true 3598 | alpha: 1.0 3599 | outline_alpha: 1.0 3600 | shadow_alpha: 1.0 3601 | template_node_child: false 3602 | text_leading: 1.0 3603 | text_tracking: 0.0 3604 | } 3605 | nodes { 3606 | position { 3607 | x: -125.015 3608 | y: 84.924 3609 | z: 0.0 3610 | w: 1.0 3611 | } 3612 | rotation { 3613 | x: 0.0 3614 | y: 0.0 3615 | z: 0.0 3616 | w: 1.0 3617 | } 3618 | scale { 3619 | x: 1.0 3620 | y: 1.0 3621 | z: 1.0 3622 | w: 1.0 3623 | } 3624 | size { 3625 | x: 200.0 3626 | y: 100.0 3627 | z: 0.0 3628 | w: 1.0 3629 | } 3630 | color { 3631 | x: 1.0 3632 | y: 1.0 3633 | z: 1.0 3634 | w: 1.0 3635 | } 3636 | type: TYPE_TEXT 3637 | blend_mode: BLEND_MODE_ALPHA 3638 | text: "Sword" 3639 | font: "larryfont" 3640 | id: "info_title" 3641 | xanchor: XANCHOR_NONE 3642 | yanchor: YANCHOR_NONE 3643 | pivot: PIVOT_W 3644 | outline { 3645 | x: 1.0 3646 | y: 1.0 3647 | z: 1.0 3648 | w: 1.0 3649 | } 3650 | shadow { 3651 | x: 1.0 3652 | y: 1.0 3653 | z: 1.0 3654 | w: 1.0 3655 | } 3656 | adjust_mode: ADJUST_MODE_FIT 3657 | line_break: false 3658 | parent: "info_box" 3659 | layer: "larryfont" 3660 | inherit_alpha: true 3661 | alpha: 1.0 3662 | outline_alpha: 1.0 3663 | shadow_alpha: 1.0 3664 | template_node_child: false 3665 | text_leading: 1.0 3666 | text_tracking: 0.0 3667 | } 3668 | nodes { 3669 | position { 3670 | x: -141.833 3671 | y: 57.506 3672 | z: 0.0 3673 | w: 1.0 3674 | } 3675 | rotation { 3676 | x: 0.0 3677 | y: 0.0 3678 | z: 0.0 3679 | w: 1.0 3680 | } 3681 | scale { 3682 | x: 0.5 3683 | y: 0.5 3684 | z: 1.0 3685 | w: 1.0 3686 | } 3687 | size { 3688 | x: 600.0 3689 | y: 100.0 3690 | z: 0.0 3691 | w: 1.0 3692 | } 3693 | color { 3694 | x: 1.0 3695 | y: 1.0 3696 | z: 1.0 3697 | w: 1.0 3698 | } 3699 | type: TYPE_TEXT 3700 | blend_mode: BLEND_MODE_ALPHA 3701 | text: "This sword is the legendary sword once it belonged to Nicodemus, The Lord of Keep Rend. Who took it of the the dead body of Bonebreaker Dorokor." 3702 | font: "vera" 3703 | id: "text" 3704 | xanchor: XANCHOR_NONE 3705 | yanchor: YANCHOR_NONE 3706 | pivot: PIVOT_NW 3707 | outline { 3708 | x: 1.0 3709 | y: 1.0 3710 | z: 1.0 3711 | w: 1.0 3712 | } 3713 | shadow { 3714 | x: 1.0 3715 | y: 1.0 3716 | z: 1.0 3717 | w: 1.0 3718 | } 3719 | adjust_mode: ADJUST_MODE_FIT 3720 | line_break: true 3721 | parent: "info_box" 3722 | layer: "vera" 3723 | inherit_alpha: true 3724 | alpha: 1.0 3725 | outline_alpha: 1.0 3726 | shadow_alpha: 1.0 3727 | template_node_child: false 3728 | text_leading: 1.15 3729 | text_tracking: 0.0 3730 | } 3731 | nodes { 3732 | position { 3733 | x: -122.79 3734 | y: -236.435 3735 | z: 0.0 3736 | w: 1.0 3737 | } 3738 | rotation { 3739 | x: 0.0 3740 | y: 0.0 3741 | z: 0.0 3742 | w: 1.0 3743 | } 3744 | scale { 3745 | x: 1.0 3746 | y: 1.0 3747 | z: 1.0 3748 | w: 1.0 3749 | } 3750 | size { 3751 | x: 250.0 3752 | y: 18.0 3753 | z: 0.0 3754 | w: 1.0 3755 | } 3756 | color { 3757 | x: 1.0 3758 | y: 1.0 3759 | z: 1.0 3760 | w: 1.0 3761 | } 3762 | type: TYPE_BOX 3763 | blend_mode: BLEND_MODE_ALPHA 3764 | texture: "gui/mockup_barBack" 3765 | id: "weapon_speed_bg" 3766 | xanchor: XANCHOR_NONE 3767 | yanchor: YANCHOR_NONE 3768 | pivot: PIVOT_W 3769 | adjust_mode: ADJUST_MODE_FIT 3770 | parent: "info_box" 3771 | layer: "gui" 3772 | inherit_alpha: true 3773 | slice9 { 3774 | x: 9.0 3775 | y: 0.0 3776 | z: 9.0 3777 | w: 0.0 3778 | } 3779 | clipping_mode: CLIPPING_MODE_NONE 3780 | clipping_visible: true 3781 | clipping_inverted: false 3782 | alpha: 1.0 3783 | template_node_child: false 3784 | size_mode: SIZE_MODE_MANUAL 3785 | } 3786 | nodes { 3787 | position { 3788 | x: 0.0 3789 | y: 16.049 3790 | z: 0.0 3791 | w: 1.0 3792 | } 3793 | rotation { 3794 | x: 0.0 3795 | y: 0.0 3796 | z: 0.0 3797 | w: 1.0 3798 | } 3799 | scale { 3800 | x: 0.4 3801 | y: 0.4 3802 | z: 1.0 3803 | w: 1.0 3804 | } 3805 | size { 3806 | x: 200.0 3807 | y: 100.0 3808 | z: 0.0 3809 | w: 1.0 3810 | } 3811 | color { 3812 | x: 1.0 3813 | y: 0.8000001 3814 | z: 0.6 3815 | w: 1.0 3816 | } 3817 | type: TYPE_TEXT 3818 | blend_mode: BLEND_MODE_ALPHA 3819 | text: "Speed" 3820 | font: "vera" 3821 | id: "weapon_speed_desc" 3822 | xanchor: XANCHOR_NONE 3823 | yanchor: YANCHOR_NONE 3824 | pivot: PIVOT_W 3825 | outline { 3826 | x: 1.0 3827 | y: 1.0 3828 | z: 1.0 3829 | w: 1.0 3830 | } 3831 | shadow { 3832 | x: 1.0 3833 | y: 1.0 3834 | z: 1.0 3835 | w: 1.0 3836 | } 3837 | adjust_mode: ADJUST_MODE_FIT 3838 | line_break: false 3839 | parent: "weapon_speed_bg" 3840 | layer: "vera" 3841 | inherit_alpha: true 3842 | alpha: 1.0 3843 | outline_alpha: 1.0 3844 | shadow_alpha: 1.0 3845 | template_node_child: false 3846 | text_leading: 1.0 3847 | text_tracking: 0.0 3848 | } 3849 | nodes { 3850 | position { 3851 | x: 0.0 3852 | y: 0.0 3853 | z: 0.0 3854 | w: 1.0 3855 | } 3856 | rotation { 3857 | x: 0.0 3858 | y: 0.0 3859 | z: 0.0 3860 | w: 1.0 3861 | } 3862 | scale { 3863 | x: 1.0 3864 | y: 1.0 3865 | z: 1.0 3866 | w: 1.0 3867 | } 3868 | size { 3869 | x: 120.0 3870 | y: 18.0 3871 | z: 0.0 3872 | w: 1.0 3873 | } 3874 | color { 3875 | x: 0.8000001 3876 | y: 0.6 3877 | z: 0.8000001 3878 | w: 1.0 3879 | } 3880 | type: TYPE_BOX 3881 | blend_mode: BLEND_MODE_ALPHA 3882 | texture: "gui/mockup_barRed" 3883 | id: "weapon_speed_meter" 3884 | xanchor: XANCHOR_NONE 3885 | yanchor: YANCHOR_NONE 3886 | pivot: PIVOT_W 3887 | adjust_mode: ADJUST_MODE_FIT 3888 | parent: "weapon_speed_bg" 3889 | layer: "gui" 3890 | inherit_alpha: true 3891 | slice9 { 3892 | x: 9.0 3893 | y: 0.0 3894 | z: 9.0 3895 | w: 0.0 3896 | } 3897 | clipping_mode: CLIPPING_MODE_NONE 3898 | clipping_visible: true 3899 | clipping_inverted: false 3900 | alpha: 1.0 3901 | template_node_child: false 3902 | size_mode: SIZE_MODE_MANUAL 3903 | } 3904 | nodes { 3905 | position { 3906 | x: -122.79 3907 | y: -182.575 3908 | z: 0.0 3909 | w: 1.0 3910 | } 3911 | rotation { 3912 | x: 0.0 3913 | y: 0.0 3914 | z: 0.0 3915 | w: 1.0 3916 | } 3917 | scale { 3918 | x: 1.0 3919 | y: 1.0 3920 | z: 1.0 3921 | w: 1.0 3922 | } 3923 | size { 3924 | x: 250.0 3925 | y: 18.0 3926 | z: 0.0 3927 | w: 1.0 3928 | } 3929 | color { 3930 | x: 1.0 3931 | y: 1.0 3932 | z: 1.0 3933 | w: 1.0 3934 | } 3935 | type: TYPE_BOX 3936 | blend_mode: BLEND_MODE_ALPHA 3937 | texture: "gui/mockup_barBack" 3938 | id: "player_hp_bg1" 3939 | xanchor: XANCHOR_NONE 3940 | yanchor: YANCHOR_NONE 3941 | pivot: PIVOT_W 3942 | adjust_mode: ADJUST_MODE_FIT 3943 | parent: "info_box" 3944 | layer: "gui" 3945 | inherit_alpha: true 3946 | slice9 { 3947 | x: 9.0 3948 | y: 0.0 3949 | z: 9.0 3950 | w: 0.0 3951 | } 3952 | clipping_mode: CLIPPING_MODE_NONE 3953 | clipping_visible: true 3954 | clipping_inverted: false 3955 | alpha: 1.0 3956 | template_node_child: false 3957 | size_mode: SIZE_MODE_MANUAL 3958 | } 3959 | nodes { 3960 | position { 3961 | x: 0.0 3962 | y: 0.0 3963 | z: 0.0 3964 | w: 1.0 3965 | } 3966 | rotation { 3967 | x: 0.0 3968 | y: 0.0 3969 | z: 0.0 3970 | w: 1.0 3971 | } 3972 | scale { 3973 | x: 1.0 3974 | y: 1.0 3975 | z: 1.0 3976 | w: 1.0 3977 | } 3978 | size { 3979 | x: 240.0 3980 | y: 18.0 3981 | z: 0.0 3982 | w: 1.0 3983 | } 3984 | color { 3985 | x: 0.8000001 3986 | y: 0.6 3987 | z: 0.8000001 3988 | w: 1.0 3989 | } 3990 | type: TYPE_BOX 3991 | blend_mode: BLEND_MODE_ALPHA 3992 | texture: "gui/mockup_barRed" 3993 | id: "weapon_attk_meter" 3994 | xanchor: XANCHOR_NONE 3995 | yanchor: YANCHOR_NONE 3996 | pivot: PIVOT_W 3997 | adjust_mode: ADJUST_MODE_FIT 3998 | parent: "player_hp_bg1" 3999 | layer: "gui" 4000 | inherit_alpha: true 4001 | slice9 { 4002 | x: 9.0 4003 | y: 0.0 4004 | z: 9.0 4005 | w: 0.0 4006 | } 4007 | clipping_mode: CLIPPING_MODE_NONE 4008 | clipping_visible: true 4009 | clipping_inverted: false 4010 | alpha: 1.0 4011 | template_node_child: false 4012 | size_mode: SIZE_MODE_MANUAL 4013 | } 4014 | nodes { 4015 | position { 4016 | x: 0.0 4017 | y: 16.049 4018 | z: 0.0 4019 | w: 1.0 4020 | } 4021 | rotation { 4022 | x: 0.0 4023 | y: 0.0 4024 | z: 0.0 4025 | w: 1.0 4026 | } 4027 | scale { 4028 | x: 0.4 4029 | y: 0.4 4030 | z: 1.0 4031 | w: 1.0 4032 | } 4033 | size { 4034 | x: 200.0 4035 | y: 100.0 4036 | z: 0.0 4037 | w: 1.0 4038 | } 4039 | color { 4040 | x: 1.0 4041 | y: 0.8000001 4042 | z: 0.6 4043 | w: 1.0 4044 | } 4045 | type: TYPE_TEXT 4046 | blend_mode: BLEND_MODE_ALPHA 4047 | text: "Damage" 4048 | font: "vera" 4049 | id: "weapon_attk_desc" 4050 | xanchor: XANCHOR_NONE 4051 | yanchor: YANCHOR_NONE 4052 | pivot: PIVOT_W 4053 | outline { 4054 | x: 1.0 4055 | y: 1.0 4056 | z: 1.0 4057 | w: 1.0 4058 | } 4059 | shadow { 4060 | x: 1.0 4061 | y: 1.0 4062 | z: 1.0 4063 | w: 1.0 4064 | } 4065 | adjust_mode: ADJUST_MODE_FIT 4066 | line_break: false 4067 | parent: "player_hp_bg1" 4068 | layer: "vera" 4069 | inherit_alpha: true 4070 | alpha: 1.0 4071 | outline_alpha: 1.0 4072 | shadow_alpha: 1.0 4073 | template_node_child: false 4074 | text_leading: 1.0 4075 | text_tracking: 0.0 4076 | } 4077 | nodes { 4078 | position { 4079 | x: 322.149 4080 | y: 231.075 4081 | z: 0.0 4082 | w: 1.0 4083 | } 4084 | rotation { 4085 | x: 0.0 4086 | y: 0.0 4087 | z: -90.0 4088 | w: 1.0 4089 | } 4090 | scale { 4091 | x: 1.0 4092 | y: 2.0 4093 | z: 1.0 4094 | w: 1.0 4095 | } 4096 | size { 4097 | x: 22.0 4098 | y: 21.0 4099 | z: 0.0 4100 | w: 1.0 4101 | } 4102 | color { 4103 | x: 1.0 4104 | y: 1.0 4105 | z: 1.0 4106 | w: 1.0 4107 | } 4108 | type: TYPE_BOX 4109 | blend_mode: BLEND_MODE_ALPHA 4110 | texture: "icons/mockup_arrowBeige_right" 4111 | id: "button_minimize" 4112 | xanchor: XANCHOR_NONE 4113 | yanchor: YANCHOR_NONE 4114 | pivot: PIVOT_CENTER 4115 | adjust_mode: ADJUST_MODE_FIT 4116 | parent: "inv_panel" 4117 | layer: "icons" 4118 | inherit_alpha: true 4119 | slice9 { 4120 | x: 0.0 4121 | y: 0.0 4122 | z: 0.0 4123 | w: 0.0 4124 | } 4125 | clipping_mode: CLIPPING_MODE_NONE 4126 | clipping_visible: true 4127 | clipping_inverted: false 4128 | alpha: 1.0 4129 | template_node_child: false 4130 | size_mode: SIZE_MODE_AUTO 4131 | } 4132 | nodes { 4133 | position { 4134 | x: 97.592 4135 | y: 214.83 4136 | z: 0.0 4137 | w: 1.0 4138 | } 4139 | rotation { 4140 | x: 0.0 4141 | y: 0.0 4142 | z: 0.0 4143 | w: 1.0 4144 | } 4145 | scale { 4146 | x: 1.0 4147 | y: 1.0 4148 | z: 1.0 4149 | w: 1.0 4150 | } 4151 | size { 4152 | x: 190.0 4153 | y: 45.0 4154 | z: 0.0 4155 | w: 1.0 4156 | } 4157 | color { 4158 | x: 1.0 4159 | y: 1.0 4160 | z: 1.0 4161 | w: 1.0 4162 | } 4163 | type: TYPE_BOX 4164 | blend_mode: BLEND_MODE_ALPHA 4165 | texture: "gui/mockup_buttonLong_beige_pressed" 4166 | id: "weapon_title_box" 4167 | xanchor: XANCHOR_NONE 4168 | yanchor: YANCHOR_NONE 4169 | pivot: PIVOT_CENTER 4170 | adjust_mode: ADJUST_MODE_FIT 4171 | parent: "inv_panel" 4172 | layer: "gui" 4173 | inherit_alpha: true 4174 | slice9 { 4175 | x: 0.0 4176 | y: 0.0 4177 | z: 0.0 4178 | w: 0.0 4179 | } 4180 | clipping_mode: CLIPPING_MODE_NONE 4181 | clipping_visible: true 4182 | clipping_inverted: false 4183 | alpha: 1.0 4184 | template_node_child: false 4185 | size_mode: SIZE_MODE_AUTO 4186 | } 4187 | nodes { 4188 | position { 4189 | x: 0.0 4190 | y: 0.0 4191 | z: 0.0 4192 | w: 1.0 4193 | } 4194 | rotation { 4195 | x: 0.0 4196 | y: 0.0 4197 | z: 0.0 4198 | w: 1.0 4199 | } 4200 | scale { 4201 | x: 1.0 4202 | y: 1.0 4203 | z: 1.0 4204 | w: 1.0 4205 | } 4206 | size { 4207 | x: 200.0 4208 | y: 100.0 4209 | z: 0.0 4210 | w: 1.0 4211 | } 4212 | color { 4213 | x: 1.0 4214 | y: 1.0 4215 | z: 1.0 4216 | w: 1.0 4217 | } 4218 | type: TYPE_TEXT 4219 | blend_mode: BLEND_MODE_ALPHA 4220 | text: "Weapons" 4221 | font: "vera" 4222 | id: "weapon_desc" 4223 | xanchor: XANCHOR_NONE 4224 | yanchor: YANCHOR_NONE 4225 | pivot: PIVOT_CENTER 4226 | outline { 4227 | x: 1.0 4228 | y: 1.0 4229 | z: 1.0 4230 | w: 1.0 4231 | } 4232 | shadow { 4233 | x: 1.0 4234 | y: 1.0 4235 | z: 1.0 4236 | w: 1.0 4237 | } 4238 | adjust_mode: ADJUST_MODE_FIT 4239 | line_break: false 4240 | parent: "weapon_title_box" 4241 | layer: "vera" 4242 | inherit_alpha: true 4243 | alpha: 1.0 4244 | outline_alpha: 1.0 4245 | shadow_alpha: 1.0 4246 | template_node_child: false 4247 | text_leading: 1.0 4248 | text_tracking: 0.0 4249 | } 4250 | nodes { 4251 | position { 4252 | x: 95.879 4253 | y: -29.17 4254 | z: 0.0 4255 | w: 1.0 4256 | } 4257 | rotation { 4258 | x: 0.0 4259 | y: 0.0 4260 | z: 0.0 4261 | w: 1.0 4262 | } 4263 | scale { 4264 | x: 1.0 4265 | y: 1.0 4266 | z: 1.0 4267 | w: 1.0 4268 | } 4269 | size { 4270 | x: 190.0 4271 | y: 45.0 4272 | z: 0.0 4273 | w: 1.0 4274 | } 4275 | color { 4276 | x: 1.0 4277 | y: 1.0 4278 | z: 1.0 4279 | w: 1.0 4280 | } 4281 | type: TYPE_BOX 4282 | blend_mode: BLEND_MODE_ALPHA 4283 | texture: "gui/mockup_buttonLong_beige_pressed" 4284 | id: "items_title_box" 4285 | xanchor: XANCHOR_NONE 4286 | yanchor: YANCHOR_NONE 4287 | pivot: PIVOT_CENTER 4288 | adjust_mode: ADJUST_MODE_FIT 4289 | parent: "inv_panel" 4290 | layer: "gui" 4291 | inherit_alpha: true 4292 | slice9 { 4293 | x: 0.0 4294 | y: 0.0 4295 | z: 0.0 4296 | w: 0.0 4297 | } 4298 | clipping_mode: CLIPPING_MODE_NONE 4299 | clipping_visible: true 4300 | clipping_inverted: false 4301 | alpha: 1.0 4302 | template_node_child: false 4303 | size_mode: SIZE_MODE_AUTO 4304 | } 4305 | nodes { 4306 | position { 4307 | x: 0.0 4308 | y: 0.0 4309 | z: 0.0 4310 | w: 1.0 4311 | } 4312 | rotation { 4313 | x: 0.0 4314 | y: 0.0 4315 | z: 0.0 4316 | w: 1.0 4317 | } 4318 | scale { 4319 | x: 1.0 4320 | y: 1.0 4321 | z: 1.0 4322 | w: 1.0 4323 | } 4324 | size { 4325 | x: 200.0 4326 | y: 100.0 4327 | z: 0.0 4328 | w: 1.0 4329 | } 4330 | color { 4331 | x: 1.0 4332 | y: 1.0 4333 | z: 1.0 4334 | w: 1.0 4335 | } 4336 | type: TYPE_TEXT 4337 | blend_mode: BLEND_MODE_ALPHA 4338 | text: "Items" 4339 | font: "vera" 4340 | id: "item_desc" 4341 | xanchor: XANCHOR_NONE 4342 | yanchor: YANCHOR_NONE 4343 | pivot: PIVOT_CENTER 4344 | outline { 4345 | x: 1.0 4346 | y: 1.0 4347 | z: 1.0 4348 | w: 1.0 4349 | } 4350 | shadow { 4351 | x: 1.0 4352 | y: 1.0 4353 | z: 1.0 4354 | w: 1.0 4355 | } 4356 | adjust_mode: ADJUST_MODE_FIT 4357 | line_break: false 4358 | parent: "items_title_box" 4359 | layer: "vera" 4360 | inherit_alpha: true 4361 | alpha: 1.0 4362 | outline_alpha: 1.0 4363 | shadow_alpha: 1.0 4364 | template_node_child: false 4365 | text_leading: 1.0 4366 | text_tracking: 0.0 4367 | } 4368 | nodes { 4369 | position { 4370 | x: 529.0 4371 | y: 356.0 4372 | z: 0.0 4373 | w: 1.0 4374 | } 4375 | rotation { 4376 | x: 0.0 4377 | y: 0.0 4378 | z: 0.0 4379 | w: 1.0 4380 | } 4381 | scale { 4382 | x: 1.0 4383 | y: 1.0 4384 | z: 1.0 4385 | w: 1.0 4386 | } 4387 | size { 4388 | x: 200.0 4389 | y: 100.0 4390 | z: 0.0 4391 | w: 1.0 4392 | } 4393 | color { 4394 | x: 1.0 4395 | y: 1.0 4396 | z: 1.0 4397 | w: 1.0 4398 | } 4399 | type: TYPE_TEMPLATE 4400 | id: "template" 4401 | layer: "empty" 4402 | inherit_alpha: true 4403 | alpha: 1.0 4404 | template: "/main/list.gui" 4405 | template_node_child: false 4406 | } 4407 | nodes { 4408 | position { 4409 | x: 0.0 4410 | y: 0.0 4411 | z: 0.0 4412 | w: 1.0 4413 | } 4414 | rotation { 4415 | x: 0.0 4416 | y: 0.0 4417 | z: 0.0 4418 | w: 1.0 4419 | } 4420 | scale { 4421 | x: 1.0 4422 | y: 1.0 4423 | z: 1.0 4424 | w: 1.0 4425 | } 4426 | size { 4427 | x: 340.0 4428 | y: 180.0 4429 | z: 0.0 4430 | w: 1.0 4431 | } 4432 | color { 4433 | x: 1.0 4434 | y: 1.0 4435 | z: 1.0 4436 | w: 1.0 4437 | } 4438 | type: TYPE_BOX 4439 | blend_mode: BLEND_MODE_ALPHA 4440 | texture: "gui/mockup_panelInset_beige" 4441 | id: "template/stencil" 4442 | xanchor: XANCHOR_NONE 4443 | yanchor: YANCHOR_NONE 4444 | pivot: PIVOT_CENTER 4445 | adjust_mode: ADJUST_MODE_FIT 4446 | parent: "template" 4447 | layer: "gui" 4448 | inherit_alpha: true 4449 | slice9 { 4450 | x: 25.0 4451 | y: 25.0 4452 | z: 25.0 4453 | w: 50.0 4454 | } 4455 | clipping_mode: CLIPPING_MODE_STENCIL 4456 | clipping_visible: true 4457 | clipping_inverted: false 4458 | alpha: 1.0 4459 | overridden_fields: 20 4460 | template_node_child: true 4461 | size_mode: SIZE_MODE_MANUAL 4462 | } 4463 | nodes { 4464 | position { 4465 | x: 0.0 4466 | y: 0.0 4467 | z: 0.0 4468 | w: 1.0 4469 | } 4470 | rotation { 4471 | x: 0.0 4472 | y: 0.0 4473 | z: 0.0 4474 | w: 1.0 4475 | } 4476 | scale { 4477 | x: 1.0 4478 | y: 1.0 4479 | z: 1.0 4480 | w: 1.0 4481 | } 4482 | size { 4483 | x: 0.0 4484 | y: 0.0 4485 | z: 0.0 4486 | w: 1.0 4487 | } 4488 | color { 4489 | x: 1.0 4490 | y: 1.0 4491 | z: 1.0 4492 | w: 1.0 4493 | } 4494 | type: TYPE_BOX 4495 | blend_mode: BLEND_MODE_ALPHA 4496 | texture: "gui/mockup_barYellow" 4497 | id: "template/list" 4498 | xanchor: XANCHOR_NONE 4499 | yanchor: YANCHOR_NONE 4500 | pivot: PIVOT_CENTER 4501 | adjust_mode: ADJUST_MODE_FIT 4502 | parent: "template/stencil" 4503 | layer: "gui" 4504 | inherit_alpha: true 4505 | slice9 { 4506 | x: 0.0 4507 | y: 0.0 4508 | z: 0.0 4509 | w: 0.0 4510 | } 4511 | clipping_mode: CLIPPING_MODE_NONE 4512 | clipping_visible: true 4513 | clipping_inverted: false 4514 | alpha: 1.0 4515 | template_node_child: true 4516 | size_mode: SIZE_MODE_MANUAL 4517 | } 4518 | nodes { 4519 | position { 4520 | x: -125.0 4521 | y: 45.0 4522 | z: 0.0 4523 | w: 1.0 4524 | } 4525 | rotation { 4526 | x: 0.0 4527 | y: 0.0 4528 | z: 0.0 4529 | w: 1.0 4530 | } 4531 | scale { 4532 | x: 1.0 4533 | y: 1.0 4534 | z: 1.0 4535 | w: 1.0 4536 | } 4537 | size { 4538 | x: 69.0 4539 | y: 67.0 4540 | z: 0.0 4541 | w: 1.0 4542 | } 4543 | color { 4544 | x: 0.6 4545 | y: 0.6 4546 | z: 0.6 4547 | w: 1.0 4548 | } 4549 | type: TYPE_BOX 4550 | blend_mode: BLEND_MODE_ALPHA 4551 | texture: "gui/mockup_panelInset_blue" 4552 | id: "template/w_slot_1" 4553 | xanchor: XANCHOR_NONE 4554 | yanchor: YANCHOR_NONE 4555 | pivot: PIVOT_CENTER 4556 | adjust_mode: ADJUST_MODE_FIT 4557 | parent: "template/list" 4558 | layer: "gui" 4559 | inherit_alpha: true 4560 | slice9 { 4561 | x: 0.0 4562 | y: 0.0 4563 | z: 0.0 4564 | w: 0.0 4565 | } 4566 | clipping_mode: CLIPPING_MODE_NONE 4567 | clipping_visible: true 4568 | clipping_inverted: false 4569 | alpha: 1.0 4570 | template_node_child: true 4571 | size_mode: SIZE_MODE_MANUAL 4572 | } 4573 | nodes { 4574 | position { 4575 | x: 0.0 4576 | y: 0.0 4577 | z: 0.0 4578 | w: 1.0 4579 | } 4580 | rotation { 4581 | x: 0.0 4582 | y: 0.0 4583 | z: 0.0 4584 | w: 1.0 4585 | } 4586 | scale { 4587 | x: 1.5 4588 | y: 1.5 4589 | z: 1.0 4590 | w: 1.0 4591 | } 4592 | size { 4593 | x: 34.0 4594 | y: 37.0 4595 | z: 0.0 4596 | w: 1.0 4597 | } 4598 | color { 4599 | x: 1.0 4600 | y: 1.0 4601 | z: 1.0 4602 | w: 1.0 4603 | } 4604 | type: TYPE_BOX 4605 | blend_mode: BLEND_MODE_ALPHA 4606 | texture: "icons/mockup_cursorSword_gold" 4607 | id: "template/w_icon_1" 4608 | xanchor: XANCHOR_NONE 4609 | yanchor: YANCHOR_NONE 4610 | pivot: PIVOT_CENTER 4611 | adjust_mode: ADJUST_MODE_FIT 4612 | parent: "template/w_slot_1" 4613 | layer: "icons" 4614 | inherit_alpha: true 4615 | slice9 { 4616 | x: 0.0 4617 | y: 0.0 4618 | z: 0.0 4619 | w: 0.0 4620 | } 4621 | clipping_mode: CLIPPING_MODE_NONE 4622 | clipping_visible: true 4623 | clipping_inverted: false 4624 | alpha: 1.0 4625 | template_node_child: true 4626 | size_mode: SIZE_MODE_AUTO 4627 | } 4628 | nodes { 4629 | position { 4630 | x: -45.0 4631 | y: 45.0 4632 | z: 0.0 4633 | w: 1.0 4634 | } 4635 | rotation { 4636 | x: 0.0 4637 | y: 0.0 4638 | z: 0.0 4639 | w: 1.0 4640 | } 4641 | scale { 4642 | x: 1.0 4643 | y: 1.0 4644 | z: 1.0 4645 | w: 1.0 4646 | } 4647 | size { 4648 | x: 69.0 4649 | y: 67.0 4650 | z: 0.0 4651 | w: 1.0 4652 | } 4653 | color { 4654 | x: 1.0 4655 | y: 1.0 4656 | z: 1.0 4657 | w: 1.0 4658 | } 4659 | type: TYPE_BOX 4660 | blend_mode: BLEND_MODE_ALPHA 4661 | texture: "gui/mockup_panelInset_blue" 4662 | id: "template/w_slot_2" 4663 | xanchor: XANCHOR_NONE 4664 | yanchor: YANCHOR_NONE 4665 | pivot: PIVOT_CENTER 4666 | adjust_mode: ADJUST_MODE_FIT 4667 | parent: "template/list" 4668 | layer: "gui" 4669 | inherit_alpha: true 4670 | slice9 { 4671 | x: 0.0 4672 | y: 0.0 4673 | z: 0.0 4674 | w: 0.0 4675 | } 4676 | clipping_mode: CLIPPING_MODE_NONE 4677 | clipping_visible: true 4678 | clipping_inverted: false 4679 | alpha: 1.0 4680 | template_node_child: true 4681 | size_mode: SIZE_MODE_MANUAL 4682 | } 4683 | nodes { 4684 | position { 4685 | x: 0.0 4686 | y: 0.0 4687 | z: 0.0 4688 | w: 1.0 4689 | } 4690 | rotation { 4691 | x: 0.0 4692 | y: 0.0 4693 | z: 0.0 4694 | w: 1.0 4695 | } 4696 | scale { 4697 | x: 1.5 4698 | y: 1.5 4699 | z: 1.0 4700 | w: 1.0 4701 | } 4702 | size { 4703 | x: 34.0 4704 | y: 37.0 4705 | z: 0.0 4706 | w: 1.0 4707 | } 4708 | color { 4709 | x: 1.0 4710 | y: 1.0 4711 | z: 1.0 4712 | w: 1.0 4713 | } 4714 | type: TYPE_BOX 4715 | blend_mode: BLEND_MODE_ALPHA 4716 | texture: "icons/mockup_cursorSword_gold" 4717 | id: "template/w_icon_2" 4718 | xanchor: XANCHOR_NONE 4719 | yanchor: YANCHOR_NONE 4720 | pivot: PIVOT_CENTER 4721 | adjust_mode: ADJUST_MODE_FIT 4722 | parent: "template/w_slot_2" 4723 | layer: "icons" 4724 | inherit_alpha: true 4725 | slice9 { 4726 | x: 0.0 4727 | y: 0.0 4728 | z: 0.0 4729 | w: 0.0 4730 | } 4731 | clipping_mode: CLIPPING_MODE_NONE 4732 | clipping_visible: true 4733 | clipping_inverted: false 4734 | alpha: 0.0 4735 | template_node_child: true 4736 | size_mode: SIZE_MODE_AUTO 4737 | } 4738 | nodes { 4739 | position { 4740 | x: 37.0 4741 | y: 45.0 4742 | z: 0.0 4743 | w: 1.0 4744 | } 4745 | rotation { 4746 | x: 0.0 4747 | y: 0.0 4748 | z: 0.0 4749 | w: 1.0 4750 | } 4751 | scale { 4752 | x: 1.0 4753 | y: 1.0 4754 | z: 1.0 4755 | w: 1.0 4756 | } 4757 | size { 4758 | x: 69.0 4759 | y: 67.0 4760 | z: 0.0 4761 | w: 1.0 4762 | } 4763 | color { 4764 | x: 1.0 4765 | y: 1.0 4766 | z: 1.0 4767 | w: 1.0 4768 | } 4769 | type: TYPE_BOX 4770 | blend_mode: BLEND_MODE_ALPHA 4771 | texture: "gui/mockup_panelInset_blue" 4772 | id: "template/w_slot_3" 4773 | xanchor: XANCHOR_NONE 4774 | yanchor: YANCHOR_NONE 4775 | pivot: PIVOT_CENTER 4776 | adjust_mode: ADJUST_MODE_FIT 4777 | parent: "template/list" 4778 | layer: "gui" 4779 | inherit_alpha: true 4780 | slice9 { 4781 | x: 0.0 4782 | y: 0.0 4783 | z: 0.0 4784 | w: 0.0 4785 | } 4786 | clipping_mode: CLIPPING_MODE_NONE 4787 | clipping_visible: true 4788 | clipping_inverted: false 4789 | alpha: 1.0 4790 | template_node_child: true 4791 | size_mode: SIZE_MODE_MANUAL 4792 | } 4793 | nodes { 4794 | position { 4795 | x: 0.0 4796 | y: 0.0 4797 | z: 0.0 4798 | w: 1.0 4799 | } 4800 | rotation { 4801 | x: 0.0 4802 | y: 0.0 4803 | z: 0.0 4804 | w: 1.0 4805 | } 4806 | scale { 4807 | x: 1.5 4808 | y: 1.5 4809 | z: 1.0 4810 | w: 1.0 4811 | } 4812 | size { 4813 | x: 34.0 4814 | y: 37.0 4815 | z: 0.0 4816 | w: 1.0 4817 | } 4818 | color { 4819 | x: 1.0 4820 | y: 1.0 4821 | z: 1.0 4822 | w: 1.0 4823 | } 4824 | type: TYPE_BOX 4825 | blend_mode: BLEND_MODE_ALPHA 4826 | texture: "icons/mockup_cursorSword_gold" 4827 | id: "template/w_icon_3" 4828 | xanchor: XANCHOR_NONE 4829 | yanchor: YANCHOR_NONE 4830 | pivot: PIVOT_CENTER 4831 | adjust_mode: ADJUST_MODE_FIT 4832 | parent: "template/w_slot_3" 4833 | layer: "icons" 4834 | inherit_alpha: true 4835 | slice9 { 4836 | x: 0.0 4837 | y: 0.0 4838 | z: 0.0 4839 | w: 0.0 4840 | } 4841 | clipping_mode: CLIPPING_MODE_NONE 4842 | clipping_visible: true 4843 | clipping_inverted: false 4844 | alpha: 0.0 4845 | template_node_child: true 4846 | size_mode: SIZE_MODE_AUTO 4847 | } 4848 | nodes { 4849 | position { 4850 | x: 117.0 4851 | y: 45.0 4852 | z: 0.0 4853 | w: 1.0 4854 | } 4855 | rotation { 4856 | x: 0.0 4857 | y: 0.0 4858 | z: 0.0 4859 | w: 1.0 4860 | } 4861 | scale { 4862 | x: 1.0 4863 | y: 1.0 4864 | z: 1.0 4865 | w: 1.0 4866 | } 4867 | size { 4868 | x: 69.0 4869 | y: 67.0 4870 | z: 0.0 4871 | w: 1.0 4872 | } 4873 | color { 4874 | x: 1.0 4875 | y: 1.0 4876 | z: 1.0 4877 | w: 1.0 4878 | } 4879 | type: TYPE_BOX 4880 | blend_mode: BLEND_MODE_ALPHA 4881 | texture: "gui/mockup_panelInset_blue" 4882 | id: "template/w_slot_4" 4883 | xanchor: XANCHOR_NONE 4884 | yanchor: YANCHOR_NONE 4885 | pivot: PIVOT_CENTER 4886 | adjust_mode: ADJUST_MODE_FIT 4887 | parent: "template/list" 4888 | layer: "gui" 4889 | inherit_alpha: true 4890 | slice9 { 4891 | x: 0.0 4892 | y: 0.0 4893 | z: 0.0 4894 | w: 0.0 4895 | } 4896 | clipping_mode: CLIPPING_MODE_NONE 4897 | clipping_visible: true 4898 | clipping_inverted: false 4899 | alpha: 1.0 4900 | template_node_child: true 4901 | size_mode: SIZE_MODE_MANUAL 4902 | } 4903 | nodes { 4904 | position { 4905 | x: 0.0 4906 | y: 0.0 4907 | z: 0.0 4908 | w: 1.0 4909 | } 4910 | rotation { 4911 | x: 0.0 4912 | y: 0.0 4913 | z: 0.0 4914 | w: 1.0 4915 | } 4916 | scale { 4917 | x: 1.5 4918 | y: 1.5 4919 | z: 1.0 4920 | w: 1.0 4921 | } 4922 | size { 4923 | x: 34.0 4924 | y: 37.0 4925 | z: 0.0 4926 | w: 1.0 4927 | } 4928 | color { 4929 | x: 1.0 4930 | y: 1.0 4931 | z: 1.0 4932 | w: 1.0 4933 | } 4934 | type: TYPE_BOX 4935 | blend_mode: BLEND_MODE_ALPHA 4936 | texture: "icons/mockup_cursorSword_gold" 4937 | id: "template/w_icon_4" 4938 | xanchor: XANCHOR_NONE 4939 | yanchor: YANCHOR_NONE 4940 | pivot: PIVOT_CENTER 4941 | adjust_mode: ADJUST_MODE_FIT 4942 | parent: "template/w_slot_4" 4943 | layer: "icons" 4944 | inherit_alpha: true 4945 | slice9 { 4946 | x: 0.0 4947 | y: 0.0 4948 | z: 0.0 4949 | w: 0.0 4950 | } 4951 | clipping_mode: CLIPPING_MODE_NONE 4952 | clipping_visible: true 4953 | clipping_inverted: false 4954 | alpha: 0.0 4955 | template_node_child: true 4956 | size_mode: SIZE_MODE_AUTO 4957 | } 4958 | nodes { 4959 | position { 4960 | x: 206.0 4961 | y: 45.0 4962 | z: 0.0 4963 | w: 1.0 4964 | } 4965 | rotation { 4966 | x: 0.0 4967 | y: 0.0 4968 | z: 0.0 4969 | w: 1.0 4970 | } 4971 | scale { 4972 | x: 1.0 4973 | y: 1.0 4974 | z: 1.0 4975 | w: 1.0 4976 | } 4977 | size { 4978 | x: 69.0 4979 | y: 67.0 4980 | z: 0.0 4981 | w: 1.0 4982 | } 4983 | color { 4984 | x: 1.0 4985 | y: 1.0 4986 | z: 1.0 4987 | w: 1.0 4988 | } 4989 | type: TYPE_BOX 4990 | blend_mode: BLEND_MODE_ALPHA 4991 | texture: "gui/mockup_panelInset_blue" 4992 | id: "template/w_slot_5" 4993 | xanchor: XANCHOR_NONE 4994 | yanchor: YANCHOR_NONE 4995 | pivot: PIVOT_CENTER 4996 | adjust_mode: ADJUST_MODE_FIT 4997 | parent: "template/list" 4998 | layer: "gui" 4999 | inherit_alpha: true 5000 | slice9 { 5001 | x: 0.0 5002 | y: 0.0 5003 | z: 0.0 5004 | w: 0.0 5005 | } 5006 | clipping_mode: CLIPPING_MODE_NONE 5007 | clipping_visible: true 5008 | clipping_inverted: false 5009 | alpha: 1.0 5010 | template_node_child: true 5011 | size_mode: SIZE_MODE_MANUAL 5012 | } 5013 | nodes { 5014 | position { 5015 | x: 0.0 5016 | y: 0.0 5017 | z: 0.0 5018 | w: 1.0 5019 | } 5020 | rotation { 5021 | x: 0.0 5022 | y: 0.0 5023 | z: 0.0 5024 | w: 1.0 5025 | } 5026 | scale { 5027 | x: 1.5 5028 | y: 1.5 5029 | z: 1.0 5030 | w: 1.0 5031 | } 5032 | size { 5033 | x: 34.0 5034 | y: 37.0 5035 | z: 0.0 5036 | w: 1.0 5037 | } 5038 | color { 5039 | x: 1.0 5040 | y: 1.0 5041 | z: 1.0 5042 | w: 1.0 5043 | } 5044 | type: TYPE_BOX 5045 | blend_mode: BLEND_MODE_ALPHA 5046 | texture: "icons/mockup_cursorSword_gold" 5047 | id: "template/w_icon_5" 5048 | xanchor: XANCHOR_NONE 5049 | yanchor: YANCHOR_NONE 5050 | pivot: PIVOT_CENTER 5051 | adjust_mode: ADJUST_MODE_FIT 5052 | parent: "template/w_slot_5" 5053 | layer: "icons" 5054 | inherit_alpha: true 5055 | slice9 { 5056 | x: 0.0 5057 | y: 0.0 5058 | z: 0.0 5059 | w: 0.0 5060 | } 5061 | clipping_mode: CLIPPING_MODE_NONE 5062 | clipping_visible: true 5063 | clipping_inverted: false 5064 | alpha: 0.0 5065 | template_node_child: true 5066 | size_mode: SIZE_MODE_AUTO 5067 | } 5068 | nodes { 5069 | position { 5070 | x: 294.0 5071 | y: 45.0 5072 | z: 0.0 5073 | w: 1.0 5074 | } 5075 | rotation { 5076 | x: 0.0 5077 | y: 0.0 5078 | z: 0.0 5079 | w: 1.0 5080 | } 5081 | scale { 5082 | x: 1.0 5083 | y: 1.0 5084 | z: 1.0 5085 | w: 1.0 5086 | } 5087 | size { 5088 | x: 69.0 5089 | y: 67.0 5090 | z: 0.0 5091 | w: 1.0 5092 | } 5093 | color { 5094 | x: 1.0 5095 | y: 1.0 5096 | z: 1.0 5097 | w: 1.0 5098 | } 5099 | type: TYPE_BOX 5100 | blend_mode: BLEND_MODE_ALPHA 5101 | texture: "gui/mockup_panelInset_blue" 5102 | id: "template/w_slot_6" 5103 | xanchor: XANCHOR_NONE 5104 | yanchor: YANCHOR_NONE 5105 | pivot: PIVOT_CENTER 5106 | adjust_mode: ADJUST_MODE_FIT 5107 | parent: "template/list" 5108 | layer: "gui" 5109 | inherit_alpha: true 5110 | slice9 { 5111 | x: 0.0 5112 | y: 0.0 5113 | z: 0.0 5114 | w: 0.0 5115 | } 5116 | clipping_mode: CLIPPING_MODE_NONE 5117 | clipping_visible: true 5118 | clipping_inverted: false 5119 | alpha: 1.0 5120 | template_node_child: true 5121 | size_mode: SIZE_MODE_MANUAL 5122 | } 5123 | nodes { 5124 | position { 5125 | x: 0.0 5126 | y: 0.0 5127 | z: 0.0 5128 | w: 1.0 5129 | } 5130 | rotation { 5131 | x: 0.0 5132 | y: 0.0 5133 | z: 0.0 5134 | w: 1.0 5135 | } 5136 | scale { 5137 | x: 1.5 5138 | y: 1.5 5139 | z: 1.0 5140 | w: 1.0 5141 | } 5142 | size { 5143 | x: 34.0 5144 | y: 37.0 5145 | z: 0.0 5146 | w: 1.0 5147 | } 5148 | color { 5149 | x: 1.0 5150 | y: 1.0 5151 | z: 1.0 5152 | w: 1.0 5153 | } 5154 | type: TYPE_BOX 5155 | blend_mode: BLEND_MODE_ALPHA 5156 | texture: "icons/mockup_cursorSword_gold" 5157 | id: "template/w_icon_6" 5158 | xanchor: XANCHOR_NONE 5159 | yanchor: YANCHOR_NONE 5160 | pivot: PIVOT_CENTER 5161 | adjust_mode: ADJUST_MODE_FIT 5162 | parent: "template/w_slot_6" 5163 | layer: "icons" 5164 | inherit_alpha: true 5165 | slice9 { 5166 | x: 0.0 5167 | y: 0.0 5168 | z: 0.0 5169 | w: 0.0 5170 | } 5171 | clipping_mode: CLIPPING_MODE_NONE 5172 | clipping_visible: true 5173 | clipping_inverted: false 5174 | alpha: 0.0 5175 | template_node_child: true 5176 | size_mode: SIZE_MODE_AUTO 5177 | } 5178 | nodes { 5179 | position { 5180 | x: 380.0 5181 | y: 45.0 5182 | z: 0.0 5183 | w: 1.0 5184 | } 5185 | rotation { 5186 | x: 0.0 5187 | y: 0.0 5188 | z: 0.0 5189 | w: 1.0 5190 | } 5191 | scale { 5192 | x: 1.0 5193 | y: 1.0 5194 | z: 1.0 5195 | w: 1.0 5196 | } 5197 | size { 5198 | x: 69.0 5199 | y: 67.0 5200 | z: 0.0 5201 | w: 1.0 5202 | } 5203 | color { 5204 | x: 1.0 5205 | y: 1.0 5206 | z: 1.0 5207 | w: 1.0 5208 | } 5209 | type: TYPE_BOX 5210 | blend_mode: BLEND_MODE_ALPHA 5211 | texture: "gui/mockup_panelInset_blue" 5212 | id: "template/w_slot_7" 5213 | xanchor: XANCHOR_NONE 5214 | yanchor: YANCHOR_NONE 5215 | pivot: PIVOT_CENTER 5216 | adjust_mode: ADJUST_MODE_FIT 5217 | parent: "template/list" 5218 | layer: "gui" 5219 | inherit_alpha: true 5220 | slice9 { 5221 | x: 0.0 5222 | y: 0.0 5223 | z: 0.0 5224 | w: 0.0 5225 | } 5226 | clipping_mode: CLIPPING_MODE_NONE 5227 | clipping_visible: true 5228 | clipping_inverted: false 5229 | alpha: 1.0 5230 | template_node_child: true 5231 | size_mode: SIZE_MODE_MANUAL 5232 | } 5233 | nodes { 5234 | position { 5235 | x: 0.0 5236 | y: 0.0 5237 | z: 0.0 5238 | w: 1.0 5239 | } 5240 | rotation { 5241 | x: 0.0 5242 | y: 0.0 5243 | z: 0.0 5244 | w: 1.0 5245 | } 5246 | scale { 5247 | x: 1.5 5248 | y: 1.5 5249 | z: 1.0 5250 | w: 1.0 5251 | } 5252 | size { 5253 | x: 34.0 5254 | y: 37.0 5255 | z: 0.0 5256 | w: 1.0 5257 | } 5258 | color { 5259 | x: 1.0 5260 | y: 1.0 5261 | z: 1.0 5262 | w: 1.0 5263 | } 5264 | type: TYPE_BOX 5265 | blend_mode: BLEND_MODE_ALPHA 5266 | texture: "icons/mockup_cursorSword_gold" 5267 | id: "template/w_icon_7" 5268 | xanchor: XANCHOR_NONE 5269 | yanchor: YANCHOR_NONE 5270 | pivot: PIVOT_CENTER 5271 | adjust_mode: ADJUST_MODE_FIT 5272 | parent: "template/w_slot_7" 5273 | layer: "icons" 5274 | inherit_alpha: true 5275 | slice9 { 5276 | x: 0.0 5277 | y: 0.0 5278 | z: 0.0 5279 | w: 0.0 5280 | } 5281 | clipping_mode: CLIPPING_MODE_NONE 5282 | clipping_visible: true 5283 | clipping_inverted: false 5284 | alpha: 0.0 5285 | template_node_child: true 5286 | size_mode: SIZE_MODE_AUTO 5287 | } 5288 | nodes { 5289 | position { 5290 | x: 462.0 5291 | y: 45.0 5292 | z: 0.0 5293 | w: 1.0 5294 | } 5295 | rotation { 5296 | x: 0.0 5297 | y: 0.0 5298 | z: 0.0 5299 | w: 1.0 5300 | } 5301 | scale { 5302 | x: 1.0 5303 | y: 1.0 5304 | z: 1.0 5305 | w: 1.0 5306 | } 5307 | size { 5308 | x: 69.0 5309 | y: 67.0 5310 | z: 0.0 5311 | w: 1.0 5312 | } 5313 | color { 5314 | x: 1.0 5315 | y: 1.0 5316 | z: 1.0 5317 | w: 1.0 5318 | } 5319 | type: TYPE_BOX 5320 | blend_mode: BLEND_MODE_ALPHA 5321 | texture: "gui/mockup_panelInset_blue" 5322 | id: "template/w_slot_8" 5323 | xanchor: XANCHOR_NONE 5324 | yanchor: YANCHOR_NONE 5325 | pivot: PIVOT_CENTER 5326 | adjust_mode: ADJUST_MODE_FIT 5327 | parent: "template/list" 5328 | layer: "gui" 5329 | inherit_alpha: true 5330 | slice9 { 5331 | x: 0.0 5332 | y: 0.0 5333 | z: 0.0 5334 | w: 0.0 5335 | } 5336 | clipping_mode: CLIPPING_MODE_NONE 5337 | clipping_visible: true 5338 | clipping_inverted: false 5339 | alpha: 1.0 5340 | template_node_child: true 5341 | size_mode: SIZE_MODE_MANUAL 5342 | } 5343 | nodes { 5344 | position { 5345 | x: 0.0 5346 | y: 0.0 5347 | z: 0.0 5348 | w: 1.0 5349 | } 5350 | rotation { 5351 | x: 0.0 5352 | y: 0.0 5353 | z: 0.0 5354 | w: 1.0 5355 | } 5356 | scale { 5357 | x: 1.5 5358 | y: 1.5 5359 | z: 1.0 5360 | w: 1.0 5361 | } 5362 | size { 5363 | x: 34.0 5364 | y: 37.0 5365 | z: 0.0 5366 | w: 1.0 5367 | } 5368 | color { 5369 | x: 1.0 5370 | y: 1.0 5371 | z: 1.0 5372 | w: 1.0 5373 | } 5374 | type: TYPE_BOX 5375 | blend_mode: BLEND_MODE_ALPHA 5376 | texture: "icons/mockup_cursorSword_gold" 5377 | id: "template/w_icon_8" 5378 | xanchor: XANCHOR_NONE 5379 | yanchor: YANCHOR_NONE 5380 | pivot: PIVOT_CENTER 5381 | adjust_mode: ADJUST_MODE_FIT 5382 | parent: "template/w_slot_8" 5383 | layer: "icons" 5384 | inherit_alpha: true 5385 | slice9 { 5386 | x: 0.0 5387 | y: 0.0 5388 | z: 0.0 5389 | w: 0.0 5390 | } 5391 | clipping_mode: CLIPPING_MODE_NONE 5392 | clipping_visible: true 5393 | clipping_inverted: false 5394 | alpha: 0.0 5395 | template_node_child: true 5396 | size_mode: SIZE_MODE_AUTO 5397 | } 5398 | nodes { 5399 | position { 5400 | x: -125.0 5401 | y: -43.0 5402 | z: 0.0 5403 | w: 1.0 5404 | } 5405 | rotation { 5406 | x: 0.0 5407 | y: 0.0 5408 | z: 0.0 5409 | w: 1.0 5410 | } 5411 | scale { 5412 | x: 1.0 5413 | y: 1.0 5414 | z: 1.0 5415 | w: 1.0 5416 | } 5417 | size { 5418 | x: 69.0 5419 | y: 67.0 5420 | z: 0.0 5421 | w: 1.0 5422 | } 5423 | color { 5424 | x: 1.0 5425 | y: 1.0 5426 | z: 1.0 5427 | w: 1.0 5428 | } 5429 | type: TYPE_BOX 5430 | blend_mode: BLEND_MODE_ALPHA 5431 | texture: "gui/mockup_panelInset_blue" 5432 | id: "template/w_slot_9" 5433 | xanchor: XANCHOR_NONE 5434 | yanchor: YANCHOR_NONE 5435 | pivot: PIVOT_CENTER 5436 | adjust_mode: ADJUST_MODE_FIT 5437 | parent: "template/list" 5438 | layer: "gui" 5439 | inherit_alpha: true 5440 | slice9 { 5441 | x: 0.0 5442 | y: 0.0 5443 | z: 0.0 5444 | w: 0.0 5445 | } 5446 | clipping_mode: CLIPPING_MODE_NONE 5447 | clipping_visible: true 5448 | clipping_inverted: false 5449 | alpha: 1.0 5450 | template_node_child: true 5451 | size_mode: SIZE_MODE_MANUAL 5452 | } 5453 | nodes { 5454 | position { 5455 | x: 0.0 5456 | y: 0.0 5457 | z: 0.0 5458 | w: 1.0 5459 | } 5460 | rotation { 5461 | x: 0.0 5462 | y: 0.0 5463 | z: 0.0 5464 | w: 1.0 5465 | } 5466 | scale { 5467 | x: 1.5 5468 | y: 1.5 5469 | z: 1.0 5470 | w: 1.0 5471 | } 5472 | size { 5473 | x: 34.0 5474 | y: 37.0 5475 | z: 0.0 5476 | w: 1.0 5477 | } 5478 | color { 5479 | x: 1.0 5480 | y: 1.0 5481 | z: 1.0 5482 | w: 1.0 5483 | } 5484 | type: TYPE_BOX 5485 | blend_mode: BLEND_MODE_ALPHA 5486 | texture: "icons/mockup_cursorSword_gold" 5487 | id: "template/w_icon_9" 5488 | xanchor: XANCHOR_NONE 5489 | yanchor: YANCHOR_NONE 5490 | pivot: PIVOT_CENTER 5491 | adjust_mode: ADJUST_MODE_FIT 5492 | parent: "template/w_slot_9" 5493 | layer: "icons" 5494 | inherit_alpha: true 5495 | slice9 { 5496 | x: 0.0 5497 | y: 0.0 5498 | z: 0.0 5499 | w: 0.0 5500 | } 5501 | clipping_mode: CLIPPING_MODE_NONE 5502 | clipping_visible: true 5503 | clipping_inverted: false 5504 | alpha: 0.0 5505 | template_node_child: true 5506 | size_mode: SIZE_MODE_AUTO 5507 | } 5508 | nodes { 5509 | position { 5510 | x: -46.0 5511 | y: -43.0 5512 | z: 0.0 5513 | w: 1.0 5514 | } 5515 | rotation { 5516 | x: 0.0 5517 | y: 0.0 5518 | z: 0.0 5519 | w: 1.0 5520 | } 5521 | scale { 5522 | x: 1.0 5523 | y: 1.0 5524 | z: 1.0 5525 | w: 1.0 5526 | } 5527 | size { 5528 | x: 69.0 5529 | y: 67.0 5530 | z: 0.0 5531 | w: 1.0 5532 | } 5533 | color { 5534 | x: 1.0 5535 | y: 1.0 5536 | z: 1.0 5537 | w: 1.0 5538 | } 5539 | type: TYPE_BOX 5540 | blend_mode: BLEND_MODE_ALPHA 5541 | texture: "gui/mockup_panelInset_blue" 5542 | id: "template/w_slot_10" 5543 | xanchor: XANCHOR_NONE 5544 | yanchor: YANCHOR_NONE 5545 | pivot: PIVOT_CENTER 5546 | adjust_mode: ADJUST_MODE_FIT 5547 | parent: "template/list" 5548 | layer: "gui" 5549 | inherit_alpha: true 5550 | slice9 { 5551 | x: 0.0 5552 | y: 0.0 5553 | z: 0.0 5554 | w: 0.0 5555 | } 5556 | clipping_mode: CLIPPING_MODE_NONE 5557 | clipping_visible: true 5558 | clipping_inverted: false 5559 | alpha: 1.0 5560 | template_node_child: true 5561 | size_mode: SIZE_MODE_MANUAL 5562 | } 5563 | nodes { 5564 | position { 5565 | x: 0.0 5566 | y: 0.0 5567 | z: 0.0 5568 | w: 1.0 5569 | } 5570 | rotation { 5571 | x: 0.0 5572 | y: 0.0 5573 | z: 0.0 5574 | w: 1.0 5575 | } 5576 | scale { 5577 | x: 1.5 5578 | y: 1.5 5579 | z: 1.0 5580 | w: 1.0 5581 | } 5582 | size { 5583 | x: 34.0 5584 | y: 37.0 5585 | z: 0.0 5586 | w: 1.0 5587 | } 5588 | color { 5589 | x: 1.0 5590 | y: 1.0 5591 | z: 1.0 5592 | w: 1.0 5593 | } 5594 | type: TYPE_BOX 5595 | blend_mode: BLEND_MODE_ALPHA 5596 | texture: "icons/mockup_cursorSword_gold" 5597 | id: "template/w_icon_10" 5598 | xanchor: XANCHOR_NONE 5599 | yanchor: YANCHOR_NONE 5600 | pivot: PIVOT_CENTER 5601 | adjust_mode: ADJUST_MODE_FIT 5602 | parent: "template/w_slot_10" 5603 | layer: "icons" 5604 | inherit_alpha: true 5605 | slice9 { 5606 | x: 0.0 5607 | y: 0.0 5608 | z: 0.0 5609 | w: 0.0 5610 | } 5611 | clipping_mode: CLIPPING_MODE_NONE 5612 | clipping_visible: true 5613 | clipping_inverted: false 5614 | alpha: 0.0 5615 | template_node_child: true 5616 | size_mode: SIZE_MODE_AUTO 5617 | } 5618 | nodes { 5619 | position { 5620 | x: 36.0 5621 | y: -43.0 5622 | z: 0.0 5623 | w: 1.0 5624 | } 5625 | rotation { 5626 | x: 0.0 5627 | y: 0.0 5628 | z: 0.0 5629 | w: 1.0 5630 | } 5631 | scale { 5632 | x: 1.0 5633 | y: 1.0 5634 | z: 1.0 5635 | w: 1.0 5636 | } 5637 | size { 5638 | x: 69.0 5639 | y: 67.0 5640 | z: 0.0 5641 | w: 1.0 5642 | } 5643 | color { 5644 | x: 1.0 5645 | y: 1.0 5646 | z: 1.0 5647 | w: 1.0 5648 | } 5649 | type: TYPE_BOX 5650 | blend_mode: BLEND_MODE_ALPHA 5651 | texture: "gui/mockup_panelInset_blue" 5652 | id: "template/w_slot_11" 5653 | xanchor: XANCHOR_NONE 5654 | yanchor: YANCHOR_NONE 5655 | pivot: PIVOT_CENTER 5656 | adjust_mode: ADJUST_MODE_FIT 5657 | parent: "template/list" 5658 | layer: "gui" 5659 | inherit_alpha: true 5660 | slice9 { 5661 | x: 0.0 5662 | y: 0.0 5663 | z: 0.0 5664 | w: 0.0 5665 | } 5666 | clipping_mode: CLIPPING_MODE_NONE 5667 | clipping_visible: true 5668 | clipping_inverted: false 5669 | alpha: 1.0 5670 | template_node_child: true 5671 | size_mode: SIZE_MODE_MANUAL 5672 | } 5673 | nodes { 5674 | position { 5675 | x: 0.0 5676 | y: 0.0 5677 | z: 0.0 5678 | w: 1.0 5679 | } 5680 | rotation { 5681 | x: 0.0 5682 | y: 0.0 5683 | z: 0.0 5684 | w: 1.0 5685 | } 5686 | scale { 5687 | x: 1.5 5688 | y: 1.5 5689 | z: 1.0 5690 | w: 1.0 5691 | } 5692 | size { 5693 | x: 34.0 5694 | y: 37.0 5695 | z: 0.0 5696 | w: 1.0 5697 | } 5698 | color { 5699 | x: 1.0 5700 | y: 1.0 5701 | z: 1.0 5702 | w: 1.0 5703 | } 5704 | type: TYPE_BOX 5705 | blend_mode: BLEND_MODE_ALPHA 5706 | texture: "icons/mockup_cursorSword_gold" 5707 | id: "template/w_icon_11" 5708 | xanchor: XANCHOR_NONE 5709 | yanchor: YANCHOR_NONE 5710 | pivot: PIVOT_CENTER 5711 | adjust_mode: ADJUST_MODE_FIT 5712 | parent: "template/w_slot_11" 5713 | layer: "icons" 5714 | inherit_alpha: true 5715 | slice9 { 5716 | x: 0.0 5717 | y: 0.0 5718 | z: 0.0 5719 | w: 0.0 5720 | } 5721 | clipping_mode: CLIPPING_MODE_NONE 5722 | clipping_visible: true 5723 | clipping_inverted: false 5724 | alpha: 0.0 5725 | template_node_child: true 5726 | size_mode: SIZE_MODE_AUTO 5727 | } 5728 | nodes { 5729 | position { 5730 | x: 118.0 5731 | y: -43.0 5732 | z: 0.0 5733 | w: 1.0 5734 | } 5735 | rotation { 5736 | x: 0.0 5737 | y: 0.0 5738 | z: 0.0 5739 | w: 1.0 5740 | } 5741 | scale { 5742 | x: 1.0 5743 | y: 1.0 5744 | z: 1.0 5745 | w: 1.0 5746 | } 5747 | size { 5748 | x: 69.0 5749 | y: 67.0 5750 | z: 0.0 5751 | w: 1.0 5752 | } 5753 | color { 5754 | x: 0.6 5755 | y: 0.6 5756 | z: 0.6 5757 | w: 1.0 5758 | } 5759 | type: TYPE_BOX 5760 | blend_mode: BLEND_MODE_ALPHA 5761 | texture: "gui/mockup_panelInset_blue" 5762 | id: "template/w_slot_12" 5763 | xanchor: XANCHOR_NONE 5764 | yanchor: YANCHOR_NONE 5765 | pivot: PIVOT_CENTER 5766 | adjust_mode: ADJUST_MODE_FIT 5767 | parent: "template/list" 5768 | layer: "gui" 5769 | inherit_alpha: true 5770 | slice9 { 5771 | x: 0.0 5772 | y: 0.0 5773 | z: 0.0 5774 | w: 0.0 5775 | } 5776 | clipping_mode: CLIPPING_MODE_NONE 5777 | clipping_visible: true 5778 | clipping_inverted: false 5779 | alpha: 1.0 5780 | template_node_child: true 5781 | size_mode: SIZE_MODE_MANUAL 5782 | } 5783 | nodes { 5784 | position { 5785 | x: 0.0 5786 | y: 0.0 5787 | z: 0.0 5788 | w: 1.0 5789 | } 5790 | rotation { 5791 | x: 0.0 5792 | y: 0.0 5793 | z: 0.0 5794 | w: 1.0 5795 | } 5796 | scale { 5797 | x: 1.5 5798 | y: 1.5 5799 | z: 1.0 5800 | w: 1.0 5801 | } 5802 | size { 5803 | x: 34.0 5804 | y: 37.0 5805 | z: 0.0 5806 | w: 1.0 5807 | } 5808 | color { 5809 | x: 1.0 5810 | y: 1.0 5811 | z: 1.0 5812 | w: 1.0 5813 | } 5814 | type: TYPE_BOX 5815 | blend_mode: BLEND_MODE_ALPHA 5816 | texture: "icons/mockup_cursorSword_gold" 5817 | id: "template/w_icon_12" 5818 | xanchor: XANCHOR_NONE 5819 | yanchor: YANCHOR_NONE 5820 | pivot: PIVOT_CENTER 5821 | adjust_mode: ADJUST_MODE_FIT 5822 | parent: "template/w_slot_12" 5823 | layer: "icons" 5824 | inherit_alpha: true 5825 | slice9 { 5826 | x: 0.0 5827 | y: 0.0 5828 | z: 0.0 5829 | w: 0.0 5830 | } 5831 | clipping_mode: CLIPPING_MODE_NONE 5832 | clipping_visible: true 5833 | clipping_inverted: false 5834 | alpha: 1.0 5835 | template_node_child: true 5836 | size_mode: SIZE_MODE_AUTO 5837 | } 5838 | nodes { 5839 | position { 5840 | x: 204.0 5841 | y: -43.0 5842 | z: 0.0 5843 | w: 1.0 5844 | } 5845 | rotation { 5846 | x: 0.0 5847 | y: 0.0 5848 | z: 0.0 5849 | w: 1.0 5850 | } 5851 | scale { 5852 | x: 1.0 5853 | y: 1.0 5854 | z: 1.0 5855 | w: 1.0 5856 | } 5857 | size { 5858 | x: 69.0 5859 | y: 67.0 5860 | z: 0.0 5861 | w: 1.0 5862 | } 5863 | color { 5864 | x: 1.0 5865 | y: 1.0 5866 | z: 1.0 5867 | w: 1.0 5868 | } 5869 | type: TYPE_BOX 5870 | blend_mode: BLEND_MODE_ALPHA 5871 | texture: "gui/mockup_panelInset_blue" 5872 | id: "template/w_slot_13" 5873 | xanchor: XANCHOR_NONE 5874 | yanchor: YANCHOR_NONE 5875 | pivot: PIVOT_CENTER 5876 | adjust_mode: ADJUST_MODE_FIT 5877 | parent: "template/list" 5878 | layer: "gui" 5879 | inherit_alpha: true 5880 | slice9 { 5881 | x: 0.0 5882 | y: 0.0 5883 | z: 0.0 5884 | w: 0.0 5885 | } 5886 | clipping_mode: CLIPPING_MODE_NONE 5887 | clipping_visible: true 5888 | clipping_inverted: false 5889 | alpha: 1.0 5890 | template_node_child: true 5891 | size_mode: SIZE_MODE_MANUAL 5892 | } 5893 | nodes { 5894 | position { 5895 | x: 0.0 5896 | y: 0.0 5897 | z: 0.0 5898 | w: 1.0 5899 | } 5900 | rotation { 5901 | x: 0.0 5902 | y: 0.0 5903 | z: 0.0 5904 | w: 1.0 5905 | } 5906 | scale { 5907 | x: 1.5 5908 | y: 1.5 5909 | z: 1.0 5910 | w: 1.0 5911 | } 5912 | size { 5913 | x: 34.0 5914 | y: 37.0 5915 | z: 0.0 5916 | w: 1.0 5917 | } 5918 | color { 5919 | x: 1.0 5920 | y: 1.0 5921 | z: 1.0 5922 | w: 1.0 5923 | } 5924 | type: TYPE_BOX 5925 | blend_mode: BLEND_MODE_ALPHA 5926 | texture: "icons/mockup_cursorSword_gold" 5927 | id: "template/w_icon_13" 5928 | xanchor: XANCHOR_NONE 5929 | yanchor: YANCHOR_NONE 5930 | pivot: PIVOT_CENTER 5931 | adjust_mode: ADJUST_MODE_FIT 5932 | parent: "template/w_slot_13" 5933 | layer: "icons" 5934 | inherit_alpha: true 5935 | slice9 { 5936 | x: 0.0 5937 | y: 0.0 5938 | z: 0.0 5939 | w: 0.0 5940 | } 5941 | clipping_mode: CLIPPING_MODE_NONE 5942 | clipping_visible: true 5943 | clipping_inverted: false 5944 | alpha: 0.0 5945 | template_node_child: true 5946 | size_mode: SIZE_MODE_AUTO 5947 | } 5948 | nodes { 5949 | position { 5950 | x: 294.0 5951 | y: -43.0 5952 | z: 0.0 5953 | w: 1.0 5954 | } 5955 | rotation { 5956 | x: 0.0 5957 | y: 0.0 5958 | z: 0.0 5959 | w: 1.0 5960 | } 5961 | scale { 5962 | x: 1.0 5963 | y: 1.0 5964 | z: 1.0 5965 | w: 1.0 5966 | } 5967 | size { 5968 | x: 69.0 5969 | y: 67.0 5970 | z: 0.0 5971 | w: 1.0 5972 | } 5973 | color { 5974 | x: 1.0 5975 | y: 1.0 5976 | z: 1.0 5977 | w: 1.0 5978 | } 5979 | type: TYPE_BOX 5980 | blend_mode: BLEND_MODE_ALPHA 5981 | texture: "gui/mockup_panelInset_blue" 5982 | id: "template/w_slot_14" 5983 | xanchor: XANCHOR_NONE 5984 | yanchor: YANCHOR_NONE 5985 | pivot: PIVOT_CENTER 5986 | adjust_mode: ADJUST_MODE_FIT 5987 | parent: "template/list" 5988 | layer: "gui" 5989 | inherit_alpha: true 5990 | slice9 { 5991 | x: 0.0 5992 | y: 0.0 5993 | z: 0.0 5994 | w: 0.0 5995 | } 5996 | clipping_mode: CLIPPING_MODE_NONE 5997 | clipping_visible: true 5998 | clipping_inverted: false 5999 | alpha: 1.0 6000 | template_node_child: true 6001 | size_mode: SIZE_MODE_MANUAL 6002 | } 6003 | nodes { 6004 | position { 6005 | x: 0.0 6006 | y: 0.0 6007 | z: 0.0 6008 | w: 1.0 6009 | } 6010 | rotation { 6011 | x: 0.0 6012 | y: 0.0 6013 | z: 0.0 6014 | w: 1.0 6015 | } 6016 | scale { 6017 | x: 1.5 6018 | y: 1.5 6019 | z: 1.0 6020 | w: 1.0 6021 | } 6022 | size { 6023 | x: 34.0 6024 | y: 37.0 6025 | z: 0.0 6026 | w: 1.0 6027 | } 6028 | color { 6029 | x: 1.0 6030 | y: 1.0 6031 | z: 1.0 6032 | w: 1.0 6033 | } 6034 | type: TYPE_BOX 6035 | blend_mode: BLEND_MODE_ALPHA 6036 | texture: "icons/mockup_cursorSword_gold" 6037 | id: "template/w_icon_14" 6038 | xanchor: XANCHOR_NONE 6039 | yanchor: YANCHOR_NONE 6040 | pivot: PIVOT_CENTER 6041 | adjust_mode: ADJUST_MODE_FIT 6042 | parent: "template/w_slot_14" 6043 | layer: "icons" 6044 | inherit_alpha: true 6045 | slice9 { 6046 | x: 0.0 6047 | y: 0.0 6048 | z: 0.0 6049 | w: 0.0 6050 | } 6051 | clipping_mode: CLIPPING_MODE_NONE 6052 | clipping_visible: true 6053 | clipping_inverted: false 6054 | alpha: 0.0 6055 | template_node_child: true 6056 | size_mode: SIZE_MODE_AUTO 6057 | } 6058 | nodes { 6059 | position { 6060 | x: 381.0 6061 | y: -43.0 6062 | z: 0.0 6063 | w: 1.0 6064 | } 6065 | rotation { 6066 | x: 0.0 6067 | y: 0.0 6068 | z: 0.0 6069 | w: 1.0 6070 | } 6071 | scale { 6072 | x: 1.0 6073 | y: 1.0 6074 | z: 1.0 6075 | w: 1.0 6076 | } 6077 | size { 6078 | x: 69.0 6079 | y: 67.0 6080 | z: 0.0 6081 | w: 1.0 6082 | } 6083 | color { 6084 | x: 1.0 6085 | y: 1.0 6086 | z: 1.0 6087 | w: 1.0 6088 | } 6089 | type: TYPE_BOX 6090 | blend_mode: BLEND_MODE_ALPHA 6091 | texture: "gui/mockup_panelInset_blue" 6092 | id: "template/w_slot_15" 6093 | xanchor: XANCHOR_NONE 6094 | yanchor: YANCHOR_NONE 6095 | pivot: PIVOT_CENTER 6096 | adjust_mode: ADJUST_MODE_FIT 6097 | parent: "template/list" 6098 | layer: "gui" 6099 | inherit_alpha: true 6100 | slice9 { 6101 | x: 0.0 6102 | y: 0.0 6103 | z: 0.0 6104 | w: 0.0 6105 | } 6106 | clipping_mode: CLIPPING_MODE_NONE 6107 | clipping_visible: true 6108 | clipping_inverted: false 6109 | alpha: 1.0 6110 | template_node_child: true 6111 | size_mode: SIZE_MODE_MANUAL 6112 | } 6113 | nodes { 6114 | position { 6115 | x: 0.0 6116 | y: 0.0 6117 | z: 0.0 6118 | w: 1.0 6119 | } 6120 | rotation { 6121 | x: 0.0 6122 | y: 0.0 6123 | z: 0.0 6124 | w: 1.0 6125 | } 6126 | scale { 6127 | x: 1.5 6128 | y: 1.5 6129 | z: 1.0 6130 | w: 1.0 6131 | } 6132 | size { 6133 | x: 34.0 6134 | y: 37.0 6135 | z: 0.0 6136 | w: 1.0 6137 | } 6138 | color { 6139 | x: 1.0 6140 | y: 1.0 6141 | z: 1.0 6142 | w: 1.0 6143 | } 6144 | type: TYPE_BOX 6145 | blend_mode: BLEND_MODE_ALPHA 6146 | texture: "icons/mockup_cursorSword_gold" 6147 | id: "template/w_icon_15" 6148 | xanchor: XANCHOR_NONE 6149 | yanchor: YANCHOR_NONE 6150 | pivot: PIVOT_CENTER 6151 | adjust_mode: ADJUST_MODE_FIT 6152 | parent: "template/w_slot_15" 6153 | layer: "icons" 6154 | inherit_alpha: true 6155 | slice9 { 6156 | x: 0.0 6157 | y: 0.0 6158 | z: 0.0 6159 | w: 0.0 6160 | } 6161 | clipping_mode: CLIPPING_MODE_NONE 6162 | clipping_visible: true 6163 | clipping_inverted: false 6164 | alpha: 0.0 6165 | template_node_child: true 6166 | size_mode: SIZE_MODE_AUTO 6167 | } 6168 | nodes { 6169 | position { 6170 | x: 461.0 6171 | y: -43.0 6172 | z: 0.0 6173 | w: 1.0 6174 | } 6175 | rotation { 6176 | x: 0.0 6177 | y: 0.0 6178 | z: 0.0 6179 | w: 1.0 6180 | } 6181 | scale { 6182 | x: 1.0 6183 | y: 1.0 6184 | z: 1.0 6185 | w: 1.0 6186 | } 6187 | size { 6188 | x: 69.0 6189 | y: 67.0 6190 | z: 0.0 6191 | w: 1.0 6192 | } 6193 | color { 6194 | x: 0.6 6195 | y: 0.6 6196 | z: 0.6 6197 | w: 1.0 6198 | } 6199 | type: TYPE_BOX 6200 | blend_mode: BLEND_MODE_ALPHA 6201 | texture: "gui/mockup_panelInset_blue" 6202 | id: "template/w_slot_16" 6203 | xanchor: XANCHOR_NONE 6204 | yanchor: YANCHOR_NONE 6205 | pivot: PIVOT_CENTER 6206 | adjust_mode: ADJUST_MODE_FIT 6207 | parent: "template/list" 6208 | layer: "gui" 6209 | inherit_alpha: true 6210 | slice9 { 6211 | x: 0.0 6212 | y: 0.0 6213 | z: 0.0 6214 | w: 0.0 6215 | } 6216 | clipping_mode: CLIPPING_MODE_NONE 6217 | clipping_visible: true 6218 | clipping_inverted: false 6219 | alpha: 1.0 6220 | template_node_child: true 6221 | size_mode: SIZE_MODE_MANUAL 6222 | } 6223 | nodes { 6224 | position { 6225 | x: 0.0 6226 | y: 0.0 6227 | z: 0.0 6228 | w: 1.0 6229 | } 6230 | rotation { 6231 | x: 0.0 6232 | y: 0.0 6233 | z: 0.0 6234 | w: 1.0 6235 | } 6236 | scale { 6237 | x: 1.5 6238 | y: 1.5 6239 | z: 1.0 6240 | w: 1.0 6241 | } 6242 | size { 6243 | x: 34.0 6244 | y: 37.0 6245 | z: 0.0 6246 | w: 1.0 6247 | } 6248 | color { 6249 | x: 1.0 6250 | y: 1.0 6251 | z: 1.0 6252 | w: 1.0 6253 | } 6254 | type: TYPE_BOX 6255 | blend_mode: BLEND_MODE_ALPHA 6256 | texture: "icons/mockup_cursorSword_gold" 6257 | id: "template/w_icon_18" 6258 | xanchor: XANCHOR_NONE 6259 | yanchor: YANCHOR_NONE 6260 | pivot: PIVOT_CENTER 6261 | adjust_mode: ADJUST_MODE_FIT 6262 | parent: "template/w_slot_16" 6263 | layer: "icons" 6264 | inherit_alpha: true 6265 | slice9 { 6266 | x: 0.0 6267 | y: 0.0 6268 | z: 0.0 6269 | w: 0.0 6270 | } 6271 | clipping_mode: CLIPPING_MODE_NONE 6272 | clipping_visible: true 6273 | clipping_inverted: false 6274 | alpha: 1.0 6275 | template_node_child: true 6276 | size_mode: SIZE_MODE_AUTO 6277 | } 6278 | layers { 6279 | name: "empty" 6280 | } 6281 | layers { 6282 | name: "gui" 6283 | } 6284 | layers { 6285 | name: "icons" 6286 | } 6287 | layers { 6288 | name: "player" 6289 | } 6290 | layers { 6291 | name: "vera" 6292 | } 6293 | layers { 6294 | name: "larryfont" 6295 | } 6296 | layers { 6297 | name: "stencil" 6298 | } 6299 | material: "/builtins/materials/gui.material" 6300 | adjust_reference: ADJUST_REFERENCE_LEGACY 6301 | max_nodes: 512 6302 | spine_scenes { 6303 | name: "player" 6304 | spine_scene: "/assets/player.spinescene" 6305 | } 6306 | spine_scenes { 6307 | name: "player_16" 6308 | spine_scene: "/assets/player_16.spinescene" 6309 | } 6310 | --------------------------------------------------------------------------------