├── 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 |
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 |
--------------------------------------------------------------------------------