Răsfoiți Sursa

Merge branch 'master' of https://github.com/defold/doc

Björn Ritzl 1 lună în urmă
părinte
comite
ff4d0b2a31
93 a modificat fișierele cu 3691 adăugiri și 1763 ștergeri
  1. 1 0
      .wordlist.txt
  2. 14 0
      docs/en/en.json
  3. 3 3
      docs/en/manuals/debugging-native-code-ios.md
  4. 5 5
      docs/en/manuals/debugging-native-code.md
  5. 216 3
      docs/en/manuals/editor-scripts.md
  6. 1 1
      docs/en/manuals/extender-local-setup.md
  7. 0 1
      docs/en/manuals/factory.md
  8. 0 2
      docs/en/manuals/gui.md
  9. 3 0
      docs/en/manuals/html5.md
  10. 1 1
      docs/en/manuals/importing-graphics.md
  11. 0 5
      docs/en/manuals/importing-models.md
  12. 0 2
      docs/en/manuals/mesh.md
  13. 0 1
      docs/en/manuals/optimization-battery.md
  14. 0 6
      docs/en/manuals/optimization-size.md
  15. 4 5
      docs/en/manuals/optimization-speed.md
  16. 0 2
      docs/en/manuals/physics-shapes.md
  17. 21 4
      docs/en/manuals/shader.md
  18. 40 8
      docs/en/manuals/sound-streaming.md
  19. 0 4
      docs/en/manuals/sprite.md
  20. 1 1
      docs/en/manuals/writing-code.md
  21. 6 0
      docs/ru/manuals/adapting-graphics-to-screen-size.md
  22. 7 7
      docs/ru/manuals/ads.md
  23. 12 62
      docs/ru/manuals/android.md
  24. 5 0
      docs/ru/manuals/animation.md
  25. 4 0
      docs/ru/manuals/application-lifecycle.md
  26. 117 6
      docs/ru/manuals/atlas.md
  27. 7 1
      docs/ru/manuals/bob.md
  28. 11 7
      docs/ru/manuals/building-blocks.md
  29. 36 2
      docs/ru/manuals/bundling.md
  30. 1 1
      docs/ru/manuals/caching-assets.md
  31. 208 69
      docs/ru/manuals/camera.md
  32. 19 0
      docs/ru/manuals/collection-factory.md
  33. 16 0
      docs/ru/manuals/collection-proxy.md
  34. 8 0
      docs/ru/manuals/components.md
  35. 25 11
      docs/ru/manuals/debugging-game-and-system-logs.md
  36. 7 0
      docs/ru/manuals/debugging-game-logic.md
  37. 6 3
      docs/ru/manuals/debugging-native-code-android.md
  38. 43 24
      docs/ru/manuals/debugging-native-code-ios.md
  39. 34 20
      docs/ru/manuals/debugging-native-code.md
  40. 7 26
      docs/ru/manuals/dev-app.md
  41. 0 114
      docs/ru/manuals/editor-keyboard-shortcuts.md
  42. 69 4
      docs/ru/manuals/editor-preferences.md
  43. 441 92
      docs/ru/manuals/editor-scripts.md
  44. 96 184
      docs/ru/manuals/editor.md
  45. 1 6
      docs/ru/manuals/extender-docker-images.md
  46. 33 20
      docs/ru/manuals/extender-local-setup.md
  47. 80 76
      docs/ru/manuals/extensions-best-practices.md
  48. 0 155
      docs/ru/manuals/extensions-build-variants.md
  49. 2 4
      docs/ru/manuals/extensions-defold-sdk.md
  50. 0 57
      docs/ru/manuals/extensions-details.md
  51. 105 16
      docs/ru/manuals/extensions-manifest-merge-tool.md
  52. 7 42
      docs/ru/manuals/extensions.md
  53. 19 0
      docs/ru/manuals/factory.md
  54. 114 37
      docs/ru/manuals/file-access.md
  55. 9 4
      docs/ru/manuals/font.md
  56. 1 1
      docs/ru/manuals/glossary.md
  57. 9 7
      docs/ru/manuals/gui-clipping.md
  58. 87 17
      docs/ru/manuals/gui.md
  59. 0 10
      docs/ru/manuals/importing-graphics.md
  60. 28 39
      docs/ru/manuals/importing-models.md
  61. 24 2
      docs/ru/manuals/input-gamepads.md
  62. 0 1
      docs/ru/manuals/input.md
  63. 13 16
      docs/ru/manuals/lua.md
  64. 174 9
      docs/ru/manuals/material.md
  65. 23 18
      docs/ru/manuals/mesh.md
  66. 12 0
      docs/ru/manuals/networking.md
  67. 13 26
      docs/ru/manuals/nintendo-switch.md
  68. 18 0
      docs/ru/manuals/optimization-battery.md
  69. 28 0
      docs/ru/manuals/optimization-memory.md
  70. 100 0
      docs/ru/manuals/optimization-size.md
  71. 89 0
      docs/ru/manuals/optimization-speed.md
  72. 5 154
      docs/ru/manuals/optimization.md
  73. 2 0
      docs/ru/manuals/particlefx.md
  74. 1 0
      docs/ru/manuals/physics-joints.md
  75. 47 7
      docs/ru/manuals/physics-messages.md
  76. 12 0
      docs/ru/manuals/physics-objects.md
  77. 79 8
      docs/ru/manuals/physics-shapes.md
  78. 5 0
      docs/ru/manuals/physics.md
  79. 39 38
      docs/ru/manuals/profiling.md
  80. 396 218
      docs/ru/manuals/project-settings.md
  81. 114 18
      docs/ru/manuals/render.md
  82. 5 1
      docs/ru/manuals/resource.md
  83. 12 2
      docs/ru/manuals/script-properties.md
  84. 43 17
      docs/ru/manuals/script.md
  85. 265 3
      docs/ru/manuals/shader.md
  86. 4 0
      docs/ru/manuals/sound.md
  87. 67 5
      docs/ru/manuals/sprite.md
  88. 17 1
      docs/ru/manuals/tilemap.md
  89. 1 0
      docs/ru/manuals/working-offline.md
  90. 55 3
      docs/ru/manuals/writing-code.md
  91. 3 0
      docs/ru/shared/blend-modes.md
  92. 22 34
      docs/ru/shared/install.md
  93. 13 4
      docs/ru/shared/slice-9-texturing.md

+ 1 - 0
.wordlist.txt

@@ -290,6 +290,7 @@ OpenType
 OSX
 OTF
 particlefx
+particlefxs
 PEM
 performant
 Phaser

+ 14 - 0
docs/en/en.json

@@ -908,6 +908,20 @@
                 "description": "This course teaches you to build a farming RPG in Defold, covering player control, crop systems, day progression, sprite atlases, data management, and UI design. Basic Defold and Lua knowledge is needed. Gain skills for advanced and complex projects.",
                 "image": "/courses/images/zenva.png",
                 "author": "Zenva"
+            },
+            {
+                "path": "https://academy.zenva.com/product/defold-action-rpg-course/?utm_source=defold&utm_medium=partners&utm_campaign=defold&utm_content=defold-website",
+                "name": "Make a Fully-Fledged 2D Action RPG in Defold",
+                "description": "This course covers building a complete 2D action RPG in Defold, teaching core mechanics like player control, enemy AI, dynamic cameras, health bars, scene management, and spawning systems.",
+                "image": "/courses/images/zenva.png",
+                "author": "Zenva"
+            },
+            {
+                "path": "https://academy.zenva.com/product/defold-block-breaker-course/?utm_source=defold&utm_medium=partners&utm_campaign=defold&utm_content=defold-website",
+                "name": "Create a Block Breaker Game in Defold",
+                "description": "This course covers building a complete block breaker game in Defold, teaching physics-based gameplay, paddle and ball mechanics, and procedural block generation using scripting.",
+                "image": "/courses/images/zenva.png",
+                "author": "Zenva"
             }
         ],
         "resources": [

+ 3 - 3
docs/en/manuals/debugging-native-code-ios.md

@@ -83,13 +83,13 @@ You have a few options to debug an app
 
 1. Either choose `Debug` -> `Attach to process...` and select the app from there
 
-1. Or choose the `Attach to process by PID or Process name`
+2. Or choose the `Attach to process by PID or Process name`
 
 	![select_device](images/extensions/debugging/ios/attach_to_process_name.png)
 
-1. Start the app on the device
+3. Start the app on the device
 
-1. In `Edit Scheme` add the <AppName>.app folder as the executable
+4. In `Edit Scheme` add the <AppName>.app folder as the executable
 
 ### Debug symbols
 

+ 5 - 5
docs/en/manuals/debugging-native-code.md

@@ -102,13 +102,13 @@ You can [upload the debug symbols to Google Play](https://developer.android.com/
 	$ ls <project>/build/<platform>/[lib]dmengine[.exe|.so]
 ```
 
-1. Unzip to a folder:
+2. Unzip to a folder:
 
 ```sh
 	$ unzip dmengine.apk -d dmengine_1_2_105
 ```
 
-1. Find the callstack address
+3. Find the callstack address
 
 	E.g. in the non symbolicated callstack it could look like this
 
@@ -116,7 +116,7 @@ You can [upload the debug symbols to Google Play](https://developer.android.com/
 
 	Where *`00257224`* is the address
 
-1. Resolve the address
+4. Resolve the address
 
 ```sh
     $ arm-linux-androideabi-addr2line -C -f -e dmengine_1_2_105/lib/armeabi-v7a/libdmengine.so _address_
@@ -133,13 +133,13 @@ Note: If you get hold of a stack trace from the [Android logs](/manuals/debuggin
 	# it will produce a Contents/Resources/DWARF/dmengine
 ```
 
-1. If you're not using Native Extensions, download the vanilla symbols:
+2. If you're not using Native Extensions, download the vanilla symbols:
 
 ```sh
 	$ wget http://d.defold.com/archive/<sha1>/engine/arm64-darwin/dmengine.dSYM
 ```
 
-1. Symbolicate using load address
+3. Symbolicate using load address
 
 	For some reason, simply putting the address from the callstack doesn't work (i.e. load address 0x0)
 

+ 216 - 3
docs/en/manuals/editor-scripts.md

@@ -56,13 +56,17 @@ You can interact with the editor using `editor` package that defines this API:
   - for atlas animations: `images` (same as `images` in atlas)
   - for tilemaps: `layers` (list of editor nodes for layers in the tilemap)
   - for tilemap layers: `tiles` (an unbounded 2d grid of tiles), see `tilemap.tiles.*` for more info
+  - for particlefx: `emitters` (list of emitter editor nodes) and `modifiers` (list of modifier editor nodes)
+  - for particlefx emitters: `modifiers` (list of modifier editor nodes)
+  - for collision objects: `shapes` (list of collision shape editor nodes)
+  - for GUI files: `layers` (list of layer editor nodes)
   - some properties that are shown in the Properties view when you have selected something in the Outline view. These types of outline properties supported:
     - `strings`
     - `booleans`
     - `numbers`
     - `vec2`/`vec3`/`vec4`
     - `resources`
-
+    - `curves`
     Please note that some of these properties might be read-only, and some might be unavailable in different contexts, so you should use `editor.can_get` before reading them and `editor.can_set` before making editor set them. Hover over property name in Properties view to see a tooltip with information about how this property is named in editor scripts. You can set resource properties to `nil` by supplying `""` value.
 - `editor.can_get(node_id, property)` — check if you can get this property so `editor.get()` won't throw an error.
 - `editor.can_set(node_id, property)` — check if `editor.tx.set()` transaction step with this property won't throw an error.
@@ -123,16 +127,17 @@ return M
 Editor expects `get_commands()` to return an array of tables, each describing a separate command. Command description consists of:
 
 - `label` (required) — text on a menu item that will be displayed to the user
-- `locations` (required) — an array of either `"Edit"`, `"View"`, `"Project"`, `"Debug"`, `"Assets"`, `"Bundle"` or `"Outline"`, describes a place where this command should be available. `"Edit"`, `"View"`, `"Project"` and `"Debug"` mean menu bar at the top, `"Assets"` means context menu in Assets pane, `"Outline"` means context menu in Outline pane, and `"Bundle"` means **Project → Bundle** submenu.
+- `locations` (required) — an array of either `"Edit"`, `"View"`, `"Project"`, `"Debug"`, `"Assets"`, `"Bundle"`, `"Scene"` or `"Outline"`, describes a place where this command should be available. `"Edit"`, `"View"`, `"Project"` and `"Debug"` mean menu bar at the top, `"Assets"` means context menu in Assets pane, `"Outline"` means context menu in Outline pane, and `"Bundle"` means **Project → Bundle** submenu.
 - `query` — a way for command to ask editor for relevant information and define what data it operates on. For every key in `query` table there will be corresponding key in `opts` table that `active` and `run` callbacks receive as argument. Supported keys:
   - `selection` means this command is valid when there is something selected, and it operates on this selection.
     - `type` is a type of selected nodes command is interested in, currently these types are allowed:
       - `"resource"` — in Assets and Outline, resource is selected item that has a corresponding file. In menu bar (Edit or View), resource is a currently open file;
       - `"outline"` — something that can be shown in the Outline. In Outline it's a selected item, in menu bar it's a currently open file;
+      - `"scene"` — something that can be rendered to the Scene.
     - `cardinality` defines how many selected items there should be. If `"one"`, selection passed to command callback will be a single node id. If `"many"`, selection passed to command callback will be an array of one or more node ids.
   - `argument` — command argument. Currently, only commands in `"Bundle"` location receive an argument, which is `true` when the bundle command is selected explicitly and `false` on rebundle.
 - `id` - command identifier string, used e.g. for persisting the last used bundle command in `prefs`
-- `active` - a callback that is executed to check that command is active, expected to return boolean. If `locations` include `"Assets"` or `"Outline"`, `active` will be called when showing context menu. If locations include `"Edit"` or `"View"`, active will be called on every user interaction, such as typing on keyboard or clicking with mouse, so be sure that `active` is relatively fast.
+- `active` - a callback that is executed to check that command is active, expected to return boolean. If `locations` include `"Assets"`, `"Scene"` or `"Outline"`, `active` will be called when showing context menu. If locations include `"Edit"` or `"View"`, active will be called on every user interaction, such as typing on keyboard or clicking with mouse, so be sure that `active` is relatively fast.
 - `run` - a callback that is executed when user selects the menu item.
 
 ### Use commands to change the in-memory editor state
@@ -269,6 +274,214 @@ editor.transact({
 })
 ```
 
+#### Editing particlefx
+
+You can edit particlefx using `modifiers` and `emitters` properties. For example, adding a circle emitter with acceleration modifier is done like this:
+```lua
+editor.transact({
+    editor.tx.add("/fire.particlefx", "emitters", {
+        type = "emitter-type-circle",
+        modifiers = {
+          {type = "modifier-type-acceleration"}
+        }
+    })
+})
+```
+Many particlefx properties are curves or curve spreads (i.e. curve + some randomizer value). Curves are represented as a table with a non-empty list of `points`, where each point is a table with the following properties:
+- `x` - the x coordinate of the point, should start at 0 and end at 1
+- `y` - the value of the point
+- `tx` (0 to 1) and `ty` (-1 to 1) - tangents of the point. E.g., for an 80-degree angle, `tx` should be `math.cos(math.rad(80))` and `ty` should be `math.sin(math.rad(80))`.
+Curve spreads additionally have a `spread` number property. 
+
+For example, setting a particle lifetime alpha curve for an already existing emitter might look like this:
+```lua
+local emitter = editor.get("/fire.particlefx", "emitters")[1]
+editor.transact({
+    editor.tx.set(emitter, "particle_key_alpha", { points = {
+        {x = 0,   y = 0, tx = 0.1, ty = 1}, -- start at 0, go up quickly
+        {x = 0.2, y = 1, tx = 1,   ty = 0}, -- reach 1 at 20% of a lifetime
+        {x = 1,   y = 0, tx = 1,   ty = 0}  -- slowly go down to 0
+    }})
+})
+```
+Of course, it's also possible to use the `particle_key_alpha` key in a table when creating an emitter. Additionally, you can use a single number instead to represent a "static" curve.
+
+#### Editing collision objects
+
+In addition to default outline properties, collision objects define `shapes` node list property. Adding new collision shapes is done like this:
+```lua
+editor.transact({
+    editor.tx.add("/hero.collisionobject", "shapes", {
+        type = "shape-type-box" -- or "shape-type-sphere", "shape-type-capsule"
+    })
+})
+```
+Shape's `type` property is required during creation and cannot be changed after the shape is added. There are 3 shape types:
+- `shape-type-box` - box shape with `dimensions` property
+- `shape-type-sphere` - sphere shape with `diameter` property
+- `shape-type-capsule` - capsule shape with `diameter` and `height` properties
+
+#### Editing GUI files
+
+In addition to outline properties, GUI nodes defines the following properties:
+- `layers` — list of layer editor nodes (reorderable)
+- `materials` — list of material editor nodes
+
+It's possible to edit GUI layers using editor `layers` property, e.g.:
+```lua
+editor.transact({
+    editor.tx.add("/main.gui", "layers", {name = "foreground"}),
+    editor.tx.add("/main.gui", "layers", {name = "background"})
+})
+```
+Additionally, it's possible to reorder layers:
+```lua
+local fg, bg = table.unpack(editor.get("/main.gui", "layers"))
+editor.transact({
+    editor.tx.reorder("/main.gui", "layers", {bg, fg})
+})
+```
+Similarly, fonts, materials, textures, and particlefxs are edited using `fonts`, `materials`, `textures`, and `particlefxs` properties:
+```lua
+editor.transact({
+    editor.tx.add("/main.gui", "fonts", {font = "/main.font"}),
+    editor.tx.add("/main.gui", "materials", {name = "shine", material = "/shine.material"}),
+    editor.tx.add("/main.gui", "particlefxs", {particlefx = "/confetti.material"}),
+    editor.tx.add("/main.gui", "textures", {texture = "/ui.atlas"})
+})
+```
+These properties don't support reordering.
+
+Finally, you can edit GUI nodes using `nodes` list property, e.g.:
+```lua
+editor.transact({
+    editor.tx.add("/main.gui", "nodes", {
+        type = "gui-node-type-box",
+        position = {20, 20, 20}
+    }),
+    editor.tx.add("/main.gui", "nodes", {
+        type = "gui-node-type-template",
+        template = "/button.gui"
+    }),
+})
+```
+Built-in node types are:
+- `gui-node-type-box`
+- `gui-node-type-particlefx`
+- `gui-node-type-pie`
+- `gui-node-type-template`
+- `gui-node-type-text`
+
+If you are using spine extension, you can also use `gui-node-type-spine` node type.
+
+If the GUI file defines layouts, you can get and set the values from layouts using `layout:property` syntax, e.g.:
+```lua
+local node = editor.get("/main.gui", "nodes")[1]
+
+-- GET:
+local position = editor.get(node, "position")
+pprint(position) -- {20, 20, 20}
+local landscape_position = editor.get(node, "Landscape:position")
+pprint(landscape_position) -- {20, 20, 20}
+
+-- SET:
+editor.transact({
+    editor.tx.set(node, "Landscape:position", {30, 30, 30})
+})
+pprint(editor.get(node, "Landscape:position")) -- {30, 30, 30}
+```
+
+Layout properties that were set can be reset to their default values using `editor.tx.reset`:
+```lua
+print(editor.can_reset(node, "Landscape:position")) -- true
+editor.transact({
+    editor.tx.reset(node, "Landscape:position")
+})
+```
+Template node trees can be read, but not edited — you can only set node properties of the template node tree:
+```lua
+local template = editor.get("/main.gui", "nodes")[2]
+print(editor.can_add(template, "nodes")) -- false
+local node_in_template = editor.get(template, "nodes")[1]
+editor.transact({
+    editor.tx.set(node_in_template, "text", "Button text")
+})
+print(editor.can_reset(node_in_template, "text")) -- true (overrides a value in the template)
+```
+
+#### Editing game objects
+
+It's possible to edit components of a game object file using editor scripts. The components come in 2 flavors: referenced and embedded. Referenced components use type `component-reference` and act as references to other resources, only allowing overrides of go properties defined in scripts. Embedded components use types like `sprite`, `label`, etc., and allow editing of all properties defined in the component type, as well as adding sub-components like shapes of collision objects. For example, you can use the following code to set up a game object:
+```lua
+editor.transact({
+    editor.tx.add("/npc.go", "components", {
+        type = "sprite",
+        id = "view"
+    }),
+    editor.tx.add("/npc.go", "components", {
+        type = "collisionobject",
+        id = "collision",
+        shapes = {
+            {
+                type = "shape-type-box",
+                dimensions = {32, 32, 32}
+            }
+        }
+    }),
+    editor.tx.add("/npc.go", "components", {
+        type = "component-reference",
+        path = "/npc.script"
+        id = "controller",
+        __hp = 100 -- set a go property defined in the script
+    })
+})
+```
+
+#### Editing collections
+It's possible to edit collections using editor scripts. You can add game objects (embedded or referenced) and collections (referenced). For example:
+```lua
+local coll = "/char.collection"
+editor.transact({
+    editor.tx.add(coll, "children", {
+        -- embbedded game object
+        type = "go",
+        id = "root",
+        children = {
+            {
+                -- referenced game object
+                type = "go-reference",
+                path = "/char-view.go"
+                id = "view"
+            },
+            {
+                -- referenced collection
+                type = "collection-reference",
+                path = "/body-attachments.collection"
+                id = "attachments"
+            }
+        },
+        -- embedded gos can also have components
+        components = {
+            {
+                type = "collisionobject",
+                id = "collision",
+                shapes = {
+                    {type = "shape-type-box", dimensions = {2.5, 2.5, 2.5}}
+                }
+            },
+            {
+                type = "component-reference",
+                id = "controller",
+                path = "/char.script",
+                __hp = 100 -- set a go property defined in the script
+            }
+        }
+    })
+})
+```
+
+Like in the editor, referenced collections can only be added to the root of the edited collection, and game objects can only be added to embedded or referenced game objects, but not to referenced collections or game objects within these referenced collections.
+
 ### Use shell commands
 
 Inside the `run` handler, you can write to files (using `io` module) and execute shell commands (using `editor.execute()` command). When executing shell commands, it's possible to capture the output of a shell command as a string and then use it in code. For example, if you want to make a command for formatting JSON that shells out to globally installed [`jq`](https://jqlang.github.io/jq/), you can write the following command:

+ 1 - 1
docs/en/manuals/extender-local-setup.md

@@ -72,7 +72,7 @@ Once you have the above mentioned software installed follow these steps to insta
     cp ${TMP_DIR}/$(ls ${TMP_DIR} | grep server-${EXTENDER_VERSION}.jar) ${APPLICATION_DIR}/extender.jar
     cp ${TMP_DIR}/$(ls ${TMP_DIR} | grep manifestmergetool-${MANIFESTMERGETOOL_VERSION}.jar) ${APPLICATION_DIR}/manifestmergetool.jar
    ```
-7. __Start the server__ - We can now start the server by running the docker compose main command:
+6. __Start the server__ - We can now start the server by running the docker compose main command:
 ```sh
 docker compose -p extender -f server/docker/docker-compose.yml --profile <profile> up
 ```

+ 0 - 1
docs/en/manuals/factory.md

@@ -263,7 +263,6 @@ The project setting *max_instances* in *Collection related settings* limits the
 
 If you set *max_instances* to 1024 and have 24 manually placed game objects in your main collection, you can spawn an additional 1000 game objects. As soon as you delete a game object, you are free to spawn another instance.
 
-
 ## Pooling of game objects
 
 It may seem like a good idea to save spawned game objects in a pool and reuse them. However, the engine is already doing object pooling under the hood so additional overhead will only slow things down. It is both faster and cleaner to delete game objects and spawn new ones.

+ 0 - 2
docs/en/manuals/gui.md

@@ -120,11 +120,9 @@ function init(self)
 
   -- get the new texture file assigned to the texture with id 'theme'
   print(go.get("#gui", "textures", { key = "theme" })) -- /assets/mytheme.atlas
-
 end
 ```
 
-
 ## Dependencies
 
 The resource tree in a Defold game is static so any dependencies that you need for your GUI nodes need to be added to the component. The *Outline* groups all dependencies by type under "folders":

+ 3 - 0
docs/en/manuals/html5.md

@@ -191,6 +191,9 @@ DEFOLD_HEAP_SIZE
 DEFOLD_ENGINE_ARGUMENTS
 : Engine arguments specified in *game.project* `html5.engine_arguments` separated by `,` symbol.
 
+build-timestamp
+: Current build timestamp in seconds.
+
 
 ## Extra parameters
 

+ 1 - 1
docs/en/manuals/importing-graphics.md

@@ -70,4 +70,4 @@ Learn more about particle effects in the [Particle fx manual](/manuals/particlef
 
   ![gui](images/graphics/gui.png)
 
-Learn more about GUIs in the [GUI manual](/manuals/gui).
+Learn more about GUIs in the [GUI manual](/manuals/gui).

+ 0 - 5
docs/en/manuals/importing-models.md

@@ -8,13 +8,11 @@ Defold currently support models, skeletons and animations in GL Transmission For
 
 ![Model in Blender](images/model/blender.png)
 
-
 ## Importing to Defold
 To import the model, simply drag and drop the *.gltf* file or *.dae* file and the corresponding texture image into the *Assets Pane* somewhere.
 
 ![Imported model assets](images/model/assets.png)
 
-
 ## Using a model
 Once you have the model imported into Defold you can use it in a [Model component](/manuals/model).
 
@@ -34,7 +32,6 @@ Defold imposes some limitations on exported animation data:
 
 * Animation clips in Collada are not supported. To use multiple animations per model, export them into separate *.dae* files and gather the files into an *.animationset* file in Defold.
 
-
 ### Requirements
 When you export a model it's good to know that we don't yet support all features.
 Currently known issues/not supported features from the glTF format:
@@ -63,9 +60,7 @@ You can then proceed to export the UV layout to an image that can be used as a t
 
 ![Export UV layout result](images/model/blender_export_uv_layout_result.png)
 
-
 ### Exporting using Blender
 You export your model using the Export menu option. Select the model before you select the Export menu option and check "Selection Only" to only export the model.
 
 ![Exporting using Blender](images/model/blender_export.png)
-

+ 0 - 2
docs/en/manuals/mesh.md

@@ -86,7 +86,6 @@ resource.set_buffer(res, buf)
 
 Refer to the [forum announcement post for more information](https://forum.defold.com/t/mesh-component-in-defold-1-2-169-beta/65137) on how to use the Mesh component, including sample projects and code snippets.
 
-
 ## Frustum culling
 
 Mesh components are not automatically culled due to their dynamic nature and the fact that it is not possible to know for sure how the positional data is encoded. In order to cull a mesh the axis-aligned bounding box of the mesh needs to be set as meta data on the buffer using 6 floats (AABB min/max):
@@ -95,7 +94,6 @@ Mesh components are not automatically culled due to their dynamic nature and the
 buffer.set_metadata(buf, hash("AABB"), { 0, 0, 0, 1, 1, 1 }, buffer.VALUE_TYPE_FLOAT32)
 ```
 
-
 ## Material constants
 
 {% include shared/material-constants.md component='mesh' variable='tint' %}

+ 0 - 1
docs/en/manuals/optimization-battery.md

@@ -11,7 +11,6 @@ Refer to the manuals on how to [optimize runtime performance](/manuals/optimizat
 ## Disable accelerometer
 If you are creating a mobile game which doesn't make use of the device accelerometer it is recommended to [disable it in *game.project*](/manuals/project-settings/#use-accelerometer) to reduce the number of generated input events.
 
-
 # Platform specific optimizations
 
 ## Android Device Performance Framework

+ 0 - 6
docs/en/manuals/optimization-size.md

@@ -21,7 +21,6 @@ Facebook has a recommendation that a Facebook Instant Game should start in less
 
 Playable ads are usually limited to between 2 and 5 MB depending on the ad network.
 
-
 ## Size optimization strategies
 You can optimize the application size in two ways; by reducing the size of the engine and/or by reducing the size of the game assets.
 
@@ -31,7 +30,6 @@ To get a better understanding of what makes up the size of your application you
 Defold will create a dependency tree when building and bundling your application. The build system will start from the bootstrap collection specified in the *game.project* file and inspect every referenced collection, game object and component to build a list of the assets that are in use. It is only these assets that will get included in the final application bundle. Anything not directly referenced will get excluded. While it is good to know that unused assets will not be included you as a developer still needs to consider what goes into the final application and the size of the individual assets and the total size of the application bundle. 
 :::
 
-
 ## Optimize engine size
 A quick way to reduce the engine size is to remove functionality in the engine that you do not use. This is done [application manifest file](https://defold.com/manuals/app-manifest/) where it is possible to remove engine components that you do not need. Examples:
 
@@ -40,7 +38,6 @@ A quick way to reduce the engine size is to remove functionality in the engine t
 * Image loaded - If your game does not manually load and decode images using `image.load()`
 * BasisU - If your game has few textures, compare the build size without BasisU (removed via app manifest) and without texture compression versus a build with BasisU and compressed textures. For games with limited textures, it might be more beneficial to reduce the binary size and skip texture compression. Additionally, not using the transcoder can lower the amount of memory required to run your game.
 
-
 ## Optimize asset size
 The biggest wins in terms of asset size optimizations are usually gained by reducing the size of sounds and textures.
 
@@ -88,14 +85,11 @@ You can read more about how to optimize and manage textures in [this forum post]
 ### Optimize fonts
 The size of your fonts will be smaller if you specify what symbols you are going to use and set this in [Characters](/manuals/font/#properties) instead of using the All Chars checkbox.
 
-
 ### Exclude content for download on demand
 Another way of reducing initial application size is to exclude parts of the game content from the application bundle and download it on demand. Defold provides a system called Live Update for excluding content for download on demand.
 
 Excluded content can be anything from entire levels to unlockable characters, skins, weapons or vehicles. If your game has a lot of content, organize the loading process so that the bootstrap collection and the first level collection include the bare minimum resources required for that level. You achieve this by using collection proxies or factories with the "Exclude" checkbox enabled. Split resources according to the player's progress. This approach ensures efficient resource loading and keeps initial memory usage low. Learn more in the [Live Update manual](/manuals/live-update/).
 
-
-
 ## Android specific size optimizations
 Android builds must support both 32-bit and 64-bit CPU architectures. When you [bundle for Android](/manuals/android) you can specify which CPU architectures to include:
 

+ 4 - 5
docs/en/manuals/optimization-speed.md

@@ -18,7 +18,7 @@ If you create loads of short lived objects such as Lua tables every frame this w
 ### Prehash message and action ids
 If you do a lot of message handling or have many input events to deal with it is recommended to prehash the strings. Consider this piece of code:
 
-```
+```lua
 function on_message(self, message_id, message, sender)
     if message_id == hash("message1") then
         msg.post(sender, hash("message3"))
@@ -30,7 +30,7 @@ end
 
 In the above scenario the hashed string would be recreated every time a message is received. This can be improved by creating the hashed strings once and use the hashed versions when handling messages:
 
-```
+```lua
 local MESSAGE1 = hash("message1")
 local MESSAGE2 = hash("message2")
 local MESSAGE3 = hash("message3")
@@ -48,7 +48,7 @@ end
 ### Prefer and cache URLs
 Message passing or in other ways addressing a game object or component can be done both by providing an id as a string or hash or as a URL. If a string or hash is used it will internally be translated into a URL. It is therefore recommended to cache URLs that are used often, to get the best possible performance out of the system. Consider the following:
 
-```
+```lua
     local pos = go.get_position("enemy")
     local pos = go.get_position(hash("enemy"))
     local pos = go.get_position(msg.url("enemy"))
@@ -57,7 +57,7 @@ Message passing or in other ways addressing a game object or component can be do
 
 In all three cases the position of a game object with id `enemy` would be retrieved. In the first and second case the id (string or hash) would be converted into a URL before being used. This tells us that it's better to cache URLs and use the cached version for the best possible performance:
 
-```
+```lua
     function init(self)
         self.enemy_url = msg.url("enemy")
     end
@@ -83,7 +83,6 @@ Reducing the scene graph complexity is needed if the profiler shows high values
 ## Frustum culling
 The render script can automatically ignore rendering of game object component that are outside of a defined bounding box (frustum). Learn more about Frustum Culling in the [Render Pipeline manual](/manuals/render/#frustum-culling).
 
-
 # Platform specific optimizations
 
 ## Android Device Performance Framework

+ 0 - 2
docs/en/manuals/physics-shapes.md

@@ -101,7 +101,6 @@ There are a number of different external tools that can be used to create collis
 # Scaling collision shapes
 The collision object and its shapes inherit the scale of the game object. To disable this behaviour uncheck the [Allow Dynamic Transforms](/manuals/project-settings/#allow-dynamic-transforms) checkbox in the Physics section of *game.project*. Note that only uniform scaling is supported and that the smallest scale value will be used if the scale isn't uniform.
 
-
 # Resizing collision shapes
 The shapes of a collision object can be resized at runtime using `physics.set_shape()`. Example:
 
@@ -133,7 +132,6 @@ physics.set_shape("#collisionobject", "my_box_shape", box_data)
 A shape of the correct type with the specified id must already exist on the collision object.
 :::
 
-
 # Rotating collision shapes
 
 ## Rotating collision shapes in 3D physics

+ 21 - 4
docs/en/manuals/shader.md

@@ -281,10 +281,6 @@ Shaders in Defold support including source code from files within the project th
 #include "../root-level-snippet.glsl"
 ```
 
-::: sidenote
-Shader includes are available starting from version 1.4.2
-:::
-
 There are some caveats to how includes are picked up:
 
   - Files must be project relative, meaning that you can only include files that are located within the project. Any absolute path must be specified with a leading `/`
@@ -340,6 +336,27 @@ vec3 get_red_color_inverted()
 }
 ```
 
+## Editor-specific shader code
+
+When shaders are rendered in the Defold Editor viewport, a preprocessor definition `EDITOR` is available. This allows you to write shader code that behaves differently when running in the editor versus when running in the actual game engine.
+
+This is particularly useful for:
+  - Adding debug visualizations that should only appear in the editor.
+  - Implementing editor-specific features like wireframe modes or material previews.
+  - Providing fallback rendering for materials that might not work properly in the editor viewport.
+
+Use the `#ifdef EDITOR` preprocessor directive to conditionally compile code that should only run in the editor:
+
+```glsl
+#ifdef EDITOR
+    // This code will only execute when the shader is rendered in the Defold Editor
+    color_out = vec4(1.0, 0.0, 1.0, 1.0); // Magenta color for editor preview
+#else
+    // This code will execute when running in the game
+    color_out = texture(texture_sampler, var_texcoord0) * tint_pm;
+#endif
+```
+
 ## The rendering process
 
 Before ending up on the screen, the data that you create for your game goes through a series of steps:

+ 40 - 8
docs/en/manuals/sound-streaming.md

@@ -38,23 +38,29 @@ The web server you're loading content from has to support [HTTP range requests](
 :::
 
 ```lua
+local function play_sound(self, hash)
+    go.set(self.component, "sound", hash) -- override the resource data on the component
+    sound.play(self.component)            -- start playing the sound
+end
+
 local function parse_range(s)
     local _, _, rstart, rend, size = string.find(s, "(%d+)-(%d+)/(%d+)") -- "bytes 0-16383/103277"
     return rstart, rend, size
 end
 
+-- Callback for the http response.
 local function http_result(self, _id, response, extra)
     if response.status == 200 or response.status == 206 then
+        -- Successful request
         local relative_path = self.filename
         local range = response.headers['content-range'] -- content-range = "bytes 0-16383/103277"
         local rstart, rend, filesize = parse_range(range)
-
-        -- Create the Defold resource, "partial" will enable the streaming mode
+        -- Create the Defold resource
+        --   "partial" will enable the streaming mode
         print("Creating resource", relative_path)
         local hash = resource.create_sound_data(relative_path, { data = response.response, filesize = filesize, partial = true })
-
-        go.set(self.component, "sound", hash) -- override the resource data on the component
-        sound.play(self.component) -- start the playing
+        -- send "play_sound" to the component
+        play_sound(self, hash)
     end
 end
 
@@ -69,10 +75,36 @@ end
 
 ## Resource providers
 
-You can of course use other means to load the initial chunk of the sound file. The important thing to remember is that the rest of the chunks are loaded from the resource system and it's resource providers.
+You can use other means to load the initial chunk of the sound file. The important thing to remember is that the rest of the chunks are loaded from the resource system and its resource providers. In this example, we add a new (http) file provider by adding a live update mount, by calling using [liveupdate.add_mount()](/ref/liveupdate/#liveupdate.add_mount).
+
+You can find a working example in [https://github.com/defold/example-sound-streaming](https://github.com/defold/example-sound-streaming).
+
+```lua
+-- See http_result() from above example
+
+local function load_web_sound(base_url, relative_path)
+    local url = base_url .. "/" .. relative_path
+    local headers = {}
+    -- Request the initial part of the file
+    headers['Range'] = string.format("bytes=%d-%d", 0, 16384-1)
+
+    http.request(url, "GET", http_result, headers, nil, { ignore_cache = true })
+end
+
+function init(self)
+    self.base_url = "http://my.server.com"
+    self.filename = "/path/to/sound.ogg"
 
-In this example, we have added a new file provider by adding a live update mount, by calling using [liveupdate.add_mount()](/ref/liveupdate/#liveupdate.add_mount).
+    liveupdate.add_mount("webmount", self.base_url, 100, function ()
+                    -- once the mount is ready, we can start our request for downloading the first chunk
+                    load_web_sound(self.base_url, self.filename)
+                end)
+end
 
+function final(self)
+    liveupdate.remove_mount("webmount")
+end
+```
 
 ## Sound chunk cache
 
@@ -84,4 +116,4 @@ You can also control the size of each sound chunk by changing the [`sound.stream
 
 ::: important
 The total size of the sound chunk cache should be larger than the number of loaded sound files times the stream chunk size. Otherwise, you risk evicting new chunks each frame and sounds won't play properly
-:::
+:::

+ 0 - 4
docs/en/manuals/sprite.md

@@ -81,10 +81,6 @@ The attributes specified in the material will show up as regular properties in t
 
 ![sprite-attributes](../images/graphics/sprite-attributes.png)
 
-::: sidenote
-Custom attributes are available starting from Defold 1.4.8!
-:::
-
 ## Project configuration
 
 The *game.project* file has a few [project settings](/manuals/project-settings#sprite) related to sprites.

+ 1 - 1
docs/en/manuals/writing-code.md

@@ -13,7 +13,7 @@ Defold uses Lua 5.1 and LuaJIT (depending on target platform) and you need to fo
 
 ## Using other languages that transpile to Lua
 
-Starting from version 1.8.1, Defold supports the use of transpilers that emit Lua code. With transpiler extension installed, you can use alternative languages — such as [Teal](https://github.com/defold/extension-teal) — to write statically-checked Lua. It is a preview feature that has limitations: current transpiler support does not expose the information about modules and functions defined in the Defold Lua runtime. It means that using Defold APIs like `go.animate` will require you to write external definitions yourself.
+Defold supports the use of transpilers that emit Lua code. With transpiler extension installed, you can use alternative languages — such as [Teal](https://github.com/defold/extension-teal) — to write statically-checked Lua. It is a preview feature that has limitations: current transpiler support does not expose the information about modules and functions defined in the Defold Lua runtime. It means that using Defold APIs like `go.animate` will require you to write external definitions yourself.
 
 ## Writing native code
 

+ 6 - 0
docs/ru/manuals/adapting-graphics-to-screen-size.md

@@ -46,6 +46,12 @@ brief: В этом руководстве объясняется, как ада
 msg.post("@render:", "use_fixed_projection", { zoom = 4 })
 ```
 
+::: sidenote
+Тот же результат можно получить, прикрепив [компонент Камера](/manuals/camera/) к игровому объекту, установив *Ортографическая проекция* и задав *Ортографическое увеличение* со значением 4.0:
+
+![](images/screen_size/retro-camera_zoom.png)
+:::
+
 Это даст нам следующий результат:
 
 ![](images/screen_size/retro-zoomed_1280x800.png)

+ 7 - 7
docs/ru/manuals/ads.md

@@ -17,19 +17,19 @@ CPM = стоимость за тысячу. Сумма, которую рекл
 
 ## Виды рекламы
 
-Существует множество различных видов рекламы, которые можно использовать в играх. Некоторые из наиболее распространенных - баннерная реклама, интерстициальная реклама и реклама с вознаграждением:
+Существует множество различных форматов рекламы, которые можно использовать в играх. Некоторые из наиболее распространённых — это баннерная реклама, межстраничная реклама и реклама с вознаграждением:
 
-### Межстраничная реклама
+### Баннерная реклама
 
-Межстраничная реклама основана на тексте, изображении или видео и занимает относительно небольшую часть экрана, обычно в верхней или нижней его части. Баннерную рекламу очень легко реализовать, и она очень хорошо подходит для казуальных одноэкранных игр, где легко зарезервировать область экрана для рекламы. Баннерная реклама максимально увеличивает экспозицию, пока пользователи играют в вашу игру без перерыва.
+Баннерная реклама может быть основана на тексте, изображении или видео и занимает относительно небольшую часть экрана, обычно в верхней или нижней его части. Баннерную рекламу очень легко реализовать, и она отлично подходит для казуальных игр с одним экраном, где легко зарезервировать область экрана для показа рекламы. Баннеры обеспечивают максимальную экспозицию, пока пользователи продолжают играть без перерыва.
 
-### Интерстициальная реклама
+### Межстраничная реклама
 
-Интерстициальная реклама - это большие полноэкранные объявления с анимацией, а иногда и интерактивным медиаконтентом. Интерстициальная реклама обычно показывается между уровнями или игровыми сессиями, поскольку это естественный перерыв в игровом процессе. Интерстициальная реклама обычно генерирует меньше просмотров, чем баннерная реклама, но ее стоимость (CPM) намного выше, чем у баннерной рекламы, что приводит к значительному общему доходу от рекламы.
+Межстраничная реклама представляет собой полноэкранные объявления с анимацией, а иногда и с интерактивным мультимедийным контентом. Такие объявления, как правило, показываются между уровнями или игровыми сессиями, так как это естественная пауза в игровом процессе. Межстраничная реклама обычно набирает меньше просмотров по сравнению с баннерной, но её стоимость (CPM) значительно выше, что в итоге приносит значительный доход от рекламы.
 
-### Вознаграждаемая реклама
+### Реклама с вознаграждением
 
-Вознаграждаемая реклама (также известная как стимулирующая реклама) является необязательной и поэтому менее навязчивой, чем многие другие виды рекламы. Вознаграждаемая реклама, как правило, представляет собой полноэкранную рекламу, подобную интерстициальной рекламе. Пользователь может выбрать вознаграждение в обмен на просмотр рекламы - например, добычу, монеты, жизни, время или другую внутриигровую валюту или выгоду. Реклама с вознаграждением обычно имеет самую высокую стоимость (CPM), но количество просмотров напрямую зависит от количества пользователей. Вознаграждаемые объявления будут иметь высокую эффективность только в том случае, если вознаграждение достаточно ценно и предлагается в нужное время.
+Реклама с вознаграждением (также известная как стимулирующая реклама) является необязательной и поэтому менее навязчива, чем многие другие формы рекламы. Как правило, это полноэкранная реклама, аналогичная межстраничной. Пользователь может получить вознаграждение за просмотр рекламы — например, добычу, монеты, жизни, время или другую внутриигровую валюту или бонус. Реклама с вознаграждением обычно имеет наивысшую стоимость (CPM), но количество просмотров напрямую зависит от числа пользователей, согласившихся её посмотреть. Такая реклама будет эффективна только в случае, если награда достаточно ценна и предлагается в подходящий момент.
 
 
 ## Рекламные сети

+ 12 - 62
docs/ru/manuals/android.md

@@ -64,13 +64,23 @@ Defold поддерживает создание файлов APK и AAB. Выб
 
 Файл *.apk* можно скопировать на устройство с помощью инструмента `adb` (см. ниже) или в Google Play через [консоль разработчика Google Play](https://play.google.com/apps/publish/).
 
+:[Android ADB](../shared/android-adb.md)
+
 ```
 $ adb install Defold\ examples.apk
 4826 КБ/с (18774344 байта за 3,798 с)
   pkg: /data/local/tmp/my_app.apk
-Успех
+Success
 ```
 
+#### Установка APK с использованием редактора
+
+Вы можете установить и запустить файл *`.apk`*, используя опции редактора "Install on connected device" и "Launch installed app" в диалоговом окне создания пакета:
+
+![Установка и запуск APK](images/android/install_and_launch.png)
+
+Для работы этой функции необходимо, чтобы ADB был установлен, а на подключенном устройстве была включена *USB-отладка*. Если редактор не может определить расположение команды ADB, необходимо указать путь к ADB в разделе [Preferences](/manuals/editor-preferences/#tools).
+
 #### Установка AAB
 
 Файл *.aab* можно загрузить в Google Play через [консоль разработчика Google Play](https://play.google.com/apps/publish/). Также можно сгенерировать *.apk* файл из *.aab* файла для локальной установки с помощью [Android bundletool](https://developer.android.com/studio/command-line/bundletool).
@@ -82,72 +92,12 @@ $ adb install Defold\ examples.apk
 ### android.permission.INTERNET и android.permission.ACCESS_NETWORK_STATE (Уровень защиты: нормальный)
 Позволяет приложениям открывать сетевые сокеты и получать доступ к информации о сетях. Эти разрешения необходимы для доступа в Интернет. ([Android official docs](https://developer.android.com/reference/android/Manifest.permission#INTERNET)) и ([Android official docs](https://developer.android.com/reference/android/Manifest.permission#ACCESS_NETWORK_STATE)).
 
-### android.permission.WRITE_EXTERNAL_STORAGE (Уровень защиты: опасный)
-Позволяет приложению записывать данные во внешнее хранилище. Начиная с уровня API 19, это разрешение не требуется для чтения/записи файлов в специфических для вашего приложения каталогах, возвращаемых Context.getExternalFilesDir(String) и Context.getExternalCacheDir(). Это разрешение необходимо, если вы собираетесь сохранять/загружать файлы с диска (используя io.* или sys.save/load) за пределами папки, указанной [sys.get_save_file()](/ref/sys/#sys.get_save_file:application_id-file_name) и имеете `android:minSdkVersion`, установленный уровень менее 19 в манифесте Android. ([Официальные документы Android](https://developer.android.com/reference/android/Manifest.permission#WRITE_EXTERNAL_STORAGE)).
-
 ### android.permission.WAKE_LOCK (Уровень защиты: нормальный)
 Позволяет использовать блокировку PowerManager WakeLocks для предотвращения засыпания процессора или затемнения экрана. Это разрешение необходимо для временного предотвращения засыпания устройства при получении push-уведомления. ([Официальные документы Android](https://developer.android.com/reference/android/Manifest.permission#WAKE_LOCK))
 
-## Android Debug Bridge
-
-Инструмент командной строки `adb` - это простая в использовании и универсальная программа, которая используется для взаимодействия с устройствами Android. Вы можете загрузить и установить `adb` как часть Android SDK Platform-Tools, для Mac, Linux или Windows.
-
-Загрузите Android SDK Platform-Tools с сайта: https://developer.android.com/studio/releases/platform-tools. Вы найдете инструмент *adb* в */platform-tools/*. Также, пакеты для конкретной платформы можно установить через соответствующие менеджеры пакетов.
-
-Ubuntu Linux:
-
-```
-$ sudo apt-get install android-tools-adb
-```
-
-Fedora 18/19:
-
-```
-$ sudo yum install android-tools
-```
-
-macOS (Homebrew)
-
-```
-$ brew cask install android-platform-tools
-```
-
-Вы можете убедиться, что `adb` работает, подключив устройство Android к компьютеру через USB и выполнив следующую команду:
-
-```
-$ adb devices
-List of devices attached
-31002535c90ef000    device
-```
-
-Если устройство не отображается, убедитесь, что на устройстве Android включена *USB-отладка*. Откройте *Настройки* устройства и найдите *Опции разработчика* (или *Разработка*).
-
-![Включите отладку USB](images/android/usb_debugging.png)
-
-## Отладка пакета приложений
-
-Пакет, собранный в режиме отладки (т.е. "Debug" выбран в качестве варианта при сборке), будет отправлять весь свой консольный вывод в системный журнал Android. Получите доступ к журналу с помощью инструмента `adb` и дайте команду `logcat`. Возможно, вы захотите отфильтровать вывод по тегу (`-s [tagname]`):
-
-```
-$ adb logcat -s "defold"
---------- beginning of /dev/log/system
---------- beginning of /dev/log/main
-I/defold  ( 6210): INFO:DLIB: SSDP started (ssdp://192.168.0.97:58089, http://0.0.0.0:38637)
-I/defold  ( 6210): INFO:ENGINE: Defold Engine 1.2.50 (8d1b912)
-I/defold  ( 6210): INFO:ENGINE: Loading data from:
-I/defold  ( 6210): INFO:ENGINE: Initialised sound device 'default'
-I/defold  ( 6210):
-D/defold  ( 6210): DEBUG:SCRIPT: Hello there, log!
-...
-```
-
 
 ## Использование AndroidX
-AndroidX - это значительное улучшение оригинальной библиотеки поддержки Android, которая больше не поддерживается. Пакеты AndroidX полностью заменяют библиотеку поддержки, предоставляя паритет возможностей и новые библиотеки. Большинство расширений Android на [портале ассетов](/assets) поддерживают AndroidX. Если вы не хотите использовать AndroidX, вы можете отключить его в пользу старой библиотеки поддержки Android:
-
-1. Если у вас уже есть манифест приложения, добавьте `jetifier: false` в `armv7-android` и `arm64-android`.
-
-2. Если у вас нет файла манифеста приложения, перейдите по ссылке [Defold App Manifest generator](https://britzl.github.io/manifestation/) и установите флажок "Use Android Support lib".
+AndroidX — это значительное улучшение по сравнению с оригинальной Android Support Library, которая больше не поддерживается. Пакеты AndroidX полностью заменяют библиотеку поддержки, обеспечивая тот же функционал и предлагая новые библиотеки. Большинство Android-расширений на [портале ассетов](/assets) поддерживают AndroidX. Если вы не хотите использовать AndroidX, вы можете явно отключить его в пользу старой библиотеки поддержки Android, установив флажок `Use Android Support Lib` в [манифесте приложения](https://defold.com/manuals/app-manifest/).
 
 ![](images/android/enable_supportlibrary.png)
 

+ 5 - 0
docs/ru/manuals/animation.md

@@ -10,3 +10,8 @@ Defold имеет встроенную поддержку нескольких 
 * [Мултикадровая анимация](/manuals/flipbook-animation) --- Последовательное воспроизведение серии статичных изображений
 * [Модельная анимация](/manuals/model-animation) --- Проигрывание анимации 3D-моделей
 * [Анимация свойств](/manuals/property-animation) --- Анимация свойств, таких как положение, масштаб, углы поворота и многих других
+
+Дополнительные форматы анимации можно добавить через расширения:
+
+* [Rive анимация](/extension-rive) --- Воспроизведение векторных 2D скелетных анимаций
+* [Spine анимация](/extension-spine) --- Воспроизведение текстурированных 2D скелетных анимаций

+ 4 - 0
docs/ru/manuals/application-lifecycle.md

@@ -76,6 +76,10 @@ end
 
 Каждый компонент игрового объекта в основной коллекции будет обследован. Если у какого-либо из этих компонентов имеется функция `update()`, то вызывается именно она. Если компонент является прокси-коллекцией, то каждый компонент в прокси-коллекции рекурсивно обновляется с выполнением всех шагов в последовательности "обновления", представленной на диаграмме выше.
 
+::: sidenote
+Если используется [фиксированный временной шаг для физической симуляции](/manuals/physics/#physics-updates), может также вызываться функция `fixed_update()` во всех скриптовых компонентах. Эта функция полезна в играх, основанных на физике, когда требуется манипулировать физическими объектами с регулярными интервалами для достижения стабильной симуляции.
+:::
+
 ::: sidenote
 Порядок вызова функций `update()` компонентов игровых объектов не определен. Не следует полагать, что движок обновляет объекты, принадлежащие одной коллекции, в определенном порядке.
 :::

+ 117 - 6
docs/ru/manuals/atlas.md

@@ -19,11 +19,14 @@ brief: Это руководство объясняет особенности 
 Необходимо убедиться, что изображения добавлены в проект (перетаскиванием файлов изображений в нужное расположение в браузер *Assets*).
 
 Добавление одиночных изображений
-: Выполните <kbd>клик ПКМ</kbd> в корне ресурса Atlas в панели *Outline*.
 
-  Выберите <kbd>Add Images</kbd> из контекстного меню.
+: Перетащите изображения из панели *Assets* в окно редактора.
+
+  Либо <kbd>клик ПКМ</kbd> по корневому элементу атласа в панели *Outline*.
+
+  Выберите <kbd>Add Images</kbd> из контекстного меню, чтобы добавить одиночные изображения.
 
-  Откроется диалоговое окно, в котором можно найти и выбрать изображения для включения в атлас. Стоит отметить, что можно использовать фильтр и выбирать несколько файлов сразу.
+  Откроется диалоговое окно, в котором можно найти и выбрать изображения для добавления в атлас. Обратите внимание, что можно использовать фильтр и выбирать несколько файлов одновременно.
 
   ![Creating an atlas, adding images](images/atlas/add.png)
 
@@ -38,13 +41,15 @@ brief: Это руководство объясняет особенности 
 
   Новая, пустая группа анимации с именем по умолчанию ("New Animation") будет добавлена в атлас.
 
+  Перетащите изображения из панели *Assets* в окно редактора, чтобы добавить их в текущую выделенную группу.
+
   Выполните <kbd>клик ПКМ</kbd> по новой группе и выберите <kbd>Add Images</kbd> из контекстного меню.
 
   Откроется диалоговое окно, в котором можно найти и выбрать изображения для включения их в группу анимации.
 
   ![Creating an atlas, adding images](images/atlas/add_animation.png)
 
-  Нажмите <kbd>Space</kbd> при выделенной группе анимации для ее предварительного просмотра. При необходимости настройте *Свойства* анимации (см. ниже).
+  Нажмите <kbd>Space</kbd> при выделенной группе анимации для ее предварительного просмотра. Нажмите <kbd>Ctrl/Cmd+T</kbd>, чтобы закрыть предпросмотр. При необходимости настройте *Свойства* анимации (см. ниже).
 
   ![Animation group](images/atlas/animation_group.png)
 
@@ -66,7 +71,16 @@ Inner Padding
 Extrude Borders
 : Количество краевых пикселей, которые должны быть многократно добавлены вокруг каждого изображения. Когда фрагментный шейдер делает выборку пикселей на краю изображения, пиксели соседнего изображения (на той же текстуре атласа) могут просвечиваться (bleed over). Экструзия границы решает эту проблему.
 
-Вот примеры различных настроек свойств с четырьмя квадратными изображениями размером 64x64, добавленными в атлас. Обратите внимание, как атлас переходит к размеру 256x256, как только изображения не помещаются в 128x128, что приводит к бесполезному расходу текстурного пространства.
+Max Page Size
+: Максимальный размер страницы в многостраничном атласе. Это может использоваться для разбиения атласа на несколько страниц одного и того же атласа, чтобы ограничить его размер, но при этом использовать только один вызов отрисовки. Эта возможность должна использоваться в сочетании с материалами, поддерживающими многостраничные атласы, из `/builtins/materials/*_paged_atlas.material`.
+
+![Многостраничный атлас](images/atlas/multipage_atlas.png)
+
+Шаблоны переименования
+: Список шаблонов поиска и замены, разделённых запятыми (´,´), где каждый шаблон имеет форму `поиск=замена`.
+Исходное имя каждого изображения (имя файла без расширения) будет преобразовано согласно этим шаблонам. (Например, шаблон `hat=cat,_normal=` переименует изображение с именем `hat_normal` в `cat`). Это полезно при сопоставлении анимаций между разными атласами.
+
+Ниже приведены примеры различных настроек свойств с четырьмя квадратными изображениями размером 64×64, добавленными в атлас. Обратите внимание, что атлас увеличивается до 256×256, как только изображения перестают помещаться в 128×128, что приводит к значительным потерям текстурного пространства.
 
 ![Atlas properties](images/atlas/atlas_properties.png)
 
@@ -80,8 +94,11 @@ Id
 Size
 : Ширина и высота изображения (только для чтения).
 
+Pivot
+: Точка привязки изображения (в единицах). Левый верхний угол --- (0,0), правый нижний --- (1,1). По умолчанию --- (0.5, 0.5). Точка привязки может находиться за пределами диапазона 0–1. Эта точка определяет, где изображение будет центрироваться, например, при использовании в спрайте. Вы можете изменить точку привязки, перетащив манипулятор привязки в окне редактора. Манипулятор будет виден только при выборе одного изображения. Для включения привязки удерживайте <kbd>Shift</kbd> во время перетаскивания.
+
 Sprite Trim Mode
-: Способ рендеринга спрайта. По умолчанию спрайт отображается в виде прямоугольника (опция Sprite Trim Mode установлена в Off). Если спрайт содержит много прозрачных пикселей, может оказаться более эффективным рендеринг спрайта в виде непрямоугольной формы с использованием от 4 до 8 вершин.
+: Способ рендеринга спрайта. По умолчанию спрайт отображается в виде прямоугольника (опция Sprite Trim Mode установлена в Off). Если спрайт содержит много прозрачных пикселей, может оказаться более эффективным рендеринг спрайта в виде непрямоугольной формы с использованием от 4 до 8 вершин. Обратите внимание, что обрезка спрайтов не работает совместно со спрайтами с девятью срезами (slice-9 sprites).
 
 Image
 : Путь к файлу самого изображения.
@@ -114,3 +131,97 @@ Playback
   - `Loop Forward` --- воспроизводится циклически, начиная с первого и заканчивая последним изображением.
   - `Loop Backward` --- воспроизводится циклически, начиная с последнего и заканчивая первым изображением.
   - `Loop Ping Pong` --- воспроизводится циклически, начиная с первого и заканчивая последним изображением, затем возврат к первому.
+
+## Создание текстуры и атласа во время выполнения
+
+Начиная с версии Defold 1.4.2 стало возможно создавать текстуры и атласы во время выполнения.
+
+### Создание ресурса текстуры во время выполнения
+
+Используйте [`resource.create_texture(path, params)`](https://defold.com/ref/stable/resource/#resource.create_texture:path-table), чтобы создать новый ресурс текстуры:
+
+```lua
+  local params = {
+    width  = 128,
+    height = 128,
+    type   = resource.TEXTURE_TYPE_2D,
+    format = resource.TEXTURE_FORMAT_RGBA,
+  }
+  local my_texture_id = resource.create_texture("/my_custom_texture.texturec", params)
+```
+
+После создания текстуры можно использовать [`resource.set_texture(path, params, buffer)`](https://defold.com/ref/stable/resource/#resource.set_texture:path-table-buffer), чтобы установить пиксели текстуры:
+
+```lua
+  local width = 128
+  local height = 128
+  local buf = buffer.create(width * height, { { name=hash("rgba"), type=buffer.VALUE_TYPE_UINT8, count=4 } } )
+  local stream = buffer.get_stream(buf, hash("rgba"))
+
+  for y=1, height do
+      for x=1, width do
+          local index = (y-1) * width * 4 + (x-1) * 4 + 1
+          stream[index + 0] = 0xff
+          stream[index + 1] = 0x80
+          stream[index + 2] = 0x10
+          stream[index + 3] = 0xFF
+      end
+  end
+
+  local params = { width=width, height=height, x=0, y=0, type=resource.TEXTURE_TYPE_2D, format=resource.TEXTURE_FORMAT_RGBA, num_mip_maps=1 }
+  resource.set_texture(my_texture_id, params, buf)
+```
+
+::: sidenote
+Можно использовать `resource.set_texture()` для обновления подрегиона текстуры, указав ширину и высоту буфера меньше полного размера текстуры и изменив параметры `x` и `y` в вызове `resource.set_texture()`.
+:::
+
+Полученную текстуру можно напрямую использовать в [компоненте модели](/manuals/model/) через `go.set()`:
+
+```lua
+  go.set("#model", "texture0", my_texture_id)
+```
+
+### Создание атласа во время выполнения
+
+Если текстура должна использоваться в [компоненте спрайта](/manuals/sprite/), её необходимо подключить к атласу. Используйте [`resource.create_atlas(path, params)`](https://defold.com/ref/stable/resource/#resource.create_atlas:path-table), чтобы создать атлас:
+
+```lua
+  local params = {
+    texture = texture_id,
+    animations = {
+      {
+        id          = "my_animation",
+        width       = width,
+        height      = height,
+        frame_start = 1,
+        frame_end   = 2,
+      }
+    },
+    geometries = {
+      {
+        vertices  = {
+          0,     0,
+          0,     height,
+          width, height,
+          width, 0
+        },
+        uvs = {
+          0,     0,
+          0,     height,
+          width, height,
+          width, 0
+        },
+        indices = {0,1,2,0,2,3}
+      }
+    }
+  }
+  local my_atlas_id = resource.create_atlas("/my_atlas.texturesetc", params)
+
+  -- назначаем атлас компоненту 'sprite' на том же игровом объекте
+  go.set("#sprite", "image", my_atlas_id)
+
+  -- запускаем "анимацию"
+  sprite.play_flipbook("#sprite", "my_animation")
+  
+```

+ 7 - 1
docs/ru/manuals/bob.md

@@ -9,7 +9,13 @@ Bob - это инструмент командной строки для сбо
 
 Bob может делать сборки (соответствует этапу сборки при выборе пункта меню редактора <kbd>Project ▸ Build</kbd>), создавать архивы данных и создавать автономные распространяемые бандлы (соответствует пункту меню редактора <kbd> Project ▸ Bundle ▸ ... </kbd>)
 
-Bob распространяется в виде Java _JAR_ архива, содержащего все необходимое для сборки. Вы найдете дистрибутив *bob.jar* последней актуальной версии на [странице загрузки Defold](http://d.defold.com) и на [GitHub странице релизов](https://github.com/defold/defold/releases) . Выберите релиз, затем загрузите *bob/bob.jar*. Чтобы запустить утилиту Bob, с версии Defold 1.4.8 вам необходимо [установить на вашем компьютере OpenJDK 21](https://docs.microsoft.com/en-us/java/openjdk/download#openjdk-21). Для предыдущих версий Defold необходима [OpenJDK 17](https://docs.microsoft.com/en-us/java/openjdk/download#openjdk-17).
+Bob распространяется в виде Java _JAR_ архива, содержащего все необходимое для сборки. Вы найдете дистрибутив *bob.jar* последней актуальной версии на [странице загрузки Defold](http://d.defold.com) и на [GitHub странице релизов](https://github.com/defold/defold/releases) . Выберите релиз, затем загрузите *bob/bob.jar*. Если вы используете Defold 1.9.6, для его запуска потребуется OpenJDK 21. Для более старых версий Defold потребуется OpenJDK 17 или 11.
+
+Совместимые зеркала OpenJDK 21 (для Defold 1.9.6):
+* [OpenJDK 21 от Microsoft](https://docs.microsoft.com/en-us/java/openjdk/download#openjdk-21)
+* [OpenJDK 21 от Adoptium Working Group](https://github.com/adoptium/temurin21-binaries/releases) / [Adoptium.net](https://adoptium.net/)
+
+Если вы используете Windows, выберите установочный файл `.msi` для OpenJDK.
 
 ## Применение
 

+ 11 - 7
docs/ru/manuals/building-blocks.md

@@ -22,19 +22,19 @@ brief: В этом руководстве подробно описан прин
 
 ## Коллекции (Collections)
 
-Коллекции представляют собой древовидные структуры, в которых хранятся игровые объекты и другие коллекции. Коллекции всегда хранятся в файлах.
+Коллекции — это древовидные структуры, содержащие игровые объекты и другие коллекции. Каждая коллекция всегда сохраняется в виде файла.
 
-При запуске Defold загружает единственную _коллекцию начальной загрузки_, как указано в файле настроек *game.project*. Коллекция начальной загрузки часто называется "main.collection", но можно использовать любое другое имя.
+При запуске движка Defold загружается единственная _начальная коллекция_, указанная в файле настроек *game.project*. Эта коллекция часто называется "main.collection", но вы можете выбрать любое имя по своему усмотрению.
 
-Коллекция может содержать игровые объекты и другие коллекции (по ссылке на файл субколлекции), вложенные сколь угодно глубоко. Вот пример файла под названием "main.collection". Он содержит один игровой объект (с идентификатором "can") и одну субколлекцию (с идентификатором "bean"). Субколлекция, в свою очередь, содержит два игровых объекта: "bean" и "shield".
+Коллекция может содержать игровые объекты и другие коллекции (по ссылке на файл субколлекции), с произвольной глубиной вложенности. Ниже приведён пример файла под названием "main.collection". Он содержит один игровой объект (с идентификатором "can") и одну субколлекцию (с идентификатором "bean"). Субколлекция, в свою очередь, содержит два игровых объекта: "bean" и "shield".
 
-![Collection](images/building_blocks/collection.png)
+![Коллекция](images/building_blocks/collection.png)
 
-Стоит заметить, что субколлекция с идентификатором "bean" хранится в собственном файле, называемом "/main/bean.collection", и на нее имеются ссылки только в "main.collection":
+Обратите внимание, что субколлекция с идентификатором "bean" хранится в отдельном файле под названием "/main/bean.collection" и лишь ссылается в "main.collection":
 
-![Bean collection](images/building_blocks/bean_collection.png)
+![Коллекция Bean](images/building_blocks/bean_collection.png)
 
-К самим коллекциям обращаться не возможно, поскольку во время выполнения не существует объектов, соответствующих коллекциям "main" и "bean". Тем не менее, иногда необходимо использовать идентификатор коллекции как часть _пути_ к игровому объекту (за подробностями обращайтесь к [руководству по адресации](/manuals/addressing)):
+Саму коллекцию адресовать нельзя, поскольку в рантайме нет объектов, соответствующих коллекциям "main" и "bean". Тем не менее, иногда требуется использовать идентификатор коллекции как часть _пути_ к игровому объекту (см. [руководство по адресации](/manuals/addressing) для подробностей):
 
 ```lua
 -- file: can.script
@@ -84,6 +84,10 @@ go.animate("can", "position.x", go.PLAYBACK_LOOP_PINGPONG, 100, go.EASING_LINEAR
 
 ![GO instances](images/building_blocks/go_instance.png)
 
+Здесь изображено, как изображение спрайта в файле-прототипе изменяется, и все экземпляры, использующие этот файл, немедленно обновляются:
+
+![GO changing prototype](images/building_blocks/go_change_blueprint.png)
+
 При изменении файла шаблона любой экземпляр, использующий этот файл, будет немедленно обновлен.
 
 ![GO instances updated](images/building_blocks/go_instance2.png)

+ 36 - 2
docs/ru/manuals/bundling.md

@@ -19,7 +19,7 @@ brief: В этом руководстве рассказывается, как 
 
 ### Отчеты о сборке
 
-При сборке вашей игры есть возможность создать отчет о сборке. Это очень полезно, чтобы получить представление о размере всех ассетов, входящих в бандл. Просто установите флажок *Generate build report* при сборке игры. 
+При сборке вашей игры есть возможность создать отчет о сборке. Это очень полезно, чтобы получить представление о размере всех ассетов, входящих в бандл. Просто установите флажок *Generate build report* при сборке игры.
 
 ![build report](images/profiling/build_report.png)
 
@@ -55,4 +55,38 @@ brief: В этом руководстве рассказывается, как 
 
 ## Бандлинг из командной строки
 
-При повседневной разработке вашего приложения вполне вероятно, что вы собираете и бандлите прямо из редактора Defold. В других обстоятельствах вы можете захотеть автоматически создавать бандлы, например, пакетный бандлинг для всех платформ при выпуске новой версии или при создании ночных сборок последней версии игры, возможно, в среде CI. Сборка и бандлинг приложения могут выполняться вне обычного рабочего процесса в редакторе, с помощью [инструмента командной строки Bob](/manuals/bob/). 
+При повседневной разработке вашего приложения вполне вероятно, что вы собираете и бандлите прямо из редактора Defold. В других обстоятельствах вы можете захотеть автоматически создавать бандлы, например, пакетный бандлинг для всех платформ при выпуске новой версии или при создании ночных сборок последней версии игры, возможно, в среде CI. Сборка и бандлинг приложения могут выполняться вне обычного рабочего процесса в редакторе, с помощью [инструмента командной строки Bob](/manuals/bob/). 
+
+Редактор использует наш инструмент командной строки [Bob](/manuals/bob/) для создания бандла приложения.
+
+## Структура бандла
+
+Логическая структура бандла выглядит следующим образом:
+
+![](images/bundling/bundle_schematic_01.png)
+
+Бандл создаётся в папке. В зависимости от платформы эта папка может быть заархивирована в `.apk` или `.ipa`.
+Содержимое папки зависит от платформы.
+
+Помимо исполняемых файлов, наш процесс бандлинга также собирает необходимые ассеты для платформы (например, .xml файлы ресурсов для Android).
+
+Используя настройку [bundle_resources](https://defold.com/manuals/project-settings/#bundle-resources), вы можете указать ассеты, которые должны быть помещены в бандл как есть.
+Этим можно управлять для каждой платформы отдельно.
+
+Игровые ассеты находятся в файле `game.arcd`, и каждый из них сжимается с использованием LZ4-сжатия.
+Используя настройку [custom_resources](https://defold.com/manuals/project-settings/#custom-resources), вы можете указать ассеты, которые должны быть помещены (с сжатием) в `game.arcd`.
+Эти ассеты можно загрузить с помощью функции [`sys.load_resource()`](https://defold.com/ref/sys/#sys.load_resource).
+
+## Релиз или Отладка
+
+При создании бандла приложения у вас есть возможность создать отладочную или релизную сборку. Различия между этими типами сборок незначительные, но важные:
+
+* Релизные сборки не содержат [профайлер](/manuals/profiling)
+* Релизные сборки не содержат [запись экрана](/ref/stable/sys/#start_record)
+* Релизные сборки не показывают вывод вызовов `print()` и вывод из нативных расширений
+* В релизных сборках значение `is_debug` в `sys.get_engine_info()` установлено в `false`
+* Релизные сборки не выполняют обратный поиск значений `hash` при вызове `tostring()`. На практике это означает, что результат `tostring()` для значений типа `url` или `hash` будет числовым, а не исходной строкой (`'hash: [/camera_001]'` vs `'hash: [11844936738040519888 (unknown)]'`)
+* Релизные сборки не поддерживают таргетинг из редактора для [горячей перезагрузки](/manuals/hot-reload) и аналогичной функциональности
+
+
+

+ 1 - 1
docs/ru/manuals/caching-assets.md

@@ -18,7 +18,7 @@ Defold использует трехуровневый кэш:
 
 По умолчанию Defold будет кэшировать скомпилированные ассеты в папке `build/default` проекта Defold. Кэш проекта ускоряет последующие сборки, так как перекомпилировать нужно только измененные ассеты, а ассеты без изменений будут использоваться из кэша проекта. Этот кэш всегда включен и используется как редактором, так и инструментами командной строки.
 
-Кэш проекта можно удалить вручную, удалив файлы в `build/default` или выполнив команду `clean` из [командной строки сборщика Боба](/manuals/bob).
+Кэш проекта можно удалить вручную, удалив файлы в `build/default` или выполнив команду `clean` из [командной строки сборщика Bob](/manuals/bob).
 
 
 ## Локальный кэш

+ 208 - 69
docs/ru/manuals/camera.md

@@ -3,17 +3,24 @@ title: Компонент Camera
 brief: В данном руководстве описаны функциональные возможности компонента Camera в Defold.
 ---
 
-# Компонент Camera
+# Камеры
+
+Камера в Defold — это компонент, который изменяет область просмотра (viewport) и проекцию игрового мира. Компонент камеры определяет базовую перспективную или ортографическую камеру, которая предоставляет матрицы вида и проекции в рендер-скрипт.
+
+Перспективная камера обычно используется для 3D-игр, где вид камеры и размер и перспектива объектов основаны на усечённой пирамиде (view frustum) и расстоянии и угле обзора от камеры до объектов в игре.
+
+Для 2D-игр часто предпочтительно использовать ортографическую проекцию. Это означает, что вид камеры больше не определяется усечённой пирамидой, а ограничен параллелепипедом. Ортографическая проекция нереалистична, так как не изменяет размер объектов в зависимости от расстояния. Объект на расстоянии 1000 единиц будет отображаться того же размера, что и объект прямо перед камерой.
+
+![projections](images/camera/projections.png)
 
-В Defold камера --- это компонент, который изменяет область обзора и проекцию игрового мира. Компонент Camera лишь поверхностно определяет перспективную или ортографическую камеры, которая предоставляет рендер-скрипту матрицу вида и проекции. Перспективная камера обычно используется для 3D-игр, ортографическая камера --- для 2D. Если требуются расширенные возможности, такие как преследование, зумирование, дрожание и т.д., придется реализовать их самостоятельно (см. раздел ниже [сторонние решения для камер](https://www.defold.com/manuals/camera/#third-party-camera-solutions)).
 
 ## Создание камеры
 
-Чтобы создать камеру, <kbd>кликните ПКМ</kbd> на игровом объекте и выберите <kbd>Add Component ▸ Camera</kbd>. Можно также создать файл компонента в иерархии проекта и добавить этот файл к игровому объекту.
+Чтобы создать камеру, <kbd>кликните правой кнопкой мыши</kbd> по игровому объекту и выберите <kbd>Add Component ▸ Camera</kbd>. Также можно создать файл компонента камеры в иерархии проекта и добавить его к игровому объекту.
 
 ![create camera component](images/camera/create.png)
 
-Компонент Camera имеет следующие свойства, определяющие усеченную пирамиду видимости, или *фрустум* (только для перспективной камеры):
+Компонент камеры имеет следующие свойства, определяющие *усечённую пирамиду* камеры:
 
 ![camera settings](images/camera/settings.png)
 
@@ -21,128 +28,260 @@ Id
 : Идентификатор компонента
 
 Aspect Ratio
-: (**Только для перспективной камеры**) --- Соотношение между шириной и высотой фрустума. 1.0 предполагает квадратичное представление. 1,33 подходит для формата 4:3, например, 1024x768. 1.78 подходит для формата 16:9. Данное свойство игнорируется, если отмечена опция *Auto Aspect Ratio*.
+: (**Только для перспективной камеры**) — соотношение ширины и высоты усечённой пирамиды. 1.0 означает квадратный вид. 1.33 подходит для соотношения 4:3, например 1024x768. 1.78 — для 16:9. Это значение игнорируется, если включён *Auto Aspect Ratio*.
 
 Fov
-: (**Только для перспективной камеры**) --- Поле зрения камеры по *вертикали*, выраженное в _радианах_. Чем шире поле зрения, тем больше камера видит. Обратите внимание, что текущее значение по умолчанию (45) вводит в заблуждение. Для поля зрения в 45 градусов измените значение на 0.785 (`π / 4`).
+: (**Только для перспективной камеры**) — *вертикальный* угол обзора камеры в _радианах_. Чем шире угол обзора, тем больше камера видит.
 
 Near Z
-: (**Только для перспективной камеры**) --- Z-значение ближней плоскости отсечения.
+: Z-значение ближней плоскости отсечения.
 
 Far Z
-: (**Только для перспективной камеры**) --- Z-значение дельней плоскости отсечения.
+: Z-значение дальней плоскости отсечения.
 
 Auto Aspect Ratio
-: (**Только для перспективной камеры**) --- Если опция отмечена, камера будет вычислять соотношение сторон автоматически.
+: (**Только для перспективной камеры**) — если включено, камера автоматически вычисляет соотношение сторон.
+
+Orthographic Projection
+: Включите, чтобы использовать ортографическую проекцию (см. ниже).
+
+Orthographic Zoom
+: (**Только для ортографической камеры**) — масштаб ортографической проекции (> 1 = приближение, < 1 = отдаление).
+
 
 ## Использование камеры
 
-Чтобы активировать камеру и передать ее матрицы вида и проекции в рендер-скрипт, нужно вызвать функцию `camera.acquire_focus` или отправить компоненту сообщение acquire_camera_focus:
+Все камеры по умолчанию включены и обновляются каждый кадр, а Lua-модуль `camera` доступен во всех скриптовых контекстах. Начиная с Defold 1.8.1, больше не нужно явно включать камеру через отправку сообщения `acquire_camera_focus` компоненту камеры. Старые сообщения acquire и release всё ещё поддерживаются, но рекомендуется использовать сообщения `enable` и `disable`, как для любого другого компонента, который нужно включать или выключать:
+
+```lua
+msg.post("#camera", "disable")
+msg.post("#camera", "enable")
+```
+
+Чтобы получить список всех доступных камер, используйте функцию `camera.get_cameras()`:
+
+```lua
+-- Внимание: вызовы render доступны только в рендер-скрипте.
+-- camera.get_cameras() можно использовать везде,
+-- но render.set_camera — только в рендер-скрипте.
+
+for k,v in pairs(camera.get_cameras()) do
+	-- таблица camera содержит URL всех камер
+	render.set_camera(v)
+	-- здесь выполняется рендеринг — всё, что использует материалы с
+	-- матрицами вида и проекции, будет использовать матрицы этой камеры.
+end
+-- чтобы отключить камеру, передайте nil (или вызовите без аргументов) в render.set_camera.
+-- после этого все вызовы рендеринга будут использовать матрицы вида и проекции,
+-- заданные напрямую в рендер-контексте через render.set_view и render.set_projection
+render.set_camera()
+```
+
+Модуль `camera` содержит множество функций для управления камерой. Вот несколько из них, полный список доступен в [API документации](/ref/camera/):
 
 ```lua
-camera.acquire_focus("#camera")
+camera.get_aspect_ratio(camera)        -- получить соотношение сторон
+camera.get_far_z(camera)               -- получить дальнюю плоскость отсечения
+camera.get_fov(camera)                 -- получить угол обзора
+camera.set_aspect_ratio(camera, ratio) -- установить соотношение сторон
+camera.set_far_z(camera, far_z)        -- установить дальнюю плоскость отсечения
+camera.set_near_z(camera, near_z)      -- установить ближнюю плоскость отсечения
+... и другие
 ```
-или
+
+Камера идентифицируется URL, который представляет полный путь к компоненту в сцене, включая коллекцию, игровой объект и id компонента. В примере используйте URL `/go#camera` для доступа к компоненту камеры из той же коллекции, и `main:/go#camera` для доступа к камере из другой коллекции или рендер-скрипта.
+
+![create camera component](images/camera/create.png)
 
 ```lua
-msg.post("#camera", "acquire_camera_focus")
+-- Доступ к камере из скрипта в той же коллекции:
+camera.get_fov("/go#camera")
+
+-- Доступ к камере из скрипта в другой коллекции:
+camera.get_fov("main:/go#camera")
+
+-- Доступ к камере из рендер-скрипта:
+render.set_camera("main:/go#camera")
 ```
 
-В каждом кадре компонент Camera, который в данный момент имеет фокус, будет посылать сообщение `"set_view_projection"` в сокет "@render", то есть оно будет поступать в рендер-скрипт:
+Каждый кадр компонент камеры с текущим фокусом камеры отправляет сообщение `set_view_projection` на сокет "@render":
 
 ```lua
 -- builtins/render/default.render_script
 --
 function on_message(self, message_id, message)
-    if message_id == hash("set_view_projection") then
-        self.view = message.view                    -- [1]
-        self.projection = message.projection
-    end
+	if message_id == hash("set_view_projection") then
+		self.view = message.view                    -- [1]
+		self.projection = message.projection
+	end
 end
 ```
-1. Сообщение, переданное от компонента камеры, включает матрицу вида и матрицу проекции.
+1. Сообщение от компонента камеры содержит матрицу вида и матрицу проекции.
 
-### Панорамирование камеры
+Компонент камеры предоставляет рендер-скрипту матрицу проекции перспективной или ортографической камеры в зависимости от свойства *Orthographic Projection*. Матрица проекции учитывает ближнюю и дальнюю плоскости отсечения, угол обзора и соотношение сторон камеры.
+
+Матрица вида определяет позицию и ориентацию камеры. Камера с *Orthographic Projection* центрирует вид на позиции игрового объекта, к которому прикреплён компонент камеры, тогда как камера с *Perspective Projection* располагает нижний левый угол вида на позиции игрового объекта.
 
-Панорамирование/перемещение камеры по игровому миру осуществляется путем перемещения игрового объекта, к которому присоединен компонент камеры. Компонент Camera автоматически отправляет обновленную матрицу вида согласно текущему положению камеры по осям X и Y.
 
-### Зумирование камеры
+### Рендер-скрипт
 
-Увеличение и уменьшение масштаба при использовании перспективной камеры осуществляется путем перемещения игрового объекта, к которому прикреплена камера, вдоль оси Z. Компонент камеры автоматически отправляет обновленную матрицу вида согласно текущему положению камеры по оси Z.
+Начиная с Defold 1.9.6, при использовании дефолтного рендер-скрипта Defold автоматически устанавливает последнюю включённую камеру для рендеринга. Ранее требовалось явно отправлять сообщение `use_camera_projection` рендереру, чтобы уведомить его об использовании матриц камеры. Сейчас это не обязательно, но для обратной совместимости можно продолжать использовать.
 
-Увеличивать и уменьшать масштаб при использовании ортографической камеры можно, только если тип проекции установлен в `Fixed`, при этом масштаб изменяется путем отправки рендер-скрипту сообщения с требуемым уровнем масштабирования:
+Также можно явно задать конкретную камеру для рендеринга в рендер-скрипте. Это полезно, например, в многопользовательских играх для точного контроля, какая камера используется.
 
-```Lua
-msg.post("@render:", "use_fixed_projection", { zoom = 2, near = -1, far = 1 })
+```lua
+-- render.set_camera автоматически применит матрицы вида и проекции
+-- для всего рендеринга, пока не будет вызван render.set_camera() без аргументов.
+render.set_camera("main:/my_go#camera")
 ```
 
-### Следование за игровым объектом
+Чтобы проверить, включена ли камера, используйте функцию `get_enabled` из [Camera API](https://defold.com/ref/alpha/camera/#camera.get_enabled:camera):
 
-Можно заставить камеру следовать за игровым объектом. Для этого достаточно создать игровой объект с прикрепленным к нему компонентом Camera и разместить его в качестве дочернего по отношению к тому объекту, за которым необходимо следовать:
+```lua
+if camera.get_enabled("main:/my_go#camera") then
+	-- камера включена, используем её для рендеринга
+	render.set_camera("main:/my_go#camera")
+end
+```
 
-![follow game object](images/camera/follow.png)
+::: sidenote
+Чтобы использовать `set_camera` вместе с отсечением по усечённой пирамиде (frustum culling), передайте опцию:
+`render.set_camera("main:/my_go#camera", {use_frustum = true})`
+:::
 
-Альтернативный способ заключается в обновлении положения игрового объекта, к которому прикреплен компонент Camera, каждый кадр по мере перемещения игрового объекта, за которым нужно следить.
+### Панорамирование камеры
 
-### Преобразование экранных координат в мировые
+Перемещайте камеру по игровому миру, перемещая игровой объект, к которому прикреплён компонент камеры. Компонент автоматически отправит обновлённую матрицу вида на основе текущих координат по осям X и Y.
 
-При панорамировании, масштабировании или изменении проекции камеры с ортографической проекцией типа Stretch по умолчанию координаты мыши, предоставленные в функции жизненного цикла on_input(), больше не будут соответствовать мировым координатам игровых объектов. Необходимо вручную учесть изменение вида или проекции. Преобразование координат мыши/экрана в мировые координаты из стандартного рендер-скрипта выполняется следующим образом:
+### Масштабирование камеры
 
-::: sidenote
-[Сторонние решения для камер, упомянутые в данном руководстве](/manuals/camera/#third-party-camera-solutions) предоставляют функции для преобразования в экранные координаты и обратно.
-:::
+Для перспективной камеры масштабирование происходит перемещением игрового объекта по оси Z. Компонент камеры автоматически обновит матрицу вида с учётом текущей позиции по Z.
 
-```Lua
--- builtins/render/default.render_script
---
-local function screen_to_world(x, y, z)
-	local inv = vmath.inv(self.projection * self.view)
-	x = (2 * x / render.get_width()) - 1
-	y = (2 * y / render.get_height()) - 1
-	z = (2 * z) - 1
-	local x1 = x * inv.m00 + y * inv.m01 + z * inv.m02 + inv.m03
-	local y1 = x * inv.m10 + y * inv.m11 + z * inv.m12 + inv.m13
-	local z1 = x * inv.m20 + y * inv.m21 + z * inv.m22 + inv.m23
-	return x1, y1, z1
-end
+Для ортографической камеры масштабирование выполняется изменением свойства *Orthographic Zoom*:
+
+```lua
+go.set("#camera", "orthographic_zoom", 2)
 ```
 
-## Проекции
+### Адаптивный зум
 
-Компонент Camera передает рендер-скрипту перспективную проекцию. Это хорошо подходит для 3D-игр. Для 2D-игр зачастую требуется рендерить сцену с *ортографической проекцией*. Это означает, что вид камеры определяется не фрустумом, а фреймом. Ортографическая проекция нереалистична, поскольку она не искажает размер объектов в зависимости от расстояния до них. Объект, находящийся на расстоянии в 1000 единиц, будет отображаться в том же размере, что и объект прямо перед камерой.
+Адаптивный зум — это изменение значения зума камеры при изменении разрешения экрана относительно первоначального разрешения, заданного в *game.project*.
 
-![projections](images/camera/projections.png)
+Два распространённых подхода к адаптивному зуму:
+
+1. Максимальный зум — вычисляется так, чтобы контент, покрываемый изначальным разрешением, заполнял и выходил за границы экрана, возможно, скрывая часть контента по бокам или сверху/снизу.
+2. Минимальный зум — вычисляется так, чтобы контент изначального разрешения полностью помещался в экран, возможно, показывая дополнительный контент по бокам или сверху/снизу.
 
-### Ортографическая проекция (2D)
-Для использования ортографической проекции матрица проекции, передаваемая компонентом Camera, игнорируется, и вместо этого она создается самостоятельно в рендер-скрипте. Рендер-скрипт по умолчанию поддерживает три ортографические проекции: `Stretch`, `Fixed` и `Fixed Fit`. Чтобы выбрать, какую из них использовать, достаточно послать сообщение в рендер-скрипт:
+Пример:
 
 ```lua
-msg.post("@render:", "use_fixed_fit_projection", { near = -1, far = 1 })
+local DISPLAY_WIDTH = sys.get_config_int("display.width")
+local DISPLAY_HEIGHT = sys.get_config_int("display.height")
+
+function init(self)
+	local initial_zoom = go.get("#camera", "orthographic_zoom")
+	local display_scale = window.get_display_scale()
+	window.set_listener(function(self, event, data)
+		if event == window.WINDOW_EVENT_RESIZED then
+			local window_width = data.width
+			local window_height = data.height
+			local design_width = DISPLAY_WIDTH / initial_zoom
+			local design_height = DISPLAY_HEIGHT / initial_zoom
+
+			-- max zoom: контент изначального разрешения заполнит и выйдет за границы экрана
+			local zoom = math.max(window_width / design_width, window_height / design_height) / display_scale
+
+			-- min zoom: контент изначального разрешения полностью поместится в экран
+			--local zoom = math.min(window_width / design_width, window_height / design_height) / display_scale
+			
+			go.set("#camera", "orthographic_zoom", zoom)
+		end
+	end)
+end
 ```
 
-::: important
-Следует отметить, что ближняя и дальняя плоскости также указываются в сообщении. Ближняя и дальняя плоскости, заданные в свойствах камеры, используются только для перспективной проекции.
-:::
+Полный пример адаптивного зума доступен в [этом примерном проекте](https://github.com/defold/sample-adaptive-zoom).
 
-::: important
-При ортографической проекции представление будет расположено так, что левый нижний угол отрендеренной части экрана будет соответствовать положению игрового объекта, к которому прикреплен компонент Camera.
-:::
 
-Подробнее о рендер-скрипте и о том, как изменить тип используемой ортографической проекции, можно узнать в [руководстве по рендерингу](/manuals/render/#default-view-projection).
+### Следование за игровым объектом
+
+Камера может следовать за игровым объектом, если сделать игровой объект с компонентом камеры дочерним по отношению к объекту, за которым нужно следить:
+
+![follow game object](images/camera/follow.png)
+
+Альтернативный способ — обновлять позицию игрового объекта с компонентом камеры каждый кадр в соответствии с позицией объекта, за которым следят.
 
-### Перспективная проекция (3D)
-Чтобы использовать перспективную проекцию, необходимо использовать как вид, так и проекцию, предоставляемые камерой. Рендер-скрипт должен использовать проекцию, исходящую от камеры, отправленную ему в сообщении:
+### Преобразование мыши в мировые координаты
+
+Когда камера смещена, масштабирована или изменена проекция с дефолтной ортографической Stretch-проекцией, координаты мыши, получаемые в функции `on_input()`, больше не совпадают с мировыми координатами игровых объектов. Нужно вручную учитывать изменения вида и проекции. Код для преобразования экранных координат в мировые выглядит так:
 
 ```lua
-msg.post("@render:", "use_camera_projection")
+--- Преобразует экранные координаты в мировые с учётом
+-- вида и проекции конкретной камеры
+-- @param camera URL камеры для преобразования
+-- @param screen_x экранная координата X
+-- @param screen_y экранная координата Y
+-- @param z опциональный Z для преобразования, по умолчанию 0
+-- @return world_x мировая координата X
+-- @return world_y мировая координата Y
+-- @return world_z мировая координата Z
+function M.screen_to_world(camera, screen_x, screen_y, z)
+	local projection = go.get(camera, "projection")
+	local view = go.get(camera, "view")
+	local w, h = window.get_size()
+	-- window.get_size() возвращает масштабированный размер окна,
+	-- учитывая дисплейный масштаб (например, Retina на macOS).
+	-- Нужно скорректировать размер с учётом масштаба.
+	local scale = window.get_display_scale()
+	w = w / scale
+	h = h / scale
+
+	-- https://defold.com/manuals/camera/#converting-mouse-to-world-coordinates
+    local inv = vmath.inv(projection * view)
+    local x = (2 * screen_x / w) - 1
+    local y = (2 * screen_y / h) - 1
+    local x1 = x * inv.m00 + y * inv.m01 + z * inv.m02 + inv.m03
+    local y1 = x * inv.m10 + y * inv.m11 + z * inv.m12 + inv.m13
+    return x1, y1, z or 0
+end
 ```
 
-За подробностями о рендер-скрипте обращайтесь к [руководстве по рендерингу](/manuals/render/#perspective-projection).
+На странице [Примеры](https://defold.com/examples/render/screen_to_world/) показано использование преобразования экранных координат в мировые. Также есть [примерный проект](https://github.com/defold/sample-screen-to-world-coordinates/) с демонстрацией этого процесса.
+
+::: sidenote
+[Сторонние решения для камеры](/manuals/camera/#third-party-camera-solutions) предоставляют функции для преобразования координат между экраном и миром.
+:::
+
+## Манипуляции во время выполнения
+Камеры можно изменять из кода с помощью различных сообщений и свойств (подробности в [API документации](/ref/camera/)).
+
+Компонент камеры имеет следующие свойства, которые можно читать и изменять через `go.get()` и `go.set()`:
+
+`fov`
+: Угол обзора камеры (`number`).
+
+`near_z`
+: Ближняя плоскость отсечения (`number`).
+
+`far_z`
+: Дальняя плоскость отсечения (`number`).
+
+`orthographic_zoom`
+: Масштаб ортографической камеры (`number`).
+
+`aspect_ratio`
+: Добавлено в Defold 1.4.8. Соотношение ширины и высоты усечённой пирамиды. Используется при вычислении проекции перспективной камеры. (`number`).
+
+`view`
+: Добавлено в Defold 1.4.8. Вычисленная матрица вида камеры. ТОЛЬКО ДЛЯ ЧТЕНИЯ. (`matrix4`).
+
+`projection`
+: Добавлено в Defold 1.4.8. Вычисленная матрица проекции камеры. ТОЛЬКО ДЛЯ ЧТЕНИЯ. (`matrix4`).
 
 
-## Сторонние решения для камер
+## Сторонние решения для камеры
 
-Существует несколько библиотечных решений, реализующих общие функции камеры, такие как следование за игровым объектом, преобразование координат экрана в мировые и так далее. Они доступны на портале ассетов сообщества Defold:
+Существуют решения сообщества, которые реализуют распространённые функции, такие как тряска экрана, следование за объектами, преобразование экранных координат в мировые и многое другое. Их можно скачать с портала Defold Asset Portal:
 
-- [Orthographic camera](https://defold.com/assets/orthographic/) (2D only) by Björn Ritzl.
-- [Defold Rendy](https://defold.com/assets/defold-rendy/) (2D and 3D) by Klayton Kowalski.
+- [Orthographic camera](https://defold.com/assets/orthographic/) (только 2D) от Бьёрна Ритцля.
+- [Defold Rendy](https://defold.com/assets/defold-rendy/) (2D и 3D) от Клейтона Ковальски.

+ 19 - 0
docs/ru/manuals/collection-factory.md

@@ -148,3 +148,22 @@ end
       collectionfactory.unload("#factory")
   end
   ```
+
+  
+## Динамический прототип
+
+Можно изменить, какой *прототип* может создавать компонент фабрики коллекций, установив флажок *Dynamic Prototype* в свойствах компонента фабрики.
+
+![Dynamic prototype](images/collection_factory/dynamic_prototype.png)
+
+Когда включена опция *Dynamic Prototype*, компонент фабрики коллекций может менять прототип с помощью функции `collectionfactory.set_prototype()`. Пример:
+
+```lua
+collectionfactory.unload("#factory") -- выгрузить предыдущие ресурсы
+collectionfactory.set_prototype("#factory", "/main/levels/level1.collectionc")
+local ids = collectionfactory.create("#factory")
+```
+
+::: important
+Когда опция *Dynamic Prototype* включена, количество компонентов коллекции не может быть оптимизировано, и владеющая коллекция будет использовать значения по умолчанию из файла *game.project*.
+:::

+ 16 - 0
docs/ru/manuals/collection-proxy.md

@@ -92,6 +92,22 @@ msg.post("main:/loader#script", "load_level", { level_id = 2 })
 
 ![load](images/collection-proxy/message_passing.png)
 
+И если необходимо взаимодействовать с игровым объектом в загруженной коллекции из загрузчика, можно отправить сообщение, используя [полный URL объекта](/manuals/addressing/#urls):
+
+```lua
+msg.post("mylevel:/myobject", "hello")
+```
+
+::: important
+Невозможно напрямую обращаться к игровым объектам в загруженной коллекции извне этой коллекции:
+
+```lua
+local position = go.get_position("mylevel:/myobject")
+-- loader.script:42: function called can only access instances within the same collection.
+```
+:::
+
+
 ## Выгрузка мира
 
 Чтобы выгрузить загруженную коллекцию, необходимо отправить сообщения, соответствующие обратным этапам загрузки:

+ 8 - 0
docs/ru/manuals/components.md

@@ -27,6 +27,11 @@ Defold поддерживает следующие типы компоненто
 * [Sprite](/manuals/sprite) --- Отображает 2D-изображение (с возможностью мултикадровой анимации)
 * [Tile Map](/manuals/tilemap) --- Отображает сетку тайлов
 
+Дополнительные компоненты можно добавить с помощью расширений:
+
+* [Rive model](/extension-rive) --- Визуализирует анимацию Rive
+* [Spine model](/extension-spine) --- Визуализирует анимацию Spine
+
 ## Включение и отключение компонентов
 
 Компоненты игрового объекта активируются при создании этого игрового объекта. Если требуется отключить компонент, это делается путем отправки ему сообщения [`disable`](/ref/go/#disable):
@@ -97,3 +102,6 @@ msg.post("#weapon", "enable")
 
 Рендер-скрипт определяет ближнюю и дальнюю плоскости для значений по Z. Любой компонент со значением по Z, выходящим за пределы этого диапазона, рендерится не будет. По умолчанию диапазон составляет от -1 до 1, но [его можно легко изменить](/manuals/render/#default-view-projection). Числовая точность значений по оси Z с ближним и дальним пределами -1 и 1 очень высока. При работе с 3D-ассетами может возникнуть необходимость изменить ближний и дальний пределы проекции по умолчанию в пользовательском рендер-скрипте. За подробностями обращайтесь к [руководству по рендерингу](/manuals/render/).
 :::
+
+
+:[Оптимизация максимального количества компонентов](../shared/component-max-count-optimizations.md)

+ 25 - 11
docs/ru/manuals/debugging-game-and-system-logs.md

@@ -19,9 +19,9 @@ brief: В этом руководстве объясняется, как чит
 
 ![Editor 2](images/editor/editor2_overview.png)
 
-## Чтение лога игры с терминала 
+## Чтение лога игры с терминала
 
-Когда вы запускаете игру Defold из терминала, лог будет отображаться в самом окне терминала. В Windows и Linux вы вводите имя исполняемого файла в терминале, чтобы запустить игру. В macOS вам нужно запустить движок из файла .app: 
+Когда вы запускаете игру Defold из терминала, лог будет отображаться в самом окне терминала. В Windows и Linux вы вводите имя исполняемого файла в терминале, чтобы запустить игру. В macOS вам нужно запустить движок из файла .app:
 
 ```
 $ > ./mygame.app/Contents/MacOS/mygame
@@ -40,7 +40,9 @@ $ > ./mygame.app/Contents/MacOS/mygame
 
 ### Android
 
-Вы можете использовать [Android Debug Bridge (ADB) tool](https://developer.android.com/studio/command-line/adb.html) для просмотра логов игры и системного лога. 
+Вы можете использовать Android Debug Bridge (ADB) для просмотра логов игры и системного лога. 
+
+:[Android ADB](../shared/android-adb.md)
 
   После установки и настройки подключите ваше устройство к USB, откройте терминал и выполните команды: 
 
@@ -54,21 +56,33 @@ $ > ./mygame.app/Contents/MacOS/mygame
   Если вы хотите видеть только выходные данные приложения Defold, используйте эту команду: 
 
   ```txt
-  cd <path_to_android_sdk>/platform-tools/
-  adb logcat -s defold
+$ cd <path_to_android_sdk>/platform-tools/
+$ adb logcat -s defold
+--------- beginning of /dev/log/system
+--------- beginning of /dev/log/main
+I/defold  ( 6210): INFO:DLIB: SSDP started (ssdp://192.168.0.97:58089, http://0.0.0.0:38637)
+I/defold  ( 6210): INFO:ENGINE: Defold Engine 1.2.50 (8d1b912)
+I/defold  ( 6210): INFO:ENGINE: Loading data from:
+I/defold  ( 6210): INFO:ENGINE: Initialized sound device 'default'
+I/defold  ( 6210):
+D/defold  ( 6210): DEBUG:SCRIPT: Hello there, log!
+...
   ```
 
 ### iOS
 
-Вы можете использовать [Console tool](https://support.apple.com/guide/console/welcome/mac) для чтения лога игры и системного лога. Вы можете использовать отладчик LLDB для подключения к игре, запущенной на устройстве. Для отладки игры она должна быть подписана с помощью «Apple Developer Provisioning Profile», в который добавлено устройство, на котором вы хотите отлаживать. Создайте бандл игры из редактора и укажите provisioning profile в диалоговом окне бандлинга (бандлинг для iOS доступен только в macOS). 
+У вас есть несколько способов прочитать игровые и системные логи на iOS:
 
-  Чтобы запустить игру и подключить отладчик, вам понадобится инструмент под названием [ios-deploy](https://github.com/phonegap/ios-deploy). Установите и отлаживайте свою игру, запустив в терминале следующее: 
+1. Вы можете использовать [Console tool](https://support.apple.com/guide/console/welcome/mac) для чтения игрового и системного логов.
+2. Вы можете использовать отладчик LLDB для подключения к игре, запущенной на устройстве. Чтобы отлаживать игру, она должна быть подписана с помощью «Apple Developer Provisioning Profile», в который добавлено устройство, на котором вы хотите отлаживать. Соберите игру в редакторе и укажите provisioning profile в диалоговом окне сборки (сборка для iOS доступна только в macOS).
 
-  ```txt
-  ios-deploy --debug --bundle <path_to_game.app> # NOTE: not the .ipa file
-  ```
+Чтобы запустить игру и подключить отладчик, вам понадобится инструмент под названием [ios-deploy](https://github.com/phonegap/ios-deploy). Установите и отлаживайте игру, запустив в терминале следующую команду:
+
+```txt
+$ ios-deploy --debug --bundle <path_to_game.app> # ВНИМАНИЕ: не .ipa файл
+```
 
-  Данная команда установит приложение на ваше устройство, запустит его и автоматически подключит к нему отладчик LLDB. Если вы новичок в LLDB, прочтите [Начало работы с LLDB](https://developer.apple.com/library/content/documentation/IDEs/Conceptual/gdb_to_lldb_transition_guide/document/lldb-basics.html). 
+Эта команда установит приложение на ваше устройство, запустит его и автоматически подключит к нему отладчик LLDB. Если вы не знакомы с LLDB, прочтите руководство [Начало работы с LLDB](https://developer.apple.com/library/content/documentation/IDEs/Conceptual/gdb_to_lldb_transition_guide/document/lldb-basics.html).
 
 
 ## Чтение лога игры из файла лога 

+ 7 - 0
docs/ru/manuals/debugging-game-logic.md

@@ -87,6 +87,13 @@ Step Out
 
   Чтобы установить или убрать точку останова, кликните в колонке справа от номеров строк в редакторе кода. Также можно выбрать в меню <kbd>Edit ▸ Toggle Breakpoint</kbd>.
 
+Условные точки останова
+: Вы можете настроить точку останова с условием, которое должно быть истинным, чтобы точка сработала. Это условие может обращаться к локальным переменным, доступным на этой строке во время выполнения кода.
+
+  ![edit breakpoint](images/debugging/edit_breakpoint.png)
+
+  Чтобы отредактировать условие точки останова, щёлкните правой кнопкой мыши в колонке справа от номеров строк в редакторе кода или выберите <kbd>Edit ▸ Edit Breakpoint</kbd> в меню.
+
 Вычисление Lua-выражений
 : При подключенном отладчике и остановленной на точке останова игре доступна среда выполнения Lua с текущим контекстом. Введите выражения Lua в нижней части консоли и нажмите <kbd>Enter</kbd> для их вычисления:
 

+ 6 - 3
docs/ru/manuals/debugging-native-code-android.md

@@ -7,6 +7,7 @@ brief: В этом руководстве описывается, как отл
 
 Здесь мы перечислим ряд способов отладки вашего исполняемого файла, работающего на устройстве Android
 
+
 ## Android Studio
 
 * Подготовьте бандл, установив параметр `android.debuggable` в *game.project*
@@ -43,7 +44,7 @@ brief: В этом руководстве описывается, как отл
 
 * Если у вас есть доступ к исходным кодам движка, добавьте сопоставление пути и для него
 
-		* не забудьте сверить версию, которую вы сейчас отлаживаете
+		* Убедитесь, что вы используете ту же версию исходного кода, которую собираетесь отлаживать
 
 			defold $ git checkout 1.2.148 
 
@@ -64,7 +65,7 @@ brief: В этом руководстве описывается, как отл
 * Теперь вы можете пошагово войти в стек вызовов, а также отслеживать переменные 
 
 
-## Примечани
+## Примечания
 
 ### Директория задач нативного расширения 
 
@@ -77,7 +78,9 @@ brief: В этом руководстве описывается, как отл
 
 Можно получить директорию с задачами из исполняемого файла
 
-	$ arm-linux-androideabi-readelf --string-dump=.debug_str build/armv7-android/libdmengine.so | grep /job
+```sh
+$ arm-linux-androideabi-readelf --string-dump=.debug_str build/armv7-android/libdmengine.so | grep /job
+```
 
 Папка задачи называется так `job1298751322870374150`, каждый раз это название с уникальным случайным номером. 
 

+ 43 - 24
docs/ru/manuals/debugging-native-code-ios.md

@@ -11,13 +11,17 @@ brief: В этом руководстве описывается, как отл
 
 * Соберите бандл приложения с помощью утилиты bob с ключом `--with-symbols` 
 
-		$ cd myproject
-		$ wget http://d.defold.com/archive/<sha1>/bob/bob.jar
-		$ java -jar bob.jar --platform armv7-darwin build --with-symbols debug --archive bundle -bo build/ios -mp <app>.mobileprovision --identity "iPhone Developer: Your Name (ID)"
+```sh
+$ cd myproject
+$ wget http://d.defold.com/archive/<sha1>/bob/bob.jar
+$ java -jar bob.jar --platform armv7-darwin build --with-symbols --variant debug --archive bundle -bo build/ios -mp <app>.mobileprovision --identity "iPhone Developer: Your Name (ID)"
+```
 
 * Установите приложение с помощью `Xcode`,` iTunes` или [ios-deploy](https://github.com/ios-control/ios-deploy) 
 
-		$ ios-deploy -b <AppName>.ipa
+```sh
+$ ios-deploy -b <AppName>.ipa
+```
 
 * Получите папку `.dSYM` (т.е. отладочные символы) 
 
@@ -25,11 +29,12 @@ brief: В этом руководстве описывается, как отл
 
 	* Если вы используете нативные расширения, то папка `.dSYM` генерируется при сборке с помощью утилиты [bob.jar](https://www.defold.com/manuals/bob/). Требуется только сборка (без архивации и бандлинга): 
 
-			$ cd myproject
-			$ unzip .internal/cache/arm64-ios/build.zip
-			$ mv dmengine.dSYM <AppName>.dSYM
-			$ mv <AppName>.dSYM/Contents/Resources/DWARF/dmengine <AppName>.dSYM/Contents/Resources/DWARF/<AppName>
-
+```sh
+$ cd myproject
+$ unzip .internal/cache/arm64-ios/build.zip
+$ mv dmengine.dSYM <AppName>.dSYM
+$ mv <AppName>.dSYM/Contents/Resources/DWARF/dmengine <AppName>.dSYM/Contents/Resources/DWARF/<AppName>
+```
 
 ### Создание проекта
 
@@ -48,7 +53,7 @@ brief: В этом руководстве описывается, как отл
 
 	![add_files](images/extensions/debugging/ios/add_files.png)
 
-* Убедитесь, что флажок "Copy items if needed" снят. 
+* Убедитесь, что флажок «Copy items if needed» снят.
 
 	![add_source](images/extensions/debugging/ios/add_source.png)
 
@@ -56,6 +61,7 @@ brief: В этом руководстве описывается, как отл
 
 	![added_source](images/extensions/debugging/ios/added_source.png)
 
+
 * Отключите шаг `Build`
 
 	![edit_scheme](images/extensions/debugging/ios/edit_scheme.png)
@@ -77,13 +83,13 @@ brief: В этом руководстве описывается, как отл
 
 1. Либо выберите `Debug` -> `Attach to process...` и выберите оттуда приложение.
 
-1. Либо выберите `Attach to process by PID or Process name`.
+2. Либо выберите `Attach to process by PID or Process name`.
 
 	![select_device](images/extensions/debugging/ios/attach_to_process_name.png)
 
-	1. Запустите приложение на устройстве
+3. Запустите приложение на устройстве
 
-1. В `Edit Scheme` добавьте папку <AppName>.app в качестве исполняемого файла 
+4. В `Edit Scheme` добавьте папку <AppName>.app в качестве исполняемого файла 
 
 ### Отладочные символы
 
@@ -91,34 +97,45 @@ brief: В этом руководстве описывается, как отл
 
 * Добавьте путь `.dSYM` к lldb
 
-		(lldb) add-dsym <PathTo.dSYM> 
+```
+(lldb) add-dsym <PathTo.dSYM>
+```
 
 	![add_dsym](images/extensions/debugging/ios/add_dsym.png)
 
 * Убедитесь, что `lldb` успешно прочитал символы
 
-		(lldb) image list <AppName>
+```
+(lldb) image list <AppName>
+```
 
 ### Сопоставления путей
 
 * Добавьте исходный код движка (подправьте путь по своему усмотрению) 
 
-		(lldb) settings set target.source-map /Users/builder/ci/builds/engine-ios-64-master/build /Users/mathiaswesterdahl/work/defold
-		(lldb) settings append target.source-map /private/var/folders/m5/bcw7ykhd6vq9lwjzq1mkp8j00000gn/T/job4836347589046353012/upload/videoplayer/src /Users/mathiaswesterdahl/work/projects/extension-videoplayer-native/videoplayer/src
+```
+(lldb) settings set target.source-map /Users/builder/ci/builds/engine-ios-64-master/build /Users/mathiaswesterdahl/work/defold
+(lldb) settings append target.source-map /private/var/folders/m5/bcw7ykhd6vq9lwjzq1mkp8j00000gn/T/job4836347589046353012/upload/videoplayer/src /Users/mathiaswesterdahl/work/projects/extension-videoplayer-native/videoplayer/src
+```
 
-	* Возможно получить папку с задачами из исполняемого файла.
-	Папка задачи называется так `job1298751322870374150`, каждый раз это имя со случайным номером. 
+* Возможно получить папку с задачами из исполняемого файла.
+	Папка задачи называется `job1298751322870374150`, каждый раз это имя со случайным номером. 
+```sh
+$ dsymutil -dump-debug-map <executable> 2>&1 >/dev/null | grep /job
 
-			$ dsymutil -dump-debug-map <executable> 2>&1 >/dev/null | grep /job
+```
 
 * Проверьте сопоставления исходников
 
-		(lldb) settings show target.source-map
+```
+(lldb) settings show target.source-map
+```
 
 Вы можете проверить, из какого исходного файла происходит отладочный символ, используя команду
 
-	(lldb) image lookup -va <SymbolName>
-
+```
+(lldb) image lookup -va <SymbolName>
+```
 
 ### Точки останова
 
@@ -132,4 +149,6 @@ brief: В этом руководстве описывается, как отл
 
 Чтобы отладчик пустил папку `.dSYM`, UUID должен совпадать с UUID отлаживаемого исполняемого файла. Вы можете проверить UUID так:
 
-	$ dwarfdump -u <PathToBinary>
+```sh
+$ dwarfdump -u <PathToBinary>
+```

+ 34 - 20
docs/ru/manuals/debugging-native-code.md

@@ -78,35 +78,37 @@ Defold неплохо протестирован и очень редко дае
 
 Очень важно, чтобы вы сопоставили правильный движок со стеком вызовов. В противном случае очень вероятно, что вы получите неверную отладку. Если вы работаете с нативными расширениями, не забудьте добавить флаг [--with-symbols](https://www.defold.com/manuals/bob/) к [утилите bob](https://www.defold.com/manuals/bob/) или установите флажок "Generate debug symbols" в диалоговом окне пакета в редакторе, чтобы получить все необходимые данные с сервера сборки:
 
-* iOS и macOS - папка `dmengine.dSYM` в `build.zip` содержит символы отладки для сборок под iOS/macOS.
-* Android и Linux - сами исполняемые файлы содержат символы отладки.
-* Windows - файл `dmengine.pdb` в архиве ` build.zip` содержит символы отладки для сборок под Windows.
-* HTML5 - файл `dmengine.js.symbols` в архиве` build.zip` содержит символы отладки для сборок под HTML5.
-
-Если вы делаете сборки без нативных расширений, символы отладки доступны на [веб-сайте для скачивания Defold](http://d.defold.com):
-
-* iOS - Файлы `engine/armv7-darwin/dmengine_release.dSYM.zip` и` engine/arm64-darwin/dmengine_release.dSYM.zip` содержат символы отладки для 32- и 64-битных версий движка.
-* macOS - Файл `engine/x86_64-macos/dmengine_release.dSYM.zip` содержит символы отладки.
-* Android - Файлы движков `engine/armv7-android/dmengine.apk` и `engine/arm64-android/dmengine.apk` включают символы отладки для 32- и 64-битных версий движка.
-* Linux - Файл движка `engine/x86_64-linux/dmengine_release` включает символы отладки.
-* Windows - Файл `engine/x86_64-win32/dmengine_release.pdb` содержит символы отладки.
-* HTML5 - Файл `engine/js-web/dmengine_release.js.symbols` содержит символы отладки.
+* iOS — папка `dmengine.dSYM.zip` в `build/arm64-ios` содержит символы отладки для сборок iOS.
+* macOS — папка `dmengine.dSYM.zip` в `build/x86_64-macos` содержит символы отладки для сборок macOS.
+* Android — папка `projecttitle.apk.symbols/lib/` в выходном архиве сборки содержит символы отладки для целевых архитектур.
+* Linux — исполняемый файл содержит символы отладки.
+* Windows — файл `dmengine.pdb` в `build/x86_64-win32` содержит символы отладки для сборок Windows.
+* HTML5 — файл `dmengine.js.symbols` в `build/js-web` или `build/wasm-web` содержит символы отладки для сборок HTML5.
 
 ::: important
 Очень важно, чтобы вы сохранили где-нибудь символы отладки для каждого публичного релиза вашей игры, и чтобы вы знали, к какому релизу принадлежат отладочные символы. Вы не сможете отлаживать нативные сбои, если у вас не будет отладочных символов! Кроме того, вы должны держать под рукой включающую отладочные символы версию движка. Это позволяет лучше всего отображать стек вызовов.
 :::
 
+
+### Загрузка символов отладки в Google Play
+Вы можете [загрузить символы отладки в Google Play](https://developer.android.com/studio/build/shrink-code#android_gradle_plugin_version_40_or_earlier_and_other_build_systems), чтобы все сбои, зарегистрированные в Google Play, отображались с расшифрованными стеками вызовов. Заархивируйте содержимое папки `projecttitle.apk.symbols/lib/` из выходного архива сборки. Эта папка содержит одну или несколько подпапок с названиями архитектур, например `arm64-v8a` и `armeabi-v7a`.
+
+
 ### Генерация отладочных символов к стеку вызовов Android
 
 1. Получите его из папки сборки
 
+```sh
 	$ ls <project>/build/<platform>/[lib]dmengine[.exe|.so]
+```
 
-1. Распакуйте архив:
+2. Распакуйте архив:
 
+```sh
 	$ unzip dmengine.apk -d dmengine_1_2_105
+```
 
-1. Найдите адрес в стеке вызовов
+3. Найдите адрес в стеке вызовов
 
     Например, в стеке вызовов без отладочных символов это могло бы выглядеть так
 
@@ -114,9 +116,11 @@ Defold неплохо протестирован и очень редко дае
 
 	Где *00257224* это адрес
 
-1. Обработайте этот адрес командой
+4. Обработайте этот адрес командой
 
+```sh
     $ arm-linux-androideabi-addr2line -C -f -e dmengine_1_2_105/lib/armeabi-v7a/libdmengine.so _address_
+```
 
 Примечание: Если вы получите стектрейс из [логов Android](/manuals/debugging-game-and-system-logs), вы можете снабдить его отладочными символами с помощью [ndk-stack](https://developer.android.com/ndk/guides/ndk-stack.html).
 
@@ -124,24 +128,34 @@ Defold неплохо протестирован и очень редко дае
 
 1. Если вы используете нативные расширения, сервер может предоставить вам символы (.dSYM) (передайте ключ `--with-symbols` в bob.jar)
 
+```sh
 	$ unzip <project>/build/arm64-darwin/build.zip
 	# it will produce a Contents/Resources/DWARF/dmengine
+```
 
-1. Если вы не используете нативные расширения, скачайте стандартные отладочные символы:
+2. Если вы не используете нативные расширения, скачайте стандартные отладочные символы:
 
+```sh
 	$ wget http://d.defold.com/archive/<sha1>/engine/arm64-darwin/dmengine.dSYM
+```
 
-1. Получите отладочные символы, используя адрес загрузки
+3. Получите отладочные символы, используя адрес загрузки
 
-    По какой-то причине простое добавление адреса из стека вызовов не работает (т. е. адрес загрузки 0x0)
+	По какой-то причине простое добавление адреса из стека вызовов не работает (т. е. адрес загрузки 0x0)
 
+```sh
 		$ atos -arch arm64 -o Contents/Resources/DWARF/dmengine 0x1492c4
+```
 
 	# Также никакого результата не даст задание адреса загрузки напрямую
 
+```sh
 		$ atos -arch arm64 -o MyApp.dSYM/Contents/Resources/DWARF/MyApp -l0x100000000 0x1492c4
+```
 
-    Добавление адреса загрузки к адресу из стека вызовов даст нужный результат:
+	Добавление адреса загрузки к адресу из стека вызовов даст нужный результат:
 
+```sh
 		$ atos -arch arm64 -o MyApp.dSYM/Contents/Resources/DWARF/MyApp 0x1001492c4
 		dmCrash::OnCrash(int) (in MyApp) (backtrace_execinfo.cpp:27)
+```

+ 7 - 26
docs/ru/manuals/dev-app.md

@@ -9,36 +9,19 @@ brief: В этом руководстве объясняется, как уст
 
 ## Установка приложения для разработки
 
-Любое приложение, собранное в режиме отладки, сможет действовать как приложение для разработки. На Android доступна автономная версия движка Defold, а на iOS вам необходимо вручную собрать бандл и подписать его, используя свой собственный идентификатор подписи и provisioning профиль. 
+Любое iOS или Android приложение, собранное в режиме отладки, может использоваться как приложение для разработки. На самом деле, это рекомендуемый способ, так как такое приложение будет иметь правильные настройки проекта и использовать те же [нативные расширения](/manuals/extensions/), что и ваш проект.
 
-### Установка на iOS 
-
-Любое iOS приложение, бандл которого был собран как отладочный вариант, сможет действовать как приложение для разработки. Рекомендуется сделать бандл отладочного варианта приложения, над которым вы сейчас работаете. Это гарантирует, что приложение для разработки имеет правильные настройки проекта и использует те же [нативные расширения](/manuals/extensions/). Следуйте [инструкциям в руководстве по iOS](/manuals/ios/#creating-an-ios-application-bundle), чтобы собрать бандл для iOS. Обязательно выберите вариант Debug!
-
-### Установка на Android
+Начиная с Defold 1.4.0, вы можете собрать отладочный вариант вашего проекта без какого-либо контента. Используйте эту возможность, чтобы создать версию вашего приложения с нативными расширениями, подходящую для итеративной разработки, как описано в этом руководстве.
 
-Такая же рекомендация делать бандл отладочной версии, что и для iOS, работает и для Android. В дополнение к этой опции существует также автономная версия движка Defold, доступная в виде готового файла *.apk*, который вы можете установить на устройство и использовать для итеративной разработки по беспроводной сети. 
-::: important
-Автономная версия будет работать только для проектов без каких-либо [нативных расширений](/manuals/extensions/). Если ваш проект содержит native extension-ы, вы должны собрать бандл отладочного варианта вашего проекта, чтобы убедиться, что приложение для разработки содержит все native extension-ы, которые вы собираетесь использовать. 
-:::
-* Посетите http://d.defold.com, где можно найти скачать Defold. 
-* Щелкните версию, которую хотите загрузить, чтобы развернуть список доступных сборок движка.
-* Выберите *engine/armv7-android/dmengine.apk* для сборки с включенной отладкой для платформы Android (Armv7).
+![Сборка без контента](images/dev-app/contentless-bundle.png)
 
-![Скачать dmengine](images/dev-app/download_dmengine.png)
-
-Скачайте файл, затем введите следующую команду `adb` из папки содержащей *.apk*: 
+### Установка на iOS 
 
-```sh
-$ adb install dmengine.apk
-4445 KB/s (8706017 bytes in 1.912s)
-    pkg: /data/local/tmp/dmengine.apk
-Success
-```
+Следуйте [инструкциям в руководстве по iOS](/manuals/ios/#creating-an-ios-application-bundle), чтобы собрать бандл для iOS. Обязательно выберите вариант Debug!
 
-Приложение для разработки "dmengine" теперь доступно на устройстве.
+### Установка на Android
 
-![dmengine на устройстве](images/dev-app/dmengine_on_device.png)
+Следуйте [инструкциям в руководстве по Android](https://defold.com/manuals/android/#creating-an-android-application-bundle), чтобы собрать бандл для Android.
 
 ## Запуск вашей игры
 
@@ -50,8 +33,6 @@ Success
 4. Выберите <kbd>Project ▸ Build</kbd>, чтобы запустить игру. Для запуска игры может потребоваться некоторое время, поскольку игровой контент передается на устройство по сети.
 5. Пока игра запущена, вы по-прежнему можете использовать [горячую перезагрузку](/manuals/hot-reload/).
 
-![запуск](images/dev-app/launch.png)
-
 ### Подключение к устройству iOS через USB в Windows
 
 При подключении через USB в Windows к приложению для разработки, работающему на устройстве iOS, сначала необходимо [установить iTunes](https://www.apple.com/lae/itunes/download/). После установки iTunes вам также необходимо [включить персональную точку доступа](https://support.apple.com/en-us/HT204023) на вашем устройстве iOS в меню «Настройки». Если вы видите предупреждение, которое спрашивает «Доверять этому компьютеру?», тапните Доверять. Теперь устройство должно отображаться в разделе <kbd>Project ▸ Targets</kbd>, когда приложение для разработки запущено. 

+ 0 - 114
docs/ru/manuals/editor-keyboard-shortcuts.md

@@ -1,114 +0,0 @@
----
-title: Клавиатурные сочетания в редакторе
-brief: В данном руководстве показаны текущие сочетания клавиш и способы их настройки.
----
-
-# Клавиатурные сочетания
-
-## Стандартные
-
-| Комманда | Windows | macOS | Linux |
-|---------|---------|-------|-------|
-| Вверх | <kbd>Up</kbd> | <kbd>Up</kbd> | <kbd>Up</kbd> |
-| Ввод | <kbd>Enter</kbd> | <kbd>Enter</kbd> | <kbd>Enter</kbd> |
-| Вернуть | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>Z</kbd> | <kbd>Shift</kbd>+<kbd>Cmd</kbd>+<kbd>Z</kbd> | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>Z</kbd> |
-| Влево | <kbd>Left</kbd> | <kbd>Left</kbd> | <kbd>Left</kbd> |
-| Вниз | <kbd>Down</kbd> | <kbd>Down</kbd> | <kbd>Down</kbd> |
-| Вправо | <kbd>Right</kbd> | <kbd>Right</kbd> | <kbd>Right</kbd> |
-| Вставить | <kbd>Ctrl</kbd>+<kbd>V</kbd> | <kbd>Cmd</kbd>+<kbd>V</kbd> | <kbd>Ctrl</kbd>+<kbd>V</kbd> |
-| Вставка табуляции | <kbd>Tab</kbd> | <kbd>Tab</kbd> | <kbd>Tab</kbd> |
-| Выбрать следующее событие | <kbd>Ctrl</kbd>+<kbd>D</kbd> | <kbd>Cmd</kbd>+<kbd>D</kbd> | <kbd>Ctrl</kbd>+<kbd>D</kbd> |
-| Выделить всё | <kbd>Ctrl</kbd>+<kbd>A</kbd> | <kbd>Cmd</kbd>+<kbd>A</kbd> | <kbd>Ctrl</kbd>+<kbd>A</kbd> |
-| Выделить конец строки | <kbd>Shift</kbd>+<kbd>End</kbd> | <kbd>Shift</kbd>+<kbd>Alt</kbd>+<kbd>Down</kbd> | <kbd>Shift</kbd>+<kbd>End</kbd> |
-| Выделить конец файла | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>End</kbd> | <kbd>Shift</kbd>+<kbd>Cmd</kbd>+<kbd>Down</kbd> | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>End</kbd> |
-| Выделить начало строки |  | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>A</kbd> |  |
-| Выделить начало текста строки | <kbd>Shift</kbd>+<kbd>Home</kbd> | <kbd>Shift</kbd>+<kbd>Home</kbd> | <kbd>Shift</kbd>+<kbd>Home</kbd> |
-| Выделить начало файла | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>Home</kbd> | <kbd>Shift</kbd>+<kbd>Cmd</kbd>+<kbd>Up</kbd> | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>Home</kbd> |
-| Выделить ниже | <kbd>Shift</kbd>+<kbd>Down</kbd> | <kbd>Shift</kbd>+<kbd>Down</kbd> | <kbd>Shift</kbd>+<kbd>Down</kbd> |
-| Выделить предыдущее слово | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>Left</kbd> | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>Left</kbd> | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>Left</kbd> |
-| Выделить рамку | <kbd>F</kbd> | <kbd>F</kbd> | <kbd>F</kbd> |
-| Выделить слева | <kbd>Shift</kbd>+<kbd>Left</kbd> | <kbd>Shift</kbd>+<kbd>Left</kbd> | <kbd>Shift</kbd>+<kbd>Left</kbd> |
-| Выделить справа | <kbd>Shift</kbd>+<kbd>Right</kbd> | <kbd>Shift</kbd>+<kbd>Right</kbd> | <kbd>Shift</kbd>+<kbd>Right</kbd> |
-| Выделить страницу выше | <kbd>Shift</kbd>+<kbd>Page Up</kbd> | <kbd>Shift</kbd>+<kbd>Page Up</kbd> | <kbd>Shift</kbd>+<kbd>Page Up</kbd> |
-| Выделить страницу ниже | <kbd>Shift</kbd>+<kbd>Page Down</kbd> | <kbd>Shift</kbd>+<kbd>Page Down</kbd> | <kbd>Shift</kbd>+<kbd>Page Down</kbd> |
-| Выйти | <kbd>Esc</kbd> | <kbd>Esc</kbd> | <kbd>Esc</kbd> |
-| Вырезать | <kbd>Ctrl</kbd>+<kbd>X</kbd> | <kbd>Cmd</kbd>+<kbd>X</kbd> | <kbd>Ctrl</kbd>+<kbd>X</kbd> |
-| Выровнить камеру | <kbd>Period</kbd> | <kbd>Period</kbd> | <kbd>Period</kbd> |
-| Выход | <kbd>Ctrl</kbd>+<kbd>Q</kbd> | <kbd>Cmd</kbd>+<kbd>Q</kbd> | <kbd>Ctrl</kbd>+<kbd>Q</kbd> |
-| Горячая перезагрузка | <kbd>Ctrl</kbd>+<kbd>R</kbd> | <kbd>Cmd</kbd>+<kbd>R</kbd> | <kbd>Ctrl</kbd>+<kbd>R</kbd> |
-| Добавить (дополнительно) | <kbd>Shift</kbd>+<kbd>A</kbd> | <kbd>Shift</kbd>+<kbd>A</kbd> | <kbd>Shift</kbd>+<kbd>A</kbd> |
-| Добавить | <kbd>A</kbd> | <kbd>A</kbd> | <kbd>A</kbd> |
-| Документация | <kbd>F1</kbd> | <kbd>F1</kbd> | <kbd>F1</kbd> |
-| Закрыть | <kbd>Ctrl</kbd>+<kbd>W</kbd> | <kbd>Cmd</kbd>+<kbd>W</kbd> | <kbd>Ctrl</kbd>+<kbd>W</kbd> |
-| Закрыть всё | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>W</kbd> | <kbd>Shift</kbd>+<kbd>Cmd</kbd>+<kbd>W</kbd> | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>W</kbd> |
-| Заменить следующее | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>H</kbd> | <kbd>Alt</kbd>+<kbd>Cmd</kbd>+<kbd>G</kbd> | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>H</kbd> |
-| Заменить слово |  | <kbd>Alt</kbd>+<kbd>Cmd</kbd>+<kbd>F</kbd> |  |
-| Инструмент масштабирования | <kbd>R</kbd> | <kbd>R</kbd> | <kbd>R</kbd> |
-| Инструмент перемещения | <kbd>W</kbd> | <kbd>W</kbd> | <kbd>W</kbd> |
-| Инструмент поворота | <kbd>E</kbd> | <kbd>E</kbd> | <kbd>E</kbd> |
-| Инструмент стирания | <kbd>Shift</kbd>+<kbd>E</kbd> | <kbd>Shift</kbd>+<kbd>E</kbd> | <kbd>Shift</kbd>+<kbd>E</kbd> |
-| Искать в файлах | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>F</kbd> | <kbd>Shift</kbd>+<kbd>Cmd</kbd>+<kbd>F</kbd> | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>F</kbd> |
-| Найти далее | <kbd>Ctrl</kbd>+<kbd>G</kbd> | <kbd>Cmd</kbd>+<kbd>G</kbd> | <kbd>Ctrl</kbd>+<kbd>G</kbd> |
-| Найти предыдущее | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>G</kbd> | <kbd>Shift</kbd>+<kbd>Cmd</kbd>+<kbd>G</kbd> | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>G</kbd> |
-| Найти слово | <kbd>Ctrl</kbd>+<kbd>F</kbd> | <kbd>Cmd</kbd>+<kbd>F</kbd> | <kbd>Ctrl</kbd>+<kbd>F</kbd> |
-| Начало файла | <kbd>Ctrl</kbd>+<kbd>Home</kbd> | <kbd>Cmd</kbd>+<kbd>Up</kbd> | <kbd>Ctrl</kbd>+<kbd>Home</kbd> |
-| Новый файл | <kbd>Ctrl</kbd>+<kbd>N</kbd> | <kbd>Cmd</kbd>+<kbd>N</kbd> | <kbd>Ctrl</kbd>+<kbd>N</kbd> |
-| Остановка отладчика | <kbd>Shift</kbd>+<kbd>F5</kbd> |  | <kbd>Shift</kbd>+<kbd>F5</kbd> |
-| Отдалить | <kbd>Ctrl</kbd>+<kbd>'-'</kbd> | <kbd>Cmd</kbd>+<kbd>'-'</kbd> | <kbd>Ctrl</kbd>+<kbd>'-'</kbd> |
-| Открыть | <kbd>Ctrl</kbd>+<kbd>O</kbd> | <kbd>Cmd</kbd>+<kbd>O</kbd> | <kbd>Ctrl</kbd>+<kbd>O</kbd> |
-| Открыть ассет | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>R</kbd> | <kbd>Cmd</kbd>+<kbd>P</kbd> | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>R</kbd> |
-| Отменить | <kbd>Ctrl</kbd>+<kbd>Z</kbd> | <kbd>Cmd</kbd>+<kbd>Z</kbd> | <kbd>Ctrl</kbd>+<kbd>Z</kbd> |
-| Параметры | <kbd>Ctrl</kbd>+<kbd>Comma</kbd> | <kbd>Cmd</kbd>+<kbd>Comma</kbd> | <kbd>Ctrl</kbd>+<kbd>Comma</kbd> |
-| Перезагрузка таблицы стилей |  | <kbd>Ctrl</kbd>+<kbd>R</kbd> |  |
-| Переименовать | <kbd>F2</kbd> | <kbd>F2</kbd> | <kbd>F2</kbd> |
-| Перейти в конец строки | <kbd>End</kbd> | <kbd>Ctrl</kbd>+<kbd>E</kbd> | <kbd>End</kbd> |
-| Перейти в конец файла | <kbd>Ctrl</kbd>+<kbd>End</kbd> | <kbd>Cmd</kbd>+<kbd>Down</kbd> | <kbd>Ctrl</kbd>+<kbd>End</kbd> |
-| Перейти в начало | <kbd>Shift</kbd>+<kbd>Up</kbd> | <kbd>Shift</kbd>+<kbd>Up</kbd> | <kbd>Shift</kbd>+<kbd>Up</kbd> |
-| Перейти в начало строки |  | <kbd>Ctrl</kbd>+<kbd>A</kbd> |  |
-| Перейти в начало текста строки | <kbd>Home</kbd> | <kbd>Home</kbd> | <kbd>Home</kbd> |
-| Перейти к следующему слову | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>Right</kbd> | <kbd>Shift</kbd>+<kbd>Alt</kbd>+<kbd>Right</kbd> | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>Right</kbd> |
-| Перейти к строке | <kbd>Ctrl</kbd>+<kbd>L</kbd> | <kbd>Cmd</kbd>+<kbd>L</kbd> | <kbd>Ctrl</kbd>+<kbd>L</kbd> |
-| Переключение точки остановки | <kbd>F9</kbd> | <kbd>F9</kbd> | <kbd>F9</kbd> |
-| Переключение фильтров видимости | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>I</kbd> | <kbd>Shift</kbd>+<kbd>Cmd</kbd>+<kbd>I</kbd> | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>I</kbd> |
-| Пересобрать | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>B</kbd> | <kbd>Shift</kbd>+<kbd>Cmd</kbd>+<kbd>B</kbd> | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>B</kbd> |
-| Переукомплектовать | <kbd>Ctrl</kbd>+<kbd>U</kbd> | <kbd>Cmd</kbd>+<kbd>U</kbd> | <kbd>Ctrl</kbd>+<kbd>U</kbd> |
-| Перешагнуть | <kbd>F10</kbd> | <kbd>F10</kbd> | <kbd>F10</kbd> |
-| Повторно | <kbd>Ctrl</kbd>+<kbd>I</kbd> | <kbd>Ctrl</kbd>+<kbd>I</kbd> | <kbd>Ctrl</kbd>+<kbd>I</kbd> |
-| Показать паллет | <kbd>Space</kbd> | <kbd>Space</kbd> | <kbd>Space</kbd> |
-| Показать последнее скрытое | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>E</kbd> | <kbd>Shift</kbd>+<kbd>Cmd</kbd>+<kbd>E</kbd> | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>E</kbd> |
-| Показать подсказки | <kbd>Ctrl</kbd>+<kbd>Space</kbd> | <kbd>Ctrl</kbd>+<kbd>Space</kbd> | <kbd>Ctrl</kbd>+<kbd>Space</kbd> |
-| Показать/скрыть комментарий | <kbd>Ctrl</kbd>+<kbd>Slash</kbd> | <kbd>Cmd</kbd>+<kbd>Slash</kbd> | <kbd>Ctrl</kbd>+<kbd>Slash</kbd> |
-| Показать/скрыть левую панель | <kbd>F6</kbd> | <kbd>F6</kbd> | <kbd>F6</kbd> |
-| Показать/скрыть нижняя панель | <kbd>F7</kbd> | <kbd>F7</kbd> | <kbd>F7</kbd> |
-| Показать/скрыть правую панель | <kbd>F8</kbd> | <kbd>F8</kbd> | <kbd>F8</kbd> |
-| Показать/скрыть руководства по компонентам | <kbd>Ctrl</kbd>+<kbd>H</kbd> | <kbd>Ctrl</kbd>+<kbd>Cmd</kbd>+<kbd>H</kbd> | <kbd>Ctrl</kbd>+<kbd>H</kbd> |
-| Предыдущее слово | <kbd>Ctrl</kbd>+<kbd>Left</kbd> | <kbd>Alt</kbd>+<kbd>Left</kbd> | <kbd>Ctrl</kbd>+<kbd>Left</kbd> |
-| Предыдущий шаг | <kbd>Shift</kbd>+<kbd>F11</kbd> | <kbd>Shift</kbd>+<kbd>F11</kbd> | <kbd>Shift</kbd>+<kbd>F11</kbd> |
-| Приблизить | <kbd>Ctrl</kbd>+<kbd>'</kbd>+<kbd>'</kbd> | <kbd>Cmd</kbd>+<kbd>'</kbd>+<kbd>'</kbd> | <kbd>Ctrl</kbd>+<kbd>'</kbd>+<kbd>'</kbd> |
-| Приостановить сцену | <kbd>Ctrl</kbd>+<kbd>T</kbd> | <kbd>Cmd</kbd>+<kbd>T</kbd> | <kbd>Ctrl</kbd>+<kbd>T</kbd> |
-| Продолжить | <kbd>F5</kbd> | <kbd>F5</kbd> | <kbd>F5</kbd> |
-| Разделить выделенное на строки | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>L</kbd> | <kbd>Shift</kbd>+<kbd>Cmd</kbd>+<kbd>L</kbd> | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>L</kbd> |
-| Сборка | <kbd>Ctrl</kbd>+<kbd>B</kbd> | <kbd>Cmd</kbd>+<kbd>B</kbd> | <kbd>Ctrl</kbd>+<kbd>B</kbd> |
-| Сдвинуть вверх | <kbd>Alt</kbd>+<kbd>Up</kbd> | <kbd>Alt</kbd>+<kbd>Up</kbd> | <kbd>Alt</kbd>+<kbd>Up</kbd> |
-| Сдвинуть вниз | <kbd>Alt</kbd>+<kbd>Down</kbd> | <kbd>Alt</kbd>+<kbd>Down</kbd> | <kbd>Alt</kbd>+<kbd>Down</kbd> |
-| Скопировать | <kbd>Ctrl</kbd>+<kbd>C</kbd> | <kbd>Cmd</kbd>+<kbd>C</kbd> | <kbd>Ctrl</kbd>+<kbd>C</kbd> |
-| Скрыть выбранное | <kbd>Ctrl</kbd>+<kbd>E</kbd> | <kbd>Cmd</kbd>+<kbd>E</kbd> | <kbd>Ctrl</kbd>+<kbd>E</kbd> |
-| Следующее слово | <kbd>Ctrl</kbd>+<kbd>Right</kbd> | <kbd>Alt</kbd>+<kbd>Right</kbd> | <kbd>Ctrl</kbd>+<kbd>Right</kbd> |
-| Следующий шаг | <kbd>F11</kbd> | <kbd>F11</kbd> | <kbd>F11</kbd> |
-| Сохранить всё | <kbd>Ctrl</kbd>+<kbd>S</kbd> | <kbd>Cmd</kbd>+<kbd>S</kbd> | <kbd>Ctrl</kbd>+<kbd>S</kbd> |
-| Страница вверх | <kbd>Page Up</kbd> | <kbd>Page Up</kbd> | <kbd>Page Up</kbd> |
-| Страница вниз | <kbd>Page Down</kbd> | <kbd>Page Down</kbd> | <kbd>Page Down</kbd> |
-| Удалить | <kbd>Delete</kbd> | <kbd>Delete</kbd> | <kbd>Delete</kbd> |
-| Удалить в обратном направлении | <kbd>Backspace</kbd> | <kbd>Backspace</kbd> | <kbd>Backspace</kbd> |
-| Удалить до конца строки | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>Delete</kbd> | <kbd>Cmd</kbd>+<kbd>Delete</kbd> | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>Delete</kbd> |
-| Удалить предыдущее слово | <kbd>Ctrl</kbd>+<kbd>Backspace</kbd> | <kbd>Alt</kbd>+<kbd>Backspace</kbd> | <kbd>Ctrl</kbd>+<kbd>Backspace</kbd> |
-| Удалить следующее слово | <kbd>Ctrl</kbd>+<kbd>Delete</kbd> | <kbd>Alt</kbd>+<kbd>Delete</kbd> | <kbd>Ctrl</kbd>+<kbd>Delete</kbd> |
-| Удалить строку |  | <kbd>Ctrl</kbd>+<kbd>D</kbd> |  |
-| Удалить табуляцию | <kbd>Shift</kbd>+<kbd>Tab</kbd> | <kbd>Shift</kbd>+<kbd>Tab</kbd> | <kbd>Shift</kbd>+<kbd>Tab</kbd>  |
-
-
-## Настройка сочетаний клавиш
-
-Вы можете настроить сочетания клавиш, создав файл конфигурации (например, `keymap.edn` в вашем домашнем каталоге). Затем перейдите <kbd>File ▸ Preferences</kbd>, и измените <kbd>Path to custom keymap</kbd> к уже созданному файлу. Вам необходимо перезапустить Defold после установки этого параметра, а также каждый раз, когда вы редактируете файл keymap.
-
-Вы можете просмотреть и скачать сочетания клавиш для: [Windows](examples/keymap_win.edn), [MacOS](examples/keymap_macos.edn) and [Linux](examples/keymap_linux.edn)

+ 69 - 4
docs/ru/manuals/editor-preferences.md

@@ -11,6 +11,12 @@ brief: Вы можете изменить настройки редактора
 
 ![](images/editor/preferences_general.png)
 
+Load External Changes on App Focus
+: Включает сканирование на внешние изменения при получении фокуса редактором.
+
+Open Bundle Target Folder
+: Автоматически открывает папку с итоговым бандлом после завершения процесса упаковки.
+
 Включить Сжатие Текстур
 : Включает [сжатие текстур](/manuals/texture-profiles) для всех сборок, сделанных в редакторе.
 
@@ -20,11 +26,17 @@ Escape Quits Game
 Track Active Tab in Asset Browser
 : Файл, редактированный на выбранной вкладке в панели *Editor*, будет выбран в браузере ассетов (также известном как панель *Asset*).
 
-Path to custom keymap
-: Полный путь к файлу, содержащий [пользовательские сочетания клавиш](/manuals/editor-keyboard-shortcuts).
+Lint Code on Build
+: Включает [проверку кода (линтинг)](/manuals/writing-code/#linting-configuration) при сборке проекта. Эта опция включена по умолчанию, но её можно отключить, если линтинг в больших проектах занимает слишком много времени.
 
-Code editor font
-: Имя установленного в системе шрифта, для использования в редакторе програмного кода.
+Engine Arguments
+: Аргументы, которые будут переданы исполняемому файлу dmengine при сборке и запуске проекта из редактора.
+Используйте один аргумент на строку. Например:
+```
+--config=bootstrap.main_collection=/my dir/1.collectionc
+--verbose
+--graphics-adapter=vulkan
+```
 
 
 ## Програмный код
@@ -40,6 +52,30 @@ Open File
 Open File at Line
 : Шаблон, используемый пользовательским редактором для указания того, какой файл открыть и на какой номер строки. Шаблон `{file}` будет заменен именем открываемого файла, а `{line}` - номером строки.
 
+Code editor font
+: Имя установленного в системе шрифта, для использования в редакторе програмного кода.
+
+Zoom on Scroll
+: Изменять размер шрифта при прокрутке в редакторе кода, удерживая клавишу Cmd/Ctrl.
+
+
+### Открытие скриптов в Visual Studio Code
+
+![](images/editor/preferences_vscode.png)
+
+Чтобы открыть скриптовые файлы из редактора Defold напрямую в Visual Studio Code, необходимо задать следующие параметры, указав путь к исполняемому файлу:
+
+- macOS: `/Applications/Visual Studio Code.app/Contents/MacOS/Electron`
+- Linux: `/usr/bin/code`
+- Windows: `C:\Program Files\Microsoft VS Code\Code.exe`
+
+Укажите следующие параметры для открытия конкретных файлов и строк:
+
+- Open File: `. {file}`
+- Open File at Line: `. -g {file}:{line}`
+
+Символ `.` здесь необходим для открытия всей рабочей области, а не отдельного файла.
+
 
 ## Расширения
 
@@ -47,3 +83,32 @@ Open File at Line
 
 Build Server
 : URL-адрес сервера сборки, используемый при сборке проекта, содержащего [собственные расширения](/manuals/extensions). Можно добавить имя пользователя и токена к URL для аутентифицированного доступа к серверу сборки. Используйте следующую нотацию для указания имени пользователя и токена: `username:[email protected]`. Аутентифицированный доступ требуется для сборок Nintendo Switch и при запуске собственного экземпляра сервера сборки с включенной аутентификацией. [Оратитесь к документации по серверу сборки](https://github.com/defold/extender/blob/dev/README_SECURITY.md) для получения дополнительной информации).
+
+Build Server Username
+: имя пользователя для аутентификации.
+
+Build Server Password
+: пароль для аутентификации. Будет сохранён в зашифрованном виде в файле настроек.
+
+Build Server Headers
+: дополнительные заголовки, передаваемые серверу сборки при создании собственных расширений. Это важно при использовании сервиса CloudFlare или аналогичных с extender.
+
+## Инструменты
+
+![](images/editor/preferences_tools.png)
+
+Путь к ADB
+: Путь к инструменту командной строки [ADB](https://developer.android.com/tools/adb), установленному в системе. Если ADB уже установлен в типичном месте, редактор Defold использует его автоматически. Укажите путь вручную, если ADB установлен в нестандартном месте.
+
+Путь к ios-deploy
+: Путь к инструменту командной строки [ios-deploy](https://github.com/ios-control/ios-deploy), установленному в системе (только для macOS). Аналогично ADB, редактор использует его для установки и запуска iOS-приложений на подключённом iPhone. Укажите путь вручную, если ios-deploy установлен нестандартно.
+
+## Сочетания клавиш
+
+![](images/editor/preferences_keymap.png)
+
+Вы можете настроить сочетания клавиш редактора: добавить пользовательские или удалить встроенные. Используйте контекстное меню на отдельных командах в таблице сочетаний или дважды кликните / нажмите <kbd>Enter</kbd>, чтобы открыть всплывающее окно изменения сочетания.
+
+Некоторые сочетания могут иметь предупреждения: они отображаются оранжевым цветом. Наведите курсор на сочетание, чтобы увидеть предупреждение. Типичные случаи:
+- вводимые сочетания: выбранное сочетание вводимо в текстовых полях. Убедитесь, что команда отключена в контексте редактирования текста.
+- конфликты: одно сочетание назначено разным командам. Убедитесь, что одновременно активна только одна команда, иначе редактор выполнит одну из них непредсказуемо.

+ 441 - 92
docs/ru/manuals/editor-scripts.md

@@ -9,14 +9,16 @@ brief: Это руководство объясняет, как расширит
 
 ## Время выполнения скрипта редактора
 
-Сценарии редактора выполняются внутри редактора, в Lua VM, эмулированной Java VM. Все скрипты работают в одном едином окружении, а это означает, что они могут взаимодействовать друг с другом. Вы можете подключать модули Lua, также как и файлы `.script`. Помните версии Lua, которые работают внутри редактора, отличаются, поэтому убедитесь, что ваш общий код совместим. Редактор использует Lua версии 5.2.x, а точнее [luaj](https://github.com/luaj/luaj), которая в настоящее время является единственным жизнеспособным решением для запуска Lua на JVM. Кроме этого, есть некоторые ограничения:
-- нет пакетов `debug` и `coroutine`;
-- нет `os.execute` - мы предоставляем более удобный и безопасный способ выполнения shell-скриптов в разделе [actions](#actions);
-- нет пакетов `os.tmpname` и `io.tmpfile` - в настоящее время скрипты редактора могут обращаться к файлам только внутри каталога проекта;
-- в настоящее время нет `os.rename`, хотя мы хотим его добавить;
-- нет `os.exit` и `os.setlocale`.
-
-Все расширения редактора, определенные в сценариях редактора, загружаются при открытии проекта. При извлечении библиотек, расширения перезагружаются, поскольку в библиотеках, от которых вы зависите, могут быть новые скрипты редактора. Во время этой перезагрузки изменения в ваших собственных скриптах редактора не учитываются, поскольку вы можете находиться в процессе их изменения. Чтобы перезагрузить и их, нужно выполнить команду Project → Reload Editor Scripts.
+Сценарии редактора выполняются внутри редактора, в Lua VM, эмулированной Java VM. Все скрипты работают в одном едином окружении, а это означает, что они могут взаимодействовать друг с другом. Вы можете подключать модули Lua, также как и файлы `.script`, но версия Lua, работающая внутри редактора, отличается, поэтому убедитесь, что ваш общий код совместим. Редактор использует Lua версии 5.2.x, а точнее [luaj](https://github.com/luaj/luaj) — в настоящее время это единственное жизнеспособное решение для запуска Lua на JVM. Кроме того, есть некоторые ограничения:
+- отсутствует пакет `debug`;
+- отсутствует `os.execute`, однако предоставляется аналог — `editor.execute()`;
+- отсутствуют `os.tmpname` и `io.tmpfile` — в настоящее время скрипты редактора могут обращаться к файлам только внутри каталога проекта;
+- отсутствует `os.rename`, хотя мы планируем его добавить;
+- отсутствуют `os.exit` и `os.setlocale`;
+- нельзя использовать некоторые функции, выполнение которых занимает длительное время, в контекстах, где редактор ожидает немедленного ответа от скрипта. См. раздел [Режимы выполнения](#режимы-выполнения) для подробностей.
+
+Все расширения редактора, определённые в скриптах редактора, загружаются при открытии проекта. При извлечении библиотек расширения перезагружаются, так как в библиотеках, от которых вы зависите, могут появиться новые скрипты редактора. Во время этой перезагрузки изменения в ваших собственных скриптах редактора не учитываются, поскольку вы можете находиться в процессе их изменения. Чтобы перезагрузить и их, нужно выполнить команду **Project → Reload Editor Scripts**.
+
 ## Анатомия `.editor_script`
 
 Каждый скрипт редактора должен возвращать модуль, подобный этому:
@@ -24,7 +26,15 @@ brief: Это руководство объясняет, как расширит
 local M = {}
 
 function M.get_commands()
-  -- TODO
+  -- TODO - define editor commands
+end
+
+function M.get_language_servers()
+  -- TODO - define language servers
+end
+
+function M.get_prefs_schema()
+  -- TODO - define preferences
 end
 
 return M
@@ -34,20 +44,37 @@ return M
 ## API редактора
 
 Вы можете взаимодействовать с редактором, используя пакет `editor`, который определяет этот API:
-- `editor.platform` - строка, либо `"x86_64-win32"` для Windows, `"x86_64-macos"` для macOS, либо `"x86_64-linux"` для Linux.
-- `editor.get(node_id, property)` - получить значение определённого узла внутри редактора. Узлы в редакторе - это различные сущности, такие как файлы скриптов или коллекций, игровые объекты внутри коллекций, json-файлы, загруженные в качестве ресурсов, и т.д. `node_id` - это пользовательские данные, которые передаются в скрипт редактора самим редактором. Также вместо id узла можно передать путь к ресурсу, например `"/main/game.script"`. `property` - это строка. В настоящее время поддерживаются следующие свойства:
-  - `"path"` - путь к файлу из папки проекта для *resources* - сущностей, существующих в виде файлов. Пример возвращаемого значения: `"/main/game.script"`.
-  - `"text"` - текстовое содержимое ресурса, редактируемое как текст (например, файлы скриптов или json). Пример возвращаемого значения: `"function init(self)\nend"`. Обратите внимание, что это не то же самое, что читать файл лучше с помощью `io.open()`, потому что вы можете редактировать файл, не сохраняя его, и эти правки доступны только при обращении к свойству `"text"`.
-  - некоторые свойства отображаются в Properties, которые были выделены в Outline. Поддерживаются такие типы свойств контура:
-    - strings
-    - booleans
-    - numbers
-    - vec2/vec3/vec4
-    - resources
-
-    Обратите внимание, что некоторые из этих свойств могут быть доступны только для чтения, а некоторые могут быть недоступны в различных контекстах, поэтому вы должны использовать `editor.can_get`, прежде чем читать их, и `editor.can_set`, прежде чем заставить редактор установить их. Наведите курсор на имя свойства в Properties, чтобы увидеть всплывающую подсказку с информацией о том, как это свойство именуется в скриптах редактора. Вы можете установить свойства ресурса на nil, установив значение `""`.
-- `editor.can_get(node_id, property)` — проверьте, можете ли вы получить это свойство, чтобы `editor.get()` не выдал ошибку
-- `editor.can_set(node_id, property)` — проверьте, не приведет ли действие `"set"` с этим свойством к ошибке
+- `editor.platform` — строка: `"x86_64-win32"` для Windows, `"x86_64-macos"` для macOS или `"x86_64-linux"` для Linux.
+- `editor.version` — строка, версия Defold, например `"1.4.8"`.
+- `editor.engine_sha1` — строка, SHA1 движка Defold.
+- `editor.editor_sha1` — строка, SHA1 редактора Defold.
+- `editor.get(node_id, property)` — получить значение узла в редакторе. Узлы в редакторе — это различные сущности, такие как скриптовые или коллекционные файлы, игровые объекты в коллекциях, json-файлы, загруженные как ресурсы и т.д. `node_id` — это userdata, переданная редактором скрипту. Вместо `node_id` можно также передать путь к ресурсу, например `"/main/game.script"`. `property` — строка. Поддерживаются следующие свойства:
+  - `"path"` — путь к файлу из каталога проекта для *ресурсов* — сущностей, существующих как файлы или директории. Пример: `"/main/game.script"`
+  - `"children"` — список путей к дочерним ресурсам (для директорий)
+  - `"text"` — текстовое содержимое ресурса, редактируемое как текст (например, скрипты или json). Пример: `"function init(self)\nend"`. Это не то же самое, что чтение через `io.open()`, так как можно редактировать файл без сохранения, и такие изменения доступны только при обращении к свойству `"text"`.
+  - для атласов: `images` (список узлов изображений в атласе) и `animations` (список узлов анимаций)
+  - для анимаций атласа: `images` (то же, что и в атласе)
+  - для тайлмапов: `layers` (список узлов слоёв в тайлмапе)
+  - для слоёв тайлмапа: `tiles` (неограниченная двумерная сетка тайлов), см. `tilemap.tiles.*` для подробностей
+  - свойства, отображаемые в панели Properties при выделении объекта в Outline. Поддерживаются следующие типы:
+    - `strings`
+    - `booleans`
+    - `numbers`
+    - `vec2` / `vec3` / `vec4`
+    - `resources`
+
+  Обратите внимание, что некоторые из этих свойств могут быть доступны только для чтения или недоступны в определённых контекстах, поэтому перед чтением используйте `editor.can_get`, а перед установкой — `editor.can_set`. Наведите курсор на имя свойства в панели Properties, чтобы увидеть подсказку с именем свойства для скриптов редактора. Чтобы задать свойству значение `nil`, передайте пустую строку `""`.
+- `editor.can_get(node_id, property)` — проверить, можно ли безопасно получить это свойство с помощью `editor.get()`, не вызвав ошибку.
+- `editor.can_set(node_id, property)` — проверить, приведёт ли попытка установки свойства с помощью `editor.tx.set()` к ошибке.
+- `editor.create_directory(resource_path)` — создать директорию (и все отсутствующие родительские директории), если она не существует.
+- `editor.delete_directory(resource_path)` — удалить директорию, если она существует, включая все вложенные директории и файлы.
+- `editor.execute(cmd, [...args], [options])` — выполнить shell-команду, при необходимости получив её вывод.
+- `editor.save()` — сохранить все несохранённые изменения на диск.
+- `editor.transact(txs)` — изменить внутреннее состояние редактора с помощью одной или нескольких транзакций, созданных функциями `editor.tx.*`.
+- `editor.ui.*` — различные функции, связанные с пользовательским интерфейсом. См. [UI manual](/manuals/editor-scripts-ui).
+- `editor.prefs.*` — функции для работы с настройками редактора. См. раздел [preferences](#preferences).
+
+Полную документацию по API редактора можно найти [здесь](https://defold.com/ref/alpha/editor/).
 
 ## Команды
 
@@ -69,14 +96,9 @@ function M.get_commands()
       end,
       run = function(opts)
         local text = editor.get(opts.selection, "text")
-        return {
-          {
-            action = "set",
-            node_id = opts.selection,
-            property = "text",
-            value = strip_comments(text)
-          }
-        }
+        editor.transact({
+          editor.tx.set(opts.selection, "text", strip_comments(text))
+        })
       end
     },
     {
@@ -90,12 +112,7 @@ function M.get_commands()
       end,
       run = function(opts)
         local path = editor.get(opts.selection, "path")
-        return {
-          {
-            action = "shell",
-            command = {"./scripts/minify-json.sh", path:sub(2)}
-          }
-        }
+        editor.execute("./scripts/minify-json.sh", path:sub(2))
       end
     }
   }
@@ -103,25 +120,392 @@ end
 
 return M
 ```
-Редактор ожидает, что `get_commands()` вернет массив таблиц, каждая из которых описывает отдельную команду. Описание команды состоит из:
+Редактор ожидает, что `get_commands()` вернёт массив таблиц, каждая из которых описывает отдельную команду. Описание команды состоит из следующих полей:
+
+- `label` (обязательный) — текст пункта меню, который будет отображён пользователю.
+- `locations` (обязательный) — массив из следующих значений: `"Edit"`, `"View"`, `"Project"`, `"Debug"`, `"Assets"`, `"Bundle"` или `"Outline"`. Определяет, где команда должна быть доступна. `"Edit"`, `"View"`, `"Project"` и `"Debug"` относятся к верхнему меню, `"Assets"` — к контекстному меню в панели Assets, `"Outline"` — к контекстному меню в панели Outline, а `"Bundle"` — к подменю **Project → Bundle**.
+- `query` — способ для команды запросить у редактора необходимую информацию и определить, с какими данными она работает. Для каждого ключа в таблице `query` будет соответствующий ключ в таблице `opts`, который обратные вызовы `active` и `run` получают в качестве аргумента. Поддерживаемые ключи:
+  - `selection` — команда работает, когда есть выбранные элементы, и действует на них.
+    - `type` — тип интересующих команду узлов. Поддерживаемые значения:
+      - `"resource"` — в Assets и Outline: выбранный ресурс с файлом; в меню — открытый файл;
+      - `"outline"` — элемент в панели Outline; в меню — открытый файл;
+    - `cardinality` — количество выбранных элементов. Значение `"one"` означает, что в `opts.selection` передаётся один id узла. Значение `"many"` — массив из одного или нескольких id узлов.
+  - `argument` — аргумент команды. В настоящее время используется только в командах, расположенных в `"Bundle"`. Значение `true` означает, что пользователь явно выбрал команду упаковки, а `false` — что она вызвана повторно.
+- `id` — строковый идентификатор команды, например, используется для запоминания последней использованной команды упаковки в `prefs`.
+- `active` — функция, вызываемая для определения, активна ли команда. Возвращает `true` или `false`. Для `Assets` и `Outline` вызывается при открытии контекстного меню. Для `Edit`, `View`, `Project` и `Debug` вызывается при каждом взаимодействии пользователя с редактором (клавиатура, мышь и т.д.), поэтому функция должна быть максимально быстрой.
+- `run` — функция, вызываемая при выборе команды пользователем.
+
+### Использование команд для изменения состояния редактора в памяти
+
+Внутри обработчика `run` вы можете запрашивать и изменять состояние редактора в памяти. Запросы выполняются с помощью функции `editor.get()`, с помощью которой можно получить текущее состояние файлов и выделений (если используется `query = {selection = ...}`). Вы можете получить свойство `"text"` у скриптовых файлов, а также некоторые свойства, отображаемые в панели Properties — наведите курсор на имя свойства, чтобы увидеть подсказку с информацией о том, как это свойство называется в скриптах редактора. Изменение состояния редактора выполняется с помощью `editor.transact()`, где вы объединяете одну или несколько модификаций в один шаг, который можно отменить. Например, если вы хотите сбросить трансформацию игрового объекта, можно написать такую команду:
+```lua
+{
+  label = "Reset transform",
+  locations = {"Outline"},
+  query = {selection = {type = "outline", cardinality = "one"}},
+  active = function(opts)
+    local node = opts.selection
+    return editor.can_set(node, "position") 
+       and editor.can_set(node, "rotation") 
+       and editor.can_set(node, "scale")
+  end,
+  run = function(opts)
+    local node = opts.selection
+    editor.transact({
+      editor.tx.set(node, "position", {0, 0, 0}),
+      editor.tx.set(node, "rotation", {0, 0, 0}),
+      editor.tx.set(node, "scale", {1, 1, 1})
+    })
+  end
+}
+```
+
+#### Редактирование атласов
+
+Помимо чтения и записи свойств атласа, вы можете читать и изменять изображения и анимации в атласе. Атлас определяет свойства-списки узлов `images` и `animations`, а анимации определяют собственное свойство-список узлов `images`. Вы можете использовать шаги транзакций `editor.tx.add`, `editor.tx.remove` и `editor.tx.clear` с этими свойствами.
+
+Например, чтобы добавить изображение в атлас, выполните следующий код в обработчике `run` команды:
+```lua
+editor.transact({
+    editor.tx.add("/main.atlas", "images", {image="/assets/hero.png"})
+})
+```
+To find a set of all images in an atlas, execute the following code:
+```lua
+local all_images = {} ---@type table<string, true>
+-- first, collect all "bare" images
+local image_nodes = editor.get("/main.atlas", "images")
+for i = 1, #image_nodes do
+    all_images[editor.get(image_nodes[i], "image")] = true
+end
+-- second, collect all images used in animations
+local animation_nodes = editor.get("/main.atlas", "animations")
+for i = 1, #animation_nodes do
+    local animation_image_nodes = editor.get(animation_nodes[i], "images")
+    for j = 1, #animation_image_nodes do
+        all_images[editor.get(animation_image_nodes[j], "image")] = true
+    end
+end
+pprint(all_images)
+-- {
+--     ["/assets/hero.png"] = true,
+--     ["/assets/enemy.png"] = true,
+-- }}
+```
+To replace all animations in an atlas:
+```lua
+editor.transact({
+    editor.tx.clear("/main.atlas", "animations"),
+    editor.tx.add("/main.atlas", "animations", {
+        id = "hero_run",
+        images = {
+            {image = "/assets/hero_run_1.png"},
+            {image = "/assets/hero_run_2.png"},
+            {image = "/assets/hero_run_3.png"},
+            {image = "/assets/hero_run_4.png"}
+        }
+    })
+})
+```
+
+#### Редактирование tilesource
+
+Помимо свойств, отображаемых в Outline, tilesource определяет следующие дополнительные свойства:
+- `animations` — список узлов анимаций tilesource
+- `collision_groups` — список узлов групп столкновений tilesource
+- `tile_collision_groups` — таблица назначений групп столкновений для конкретных тайлов в tilesource
+
+Например, вот как можно настроить tilesource:
+```lua
+local tilesource = "/game/world.tilesource"
+editor.transact({
+    editor.tx.add(tilesource, "animations", {id = "idle", start_tile = 1, end_tile = 1}),
+    editor.tx.add(tilesource, "animations", {id = "walk", start_tile = 2, end_tile = 6, fps = 10}),
+    editor.tx.add(tilesource, "collision_groups", {id = "player"}),
+    editor.tx.add(tilesource, "collision_groups", {id = "obstacle"}),
+    editor.tx.set(tilesource, "tile_collision_groups", {
+        [1] = "player",
+        [7] = "obstacle",
+        [8] = "obstacle"
+    })
+})
+```
+
+#### Редактирование tilemap
+
+Tilemap определяет свойство `layers` — список узлов слоёв tilemap. Каждый слой также имеет свойство `tiles`, представляющее собой неограниченную двумерную сетку тайлов на этом слое. Это отличается от движка: тайлы не имеют жёстких границ и могут быть размещены в любых координатах, включая отрицательные. Для редактирования тайлов API скриптов редактора предоставляет модуль `tilemap.tiles` со следующими функциями:
+- `tilemap.tiles.new()` — создаёт новую структуру данных для неограниченной двумерной сетки тайлов (в редакторе, в отличие от движка, tilemap не имеет границ, и координаты могут быть отрицательными);
+- `tilemap.tiles.get_tile(tiles, x, y)` — возвращает индекс тайла в заданной координате;
+- `tilemap.tiles.get_info(tiles, x, y)` — возвращает полную информацию о тайле по координатам (структура данных совпадает с `tilemap.get_tile_info` из движка);
+- `tilemap.tiles.iterator(tiles)` — создаёт итератор по всем тайлам в tilemap;
+- `tilemap.tiles.clear(tiles)` — удаляет все тайлы из tilemap;
+- `tilemap.tiles.set(tiles, x, y, tile_or_info)` — задаёт тайл в определённой координате;
+- `tilemap.tiles.remove(tiles, x, y)` — удаляет тайл из определённой координаты.
+
+Пример: как напечатать содержимое всей tilemap:
+```lua
+local layers = editor.get("/level.tilemap", "layers")
+for i = 1, #layers do
+    local layer = layers[i]
+    local id = editor.get(layer, "id")
+    local tiles = editor.get(layer, "tiles")
+    print("layer " .. id .. ": {")
+    for x, y, tile in tilemap.tiles.iterator(tiles) do
+        print("  [" .. x .. ", " .. y .. "] = " .. tile)
+    end
+    print("}")
+end
+```
+
+Вот пример, который показывает, как добавить слой с тайлами в tilemap:
+```lua
+local tiles = tilemap.tiles.new()
+tilemap.tiles.set(tiles, 1, 1, 2)
+editor.transact({
+    editor.tx.add("/level.tilemap", "layers", {
+        id = "new_layer",
+        tiles = tiles
+    })
+})
+```
+
+### Использование shell-команд
+
+Внутри обработчика `run` вы можете записывать данные в файлы (используя модуль `io`) и выполнять shell-команды (с помощью функции `editor.execute()`). При выполнении shell-команды можно захватить её вывод как строку и использовать далее в коде. Например, если вы хотите создать команду для форматирования JSON, которая вызывает глобально установленный [`jq`](https://jqlang.github.io/jq/), можно написать следующую команду:
+```lua
+{
+  label = "Format JSON",
+  locations = {"Assets"},
+  query = {selection = {type = "resource", cardinality = "one"}},
+  action = function(opts)
+    local path = editor.get(opts.selection, "path")
+    return path:match(".json$") ~= nil
+  end,
+  run = function(opts)
+    local text = editor.get(opts.selection, "text")
+    local new_text = editor.execute("jq", "-n", "--argjson", "data", text, "$data", {
+      reload_resources = false, -- don't reload resources since jq does not touch disk
+      out = "capture" -- return text output instead of nothing
+    })
+    editor.transact({ editor.tx.set(opts.selection, "text", new_text) })
+  end
+}
+```
+Поскольку эта команда вызывает shell-программу в режиме только для чтения (и уведомляет редактор об этом с помощью `reload_resources = false`), вы получаете преимущество: действие можно отменить.
+
+::: sidenote
+Если вы хотите распространять свой скрипт редактора как библиотеку, возможно, стоит включить бинарную программу для платформ редактора в состав зависимости. Подробнее см. в разделе [Скрипты редактора в библиотеках](#editor-scripts-in-libraries).
+:::
+
+## Хуки жизненного цикла
+
+Существует специально обработанный файл скрипта редактора: `hooks.editor_script`, расположенный в корне вашего проекта, в том же каталоге, что и *game.project*. Этот и только этот скрипт редактора будет получать события жизненного цикла от редактора. Пример такого файла:
+```lua
+local M = {}
+
+function M.on_build_started(opts)
+  local file = io.open("assets/build.json", "w")
+  file:write("{\"build_time\": \"".. os.date() .."\"}")
+  file:close()
+end
+
+return M
+```
+Мы решили ограничить хуки жизненного цикла одним файлом скрипта редактора, потому что порядок, в котором выполняются хуки сборки, важнее, чем простота добавления очередного шага. Команды независимы друг от друга, поэтому порядок их отображения в меню не играет большой роли — в конечном итоге пользователь сам выбирает нужную команду. А вот с хуками порядок критичен: например, вы, вероятно, захотите создать контрольную сумму контента после того, как он был сжат... Наличие одного файла, который явно вызывает каждый шаг сборки в нужном порядке, позволяет решить эту проблему.
+
+Существующие хуки жизненного цикла, которые может определять `/hooks.editor_script`:
+- `on_build_started(opts)` — вызывается, когда игра собирается для запуска локально или на удалённой платформе через Project Build или Debug Start. Изменения, произведённые в этом хуке, попадут в собранную игру. Ошибка, выброшенная из этого хука, прервёт сборку. `opts` — таблица со следующими ключами:
+  - `platform` — строка в формате `%arch%-%os%`, описывающая платформу сборки. Обычно совпадает со значением `editor.platform`.
+- `on_build_finished(opts)` — вызывается после завершения сборки, независимо от её успешности. `opts` содержит:
+  - `platform` — как в `on_build_started`
+  - `success` — флаг, указывающий на успех сборки: `true` или `false`
+- `on_bundle_started(opts)` — вызывается при создании билда или HTML5-версии игры. Аналогично `on_build_started`, изменения из этого хука попадут в билд, а ошибки его прервут. `opts` содержит:
+  - `output_directory` — путь к каталогу с результатами сборки, например: `"/path/to/project/build/default/__htmlLaunchDir"`
+  - `platform` — платформа, для которой создаётся сборка. Список возможных значений см. в [руководстве по Bob](/manuals/bob).
+  - `variant` — тип сборки: `"debug"`, `"release"` или `"headless"`
+- `on_bundle_finished(opts)` — вызывается по завершении сборки, вне зависимости от результата. `opts` содержит те же поля, что и `on_bundle_started`, плюс ключ `success`.
+- `on_target_launched(opts)` — вызывается, когда пользователь запускает игру, и она успешно стартует. `opts` содержит ключ `url`, указывающий на адрес запущенного движка, например `"http://127.0.0.1:35405"`
+- `on_target_terminated(opts)` — вызывается, когда запущенная игра закрывается. Использует те же `opts`, что и `on_target_launched`
+
+Обратите внимание: хуки жизненного цикла работают только в редакторе и не выполняются при сборке через Bob из командной строки.
+
+## Языковые серверы
+
+Редактор поддерживает подмножество [Language Server Protocol](https://microsoft.github.io/language-server-protocol/). Хотя в будущем мы планируем расширить поддержку LSP-функций, на данный момент редактор может только отображать диагностические сообщения (например, предупреждения линтера) и предлагать автодополнение.
+
+Чтобы определить языковой сервер, необходимо отредактировать функцию `get_language_servers` в вашем скрипте редактора следующим образом:
+
+```lua
+function M.get_language_servers()
+  local command = 'build/plugins/my-ext/plugins/bin/' .. editor.platform .. '/lua-lsp'
+  if editor.platform == 'x86_64-win32' then
+    command = command .. '.exe'
+  end
+  return {
+    {
+      languages = {'lua'},
+      watched_files = {
+        { pattern = '**/.luacheckrc' }
+      },
+      command = {command, '--stdio'}
+    }
+  }
+end
+```
+Редактор запустит языковой сервер, используя указанный `command`, через стандартный ввод и вывод процесса сервера для взаимодействия.
+
+Таблица определения языкового сервера может содержать следующие поля:
+- `languages` (обязательно) — список языков, поддерживаемых сервером, как указано [здесь](https://code.visualstudio.com/docs/languages/identifiers#_known-language-identifiers) (также поддерживаются расширения файлов);
+- `command` (обязательно) — массив, содержащий команду и её аргументы;
+- `watched_files` — массив таблиц с ключом `pattern` (глоб-шаблон), которые вызовут уведомление сервера о [изменении отслеживаемых файлов](https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#workspace_didChangeWatchedFiles).
+
+## HTTP-сервер
+
+Каждый запущенный экземпляр редактора включает в себя HTTP-сервер. Этот сервер можно расширить с помощью скриптов редактора. Чтобы расширить HTTP-сервер редактора, необходимо добавить функцию `get_http_server_routes` в ваш скрипт редактора — она должна возвращать дополнительные маршруты:
+```lua
+print("My route: " .. http.server.url .. "/my-extension")
+
+function M.get_http_server_routes()
+  return {
+    http.server.route("/my-extension", "GET", function(request)
+      return http.server.response(200, "Hello world!")
+    end)
+  }
+end
+```
+После перезагрузки скриптов редактора вы увидите следующий вывод в консоли: `My route: http://0.0.0.0:12345/my-extension`. Если вы откроете эту ссылку в браузере, вы увидите сообщение `"Hello world!"`.
+
+Аргумент `request` на входе — это простая таблица Lua с информацией о запросе. Она содержит следующие ключи: `path` (URL-путь, начинающийся с `/`), `method` (HTTP-метод запроса, например `"GET"`), `headers` (таблица с именами заголовков в нижнем регистре), и, опционально, `query` (строка запроса) и `body` (если маршрут указывает, как интерпретировать тело запроса). Например, если вы хотите создать маршрут, который принимает тело в формате JSON, определите его с параметром-конвертером `"json"`:
+```lua
+http.server.route("/my-extension/echo-request", "POST", "json", function(request)
+  return http.server.json_response(request)
+end)
+```
+Вы можете протестировать этот эндпоинт в командной строке с помощью `curl` и `jq`:
+```sh
+curl 'http://0.0.0.0:12345/my-extension/echo-request?q=1' -X POST --data '{"input": "json"}' | jq
+{
+  "path": "/my-extension/echo-request",
+  "method": "POST",
+  "query": "q=1",
+  "headers": {
+    "host": "0.0.0.0:12345",
+    "content-type": "application/x-www-form-urlencoded",
+    "accept": "*/*",
+    "user-agent": "curl/8.7.1",
+    "content-length": "17"
+  },
+  "body": {
+    "input": "json"
+  }
+}
+```
+Путь маршрута поддерживает шаблоны, которые могут быть извлечены из пути запроса и переданы в функцию-обработчик как часть запроса, например:
+```lua
+http.server.route("/my-extension/setting/{category}.{key}", function(request)
+  return http.server.response(200, tostring(editor.get("/game.project", request.category .. "." .. request.key)))
+end)
+```
+Теперь, если вы откроете, например, `http://0.0.0.0:12345/my-extension/setting/project.title`, вы увидите название вашей игры, взятое из файла `/game.project`.
+
+Помимо шаблона с одним сегментом пути, вы также можете сопоставить оставшуюся часть URL-пути, используя синтаксис `{*name}`. Например, вот простой эндпоинт файлового сервера, который обслуживает файлы из корня проекта:
+```lua
+http.server.route("/my-extension/files/{*file}", function(request)
+  local attrs = editor.external_file_attributes(request.file)
+  if attrs.is_file then
+    return http.server.external_file_response(request.file)
+  else
+    return 404
+  end
+end)
+```
+Теперь, если открыть, например, `http://0.0.0.0:12345/my-extension/files/main/main.collection` в браузере, отобразится содержимое файла `main/main.collection`.
+
+## Скрипты редактора в библиотеках
+
+Вы можете публиковать библиотеки с командами для использования другими пользователями, и редактор автоматически их подхватит. Хуки, с другой стороны, не могут быть подхвачены автоматически, так как они должны быть определены в файле, расположенном в корневой папке проекта, в то время как библиотеки предоставляют только подкаталоги. Это сделано для того, чтобы предоставить больше контроля над процессом сборки: вы всё ещё можете создавать хуки жизненного цикла как обычные функции в `.lua`-файлах, чтобы пользователи вашей библиотеки могли подключать их в своём `/hooks.editor_script`.
+
+Также обратите внимание, что хотя зависимости отображаются в окне Assets, они не существуют как обычные файлы (это записи внутри zip-архива). Однако можно заставить редактор извлекать определённые файлы из зависимостей в папку `build/plugins/`. Чтобы это сделать, необходимо создать файл `ext.manifest` в вашей библиотеке и затем создать папку `plugins/bin/${platform}` в той же директории, где находится `ext.manifest`. Файлы в этой папке будут автоматически извлечены в `/build/plugins/${extension-path}/plugins/bin/${platform}`, чтобы ваши скрипты редактора могли ссылаться на них.
+
+## Предпочтения
+
+Скрипты редактора могут определять и использовать предпочтения — постоянные, не зафиксированные в системе управления версиями данные, хранящиеся на компьютере пользователя. Эти предпочтения обладают тремя основными характеристиками:
+- типизированные: каждое предпочтение имеет определение схемы, которое включает тип данных и дополнительные метаданные, такие как значение по умолчанию;
+- с областью действия: предпочтения могут иметь область действия на уровне проекта или на уровне пользователя;
+- вложенные: каждый ключ предпочтения представляет собой строку с точечной нотацией, где первый сегмент определяет скрипт редактора, а остальные — вложенные свойства.
+
+Все предпочтения должны быть зарегистрированы путём определения их схемы:
+```lua
+function M.get_prefs_schema()
+  return {
+    ["my_json_formatter.jq_path"] = editor.prefs.schema.string(),
+    ["my_json_formatter.indent.size"] = editor.prefs.schema.integer({default = 2, scope = editor.prefs.SCOPE.PROJECT}),
+    ["my_json_formatter.indent.type"] = editor.prefs.schema.enum({values = {"spaces", "tabs"}, scope = editor.prefs.SCOPE.PROJECT}),
+  }
+end
+```
+После перезагрузки такого скрипта редактора редактор зарегистрирует эту схему. Затем скрипт может получать и задавать предпочтения, например:
+```lua
+-- Get a specific preference
+editor.prefs.get("my_json_formatter.indent.type")
+-- Returns: "spaces"
+
+-- Get an entire preference group
+editor.prefs.get("my_json_formatter")
+-- Returns:
+-- {
+--   jq_path = "",
+--   indent = {
+--     size = 2,
+--     type = "spaces"
+--   }
+-- }
+
+-- Set multiple nested preferences at once
+editor.prefs.set("my_json_formatter.indent", {
+    type = "tabs",
+    size = 1
+})
+```
+
+## Режимы выполнения
+
+Среда выполнения скриптов редактора использует 2 режима выполнения, которые в основном прозрачны для скриптов: **немедленный (immediate)** и **долгосрочный (long-running)**.
+
+**Немедленный** режим используется, когда редактору необходимо получить ответ от скрипта как можно быстрее. Например, обратные вызовы `active` у команд меню выполняются в немедленном режиме, поскольку эти проверки выполняются в UI-потоке редактора в ответ на действия пользователя и должны обновить интерфейс в пределах одного кадра.
+
+**Долгосрочный** режим используется, когда редактору не требуется мгновенный ответ от скрипта. Например, обратные вызовы `run` у команд меню выполняются в **долгосрочном** режиме, позволяя скрипту выполнять работу дольше.
 
-- `label` (обязательно) - текст пункта меню, который будет отображаться пользователю
-- `locations` (обязательно) - массив из `"Edit"`, `"View"`, `"Assets"` или `"Outline"`, описывает место, где эта команда должна быть доступна. `"Edit"` и `"View"` означают строку меню сверху, `"Assets"` означает контекстное меню в панели Assets, а `"Outline"` означает контекстное меню в панели Outline.
-- `query` - способ для команды запросить у редактора необходимую информацию и определить, над какими данными она работает. Для каждого ключа в таблице `query` будет соответствующий ключ в таблице `opts`, который обратные вызовы `active` и `run` получают в качестве аргумента. Поддерживаемые ключи:
-  - `selection` означает, что эта команда действительна, когда есть что-то выбранное, и она действует на это выбранное.
-    - `type` - это тип выбранных узлов, которые интересуют команду, в настоящее время допустимы такие типы:
-      - `"resource"` - в Assets и Outline, ресурс - это выделенный элемент, который имеет соответствующий файл. В строке меню (Edit или View), ресурс - это открытый в данный момент файл;
-      - `"outline"` - то, что может быть показано в контуре. В Outline это выделенный элемент, в строке меню - открытый файл;
-    - `cardinality` определяет, сколько выделенных элементов должно быть. Если `"one"`, выбор, переданный в обратный вызов команды, будет единственным идентификатором узла. Если `"many"`, то выборка, передаваемая в обратный вызов команды, будет массивом из одного или нескольких идентификаторов узлов.
-- `active` - обратный вызов, который выполняется для проверки того, что команда активна, ожидается, что он вернет булево значение. Если `locations` включают `"Assets"` или `"Outline"`, `active` будет вызван при показе контекстного меню. Если местоположения включают `"Edit"` или `"View"`, active будет вызываться при каждом взаимодействии пользователя, например, при наборе текста на клавиатуре или щелчке мышью, поэтому убедитесь, что `active` работает относительно быстро.
-- `run` - обратный вызов, который выполняется, когда пользователь выбирает пункт меню, ожидается, что он вернет массив [actions](#actions).
+Некоторые функции, используемые в скриптах редактора, могут выполняться достаточно долго. Например, `editor.execute("git", "status", {reload_resources=false, out="capture"})` может занять до секунды на достаточно крупных проектах. Чтобы сохранить отзывчивость редактора и производительность, функции, которые могут выполняться долго, запрещены в контекстах, где от скрипта ожидается немедленный ответ. Попытка использовать такую функцию в немедленном контексте приведёт к ошибке: `Cannot use long-running editor function in immediate context`. Чтобы избежать этой ошибки, избегайте вызова таких функций в немедленных контекстах.
+
+Следующие функции считаются долгосрочными и не могут использоваться в немедленном режиме:
+- `editor.create_directory()`, `editor.delete_directory()`, `editor.save()`, `os.remove()` и `file:write()`: эти функции изменяют файлы на диске, вызывая необходимость синхронизации состояния ресурсов в памяти с данными на диске, что может занять несколько секунд в больших проектах.
+- `editor.execute()`: выполнение команд оболочки может занимать непредсказуемое количество времени.
+- `editor.transact()`: крупные транзакции с широко используемыми узлами могут занимать сотни миллисекунд, что слишком долго для обновления UI.
+
+Следующие контексты выполнения кода используют немедленный режим:
+- Обратные вызовы `active` у команд меню: редактору нужен ответ от скрипта в пределах одного UI-кадра.
+- Верхний уровень скриптов редактора: предполагается, что перезагрузка скриптов не должна иметь побочных эффектов.
 
 ## Действия
 
-Действие - это таблица, описывающая, что должен сделать редактор. Каждое действие имеет ключ `action`. Действия бывают двух видов: отменяемые и не отменяемые.
+::: sidenote
+Ранее редактор взаимодействовал с Lua VM в блокирующем режиме, поэтому была строгая необходимость в том, чтобы скрипты редактора не блокировали выполнение, поскольку некоторые взаимодействия должны выполняться из UI-потока редактора. По этой причине, например, отсутствовали функции `editor.execute()` и `editor.transact()`. Выполнение скриптов и изменение состояния редактора осуществлялось путём возврата массива "действий" из хуков и обработчиков `run` команд.
+
+Теперь редактор взаимодействует с Lua VM в неблокирующем режиме, поэтому в этих действиях больше нет необходимости: использование функций, таких как `editor.execute()`, более удобно, лаконично и мощно. Эти действия теперь считаются **УСТАРЕВШИМИ**, хотя мы не планируем их удаление.
+:::
+
+Скрипты редактора могут возвращать массив действий из функции `run` команды или из функций хуков в файле `/hooks.editor_script`. Эти действия затем будут выполнены редактором.
+
+Действие — это таблица, описывающая, что редактор должен сделать. Каждое действие содержит ключ `action`. Существуют два типа действий: отменяемые и неотменяемые.
 
 ### Отменяемые действия
 
+::: sidenote
+Предпочтительно использовать `editor.transact()`.
+:::
+
+Отменяемое действие может быть отменено после его выполнения. Если команда возвращает несколько отменяемых действий, они выполняются вместе и отменяются также вместе. Следует использовать отменяемые действия, когда это возможно. Их недостаток заключается в том, что они более ограничены по возможностям.
 
 Существующие отменяемые действия:
 - `"set"` — установка свойства узла в редакторе на некоторое значение. Пример:
@@ -140,6 +524,10 @@ return M
 
 ### Неотменяемые действия
 
+::: sidenote
+Предпочтительно использовать `editor.execute()`.
+:::
+
 Неотменяемые действие, очищает историю отмены, поэтому, если вы хотите отменить такое действие, вам придется использовать другие средства, например, контроль версий.
 
 Существующие неотменяемые действия:
@@ -153,49 +541,10 @@ return M
     }
   }
   ```
-  Действие `"shell"` требует ключ `command`, который представляет собой массив команд и их аргументов. Основное отличие от `os.execute` заключается в том, что поскольку это потенциально опасная операция, редактор покажет диалог подтверждения, спрашивающий пользователя, хочет ли он выполнить эту команду. Он будет помнить каждую команду, которую пользователь уже разрешил.
-
-### Действие при смешивании и побочные эффекты
-
-Вы можете смешивать отменяемые и неотменяемые действия. Действия выполняются последовательно, поэтому в зависимости от порядка действий вы потеряете возможность отменить часть команды.
-
-Вместо того чтобы возвращать действия из функций, которые их ожидают, вы можете просто читать и записывать в файлы напрямую, используя `io.open()`. Это вызовет перезагрузку ресурсов, которая очистит историю отмены.
-
-## Хуки жизненного цикла
+  Действие `"shell"` требует ключ `command`, который представляет собой массив с командой и её аргументами.
 
-Существует специально обработанный файл скрипта редактора: `hooks.editor_script`, расположенный в корне вашего проекта, в том же каталоге, что и *game.project*. Этот и только этот скрипт редактора будет получать события жизненного цикла от редактора. Пример такого файла:
-```lua
-local M = {}
-
-function M.on_build_started(opts)
-  local file = io.open("assets/build.json", "w")
-  file:write("{\"build_time\": \"".. os.date() .."\"}")
-  file:close()
-end
-
-return M
-```
-
-Каждый хук жизненного цикла может возвращать действия или записывать в файлы в директории проекта.
-
-Существующие хуки жизненного цикла, которые могут определять `/hooks.editor_script`:
-- `on_build_started(opts)` — выполняется, когда игра собирается для запуска локально или на удаленной цели. Ваши изменения, будь то возвращенные действия или обновленное содержимое файлов, появятся в собранной игре. Вызов ошибки из этого хука прервет сборку. `opts` - это таблица, содержащая следующие ключи:
-  - `platform` — строка в формате `%arch%-%os%`, описывающая, для какой платформы он создан, в настоящее время всегда то же значение, что и в `editor.platform`.
-- `on_build_finished(opts)` — выполняется, когда сборка закончена успешно или нет `opts` представляет собой таблицу со следующими ключами:
-  - `platform` — также как и в `on_build_started`
-  - `success` — успешна ли сборка `true` или `false`
-- `on_bundle_started(opts)` — выполняется, при создании пакета или сборки HTML5-версии игры. Как и в случае с `on_build_started`, изменения, вызванные этим хуком, появятся в пакете, а ошибки прервут упаковывание. `opts` будет иметь такие ключи:
-  - `output_directory` — путь к файлу, указывающий на каталог с выводом пакета, например `"/path/to/project/build/default/__htmlLaunchDir"`
-  - `platform` — платформа, на которой игра упаковывается. Список возможных вариантов платформы см. в [Bob manual](/manuals/bob).
-  - `variant` — вариант упаковывания `"debug"`, `"release"` или `"headless"`
-- `on_bundle_finished(opts)` — выполняется, когда упаковывание завершается, независимо от того, успешно или нет. `opts` - это таблица с теми же данными, что и `opts` в `on_bundle_started`, плюс ключ `success`, указывающий на успешность сборки.
-- `on_target_launched(opts)` — выполняется, когда пользователь запускает игру и она успешно запускается. `opts` содержит ключ `url`, указывающий на запущенный сервис движка, например, `"http://127.0.0.1:35405"`
-- `on_target_terminated(opts)` — выполняется при закрытии запущенной игры, имеет те же опции, что и `on_target_launched`
-
-Обратите внимание, что хуки жизненного цикла в настоящее время являются функцией только для редактора, и они не выполняются Бобом при упаковывании из командной строки.
-
-## Скрипты редактора в библиотеках
+### Смешивание действий и побочных эффектов
 
-Вы можете опубликовать библиотеки для использования другими людьми, содержащие команды, и они будут автоматически подхвачены редактором. Хуки, с другой стороны, не могут быть подхвачены автоматически, так как они должны быть определены в файле, который находится в корневой папке проекта, а библиотеки раскрывают только вложенные папки. Это сделано для большего контроля над процессом сборки: вы по-прежнему можете создавать хуки жизненного цикла как простые функции в файлах `.lua`, чтобы пользователи вашей библиотеки могли включать и использовать их в своих проектах `/hooks.editor_script`.
+Вы можете комбинировать отменяемые и неотменяемые действия. Действия выполняются последовательно, поэтому в зависимости от порядка выполнения вы можете потерять возможность отменить часть команды.
 
-Также обратите внимание, что хотя зависимости отображаются в Assets, они не существуют как файлы (это записи в zip-архиве), поэтому в настоящее время нет простого способа выполнить сценарий оболочки, который вы предоставляете в зависимости. Если вам это необходимо, вам придется извлечь предоставленные сценарии, получив их текст с помощью `editor.get()` и записав их куда-нибудь с помощью `file:write()`, например, в папку `build/editor-scripts/your-extension-name`.
+Вместо возврата действий из функций, которые этого ожидают, вы можете напрямую читать и записывать файлы с помощью `io.open()`. Это вызовет перезагрузку ресурса и очистит историю отмен.

+ 96 - 184
docs/ru/manuals/editor.md

@@ -3,261 +3,173 @@ title: Обзор редактора Defold
 brief: Данное руководство представляет собой обзор внешнего вида и принципов работы редактора Defold, а также навигации в нем.
 ---
 
-# Обзор редактора Defold
+# Обзор редактора
 
-Назначение редактора --- просмотр и эффективное управление файлами игрового проекта. При открытии файла на редактирование, запускается соответствующий редактор, при этом вся необходимая информация о файле отображается в отдельных представлениях.
+Редактор позволяет эффективно просматривать и управлять всеми файлами вашего игрового проекта. При редактировании файлов открывается соответствующий редактор, отображающий всю релевантную информацию о файле в отдельных панелях.
 
 ## Запуск редактора
 
-При запуске редактора Defold, появляется экран выбора и создания проекта. Кликните мышью, в соответствии с желаемым действием:
+При запуске редактора Defold вы увидите экран выбора и создания проекта. Выберите, что хотите сделать:
 
-Home
-: Отображает недавно открывавшиеся проекты, предоставляя к ним быстрый доступ. Это представление открывается по умолчанию.
+Домашняя страница
+: Показывает список недавно открытых проектов для быстрого доступа. Это представление используется по умолчанию.
 
-New Project
-: Позволяет создать новый проект Defold. Здесь вам необходимо выбрать, хотите ли вы использовать базовый шаблон (из вкладки *From Template*), следовать учебнику (вкладка *From Tutorial*) или попробовать один из проектов-примеров (вкладка *From Sample*).
+Новый проект
+: Нажмите, если хотите создать новый проект Defold. Затем выберите, хотите ли вы использовать базовый шаблон (вкладка *From Template*), следовать пошаговому руководству (вкладка *From Tutorial*) или попробовать один из демонстрационных проектов (вкладка *From Sample*).
 
   ![new project](images/editor/new_project.png)
 
-  При создании новый проект сохраняется на локальном диске, и все сделанные изменения сохраняются локально.
+  Созданный проект сохраняется на вашем локальном диске, а все изменения записываются локально.
 
-Подробнее о различных опциях можно узнать в [руководстве по настройке проекта](https://www.defold.com/manuals/project-setup/).
+Подробнее о доступных вариантах читайте в [руководстве по настройке проекта](https://www.defold.com/manuals/project-setup/).
 
 ## Панели редактора
 
-Редактор Defold разделен на несколько панелей, или представлений, которые отображают определенную информацию.
+Редактор Defold разделён на несколько панелей (views), отображающих определённую информацию.
 
 ![Editor 2](images/editor/editor2_overview.png)
 
 Панель *Assets*
-: Содержит список всех файлов, являющихся частью проекта. Навигация по списку осуществляется посредством прокрутки мыши. В этом представлении могут быть выполнены любые файловые операции:
+: Показывает все файлы проекта. Щёлкайте и прокручивайте список для навигации. Здесь можно выполнять все операции с файлами:
 
-   - Выполните <kbd>двойной клик</kbd> по файлу, чтобы открыть его в редакторе, соответствующем этому типу файлов.
-   - <kbd>Перетащите и бросьте</kbd>, чтобы добавить в проект файлы из других расположений на диске или переместить файлы и папки в новые расположения в пределах проекта.
-   - Выполните <kbd>клик ПКМ</kbd>, чтобы открыть _контекстное меню_, с помощью которого можно создавать новые файлы или папки, переименовывать, удалять, отслеживать файловые зависимости и многое другое.
+   - <kbd>Двойной клик</kbd> — открыть файл в соответствующем редакторе.
+   - <kbd>Перетаскивание</kbd> — добавить файлы с диска или переместить существующие по структуре проекта.
+   - <kbd>Правый клик</kbd> — открыть контекстное меню для создания, переименования, удаления, отслеживания зависимостей и т.д.
 
-Панель *Editor*
+### Панель *Editor*
+Центральная панель отображает текущий открытый файл в подходящем редакторе. Все визуальные редакторы позволяют изменять вид камеры:
 
-: Представление по центру отображает текущий открытый файл в редакторе соответствующего типа. Все визуальные редакторы позволяют управлять видом камеры:
+- Панорамирование: <kbd>Alt + левая кнопка мыши</kbd>.
+- Масштабирование: <kbd>Alt + правая кнопка</kbd> (трёхкнопочная мышь) или <kbd>Ctrl + кнопка мыши</kbd> (однокнопочная). Колесо прокрутки тоже работает.
+- Вращение в 3D: <kbd>Ctrl + левая кнопка мыши</kbd>.
 
-- Панорамирование: <kbd>Alt + ЛКМ</kbd>.
-- Зумирование: <kbd>Alt + ПКМ</kbd> (трехкнопочная мышь) или <kbd>Ctrl + Mouse button</kbd> (однокнопочная мышь). Если мышь оснащена колесом прокрутки, его можно использовать для зумирования.
-- Вращение в 3D: <kbd>Ctrl + ЛКМ</kbd>.
-
-В правом верхнем углу представления сцены расположен тулбар, на котором можно найти инструменты манипулирования объектами: *Move*, *Rotate* и *Scale*.
+На панели инструментов в правом верхнем углу редактора сцены находятся инструменты: *Move*, *Rotate*, *Scale*, а также *2D Mode*, *Camera Perspective* и *Visibility Filters*.
 
 ![toolbar](images/editor/toolbar.png)
 
-Панель *Outline*
-: Это представление отображает содержимое редактируемого в данный момент файла в виде иерархической древовидной структуры. Outline отражает представление редактора, позволяя выполнять операции с элементами:
-   - <kbd>Кликните</kbd> по элементу, чтобы выделить его. Удерживайте <kbd>Shift</kbd> или <kbd>Option</kbd>, чтобы расширить выделение.
-   - <kbd>Перетащите и бросьте</kbd> элемент для перемещения. Бросьте какой-либо игровой объект на другой игровой объект в коллекции, чтобы сделать его дочерним.
-   - <kbd>Кликните ПКМ</kbd> чтобы открыть _контекстное меню_, с помощью которого можно добавлять, удалять выделенные элементы и т.д.
+### Панель *Outline*
+
+Отображает содержимое редактируемого файла в виде иерархического дерева. Позволяет выполнять действия с элементами:
+   - <kbd>Клик</kbd> — выбрать элемент. Удерживайте <kbd>Shift</kbd> или <kbd>Option</kbd> для множественного выбора.
+   - <kbd>Перетаскивание</kbd> — переместить элементы. Объекты можно делать дочерними.
+   - <kbd>Правый клик</kbd> — открыть контекстное меню для добавления или удаления элементов и других операций.
+
+Можно переключать видимость игровых объектов и компонентов, щёлкнув по значку глаза справа от элемента (начиная с Defold 1.9.8).
+
+![toolbar](images/editor/outline.png)
+
+### Панель *Properties*
 
-Панель *Properties*
-: Это представление отображает свойства (такие как Position, Rotation, Animation и т.д.), ассоциированные с текущим выбранным элементом.
+Отображает свойства выбранного объекта, такие как позиция, вращение, анимация и т.д.
 
-Панель *Tools*
-: В этом представлении есть несколько вкладок. Вкладка *Console* отображает вывод какой-либо ошибки или целенаправленный вывод, осуществляемый вами во время выполнения игры. Рядом с консолью находятся вкладки *Build Errors*, *Search Results*, а также *Curve Editor*, используемый при редактировании кривых в редакторе частиц. Панель Tools также используется для взаимодействия со встроенным отладчиком.
+### Панель *Tools*
 
-Панель *Changed Files*
-: Если проект использует распределенную систему контроля версий Git, это представление отображает список файлов проекта, которые были изменены, добавлены или удалены. Регулярно выполняя синхронизацию проекта, вы можете синхронизировать свою локальную копию с тем, что хранится в Git-репозитории проекта, что позволяет сотрудничать с командой без риска потери своей работы в случае сбоя. Подробнее о Git можно узнать в нашем [руководстве по контролю версий](/manuals/version-control/). В этом представлении можно выполнять некоторые файловые операции:
+Содержит несколько вкладок: *Console* (вывод ошибок и логов во время выполнения), *Build Errors*, *Search Results*, *Curve Editor* (редактирование кривых в редакторе частиц) и средства отладки.
 
-   - Выполните <kbd>двойной клик</kbd> по файлу чтобы открыть представление отличий. Defold открывает файл в подходящем редакторе, так же, как и в представлении ассетов.
-   - Выполните <kbd>клик ПКМ</kbd> по файлу, чтобы открыть всплывающее меню, с помощью которого можно открыть представление отличий, отменить все изменения, сделанные в файле, найти файл в файловой системе и многое другое.
+### Панель *Changed Files*
 
-## Двухпанельное редактирование
+Если проект использует систему контроля версий Git, здесь отображаются изменённые, добавленные или удалённые файлы. Регулярная синхронизация позволяет держать проект в актуальном состоянии. Подробнее читайте в [руководстве по контролю версий](/manuals/version-control/). Доступны действия:
 
-Когда открыто несколько файлов, для каждого из них в верхней части окна редактора отображается отдельная вкладка. Рядом друг с другом можно открыть 2 представления редактора. Выполните <kbd>клик ПКМ</kbd> по вкладке редактора, который хотите переместить, и выберите <kbd>Move to Other Tab Pane</kbd>.
+   - <kbd>Двойной клик</kbd> — открыть дифф-файл в редакторе.
+   - <kbd>Правый клик</kbd> — открыть меню с действиями: просмотр различий, откат, показать в файловой системе и др.
+
+
+## Редактирование в двух окнах
+
+Если открыто несколько файлов, вверху отображаются вкладки. Чтобы открыть 2 редактора рядом, <kbd>правый клик</kbd> по вкладке и выберите <kbd>Move to Other Tab Pane</kbd>.
 
 ![2 panes](images/editor/2-panes.png)
 
-С помощью меню вкладок можно также поменять местами две панели или объединить их в одну.
+Можно также поменять панели местами или объединить их обратно.
 
-## Редактор сцен
+## Редактор сцены
 
-Двойной клик по файлу коллекции или игрового объекта приводит к открытию *редактора сцены*:
+Двойной клик по файлу коллекции или игрового объекта открывает *Редактор сцены*:
 
 ![Select object](images/editor/select.png)
 
-Выделение объектов
-: Клик по объектам в главном окне выделяет их. Прямоугольник, окружающий объект в представлении редактора, будет подсвечен зеленым цветом, указывая на то, какой элемент выделен. Выделенный объект также подсвечивается в представлении *Outline*.
+### Выбор объектов
+Кликните по объекту в главном окне, и он выделится зелёной рамкой. Также он подсветится в панели *Outline*.
+
+Можно также:
 
-  Объекты можно выделять и другим способом:
+  - <kbd>Клик и перетаскивание</kbd> — выделить область объектов.
+  - <kbd>Клик</kbd> по элементу в Outline.
 
-  - <kbd>Кликните и перетащите</kbd>, чтобы выделить все объекты, попавшие внутрь области выделения.
-  - <kbd>Кликните</kbd> по объекту в представлении Outline.
+Удерживайте <kbd>Shift</kbd>, <kbd>⌘</kbd> (Mac) или <kbd>Ctrl</kbd> (Win/Linux) для множественного выбора.
 
-  Для добавления к выделению зажмите и удерживайте <kbd>Shift</kbd> или <kbd>⌘</kbd> (Mac) / <kbd>Ctrl</kbd> (Win/Linux) при клике по объектам.
+### Инструмент перемещения
+![Move tool](images/editor/icon_move.png){.left}
+Используйте *Move Tool* (клавиша <kbd>W</kbd>) или панель инструментов в правом верхнем углу.
 
-Инструмент перемещения
-: ![Move tool](images/editor/icon_move.png){.left}
-  Для перемещения объектов используется инструмент *Move*. Активировать его можно на тулбаре в правом верхнем углу редактора сцены, или нажав клавишу <kbd>W</kbd>.
+![Move object](images/editor/move.png)
 
-  ![Move object](images/editor/move.png)
+Выбранный объект отображает набор манипуляторов (квадратов и стрелок). Щёлкните и перетащите зелёный центральный квадратный маркер, чтобы свободно переместить объект в экранном пространстве. Щёлкните и перетащите стрелки, чтобы переместить объект вдоль осей X, Y или Z. Также имеются квадратные маркеры для перемещения объекта в плоскости X-Y и (если камера повёрнута в 3D) в плоскостях X-Z и Y-Z.
 
-  На выделенном объекте отображается набор манипуляторов (квадратики и стрелки). Перетаскивание центрального маркера, в виде зеленого квадратика, приводит к свободному перемещению объекта в пространстве экрана, перетаскивание стрелок позволяет перемещать объект по осям X, Y и Z. Здесь же имеются маркеры-квадратики для перемещения объекта в плоскости X-Y, а также (видно при повороте камеры в 3D) в плоскостях X-Z и Y-Z.
+### Инструмент вращения
+![Rotate tool](images/editor/icon_rotate.png){.left}
+Используйте *Rotate Tool* (клавиша <kbd>E</kbd>) или панель инструментов.
 
-Инструмент вращения
-: ![Rotate tool](images/editor/icon_rotate.png){.left}
-  Для вращения объектов используется инструмент *Rotate*, который можно активировать на тулбаре и нажатием клавиши <kbd>E</kbd>.
+![Move object](images/editor/rotate.png)
 
-  ![Move object](images/editor/rotate.png)
+Инструмент состоит из четырёх круговых манипуляторов: оранжевого, который вращает объект в экранной плоскости, и по одному для вращения вокруг каждой из осей X, Y и Z. Поскольку вид перпендикулярен осям X и Y, круги отображаются как две пересекающиеся линии.
 
-  Данный инструмент состоит из четырех круговых манипуляторов: один оранжевый, вращающий объект в пространстве экрана, и по одному для вращения вокруг каждой из осей X, Y и Z. Поскольку вид является параллельным по отношению к осям X и Y, круги отображаются только как две прямые, пересекающие объект.
 
-Инструмент масштабирования
-: ![Scale tool](images/editor/icon_scale.png){.left}
-  Для масштабирования объектов используется инструмент *Scale*, который можно активировать на тулбаре и нажатием клавиши <kbd>R</kbd>.
+### Инструмент масштабирования
+![Scale tool](images/editor/icon_scale.png){.left}
+Используйте *Scale Tool* (клавиша <kbd>R</kbd>) или панель инструментов.
 
-  ![Scale object](images/editor/scale.png)
+![Scale object](images/editor/scale.png)
+
+Инструмент состоит из набора квадратных манипуляторов. Центральный маркер масштабирует объект равномерно по всем осям (включая Z). Также есть отдельные маркеры для масштабирования вдоль осей X, Y и Z, а также для масштабирования в плоскостях X-Y, X-Z и Y-Z.
+
+
+### Фильтры видимости
+Позволяют включать/отключать отображение компонентов, ограничивающих рамок и направляющих.
+
+![Visibility filters](images/editor/visibilityfilters.png)
 
-  Этот инструмент состоит из набора квадратных маркеров. Из них центральный равномерно масштабирует объект по всем осям (включая Z). Также имеется по одному маркеру для масштабирования вдоль каждой из осей X, Y и Z и по одному --- для масштабирования в плоскостях X-Y, X-Z и Y-Z.
 
 ## Создание новых файлов проекта
 
-Создавать новые файлы ресурсов можно двумя способами: выполнив <kbd>File ▸ New...</kbd> и выбрав тип файла из меню, либо используя контекстное меню:
+Выберите <kbd>File ▸ New...</kbd> и нужный тип файла или используйте контекстное меню:
 
-Выполните <kbd>клик ПКМ</kbd> в целевом расположении в браузере *ассетов*, затем выберите <kbd>New... ▸ [тип файла]</kbd>:
+<kbd>Правый клик</kbd> в панели *Assets* → <kbd>New... ▸ [file type]</kbd>:
 
 ![create file](images/editor/create_file.png)
 
-Введите подходящее имя для нового файла. Полное имя файла, включая суффикс типа файла, отображается в диалоге в строке *Path*:
+Введите имя нового файла. Полное имя с расширением отображается под строкой *Path*:
 
 ![create file name](images/editor/create_file_name.png)
 
-## Импортирование файлов в проект
+Можно задать собственные шаблоны файлов для каждого проекта. Для этого создайте новую папку с именем `templates` в корневом каталоге проекта и добавьте файлы с именем `default.*` с нужными расширениями, например, `/templates/default.gui` или `/templates/default.script`. Если в этих файлах используется маркер `{{NAME}}`, он будет заменён на имя файла, указанное в окне создания файла.
+
+## Импорт файлов в проект
 
-Добавление в проект файлов ассетов (изображений, звуков, моделей и т.д.) осуществляется простым перетаскиванием их в нужную позицию в браузер *ассетов*. При этом создаются _копии_ файлов в выбранном расположении файловой структуры проекта. За подробностями обращайтесь к [нашему руководству по импортированию ассетов](/manuals/importing-assets/).
ля добавления ассетов (изображений, звуков, моделей и т.д.) перетащите их в нужное место панели *Assets*. Это создаст копии файлов в структуре проекта. Подробнее — [в этом руководстве](/manuals/importing-assets/).
 
 ![Import files](images/editor/import.png)
 
 ## Обновление редактора
 
-Редактор будет автоматически проверять наличие обновлений. При обнаружении обновление будет отображаться в правом нижнем углу окна редактора и на экране выбора проекта. При клике по ссылке Update Available будет произведена загрузка и обновление редактора.
+Редактор автоматически проверяет наличие обновлений. Если они доступны, появится уведомление в нижнем правом углу и на экране выбора проекта. Нажмите «Update Available» для загрузки и установки.
 
 ![Update from project selection](images/editor/update-project-selection.png)
 
 ![Update from editor](images/editor/update-main.png)
 
-## Клавиатурные сокращения
-
-### Сокращения по умолчанию
-
-| Команда | Windows | macOS | Linux |
-|---------|---------|-------|-------|
-| Add | <kbd>A</kbd> | <kbd>A</kbd> | <kbd>A</kbd> |
-| Add secondary | <kbd>Shift</kbd>+<kbd>A</kbd> | <kbd>Shift</kbd>+<kbd>A</kbd> | <kbd>Shift</kbd>+<kbd>A</kbd> |
-| Backwards tab trigger | <kbd>Shift</kbd>+<kbd>Tab</kbd> | <kbd>Shift</kbd>+<kbd>Tab</kbd> | <kbd>Shift</kbd>+<kbd>Tab</kbd> |
-| Beginning of file | <kbd>Ctrl</kbd>+<kbd>Home</kbd> | <kbd>Cmd</kbd>+<kbd>Up</kbd> | <kbd>Ctrl</kbd>+<kbd>Home</kbd> |
-| Beginning of line |  | <kbd>Ctrl</kbd>+<kbd>A</kbd> |  |
-| Beginning of line text | <kbd>Home</kbd> | <kbd>Home</kbd> | <kbd>Home</kbd> |
-| Build | <kbd>Ctrl</kbd>+<kbd>B</kbd> | <kbd>Cmd</kbd>+<kbd>B</kbd> | <kbd>Ctrl</kbd>+<kbd>B</kbd> |
-| Close | <kbd>Ctrl</kbd>+<kbd>W</kbd> | <kbd>Cmd</kbd>+<kbd>W</kbd> | <kbd>Ctrl</kbd>+<kbd>W</kbd> |
-| Close all | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>W</kbd> | <kbd>Shift</kbd>+<kbd>Cmd</kbd>+<kbd>W</kbd> | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>W</kbd> |
-| Continue | <kbd>F5</kbd> | <kbd>F5</kbd> | <kbd>F5</kbd> |
-| Copy | <kbd>Ctrl</kbd>+<kbd>C</kbd> | <kbd>Cmd</kbd>+<kbd>C</kbd> | <kbd>Ctrl</kbd>+<kbd>C</kbd> |
-| Cut | <kbd>Ctrl</kbd>+<kbd>X</kbd> | <kbd>Cmd</kbd>+<kbd>X</kbd> | <kbd>Ctrl</kbd>+<kbd>X</kbd> |
-| Delete | <kbd>Delete</kbd> | <kbd>Delete</kbd> | <kbd>Delete</kbd> |
-| Delete backward | <kbd>Backspace</kbd> | <kbd>Backspace</kbd> | <kbd>Backspace</kbd> |
-| Delete line |  | <kbd>Ctrl</kbd>+<kbd>D</kbd> |  |
-| Delete next word | <kbd>Ctrl</kbd>+<kbd>Delete</kbd> | <kbd>Alt</kbd>+<kbd>Delete</kbd> | <kbd>Ctrl</kbd>+<kbd>Delete</kbd> |
-| Delete prev word | <kbd>Ctrl</kbd>+<kbd>Backspace</kbd> | <kbd>Alt</kbd>+<kbd>Backspace</kbd> | <kbd>Ctrl</kbd>+<kbd>Backspace</kbd> |
-| Delete to end of line | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>Delete</kbd> | <kbd>Cmd</kbd>+<kbd>Delete</kbd> | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>Delete</kbd> |
-| Documentation | <kbd>F1</kbd> | <kbd>F1</kbd> | <kbd>F1</kbd> |
-| Down | <kbd>Down</kbd> | <kbd>Down</kbd> | <kbd>Down</kbd> |
-| End of file | <kbd>Ctrl</kbd>+<kbd>End</kbd> | <kbd>Cmd</kbd>+<kbd>Down</kbd> | <kbd>Ctrl</kbd>+<kbd>End</kbd> |
-| End of line | <kbd>End</kbd> | <kbd>Ctrl</kbd>+<kbd>E</kbd> | <kbd>End</kbd> |
-| Enter | <kbd>Enter</kbd> | <kbd>Enter</kbd> | <kbd>Enter</kbd> |
-| Erase tool | <kbd>Shift</kbd>+<kbd>E</kbd> | <kbd>Shift</kbd>+<kbd>E</kbd> | <kbd>Shift</kbd>+<kbd>E</kbd> |
-| Escape | <kbd>Esc</kbd> | <kbd>Esc</kbd> | <kbd>Esc</kbd> |
-| Find next | <kbd>Ctrl</kbd>+<kbd>G</kbd> | <kbd>Cmd</kbd>+<kbd>G</kbd> | <kbd>Ctrl</kbd>+<kbd>G</kbd> |
-| Find prev | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>G</kbd> | <kbd>Shift</kbd>+<kbd>Cmd</kbd>+<kbd>G</kbd> | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>G</kbd> |
-| Find text | <kbd>Ctrl</kbd>+<kbd>F</kbd> | <kbd>Cmd</kbd>+<kbd>F</kbd> | <kbd>Ctrl</kbd>+<kbd>F</kbd> |
-| Frame selection | <kbd>F</kbd> | <kbd>F</kbd> | <kbd>F</kbd> |
-| Goto line | <kbd>Ctrl</kbd>+<kbd>L</kbd> | <kbd>Cmd</kbd>+<kbd>L</kbd> | <kbd>Ctrl</kbd>+<kbd>L</kbd> |
-| Hide selected | <kbd>Ctrl</kbd>+<kbd>E</kbd> | <kbd>Cmd</kbd>+<kbd>E</kbd> | <kbd>Ctrl</kbd>+<kbd>E</kbd> |
-| Hot reload | <kbd>Ctrl</kbd>+<kbd>R</kbd> | <kbd>Cmd</kbd>+<kbd>R</kbd> | <kbd>Ctrl</kbd>+<kbd>R</kbd> |
-| Left | <kbd>Left</kbd> | <kbd>Left</kbd> | <kbd>Left</kbd> |
-| Move down | <kbd>Alt</kbd>+<kbd>Down</kbd> | <kbd>Alt</kbd>+<kbd>Down</kbd> | <kbd>Alt</kbd>+<kbd>Down</kbd> |
-| Move tool | <kbd>W</kbd> | <kbd>W</kbd> | <kbd>W</kbd> |
-| Move up | <kbd>Alt</kbd>+<kbd>Up</kbd> | <kbd>Alt</kbd>+<kbd>Up</kbd> | <kbd>Alt</kbd>+<kbd>Up</kbd> |
-| New file | <kbd>Ctrl</kbd>+<kbd>N</kbd> | <kbd>Cmd</kbd>+<kbd>N</kbd> | <kbd>Ctrl</kbd>+<kbd>N</kbd> |
-| Next word | <kbd>Ctrl</kbd>+<kbd>Right</kbd> | <kbd>Alt</kbd>+<kbd>Right</kbd> | <kbd>Ctrl</kbd>+<kbd>Right</kbd> |
-| Open | <kbd>Ctrl</kbd>+<kbd>O</kbd> | <kbd>Cmd</kbd>+<kbd>O</kbd> | <kbd>Ctrl</kbd>+<kbd>O</kbd> |
-| Open asset | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>R</kbd> | <kbd>Cmd</kbd>+<kbd>P</kbd> | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>R</kbd> |
-| Page down | <kbd>Page Down</kbd> | <kbd>Page Down</kbd> | <kbd>Page Down</kbd> |
-| Page up | <kbd>Page Up</kbd> | <kbd>Page Up</kbd> | <kbd>Page Up</kbd> |
-| Paste | <kbd>Ctrl</kbd>+<kbd>V</kbd> | <kbd>Cmd</kbd>+<kbd>V</kbd> | <kbd>Ctrl</kbd>+<kbd>V</kbd> |
-| Preferences | <kbd>Ctrl</kbd>+<kbd>Comma</kbd> | <kbd>Cmd</kbd>+<kbd>Comma</kbd> | <kbd>Ctrl</kbd>+<kbd>Comma</kbd> |
-| Prev word | <kbd>Ctrl</kbd>+<kbd>Left</kbd> | <kbd>Alt</kbd>+<kbd>Left</kbd> | <kbd>Ctrl</kbd>+<kbd>Left</kbd> |
-| Proposals | <kbd>Ctrl</kbd>+<kbd>Space</kbd> | <kbd>Ctrl</kbd>+<kbd>Space</kbd> | <kbd>Ctrl</kbd>+<kbd>Space</kbd> |
-| Quit | <kbd>Ctrl</kbd>+<kbd>Q</kbd> | <kbd>Cmd</kbd>+<kbd>Q</kbd> | <kbd>Ctrl</kbd>+<kbd>Q</kbd> |
-| Realign camera | <kbd>Period</kbd> | <kbd>Period</kbd> | <kbd>Period</kbd> |
-| Rebuild | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>B</kbd> | <kbd>Shift</kbd>+<kbd>Cmd</kbd>+<kbd>B</kbd> | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>B</kbd> |
-| Rebundle | <kbd>Ctrl</kbd>+<kbd>U</kbd> | <kbd>Cmd</kbd>+<kbd>U</kbd> | <kbd>Ctrl</kbd>+<kbd>U</kbd> |
-| Redo | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>Z</kbd> | <kbd>Shift</kbd>+<kbd>Cmd</kbd>+<kbd>Z</kbd> | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>Z</kbd> |
-| Reindent | <kbd>Ctrl</kbd>+<kbd>I</kbd> | <kbd>Ctrl</kbd>+<kbd>I</kbd> | <kbd>Ctrl</kbd>+<kbd>I</kbd> |
-| Reload stylesheet |  | <kbd>Ctrl</kbd>+<kbd>R</kbd> |  |
-| Rename | <kbd>F2</kbd> | <kbd>F2</kbd> | <kbd>F2</kbd> |
-| Replace next | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>H</kbd> | <kbd>Alt</kbd>+<kbd>Cmd</kbd>+<kbd>G</kbd> | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>H</kbd> |
-| Replace text |  | <kbd>Alt</kbd>+<kbd>Cmd</kbd>+<kbd>F</kbd> |  |
-| Right | <kbd>Right</kbd> | <kbd>Right</kbd> | <kbd>Right</kbd> |
-| Rotate tool | <kbd>E</kbd> | <kbd>E</kbd> | <kbd>E</kbd> |
-| Save all | <kbd>Ctrl</kbd>+<kbd>S</kbd> | <kbd>Cmd</kbd>+<kbd>S</kbd> | <kbd>Ctrl</kbd>+<kbd>S</kbd> |
-| Scale tool | <kbd>R</kbd> | <kbd>R</kbd> | <kbd>R</kbd> |
-| Scene stop | <kbd>Ctrl</kbd>+<kbd>T</kbd> | <kbd>Cmd</kbd>+<kbd>T</kbd> | <kbd>Ctrl</kbd>+<kbd>T</kbd> |
-| Search in files | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>F</kbd> | <kbd>Shift</kbd>+<kbd>Cmd</kbd>+<kbd>F</kbd> | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>F</kbd> |
-| Select all | <kbd>Ctrl</kbd>+<kbd>A</kbd> | <kbd>Cmd</kbd>+<kbd>A</kbd> | <kbd>Ctrl</kbd>+<kbd>A</kbd> |
-| Select beginning of file | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>Home</kbd> | <kbd>Shift</kbd>+<kbd>Cmd</kbd>+<kbd>Up</kbd> | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>Home</kbd> |
-| Select beginning of line |  | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>A</kbd> |  |
-| Select beginning of line text | <kbd>Shift</kbd>+<kbd>Home</kbd> | <kbd>Shift</kbd>+<kbd>Home</kbd> | <kbd>Shift</kbd>+<kbd>Home</kbd> |
-| Select down | <kbd>Shift</kbd>+<kbd>Down</kbd> | <kbd>Shift</kbd>+<kbd>Down</kbd> | <kbd>Shift</kbd>+<kbd>Down</kbd> |
-| Select end of file | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>End</kbd> | <kbd>Shift</kbd>+<kbd>Cmd</kbd>+<kbd>Down</kbd> | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>End</kbd> |
-| Select end of line | <kbd>Shift</kbd>+<kbd>End</kbd> | <kbd>Shift</kbd>+<kbd>Alt</kbd>+<kbd>Down</kbd> | <kbd>Shift</kbd>+<kbd>End</kbd> |
-| Select left | <kbd>Shift</kbd>+<kbd>Left</kbd> | <kbd>Shift</kbd>+<kbd>Left</kbd> | <kbd>Shift</kbd>+<kbd>Left</kbd> |
-| Select next occurrence | <kbd>Ctrl</kbd>+<kbd>D</kbd> | <kbd>Cmd</kbd>+<kbd>D</kbd> | <kbd>Ctrl</kbd>+<kbd>D</kbd> |
-| Select next word | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>Right</kbd> | <kbd>Shift</kbd>+<kbd>Alt</kbd>+<kbd>Right</kbd> | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>Right</kbd> |
-| Select page down | <kbd>Shift</kbd>+<kbd>Page Down</kbd> | <kbd>Shift</kbd>+<kbd>Page Down</kbd> | <kbd>Shift</kbd>+<kbd>Page Down</kbd> |
-| Select page up | <kbd>Shift</kbd>+<kbd>Page Up</kbd> | <kbd>Shift</kbd>+<kbd>Page Up</kbd> | <kbd>Shift</kbd>+<kbd>Page Up</kbd> |
-| Select prev word | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>Left</kbd> | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>Left</kbd> | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>Left</kbd> |
-| Select right | <kbd>Shift</kbd>+<kbd>Right</kbd> | <kbd>Shift</kbd>+<kbd>Right</kbd> | <kbd>Shift</kbd>+<kbd>Right</kbd> |
-| Show last hidden | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>E</kbd> | <kbd>Shift</kbd>+<kbd>Cmd</kbd>+<kbd>E</kbd> | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>E</kbd> |
-| Show palette | <kbd>Space</kbd> | <kbd>Space</kbd> | <kbd>Space</kbd> |
-| Split selection into lines | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>L</kbd> | <kbd>Shift</kbd>+<kbd>Cmd</kbd>+<kbd>L</kbd> | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>L</kbd> |
-| Step into | <kbd>F11</kbd> | <kbd>F11</kbd> | <kbd>F11</kbd> |
-| Step out | <kbd>Shift</kbd>+<kbd>F11</kbd> | <kbd>Shift</kbd>+<kbd>F11</kbd> | <kbd>Shift</kbd>+<kbd>F11</kbd> |
-| Step over | <kbd>F10</kbd> | <kbd>F10</kbd> | <kbd>F10</kbd> |
-| Stop debugger | <kbd>Shift</kbd>+<kbd>F5</kbd> |  | <kbd>Shift</kbd>+<kbd>F5</kbd> |
-| Tab | <kbd>Tab</kbd> | <kbd>Tab</kbd> | <kbd>Tab</kbd> |
-| Toggle breakpoint | <kbd>F9</kbd> | <kbd>F9</kbd> | <kbd>F9</kbd> |
-| Toggle comment | <kbd>Ctrl</kbd>+<kbd>Slash</kbd> | <kbd>Cmd</kbd>+<kbd>Slash</kbd> | <kbd>Ctrl</kbd>+<kbd>Slash</kbd> |
-| Toggle component guides | <kbd>Ctrl</kbd>+<kbd>H</kbd> | <kbd>Ctrl</kbd>+<kbd>Cmd</kbd>+<kbd>H</kbd> | <kbd>Ctrl</kbd>+<kbd>H</kbd> |
-| Toggle pane bottom | <kbd>F7</kbd> | <kbd>F7</kbd> | <kbd>F7</kbd> |
-| Toggle pane left | <kbd>F6</kbd> | <kbd>F6</kbd> | <kbd>F6</kbd> |
-| Toggle pane right | <kbd>F8</kbd> | <kbd>F8</kbd> | <kbd>F8</kbd> |
-| Toggle visibility filters | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>I</kbd> | <kbd>Shift</kbd>+<kbd>Cmd</kbd>+<kbd>I</kbd> | <kbd>Shift</kbd>+<kbd>Ctrl</kbd>+<kbd>I</kbd> |
-| Undo | <kbd>Ctrl</kbd>+<kbd>Z</kbd> | <kbd>Cmd</kbd>+<kbd>Z</kbd> | <kbd>Ctrl</kbd>+<kbd>Z</kbd> |
-| Up | <kbd>Up</kbd> | <kbd>Up</kbd> | <kbd>Up</kbd> |
-| Up major | <kbd>Shift</kbd>+<kbd>Up</kbd> | <kbd>Shift</kbd>+<kbd>Up</kbd> | <kbd>Shift</kbd>+<kbd>Up</kbd> |
-| Zoom in | <kbd>Ctrl</kbd>+<kbd>'</kbd>+<kbd>'</kbd> | <kbd>Cmd</kbd>+<kbd>'</kbd>+<kbd>'</kbd> | <kbd>Ctrl</kbd>+<kbd>'</kbd>+<kbd>'</kbd> |
-| Zoom out | <kbd>Ctrl</kbd>+<kbd>'-'</kbd> | <kbd>Cmd</kbd>+<kbd>'-'</kbd> | <kbd>Ctrl</kbd>+<kbd>'-'</kbd> |
-
-
-### Кастомизация сокращений
-
-Клавиатурные сокращения можно настроить, если создать конфигурационный файл (например, `keymap.edn` в домашней директории). Затем необходимо выполнить <kbd>File ▸ Preferences</kbd> и в строку <kbd>Path to custom keymap</kbd> прописать путь к созданному файлу. Необходимо перезапустить Defold после изменения этой настройки, а также каждый раз при редактировании файла keymap.
-
-Просмотреть и скачать файлы конфигурации клавиш можно здесь: [Windows](examples/keymap_win.edn), [MacOS](examples/keymap_macos.edn), [Linux](examples/keymap_linux.edn)
-
-## Журнал событий редактора
-При возникновении проблем с редактором и при необходимости [сообщить о проблеме](/manuals/getting-help/#getting-help), лучше всего предоставить лог-файлы из самого редактора. Лог-файлы редактора можно найти в следующих расположениях:
-
-  * Windows: `C:\Users\ **Your Username** \AppData\Local\Defold`
-  * macOS: `/Users/ **Your Username** /Library/Application Support/` или `~/Library/Application Support/Defold`
-  * Linux: `~/.Defold`
-
-Получить доступ к журналу редактора можно также во время его работы, если он запущен из терминала/командной строки. Для запуска редактора из терминала на macOS:
+## Настройки
+
+Настройки редактора можно изменить в [окне настроек](/manuals/editor-preferences).
+
+## Журналы редактора
+При возникновении проблем вы можете [сообщить об ошибке](/manuals/getting-help/#getting-help), приложив лог-файлы редактора:
+
+  * Windows: `C:\Users\ **Ваше имя пользователя** \AppData\Local\Defold`
+  * macOS: `/Users/ **Ваше имя пользователя** /Library/Application Support/` или `~/Library/Application Support/Defold`
+  * Linux: `$XDG_STATE_HOME/Defold` или `~/.local/state/Defold`
+
+Вы также можете получить доступ к журналам редактора во время его работы, если запустите редактор из терминала или командной строки. Чтобы запустить редактор из терминала на macOS:
 
 ```
 $ > ./path/to/Defold.app/Contents/MacOS/Defold

+ 1 - 6
docs/ru/manuals/extender-docker-images.md

@@ -4,7 +4,6 @@ brief: Документ описывает доступные образы Docke
 ---
 
 # Доступные образы Docker
-
 Ниже представлен список всех доступных Docker-образов в публичном реестре. Эти образы можно использовать для запуска Extender в среде с устаревшими SDK, которые больше не поддерживаются.
 
 | SDK               | Тег образа                                                                                                   | Название платформы (в конфигурации Extender)| Версия Defold, использовавшая образ |
@@ -18,9 +17,7 @@ brief: Документ описывает доступные образы Docke
 | Winsdk 2022       | europe-west1-docker.pkg.dev/extender-426409/extender-public-registry/extender-winsdk-2022-env:latest         | winsdk-2022                                 | Начиная с 1.6.2                     |
 
 # Как использовать старые образы Docker
-
 Для использования старой среды выполните следующие шаги:
-
 1. Измените `docker-compose.yml` из репозитория Extender [ссылка](https://github.com/defold/extender/blob/dev/server/docker/docker-compose.yml). Необходимо добавить ещё одно определение сервиса с нужным образом Docker. Например, если мы хотим использовать Docker-образ, содержащий Emscripten 2.0.11, нужно добавить следующее определение сервиса:
     ```yml
     emscripten_2011-dev:
@@ -39,7 +36,6 @@ brief: Документ описывает доступные образы Docke
     Важные поля:
     - **profiles** — список профилей, при которых запускается сервис. Названия профилей передаются через аргумент `--profile <profile_name>` команде `docker compose`.
     - **networks** — список сетей, которые должны использоваться контейнером Docker. Для работы Extender используется сеть с именем `default`. Важно задать сетевые алиасы сервиса (они будут использоваться позже в конфигурации Extender).
-
 2. Добавьте определение удаленного билдера в [application-local-dev-app.yml](https://github.com/defold/extender/blob/dev/server/configs/application-local-dev-app.yml) в секции `extender.remote-builder.platforms`. В нашем примере это будет выглядеть так:
     ```yml
         emsdk-2011:
@@ -47,5 +43,4 @@ brief: Документ описывает доступные образы Docke
             instanceId: emsdk-2011
     ```
     URL должен быть в формате `http://<service_network_alias>:9000`, где `service_network_alias` — это сетевой алиас из шага 1. Порт 9000 является стандартным для Extender (может отличаться, если вы используете пользовательскую конфигурацию Extender).
-
-3. Запустите локальный Extender, как описано в [Как запустить локальный Extender с предварительно настроенными артефактами](/manuals/extender-local-setup#how-to-run-local-extender-with-preconfigured-artifacts).
+3. Запустите локальный Extender, как описано в [Как запустить локальный Extender с предварительно настроенными артефактами](/manuals/extender-local-setup#how-to-run-local-extender-with-preconfigured-artifacts).

+ 33 - 20
docs/ru/manuals/extender-local-setup.md

@@ -4,42 +4,47 @@ brief: Руководство описывает как установить и
 ---
 
 # Установка локального сервера сборки
-Существует два способа запуска локального сервера сборки (Extender):
-1. Запуск локального сервера сборки с готовыми артефактами.
-2. Сборка всех необходимых артефактов локально и использование этих артефактов для запуска локального сервера сборки.
 
-## Как запустить локальный сервер сборки с готовыми артефактами
+Существует два варианта запуска локального сервера сборки (также известного как 'Extender'):
+1. Запуск локального сервера сборки с заранее подготовленными артефактами.
+2. Запуск локального сервера сборки с артефактами, собранными локально.
 
-### Предустановки
-* **Docker** - https://www.docker.com/products/docker-desktop/
-* **gcloud cli** - https://cloud.google.com/sdk/docs/install
-* **google account**
+## Как запустить локальный Extender с заранее подготовленными артефактами
+
+Прежде чем вы сможете запустить локальный облачный сборщик, необходимо установить следующее программное обеспечение:
+
+* [Docker](https://www.docker.com/) — Docker — это набор платформенных сервисов, использующих виртуализацию на уровне операционной системы для доставки программного обеспечения в виде контейнеров. Чтобы запускать облачные сборщики на вашей локальной машине, необходимо установить [Docker Desktop](https://www.docker.com/products/docker-desktop/)
+* Google Cloud CLI — Набор инструментов для создания и управления ресурсами Google Cloud. CLI можно [установить напрямую с сайта Google](https://cloud.google.com/sdk/docs/install) или с помощью пакетного менеджера, такого как Brew, Chocolatey или Snap.
+* Также вам понадобится учетная запись Google для загрузки контейнеров с платформенными серверами сборки.
+
+После установки указанного выше программного обеспечения выполните следующие шаги для установки и запуска облачных сборщиков Defold:
 
-### Как использовать готовые образы Docker
 **Примечание для пользователей Windows**: используйте git bash для выполнения команд описанных ниже.
+
 1. Авторизуемся в Google Cloud и создаем учетные данные приложения по умолчанию (Application default credentials/ADC)
+
    ```sh
    gcloud auth login
    ```
-2. Конфигурируем Docker для использования реестра Артефактов
+2. __Настройте Docker для использования реестра артефактов__ — необходимо настроить Docker для использования `gcloud` в качестве помощника по учетным данным при загрузке образов контейнеров из публичного реестра `europe-west1-docker.pkg.dev`.
+
    ```sh
    gcloud auth configure-docker europe-west1-docker.pkg.dev
    ```
-3. Проверить, что Docker запущен.
-4. Проверяем, что все сконфигурировано корректно путем скачивания базового образа. Запустите
+3. __Убедитесь, что Docker и Google Cloud настроены корректно__ — Проверьте, что Docker и Google Cloud настроены правильно, выполнив загрузку базового образа, используемого всеми контейнерами сервера сборки. Убедитесь, что Docker Desktop запущен перед выполнением следующей команды:
    ```sh
-   docker pull --platform linux/amd64  europe-west1-docker.pkg.dev/extender-426409/extender-public-registry/extender-base-env:latest
+   docker pull --platform linux/amd64 europe-west1-docker.pkg.dev/extender-426409/extender-public-registry/extender-base-env:latest
    ```
-5. Клонируем репозиторий `Extender` и переходим в корневую директорию склонированного репозитория
+4. __Клонируйте репозиторий Extender__ — После корректной настройки Docker и Google Cloud мы почти готовы к запуску серверов. Прежде чем запустить сервер, необходимо клонировать Git-репозиторий, содержащий сервер сборки:
    ```sh
    git clone https://github.com/defold/extender.git
-   cd extender/
+   cd extender
    ```
-6. Скачиваем готовые jar файлы:
-   ```sh
+5. Скачиваем готовые jar файлы:
+```sh
     TMP_DIR=$(pwd)/server/_tmp
     APPLICATION_DIR=$(pwd)/server/app
-    # set nesessary version of Extender and Manifest merge tool
+    # set necessary version of Extender and Manifest merge tool
     # versions can be found at Github release page https://github.com/defold/extender/releases
     # or you can pull latest version (see code sample below)
     EXTENDER_VERSION=2.6.5
@@ -67,8 +72,7 @@ brief: Руководство описывает как установить и
     cp ${TMP_DIR}/$(ls ${TMP_DIR} | grep server-${EXTENDER_VERSION}.jar) ${APPLICATION_DIR}/extender.jar
     cp ${TMP_DIR}/$(ls ${TMP_DIR} | grep manifestmergetool-${MANIFESTMERGETOOL_VERSION}.jar) ${APPLICATION_DIR}/manifestmergetool.jar
    ```
-7. Запускаем docker compose
-главная команда
+6. __Запуск сервера__ — Теперь мы можем запустить сервер, выполнив основную команду docker compose:
 ```sh
 docker compose -p extender -f server/docker/docker-compose.yml --profile <profile> up
 ```
@@ -118,3 +122,12 @@ docker compose -p extender down
         --limit=1 \
         --format="value(name)")
 ```
+
+### Что насчёт macOS и iOS?
+
+Сборки для macOS и iOS выполняются на реальном оборудовании Apple с использованием сервера сборки, работающего в автономном режиме без Docker. Вместо этого XCode, Java и другие необходимые инструменты устанавливаются напрямую на машину, и сервер сборки запускается как обычный Java-процесс. Вы можете узнать, как настроить это, в [документации по серверу сборки на GitHub](https://github.com/defold/extender?tab=readme-ov-file#running-as-a-stand-alone-server-on-macos).
+
+
+## Как запустить локальный Extender с локально собранными артефактами
+
+Пожалуйста, следуйте [инструкции в репозитории Extender на GitHub](https://github.com/defold/extender), чтобы вручную собрать и запустить локальный сервер сборки.

+ 80 - 76
docs/ru/manuals/extensions-best-practices.md

@@ -5,120 +5,124 @@ brief: В этом руководстве описаны лучшие метод
 
 # Лучшие Практики
 
-Написание кроссплатформенного кода может быть сложным, но есть некоторые способы облегчить его разработку и поддержку. В этом руководстве мы перечислим некоторые способы, с помощью которых мы в Defold работаем с кроссплатформенным нативным кодом и API.
-
-## Код Defold
-
-В движке Defold мы используем C++ очень мало. Фактически, большинство кода C-подобна. Мы избегаем шаблонов, за исключением нескольких контейнерных классов, из-за того, что шаблоны увеличивают как время компиляции, так и размер исполняемого файла.
-
-### C++ версия
-
-Исходный код Defold собирается с использованием версии C++ по умолчанию каждого компилятора (см. [Native Extensions - Best Practices](/manuals/extensions-best-practices/)).
-
-Мы избегаем использования последних возможностей или версий C++. В основном потому, что у нас уже есть все необходимое для создания игрового движка. Следить за последними возможностями C++ - трудоемкая задача, и чтобы действительно освоить эти возможности, потребуется много драгоценного времени.
-
-Для разработчиков расширений это также является дополнительным преимуществом, поскольку мы поддерживаем стабильный ABI. Также стоит отметить, что использование последних возможностей C++ может помешать компиляции кода на разных платформах из-за различной поддержки.
-
-### Стандартные Библиотеки Шаблонов - STL
-
-Поскольку движок Defold не использует никакого кода STL, за исключением некоторых алгоритмов и математики (std::sort, std::upper_bound и т.д.), но вы можете использовать STL в своем расширении.
-
-Опять же, имейте в виду, что несовместимость ABI может помешать вам при использовании вашего расширения в сочетании с другими расширениями или библиотеками сторонних производителей
-
-Избегая (сильно шаблонизированных) библиотек STL, мы также улучшаем время сборки и, что более важно, размер исполняемого файла.
-
-#### Строки
-
-В движке Defold мы используем `const char*` вместо `std::string`.
-
-`std::string` - распространенный подводный камень при смешивании различных версий C++ или версий компилятора: вы получите несоответствие ABI.
-Для нас лучше использовать `const char*` и несколько вспомогательных функций.
-
-### Создание скрытых функций
-
-По возможности используйте ключ `static` для функций, локальных для вашего блока компиляции. Это позволяет компилятору выполнять некоторые оптимизации, что может как улучшить производительность, так и уменьшить размер исполняемого файла.
-
-## Библиотеки сторонних производителей
-
-При выборе сторонней библиотеки для использования (независимо от языка) мы учитываем, по крайней мере, следующие моменты:
-
-* Функциональность - Решает ли он конкретную проблему, которая у вас есть?
-* Производительность - Влечет ли он за собой затраты на производительность во время выполнения?
-* Размер библиотеки - Насколько больше будет конечный исполняемый файл? Приемлемо ли это?
-* Зависимости - Требуются ли дополнительные библиотеки?
-* Поддержка - В каком состоянии находится библиотека? Много ли у нее открытых проблем? Поддерживается ли она до сих пор?
-* Лицензия - Можно ли ее использовать для этого проекта?
-
-
-## Зависимости с открытым исходным кодом
-
-Всегда убеждайтесь, что у вас есть доступ к зависимостям. Например, если вы зависите от чего-то на GitHub, ничто не помешает тому, что репозиторий будет удален, или внезапно изменит направление или владельца. Вы можете уменьшить этот риск, сделав форк репозитория и используя свой форк вместо изначального проекта.
-
-Код из этой библиотеки будет внедрен в вашу игру, поэтому убедитесь, что библиотека делает то, что должна делать, и ничего больше!
+Написание кроссплатформенного кода может быть сложным, но есть способы упростить как его разработку, так и сопровождение.
 
 
 ## Структура проекта
 
-При создании расширения есть несколько вещей, которые помогают как в его разработке, так и в поддержании.
+При создании расширения есть несколько вещей, которые помогают как в разработке, так и в поддержке.
 
 ### Lua API
 
-Должен быть только один Lua API и одна его реализация. Это значительно облегчает одинаковое поведение для всех платформ.
+Должен быть только один Lua API и одна его реализация. Это значительно облегчает обеспечение одинакового поведения на всех платформах.
 
-Если рассматриваемая платформа не поддерживает расширение, мы рекомендуем просто не регистрировать модуль Lua вообще.
-Таким образом, вы можете обнаружить поддержку, проверив наличие nil:
+Если платформа не должна поддерживать расширение, рекомендуется вообще не регистрировать модуль Lua. Таким образом, можно определить поддержку, проверив значение на `nil`:
 
+```lua
     if myextension ~= nil then
         myextension.do_something()
     end
+```
 
-### Структура папки
+### Структура папок
 
-Вот структура папок, которую мы часто используем для наших расширений.
+Следующая структура папок часто используется для расширений:
 
+```
     /root
         /input
-        /main                            -- Все файлы для актуального примера проекта
+        /main                            -- Все файлы для примера проекта
             /...
-        /myextension                     -- Фактическая корневая папка расширения
+        /myextension                     -- Корневая папка самого расширения
             ext.manifest
-            /include                     -- Внешние включения, используемые другими расширениями
+            /include                     -- Внешние заголовочные файлы, используемые другими расширениями
             /libs
                 /<platform>              -- Внешние библиотеки для всех поддерживаемых платформ
             /src
-                myextension.cpp          -- Lua API расширения и функции жизненного цикла расширения
-                                            Также содержимое общих реализаций ваших функций Lua API.
-                myextension_private.h    -- Ваш внутренний API, который будет реализован на каждой платформе (например, `myextension_Init` и т.д.)
-                myextension.mm           -- Если для iOS/macOS необходимы нативные вызовы. Реализует `myextension_Init` и т.д. для iOS/macOS
-                myextension_android.cpp  -- Если для Android необходимы вызовы JNI. Реализуется `myextension_Init` и т.д. для Android
+                myextension.cpp          -- Lua API расширения и функции жизненного цикла
+                                            Также содержит универсальные реализации Lua-функций
+                myextension_private.h    -- Внутренний API, который реализуется для каждой платформы (например, `myextension_Init`)
+                myextension.mm           -- Для нативных вызовов на iOS/macOS. Реализует `myextension_Init` для iOS/macOS
+                myextension_android.cpp  -- Для JNI вызовов на Android. Реализует `myextension_Init` для Android
                 /java
-                    /<platform>          -- Любые java-файлы, необходимые для Android
-            /res                         -- Любые ресурсы, необходимые для платформы
+                    /<platform>          -- Любые Java-файлы, необходимые для Android
+            /res                         -- Ресурсы, необходимые для платформы
             /external
-                README.md                -- Заметки/скрипты о том, как собрать или упаковать любые внешние библиотеки
-        /bundleres                       -- Ресурсы, для которых должны быть созданы связки (см. game.project и параметр [bundle_resources setting]([physics scale setting])(/manuals/project-settings/#project))
+                README.md                -- Заметки/скрипты о сборке/упаковке внешних библиотек
+        /bundleres                       -- Ресурсы, которые должны быть включены в бандл (см. game.project и [bundle_resources setting]([physics scale setting](/manuals/project-settings/#project)))
             /<platform>
         game.project
-        game.appmanifest                 -- Любая дополнительная информация о конфигурации приложения
-
+        game.appmanifest                 -- Дополнительная информация о конфигурации приложения
+```
 
-Обратите внимание, что `myextension.mm` и `myextension_android.cpp` нужны только в том случае, если вы делаете специфические нативные вызовы для данной платформы.
+Обратите внимание, что `myextension.mm` и `myextension_android.cpp` нужны только при использовании нативных вызовов для соответствующих платформ.
 
-#### Папки платформы
+#### Папки платформ
 
-В некоторых местах мы используем архитектуру платформы в качестве имени папки, чтобы знать, какие файлы использовать при компиляции/комплектации приложения.
-Они имеют такую форму:
+В некоторых случаях архитектура платформы используется в качестве имени папки, чтобы определить, какие файлы использовать при компиляции/упаковке приложения. Формат:
 
     <architecture>-<platform>
 
-Текущий список таков:
+Текущий список:
 
     arm64-ios, armv7-ios, x86_64-ios, arm64-android, armv7-android, x86_64-linux, x86_64-osx, x86_64-win32, x86-win32
 
-Например, поместите библиотеки для конкретной платформы в раздел:
+Например, для платформоспецифичных библиотек:
 
     /libs
         /arm64-ios
                             /libFoo.a
         /arm64-android
                             /libFoo.a
+
+
+## Написание нативного кода
+
+В исходном коде Defold C++ используется очень ограниченно и преимущественно в C-стиле. Шаблоны почти не используются (за исключением некоторых контейнерных классов), так как они увеличивают время компиляции и размер исполняемого файла.
+
+### Версия C++
+
+Исходники Defold собираются с использованием версии C++ по умолчанию для каждого компилятора. Сам движок не использует возможности C++ новее, чем C++98. Хотя использовать более новую версию для расширения возможно, это может вызвать проблемы с ABI. Это может привести к невозможности использования расширения совместно с другими расширениями движка или из [портала ассетов](/assets).
+
+Исходный код Defold избегает использования последних возможностей или версий C++. В основном потому, что при разработке игрового движка нет необходимости в новых возможностях, а также потому, что отслеживание последних изменений в C++ — это трудоёмкая задача, а для полного освоения этих возможностей потребуется много драгоценного времени.
+
+Дополнительным плюсом является поддержание стабильного ABI, что важно для разработчиков расширений. Использование новейших возможностей C++ также может затруднить сборку под разные платформы из-за различий в поддержке.
+
+### Без исключений C++
+
+Defold не использует исключения в движке. Исключения, как правило, не применяются в игровых движках, так как большинство данных известно на этапе разработки. Отключение поддержки исключений C++ уменьшает размер исполняемого файла и повышает производительность.
+
+### Стандартная библиотека шаблонов (STL)
+
+В движке Defold не используется STL, за исключением некоторых алгоритмов и математических функций (`std::sort`, `std::upper_bound` и т.д.). Однако, при необходимости, вы можете использовать STL в расширении.
+
+Следует помнить, что несовместимости ABI могут помешать использованию расширений совместно с другими расширениями или сторонними библиотеками.
+
+Избегание STL (из-за его обширного использования шаблонов) помогает ускорить сборку и уменьшить размер исполняемого файла.
+
+#### Строки
+
+В Defold используется `const char*` вместо `std::string`. Использование `std::string` часто вызывает проблемы ABI при смешивании разных версий C++ или компиляторов. Применение `const char*` и вспомогательных функций позволяет избежать этих проблем.
+
+### Скрытие функций
+
+Если возможно, используйте ключевое слово `static` для функций, локальных для единицы трансляции. Это позволяет компилятору выполнять оптимизации, улучшает производительность и уменьшает размер исполняемого файла.
+
+## Сторонние библиотеки
+
+При выборе сторонней библиотеки (вне зависимости от языка), учитывайте:
+
+* Функциональность — решает ли она поставленную задачу?
+* Производительность — влияет ли она на работу во время выполнения?
+* Размер — насколько увеличится итоговый размер исполняемого файла?
+* Зависимости — требуется ли что-то дополнительно?
+* Поддержка — актуальность, наличие открытых проблем, активность разработки.
+* Лицензия — позволяет ли она использовать библиотеку в рамках проекта?
+
+
+## Зависимости с открытым исходным кодом
+
+Убедитесь, что у вас есть доступ к зависимостям. Например, если вы полагаетесь на библиотеку из GitHub, ничто не мешает её удалению или смене владельца/направления. Чтобы снизить риск, рекомендуется создать форк и использовать его вместо оригинала.
+
+Помните, код из этой библиотеки будет встроен в вашу игру. Убедитесь, что библиотека делает именно то, что вы от неё ожидаете — и ничего лишнего.
+

+ 0 - 155
docs/ru/manuals/extensions-build-variants.md

@@ -1,155 +0,0 @@
----
-title: Нативные расширения - Варианты сборки
-brief: Это руководство описывает различные варианты сборок, которые может создавать Defold, и то, как они взаимодействуют с нативными расширениями и движком.
----
-
-# Нативные расширения - Варианты сборки
-
-## Варианты Сборки
-
-Когда вы собираете игру, вам нужно выбрать тип движка, который вы хотите использовать.
-
-  * Debug
-  * Release
-  * Headless
-
-Эти различные версии также называются `вариантами сборки`.
-
-Примечание: Когда вы выберете <kbd>Project ▸ Build</kbd>, вы получите отладочную версию.
-
-### Debug
-
-В этом типе исполняемого файла еще остались функции отладки, такие как профилирование, протоколирование и горячая перезагрузка. Этот вариант выбирается во время разработки игры.
-
-### Release
-
-В этом варианте функции отладки отключены. Этот вариант выбирается, когда игра готова к выпуску в магазин приложений.
-
-### Headless
-
-Этот исполняемый файл запускается без графики и звука. Это означает, что вы можете запускать игровые юнит/дымовые тесты на CI-сервере или даже иметь его в качестве игрового сервера в облаке.
-
-## App Manifest
-
-С помощью функции Native Extensions вы можете не только добавлять в движок нативный код, но и удалять стандартные части движка. Например, если вам не нужен физический движок, вы можете удалить его из исполняемого файла.
-
-Мы поддерживаем это с помощью файла, называемого `App Manifest` (.appmanifest). В таком файле вы можете указать, какие библиотеки или символы удалить, или, возможно, добавить флаги компиляции
-
-Эта функция находится в стадии разработки и совершенствования.
-
-### Комбинированный контекст
-
-Манифест приложения фактически имеет ту же структуру и синтаксис, что и манифест расширения. Это позволяет нам объединять контексты для одной платформы вместе при окончательной сборке.
-
-А сам Defold имеет свой собственный манифест сборки в качестве основы (`build.yml`). Для каждого расширения, которое собирается, манифесты объединяются следующим образом:
-
-	manifest = merge(game.appmanifest, ext.manifest, build.yml)
-
-Это делается для того, чтобы пользователь мог переопределить поведение по умолчанию движка, а также каждого расширения. И, на последнем этапе соединения, мы объединяем манифест приложения с манифестом Defold:
-
-	manifest = merge(game.appmanifest, build.yml)
-
-### Редактирование
-
-В настоящее время этот процесс можно выполнить вручную, но мы рекомендуем нашим пользователям использовать [Manifestation](https://britzl.github.io/manifestation/) инструмент для создания манифеста приложения. В конечном итоге создание и изменение манифестов приложений будет осуществляться в редакторе.
-
-### Синтаксис
-
-Вот пример из [Manifestation](https://britzl.github.io/manifestation/) для справки (Может быть изменен. Не копируйте этот файл напрямую. Вместо этого используйте онлайн-инструмент):
-
-	platforms:
-	    x86_64-osx:
-	        context:
-	            excludeLibs: []
-	            excludeSymbols: []
-	            libs: []
-	            linkFlags: []
-	    x86_64-linux:
-	        context:
-	            excludeLibs: []
-	            excludeSymbols: []
-	            libs: []
-	            linkFlags: []
-	    js-web:
-	        context:
-	            excludeLibs: []
-	            excludeJsLibs: []
-	            excludeSymbols: []
-	            libs: []
-	            linkFlags: []
-	    wasm-web:
-	        context:
-	            excludeLibs: []
-	            excludeJsLibs: []
-	            excludeSymbols: []
-	            libs: []
-	            linkFlags: []
-	    x86-win32:
-	        context:
-	            excludeLibs: []
-	            excludeSymbols: []
-	            libs: []
-	            linkFlags: []
-	    x86_64-win32:
-	        context:
-	            excludeLibs: []
-	            excludeSymbols: []
-	            libs: []
-	            linkFlags: []
-	    armv7-android:
-	        context:
-	            excludeLibs: []
-	            excludeJars: []
-	            excludeSymbols: []
-	            libs: []
-	            linkFlags: []
-	    armv7-ios:
-	        context:
-	            excludeLibs: []
-	            excludeSymbols: []
-	            libs: []
-	            linkFlags: []
-	    arm64-ios:
-	        context:
-	            excludeLibs: []
-	            excludeSymbols: []
-	            libs: []
-	            linkFlags: []
-
-
-#### Белый список
-
-Для всех ключевых слов мы применяем фильтр белых списков. Это делается для того, чтобы избежать незаконной работы с путями и доступа к файлам вне папки загрузки сборки.
-
-#### linkFlags
-
-Здесь вы можете добавить флаги для компилятора конкретной платформы
-
-#### libs
-
-Этот флаг используется только в том случае, если вы хотите добавить библиотеку, которая является частью платформы или Defold SDK. Все библиотеки в расширениях вашего приложения добавляются автоматически, и вы не должны добавлять их в этот флаг. Вот пример, в котором 3D-физика удалена из движка:
-
-    x86_64-linux:
-        context:
-            excludeLibs: ["physics","LinearMath","BulletDynamics","BulletCollision"]
-            excludeSymbols: []
-            libs: ["physics_2d"]
-            linkFlags: []
-
-#### Флаги исключений
-
-Эти флаги используются для удаления вещей, ранее определенных в контексте платформы. Вот пример того, как удалить расширение Facebook из движка (обратите внимание на `(.*)`, которое является регулярным выражением, чтобы помочь удалить нужные элементы).
-
-    armv7-android:
-        context:
-            excludeLibs: ["facebookext"]
-            excludeJars: ["(.*)/facebooksdk.jar","(.*)/facebook_android.jar"]
-            excludeSymbols: ["FacebookExt"]
-            libs: []
-            linkFlags: []
-
-#### Где список всех флагов, библиотек, символов???
-
-Мы могли бы разместить некоторые из них здесь, но мы также считаем, что наше время лучше потратить на завершение функции перемещения конфигурации манифеста в редактор, сделав это простым шагом для пользователя.
-
-Тем временем мы будем обновлять инструмент [Manifestation](https://britzl.github.io/manifestation/).

+ 2 - 4
docs/ru/manuals/extensions-defold-sdk.md

@@ -12,7 +12,5 @@ Defold SDK содержит необходимую функциональнос
 Используете Defold SDK, включив заголовочный файл `dmsdk/sdk.h`:
 
     #include <dmsdk/sdk.h>
-
-Доступные функции SDK документированы в [API reference](/ref/overview_cpp).
-
-Если вам нужен заголовочный файл `dmsdk/sdk.h` для кода в выбранном вами редакторе, его можно найти [здесь в основном репозитории GitHub для Defold](https://github.com/defold/defold/blob/dev/engine/sdk/src/dmsdk/sdk.h) с [заголовочными файлами для отдельных пространств имен](https://github.com/defold/defold/tree/dev/engine/dlib/src/dmsdk/dlib).
+    
+Доступные функции SDK и пространства имён задокументированы в нашем [справочнике по API](/ref/overview_cpp). Заголовочные файлы Defold SDK включены в отдельный архив `defoldsdk_headers.zip` для каждого [релиза Defold на GitHub](https://github.com/defold/defold/releases). Вы можете использовать эти заголовочные файлы для автодополнения кода в выбранном вами редакторе.

+ 0 - 57
docs/ru/manuals/extensions-details.md

@@ -1,57 +0,0 @@
----
-title: Нативные расширения - Подробнее
-brief: В этом руководстве описаны некоторые подробности о системе сборки, используемой для нативных расширений.
----
-
-# Настройка сборки для Defold
-
-Здесь мы приводим некоторые важные сведения о сборке, чтобы максимально упростить интеграцию с вашими расширениями.
-
-Вот некоторые моменты, которые следует учитывать при создании расширения для движка Defold. Для получения более общих рекомендаций по разработке кроссплатформенного нативного кода, а также расширений/Lua APIs, пожалуйста, обратитесь к [Нативные Расширения - Лучшие Практики](/manuals/extensions-best-practices).
-
-## C++ версия
-
-В самом движке мы не используем C++ версии выше C++98. Хотя вы можете использовать более высокую версию для создания своего расширения, имейте в виду, что более высокая версия может содержать изменения ABI. Это может сделать невозможным использование вашего расширения в сочетании с другими расширениями в движке или в хранилище ассетов.
-
-При создании библиотек (например, расширений) полезно придерживаться наименьшего целевого знаменателя.
-
-## Toolchain
-
-### Версии SDK
-
-Для получения наиболее точного списка версий проверьте с помощью [build.py](./scripts/build.py).
-
-* Android: NDK r25b, Build Tools 33.0.1, Api Level 19 for armv7 and Api level 21 for arm64
-* iOS: iPhoneOS17.2.sdk
-* macOS: MacOSX14.2.sdk
-* Windows: WindowsKits 10.0, Microsoft Visual Studio 2022
-* Linux: Ubuntu 20.04, clang 17, locales, libssl-dev, openssl, libtool, autoconf, automake, build-essential, uuid-dev, libxi-dev, libopenal-dev, libgl1-mesa-dev, libglw1-mesa-dev, freeglut3-dev
-* Html5: Emscripten 3.1.55
-
-### C++ версия + ABI совместимость
-
-* Linux: `clang 17`
-* Android:`clang` using `NDK r25b`
-* Html5: `Emscripten 3.1.55`
-* Win32: `Microsoft Visual Studio 2022` (`clang 17` on build server)
-* iOS/macOS: `apple-clang` (`clang 17` on build server)
-
-Для iOS/macOS мы используем `-miphoneos-version-min=11.0` и `-mmacosx-version-min=10.13` соответственно.
-
-Мы не указываем конкретную версию C++, поэтому используем версию по умолчанию каждого компилятора.
-
-## Win32 + Clang
-
-Недавнее дополнение - возможность собирать сборки для Windows с помощью clang.
-Это позволяет ускорить сборку на наших серверах, а также оптимизировать наши сборки.
-
-## Статическая связка
-
-Пользовательский движок построен с использованием статической связки.
-Основная причина заключается в том, что на iOS версии < 8 несколько исполняемых двоичных файлов в .ipa не допускаются в App Store. 
-
-## Никаких исключений из C++
-
-Мы не используем никаких исключений в движке.
-Они обычно не используются в игровых движках, поскольку данные (в основном) известны заранее, во время разработки.
-Удаление поддержки исключений C++ уменьшает размер исполняемого файла и улучшает производительность во время выполнения.

+ 105 - 16
docs/ru/manuals/extensions-manifest-merge-tool.md

@@ -107,8 +107,7 @@ brief: В данном руководстве описывается работ
 
 ## iOS / macOS
 
-Для `Info.plist` мы используем нашу собственную реализацию для объединения двух списков свойств.
-Они могут работать со списками и словарями.
+Для `Info.plist` мы используем собственную реализацию для объединения списков и словарей. Можно указывать атрибуты слияния `merge`, `keep` или `replace` для ключей, при этом значение по умолчанию — `merge`.
 
 ### Пример
 
@@ -119,23 +118,48 @@ brief: В данном руководстве описывается работ
     <!DOCTYPE plist PUBLIC '-//Apple//DTD PLIST 1.0//EN' 'http://www.apple.com/DTDs/PropertyList-1.0.dtd'>
     <plist version='1.0'>
     <dict>
-            <key>NSAppTransportSecurity</key>
+        <key>NSAppTransportSecurity</key>
+        <dict>
+            <key>NSExceptionDomains</key>
             <dict>
-                <key>NSExceptionDomains</key>
+                <key>foobar.net</key>
                 <dict>
-                    <key>foobar.net</key>
-                    <dict>
-                        <key>testproperty</key>
-                        <true/>
-                    </dict>
+                    <key>testproperty</key>
+                    <true/>
                 </dict>
             </dict>
-            <key>INT</key>
-            <integer>8</integer>
-            <key>REAL</key>
-            <real>8.0</real>
-            <key>BASE64</key>
-            <data>SEVMTE8gV09STEQ=</data>
+        </dict>
+        <key>INT</key>
+        <integer>8</integer>
+
+        <key>REAL</key>
+        <real>8.0</real>
+
+        <!-- Keep this value even if an extension manifest contains the same key -->
+        <key merge='keep'>BASE64</key>
+        <data>SEVMTE8gV09STEQ=</data>
+
+        <!-- If an extension manifest also has an array with this key then any dictionary values will be merged with the first dictionary value of the base array -->
+        <key>Array1</key>
+        <array>
+            <dict>
+                <key>Foobar</key>
+                <array>
+                    <string>a</string>
+                </array>
+            </dict>
+        </array>
+
+        <!-- Do not attempt to merge the values of this array, instead values from extension manifests should be added to the end of the array -->
+        <key merge='keep'>Array2</key>
+        <array>
+            <dict>
+                <key>Foobar</key>
+                <array>
+                    <string>a</string>
+                </array>
+            </dict>
+        </array>
     </dict>
     </plist>
 ```
@@ -162,6 +186,33 @@ brief: В данном руководстве описывается работ
         </dict>
         <key>INT</key>
         <integer>42</integer>
+
+        <!-- Replace the existing value in the base manifest -->
+        <key merge='replace'>REAL</key>
+        <integer>16.0</integer>
+
+        <key>BASE64</key>
+        <data>Rk9PQkFS</data>
+
+        <key>Array1</key>
+        <array>
+            <dict>
+                <key>Foobar</key>
+                <array>
+                    <string>b</string>
+                </array>
+            </dict>
+        </array>
+
+        <key>Array2</key>
+        <array>
+            <dict>
+                <key>Foobar</key>
+                <array>
+                    <string>b</string>
+                </array>
+            </dict>
+        </array>
     </dict>
     </plist>
 ```
@@ -172,6 +223,7 @@ brief: В данном руководстве описывается работ
     <?xml version='1.0'?>
     <!DOCTYPE plist SYSTEM 'file://localhost/System/Library/DTDs/PropertyList.dtd'>
     <plist version='1.0'>
+        <!-- Nested merge of dictionaries from base and extension manifests -->
         <dict>
             <key>NSAppTransportSecurity</key>
             <dict>
@@ -191,14 +243,51 @@ brief: В данном руководстве описывается работ
                     </dict>
                 </dict>
             </dict>
+
+            <!-- From the base manifest -->
             <key>INT</key>
             <integer>8</integer>
+
+            <!-- The value from the base manifest was replaced since the merge marker was set to "replace" in the extension manifest -->
             <key>REAL</key>
-            <real>8.0</real>
+            <real>16.0</real>
+
+            <!-- The value from the base manifest was used since the merge marker was set to "keep" in the base manifest -->
             <key>BASE64</key>
             <data>SEVMTE8gV09STEQ=</data>
+
+            <!-- The value from the extender manifest was added since no merge marker was specified -->
             <key>INT</key>
             <integer>42</integer>
+
+            <!-- The dictionary values of the array were merged since the base manifest defaults to "merge" -->
+            <key>Array1</key>
+            <array>
+                <dict>
+                    <key>Foobar</key>
+                    <array>
+                        <string>a</string>
+                        <string>b</string>
+                    </array>
+                </dict>
+            </array>
+
+            <!-- The dictionary values were added to the array since the base manifest used "keep" -->
+            <key>Array2</key>
+            <array>
+                <dict>
+                    <key>Foobar</key>
+                    <array>
+                        <string>a</string>
+                    </array>
+                </dict>
+                <dict>
+                    <key>Foobar</key>
+                    <array>
+                        <string>b</string>
+                    </array>
+                </dict>
+            </array>
         </dict>
     </plist>
 ```

+ 7 - 42
docs/ru/manuals/extensions.md

@@ -17,6 +17,8 @@ Defold предоставляет точку входа для нативных
 
 ![Облачная сборка](images/extensions/cloud_build.png)
 
+Сервер сборки предоставляется бесплатно и без каких-либо ограничений на использование. Сервер размещён в Европе, а URL, на который отправляется нативный код, настраивается в [настройках редактора](/manuals/editor-preferences/#extensions) или через опцию командной строки `--build-server` инструмента [bob](/manuals/bob/#usage). Если вы хотите развернуть собственный сервер, пожалуйста, [следуйте этим инструкциям](/manuals/extender-local-setup).
+
 ## Планировка проекта
 
 Чтобы создать новое расширение, создайте папку в корне проекта. Эта папка будет содержать все настройки, исходный код, библиотеки и ресурсы, связанные с расширением. Конструктор расширений распознает структуру папок и соберет все исходные файлы и библиотеки.
@@ -41,7 +43,7 @@ Defold предоставляет точку входа для нативных
 
 ```
 *ext.manifest*
-: Папка расширения _должна_ содержать файл *ext.manifest*. Этот файл представляет собой файл формата YAML, который подхватывается конструктором расширений. Минимальный файл манифеста должен содержать название расширения.
+: Папка расширения _должна_ содержать файл *ext.manifest*. Этот файл представляет собой конфигурационный файл с флагами и директивами, используемыми при сборке одного расширения. Определение формата файла можно найти в [руководстве по манифесту расширения](https://defold.com/manuals/extensions-ext-manifests/). Минимальный файл манифеста должен содержать название расширения.
 
 *src*
 : Эта папка должна содержать все файлы исходного кода.
@@ -64,8 +66,11 @@ Defold предоставляет точку входа для нативных
 
 Опциональная папка *manifests* расширения содержит дополнительные файлы, используемые в процессе сборки и комплектации. Файлы должны быть помещены во вложенные папки, названные по `платформе`:
 
-* `android` - В эту папку помещается файл-заглушка манифеста, который будет объединен с основным приложением ([как описано здесь](/manuals/extensions-manifest-merge-tool)). Папка также может содержать файл `build.gradle` с зависимостями, которые должны быть разрешены Gradle ([пример](https://github.com/defold/extension-facebook/blob/master/facebook/manifests/android/build.gradle)). Наконец, папка может также содержать ноль или более файлов ProGuard (экспериментально).
+* `android` - В эту папку помещается файл-заглушка манифеста, который будет объединен с основным приложением ([как описано здесь](/manuals/extensions-manifest-merge-tool)).
+  * Папка также может содержать файл `build.gradle` с зависимостями, которые должны быть [разрешены Gradle](/manuals/extensions-gradle) ([пример](https://github.com/defold/extension-facebook/blob/master/facebook/manifests/android/build.gradle)).
+  * Наконец, папка может также содержать ноль или более файлов ProGuard (экспериментально).
 * `ios` - Эта папка принимает файл-заглушку манифеста, который должен быть объединен с основным приложением ([как описано здесь](/manuals/extensions-manifest-merge-tool)).
+  Папка также может содержать файл `Podfile` с зависимостями, которые должны быть [разрешены через Cocoapods](/manuals/extensions-cocoapods).
 * `osx` - Эта папка принимает файл-заглушку манифеста, который должен быть объединен с основным приложением ([как описано здесь](/manuals/extensions-manifest-merge-tool)).
 * `web` - Эта папка принимает файл-заглушку манифеста, который должен быть объединен с основным приложением ([как описано здесь](/manuals/extensions-manifest-merge-tool)).
 
@@ -231,46 +236,6 @@ print(reverse_s) --> ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcba
 
 Журналы сервера сборки доступны, если проект использует нативные расширения. Журнал сервера сборки (`log.txt`) загружается вместе с движком при сборке проекта и хранится в файле `.internal/%platform%/build.zip`, а также распаковывается в папку сборки вашего проекта.
 
-## Файл ext.manifest
-
-Помимо названия расширения, файл манифеста может содержать флаги компиляции для конкретной платформы, флаги компоновки, библиотеки и фреймворки. Если файл *ext.manifest* не содержит сегмента "platforms", или платформа отсутствует в списке, платформа, для которой вы собираете пакет, будет собрана, но без дополнительных флагов.
-
-Вот пример:
-
-```yaml
-name: "AdExtension"
-
-platforms:
-    arm64-ios:
-        context:
-            frameworks: ["CoreGraphics", "CFNetwork", "GLKit", "CoreMotion", "MessageUI", "MediaPlayer", "StoreKit", "MobileCoreServices", "AdSupport", "AudioToolbox", "AVFoundation", "CoreGraphics", "CoreMedia", "CoreMotion", "CoreTelephony", "CoreVideo", "Foundation", "GLKit", "JavaScriptCore", "MediaPlayer", "MessageUI", "MobileCoreServices", "OpenGLES", "SafariServices", "StoreKit", "SystemConfiguration", "UIKit", "WebKit"]
-            flags:      ["-stdlib=libc++"]
-            linkFlags:  ["-ObjC"]
-            libs:       ["z", "c++", "sqlite3"]
-            defines:    ["MY_DEFINE"]
-
-    armv7-ios:
-        context:
-            frameworks: ["CoreGraphics", "CFNetwork", "GLKit", "CoreMotion", "MessageUI", "MediaPlayer", "StoreKit", "MobileCoreServices", "AdSupport", "AudioToolbox", "AVFoundation", "CoreGraphics", "CoreMedia", "CoreMotion", "CoreTelephony", "CoreVideo", "Foundation", "GLKit", "JavaScriptCore", "MediaPlayer", "MessageUI", "MobileCoreServices", "OpenGLES", "SafariServices", "StoreKit", "SystemConfiguration", "UIKit", "WebKit"]
-            flags:      ["-stdlib=libc++"]
-            linkFlags:  ["-ObjC"]
-            libs:       ["z", "c++", "sqlite3"]
-            defines:    ["MY_DEFINE"]
-```
-
-### Разрешенные ключи
-
-Допустимыми ключами для компиляционных флагов, специфичных для конкретной платформы, являются:
-
-* `frameworks` - Фреймворки Apple, которые необходимые для сборки (iOS и OSX)
-* `flags` - Флаги, которые должны быть переданы компилятору
-* `linkFlags` - Флаги, которые должны быть переданы компоновщику
-* `libs` - Библиотеки, необходимые включения при компоновке
-* `defines` - Определения установки при сборке
-* `aaptExtraPackages` - Отдельное имя пакета, которое должно быть сгенерировано (Android)
-* `aaptExcludePackages` - Регулярные выражения (или точные названия) пакетов для исключения (Android
-* `aaptExcludeResourceDirs` - Регулярные выражения (или точные названия) каталоги ресурсов для исключения (Android)
-
 ## Примеры расширений
 
 * [Базовый пример расширения](https://github.com/defold/template-native-extension) (the extension from this manual)

+ 19 - 0
docs/ru/manuals/factory.md

@@ -236,6 +236,25 @@ end
   end
   ```
 
+## Динамический прототип
+
+Можно изменить, какой *Prototype* может создавать фабрика, установив флажок *Dynamic Prototype* в свойствах компонента фабрики.
+
+![Dynamic prototype](images/factory/dynamic_prototype.png)
+
+При установленной опции *Dynamic Prototype* можно изменить прототип с помощью функции `factory.set_prototype()`. Пример:
+
+```lua
+factory.unload("#factory") -- выгружаем предыдущие ресурсы
+factory.set_prototype("#factory", "/main/levels/enemyA.goc")
+local enemy_id = factory.create("#factory")
+```
+
+::: important
+При включённой опции *Dynamic Prototype* количество компонентов коллекции не может быть оптимизировано, и родительская коллекция будет использовать значения по умолчанию из файла *game.project*.
+:::
+
+
 ## Ограничения инстанцирования
 
 Настройка проекта *Max Instances* в разделе *настроек, связанных с коллекциями* ограничивает общее количество экземпляров игровых объектов, которые могут существовать в игровом пространстве (main.collection, загружаемая при запуске, или любое пространство, загруженное через прокси-коллекцию). Все игровые объекты, существующие в пространстве, подсчитываются с учетом этого ограничения, и не имеет значения, размещены ли они вручную в редакторе или порождены во время выполнения скрипта.

+ 114 - 37
docs/ru/manuals/file-access.md

@@ -4,58 +4,135 @@ brief:  Данное руководство объясняет как сохра
 ---
 
 # Работа с файлами
-Есть несколько разных способов создать и/или получить доступ к файлам. Пути файлов и способы, которыми вы получаете доступ к этим файлам различаются в зависимости от типа файла и размещения файла.
+Существует множество различных способов создания и/или доступа к файлам. Пути к файлам и способы доступа к ним зависят от типа файла и его расположения.
 
-## Функции для доступа к файлам и директориям
+## Функции для доступа к файлам и папкам
 Defold предоставляет несколько разных функций для работы с файлами:
 
-* Можно использовать стандартные [`io.*` функции](https://defold.com/ref/stable/io/) для чтения и записи файлов. Эти функции дают вам очень тонкий уровень контроля над всем процессом ввода-вывода. 
-* Можно использовать [`os.rename()`](https://defold.com/ref/stable/os/#os.rename:oldname-newname) и [`os.remove()`](https://defold.com/ref/stable/os/#os.remove:filename) для переименования и удаления файлов.
-* Можно использовать [`sys.save()`](https://defold.com/ref/stable/sys/#sys.save:filename-table) и [`sys.load()`](https://defold.com/ref/stable/sys/#sys.load:filename) для чтения и записи Lua-таблиц. Существуют дополнительные функции [`sys.*`](https://defold.com/ref/stable/sys/) чтобы помочь платформенно-независимо определять пути файла.
-
-## Места расположения файлов и директорий
-Места расположения файлов и директорий могут быть поделены на три категории:
-
-* Специфичные для приложения файлы, созданные вашим приложением
-* Файлы и директории поставляемые с вашим приложением
-* Специфичные для системы файлы, к которым получает доступ ваше приложение
-
-### Как сохранять и загружать файлы специфичные для приложения
-Когда сохраняются или загружаются файлы специфичные для приложения, такие как рекорды, настройки игрока или игровое состояние, рекомендуется делать это в месте расположения, предоставляемом операционной системой и предназначенной специально для этих целей. Вы можете использовать [`sys.get_save_file()`](https://defold.com/ref/stable/sys/#sys.get_save_file:application_id-file_name), чтобы получить специфичный для конкретной ОС абсолютный путь до файла. Получив абсолютный путь, вы можете использовать функции `sys.*`, `io.*` и `os.*` (смотри выше).
-
-[Посмотрите пример, демонстрирующий как применять sys.save() и sys.load()](/examples/file/sys_save_load/).
-
-### Как получать доступ к файлам, поставляемым вместе с приложением
-Вы можете поставлять файлы с вашим приложением двумя способами:
-
-1. **CUSTOM RESOURCES** --- Как часть архива игры используя [поле *Custom Resources*](https://defold.com/manuals/project-settings/#project) в *game.project*. Вы можете читать из этих файлов используя [`sys.load_resource()`](https://defold.com/ref/sys/#sys.load_resource). Заметьте, что эти файлы не являются реальными файлами в файловой системе. Файлы, включенные таким способом становятся частью бинарного архива игры и единственный способ получить к ним доступ --- через вызов `sys.load_resource()`.
-
-2. **BUNDLE RESOURES** --- Как дополнительные файлы и директории, располагаемые как часть бандла вашего приложения используя [поле *Bundle Resources*](https://defold.com/manuals/project-settings/#project) в *game.project*. Вы можете использовать [`sys.get_application_path()`](https://defold.com/ref/stable/sys/#sys.get_application_path:), чтобы получить путь до места, где хранится приложение. Используйте этот базовый путь до приложения для создания окончательных абсолютных путей до файлов, к которым вам нужно получить доступ. Имея абсолютный путь к этим файлам, вы можете использовать функции `io.*` и `os.*` для доступа к файлам (см. выше).
+* Вы можете использовать стандартные функции [`io.*`](https://defold.com/ref/stable/io/) для чтения и записи файлов. Эти функции дают вам очень тонкий контроль над процессом ввода-вывода.
+
+```lua
+-- открыть myfile.txt для записи в бинарном режиме
+-- возвращает nil и сообщение об ошибке в случае неудачи
+local f, err = io.open("path/to/myfile.txt", "wb")
+if not f then
+    print("Произошла ошибка при открытии файла", err)
+    return
+end
+
+-- записать в файл, сбросить буфер на диск и закрыть файл
+f:write("Foobar")
+f:flush()
+f:close()
+
+-- открыть myfile.txt для чтения в бинарном режиме
+-- возвращает nil и сообщение об ошибке в случае неудачи
+local f, err = io.open("path/to/myfile.txt", "rb")
+if not f then
+    print("Произошла ошибка при открытии файла", err)
+    return
+end
+
+-- прочитать весь файл как строку
+-- возвращает nil в случае неудачи
+local s = f:read("*a")
+if not s then
+    print("Ошибка при чтении файла")
+    return
+end
+
+print(s) -- Foobar
+```
+
+* Вы можете использовать [`os.rename()`](https://defold.com/ref/stable/os/#os.rename:oldname-newname) и [`os.remove()`](https://defold.com/ref/stable/os/#os.remove:filename) для переименования и удаления файлов.
+
+* Вы можете использовать [`sys.save()`](https://defold.com/ref/stable/sys/#sys.save:filename-table) и [`sys.load()`](https://defold.com/ref/stable/sys/#sys.load:filename) для чтения и записи Lua таблиц. Дополнительные функции [`sys.*`](https://defold.com/ref/stable/sys/) помогают с платформонезависимым разрешением путей к файлам.
+
+```lua
+-- получить платформонезависимый путь к файлу "highscore" для приложения "mygame"
+local path = sys.get_save_file("mygame", "highscore")
+
+-- сохранить Lua таблицу с некоторыми данными
+local ok = sys.save(path, { highscore = 100 })
+if not ok then
+    print("Не удалось сохранить", path)
+    return
+end
+
+-- загрузить данные
+local data = sys.load(path)
+print(data.highscore) -- 100
+```
+
+
+## Расположение файлов и папок
+Расположение файлов и папок можно разделить на три категории:
+
+* Файлы, созданные вашим приложением
+* Файлы и папки, включённые в ваше приложение
+* Системные файлы, к которым обращается ваше приложение
+
+### Как сохранять и загружать файлы, созданные приложением
+При сохранении и загрузке файлов, созданных приложением, таких как рекорды, настройки пользователя и состояние игры, рекомендуется использовать расположение, предоставленное операционной системой и предназначенное специально для этой цели. Вы можете использовать [`sys.get_save_file()`](https://defold.com/ref/stable/sys/#sys.get_save_file:application_id-file_name), чтобы получить абсолютный путь к файлу, специфичный для ОС. После получения абсолютного пути вы можете использовать функции `sys.*`, `io.*` и `os.*` (см. выше).
+
+[Посмотрите пример использования `sys.save()` и `sys.load()`](/examples/file/sys_save_load/).
+
+### Как получить доступ к файлам, включённым в приложение
+Вы можете включать файлы в ваше приложение с помощью ресурсов бандла и пользовательских ресурсов.
+
+#### Пользовательские ресурсы
+:[Пользовательские ресурсы](../shared/custom-resources.md)
+
+```lua
+-- Загрузить данные уровня в строку
+local data, error = sys.load_resource("/assets/level_data.json")
+-- Декодировать json строку в Lua таблицу
+if data then
+  local data_table = json.decode(data)
+  pprint(data_table)
+else
+  print(error)
+end
+```
+
+#### Ресурсы бандла
+:[Ресурсы бандла](../shared/bundle-resources.md)
+
+```lua
+local path = sys.get_application_path()
+local f = io.open(path .. "/mycommonfile.txt", "rb")
+local txt, err = f:read("*a")
+if not txt then
+    print(err)
+    return
+end
+print(txt)
+```
 
 ::: sidenote
-Из соображений безопасности браузеры (и, как следствие, любой JavaScript, работающий в браузере) не имеют доступа к системным файлам. Файловые операции в HTML5 билдах в Defold по-прежнему работают, однако они работают на "виртуальной файловой системе" используя IndexedDB API в браузере. Это означает, что не существует способа получить доступ к ресурсам бандла используя функции `io.*` или `os.*`. Однако вы можете получить доступ к ресурсам бандла используя вызов `http.request()`.
+По соображениям безопасности браузеры (и, следовательно, любой JavaScript, выполняющийся в браузере) не имеют доступа к системным файлам. Операции с файлами в HTML5 сборках Defold по-прежнему работают, но только в "виртуальной файловой системе" с использованием IndexedDB API в браузере. Это означает, что нет возможности получить доступ к ресурсам бандла с помощью функций `io.*` или `os.*`. Однако вы можете получить доступ к ресурсам бандла с помощью `http.request()`.
 :::
 
 
-#### Custom и Bundle ресурсы - сравнение
+#### Пользовательские и ресурсы бандла — сравнение
 
-| Характеристики              | Custom Ресурсы                          | Bundle Ресурсы                               |
-|-----------------------------|-------------------------------------------|------------------------------------------------|
-| Скорость загрузки               | Быстрее - файлы загружаются из бинарного архива | Медленнее - файлы загружаются из файловой системы          |
-| Частичная загрузка файлов          | Нет - только целиком                    | Да - произвольное чтение байт из файлов           |
-| Изменение файлов после поставки | Нет - файлы хранятся внутри бинарного архива | Да - файлы хранятся на локальной файловой системе    |
-| Поддержка HTML5               | Да                                       | Да - но доступ через HTTP, а не файловый ввод-вывод |
+| Характеристика             | Пользовательские ресурсы                 | Ресурсы бандла                                |
+|----------------------------|-----------------------------------------|-----------------------------------------------|
+| Скорость загрузки          | Быстрее — файлы загружаются из архива   | Медленнее — файлы загружаются из файловой системы |
+| Загрузка части файла       | Нет — только целиком                     | Да — можно читать произвольные байты файла    |
+| Изменение файлов после упаковки | Нет — файлы хранятся внутри бинарного архива | Да — файлы хранятся в локальной файловой системе |
+| Поддержка HTML5            | Да                                      | Да — но доступ через http, а не через файловый ввод-вывод |
 
 
 ### Доступ к системным файлам
-Доступ к системным файлам может быть ограничен операционной системой из соображений безопасности. Вы можете использовать нативное расширение [`extension-directiories`](https://defold.com/assets/extensiondirectories/) для получения абсолютных путей до некоторых общих системных директорий (то есть документы, ресурсы, temp). Имея абсолютный путь к этим файлам вы можете использовать функции `io.*` и `os.*` для получения доступа к этим файлам (смотри выше).
+Доступ к системным файлам может быть ограничен операционной системой по соображениям безопасности. Вы можете использовать нативное расширение [`extension-directories`](https://defold.com/assets/extensiondirectories/), чтобы получить абсолютные пути к некоторым распространённым системным папкам (например, документы, ресурсы, временные файлы). Получив абсолютный путь к этим файлам, вы можете использовать функции `io.*` и `os.*` для доступа к ним (см. выше).
 
 ::: sidenote
-Из соображений безопасности браузеры (и, как следствие, любой JavaScript, работающий в браузере) не имеют доступа к системным файлам. Файловые операции в HTML5 билдах в Defold по-прежнему работают, однако они работают на "виртуальной файловой системе" используя IndexedDB API в браузере. Это означает, что не существует способа получить доступ к системным файлам в HTML5 билдах.
+По соображениям безопасности браузеры (и, следовательно, любой JavaScript, выполняющийся в браузере) не имеют доступа к системным файлам. Операции с файлами в HTML5 сборках Defold по-прежнему работают, но только в "виртуальной файловой системе" с использованием IndexedDB API в браузере. Это означает, что нет возможности получить доступ к системным файлам в HTML5 сборках.
 :::
 
 ## Расширения
-[Портал ассетов](https://defold.com/assets/) содержит несколько ассетов для упрощения доступа к файлам и директориям. Некоторые из примеров:
+[Asset Portal](https://defold.com/assets/) содержит несколько ассетов, упрощающих работу с файлами и папками. Некоторые примеры:
 
-* [Lua File System (LFS)](https://defold.com/assets/luafilesystemlfs/) --- Функции для работы с директориями, разрешениями файлов и т.д.
-* [DefSave](https://defold.com/assets/defsave/) --- Модуль, помогающий сохранять/загружать конфиг и данные игрока между сессиями.
+* [Lua File System (LFS)](https://defold.com/assets/luafilesystemlfs/) — функции для работы с директориями, правами доступа к файлам и т.д.
+* [DefSave](https://defold.com/assets/defsave/) — модуль для удобного сохранения и загрузки конфигураций и данных игрока между сессиями.

+ 9 - 4
docs/ru/manuals/font.md

@@ -11,11 +11,16 @@ brief: В этом руководстве описаны особенности
 - OpenType
 - BMFont
 
+
 Шрифты, добавленные в проект, автоматически конвертируются в текстуру, которую Defold может визуализировать. Доступны два метода визуализации шрифтов, каждый из которых имеет свои преимущества и недостатки:
 
 - Bitmap
 - Distance field
 
+::: sidenote
+Вместо генерации и включения текстуры шрифта в состав приложения можно [генерировать глифы шрифта во время выполнения](/extension-fontgen) из встроенного шрифта TrueType. Такой подход может значительно сократить размер загрузки и потребление оперативной памяти в игре на Defold.
+:::
+
 ## Создание шрифта
 
 Чтобы создать шрифт для использования в Defold, создайте новый файл Font, выбрав в меню <kbd>File ▸ New...</kbd>, затем <kbd>Font</kbd>. Можно также <kbd>кликнуть ПКМ</kbd> в нужном расположении в браузере ассетов и выбрать <kbd>New... ▸ Font</kbd>.
@@ -69,7 +74,7 @@ brief: В этом руководстве описаны особенности
 : Прозрачность сгенерированной тени. 0.0--1.0.
 
 ::: sidenote
-Поддержка теней обеспечивается встроенными шейдерами материала шрифта и работает как в однослойном, так и в многослойном режиме рендеринга. Если многослойный рендеринг шрифта или поддержка теней не нужны, лучше использовать более простой шейдер, такой как builtins/font-singlelayer.fp.
+Поддержка теней обеспечивается встроенными шейдерами материала шрифта и работает как в однослойном, так и в многослойном режиме рендеринга. Если многослойный рендеринг шрифта или поддержка теней не нужны, лучше использовать более простой шейдер, такой как *`builtins/font-singlelayer.fp`*.
 :::
 
 *Shadow Blur*
@@ -78,8 +83,8 @@ brief: В этом руководстве описаны особенности
 *Shadow X/Y*
 : Горизонтальное и вертикальное смещение сгенерированной тени в пикселях. Этот параметр влияет на тень глифа, только если свойство Render Mode установлено в значение `MODE_MULTI_LAYER`.
 
-*Extra Characters*
-: По умолчанию шрифт включает печатные ASCII символы (коды символов 32-126). Чтобы вручную включить дополнительные символы, перечислите их в этом поле свойства.
+*Characters*
+: Какие символы включать в шрифт. По умолчанию это поле содержит печатные ASCII символы (коды символов 32–126). Вы можете добавить или удалить символы из этого поля, чтобы включить больше или меньше символов в шрифт.
 
 ::: sidenote
 Печатные ASCII символы:
@@ -140,7 +145,7 @@ space ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E
 
 ![Distance field artifacts](images/font/df_artifacts.png)
 
-Если поддержка теней и контуров не требуется, установите соответствующие им значения альфа в 0. В противном случае данные о тенях и контурах все равно будут генерироваться, что приведет к излишнему потреблению памяти.
+Если поддержка теней и контуров не требуется, установите соответствующие им значения альфа в 0. В противном случае данные о тенях и контурах все равно будут генерироваться, что приведет к излишнему потреблению памяти. Если вы не хотите использовать поддержку теней или контуров, установите соответствующие значения альфа в ноль. В противном случае данные о тенях и контурах всё равно будут генерироваться, занимая лишнюю память.
 
 ## Кэш шрифта
 Ресурс шрифта в Defold приводит к появлению двух вещей во время выполнения: текстуры и данных шрифта.

+ 1 - 1
docs/ru/manuals/glossary.md

@@ -175,6 +175,6 @@ msg.post("#weapon", "disable")
 
 ![Tile source](images/icons/tilesource.png){.left} Тайловый источник описывает текстуру, состоящую из нескольких уменьшенных изображений, каждое из которых имеет одинаковый размер. Можно определить мултикадровую анимацию из последовательности изображений в тайловом источнике. Тайловые источники также могут автоматически вычислять формы столкновений из данных изображений. Это очень полезно при создания плиточных уровней, с которыми могут сталкиваться и взаимодействовать объекты. Тайловые источники используются тайловыми картами (а также спрайтами и частицами) для совместного использования графических ресурсов. Стоит заметить, что атлас часто подходит лучше, чем тайловый источник. За подробностями обращайтесь к [руководству по тайловым источникам](/manuals/tilemap).
 
-## Вертексный шейдер (Vertex Program)
+## Вертексный шейдер (Vertex Program или Vertex shader)
 
 ![Vertex shader](images/icons/vertex-shader.png){.left} Вертексный шейдер вычисляет экранную геометрию примитивных полигональных форм компонента. Для любого типа визуального компонента, будь то спрайт, Spine-модель или модель, форма представлена набором позиций полигональных вершин. Вертексный шейдер обрабатывает каждую вершину (в мировом пространстве) и вычисляет результирующую координату, которую должна иметь каждая вершина примитива. За подробностями обращайтесь к [руководству по шейдерам](/manuals/shader).

+ 9 - 7
docs/ru/manuals/gui-clipping.md

@@ -57,17 +57,19 @@ Clipping Inverted
 
 ## Слои
 
-Слои можно использовать для управления порядком рендеринга (и пакетирования) нод. При использовании слоев и нод клипирования обычный порядок наслоения отменяется.
-
-- Порядок клипирования имеет приоритет над порядком слоев --- независимо от того, к какому слою принадлежит нода, она будет клипирована в соответствии с иерархией нод.
-- Слои влияют только на порядок отрисовки графики --- и более того, слой, заданный в ноде клипирования, влияет только на порядок отрисовки _в иерархии этого клиппера_.
+Слои можно использовать для управления порядком рендеринга (и пакетирования) нод. При использовании слоев и нод клипирования обычный порядок наслоения отменяется. Порядок слоев всегда имеет приоритет над порядком клипирования — если назначения слоев сочетаются с нодами клипирования, клипирование может происходить вне порядка, если родительская нода с включённым клипированием принадлежит к более высокому слою, чем её дочерние. Дочерние ноды без назначенного слоя по-прежнему будут соблюдать иерархию и, соответственно, отрисовываться и клипироваться после родителя.
 
 ::: sidenote
-Нода клипирования и ее иерархия будут отрисованы первыми, если ей назначен слой, и в обычном порядке, если слой не назначен.
+Нода клипирования и её иерархия будут отрисованы первыми, если ей назначен слой, и в обычном порядке, если слой не назначен.
 :::
 
 ![Layers and clipping](images/gui-clipping/layers.png)
 
-Здесь нода клиппера "ocular" установлена в "layer3", а нода "bean" --- в "layer1". Поэтому текстура клиппера "ocular" отрисовывается поверх обрезанного bean'.
+В этом примере обе клипирующие ноды "`Donut BG`" и "`BG`" используют один и тот же слой 1. Порядок рендера между ними будет соответствовать порядку в иерархии, где "`Donut BG`" рендерится перед "`BG`". Однако дочерняя нода "`Donut Shadow`" назначена на слой 2, который имеет более высокий порядок, и поэтому будет отрисована после обеих клипирующих нод. В этом случае порядок рендера будет следующим:
+
+- `Donut BG`
+- `BG`
+- `BG Frame`
+- `Donut Shadow`
 
-Ноде "shield" задано "layer2", но это не влияет на порядок рендеринга ноды по отношению к "ocular" или "bean". Чтобы изменить порядок рендеринга ноды "shield", измените индексный порядок дерева нод.
+Здесь вы можете видеть, что объект "`Donut Shadow`" будет клипироваться обеими клипирующими нодами из-за наслоения, несмотря на то, что он является дочерним только одной из них.

+ 87 - 17
docs/ru/manuals/gui.md

@@ -33,6 +33,8 @@ Defold автоматически откроет файл в редакторе
 
 Белый прямоугольник показывает границы текущей выбранной компоновки, ширину и высоту дисплея по умолчанию, установленные в настройках проекта.
 
+## Gui свойства
+
 Выделив корневую GUI-ноду, в *Outline* отображаются *свойства* компонента GUI:
 
 Script
@@ -47,16 +49,89 @@ Adjust Reference
   - `Per Node` --- подгоняет каждую ноду под измененный размер родительской ноды или измененный размер экрана.
   - `Disable` --- отключает режим адаптации нод. Заставляет все ноды сохранять заданный размер.
 
+Current Nodes
+: Текущее количество используемых нод в данном GUI.
+
 Max Nodes
 : Максимальное количество нод для данного GUI.
 
+Max Dynamic Textures
+: Максимальное количество текстур, которые можно создать с помощью [`gui.new_texture()`](/ref/stable/gui/#gui.new_texture:texture_id-width-height-type-buffer-flip)
+
+
+## Работа со свойствами GUI во время выполнения
+
+Вы можете изменять свойства GUI во время выполнения из компонента скрипта с помощью `go.get()` и `go.set()`:
+
+Шрифты
+: Получение или установка шрифта, используемого в GUI.
+
+![get_set_font](images/gui/get_set_font.png)
+
+```lua
+go.property("mybigfont", resource.font("/assets/mybig.font"))
+
+function init(self)
+  -- получаем шрифт, назначенный идентификатору 'default'
+  print(go.get("#gui", "fonts", { key = "default" })) -- /builtins/fonts/default.font
+
+  -- устанавливаем шрифт 'default' в ресурс, указанный в 'mybigfont'
+  go.set("#gui", "fonts", self.mybigfont, { key = "default" })
+
+  -- получаем новый шрифт, назначенный идентификатору 'default'
+  print(go.get("#gui", "fonts", { key = "default" })) -- /assets/mybig.font
+end
+```
+
+Материалы
+: Получение или установка материала, используемого в GUI.
+
+![get_set_material](images/gui/get_set_material.png)
+
+```lua
+go.property("myeffect", resource.material("/assets/myeffect.material"))
+
+function init(self)
+  -- получаем материал, назначенный идентификатору 'effect'
+  print(go.get("#gui", "materials", { key = "effect" })) -- /effect.material
+
+  -- устанавливаем материал 'effect' в ресурс, указанный в 'myeffect'
+  go.set("#gui", "materials", self.myeffect, { key = "effect" })
+
+  -- получаем новый материал, назначенный идентификатору 'effect'
+  print(go.get("#gui", "materials", { key = "effect" })) -- /assets/myeffect.material
+end
+```
+
+Текстуры
+: Получение или установка текстуры (атласа), используемой в GUI.
+
+![get_set_texture](images/gui/get_set_texture.png)
+
+```lua
+go.property("mytheme", resource.atlas("/assets/mytheme.atlas"))
+
+function init(self)
+  -- получаем текстуру, назначенную идентификатору 'theme'
+  print(go.get("#gui", "textures", { key = "theme" })) -- /theme.atlas
+
+  -- устанавливаем текстуру 'theme' в ресурс, указанный в 'mytheme'
+  go.set("#gui", "textures", self.mytheme, { key = "theme" })
+
+  -- получаем новую текстуру, назначенную идентификатору 'theme'
+  print(go.get("#gui", "textures", { key = "theme" })) -- /assets/mytheme.atlas
+end
+```
+
 ## Зависимости
 
 Дерево ресурсов в игре Defold статично, поэтому все зависимости, необходимые для GUI-нод, должны быть добавлены к компоненту. В *Outline* все зависимости группируются по типам в "папках":
 
 ![dependencies](images/gui/dependencies.png)
 
-Чтобы добавить новую зависимость, <kbd>кликните ПКМ</kbd> в корне "GUI" в *Outline*, затем выберите <kbd>Add ▸ [type]</kbd> из всплывающего контекстного меню.
+Чтобы добавить новую зависимость, перетащите её из панели Assets в окно редактора.
+
+Или же, чтобы добавить новую зависимость, <kbd>кликните ПКМ</kbd> в корне "GUI" в *Outline*, затем выберите <kbd>Add ▸ [type]</kbd> из всплывающего контекстного меню.
 
 Также можно <kbd>кликнуть ПКМ</kbd> на иконке папки для типа, который требуется добавить, и выбрать <kbd>Add ▸ [type]</kbd>.
 
@@ -88,12 +163,6 @@ Template
 
 <div style="clear: both;"></div>
 
-Spine
-: ![spine node](images/icons/spine-model.png){.left}
-  Отображает и анимирует Spine-модель. См. [руководство по ноде Spine](/manuals/gui-spine).
-
-<div style="clear: both;"></div>
-
 Particle FX
 : ![particlefx node](images/icons/particlefx.png){.left}
   Воспроизводит эффект частиц. См. [руководство по ноде Particle FX](/manuals/gui-particlefx).
@@ -122,6 +191,12 @@ Size (ноды Box, Text и Pie)
 Size Mode (ноды Box и Pie)
 : Если установлено значение `Automatic`, редактор сам устанавливает размер узла. Если установлено значение `Manual`, размер можно задавать самостоятельно.
 
+Enabled
+: Если флажок снят, нода не отображается, не анимируется и не может быть выбрана с помощью `gui.pick_node()`. Используйте `gui.set_enabled()` и `gui.is_enabled()` для программного управления этим свойством.
+
+Visible
+: Если флажок снят, нода не отображается, но всё ещё может быть анимирована и выбрана с помощью `gui.pick_node()`. Используйте `gui.set_visible()` и `gui.get_visible()` для программного управления этим свойством.
+
 Text (нода Text)
 : Текст, отображаемый в ноде.
 
@@ -134,6 +209,9 @@ Font (нода Text)
 Texture (ноды Box и Pie)
 : Текстура для отрисовки в ноде. Это ссылка на изображение или анимацию в атласе или тайловом источнике.
 
+Material (ноды Box, Pie, Text и Particle FX)
+: Материал, используемый при отрисовке ноды. Можно выбрать материал, добавленный в раздел *Materials* в Outline, либо оставить поле пустым, чтобы использовать материал по умолчанию, назначенный GUI-компоненту.
+
 Slice 9 (нода Box)
 : Устанавливается для сохранения размера пикселей текстуры ноды по краям при изменении размера ноды. За подробностями обращайтесь к [руководству по ноде Box](/manuals/gui-box).
 
@@ -152,15 +230,6 @@ Pie Fill Angle (нода Pie)
 Template (нода Template)
 : Файл GUIсцены, используемый в качестве шаблона для ноды. За подробностями обращайтесь к [руководству по ноде Template](/manuals/gui-template).
 
-Spine Scene (нода Spine)
-: Spine-сцена, используемая для данной ноды. За подробностями обращайтесь к [руководству по ноде Spine](/manuals/gui-spine).
-
-Default Animation (нода Spine)
-: Анимация, автоматически воспроизводимая в данной ноде. За подробностями обращайтесь к [руководству по ноде Spine](/manuals/gui-spine).
-
-Skin (нода Spine)
-: Скин, используемый для ноды. За подробностями обращайтесь к [руководству по ноде Spine](/manuals/gui-spine).
-
 ParticleFX (нода Particle FX)
 : Эффект частиц, который будет использоваться в данной ноде. За подробностями обращайтесь к [руководству по ноде Particle FX](/manuals/gui-particlefx).
 
@@ -187,6 +256,7 @@ Blend Mode
   - `Alpha` --- смешивает пиксельные значения ноды с фоном. Соответствует режиму наложения "Normal" в графических программах.
   - `Add` --- добавляет пиксельные значения ноды к фону. Соответствует "Linear dodge" в некоторых графических программах.
   - `Multiply` --- перемножает значения пикселей ноды с фоном.
+  - `Screen` --- инвертированное перемножение пикселей ноды с фоном. Соответствует режиму наложения "Screen" в графических программах.
 
 Pivot
 : Устанавливает пивот ноды. Это можно рассматривать как "центральную точку" ноды. Любое вращение, масштабирование или изменение размера будет происходить вокруг этой точки.
@@ -227,7 +297,7 @@ Adjust Mode
 
   Если свойство GUI-сцены *Adjust Reference* установлено в `Disabled`, эта настройка будет проигнорирована.
 
-Clipping Mode (ноды Box, Pie и Spine)
+Clipping Mode (ноды Box и Pie)
 : Устанавливает режим обрезки для ноды:
 
   - `None` --- отображает ноду как обычно.

+ 0 - 10
docs/ru/manuals/importing-graphics.md

@@ -71,13 +71,3 @@ Defold поддерживает изображения в форматах PNG 
   ![gui](images/graphics/gui.png)
 
 За подробностями обращайтесь к [руководству по GUI](/manuals/gui).
-
-![spine](images/icons/spine-model.png){.icon} Spine Model
-: Spine-модели получают данные из ресурсов Spine Scene. Эти данные состоят из двух частей:
-
-  1. Spine-файл типа `.json`, описывающий анимацию костей.
-  2. Атлас, содержащий изображения, прикрепленные к костям. Spine-модели не могут использовать данные из тайловых карт.
-
-  ![spine](images/graphics/spine.png)
-
-За подробностями обращайтесь к [руководству по Spine-моделям](/manuals/spinemodel).

+ 28 - 39
docs/ru/manuals/importing-models.md

@@ -4,55 +4,55 @@ brief: В данном руководстве описано, как импор
 ---
 
 # Импортирование 3D-моделей
-В настоящее время Defold поддерживает модели, скелеты и анимацию только в формате *.dae* (Collada). С помощью таких инструментов, как Maya, 3D Max, Sketchup и Blender, можно создавать и/или конвертировать 3D-модели в формат Collada. Blender --- это мощная и популярная программа для 3D-моделирования, анимации и рендеринга. Она работает под Windows, macOS и Linux и доступна для свободного скачивания на сайте http://www.blender.org.
+В настоящее время Defold поддерживает модели, скелеты и анимацию в формате GL Transmission Format *.glTF* и Collada *.dae*. С помощью таких инструментов, как Maya, 3D Max, Sketchup и Blender, можно создавать и/или конвертировать 3D-модели в формат Collada. Blender --- это мощная и популярная программа для 3D-моделирования, анимации и рендеринга. Она работает под Windows, macOS и Linux и доступна для свободного скачивания на сайте http://www.blender.org.
 
 ![Model in Blender](images/model/blender.png)
 
-## Экспортирование в формат Collada
-При экспорте модели в формат Collada создается файл с расширением *.dae*. Этот файл содержит все вершины, ребра и грани, составляющие модель, а также _UV координаты_ (информация о том, какая часть текстуры сопоставляется с определенной частью сетки), если они определены, а также кости скелета и данные анимации.
-
-* Подробное описание полигональных сеток можно найти на http://en.wikipedia.org/wiki/Polygon_mesh.
-
-* UV-координаты и UV-мапинг описаны на http://en.wikipedia.org/wiki/UV_mapping.
-
-Defold накладывает некоторые ограничения на экспортируемые данные анимации:
+## Импортирование в Defold
+Чтобы импортировать модель, просто перетащите файл *.gltf* или *.dae* и соответствующее изображение текстуры в панель *Assets*.
 
-* В настоящее время Defold поддерживает только запеченную анимацию. Это означает, что анимация должна иметь матрицы трансформации (уже вычисленные координаты) для каждой анимированной кости в каждом ключевом кадре, а не положение, вращение и масштаб как в отдельных ключах.
+![Imported model assets](images/model/assets.png)
 
-* Анимация интерполируется линейно. Если требуется более сложная интерполяция кривых, анимацию необходимо предварительно запечь в программе-экспортере.
 
-* Формат Collada не поддерживает анимационные клипы. Чтобы использовать несколько анимаций в одной модели, необходимо экспортировать их в отдельные *.dae*-файлы и собрать их в единый *.animationset*-файл в Defold.
+## Использование модели
+После того как модель импортирована в Defold, вы можете использовать её в [компоненте Model](/manuals/model).
 
+## Экспорт в glTF и Collada
+Экспортированные файлы *.gltf* или *.dae* содержат все вершины, рёбра и грани, из которых состоит модель, а также _UV координаты_ (какая часть текстуры сопоставляется с определённой частью сетки), если они были определены, кости скелета и данные анимации.
 
-### Требования
-При экспорте модели в формат Collada необходимо убедиться, что она соответствует следующим требованиям:
+* Подробное описание полигональных сеток можно найти по ссылке: http://en.wikipedia.org/wiki/Polygon_mesh.
 
-* Модель должна представлять собой единую сетку
-* Модель должна использовать лишь один материал
+* О UV координатах и UV развёртке можно прочитать здесь: http://en.wikipedia.org/wiki/UV_mapping.
 
+Defold накладывает некоторые ограничения на экспортированные анимационные данные:
 
-#### Объединение нескольких полигональных сеток
-Для объединения нескольких сеток можно использовать Blender. Выделите все сетки и нажмите `CTRL`/`CMD` + `J` чтобы объединить их.
+* В настоящее время поддерживаются только запечённые анимации. Анимации должны содержать матрицы для каждой анимированной кости на каждом ключевом кадре, а не отдельные ключи для позиции, вращения и масштаба.
 
-![Join meshes](images/model/blender_join_meshes.png)
+* Анимации интерполируются линейно. Если вы используете более сложную кривую интерполяции, анимации нужно предварительно запечь в экспортёре.
 
+* Клип-анимации (animation clips) в формате Collada не поддерживаются. Чтобы использовать несколько анимаций для одной модели, экспортируйте их в отдельные *.dae* файлы и объедините их в файл *.animationset* в Defold.
 
-#### Удаление материалов
-Для удаления лишних материалов из модели также подойдет Blender. Выберите материал для удаления и нажмите кнопку `-`.
+### Требования
+При экспорте модели важно учитывать, что пока поддерживаются не все функции.
+В настоящее время Defold не поддерживает следующие функции формата glTF:
 
-![Remove materials](images/model/blender_remove_materials.png)
+* Анимации с морфингом (Morph target animations)
+* Свойства материалов
+* Встроенные текстуры
 
+Хотя наша цель — полная поддержка формата glTF, это ещё не реализовано полностью.
+Если какой-либо функции не хватает, пожалуйста, отправьте запрос на добавление в [наш репозиторий](https://github.com/defold/defold/issues)
 
-#### Экспортирование текстуры
-Если для модели еще не существует текстуры, ее можно сгенерировать с помощью Blender. Это следует сделать перед удалением лишних материалов с модели. Начните с выделения сетки и всех ее вершин:
+### Экспорт текстуры
+Если у вас ещё нет текстуры для вашей модели, вы можете сгенерировать её с помощью Blender. Сделайте это до того, как удалите лишние материалы с модели. Начните с выбора меша и всех его вершин:
 
 ![Select all](images/model/blender_select_all_vertices.png)
 
ак только все вершины выделены, необходимо развернуть сетку, чтобы получить UV-макет:
огда все вершины выбраны, выполните развёртку (unwrap) меша, чтобы получить UV-развёртку:
 
 ![Unwrap mesh](images/model/blender_unwrap_mesh.png)
 
-Затем можно приступать к экспорту UV-макета в изображение для использования его в качестве текстуры:
+Затем можно экспортировать UV-развёртку в изображение, которое будет использоваться в качестве текстуры:
 
 ![Export UV layout](images/model/blender_export_uv_layout.png)
 
@@ -60,18 +60,7 @@ Defold накладывает некоторые ограничения на э
 
 ![Export UV layout result](images/model/blender_export_uv_layout_result.png)
 
-
-## Экспортирование с помощью Blender
-Экспорт модели в формат Collada выполняется с помощью пункта меню "Export". Следует выделить модель перед выбором пункта меню File > Export > Collada. В открывшемся диалоге установите флажок "Selection Only", чтобы экспортировать только выделенную модель.
+### Экспорт из Blender
+Вы можете экспортировать модель с помощью пункта меню Export. Выберите модель перед тем, как вызвать меню Export, и обязательно отметьте опцию "Selection Only", чтобы экспортировать только выбранный объект.
 
 ![Exporting using Blender](images/model/blender_export.png)
-
-
-## Импортирование в Defold
-Чтобы импортировать модель, просто перетащите *.dae*-файл и соответствующую текстуру в панель *Assets*.
-
-![Imported model assets](images/model/assets.png)
-
-
-## Использование модели
-После импорта модели в Defold ее можно использовать в [компоненте Model](/manuals/model).

+ 24 - 2
docs/ru/manuals/input-gamepads.md

@@ -105,8 +105,6 @@ end
 ```
 
 ## Файл настроек геймпадов
-В Windows в настоящее время поддерживаются только контроллеры XBox 360. Чтобы подключить контроллер 360 к машине Windows, убедитесь, что он правильно настроен. См. http://www.wikihow.com/Use-Your-Xbox-360-Controller-for-Windows
-
 Для настройки входа геймпада используется отдельный файл отображения для каждого типа аппаратного геймпада. Сопоставления геймпадов для конкретных аппаратных геймпадов задаются в файле *gamepads*. Defold поставляется со встроенным файлом gamepads с настройками для обычных геймпадов:
 
 ![Настройки геймпада](images/input/gamepads.png)
@@ -130,6 +128,22 @@ end
 
 Если геймпад подключен и для него не существует отображения, геймпад будет генерировать только действия "подключен", "отключен" и "сырой". В этом случае вам необходимо вручную сопоставить необработанные данные геймпада с действиями в вашей игре.
 
+(Начиная с версии 1.4.8)
+
+Можно проверить, поступает ли входное действие от неопознанного геймпада, прочитав значение `gamepad_unknown` из действия:
+
+```lua
+function on_input(self, action_id, action)
+    if action_id == hash("connected") then
+        if action.gamepad_unknown then
+            print("Подключённый геймпад не распознан и будет генерировать только сырой ввод")
+        else
+            print("Подключённый геймпад распознан и будет генерировать действия ввода для кнопок и стиков")
+        end
+    end
+end
+```
+
 ## Геймпады в HTML5
 Геймпады поддерживаются в сборках HTML5 и генерируют те же события ввода, что и на других платформах. Поддержка геймпадов основана на [Gamepad API](https://www.w3.org/TR/gamepad/), который поддерживается в большинстве браузеров (см. таблицу поддержки](https://caniuse.com/?search=gamepad)). Если браузер не поддерживает Gamepad API, Defold будет молча игнорировать любые триггеры геймпада в вашем проекте. Вы можете проверить, поддерживает ли браузер Gamepad API, проверив, существует ли функция `getGamepads` для объекта `navigator`:
 
@@ -149,6 +163,14 @@ end
 <iframe allow="gamepad"></iframe>
 ```
 
+### Стандартный геймпад
+(Начиная с версии 1.4.1)
+
+Если подключённый геймпад определяется браузером как стандартный геймпад, будет использоваться отображение для "Standard Gamepad" из [файла настроек геймпадов](/manuals/input-gamepads/#gamepads-settings-file) (отображение Standard Gamepad включено в файл `default.gamepads` в каталоге `/builtins`). Стандартный геймпад определяется как устройство с 16 кнопками и 2 аналоговыми стиками с раскладкой кнопок, аналогичной контроллерам PlayStation или Xbox (см. [определение и раскладку кнопок от W3C](https://w3c.github.io/gamepad/#dfn-standard-gamepad) для получения дополнительной информации). Если подключённый геймпад не определяется как стандартный, Defold будет искать отображение, соответствующее типу аппаратного геймпада в файле настроек геймпада.
+
+## Геймпады в Windows
+В Windows в настоящее время поддерживаются только контроллеры XBox 360. Чтобы подключить контроллер 360 к компьютеру с Windows, [убедитесь, что он правильно настроен](http://www.wikihow.com/Use-Your-Xbox-360-Controller-for-Windows).
+
 ## Геймпады на Android
 (Начиная с версии 1.2.183)
 

+ 0 - 1
docs/ru/manuals/input.md

@@ -159,7 +159,6 @@ msg.post(".", "release_input_focus")
 Компонент `on_input()` может активно контролировать, следует ли передавать действия дальше по стеку или нет:
 
 - Если `on_input()` возвращает `false`, или возврат пропущен (это подразумевает возврат `nil`, который является ложным значением в Lua), действия ввода будут переданы следующему компоненту на стеке ввода.
-
 - Если `on_input()` возвращает `true`, ввод обрабатывается. Ни один компонент, расположенный ниже по стеку ввода, не получит данные ввода. Обратите внимание, что это относится ко *всем* стекам ввода. Компонент на стеке прокси-загруженного мира может обрабатывать ввод, не позволяя компонентам на основном стеке получать ввод:
 
 ![Обработка ввода](images/input/consuming.png)

+ 13 - 16
docs/ru/manuals/lua.md

@@ -10,29 +10,20 @@ brief: Это руководство вкратце знакомит с осно
 Это руководство вкратце знакомит с основами программирования на Lua в целом и с тем, что необходимо учитывать при работе с Lua в Defold. Если у вас уже есть некоторый опыт работы с Python, Perl, Ruby, JavaScript или аналогичным динамическим языком, вы быстро освоитесь. Если вы совсем новичок в программировании, вам лучше начать с книги по Lua, предназначенной для начинающих. Существует множество книг на выбор.
 
 ## Версии Lua
-Мы стремимся сохранить Defold одинаковым на всех платформах, но в настоящее время существуют несколько незначительных расхождений в версии Lua на разных платформах:
 
-| Платформа       | Версия Lua          | JIT         |
-|-----------------|---------------------|-------------|
-| Windows         | LuaJIT 2.1.0-beta3  | Yes         |
-| macOS           | LuaJIT 2.1.0-beta3  | Yes         |
-| Linux           | LuaJIT 2.1.0-beta3  | Yes         |
-| Android         | LuaJIT 2.1.0-beta3  | Yes         |
-| iOS             | LuaJIT 2.1.0-beta3  | No*         |
-| Nintendo Switch | LuaJIT 2.1.0-beta3  | No*         |
-| HTML5           | Lua 5.1.4           | N/A         |
+Defold использует [LuaJIT](https://luajit.org/) — высокооптимизированную версию Lua, подходящую для игр и другого производительно-критичного программного обеспечения. Она полностью совместима с Lua 5.1 и поддерживает все стандартные функции библиотек Lua, а также полный набор функций API Lua/C.
 
-*=JIT-скомпилированный код не допускается
+LuaJIT также добавляет несколько [расширений языка](https://luajit.org/extensions.html), а также некоторые возможности Lua 5.2 и 5.3.
 
-[LuaJIT](https://luajit.org/) --- это высоко оптимизированная версия Lua, подходящая для использования в играх и других программах, где важна производительность. LuaJIT полностью совместим с Lua 5.1. Он поддерживает все стандартные функции библиотеки Lua и полный набор Lua/C API функций.
-
-LuaJIT также добавляет ряд [языковых расширений](https://luajit.org/extensions.html) и некоторые возможности из Lua 5.2.
+Мы стремимся к тому, чтобы поведение Defold оставалось одинаковым на всех платформах, но в настоящее время существуют некоторые незначительные различия в версии Lua между платформами:
+* iOS не допускает JIT-компиляцию.
+* Nintendo Switch не допускает JIT-компиляцию.
+* HTML5 использует Lua 5.1.4 вместо LuaJIT.
 
 ::: important
 Чтобы гарантировать работоспособность игры на всех поддерживаемых платформах, мы настоятельно рекомендуем использовать ТОЛЬКО языковые возможности из Lua 5.1.
 :::
 
-
 ### Стандартные библиотеки и расширения
 Defold включает все [стандартные библиотеки Lua 5.1](http://www.lua.org/manual/5.1/manual.html#5), а также сокеты и библиотеку битовых операций:
 
@@ -64,6 +55,9 @@ Defold включает все [стандартные библиотеки Lua
 * [Lua 5.1 reference manual](https://www.amazon.com/gp/product/8590379833/ref=dbs_a_def_rwt_hsch_vapi_taft_p1_i4) --- Также доступно онлайн (см. выше)
 * [Beginning Lua Programming](https://www.amazon.com/Beginning-Lua-Programming-Kurt-Jung/dp/0470069171)
 
+### Видео
+* [Learn Lua in one video](https://www.youtube.com/watch?v=iMacxZQMPXs)
+
 ## Синтаксис
 
 Программы имеют простой, легко читаемый синтаксис. Выражения записываются по одному на каждой строке, и нет необходимости отмечать их конец. По желанию можно использовать точки с запятой `;` для разделения выражений. Блоки кода разделены ключевыми словами и заканчиваются ключевым словом `end`. Комментарии могут быть как блочными, так и до конца строки:
@@ -86,7 +80,10 @@ end
 
 ## Переменные и типы данных
 
-Lua является динамически типизированным языком, что означает, что переменные не имеют типов, а их значения имеют. В отличие от типизированных языков, любой переменной можно присвоить любое значение. В Lua существует восемь основных типов данных:
+Lua является динамически типизированным языком, что означает, что переменные не имеют типов, а их значения имеют.
+В отличие от типизированных языков, любой переменной можно присвоить любое значение.
+
+В Lua существует восемь основных типов данных:
 
 `nil`
 : Этот тип имеет только одно значение `nil`. Обычно он обозначает отсутствие полезного значения, например, неприсвоенные переменные.

+ 174 - 9
docs/ru/manuals/material.md

@@ -14,7 +14,7 @@ brief: Данное руководство объясняет как работ
 
 ## Создание материала
 
-Чтобы создать материал, <kbd>кликните правой кнопкой мыши</kbd> по нужной папке в секции *Assets* и выберите <kbd>New... ▸ Material</kbd>. (Вы также можете выбрать <kbd>File ▸ New...</kbd> из меню и затем выбрать <kbd>Material</kbd>). Дайте имя новому файлу материала и нажмите <kbd>Ok</kbd>.
+Чтобы создать материал, <kbd>кликните правой кнопкой мыши</kbd> по нужной папке в обозревателе *Assets* и выберите <kbd>New... ▸ Material</kbd>. (Вы также можете выбрать <kbd>File ▸ New...</kbd> в меню, а затем выбрать <kbd>Material</kbd>). Укажите имя нового файла материала и нажмите <kbd>Ok</kbd>.
 
 ![Material file](images/materials/material_file.png)
 
@@ -25,25 +25,170 @@ brief: Данное руководство объясняет как работ
 Файл материала содержит следующую информацию:
 
 Name
-: То, что определяет материал. Это имя используется для перечисления материала в ресурсе *Render* для включения в билд. Имя также используется в функции из API рендеринга `render.enable_material()`. Имя должно быть уникальным.
+: Уникальное имя материала. Оно используется для включения материала в сборку через ресурс *Render* и также используется в функции API рендеринга `render.enable_material()`. Имя должно быть уникальным.
 
 Vertex Program
-: Файл программы вершинного шейдера (*.vp*), который будет использоваться при рендеринге с этим материалом. Программа вершинного шейдера запускается на GPU для каждой из примитивных вершин компонента. Она вычисляет положение на экране для каждой вершины и также опционально подает на выход "изменяемые" переменные, которые интерполируются и идут на вход программе фрагментного шейдера.
+: Файл программы вершинного шейдера (*.vp*), используемый при рендеринге с этим материалом. Программа выполняется на GPU для каждой вершины примитива компонента. Она вычисляет положение вершины на экране и может также передавать "изменяемые" переменные, которые интерполируются и подаются на вход фрагментной программе.
 
 Fragment Program
-: Файл программы фрагментного шейдера (*.fp*), который будет использоваться при рендеринге с этим материалом. Программа запускается на GPU для каждого фрагмента (пикселя) графического примитива и ее цель --- это определить цвет отрисовки для каждого фрагмента. Обычно это делается на основе поиска по текстуре и вычислений на базе входящих переменных (изменяемые переменные либо константы).
+: Файл программы фрагментного шейдера (*.fp*), используемый при рендеринге с этим материалом. Программа запускается на GPU для каждого фрагмента (пикселя) примитива и определяет цвет этого фрагмента. Обычно это достигается путем выборки из текстуры и вычислений на основе входящих данных (переменные или константы).
 
 Vertex Constants
-: Нормированные значения (между 0.0 и 1.0), которые будут переданы программе вершинного шейдера. Смотрите ниже список доступных констант.
+: Константы (uniform), передаваемые в вершинную программу шейдера. См. ниже список доступных констант.
 
 Fragment Constants
-: Нормированные значения (между 0.0 и 1.0), которые будут переданы программе фрагментного шейдера. Смотрите ниже список доступных констант.
+: Константы (uniform), передаваемые в фрагментную программу шейдера. См. ниже список доступных констант.
 
 Samplers
-: Опционально вы можете сконфигурировать специфичные сэмплеры в файле материалов. Добавьте сэмплер, назовите его согласно имени, используемому в программе шейдера и установите wrap и filter параметры по вашему вкусу. 
+: При необходимости вы можете настроить конкретные сэмплеры в файле материала. Добавьте сэмплер, укажите имя, соответствующее использованному в шейдере, и задайте параметры обертки и фильтрации по своему усмотрению.
 
 Tags
-: Теги, ассоциированные с материалом. Теги представлены в движке как _битовая маска_, которая используется в [`render.predicate()`](/ref/render#render.predicate) для отбора компонентов, которые должны быть отрисованы вместе. Смотрите [Документацию по рендерингу](/manuals/render), описывающую как это делается. Максимальное число тегов, которое вы можете использовать в проекте --- 32.
+: Теги, ассоциированные с материалом. В движке они представлены в виде _битовой маски_, используемой в [`render.predicate()`](/ref/render#render.predicate) для выбора компонентов, которые нужно отрисовать вместе. Подробнее см. [Документацию по рендеру](/manuals/render). Максимальное количество тегов в проекте — 32.
+
+## Атрибуты
+
+Атрибуты шейдера (также называемые потоками вершин или вершинными атрибутами) — это механизм, с помощью которого GPU получает вершины из памяти для рендеринга геометрии. Вершинный шейдер задает набор потоков через ключевое слово `attribute`, и в большинстве случаев Defold автоматически создает и привязывает эти данные на основе имени потока. Однако в некоторых случаях вы можете захотеть передавать больше данных на вершину для реализации специфических эффектов, которые движок по умолчанию не предоставляет. Атрибут вершины можно настроить с помощью следующих полей:
+
+Name
+: Имя атрибута. Аналогично шейдерным константам, конфигурация атрибута будет использоваться только в случае совпадения с атрибутом, указанным в программе вершинного шейдера.
+
+Semantic type
+: Семантический тип указывает смысл того, *что* представляет атрибут и/или *как* он должен отображаться в редакторе. Например, указание `SEMANTIC_TYPE_COLOR` отобразит виджет выбора цвета, хотя данные по-прежнему передаются как есть из движка в шейдер.
+
+  - `SEMANTIC_TYPE_NONE` — значение по умолчанию, просто передает данные в буфер вершин
+  - `SEMANTIC_TYPE_POSITION` — координаты вершины; можно использовать вместе с пространством координат
+  - `SEMANTIC_TYPE_TEXCOORD` — текстурные координаты
+  - `SEMANTIC_TYPE_PAGE_INDEX` — индекс страницы
+  - `SEMANTIC_TYPE_COLOR` — вызывает отображение цветового виджета в инспекторе
+  - `SEMANTIC_TYPE_NORMAL` — нормаль вершины
+  - `SEMANTIC_TYPE_TANGENT` — касательная вершины
+  - `SEMANTIC_TYPE_WORLD_MATRIX` — мировая матрица вершины
+  - `SEMANTIC_TYPE_NORMAL_MATRIX` — матрица нормалей вершины
+
+Data type
+: Тип данных, используемый для хранения атрибута.
+
+  - `TYPE_BYTE` — знаковый 8-битный байт
+  - `TYPE_UNSIGNED_BYTE` — беззнаковый 8-битный байт
+  - `TYPE_SHORT` — знаковое 16-битное значение
+  - `TYPE_UNSIGNED_SHORT` — беззнаковое 16-битное значение
+  - `TYPE_INT` — знаковое целое число
+  - `TYPE_UNSIGNED_INT` — беззнаковое целое число
+  - `TYPE_FLOAT` — число с плавающей точкой (по умолчанию)
+
+Normalize
+: Если включено, драйвер GPU нормализует значение. Это полезно, если не требуется полная точность — например, цвет часто задается байтами 0..255, но в шейдере работает как 0..1.
+
+Coordinate space
+: Некоторые семантические типы поддерживают задание координат в разных пространствах. Например, для реализации "билбординга" можно использовать как локальные, так и мировые координаты.
+
+Vector type
+: Тип векторного значения атрибута.
+
+  - `VECTOR_TYPE_SCALAR` — скаляр
+  - `VECTOR_TYPE_VEC2` — вектор из 2 элементов
+  - `VECTOR_TYPE_VEC3` — вектор из 3 элементов
+  - `VECTOR_TYPE_VEC4` — вектор из 4 элементов (по умолчанию)
+  - `VECTOR_TYPE_MAT2` — матрица 2x2
+  - `VECTOR_TYPE_MAT3` — матрица 3x3
+  - `VECTOR_TYPE_MAT4` — матрица 4x4
+
+Step function
+: Указывает, как атрибут должен передаваться в вершинный шейдер. Используется в основном для инстансинга.
+
+  - `Vertex` — один раз на вершину (по умолчанию)
+  - `Instance` — один раз на экземпляр, например для мировых матриц
+
+Value
+: Значение атрибута. Может быть переопределено для каждого компонента, в противном случае используется значение по умолчанию. Внимание: для атрибутов по умолчанию (`position`, `texcoord` и др.) это значение игнорируется.
+
+::: sidenote
+Переопределение конфигурации атрибутов позволяет уменьшить объем данных и снизить нагрузку на память CPU и GPU.
+:::
+
+### Семантика атрибутов по умолчанию
+
+Система материалов автоматически присваивает семантику атрибутам по их именам во время исполнения:
+
+  - `position` - semantic type: `SEMANTIC_TYPE_POSITION`
+  - `texcoord0` - semantic type: `SEMANTIC_TYPE_TEXCOORD`
+  - `texcoord1` - semantic type: `SEMANTIC_TYPE_TEXCOORD`
+  - `page_index` - semantic type: `SEMANTIC_TYPE_PAGE_INDEX`
+  - `color` - semantic type: `SEMANTIC_TYPE_COLOR`
+  - `normal` - semantic type: `SEMANTIC_TYPE_NORMAL`
+  - `tangent` - semantic type: `SEMANTIC_TYPE_TANGENT`
+  - `mtx_world` - semantic type: `SEMANTIC_TYPE_WORLD_MATRIX`
+  - `mtx_normal` - semantic type: `SEMANTIC_TYPE_NORMAL_MATRIX`
+
+Если вы указываете эти атрибуты в редакторе материалов, их поведение будет определяться вашей конфигурацией.
+
+### Задание пользовательских атрибутов во время исполнения
+
+Как и в случае с пользовательскими шейдерными константами, вы можете изменять значения вершинных атрибутов во время исполнения через `go.get`, `go.set` и `go.animate`:
+
+![Custom material attribute](images/materials/set_custom_attribute.png)
+
+```lua
+go.set("#sprite", "tint", vmath.vector4(1,0,0,1))
+
+go.animate("#sprite", "tint", go.PLAYBACK_LOOP_PINGPONG, vmath.vector4(1,0,0,1), go.EASING_LINEAR, 2)
+```
+
+Однако при обновлении вершинных атрибутов есть особенности: возможность использовать новое значение зависит от семантики атрибута. Например, компонент спрайта поддерживает `SEMANTIC_TYPE_POSITION`, и если вы попытаетесь переопределить атрибут с этой семантикой, то компонент проигнорирует новое значение, поскольку семантика требует, чтобы данные всегда исходили от позиции спрайта.
+
+::: sidenote
+Изменение пользовательских вершинных атрибутов во время исполнения в настоящее время поддерживается только для компонентов типа спрайт.
+:::
+
+### Инстансинг
+
+Инстансинг — это техника, используемая для эффективной отрисовки множества копий одного и того же объекта на сцене. Вместо создания отдельной копии объекта каждый раз, инстансинг позволяет движку использовать одну модель и переиспользовать её многократно. Например, в игре с большим лесом вместо того, чтобы создавать отдельную модель дерева для каждого дерева, можно создать одну модель и размещать её сотни или тысячи раз с разными позициями и масштабом. Таким образом, весь лес может быть отрисован одним вызовом отрисовки, а не отдельными вызовами для каждого дерева.
+
+::: sidenote
+Инстансинг на данный момент доступен только для компонентов типа Model.
+:::
+
+Инстансинг включается автоматически, если соблюдены необходимые условия. Defold активно использует пакетирование состояния отрисовки — чтобы инстансинг работал, необходимо соблюдение следующих требований:
+
+- Один и тот же материал используется во всех экземплярах. Инстансинг работает даже если материал был задан через `render.enable_material()`
+- Материал должен быть сконфигурирован для использования вершин в локальном пространстве
+- В материале должен быть хотя бы один атрибут, повторяющийся на каждый экземпляр
+- Значения констант должны быть одинаковыми у всех экземпляров. Их можно передавать через пользовательские вершинные атрибуты или иными способами (например, через текстуру)
+- Все экземпляры должны использовать одни и те же ресурсы шейдера, такие как текстуры или буферы хранения
+
+Чтобы указать, что атрибут должен повторяться на каждый экземпляр, установите для него `Step function = Instance`. Это делается автоматически для некоторых семантик по имени (см. таблицу `Семантика атрибутов по умолчанию`), но также может быть установлено вручную в редакторе материалов.
+
+Простой пример: сцена с четырьмя игровыми объектами, у каждого из которых есть компонент-модель:
+
+![Instancing setup](images/materials/instancing-setup.png)
+
+Материал настроен с одним пользовательским атрибутом, повторяющимся на каждый экземпляр:
+
+![Instancing material](images/materials/instancing-material.png)
+
+Вершинный шейдер использует несколько атрибутов, повторяющихся на каждый экземпляр:
+
+```glsl
+// Атрибуты на вершину
+attribute highp vec4 position;
+attribute mediump vec2 texcoord0;
+attribute mediump vec3 normal;
+
+// Атрибуты на экземпляр
+attribute mediump mat4 mtx_world;
+attribute mediump mat4 mtx_normal;
+attribute mediump vec4 instance_color;
+```
+
+Обратите внимание, что `mtx_world` и `mtx_normal` по умолчанию будут использовать `Step function = Instance`. Это можно изменить в редакторе материалов, добавив соответствующие записи и установив `Step function = Vertex`, чтобы атрибут повторялся на вершину.
+
+Чтобы убедиться, что инстансинг работает, можно воспользоваться веб-профайлером. В приведённом примере, так как единственное различие между экземплярами куба — это атрибуты на экземпляр, отрисовка осуществляется одним вызовом:
+
+![Instancing draw calls](images/materials/instancing-draw-calls.png)
+
+#### Обратная совместимость
+
+Для использования инстансинга на графических адаптерах с OpenGL требуется как минимум OpenGL 3.1 (на десктопе) или OpenGL ES 3.0 (на мобильных устройствах). Это означает, что на очень старых устройствах с OpenGL ES2 или более старыми версиями инстансинг может быть недоступен. В таком случае отрисовка всё равно будет работать по умолчанию, без дополнительных действий со стороны разработчика, но производительность будет ниже. В настоящее время нет способа определить, поддерживается ли инстансинг, но в будущем планируется добавить такую возможность — чтобы можно было, например, использовать более дешёвый материал или полностью отключить элементы вроде листвы, которые обычно отрисовываются с использованием инстансинга.
 
 ## Вершинные и фрагментные константы
 
@@ -64,13 +209,16 @@ CONSTANT_TYPE_VIEWPROJ
 CONSTANT_TYPE_WORLDVIEW
 : Матрица с уже перемноженными матрицей мира и предыдущей матрицы (перемножение матрицы вида на проекционную).
 
+`CONSTANT_TYPE_WORLDVIEWPROJ`
+: Матрица с уже перемноженными матрицами мира, вида и проекционной.
+
 CONSTANT_TYPE_NORMAL
 : Матрица для вычисления ориентации по нормали. Мировое преобразование может включать не-нормированное (non-uniform) масштабирование, которое ломает ортогональность скомбинированного мир-на-отображение преобразования. Матрица нормалей используется, чтобы избежать проблем с направлениями когда преобразовываются нормали. (Нормальная матрица --- это транспонированная инверсия матрицы мир-на-отображение.)  
 
 CONSTANT_TYPE_USER
 : Константа типа vector4, которую вы можете использовать для любых собственных данных, которые вы хотите передать в программу шейдера. Вы можете установить начальное значение константы в месте ее определения, но она изменяема через функции [go.set()](/ref/stable/go/#go.set) / [go.animate()](/ref/stable/go/#go.animate). Также вы можете получить ее значение через [go.get()](/ref/stable/go/#go.get). Изменение константы материала одного экземпляра компонента [ломает пакетирование для рендеринга и приведет к дополнительным вызовам отрисовки](/manuals/render/#draw-calls-and-batching).
 
-Example:
+Пример:
 
 ```lua
 go.set("#sprite", "tint", vmath.vector4(1,0,0,1))
@@ -78,6 +226,19 @@ go.set("#sprite", "tint", vmath.vector4(1,0,0,1))
 go.animate("#sprite", "tint", go.PLAYBACK_LOOP_PINGPONG, vmath.vector4(1,0,0,1), go.EASING_LINEAR, 2)
 ```
 
+CONSTANT_TYPE_USER_MATRIX4
+: Константа типа matrix4, которую можно использовать для передачи любых пользовательских данных в программу шейдера. Вы можете задать начальное значение при определении, но она доступна для изменения через функции [go.set()](/ref/stable/go/#go.set) / [go.animate()](/ref/stable/go/#go.animate), а также получить текущее значение через [go.get()](/ref/stable/go/#go.get). Изменение значения константы у отдельного экземпляра компонента [ломает пакетирование и приводит к дополнительным вызовам отрисовки](/manuals/render/#draw-calls-and-batching).
+
+Пример:
+
+```lua
+go.set("#sprite", "m", vmath.matrix4())
+```
+
+::: sidenote
+Чтобы константа `CONSTANT_TYPE_USER` или `CONSTANT_TYPE_MATRIX4` была доступна через `go.get()` и `go.set()`, она должна использоваться в шейдере. Если она определена в материале, но не используется, она будет удалена и станет недоступной в рантайме.
+:::
+
 ## Сэмплеры
 
 Сэмплеры используются для отбора цветовой информации из текстуры (тайловый источник или атлас). Цветовая информация может далее быть использована для вычислений в программе шейдера.
@@ -134,6 +295,7 @@ Wrap U/W
 Filter Min/Mag
 : Фильтрация для увеличения и уменьшения. Ближайшая фильтрация требует меньше вычислений, чем линейная интерполяция, но может привести к артефактам алиасинга. Линейная интерполяция часто дает более плавные результаты :
 
+  - `Default` — использует параметр фильтрации по умолчанию, указанный в файле `game.project` в секции `Graphics`, как `Default Texture Min Filter` и `Default Texture Mag Filter`.
   - `FILTER_MODE_NEAREST` -- использует тексель с координатами ближайшими к центру пикселя.
   - `FILTER_MODE_LINEAR` -- устанавливает взвешенное линейное среднее для массива текселей 2x2, которые лежат ближе всего к центру пикселя .
   - `FILTER_MODE_NEAREST_MIPMAP_NEAREST` -- выбирает ближайшее значение текселя в отдельной MIP-карте.
@@ -141,6 +303,9 @@ Filter Min/Mag
   - `FILTER_MODE_LINEAR_MIPMAP_NEAREST` -- линейное интерполирование в пределах отдельной MIP-карты. 
   - `FILTER_MODE_LINEAR_MIPMAP_LINEAR` -- использует линейную интерполяцию для вычисления значения на каждой из двух карт, а затем выполняет линейную интерполяцию между этими двумя значениями.
 
+Max Anisotropy
+: Анизотропная фильтрация — это продвинутая техника фильтрации, при которой берется несколько выборок и их результаты смешиваются. Этот параметр управляет уровнем анизотропии для сэмплеров текстур. Если анизотропная фильтрация не поддерживается GPU, параметр не будет иметь эффекта и по умолчанию будет установлен в значение 1.
+
 ## Буферы констант
 
 Когда конвейер рендеринга отрисовывает, он берет значения констант из буфера по-умолчанию --- системного буфера констант. Вы можете создать собственный буфер констант, чтобы перекрыть константы по-умолчанию и вместо этого выставить uniform-ы для программы шейдера программно в рендер скрипте:

+ 23 - 18
docs/ru/manuals/mesh.md

@@ -48,23 +48,6 @@ Defold по сути является 3D движком. Даже когда р
 
 Используя буферы, сетками можно манипулировать во время выполнения.
 
-## Константы материала
-
-{% include shared/material-constants.md component='mesh' variable='tint' %}
-
-`tint`
-: Цветовой оттенок сетки (`vector4`). Для представления оттенка с компонентами x, y, z и w, соответствующими красному, зеленому, синему и альфа оттенкам, используется тип vector4.
-
-## Локальное vs мировое пространство вершин
-Если параметр Vertex Space материала сетки установлен в Local, данные будут предоставлены в шейдере как есть, и придется преобразовывать вершины/нормали, как принято, на GPU.
-
-Если для свойства Vertex Space материала сетки установлено значение World Space, необходимо либо предоставить поток “position” и “normal” по умолчанию, либо выбрать его из выпадающего списка при редактировании сетки. Это необходимо для того, чтобы движок мог преобразовать данные в мировое пространство для объединения с другими объектами.
-
-## Примеры
-Обратитесь к [сообщению на форуме](https://forum.defold.com/t/mesh-component-in-defold-1-2-169-beta/65137), чтобы узнать о том, как использовать компонент Mesh, включая примеры проектов и фрагменты кода.
-
-Пример создания куба из треугольных полос (triangle strips):
-
 ```Lua
 
 -- cube
@@ -99,4 +82,26 @@ end
 -- set the buffer with the vertices on the mesh
 local res = go.get("#mesh", "vertices")
 resource.set_buffer(res, buf)
-```
+```
+
+Дополнительную информацию об использовании компонента Mesh, включая примеры проектов и фрагменты кода, можно найти в [анонсе на форуме](https://forum.defold.com/t/mesh-component-in-defold-1-2-169-beta/65137).
+
+## Отсечение по усеченной пирамиде (Frustum culling)
+
+Компоненты Mesh не отсеиваются автоматически из-за их динамической природы и невозможности заранее определить, как закодированы данные о положении. Чтобы включить отсечение, необходимо задать axis-aligned ограничивающий прямоугольник (AABB) в виде метаданных буфера, используя 6 чисел с плавающей точкой (минимальные и максимальные значения по осям):
+
+```lua
+buffer.set_metadata(buf, hash("AABB"), { 0, 0, 0, 1, 1, 1 }, buffer.VALUE_TYPE_FLOAT32)
+```
+
+## Константы материала
+
+{% include shared/material-constants.md component='mesh' variable='tint' %}
+
+`tint`
+: Цветовой оттенок сетки (`vector4`). Для представления оттенка с компонентами x, y, z и w, соответствующими красному, зеленому, синему и альфа оттенкам, используется тип vector4.
+
+## Локальное vs мировое пространство вершин
+Если параметр Vertex Space материала сетки установлен в Local, данные будут предоставлены в шейдере как есть, и придется преобразовывать вершины/нормали, как принято, на GPU.
+
+Если для свойства Vertex Space материала сетки установлено значение World Space, необходимо либо предоставить поток “position” и “normal” по умолчанию, либо выбрать его из выпадающего списка при редактировании сетки. Это необходимо для того, чтобы движок мог преобразовать данные в мировое пространство для объединения с другими объектами.

+ 12 - 0
docs/ru/manuals/networking.md

@@ -11,3 +11,15 @@ brief: Данное руководство объясняет как можно
 * [Сокеты](/manuals/socket-connections)
 * [Соединения по веб-сокету](/manuals/websocket-connections)
 * [Онлайн сервисы](/manuals/online-services)
+
+## Технические подробности
+
+### IPv4 и IPv6
+
+Defold поддерживает подключения по IPv4 и IPv6 как для сокетов, так и для HTTP-запросов.
+
+### Безопасные соединения
+
+Defold поддерживает защищённые SSL-соединения для сокетов и HTTP-запросов.
+
+Defold может дополнительно проверять SSL-сертификат любого защищённого соединения. Проверка SSL будет включена, если в поле [SSL Certificates setting](/manuals/project-settings/#network) раздела Network в *game.project* указан PEM-файл, содержащий открытые корневые сертификаты CA или открытый ключ самоподписанного сертификата. В `builtins/ca-certificates` включён список корневых сертификатов CA, однако рекомендуется создать новый PEM-файл и скопировать в него нужные корневые сертификаты CA в зависимости от серверов, к которым подключается игра.

+ 13 - 26
docs/ru/manuals/nintendo-switch.md

@@ -3,40 +3,27 @@ title: Разработка для Nintendo Switch
 brief: В данном руководстве описано, как получить доступ к Nintendo Switch
 ---
 
-# Зарегиструйтесь в Nintendo Switch как разработчик
 
-Поддержка платформы Nintendo Switch не включена в стандартную версию Defold. Чтобы получить доступ к поддержке Nintendo Switch в Defold, вам необходимо:
+# Разработка для Nintendo Switch
 
-1. Стать спонсором сообщества Defold и получите доступ к Nintendo Switch, включенный в ваш уровень членства, и
-2. Стать зарегистрированным разработчиком игр для платформ Nintendo.
+Из-за лицензионных ограничений Nintendo доступ к версиям Defold с поддержкой платформы Nintendo Switch не входит в стандартную версию Defold. Чтобы получить доступ к таким версиям, необходимо стать одобренным разработчиком игр для Nintendo Switch.
 
+## Регистрация в качестве разработчика для Nintendo Switch
 
-## Станьте спонсором сообщества Defold и получите доступ к Nintendo Switch
-
-Вы можете стать спонсором сообщества Defold на [странице пожертвований сообщества Defold](/community-donations/). Также вы можете стать спонсором с доступом к Nintendo Switch, используя GitHub Sponsors или Patreon. Обратите внимание на доступные уровни и выберите тот, который включает доступ к Nintendo Switch.
-
-![](images/nintendo-switch/register-defold.png)
-
-## Зарегистрируйтесь в качестве разработчика игр для платформ Nintendo
-
-Регистрируетесь в качестве разработчика игр для платформ Nintendo на [портале разработчиков Nintendo](https://developer.nintendo.com/register):
+Вы можете зарегистрироваться как разработчик игр для Nintendo Switch на [портале разработчиков Nintendo](https://developer.nintendo.com/register):
 
 ![](images/nintendo-switch/register-nintendo.png)
 
-Пройдя регистрирацию, вы получите доступ к инструментам и ресурсам разработчиков Nintendo для создания и публикации игр и приложений для современных платформ Nintendo.
-
-
-### Запрос доступа в Defold
-
-После получения одобрения от Nintendo вам необходимо войти на портал Nintendo для разработчиков, перейти на страницу Tools and Middleware и зарегистрироваться для доступа в Defold. Когда вы зарегистрируетесь для доступа в Defold, мы получим электронное письмо от Nintendo, подтверждающее, что вы являетесь зарегистрированным разработчиком Nintendo. Затем мы проверим вас как спонсора сообщества, и доступ к Nintendo Switch будет включен в ваш уровень членства.
+После того как вы будете одобрены Nintendo, вы получите доступ к разделу Tools and Middleware на портале разработчиков Nintendo, где сможете запросить доступ к Defold. После вашей регистрации мы получим от Nintendo письмо с подтверждением того, что вы являетесь зарегистрированным разработчиком Nintendo.
 
-Когда мы подтвердим, что вы являетесь спонсором с доступом к Nintendo Switch, мы предоставим вам доступ к следующему:
+## Доступ к поддержке Nintendo Switch в Defold
 
-* Версии редактора Defold и инструментов командной строки Defold (bob.jar) с поддержкой комплектации для платформы Nintendo Switch.
-* К частной группе форума, где вы можете получить поддержку по вопросам Nintendo Switch.
-* Документации для Nintendo Switch
-* API к функциональности движка, специфичной для Nintendo Switch.
+После подтверждения вашего статуса одобренного разработчика Nintendo Switch мы предоставим вам доступ к следующему:
 
+* Доступ к исходному коду расширения Nintendo Switch с интеграцией API, специфичных для консоли.
+* Доступ к исходному коду версии игрового движка Defold с поддержкой Nintendo Switch. Обратите внимание, что доступ к исходному коду не требуется для сборки игр под Nintendo Switch, но он предоставляется в случае, если вы хотите внести изменения в ядро движка.
+* [Утилита командной строки](/manuals/bob) с поддержкой сборки под платформу Nintendo Switch. Сборка из редактора Defold не поддерживается.
+* Форум, где вы сможете получить поддержку, связанную с Nintendo Switch.
 
-## Часто задаваемые вопросы
-:[Consoles FAQ](../shared/consoles-faq.md)
+## FAQ
+:[Consoles FAQ](../shared/consoles-faq.md)

+ 18 - 0
docs/ru/manuals/optimization-battery.md

@@ -0,0 +1,18 @@
+---
+title: Оптимизация энергопотребления в Defold
+brief: В этом руководстве описывается, как оптимизировать энергопотребление игры на Defold.
+---
+
+# Оптимизация энергопотребления
+Энергопотребление особенно важно при разработке игр для мобильных или портативных устройств. Высокая нагрузка на CPU или GPU быстро разряжает батарею и может привести к перегреву устройства.
+
+Ознакомьтесь с руководством по [оптимизации производительности во время выполнения](/manuals/optimization-speed), чтобы узнать, как снизить нагрузку на CPU и GPU.
+
+## Отключение акселерометра
+Если вы создаёте мобильную игру, в которой не используется акселерометр устройства, рекомендуется [отключить его в *game.project*](/manuals/project-settings/#use-accelerometer), чтобы уменьшить количество генерируемых событий ввода.
+
+# Оптимизация под конкретные платформы
+
+## Android Device Performance Framework
+
+Android Dynamic Performance Framework — это набор API, позволяющий играм более напрямую взаимодействовать с системами питания и тепловыми системами Android-устройств. Это позволяет отслеживать динамическое поведение системы и оптимизировать производительность игры на устойчивом уровне, не вызывая перегрева устройства. Используйте [расширение Android Dynamic Performance Framework](https://defold.com/extension-adpf/), чтобы отслеживать и оптимизировать производительность вашей игры на Android-устройствах.

+ 28 - 0
docs/ru/manuals/optimization-memory.md

@@ -0,0 +1,28 @@
+---
+title: Оптимизация использования памяти в Defold
+brief: В этом руководстве описывается, как оптимизировать использование памяти в игре на Defold.
+---
+
+# Оптимизация использования памяти
+
+## Сжатие текстур
+Использование сжатия текстур не только уменьшит размер ресурсов внутри архива вашей игры, но и может снизить объём используемой GPU-памяти.
+
+## Динамическая загрузка
+В большинстве игр есть контент, который используется нечасто. С точки зрения использования памяти не имеет смысла держать такой контент загруженным постоянно — его лучше загружать и выгружать по мере необходимости. Это, конечно, компромисс между доступностью контента и временем загрузки.
+
+В Defold есть несколько способов динамической загрузки контента:
+
+* [Прокси-коллекции](/manuals/collection-proxy/)
+* [Динамические фабрики коллекций](/manuals/collection-factory/#dynamic-loading-of-factory-resources)
+* [Динамические фабрики](/manuals/factory/#dynamic-loading-of-factory-resources)
+* [Live Update](/manuals/live-update/)
+
+## Оптимизация счётчиков компонентов
+Defold выделяет память для компонентов и ресурсов один раз при создании коллекции, чтобы уменьшить фрагментацию памяти. Объём выделяемой памяти зависит от настроек различных счётчиков компонентов в *game.project*. Используйте [профайлер](/manuals/profiling/), чтобы получить точные данные об использовании компонентов и ресурсов, и настройте вашу игру на использование максимальных значений, близких к реальному количеству компонентов и ресурсов. Это поможет уменьшить объём используемой памяти (см. информацию об [оптимизации максимального количества компонентов](/manuals/project-settings/#component-max-count-optimizations)).
+
+## Оптимизация количества GUI-нодов
+Оптимизируйте количество GUI-нодов, задав максимальное число нодов в GUI-файле в соответствии с реальными потребностями. Поле `Current Nodes` в [свойствах компонента GUI](https://defold.com/manuals/gui/#gui-properties) покажет количество используемых нодов этим компонентом.
+
+:[Оптимизации для HTML5](../shared/optimization-memory-html5.md)
+

+ 100 - 0
docs/ru/manuals/optimization-size.md

@@ -0,0 +1,100 @@
+---
+title: Оптимизация размера игры в Defold
+brief: В этом руководстве описывается, как оптимизировать размер игры на Defold.
+---
+
+# Оптимизация размера игры
+
+Размер вашей игры может быть критически важным фактором успеха на таких платформах, как веб и мобильные устройства, в то время как на ПК и консолях это менее важно из-за доступности и дешевизны дискового пространства.
+
+### iOS и Android
+Apple и Google установили ограничения на размер приложений при загрузке через мобильные сети (в отличие от Wi-Fi). Для Android это ограничение составляет 200 МБ для приложений, опубликованных с использованием [app bundles](https://developer.android.com/guide/app-bundle#size_restrictions). Для iOS пользователи получат предупреждение, если размер приложения превышает 200 МБ, но они всё равно смогут его загрузить.
+
+::: sidenote
+Согласно исследованию 2017 года: «Каждое увеличение APK на 6 МБ снижает коэффициент конверсии установки на 1%.» ([источник](https://medium.com/googleplaydev/shrinking-apks-growing-installs-5d3fcba23ce2))
+:::
+
+### HTML5
+Poki и многие другие веб-платформы рекомендуют, чтобы начальная загрузка не превышала 5 МБ.
+
+Facebook рекомендует, чтобы Facebook Instant Game запускалась менее чем за 5 секунд, желательно — за 3 секунды. Это не означает строго заданный размер, но речь идёт об объёмах до ~20 МБ.
+
+Игровые рекламы с демо-геймплеем обычно ограничены объёмом от 2 до 5 МБ в зависимости от рекламной сети.
+
+## Стратегии оптимизации размера
+Оптимизировать размер приложения можно двумя способами: уменьшив размер самого движка и/или уменьшив размер игровых ресурсов.
+
+Чтобы лучше понять, из чего складывается размер вашего приложения, вы можете [сгенерировать отчёт о сборке](/manuals/bundling/#build-reports). Обычно основной объём занимают звуки и графика.
+
+::: important
+Defold создаёт дерево зависимостей при сборке и упаковке приложения. Система сборки начинает с коллекции начальной загрузки, указанной в *game.project*, и просматривает все связанные коллекции, игровые объекты и компоненты, чтобы определить список используемых ресурсов. В итоговый пакет попадут только эти ресурсы. Всё, что не связано напрямую, будет исключено. Несмотря на это, как разработчику вам следует учитывать, какие ресурсы включаются в итоговое приложение и каков их размер — как по отдельности, так и в совокупности.
+:::
+
+## Оптимизация размера движка
+Быстрый способ уменьшить размер движка — исключить из него функциональность, которая вам не нужна. Это можно сделать с помощью [файла манифеста приложения](https://defold.com/manuals/app-manifest/), в котором можно отключить ненужные компоненты движка. Примеры:
+
+* Physics — если вы не используете физику Box2D или Bullet3D, рекомендуется исключить соответствующие модули
+* LiveUpdate — если не используется, его можно отключить
+* Image load — если вы не загружаете изображения вручную через `image.load()`
+* BasisU — если в игре немного текстур, попробуйте собрать игру без BasisU и без сжатия текстур, и сравните размер. В таких случаях может быть выгоднее отказаться от транскодера и сжатия, чтобы уменьшить размер бинарника и снизить использование памяти.
+
+## Оптимизация ресурсов
+Наибольший эффект даёт уменьшение размера звуков и текстур.
+
+### Оптимизация звуков
+Defold поддерживает форматы:
+* .wav
+* .ogg
+* .opus
+
+Файлы звуков должны использовать 16-битные сэмплы.
+Декодеры Defold масштабируют частоту дискретизации под устройство воспроизведения.
+
+Короткие звуки, например эффекты, обычно сильнее сжимаются. Музыкальные треки — меньше.
+Defold не сжимает аудио, разработчик должен оптимизировать звуки самостоятельно.
+
+Вы можете использовать аудиоредакторы или консольные инструменты (например, [ffmpeg](https://ffmpeg.org)) для снижения качества или конвертации. Также рассмотрите возможность перевода стерео в моно, чтобы уменьшить размер.
+
+### Оптимизация текстур
+Начните с проверки размеров изображений, добавляемых в атлас или используемых как tilesource. Изображения не должны быть больше, чем это действительно необходимо. Импорт больших картинок и масштабирование внутри игры — пустая трата памяти. Используйте редакторы изображений, чтобы уменьшить размеры до нужных. Для фонов допустимо использовать маленькие изображения с масштабированием вверх. Также проверьте итоговый размер атласов — он зависит от платформы и GPU:
+
+::: sidenote
+[Этот пост на форуме](https://forum.defold.com/t/texture-management-in-defold/8921/17?u=britzl) содержит советы по пакетному изменению размеров изображений.
+:::
+
+* HTML5: [Web3D Survey](https://web3dsurvey.com/webgl/parameters/MAX_TEXTURE_SIZE)
+* iOS:
+  * iPad: 2048x2048
+  * iPhone 4: 2048x2048
+  * iPad 2, 3, Mini, Air, Pro: 4096x4096
+  * iPhone 4s, 5, 6+, 6s: 4096x4096
+* Android: максимальный размер текстур сильно варьируется, но в целом все современные устройства поддерживают минимум 4096x4096
+
+Если атлас слишком велик, его можно разбить на несколько меньших, использовать мультистраничные атласы или масштабировать весь атлас с помощью профиля текстур. Система профилей в Defold позволяет не только масштабировать атласы, но и применять алгоритмы сжатия для уменьшения их размера на диске. Подробнее о профилях текстур читайте в [руководстве](/manuals/texture-profiles/). Если вы не уверены, с чего начать, используйте следующие настройки в качестве отправной точки:
+
+* mipmaps: false
+* premultiply_alpha: true
+* format: TEXTURE_FORMAT_RGBA
+* compression_level: NORMAL
+* compression_type: COMPRESSION_TYPE_BASIS_UASTC
+
+::: sidenote
+Дополнительные советы по оптимизации текстур можно найти в [этом форуме](https://forum.defold.com/t/texture-management-in-defold/8921).
+:::
+
+### Оптимизация шрифтов
+Размер шрифта будет меньше, если явно указать нужные символы в поле [Characters](/manuals/font/#properties) вместо использования опции All Chars.
+
+### Исключение контента для загрузки по требованию
+Другой способ уменьшения начального размера приложения — это исключение части контента из основного пакета и его загрузка по требованию. Для этого используйте систему Live Update.
+
+Вы можете исключить целые уровни, скины, персонажей и т.п. Организуйте загрузку так, чтобы в начальном наборе ресурсов были только те, что нужны для запуска и первого уровня. Используйте collection proxies или factories с включённой галочкой "Exclude". Делите ресурсы по прогрессу игрока. Подробнее читайте в [руководстве по Live Update](/manuals/live-update/).
+
+## Оптимизация размера на Android
+Сборки для Android должны поддерживать 32-битные и 64-битные архитектуры. При [создании сборки для Android](/manuals/android) можно указать, какие архитектуры включать:
+
+![Подпись Android сборки](images/android/sign_bundle.png)
+
+Google Play поддерживает [несколько APK](https://developer.android.com/google/play/publishing/multiple-apks) на выпуск, что позволяет разделить сборку по архитектурам и уменьшить итоговый размер каждого APK.
+
+Также вы можете использовать [дополнительные файлы APK Expansion](https://developer.android.com/google/play/expansion-files) в сочетании с [контентом Live Update](/manuals/live-update), используя [расширение APKX](https://defold.com/assets/apkx/).

+ 89 - 0
docs/ru/manuals/optimization-speed.md

@@ -0,0 +1,89 @@
+---
+title: Оптимизация производительности во время выполнения в игре на Defold
+brief: Это руководство описывает, как оптимизировать игру на Defold для стабильной работы с высокой частотой кадров.
+---
+
+# Оптимизация скорости выполнения
+Прежде чем приступать к оптимизации игры с целью достичь стабильной высокой частоты кадров, нужно понять, где находятся узкие места. Что именно занимает наибольшее время в кадре вашей игры? Рендеринг? Логика игры? Сценовый граф? Чтобы это выяснить, рекомендуется использовать встроенные инструменты профилирования. Используйте [экранный или веб-профайлер](/manuals/profiling/), чтобы проанализировать производительность игры и затем принять решение, что и стоит оптимизировать. После этого можно переходить к устранению проблем.
+
+## Снижение времени выполнения скриптов
+Снижение времени выполнения скриптов требуется, если профайлер показывает высокие значения в области `Script`. В общем случае следует стараться выполнять как можно меньше кода в каждом кадре. Выполнение большого объёма кода в `update()` и `on_input()` в каждом кадре может сильно повлиять на производительность, особенно на слабых устройствах. Вот некоторые рекомендации:
+
+### Используйте реактивные шаблоны
+Не опрашивайте состояние, если можно получить обратный вызов (callback). Не анимируйте вручную то, что можно поручить движку (например, используйте `go.animate()` вместо ручной анимации).
+
+### Сокращение сборки мусора
+Если вы создаёте много короткоживущих объектов (например, таблиц Lua) каждый кадр, это приведёт к частому срабатыванию сборщика мусора. Это может проявляться как небольшие задержки/скачки времени кадра. По возможности переиспользуйте таблицы и избегайте создания таблиц внутри циклов.
+
+### Предварительное хеширование идентификаторов сообщений и действий
+Если у вас много сообщений или событий ввода, рекомендуется заранее хешировать строки. Пример:
+
+```lua
+function on_message(self, message_id, message, sender)
+    if message_id == hash("message1") then
+        msg.post(sender, hash("message3"))
+    elseif message_id == hash("message2") then
+        msg.post(sender, hash("message4"))
+    end
+end
+```
+
+В этом случае строка будет хешироваться каждый раз при получении сообщения. Лучше сделать так:
+
+```lua
+local MESSAGE1 = hash("message1")
+local MESSAGE2 = hash("message2")
+local MESSAGE3 = hash("message3")
+local MESSAGE4 = hash("message4")
+
+function on_message(self, message_id, message, sender)
+    if message_id == MESSAGE1 then
+        msg.post(sender, MESSAGE3)
+    elseif message_id == MESSAGE2 then
+        msg.post(sender, MESSAGE4)
+    end
+end
+```
+
+### Предпочитайте и кэшируйте URL
+Передача сообщений или обращение к игровым объектам/компонентам может выполняться через строку, хеш или URL. Строки и хеши будут преобразованы во внутренний URL. Поэтому лучше заранее кэшировать часто используемые URL. Пример:
+
+```lua
+    local pos = go.get_position("enemy")
+    local pos = go.get_position(hash("enemy"))
+    local pos = go.get_position(msg.url("enemy"))
+    -- do something with pos
+```
+
+Во всех трёх случаях будет получена позиция игрового объекта с id `enemy`. Однако в первом и втором случае строка или хеш будут сначала преобразованы во внутренний URL. Это означает, что для достижения наилучшей производительности лучше заранее кэшировать URL и использовать его повторно:
+
+```lua
+    function init(self)
+        self.enemy_url = msg.url("enemy")
+    end
+
+    function update(self, dt)
+        local pos = go.get_position(self.enemy_url)
+        -- do something with pos
+    end
+```
+
+## Снижение времени рендеринга кадра
+Снижение времени, необходимого для рендеринга кадра, требуется, если профайлер показывает высокие значения в областях `Render` и `Render Script`. Ниже приведены несколько аспектов, которые следует учесть при попытке ускорить рендеринг:
+
+* Уменьшите количество draw call'ов — [об этом на форуме](https://forum.defold.com/t/draw-calls-and-defold/4674)
+* Снизьте избыточную отрисовку (overdraw)
+* Упростите шейдеры — изучите [оптимизации GLSL в статье Khronos](https://www.khronos.org/opengl/wiki/GLSL_Optimizations). Вы также можете изменить стандартные шейдеры, используемые в Defold (находятся в `builtins/materials`), и снизить точность с `highp` до, например, `mediump`, что в некоторых случаях может немного повысить производительность на слабых устройствах.
+
+## Снижение сложности сценового графа
+Это необходимо, если профайлер показывает высокие значения в области `GameObject`, особенно в `UpdateTransform`. Рекомендации:
+
+* Culling — отключает игровые объекты (и их компоненты), если они в данный момент не видимы. Метод определения зависит от типа игры. В 2D-игре достаточно отключать объекты, находящиеся за пределами прямоугольной области. Это можно реализовать с помощью физического триггера или разбив объекты на группы. Когда известно, какие объекты нужно отключить или включить, отправьте соответствующее сообщение `disable` или `enable` каждому объекту.
+
+## Отсечение по фрустуму (Frustum culling)
+Сценарий рендеринга может автоматически игнорировать объекты вне фрустума. Подробнее — в [руководстве по Render Pipeline](/manuals/render/#frustum-culling).
+
+# Оптимизация под конкретные платформы
+
+## Android Device Performance Framework
+Android Dynamic Performance Framework — это набор API, позволяющих играм взаимодействовать с системами питания и температуры устройств Android. Это помогает отслеживать поведение системы и настраивать производительность игры на устойчивом уровне без перегрева устройства. Используйте [расширение ADPF](https://defold.com/extension-adpf/), чтобы отслеживать и оптимизировать производительность на Android.

+ 5 - 154
docs/ru/manuals/optimization.md

@@ -4,158 +4,9 @@ brief: В этом руководстве описывается, как опт
 ---
 
 # Оптимизация игры на Defold
-Важно понимать технические ограничения платформы (платформ), на которой должна запускаться ваша игра, и оптимизировать ее для данной платформы (платформ) при разработке. Следует учитывать несколько аспектов:
+Важно понимать технические ограничения целевых платформ и разрабатывать, реализовывать и оптимизировать игру с учетом этих требований. Для большинства платформ следует учитывать несколько аспектов:
 
-* Размер приложения
-* Скорость
-* Использование памяти
-* Использование батареи 
-
-## Оптимизация размера приложения
-При сборке и бандлинге вашего приложения Defold создаст дерево зависимостей. Система сборки запустится из коллекции начальной загрузки (bootstrap collection), указанной в файле *game.project*, и проверит каждую коллекцию на которую ссылаются, игровой объект и компонент, чтобы выстроить список используемых ресурсов. Только эти ресурсы будут включены в окончательный бандл приложения. Все, на что нет прямых ссылок, будет исключено. Хотя полезно знать, что неиспользуемые ресурсы не будут включены, вам как разработчику все же необходимо учитывать, что входит в окончательное приложение, а также размер отдельных ассетов и общий размер бандла приложения. Некоторые целевые платформы и каналы распространения имеют ограничения на размер приложения: 
-
-* Apple и Google определили ограничения на размер приложений при загрузке через мобильные сети (в отличие от загрузки через Wi-Fi).
-   * Летом 2019 года эти ограничения составляли 100 МБ для Google Play и 150 МБ для Apple App Store.
-* Facebook имеет рекомендацию, что запуск Facebook Instant Game должен занимать менее 5 секунд, а желательно менее 3 секунд.
-   * Что это означает для фактического размера приложения, четко не определено, но мы говорим о размере в диапазоне до 20 МБ.
-* Размер проигрываемой рекламы обычно ограничен от 2 до 5 МБ в зависимости от рекламной сети. 
-
-::: sidenote
-Согласно исследованию 2017 года, было показано, что «на каждые 6 МБ увеличения размера APK-файла наблюдается снижение коэффициента конверсии установок на 1%». ([источник](https://medium.com/googleplaydev/shrinking-apks-growing-installs-5d3fcba23ce2)) 
-:::
-
-Чтобы лучше понять, что составляет размер вашего приложения, вы можете [создать отчет о сборке](/manuals/bundling/#build-reports) во время бандлинга. Довольно часто звуки и графика занимают большую часть размера любой игры.
-
-### Уменьшение размера движка
-Вы можете использовать [файл манифеста приложения](https://defold.com/manuals/project-settings/#app-manifest) для удаления тех компонентов движка, которые вам не нужны. Вы можете, например, удалить подключаемые физические движки, если ваша игра не использует физику.
-
-### Оптимизация звуков
-Defold поддерживает файлы .ogg и .wav, где .ogg обычно используется для музыки, а .wav - для звуковых эффектов. Звуки должны быть 16-битными с частотой дискретизации 44100, поэтому перед кодированием звуков необходимо выполнить все нужные оптимизации. Вы можете редактировать звуки во внешнем звуковом редакторе, чтобы снизить качество или преобразовать из .wav в .ogg. 
-
-### Оптимизация графики
-У вас есть несколько вариантов оптимизации графики, используемой в вашей игре, но первое, что нужно сделать, - это проверить размер графики, которая добавляется в атлас или используется в качестве источника тайлов. Никогда не используйте графику большего размера, чем это действительно необходимо в вашей игре. Импорт больших изображений и их масштабирование до подходящего размера - это пустая трата памяти текстур, и этого следует избегать. Начните с подгонки размера изображений с помощью внешнего программного обеспечения для редактирования изображений до фактического размера, необходимого для вашей игры. Для таких вещей, как фоновые изображения, также можно использовать небольшое изображение и масштабировать его до желаемого размера. После того, как вы уменьшили изображения до нужного размера и добавили их в атласы или использовали в источниках тайлов, вам также необходимо принять во внимание размер самих атласов. Максимальный размер атласа, который можно использовать, зависит от платформы и графического оборудования. 
-
-::: sidenote
-[В этих постах на форуме](https://forum.defold.com/t/texture-management-in-defold/8921/17?u=britzl) предлагается несколько советов о том, как изменить размер нескольких изображений с помощью скриптов или стороннего программного обеспечения.
-:::
-
-* Максимальный размер текстуры в HTML5: https://webglstats.com/webgl/parameter/MAX_TEXTURE_SIZE 
-* Максимальный размер текстуры в iOS:
-  * iPad: 2048x2048
-  * iPhone 4: 2048x2048
-  * iPad 2, 3, Mini, Air, Pro: 4096x4096
-  * iPhone 4s, 5, 6+, 6s: 4096x4096
-* Максимальный размер текстуры на Android сильно различается, но в целом все относительно новые устройства поддерживают 4096x4096. 
-
-Если атлас слишком большой, вам нужно либо разделить его на несколько меньших атласов, либо масштабировать весь атлас с помощью профиля текстуры. Система профилей текстур в Defold позволяет не только масштабировать атласы целиком, но и применять алгоритмы сжатия для уменьшения размера атласа на диске. Вы можете [подробнее узнать о профилях текстур в руководстве](/manuals/texture-profiles/). 
-
-::: sidenote
-Вы можете узнать больше о том, как оптимизировать текстуры и управлять ими в [этом посте на форуме](https://forum.defold.com/t/texture-management-in-defold/8921).
-:::
-
-### Исключение контента для загрузки по запросу
-Другой способ уменьшить исходный размер приложения - исключить части игрового контента из бандла приложения и сделать их загружаемыми по мере необходимости. Исключенный контент может быть чем угодно, от целых уровней до разблокируемых персонажей, скинов, оружия или транспортных средств. Defold предоставляет систему под названием Live Update для исключения содержимого для загрузки по запросу. Подробнее читайте в [Руководстве по Live Update](/manuals/live-update/).
-
-### Оптимизации размера специфичные для Android
-Сборки под Android должны поддерживать как 32-разрядные, так и 64-разрядные архитектуры CPU. Когда вы [готовите бандл под Android](/manuals/android), вы можете указать, какие архитектуры CPU включать: 
-
-![Подписывание Android бандла](images/android/sign_bundle.png)
-
-Google Play поддерживает [мульти-APK](https://developer.android.com/google/play/publishing/multiple-apks) для каждой версии игры, что означает, что вы можете уменьшить размер приложения, создав два APK, по одному на архитектуру CPU и загрузить оба в Google Play. 
-
-Вы также можете использовать комбинацию [файлов APK-расширения](https://developer.android.com/google/play/expansion-files) и [Live Update контент](/manuals/live-update)) благодаря [расширению APKX с портала экстеншенов](https://defold.com/assets/apkx/). 
-
-
-## Оптимизация скорости приложения
-Прежде чем пытаться оптимизировать игру с целью увеличения скорости ее выполнения, вам необходимо знать, где находятся ваши узкие места. Что на самом деле занимает большую часть времени в кадре вашей игры? Это рендеринг? Это ваша игровая логика? Это граф сцены? Чтобы в этом разобраться, рекомендуется использовать встроенные инструменты профилирования. Используйте [экранный или веб-профилировщик](/manuals/profiling/), чтобы оценить производительность вашей игры, а затем примите решение, нужно ли оптимизировать что-то и что именно. Как только вы лучше поймете, на что уходит процессорное время, вы сможете приступить к решению проблем. 
-
-### Уменьшение времени выполнения скрипта
-Уменьшение времени выполнения скрипта необходимо, если профилировщик показывает высокие значения для категории `Script`. Как правило, вы, конечно, должны стараться запускать как можно меньше кода в каждом кадре. Запуск большого количества кода в `update()` и `on_input()` в каждом кадре может повлиять на производительность вашей игры, особенно на маломощных устройствах. Вот некоторые рекомендации: 
-
-#### Используйте шаблоны реактивного программирования
-Не запрашивайте изменения, если вы можете получить функцию обратного вызова. Не анимируйте что-либо вручную и не выполняйте задачи, которые могут быть переданы движку (например, go.animate вместо анимации чего-либо вручную). 
-
-#### Сократите объем сборки мусора
-Если вы создаете множество короткоживущих объектов, таких как таблицы Lua, в каждом кадре, это в конечном итоге вызовет сборщик мусора Lua. Когда это происходит, это может проявляться в виде небольших пауз/скачков во времени кадра. Повторно используйте таблицы там, где вы можете и действительно старайтесь избегать создания таблиц Lua внутри циклов и подобных конструкций, если это возможно. 
-
-#### Заранее пред-хешируйте идентификаторы сообщений и действий
-Если вы обрабатываете много сообщений или имеете дело с большим количеством событий ввода, рекомендуется предварительно хешировать задействуемые строки. Рассмотрим этот фрагмент кода: 
-
-```
-function on_message(self, message_id, message, sender)
-    if message_id == hash("message1") then
-        msg.post(sender, hash("message3"))
-    elseif message_id == hash("message2") then
-        msg.post(sender, hash("message4"))
-    end
-end
-```
-
-В приведенном выше сценарии хешированная строка будет пересоздаваться каждый раз при получении сообщения. Это можно улучшить, создав хешированные строки один раз и используя хешированные версии при обработке сообщений: 
-
-```
-local MESSAGE1 = hash("message1")
-local MESSAGE2 = hash("message2")
-local MESSAGE3 = hash("message3")
-local MESSAGE4 = hash("message4")
-
-function on_message(self, message_id, message, sender)
-    if message_id == MESSAGE1 then
-        msg.post(sender, MESSAGE3)
-    elseif message_id == MESSAGE2 then
-        msg.post(sender, MESSAGE4)
-    end
-end
-```
-
-#### Предпочитайте URL-ы и кэшируйте их
-Передача сообщений или другие способы адресации игрового объекта или компонента могут быть выполнены как путем предоставления идентификатора в виде строки или хэша, так и в виде URL-адреса. Если используется строка или хеш, они будут внутренне переведены в URL. Поэтому рекомендуется кэшировать часто используемые URL-адреса, чтобы получить максимальную производительность системы. Обратите внимание на следующий пример: 
-
-```
-    local pos = go.get_position("enemy")
-    local pos = go.get_position(hash("enemy"))
-    local pos = go.get_position(msg.url("enemy"))
-    -- do something with pos
-```
-
-Во всех трех случаях будет извлечена позиция игрового объекта с идентификатором `enemy`. В первом и втором случае идентификатор (строка или хэш) будет преобразован в URL-адрес перед использованием. Это говорит нам о том, что для максимальной производительности лучше кэшировать URL-адреса и использовать кешированную версию: 
-
-```
-    function init(self)
-        self.enemy_url = msg.url("enemy")
-    end
-
-    function update(self, dt)
-        local pos = go.get_position(self.enemy_url)
-        -- do something with pos
-    end
-```
-
-### Сократите время, необходимое для рендеринга кадра
-Уменьшение времени, необходимого для рендеринга кадра, необходимо, если профилировщик показывает высокие значения в категориях `Render` и `Render Script`. При попытке сократить время, необходимое для рендеринга кадра, следует учитывать несколько моментов: 
-
-* Уменьшение количества вызовов отрисовки - Подробнее о сокращении вызовов отрисовки читайте в [этом посте на форуме](https://forum.defold.com/t/draw-calls-and-defold/4674)
-* Уменьшение перерисовки
-* Снижение сложности шейдеров - читайте об оптимизации GLSL в [этой статье от Kronos](https://www.khronos.org/opengl/wiki/GLSL_Optimizations). Вы также можете изменить шейдеры, используемые Defold по умолчанию (находятся в `builtins/materials`), и уменьшить точность шейдеров, чтобы получить некоторую скорость на маломощных устройствах. Все шейдеры используют точность `highp`, и изменение, например, до `mediump` может в некоторых случаях немного улучшить производительность. 
-
-### Снижение сложности графа сцены
-Уменьшение сложности графа сцены необходимо, если профилировщик показывает высокие значения в категории `GameObject` и, более конкретно, для семплов ` UpdateTransform`. Некоторые действия, которые необходимо предпринять в этом случае:
-
-* Culling - Отключите игровые объекты (и их компоненты), если они в данный момент не видны. Как это определяется, во многом зависит от типа игры. Для 2D-игры это может быть просто и, выражается как правило, в отключении игровых объектов, находящихся за пределами прямоугольной области. Вы можете использовать физический триггер, чтобы обнаружить это, или сгруппировав ваши объекты по корзинам. Как только вы определили, какие объекты нужно отключить или включить, вы делаете это, отправляя сообщение `disable` или `enable` каждому игровому объекту. 
-
-
-## Оптимизация использования памяти
-Этот раздел еще не закончен. Темы, которые будут затронуты: 
-
-* [Сжатие текстур](/manuals/texture-profiles/)
-* [Динамическая загрузка коллекций](https://www.defold.com/manuals/collection-proxy/)
-* [Динамическая загрузка фабрик](https://www.defold.com/manuals/collection-factory/#dynamic-loading-of-factory-resources)
-* [Профилирование](/manuals/profiling/)
-
-
-## Оптимизация использования батареи
-Этот раздел еще не закончен. Темы, которые будут затронуты: 
-
-* Запуск кода каждый кадр
-* Акселерометр на мобильном устройстве
-* [Профилирование](/manuals/profiling/)
+* [Размер игры](/manuals/optimization-size) — Каков максимально допустимый размер игрового пакета и как можно сделать игру как можно меньше без потери качества?
+* [Скорость выполнения](/manuals/optimization-speed) — Какова производительность целевой платформы и как обеспечить стабильную частоту кадров при минимальной загрузке CPU и/или GPU?
+* [Использование памяти](/manuals/optimization-memory) — Каковы ограничения по памяти на целевой платформе и как можно сократить использование памяти?
+* [Энергопотребление](/manuals/optimization-battery) — Этот аспект особенно важен при разработке под мобильные/портативные устройства.

+ 2 - 0
docs/ru/manuals/particlefx.md

@@ -226,6 +226,8 @@ particlefx.play("#particles")
 particlefx.stop("#particles")
 ```
 
+Чтобы запускать и останавливать эффект частиц из GUI-скрипта, см. [руководство по GUI Particle FX](/manuals/gui-particlefx#controlling-the-effect).
+
 ::: sidenote
 Эффект частиц будет продолжать испускать частицы, даже если игровой объект, к которому принадлежал этот компонент эффекта частиц, будет удален.
 :::

+ 1 - 0
docs/ru/manuals/physics-joints.md

@@ -12,6 +12,7 @@ Defold поддерживает сочленения для 2D-физики. С
 * **Weld (physics.JOINT_TYPE_WELD)** --- Сварное сочленение пытается ограничить любое относительное движение между двумя объектами столкновения. Сварное сочленение можно сделать мягким как пружина с частотой и коэффициентом амортизации. В Box2D оно также известно как Weld joint.
 * **Spring (physics.JOINT_TYPE_SPRING)** --- Рессорное сочленение удерживает два объекта столкновения на постоянном расстоянии друг от друга. Рессорное сочленение можно сделать мягким как пружина с частотой и коэффициентом амортизации. В Box2D оно также известно как Distance joint.
 * **Slider (physics.JOINT_TYPE_SLIDER)** --- Сочленение-слайдер позволяет относительный сдвиг двух объектов вдоль заданной оси, но блокирует относительное вращение. В Box2D оно также известно как Prismatic joint.
+* **Wheel (physics.JOINT_TYPE_WHEEL)** --- Колёсное сочленение ограничивает точку на `bodyB` перемещением вдоль линии на `bodyA`. Также оно обеспечивает эффект пружинной подвески. В Box2D известно как [Wheel joint](https://box2d.org/documentation/group__wheel__joint.html#details).
 
 ## Создание сочленений
 

+ 47 - 7
docs/ru/manuals/physics-messages.md

@@ -5,7 +5,38 @@ brief: Когда два объекта сталкиваются, движок 
 
 # Сообщения о столкновениях
 
-Когда два объекта сталкиваются, движок передает сообщения всем компонентам обоих объектов:
+Когда два объекта сталкиваются, движок передает сообщения всем компонентам обоих объектов.
+
+
+## Фильтрация событий
+
+Типы генерируемых событий могут управляться с помощью флагов для каждого объекта:
+
+* "Generate Collision Events"
+* "Generate Contact Events"
+* "Generate Trigger Events"
+
+По умолчанию все они установлены в `true`. Когда два коллизийных объекта взаимодействуют, движок проверяет, следует ли отправлять сообщение пользователю, основываясь на этих флагах.
+
+Например, с флажками "Generate Contact Events":
+
+Если используется `physics.set_listener()`:
+
+| Компонент A | Компонент B | Отправить сообщение |
+|-------------|-------------|----------------------|
+| ✅︎          | ✅︎          | Да                   |
+| ❌          | ✅︎          | Да                   |
+| ✅︎          | ❌          | Да                   |
+| ❌          | ❌          | Нет                  |
+
+Если используется обработчик сообщений по умолчанию:
+
+| Компонент A | Компонент B | Отправляемые сообщения    |
+|-------------|-------------|----------------------------|
+| ✅︎          | ✅︎          | Да (A,B) и (B,A)           |
+| ❌          | ✅︎          | Да (B,A)                   |
+| ✅︎          | ❌          | Да (A,B)                   |
+| ❌          | ❌          | Нет                        |
 
 ## Реакция на столкновение
 
@@ -20,6 +51,9 @@ brief: Когда два объекта сталкиваются, движок 
 `other_group`
 : группа столкновения другого объекта столкновения (`hash`)
 
+`own_group`
+: группа столкновений собственного объекта столкновения (`hash`)
+
 Само по себе сообщение `collision_response` имеет смысл только для принятия решений по столкновениям, в которых вы не хотите знать деталей о реальном пересечении объектов, например, если вы хотите определить, поразила ли пуля врага. В каждом кадре только по одному сообщению такого вида посылается для каждой пары столкнувшихся объектов.
 
 ```Lua
@@ -66,8 +100,11 @@ end
 `other_position`
 : позиция другого объекта столкновения в пространстве мира (`vector3`). 
 
-`group`
-: группа столкновений другого объекта столкновений (`hash`).
+`other_group`
+: группа столкновений другого объекта столкновения (`hash`)
+
+`own_group`
+: группа столкновений собственного объекта столкновения (`hash`)
 
 Для игры или приложения, где необходимо идеально отделить объекты, сообщение `"contact_point_response"` дает всю необходимую для этого информацию. Однако, стоит заметить, что для любой пары столкновения, каждый кадр могут присылаться несколько сообщений `"contact_point_response"`, в зависимости от природы столкновения. За подробностями обращайтесь к [ руководству по разрешению столкновений](/manuals/physics-resolving-collisions).
 
@@ -85,10 +122,7 @@ end
 
 ## Реакция триггера
 
-Сообщение `"trigger_response"` посылается, когда столкнувшийся объект имеет тип "trigger".
-
-
-В столкновении с триггером посылаются сообщения `"collision_response"`. Дополнительно, триггеры также посылают специальные сообщения `"trigger_response"`, когда коллизия начинается и заканчивается. Сообщение содержит следующие поля:
+Сообщение `"trigger_response"` посылается, когда один из столкнувшихся объектов имеет тип "trigger". Оно отправляется один раз при начале столкновения и ещё раз при завершении. В сообщении содержатся следующие поля:
 
 `other_id`
 : идентификатор экземпляра, с которым столкнулся объекта столкновения (`hash`).
@@ -96,6 +130,12 @@ end
 `enter`
 : `true` --- если взаимодействие было вхождением в триггер, `false` --- если это был выход из него (`boolean`).
 
+`other_group`
+: группа столкновений другого объекта столкновения (`hash`)
+
+`own_group`
+: группа столкновений собственного объекта столкновения (`hash`)
+
 ```Lua
 function on_message(self, message_id, message, sender)
     -- проверка сообщения

+ 12 - 0
docs/ru/manuals/physics-objects.md

@@ -83,12 +83,24 @@ Angular damping
 Locked rotation
 : Выставление этого свойства полностью выключает вращение на объекте столкновения, не важно, какие силы применяются к нему.
 
+Bullet
+: Установка этого свойства включает непрерывное обнаружение столкновений (CCD) между этим объектом столкновения и другими динамическими объектами столкновений. Свойство Bullet игнорируется, если тип объекта не установлен как `Dynamic`.
+
 Group
 : Имя группы столкновения, к которому должен принадлежать объект. Можно иметь 16 разных групп и можно именовать их под свои нужды в игре. К примеру,  "players", "bullets", "enemies" и "world". Если для *формы столкновения* задана тайловая карта, это поле не используется, а имена групп берутся из источника тайлов. [Подробнее о группах столкновения](/manuals/physics-groups).
 
 Mask
 : Другие _группы_, с которыми должен сталкиваться данный объект. Можно назвать одну группу или задать множество групп, разделяя их в списке запятой. Если оставить поле Mask пустым, объект не будет ни с чем иметь столкновений. [Подробнее о группах столкновения](/manuals/physics-groups).
 
+Generate Collision Events
+: Если включено, объект будет отправлять события столкновения.
+
+Generate Contact Events
+: Если включено, объект будет отправлять события контакта.
+
+Generate Trigger Events
+: Если включено, объект будет отправлять события триггера.
+
 
 ## Свойства, доступные в среде исполнения
 

+ 79 - 8
docs/ru/manuals/physics-shapes.md

@@ -51,19 +51,86 @@ brief: Объект столкновения может использовать
 :::
 
 ## Выпуклые формы
-В Defold встроена функция, позволяющая вам создавать выпуклые формы из трех или более точек. Можно воспользоваться внешним инструментом, таким как [Defold Polygon Editor](/assets/defoldpolygoneditor/) или [Physics Body Editor](/assets/physicsbodyeditor/) для создания выпуклых форм.
-
-1. Создайте файл выпуклой формы (расширение файла `.convexshape`) используя внешний редактор.
-2. Вместо добавления форм к объекту столкновений, в качестве значения свойства *Collision Shape* укажите файл *выпуклой формы*.
-
-::: sidenote
-Форма не будет отрисована в редакторе. Можно [включить отладку физики](/manuals/debugging/#debugging-problems-with-physics) во время выполнения игры, чтобы видеть формы.
-:::
+Defold предоставляет возможность создавать выпуклую форму (convex hull shape) из трёх или более точек.
+
+1. Создайте файл выпуклой формы (расширение файла — `.convexshape`) с помощью внешнего редактора.
+2. Отредактируйте файл вручную, используя текстовый редактор или внешний инструмент (см. ниже).
+3. Вместо добавления форм в компонент столкновений, укажите файл *выпуклой формы* в свойстве *Collision Shape*.
+
+### Формат файла
+Формат выпуклой формы использует тот же формат данных, что и все другие файлы Defold — protobuf в текстовом виде. Выпуклая форма задаётся набором точек. В 2D физике точки должны быть указаны в порядке против часовой стрелки. В 3D режиме используется абстрактное облако точек. Пример для 2D:
+
+```
+shape_type: TYPE_HULL
+data: 200.000
+data: 100.000
+data: 0.0
+data: 400.000
+data: 100.000
+data: 0.0
+data: 400.000
+data: 300.000
+data: 0.0
+data: 200.000
+data: 300.000
+data: 0.0
+```
+
+Пример выше описывает четыре угла прямоугольника:
+
+```
+ 200x300   400x300
+    4---------3
+    |         |
+    |         |
+    |         |
+    |         |
+    1---------2
+ 200x100   400x100
+```
+
+## Внешние инструменты
+
+Существует несколько внешних инструментов, которые можно использовать для создания форм столкновения:
+
+* [Physics Editor](https://www.codeandweb.com/physicseditor/tutorials/how-to-create-physics-shapes-for-defold) от CodeAndWeb позволяет создавать игровые объекты со спрайтами и соответствующими формами столкновения.
+* [Defold Polygon Editor](https://rossgrams.itch.io/defold-polygon-editor) позволяет создавать выпуклые формы.
+* [Physics Body Editor](https://selimanac.github.io/physics-body-editor/) также может использоваться для создания выпуклых форм.
 
 
 # Масштабирование форм столкновения
 Объект столкновения и его формы наследуют масштаб игрового объекта. Чтобы отключить это поведение, отключите опция [Allow Dynamic Transforms](/manuals/project-settings/#allow-dynamic-transforms) в секции Physics файла *game.project*. Учтите, что поддерживается только равномерное масштабирование, а также то, что будет применено наименьшее значение масштабирования, если было задано не равномерное масштабирование.
 
+# Изменение размеров форм столкновения
+Формы объекта столкновения можно изменять во время выполнения с помощью функции `physics.set_shape()`. Пример:
+
+```lua
+-- установка параметров капсулы
+local capsule_data = {
+  type = physics.SHAPE_TYPE_CAPSULE,
+  diameter = 10,
+  height = 20,
+}
+physics.set_shape("#collisionobject", "my_capsule_shape", capsule_data)
+
+-- установка параметров сферы
+local sphere_data = {
+  type = physics.SHAPE_TYPE_SPHERE,
+  diameter = 10,
+}
+physics.set_shape("#collisionobject", "my_sphere_shape", sphere_data)
+
+-- установка параметров коробки
+local box_data = {
+  type = physics.SHAPE_TYPE_BOX,
+  dimensions = vmath.vector3(10, 10, 5),
+}
+physics.set_shape("#collisionobject", "my_box_shape", box_data)
+```
+
+::: sidenote
+Форма нужного типа с указанным идентификатором должна уже существовать на объекте столкновения.
+:::
 
 # Вращение форм столкновения
 
@@ -73,3 +140,7 @@ brief: Объект столкновения может использовать
 
 ## Вращение форм столкновения в 2D физике
 Формы столкновения в 2D физике могут поворачиваться только вокруг оси z. Вращение вокруг осей X или Y выльется в некорректные результаты и его стоит избегать, даже когда происходит вращение на 180 градусов для фактически переворота формы вокруг оси X или Y. Для переворота физической формы рекомендуется использовать [`physics.set_hlip(url, flip)`](/ref/stable/physics/?#physics.set_hflip:url-flip) и [`physics.set_vlip(url, flip)`](/ref/stable/physics/?#physics.set_vflip:url-flip).
+
+
+# Отладка
+Вы можете [включить отладку физики](/manuals/debugging/#debugging-problems-with-physics), чтобы видеть формы столкновений во время выполнения.

+ 5 - 0
docs/ru/manuals/physics.md

@@ -26,6 +26,11 @@ Defold включает модифицированную версию физич
 В целом, требуется, чтобы физическая симуляция была отмасштабирована для того, чтобы гладко работать с типовым размером объектов в игре. Масштаб физической симуляции может быть изменен в файле *game.project* в [настройках масштаба физики](/manuals/project-settings/#physics). Выставление этого значения в, например 0.02, будет означать, что 200 пикселей будут трактоваться как 4 метра. Учтите также, что гравитация (также меняется в *game.project*) должна быть увеличена для согласования с измененным масштабом.
 
 
+## Обновления физики
+
+Рекомендуется обновлять физический движок с фиксированным интервалом времени для обеспечения стабильной симуляции (в отличие от обновлений с переменной частотой кадров). Вы можете использовать фиксированное обновление физики, установив флажок [Use Fixed Timestep setting](/manuals/project-settings/#physics) в разделе Physics файла *game.project*. Частота обновления задаётся параметром [Fixed Update Frequency setting](/manuals/project-settings/#engine) в разделе Engine того же файла. При использовании фиксированного шага времени для физики также рекомендуется использовать функцию жизненного цикла `fixed_update(self, dt)` для взаимодействия с объектами столкновений вашей игры, например, при применении к ним сил.
+
+
 ## Предостережения и типовые проблемы
 
 Прокси-коллекции

+ 39 - 38
docs/ru/manuals/profiling.md

@@ -5,7 +5,7 @@ brief: Это руководство объясняет возможности 
 
 # Профилирование
 
-Defold включает набор инструментов профилирования, интегрированных с движком и конвейером сборки. Они предназначены для поиска проблем с производительностью и использованием памяти. Встроенные профилировщики доступны только в отладочных сборках. 
+Defold включает набор инструментов профилирования, интегрированных с движком и конвейером сборки. Они предназначены для поиска проблем с производительностью и использованием памяти. Встроенные профилировщики доступны только в отладочных сборках. Профилировщик кадров, используемый в Defold — это [Remotery profiler от Celtoys](https://github.com/Celtoys/Remotery).
 
 ## Визуальный профилировщик среды выполнения
 
@@ -32,61 +32,64 @@ profiler.view_recorded_frame()
 Обратитесь к [справочнику по API профилировщика](/ref/stable/profiler/) для получения дополнительной информации о функциях профилировщика. 
 
 ## Веб-профилировщик
+Во время запуска отладочной сборки игры можно получить доступ к интерактивному веб-профайлеру через браузер.
 
-При запуске отладочной сборки игры интерактивный веб-профилировщик может быть доступен через браузер. Это позволяет вам замерить вашу игру на серии кадров, а затем детально анализировать каждый кадр. 
+### Профилировщик кадров
+Профилировщик кадров позволяет выполнять выборку данных вашей игры во время выполнения и анализировать отдельные кадры в деталях. Чтобы получить доступ к профайлеру:
 
-Чтобы получить доступ к профилировщику:
+1. Запустите игру на целевом устройстве.
+2. Выберите пункт меню <kbd> Debug ▸ Open Web Profiler</kbd>.
 
-1. Запустите игру на целевом устройстве. 
-2. Выберите меню <kbd> Debug ▸ Open Web Profiler</kbd>. В качестве альтернативы, например, когда вы используете несколько платформ одновременно, вы можете открыть веб-браузер и указать в нем `http://<device IP>:8002`, где `<device IP>` - это IP-адрес устройства. Вы можете найти IP-адреса ваших целевых устройств в меню <kbd>Project ▸ Target</kbd>. Если вы запускаете игру на настольном компьютере, http://localhost:8002 ведет на профилировщик. 
+Профилировщик кадров разделён на несколько секций, каждая из которых предоставляет различные представления выполняемой игры. Нажмите кнопку Pause в правом верхнем углу, чтобы временно остановить обновление данных профайлера.
 
-![Режим веб-профилировщика](images/profiling/webprofiler_mode.png)
-Вверху, рядом с кнопкой *Capture*, есть переключатели для переключения между *CPU/Frame profiler* и *Resource Profiler*. 
+![Web profiler](images/profiling/webprofiler_page.png)
 
-### CPU/Frame profiler
-CPU profiler разделен на 4 раздела, каждый из которых дает разные представления о текущих данных выборки. Чтобы обновить образцы данных, нажмите кнопку *Capture* вверху.
+::: sidenote
+Когда вы используете несколько целевых устройств одновременно, вы можете вручную переключаться между ними, изменив поле Connection Address в верхней части страницы, чтобы оно соответствовало URL-адресу Remotery профайлера, который отображается в консоли при запуске устройства:
 
-![Веб-профилировщик](images/profiling/webprofiler_page.png)
-
-Обзор фреймов
-: Обзор фреймов отображает 20 выбранных в настоящий момент кадров один за другим. Высота каждой полосы показывает время, проведенное в кадре. Число с левой стороны показывает максимальное время, проведенное в кадре в текущих данных выборки. 
+```
+INFO:ENGINE: Defold Engine 1.3.4 (80b1b73)
+INFO:DLIB: Initialized Remotery (ws://127.0.0.1:17815/rmt)
+INFO:ENGINE: Loading data from: build/default
+```
+:::
 
-  ![Обзор фреймов](images/profiling/webprofiler_frames_overview.png)
+Временная шкала выборки (Sample Timeline)
+: Временная шкала показывает кадры, захваченные в движке, одна горизонтальная шкала на каждый поток. Main — основной поток, где выполняется вся логика игры и большая часть кода движка. Remotery — поток самого профайлера, а Sound — поток микширования и воспроизведения звука. Вы можете масштабировать шкалу (колесиком мыши) и выбирать отдельные кадры, чтобы изучить их детали во представлении Frame Data.
 
-  Под обзором фреймов находится подробное представление данных фрейма.
-  
-  Щелкните полосу фрейма в обзоре, чтобы отобразить данные для этого конкретного фрейма в окне просмотра данных. 
+  ![Sample Timeline](images/profiling/webprofiler_sample_timeline.png)
 
-Данные кадра
-: Представление данных кадра является таблицей, в которой все данные для текущего выбранного кадра разбиты на детали. Вы можете посмотреть, сколько миллисекунд потрачено в каждой области действия движка (слева), а также увидеть точки выборки в пределах областей (средний столбец). Справа - таблица счетчиков. Они упрощают, например, отслеживание количества вызовов отрисовки, необходимых для каждого кадра в выборке данных.
 
-  ![Данные кадра](images/profiling/webprofiler_frame_data.png)
+Данные кадра (Frame Data)
+: Представление Frame Data отображает таблицу с детальной разбивкой всех данных для выбранного кадра. Вы можете видеть, сколько миллисекунд затрачено на каждый участок движка.
 
-  Установка флажка, связанного с точкой выборки или счетчиком, добавляет эти данные на график ниже.
+  ![Frame data](images/profiling/webprofiler_frame_data.png)
 
-График кадров
-: Представление графика кадров отображает график по всем выбранным кадрам с данными, которые вы выбрали в таблице данных кадра над графиком. График показывает номер кадра по оси X и время (в миллисекундах) или количество по оси Y. Каждая выбранная точка данных отображается в цвете, указанном в таблице данных фрейма.
 
-  ![График кадров](images/profiling/webprofiler_frames_plot.png)
+Глобальные свойства (Global Properties)
+: Представление Global Properties показывает таблицу счётчиков. Это облегчает, например, отслеживание количества вызовов отрисовки или количества компонентов определённого типа.
 
-Временная диаграмма кадра
-: Временная диаграмма кадра визуально разбивает кадр, что упрощает анализ того, где движок проводит свое время в течение выбранного кадра. 
+  ![Global Properties](images/profiling/webprofiler_global_properties.png)
 
-  ![Временная диаграмма кадра](images/profiling/webprofiler_frame_timechart.png)
 
 ### Профилировщик ресурсов
-Профилировщик ресурсов поделен на 2 раздела, один из которых показывает иерархическое представление коллекций, игровых объектов и компонентов, инстанцированных в текущий момент в вашей игре, а другой показывает все загруженные в данный момент ресурсы. 
+Профилировщик ресурсов позволяет инспектировать вашу игру во время её выполнения и детально анализировать использование ресурсов. Чтобы получить доступ к профайлеру:
 
-![Профилировщик ресурсов](images/profiling/webprofiler_resources_page.png)
+1. Запустите игру на целевом устройстве.
+2. Откройте браузер и перейдите по адресу http://localhost:8002
 
-Collection view
-: В Collection view отображается иерархический список всех игровых объектов и компонентов, созданных в данный момент в игре, и из какой коллекции они происходят. Это очень полезный инструмент, когда вам нужно вникнуть и понять, что вы использовали в своей игре в любой момент времени и откуда берутся объекты.
+Профилировщик ресурсов разделён на 2 секции: одна показывает иерархическое представление коллекций, игровых объектов и компонентов, созданных в данный момент в игре, а другая — все загруженные в память ресурсы.
 
-Resources view
-: В Resources view отображаются все ресурсы, загруженные в память в настоящий момент, их размер и количество ссылок на каждый ресурс. Это полезно при оптимизации использования памяти в вашем приложении, когда вам нужно понять, что загружается в память в любой момент времени.
+![Resource profiler](images/profiling/webprofiler_resources_page.png)
 
-## Отчеты о сборке
+Представление коллекций (Collection view)
+: Показывает иерархический список всех игровых объектов и компонентов, созданных в данный момент в игре, и из какой коллекции они происходят. Это полезный инструмент, когда вам нужно понять, что и откуда создано в вашей игре.
+
+Представление ресурсов (Resources view)
+: Показывает все ресурсы, загруженные в память, их размер и количество ссылок на каждый ресурс. Это полезно при оптимизации использования памяти в вашем приложении.
 
+
+## Отчеты о сборке
 При бандлинге вашей игры есть возможность создать отчет о сборке. Это очень полезно, чтобы получить представление о размере всех ассетов, входящих в бандл вашей игры. Просто установите флажок *Generate build report* при бандлинге игры. 
 
 ![build report](images/profiling/build_report.png)
@@ -101,14 +104,12 @@ Resources view
 
 Раздел *Structure* показывает размеры в зависимости от того, как ресурсы организованы в файловой структуре проекта. Записи имеют цветовую кодировку от зеленого (легкий) до синего (тяжелый) в зависимости от относительного размера файла и содержимого каталога. 
 
-## Внешние инструменты
 
+## Внешние инструменты
 В дополнение к встроенным инструментам доступен широкий спектр бесплатных высококачественных инструментов трассировки и профилирования. Ниже приведена их подборка:
 
 ProFi (Lua)
-: Мы не поставляем никаких встроенных профилировщиков Lua, но есть внешние библиотеки, которые достаточно просты в использовании. Чтобы узнать, на что ваши скрипты тратят время, либо вставьте замеры времени в свой код самостоятельно, либо используйте библиотеку профилирования Lua, такую как ProFi. 
-
-  https://github.com/jgrahamc/ProFi
+: Мы не поставляем никаких встроенных профилировщиков Lua, но есть внешние библиотеки, которые достаточно просты в использовании. Чтобы узнать, на что ваши скрипты тратят время, либо вставьте замеры времени в свой код самостоятельно, либо используйте библиотеку профилирования Lua, такую как [ProFi](https://github.com/jgrahamc/ProFi).
 
   Обратите внимание, что профилировщики на чистом Lua добавляют довольно много накладных расходов с каждым устанавливаемым хуком. По этой причине вам следует немного опасаться временных профилей, которые вы получаете такими инструментами. Однако профили подсчета (Counting profiles) достаточно точны. 
 

+ 396 - 218
docs/ru/manuals/project-settings.md

@@ -11,7 +11,46 @@ brief: Данное руководство описывает настройки
 
 ![Project settings](images/project-settings/settings.jpg)
 
-Ниже приведены все доступные настройки, упорядоченные по секциям. Некоторые параметры на данный момент не отображаются в редакторе настроек (они помечены ниже как "скрытые настройки"), но их можно настроить вручную, кликнув правой кнопкой мыши на *game.project* и выбрав <kbd>Open With ▸ Text Editor</kbd>.
+
+## Формат файла
+
+Формат файла настроек представляет собой простой текст (формат INI) и может быть отредактирован любым стандартным текстовым редактором. Формат выглядит следующим образом:
+
+```ini
+[category1]
+setting1 = value
+setting2 = value
+[category2]
+...
+```
+
+Наглядный пример:
+
+```ini
+[bootstrap]
+main_collection = /main/main.collectionc
+```
+
+что означает, что настройка *main_collection* относится к категории *bootstrap*. Во всех случаях, когда используется ссылка на файл, как в примере выше, путь должен быть дополнен символом 'c'. Это означает, что вы ссылаетесь на скомпилированную версию файла. Также следует учитывать, что папка, содержащая файл *game.project*, будет корнем проекта, поэтому в пути установки присутствует начальный символ '/'.
+
+
+## Доступ к значениям во время выполнения
+
+Возможно получить доступ к значениям из *game.project* во время выполнения с помощью [`sys.get_config_string(key)`](/ref/sys/#sys.get_config_string), [`sys.get_config_number(key)`](/ref/sys/#sys.get_config_number) и [`sys.get_config_int(key)`](/ref/sys/#sys.get_config_int). Примеры:
+
+```lua
+local title = sys.get_config_string("project.title")
+local gravity_y = sys.get_config_number("physics.gravity_y")
+```
+
+::: sidenote
+Ключ — это комбинация названия категории и имени настройки, разделённые точкой, записанные строчными буквами с заменой всех пробелов на подчёркивания. Примеры: поле "Title" из категории "Project" превращается в `project.title`, а поле "Gravity Y" из категории "Physics" — в `physics.gravity_y`.
+:::
+
+
+## Разделы и настройки
+
+Ниже перечислены все доступные настройки, сгруппированные по категориям.
 
 ## Project
 
@@ -22,11 +61,21 @@ brief: Данное руководство описывает настройки
 Версия приложения.
 
 #### Write Log
-Если опция отмечена, движок будет записывать файл журнала *log.txt* в корень проекта. При запуске на iOS доступ к файлу журнала можно получить через iTunes, вкладка *Apps* раздел *File Sharing*. На Android файл хранится во внешнем хранилище приложения. При запуске приложения разработки *dmengine* журнал можно просмотреть с помощью:
-
-```bash
-$ adb shell cat /mnt/sdcard/Android/data/com.defold.dmengine/files/log.txt
-```
+Если опция отмечена, движок будет записывать файл журнала. Если запущено несколько экземпляров из редактора, файл будет называться *instance_2_log.txt*, где `2` — индекс экземпляра. Если запущен один экземпляр или используется сборка, файл будет называться *log.txt*. Файл журнала будет сохранён в одном из следующих путей (в порядке приоритета):
+
+1. Путь, указанный в *project.log_dir* (скрытая настройка)
+2. Системный путь к журналам:
+   * macOS/iOS: `NSDocumentDirectory`
+   * Android: `Context.getExternalFilesDir()`
+   * Прочие платформы: корень приложения
+3. Путь к поддержке приложения:
+   * macOS/iOS: `NSApplicationSupportDirectory`
+   * Windows: `CSIDL_APPDATA` (например, `C:\Users\<username>\AppData\Roaming`)
+   * Android: `Context.getFilesDir()`
+   * Linux: переменная окружения `HOME`
+
+#### Minimum Log Level
+Минимальный уровень логирования. Будут отображаться только логи с этим уровнем или выше.
 
 #### Compress Archive
 Включает сжатие архивов при упаковке в бандл. Стоит отметить, что в настоящее время это относится ко всем платформам, кроме Android, где apk содержит все данные в уже сжатом виде.
@@ -35,454 +84,575 @@ $ adb shell cat /mnt/sdcard/Android/data/com.defold.dmengine/files/log.txt
 Список URL на *Library URL* проекта. За подробностями обращайтесь к [руководству по библиотекам](/manuals/libraries/).
 
 #### Custom Resources
-Список ресурсов, разделенных запятыми, которые будут включены в проект. Если указаны каталоги, рекурсивно включаются все файлы и каталоги в этом каталоге. Ресурсы могут быть загружены с помощью [`sys.load_resource()`](/ref/sys/#sys.load_resource).
+`custom_resources`
+:[Custom Resources](../shared/custom-resources.md)
 
-#### Bundle Resources
-Список директорий, разделенных запятыми и содержащих файлы ресурсов и директории, которые должны быть скопированы как есть в результирующий бандл. Директории должны быть указаны с абсолютным путем от корня проекта, например `/res`. Директория ресурсов должна содержать вложенные папки с именами `platform` или `architecure-platform`.
+Дополнительную информацию о пользовательских ресурсах см. в разделе [Файловый доступ](/manuals/file-access/#how-to-access-files-bundled-with-the-application).
 
-  Поддерживаемые платформы: `ios`, `android`, `osx`, `win32`, `linux`, `web`.
+#### Bundle Resources
+`bundle_resources`
+:[Bundle Resources](../shared/bundle-resources.md)
 
-  Также допускается наличие подпапки с именем `common`, содержащей файлы ресурсов, общие для всех платформ.
+Дополнительную информацию о включаемых в бандл ресурсах см. в разделе [Файловый доступ](/manuals/file-access/#how-to-access-files-bundled-with-the-application).
 
 #### Bundle Exclude Resources
-Список ресурсов, разделенных запятыми, которые не должны быть включены в бандл.
+`bundle_exclude_resources`
+Список ресурсов, разделённых запятыми, которые не должны включаться в бандл. Эти ресурсы будут исключены из результата сбора шага `bundle_resources`.
+
+---
 
-## Bootstrap
+#### Bootstrap
 
 #### Main Collection
-Ссылка на файл коллекции, используемой для запуска приложения, по умолчанию `/logic/main.collection`.
+Ссылка на файл коллекции, используемой для запуска приложения. По умолчанию: `/logic/main.collection`.
 
 #### Render
-Файл, используемый для настройки и определения пайплайна рендеринга, по умолчанию `/builtins/render/default.render`.
+Файл настройки рендера, определяющий пайплайн рендеринга. По умолчанию: `/builtins/render/default.render`.
 
-## Library
+---
+
+### Library
 
 #### Include Dirs
-Список директорий, разделенных пробелами, которые должны быть доступны из проекта через общий доступ к библиотеке.
+Список директорий, разделённых пробелами, которые должны быть доступны из проекта через общий доступ к библиотеке. Подробнее см. в [руководстве по библиотекам](/manuals/libraries/).
 
-## Script
+---
+
+### Script
 
 #### Shared State
-Если опция отмечена, скрипты всех типов будут выполнятся в едином Lua-контексте. По умолчанию опция отключена.
+Если опция отмечена, все типы скриптов будут использовать единое состояние Lua.
+
+---
 
-## Engine
+### Engine
 
 #### Run While Iconified
-Позволяет движку продолжать выполнение, пока окно приложения свернуто (только для настольных платформ), по умолчанию опция отключена (`false`).
+Позволяет движку продолжать выполнение, пока окно приложения свернуто (только для настольных платформ).
+
+#### Fixed Update Frequency
+Частота обновления функции `fixed_update(self, dt)` в герцах.
+
+#### Max Time Step
+Максимальный шаг времени (в секундах), если за один кадр прошло слишком много времени. Превышение этого значения будет ограничено.
 
-## Display
+---
+
+### Display
 
 #### Width
-Ширина окна приложения в пикселях, по умолчанию `960`.
+Ширина окна приложения в пикселях.
 
 #### Height
-Высота окна приложения в пикселях, по умолчанию `640`.
+Высота окна приложения в пикселях.
 
 #### High Dpi
-Создает вторичный буфер высокого разрешения (high dpi back buffer) для мониторов с его поддержкой. При этом, игра будет рендериться в двойном разрешении по сравнению с тем, что установлено в настройках *Width* и *Height* и которое по прежнему будет логическим разрешением, используемым в скриптах и свойствах.
+Создаёт back buffer высокого разрешения на дисплеях с поддержкой High DPI. Как правило, игра будет рендериться в двойном разрешении относительно значений *Width* и *Height*, которые по-прежнему будут логическим разрешением в скриптах и свойствах.
 
 #### Samples
-Количество сэмплов, используемых при избыточной выборке сглаживания (SSAA). Задает для окна инструкцию GLFW_FSAA_SAMPLES. По умолчанию `0`, что означает, что сглаживание отключено.
+Количество сэмплов для суперсэмплинга (SSAA). Задаёт GLFW_FSAA_SAMPLES. Значение `0` отключает сглаживание.
 
 #### Fullscreen
-Если опция отмечена, приложение будет запускаться в полноэкранном режиме, иначе --- в оконном.
+Если опция отмечена, приложение запускается в полноэкранном режиме. Если нет — в оконном.
 
-#### Frame Cap
-If `Vsync` checked, snaps to the closest matching swap interval for the set frame cap if a monitor is detected. Otherwise uses timers to respect the set value, 0 means no cap. This setting maps to `display.update_frequency`.
+#### Update Frequency
+Желаемая частота кадров в герцах. Значение `0` — переменная частота. При значении больше `0` частота фиксируется и ограничивается в рантайме реальной частотой обновления. Это означает, что игровой цикл не сможет выполняться дважды за кадр движка. Используйте [`sys.set_update_frequency(hz)`](https://defold.com/ref/stable/sys/?q=set_update_frequency#sys.set_update_frequency:frequency) для изменения этого значения во время выполнения. Работает и в headless-сборках.
 
-#### Vsync
-Vertical sync, rely on hardware vsync for frame timing. Can be overridden depending on graphics driver and platform specifics.
+#### Swap interval
+Целое значение, управляющее VSync. `0` — отключает, по умолчанию `1`. При использовании OpenGL это значение определяет количество кадров между обновлениями буфера ([swap interval](https://www.khronos.org/opengl/wiki/Swap_Interval)). Для Vulkan VSync контролируется напрямую этим значением, так как понятия swap interval нет.
 
 #### Display Profiles
-Используемый файл профилей отображения, по умолчанию `/builtins/render/default.display_profilesc`. За подробностями обращайтесь к [руководству по GUI-компоновкам](/manuals/gui-layouts/#creating-display-profiles).
+Файл профилей дисплея. По умолчанию: `/builtins/render/default.display_profilesc`. Подробнее см. в [руководстве по GUI Layouts](/manuals/gui-layouts/#creating-display-profiles).
 
 #### Dynamic Orientation
-Если опция отмечена, приложение будет динамически переключаться между книжной и альбомной ориентациями при повороте устройства. Следует отметить, что в настоящее время в приложении для разработчиков данная настройка не предусмотрена.
+Если опция включена, приложение автоматически переключает ориентацию между альбомной и портретной при повороте устройства. Приложение разработки не поддерживает эту настройку.
 
-## Render
+---
+
+### Render
 
 #### Clear Color Red
-Clear color red channel, используется рендер скриптом и при создании окна. Добавлено в 1.2.167.
+Компонент красного цвета для очистки экрана. Используется в render-скрипте и при создании окна.
 
 #### Clear Color Green
-Clear color green channel, используется рендер скриптом и при создании окна. Добавлено в 1.2.167.
+Компонент зелёного цвета для очистки экрана. Используется в render-скрипте и при создании окна.
 
 #### Clear Color Blue
-Clear color blue channel, используется рендер скриптом и при создании окна. Добавлено в 1.2.167.
+Компонент синего цвета для очистки экрана. Используется в render-скрипте и при создании окна.
 
 #### Clear Color Alpha
-Clear color alpha channel, используется рендер скриптом и при создании окна. Добавлено в 1.2.167.
+Компонент альфа-канала для очистки экрана. Используется в render-скрипте и при создании окна.
+
+---
 
-## Physics
+### Physics
 
 #### Type
-Используемый тип физики, `2D` (по умолчанию) или `3D`.
+Тип физики: `2D` или `3D`.
+
+#### Gravity X
+Гравитация по оси X (м/с²).
 
 #### Gravity Y
-Мировая гравитация по оси Y. По умолчанию`-10`, что соответствует естественному значению.
+Гравитация по оси Y (м/с²).
+
+#### Gravity Z
+Гравитация по оси Z (м/с²).
 
 #### Debug
-Если опция отмечена, физика будет визуализироваться в целях отладки.
+Если опция отмечена, физика будет визуализироваться для отладки.
 
 #### Debug Alpha
-Значение компонента альфа для визуализируемой физики, `0`--`1`. По умолчанию `0.9`.
+Значение альфа-компонента для визуализированной физики (`0`–`1`).
 
 #### World Count
-Максимальное количество одновременных физических пространств, по умолчанию `4`. Если загружать более 4 пространств одновременно через прокси коллекции, необходимо увеличить это значение. Следует помнить, что для каждого физического пространства выделяется значительный объем памяти.
-
-#### Gravity X
-Мировая гравитация по оси X. По умолчанию `0`.
-
-#### Gravity Z
-Мировая гравитация по оси Z. По умолчанию `0`.
+Максимальное количество одновременных физических миров. По умолчанию `4`. Если загружается больше через прокси, значение необходимо увеличить. Каждый мир использует значительный объём памяти.
 
 #### Scale
-Указывает физическому движку, как масштабировать физические пространства по отношению к игровому миру для числовой точности, `0.01`--`1.0`. Если значение установлено в `0.02`, это означает, что физический движок будет воспринимать 50 единиц как 1 метр ($1 / 0.02$). По умолчанию используется значение `1.0`.
+Коэффициент масштабирования физики относительно игрового мира для повышения точности (`0.01`–`1.0`). Например, при `0.02` — 50 единиц равны 1 метру (`1 / 0.02`).
 
 #### Allow Dynamic Transforms
-Если опция отмечена, физический движок будет масштабировать объекты столкновения, используя масштаб игровых объектов, к которым они относятся. По умолчанию `true`.
+Если включено, движок будет применять трансформации игрового объекта (позиция, масштаб, поворот) к привязанным компонентам столкновений.
+
+#### Use Fixed Timestep
+Если включено, физика будет обновляться фиксированным шагом времени, независимым от частоты кадров. Используется вместе с функцией `fixed_update(self, dt)` и настройкой `engine.fixed_update_frequency`. Рекомендуется для новых проектов.
 
 #### Debug Scale
-Указывает, насколько большими рисовать отдельные объекты в физике, такие как триады и нормали. По умолчанию `30`.
+Размер отрисовки единичных объектов физики, таких как триады и нормали.
 
 #### Max Collisions
-Количество коллизий, о которых будет сообщено скриптам, по умолчанию `64`.
+Максимум коллизий, передаваемых в скрипты.
 
 #### Max Contacts
-Количество точек контакта, о которых будет сообщено скриптам, по умолчанию `128`.
+Максимум точек контакта, передаваемых в скрипты.
 
 #### Contact Impulse Limit
-Игнорировать импульсы контактов со значениями меньше этого, по умолчанию `0.0`.
+Игнорировать импульсы столкновений с величиной меньше указанной.
 
 #### Ray Cast Limit 2d
-Максимальное количество запросов 2d-рейкастинга в кадре. По умолчанию `64`.
+Максимальное количество запросов 2D-рейкастинга в кадре.
 
 #### Ray Cast Limit 3d
-Максимальное количество запросов 3d-рейкастинга в кадре. По умолчанию `128`.
+Максимальное количество запросов 3D-рейкастинга в кадре.
 
 #### Trigger Overlap Capacity
-Максимальное количество накладывающихся (overlapping) физических триггеров. По умолчанию `16`.
+Максимальное количество пересекающихся физических триггеров.
 
-## Graphics
+---
+
+### Graphics
 
 #### Default Texture Min Filter
-Указывает, какую фильтрацию использовать при уменьшающей фильтрации, `linear` по умолчанию`.
+Определяет фильтрацию, используемую при уменьшении текстуры (minification filtering).
 
 #### Default Texture Mag Filter
-Указывает, какую фильтрацию использовать при увеличивающей фильтрации, `linear` по умолчанию.
+Определяет фильтрацию, используемую при увеличении текстуры (magnification filtering).
 
 #### Max Draw Calls
-Максимальное количество вызовов рендеринга, по умолчанию `1024`.
+Максимальное количество вызовов рендеринга.
 
-#### Max Characters:
-Количество символов, предварительно распределенных в буфере рендеринга текста, то есть количество символов, которое может быть отображено в каждом кадре, по умолчанию `8192`.
+#### Max Characters
+Количество символов, заранее выделенных в буфере рендеринга текста — то есть сколько символов может быть отображено за кадр.
 
 #### Max Debug Vertices
-Максимальное количество отладочных вершин. Используется, в частности, для физического рендеринга форм, по умолчанию `10000`.
+Максимальное количество отладочных вершин. Используется, в том числе, для отрисовки физических форм.
 
 #### Texture Profiles
-Файл профилей текстур, используемый для данного проекта, по умолчанию `/builtins/graphics/default.texture_profiles`.
+Файл профилей текстур, используемый для проекта. По умолчанию: `/builtins/graphics/default.texture_profiles`.
+
+#### Verify Graphics Calls
+Проверяет возвращаемые значения всех графических вызовов и записывает ошибки в журнал.
 
-## Input
+#### OpenGL Version Hint
+Подсказка по версии контекста OpenGL. Если выбрана конкретная версия, она используется как минимально допустимая. Не применяется к OpenGL ES.
+
+#### OpenGL Core Profile Hint
+Устанавливает профиль OpenGL 'core' при создании контекста. Core-профиль исключает устаревшие функции OpenGL, такие как немедленный режим отрисовки (immediate mode). Не применяется к OpenGL ES.
+
+---
+
+### Input
 
 #### Repeat Delay
-Секунды ожидания перед тем, как удерживаемый ввод начнет повторяться, по умолчанию `0.5`.
+Количество секунд ожидания перед началом повторного ввода при удержании клавиши.
 
 #### Repeat Interval
-Секунды ожидания между каждым повторением удерживаемого ввода, по умолчанию `0.2`.
+Количество секунд между повторениями удерживаемого ввода.
 
 #### Gamepads
-Ссылка на файл конфигурации геймпадов, который сопоставляет сигналы геймпадов с ОС. По умолчанию `/builtins/input/default.gamepads`.
+Ссылка на файл конфигурации геймпадов, сопоставляющий сигналы геймпада с ОС. По умолчанию: `/builtins/input/default.gamepads`.
 
 #### Game Binding
-Ссылка на файл конфигурации ввода, который сопоставляет аппаратный ввод с действиями. По умолчанию `/input/game.input_binding`.
+Ссылка на файл конфигурации ввода, сопоставляющий аппаратные события с действиями. По умолчанию: `/input/game.input_binding`.
 
 #### Use Accelerometer
-Если опция отмечена, движок будет получать ввод событий акселерометра каждый кадр. Отключение ввода акселерометра может дать некоторый выигрыш в производительности. По умолчанию опция включена.
+Если включено, движок будет получать события акселерометра каждый кадр. Отключение может незначительно повысить производительность.
+
+---
 
-## Resource
+### Resource
 
 #### Http Cache
-Если опция отмечена, будет включен кэш HTTP, что позволит запущенному на устройстве движку быстрее загружать ресурсы по сети. По умолчанию опция отключена.
+Если включено, активируется HTTP-кэш, что позволяет ускорить загрузку ресурсов по сети на устройстве во время выполнения.
 
 #### Uri
-Место поиска данных о сборке проекта, в формате URI.
+Местоположение сборки проекта в формате URI.
 
 #### Max Resources
-Максимальное количество ресурсов, которые могут быть загружены одновременно, по умолчанию `1024`.
+Максимальное количество ресурсов, которые могут быть загружены одновременно.
 
-## Network
+---
+
+### Network
 
 #### Http Timeout
-Время ожидания (timeout) HTTP в секундах. По умолчанию `0`, что соответствует отключению таймаута.
+Таймаут HTTP в секундах. Значение `0` отключает таймаут.
+
+#### Http Thread Count
+Количество рабочих потоков, используемых HTTP-сервисом.
 
-## Collection
+#### Http Cache Enabled
+Если включено, активируется HTTP-кэш для сетевых запросов (используется с `http.request()`). Кэш сохраняет ответ, связанный с запросом, и повторно использует его при следующих вызовах. Поддерживаются заголовки `ETag` и `Cache-Control: max-age`.
+
+#### SSL Certificates
+Файл, содержащий корневые SSL-сертификаты, используемые для проверки цепочки сертификатов во время SSL-рукопожатия.
+
+---
+
+### Collection
 
 #### Max Instances
-Максимальное количество экземпляров игровых объектов в коллекции, по умолчанию `1024`.
+Максимальное количество экземпляров игровых объектов в коллекции. По умолчанию — `1024`. [(См. информацию по оптимизации количества компонентов)](#component-max-count-optimizations).
+
+#### Max Input Stack Entries
+Максимальное количество игровых объектов во входном стеке.
+
+---
 
-## Sound
+### Sound
 
 #### Gain
-Глобальное усиление (громкость), `0`--`1`, По умолчанию `1`.
+Глобальное усиление (громкость), от `0` до `1`.
 
 #### Max Sound Data
-Максимальное количество звуковых ресурсов, то есть количество уникальных звуковых файлов во время выполнения. По умолчанию `128`.
+Максимальное количество звуковых ресурсов, то есть уникальных звуковых файлов во время выполнения.
 
 #### Max Sound Buffers
-(В настоящее время не используется) Максимальное количество одновременно существующих буферов звука. По умолчанию `32`.
+(В настоящее время не используется) Максимальное количество одновременно используемых звуковых буферов.
 
 #### Max Sound Sources
-(В настоящее время не используется) Максимальное количество одновременно воспроизводимых звуков. По умолчанию `16`.
+(В настоящее время не используется) Максимальное количество одновременно воспроизводимых звуков.
 
 #### Max Sound Instances
-Максимальное количество одновременно существующих экземпляров звука, то есть фактических звуков, воспроизводимых в одно и то же время. По умолчанию `256`.
+Максимальное количество одновременно воспроизводимых экземпляров звуков.
 
 #### Use Thread
-Если опция отмечена, звуковая система будет использовать потоки для воспроизведения звука, чтобы снизить риск запинания при высокой нагрузке на основной поток. По умолчанию включено.
+Если включено, система звука будет использовать потоки для воспроизведения, что снижает риск запинаний при высокой нагрузке на основной поток.
+
+#### Stream Enabled
+Если включено, система будет использовать потоковую загрузку исходных звуковых файлов.
+
+#### Stream Cache Size
+Максимальный размер кэша звуковых чанков. По умолчанию — `2097152` байт.
+Это значение должно быть больше произведения количества загруженных звуков и размера чанка.
+Иначе новые чанки могут вытесняться каждый кадр.
+
+#### Stream Chunk Size
+Размер в байтах каждого потокового чанка.
+
+#### Stream Preload Size
+Размер в байтах предварительного чанка при чтении звуков из архива.
+
+---
 
-## Sprite
+### Sprite
 
 #### Max Count
-Максимальное количество спрайтов на коллекцию. По умолчанию `128`.
+Максимальное количество спрайтов на коллекцию. [(См. информацию по оптимизации количества компонентов)](#component-max-count-optimizations).
 
 #### Subpixels
-Если опция отмечены, спрайтам разрешается отображаться невыровненными по отношению к пикселям, по умолчанию опция отмечена.
+Если опция включена, спрайты могут отображаться с дробным позиционированием, не выровненным по пиксельной сетке.
+
+---
 
-## Tilemap
+### Tilemap
 
 #### Max Count
-Максимальное количество тайловых карт на коллекцию. По умолчанию `16`.
+Максимальное количество тайлмапов на коллекцию. [(См. информацию по оптимизации количества компонентов)](#component-max-count-optimizations).
 
 #### Max Tile Count
-Максимальное количество одновременно видимых тайлов на коллекцию. По умолчанию `2048`.
+Максимальное количество одновременно отображаемых тайлов в коллекции.
 
-## Spine
+---
+
+### Spine
 
 #### Max Count
-Максимальное количество Spine-моделей. По умолчанию `128`.
+Максимальное количество компонентов Spine-моделей. [(См. информацию по оптимизации количества компонентов)](#component-max-count-optimizations).
 
-## Mesh
+---
+
+### Mesh
 
 #### Max Count
-Максимальное количество компонентов Mesh на коллекцию. По умолчанию `128`.
+Максимальное количество компонентов Mesh на коллекцию. [(См. информацию по оптимизации количества компонентов)](#component-max-count-optimizations).
+
+---
 
-## Model
+### Model
 
 #### Max Count
-Максимальное количество компонентов Model на коллекцию. По умолчанию `128`.
+Максимальное количество компонентов Model на коллекцию. [(См. информацию по оптимизации количества компонентов)](#component-max-count-optimizations).
+
+---
 
-## GUI
+### GUI
 
 #### Max Count
-Максимальное количество компонентов GUI. По умолчанию `64`.
+Максимальное количество компонентов GUI. [(См. информацию по оптимизации количества компонентов)](#component-max-count-optimizations).
 
 #### Max Particlefx Count
-Максимальное количество одновременно существующих. По умолчанию `64`.
+Максимальное количество одновременно активных эмиттеров.
 
 #### Max Particle Count
-Максимальное количество одновременно существующих частиц. По умолчанию `1024`.
+Максимальное количество одновременно отображаемых частиц.
 
-## Label
+#### Max Animation Count
+Максимальное количество одновременно активных анимаций в GUI.
+
+---
+
+### Label
 
 #### Max Count
-Максимальное компонентов Label. По умолчанию `64`.
+Максимальное количество компонентов Label. [(См. информацию по оптимизации количества компонентов)](#component-max-count-optimizations).
 
 #### Subpixels
-Если опция отмечена, Label будут отображаться невыровненными по отношению к пикселям. По умолчанию включено.
+Если опция включена, Label могут отображаться с дробным позиционированием, не выровненным по пикселям.
+
+---
 
-## Particle FX
+### Particle FX
 
 #### Max Count
-Максимальное количество одновременно существующих эмиттеров. По умолчанию `64`.
+Максимальное количество одновременно активных эмиттеров. [(См. информацию по оптимизации количества компонентов)](#component-max-count-optimizations).
 
 #### Max Particle Count
-Максимальное количество одновременно существующих частиц. По умолчанию `1024`.
+Максимальное количество одновременно отображаемых частиц.
 
-## Collection proxy
+---
+
+### Collection proxy
 
 #### Max Count
-Максимальное количество прокси-коллекций. По умолчанию `8`.
+Максимальное количество прокси-коллекций. [(См. информацию по оптимизации количества компонентов)](#component-max-count-optimizations).
 
-## Collection factory
+---
+
+### Collection factory
 
 #### Max Count
-Максимальное количество фабрик коллекций. По умолчанию `128`.
+Максимальное количество фабрик коллекций. [(См. информацию по оптимизации количества компонентов)](#component-max-count-optimizations).
+
+---
 
-## Factory
+### Factory
 
 #### Max Count
-Максимальное количество фабрик игровых объектов. По умолчанию `128`.
+Максимальное количество фабрик игровых объектов. [(См. информацию по оптимизации количества компонентов)](#component-max-count-optimizations).
+
+---
 
-## iOS
+### iOS
 
 #### App Icon 57x57--180x180
-Файл изображения (.png), используемый в качестве иконки приложения при заданных значениях ширины и высоты --- `W` &times; `H`.
+Файл изображения (.png), используемый в качестве иконки приложения при заданных размерах `W` &times; `H`.
 
 #### Launch Screen
-Файл раскадровки (.storyboard). О том, как его создать читайте в [руководстве по iOS](/manuals/ios/#creating-a-storyboard).
+Файл раскадровки (.storyboard). Подробнее о создании см. в [руководстве по iOS](/manuals/ios/#creating-a-storyboard).
 
-#### Pre Rendered Icons
-(iOS 6 and earlier) Check if your icons are pre-rendered. If this is unchecked the icons will get a glossy highlight added automatically.
+#### Prerendered Icons
+(iOS 6 и ниже) Если опция не включена, иконки получат глянцевое покрытие автоматически. Если включена — иконки считаются уже готовыми к использованию.
 
 #### Bundle Identifier
-Идентификатор бандла, позволяющий iOS распознавать любые обновления к вашему приложению. ID бандла должен быть зарегистрирован в Apple и быть уникальным для приложения. Невозможно использовать один и тот же идентификатор для iOS и macOS приложений.
+Идентификатор бандла позволяет iOS распознавать обновления вашего приложения. Идентификатор должен быть зарегистрирован в Apple и уникален для приложения. Нельзя использовать один и тот же идентификатор как для iOS, так и для macOS. Он должен состоять минимум из двух сегментов, разделённых точками. Каждый сегмент должен начинаться с буквы и может содержать только буквенно-цифровые символы, подчёркивания или дефисы (`-`) (см. [`CFBundleIdentifier`](https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html#//apple_ref/doc/uid/20001431-130430)).
+
+#### Bundle Name
+Короткое имя бандла (до 15 символов) (см. [`CFBundleName`](https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html#//apple_ref/doc/uid/20001431-130430)).
+
+#### Bundle Version
+Версия бандла — число или строка в формате `x.y.z` (см. [`CFBundleVersion`](https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html#//apple_ref/doc/uid/20001431-130430)).
 
 #### Info.plist
-Если задано, этот файл info.plist используется при сборке бандла приложения.
+Если задано, используется указанный файл *`info.plist`* при сборке приложения.
+
+#### Privacy Manifest
+Манифест конфиденциальности Apple для приложения. По умолчанию: `/builtins/manifests/ios/PrivacyInfo.xcprivacy`.
 
 #### Custom Entitlements
-If specified, the entitlements in the supplied provisioning profile (`.entitlements`, `.xcent`, `.plist`) will be merged with the entitlements from the provisioning profile supplied when bundling the application.
+Если задано, права (entitlements) из предоставленного provisioning profile (`.entitlements`, `.xcent`, `.plist`) будут объединены с правами из профиля, указанного при сборке.
 
 #### Override Entitlements
-If checked the Custom Entitlements will replace the ones in the provisioning profile when bundling. Must be used in combination with the Custom Entitlements setting above.
+Если включено, пользовательские entitlements заменят права из provisioning profile. Используется только вместе с настройкой Custom Entitlements.
 
 #### Default Language
-Язык, используемый приложением, если в списке `Localizations` отсутствует предпочитаемый пользователем язык (см. [CFBundleDevelopmentRegion](https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html#//apple_ref/doc/uid/20001431-130430)). Используйте двухбуквенный стандарт ISO 639-1, если предпочитаемый язык в нем доступен, или трехбуквенный ISO 639-2.
+Язык, используемый приложением, если в списке `Localizations` отсутствует предпочтительный язык пользователя (см. [`CFBundleDevelopmentRegion`](https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html#//apple_ref/doc/uid/20001431-130430)). Используйте двухбуквенный ISO 639-1, если доступен, или трёхбуквенный ISO 639-2.
 
 #### Localizations
-Данное поле содержит разделенные запятыми строки, идентифицирующие названия языков или ISO-обозначения языков поддерживаемых локализаций (см. [CFBundleLocalizations](https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html#//apple_ref/doc/uid/20001431-109552)).
+Поле со списком поддерживаемых локалей в виде строк, разделённых запятыми. Каждая строка — это название языка или ISO-код языка (см. [`CFBundleLocalizations`](https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html#//apple_ref/doc/uid/20001431-109552)).
 
-## Android
+---
+
+### Android
 
 #### App Icon 36x36--192x192
-Файл изображения (.png), используемый в качестве иконки приложения при заданных значениях ширины и высоты --- `W` &times; `H`.
+Файл изображения (.png), используемый как иконка приложения при заданных размерах `W` &times; `H`.
 
 #### Push Icon Small--LargeXxxhdpi
-Файлы изображений (.png) для использования в качестве пользовательских иконок push-уведомлений на Android. Иконки будут автоматически использоваться как для локальных, так и для удаленных push-уведомлений. Если они не заданы, по умолчанию будет использоваться иконка приложения.
+Файлы изображений (.png), используемые в качестве кастомных иконок push-уведомлений на Android. Иконки будут использоваться как для локальных, так и для удалённых уведомлений. Если не задано, по умолчанию будет использоваться иконка приложения.
 
 #### Push Field Title
-Specifies which payload JSON field should be used as notification title. Leaving this setting empty makes the pushes default to the application name as title.
+Поле в JSON-пейлоуде, используемое в качестве заголовка push-уведомления. Если оставить пустым, заголовком будет имя приложения.
 
 #### Push Field Text
-Specifies which payload JSON field should be used as notification text. If left empty, the text in the field `alert` is used, just as on iOS.
+Поле в JSON-пейлоуде, используемое в качестве текста push-уведомления. Если оставить пустым, будет использовано поле `alert`, аналогично поведению на iOS.
 
 #### Version Code
-Целочисленное значение, указывающее на версию приложения. Увеличивайте для каждого последующего обновления.
+Целочисленное значение, указывающее версию приложения. Увеличивайте при каждом обновлении.
 
 #### Package
-Идентификатор пакета.
+Идентификатор пакета. Должен состоять минимум из двух сегментов, разделённых точками. Каждый сегмент должен начинаться с буквы и содержать только буквенно-цифровые символы или подчёркивания.
 
-#### Gcm Sender Id
-Идентификатор отправителя Google Cloud Messaging. Задайте здесь строку, назначенную Google для включения push-уведомлений.
+#### GCM Sender Id
+Sender Id для Google Cloud Messaging. Установите строку, выданную Google, чтобы включить push-уведомления.
 
 #### Manifest
-Если задано, при упаковке бандла будет использоваться указанный XML-файл манифеста Android.
+Если указано, используется заданный Android-манифест (XML-файл) при сборке.
 
 #### Iap Provider
-Используемый магазин. Возможные варианты: `Amazon` и `GooglePlay`. По умолчанию используется `GooglePlay`.
+Указывает, какой магазин использовать. Допустимые значения: `Amazon` и `GooglePlay`. См. [extension-iap](/extension-iap/) для получения дополнительной информации.
 
 #### Input Method
-Метод получения ввода с клавиатуры на Android устройствах. Возможные варианты: `KeyEvent` (старый метод) и `HiddenInputField` (новый). По умолчанию `KeyEvent`.
+Определяет метод получения текстового ввода на Android-устройствах. Допустимые значения: `KeyEvent` (старый метод) и `HiddenInputField` (новый).
 
 #### Immersive Mode
-Если опция отмечена, панель навигации и строка состояния скроются и приложение будет перехватывать все события касаний экрана.
+Если включено, скрывает навигационные и статус-бары и позволяет приложению обрабатывать все касания по экрану.
 
 #### Debuggable
-Включает или отключает возможность отлаживать приложение с помощью таких инструментов, как [GAPID](https://github.com/google/gapid) или [Android Studio](https://developer.android.com/studio/profile/android-profiler). Опция устанавливает флаг `android:debuggable` в манифесте Android.
+Определяет, может ли приложение быть отлажено с помощью таких инструментов, как [GAPID](https://github.com/google/gapid) или [Android Studio](https://developer.android.com/studio/profile/android-profiler). Устанавливает флаг `android:debuggable` в Android-манифесте ([официальная документация](https://developer.android.com/guide/topics/manifest/application-element#debug)).
+
+#### Extract Native Libraries
+Указывает, должен ли установщик извлекать нативные библиотеки из APK в файловую систему. Если установлено в `false`, библиотеки остаются внутри APK в несжатом виде. Это увеличивает размер APK, но ускоряет загрузку, так как библиотеки загружаются напрямую. Устанавливает флаг `android:extractNativeLibs` в Android-манифесте ([официальная документация](https://developer.android.com/guide/topics/manifest/application-element#extractNativeLibs)).
+
+---
 
-## macOS
+### macOS
 
 #### App Icon
-Файл изображения (.png), используемый в качестве иконки приложения на macOS.
+Файл изображения (.png), используемый как иконка приложения на macOS.
 
 #### Info.plist
-Если задано, указанный файл info.plist будет использоваться при сборке бандла.
+Если указано, используется заданный файл info.plist при сборке приложения.
+
+#### Privacy Manifest
+Манифест конфиденциальности Apple для приложения. По умолчанию используется `/builtins/manifests/osx/PrivacyInfo.xcprivacy`.
 
 #### Bundle Identifier
-Идентификатор бандла позволяет macOS распознавать обновления для вашего приложения. ID бандла должен быть зарегистрирован в Apple и быть уникальным для приложения. Невозможно использовать один и тот же идентификатор для приложений iOS и macOS.
+Идентификатор бандла позволяет macOS распознавать обновления вашего приложения. Идентификатор должен быть зарегистрирован в Apple и уникален для приложения. Нельзя использовать один и тот же идентификатор как для iOS, так и для macOS. Он должен состоять минимум из двух сегментов, разделённых точками. Каждый сегмент должен начинаться с буквы и содержать только буквенно-цифровые символы, подчёркивания или дефисы.
 
 #### Default Language
-Язык, используемый приложением, если в списке `Localizations` отсутствует предпочитаемый пользователем язык (см. [CFBundleDevelopmentRegion](https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html#//apple_ref/doc/uid/20001431-130430)). Используйте двухбуквенный стандарт ISO 639-1, если предпочитаемый язык в нем доступен, или трехбуквенный ISO 639-2.
+Язык, используемый приложением, если в списке `Localizations` отсутствует предпочтительный язык пользователя (см. [`CFBundleDevelopmentRegion`](https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html#//apple_ref/doc/uid/20001431-130430)). Используйте двухбуквенный ISO 639-1, если доступен, или трёхбуквенный ISO 639-2.
 
 #### Localizations
-Данное поле содержит разделенные запятыми строки, идентифицирующие названия языков или ISO-обозначения языков поддерживаемых локализаций (см. [CFBundleLocalizations](https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html#//apple_ref/doc/uid/20001431-109552)).
+Список поддерживаемых локалей, указанный через запятую. Каждое значение — это название языка или его ISO-дизигнатор (см. [`CFBundleLocalizations`](https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html#//apple_ref/doc/uid/20001431-109552)).
+
+---
 
-## Windows
+### Windows
 
 #### App Icon
-Файл изображения (.ico), используемый в качестве иконки приложения в Windows. О том, как создать файл .ico, читайте в [руководстве по Windows](/manuals/windows).
+Файл изображения (.ico), используемый как иконка приложения на Windows. Подробнее о создании .ico файла см. в [руководстве по Windows](/manuals/windows).
 
-#### Iap Provider
-Используемый магазин. Возможные варианты: `None` и `Gameroom`. По умолчанию `None`.
+---
 
-## HTML5
+### HTML5
+
+См. [руководство по платформе HTML5](/manuals/html5/) для получения дополнительной информации о большинстве из этих опций.
 
 #### Heap Size
-Размер кучи (количество мегабайт) для использования компилятором Emscripten. По умолчанию 256 МБ.
+Размер кучи в мегабайтах, выделяемый Emscripten.
 
 #### .html Shell
-HTML файл-шаблон, используемый при сборке бандла. По умолчанию `/builtins/manifests/web/engine_template.html`.
+HTML-шаблон, используемый при сборке. По умолчанию `/builtins/manifests/web/engine_template.html`.
 
 #### Custom .css
-CSS файл темы, используемый при сборке бандла. По умолчанию `/builtins/manifests/web/light_theme.css`.
+Файл CSS-темы, используемый при сборке. По умолчанию `/builtins/manifests/web/light_theme.css`.
 
 #### Splash Image
-Если опция отмечена, то при запуске при комплектации вместо логотипа Defold будет использоваться указанный сплешскрин.
+Если указано, заданное изображение отображается при запуске вместо логотипа Defold.
 
 #### Archive Location Prefix
-При сборке бандла для HTML5 игровые данные разбиваются на один или несколько архивных файлов. Когда движок запускает игру, эти архивные файлы считываются в память. Данный параметр используется для указания расположения этих данных. По умолчанию `archive`.
+При сборке HTML5-версии данные игры разбиваются на архивные файлы. При запуске движок считывает их в память. Здесь задаётся префикс пути к этим файлам.
 
 #### Archive Location Suffix
-Суффикс, который будет добавляться к архивным файлам. Полезно, например, для принудительного получения некэшированного содержимого из CDN (`?version2`, например).
+Суффикс, добавляемый к именам архивов. Полезен, например, для принудительной загрузки свежего содержимого с CDN (`?version2` и т.п.).
 
 #### Engine Arguments
-Список аргументов, передаваемых движку.
+Список аргументов, передаваемых движку при запуске.
 
 #### Show Fullscreen Button
-Включает кнопку Fullscreen в файле `index.html`. По умолчанию `true`.
+Включает кнопку полноэкранного режима в `index.html`.
 
 #### Show Made With Defold
-Включает ссылку Made With Defold в файле `index.html` file. По умолчанию `true`.
+Добавляет ссылку «Made With Defold» в `index.html`.
+
+#### Show Console Banner
+Если включено, в консоли браузера будет выведена информация о движке и его версии при запуске (с помощью `console.log()`).
 
 #### Scale Mode
-Метод масштабирования игрового холста. По умолчанию `Downscale Fit`.
+Определяет способ масштабирования canvas-элемента.
 
-## IAP
+#### Retry Count
+Количество попыток повторной загрузки файла при запуске движка (см. `Retry Time`).
 
-#### Auto Finish Transactions
-Если опция отмечена, IAP транзакции будут завершаться автоматически. В противном случае необходимо явно вызывать `iap.finish()` после успешной транзакции. По умолчанию опция включена.
+#### Retry Time
+Интервал в секундах между попытками загрузки файла при сбое (см. `Retry Count`).
 
-## Live update
+#### Transparent Graphics Context
+Если включено, графический контекст будет иметь прозрачный фон.
 
-#### Private Key
-If set, use the specified private key file when bundling live update content. If no key file is set, a key is generated.
+---
 
-#### Public Key
-If set, use the specified public key file when bundling live update content. If no key file is set, a key is generated.
+### IAP
 
-## Native extension
+#### Auto Finish Transactions
+Если включено, транзакции IAP завершаются автоматически. Если отключено, необходимо вручную вызывать `iap.finish()` после успешной транзакции.
 
-#### _App Manifest_
-If set, use the app manifest to customize the engine build. This allows you to remove unneeded parts from the engine making it possible to decrease the final binary size. Note that this feature is in alpha state. Please visit [the forum](https://forum.defold.com/t/native-extensions/4946/142) for information on how to proceed.
+---
 
-## Profiler
+### Live update
 
-#### Track Cpu
-Если опция отмечена, профилирование CPU в релизных версиях сборок будет включено. Как правило, информация о профилировании доступна только в отладочных сборках.
+#### Private Key
+Если указано, используется заданный файл закрытого ключа при сборке live update-контента. Если ключ не задан, он будет сгенерирован автоматически.
 
-## Формат файла
+#### Public Key
+Если указано, используется заданный файл открытого ключа при сборке live update-контента. Если ключ не задан, он будет сгенерирован автоматически.
 
-Формат файла настроек представляет собой простой текст (формат INI) и может быть отредактирован любым стандартным текстовым редактором. Формат выглядит следующим образом:
+---
 
-```ini
-[category1]
-setting1 = value
-setting2 = value
-[category2]
-...
-```
+### Native extension
 
-Наглядный пример:
+#### _App Manifest_
+Если задан, используется манифест приложения для настройки сборки движка. Это позволяет удалить неиспользуемые части движка и уменьшить размер итогового бинарного файла. Подробнее об исключении ненужных возможностей читайте в [руководстве по манифесту приложения](/manuals/app-manifest).
 
-```ini
-[bootstrap]
-main_collection = /main/main.collectionc
-```
+---
 
-что означает, что настройка *main_collection* относится к категории *bootstrap*.
-Во всех случаях, когда используется ссылка на файл, как в примере выше, путь должен быть дополнен символом 'c'. Это означает, что вы ссылаетесь на скомпилированную версию файла.
-Также следует учитывать, что папка, содержащая файл *game.project*, будет корнем проекта, поэтому в пути установки присутствует начальный символ '/'.
+### Profiler
+
+#### Track Cpu
+Если включено, разрешается профилирование CPU в release-сборках. Обычно доступ к профилированию возможен только в debug-сборках.
+
+---
 
 ## Установка конфигурационных значений при запуске движка
 
@@ -499,36 +669,44 @@ $ dmengine --config=test.my_value=4711 --config=test2.my_value2=1234
 Пользовательские значения, как и любое другое значение конфигурации, могут быть считаны с помощью [`sys.get_config()`](/ref/sys/#sys.get_config):
 
 ```lua
-local my_value = tonumber(sys.get_config("test.my_value"))
+local my_value = sys.get_config_number("test.my_value")
+local my_value2 = sys.get_config_string("test.my_value2")
 ```
 
-## Vsync, frame cap, and swap interval
-The first thing of note is that on desktop platforms vsync can be controlled globally by graphics card settings. If for example vsync is force-enabled in the graphics control panel it is not user controllable, e.g. the setting cannot be accessed or modified from Defold. Most mobile devices also has vsync enabled by default.
 
-With `Vsync` checked in *game.project* the engine relies on hardware vsync and uses a fixed time step `dt` based on any detected monitor refresh rate. This is the default setting. With `Vsync` checked and `Frame cap` > 0, the rate will be clamped to a swap interval that matches any detected main monitor refresh rate. With `Vsync` unchecked and `Frame cap` 0, the time step is not fixed but instead uses actual elapsed time difference for `dt`. With `Vsync` unchecked and `Frame cap` > 0, timers are used to respect the set frame cap value. There is no guarantee that the frame cap will be achieved depending on platform specifics and hardware settings.
+:[Component max count optimizations](../shared/component-max-count-optimizations.md)
+
+
+## Пользовательские настройки проекта
 
-Swap interval is the interval with which to swap the front and back buffers in sync with vertical blanks (v-blank), the hardware event where the screen image is updated with data from the front buffer. A value of 1 swaps the buffers at every v-blank, a value of 2 swaps the buffers every other v-blank and so on. A value of 0 disables waiting for v-blank before swapping the buffers\*. Setting `swap_interval` is done by calling the [```set_vsync_swap_interval```](/ref/sys/#sys.set_vsync_swap_interval:swap_interval) function.
+Возможно определить собственные настройки как для основного проекта, так и для [нативных расширений](/manuals/extensions/). Для основного проекта они указываются в файле `game.properties` в корне проекта. Для нативного расширения — в файле `ext.properties` рядом с `ext.manifest`.
 
-### Caveat
-Currently, Defold queries for monitor refresh rate at init and uses that as a basis for picking a fixed `dt`. If you want to support monitors using variable refresh rate (GSync or FreeSync for example) or other scenarios where the refresh rate might not be trivial to query, uncheck `Vsync`to let the engine measure actual `dt` each frame instead of relying on a fixed time step.
+Файл настроек использует тот же INI-формат, что и *game.project*, а атрибуты свойств указываются с помощью точечной нотации с суффиксами:
 
+```
+[my_category]
+my_property.private = 1
+...
+```
+
+Файл с настройками по умолчанию, применяемый всегда, доступен [здесь](https://github.com/defold/defold/blob/dev/com.dynamo.cr/com.dynamo.cr.bob/src/com/dynamo/bob/meta.properties).
+
+Доступны следующие атрибуты:
+
+```
+// `type` — используется для парсинга строкового значения (на данный момент только в bob.jar)
+my_property.type = string // возможные значения: bool, string, number, integer, string_array, resource
+
+// `help` — используется как подсказка в редакторе (на данный момент не используется)
+my_property.help = string
+
+// `default` — значение по умолчанию, если пользователь не задал его вручную (на данный момент только в bob.jar)
+my_property.default = string
+
+// `private` — приватное значение, используемое при сборке, но не включаемое в итоговый бандл
+my_property.private = 1 // булевое значение: 1 или 0
+
+```
 
-### Vsync and frame cap in Defold
 
-<table>
-  <tr>
-    <th></th>
-    <th><b>Frame cap 0 (default)</b></th>
-    <th><b>Frame cap > 0</b></th>
-  </tr>
-  <tr>
-    <td><b>Vsync checked (default)</b></td>
-    <td>Relies on hardware vsync. Fixed <code>dt</code> of <code>1/(detected monitor refresh rate)</code>.</td>
-    <td>Fixed <code>dt</code> of <code>(swap interval)/(detected monitor refresh rate)</code> where swap interval is clamped to the closest matching monitor refresh rate frame cap multiple.</td>
-  </tr>
-  <tr>
-    <td><b>Vsync unchecked</b></td>
-    <td>Calculates <code>dt</code> each frame based on elapsed system time. Vsync might still be enabled in driver settings.</td>
-    <td>Uses a fixed <code>dt</code> of <code>1 / (Frame cap)</code>. Uses timers and sleeps to respect the set frame cap.</td>
-  </tr>
-</table>
+На данный момент meta-свойства используются только в `bob.jar` при сборке, но в будущем они будут также обрабатываться редактором и отображаться в *game.project*.

+ 114 - 18
docs/ru/manuals/render.md

@@ -11,6 +11,7 @@ brief: Данное руководство объясняет, как работ
 
 Конвейер рендеринга диктует что рендерить, когда это рендерить и также где это следует рендерить. Что рендерить задается [рендер предикатами](#рендер-предикаты). Когда рендерить предикат управляется [рендер скриптом](#рендер-скрипт), а где рендерить предикат управляется [проекцией вида](#проекция-вида-по-умолчанию).
 
+
 ## Рендер по-умолчанию
 
 Рендер файл содержит ссылку на текущий рендер скрипт, а также пользовательские материалы, которые должны быть доступны в рендер скрипте (применяется вызов [`render.enable_material()`](/ref/render/#render.enable_material))
@@ -30,8 +31,6 @@ brief: Данное руководство объясняет, как работ
 3. Замените свойство *Render* (в *bootstrap*) в файле настроек *game.project* так, чтобы оно ссылалось на вашу копию файла "default.render".
 
 
-
-
 # Рендер предикаты
 
 Чтобы иметь возможность управлять порядком отрисовки объектов, создаются рендер _предикаты_. Предикат задает, что должно быть отрисовано на основе выборки _тегов_ материала.
@@ -40,18 +39,37 @@ brief: Данное руководство объясняет, как работ
 
 В вашем рендер скрипте вы далее можете создать *рендер предикат* и задать, какие теги должны принадлежать этому предикату. Когда вы просите движок отрисовать предикат, каждый объект с материалом, содержащим тег, совпадающий со списком заданным для предиката, будет отрисован.
 
-![Render predicate](images/render/render_predicate.png)
+```
+Sprite 1        Sprite 2        Sprite 3        Sprite 4
+Material A      Material A      Material B      Material C
+  outlined        outlined        greyscale       outlined
+  tree            tree            tree            house
+```
 
-Детальное описание работы материалов может быть найдено в [Документации по материалам](/manuals/material).
+```lua
+-- a predicate matching all sprites with tag "tree"
+local trees = render.predicate({"tree"})
+-- will draw Sprite 1, 2 and 3
+render.draw(trees)
+
+-- a predicate matching all sprites with tag "outlined"
+local outlined = render.predicate({"outlined"})
+-- will draw Sprite 1, 2 and 4
+render.draw(outlined)
+
+-- a predicate matching all sprites with tags "outlined" AND "tree"
+local outlined_trees = render.predicate({"outlined", "tree"})
+-- will draw Sprite 1 and 2
+render.draw(outlined_trees)
+```
 
 
-## Проекция вида по умолчанию
+Детальное описание работы материалов может быть найдено в [Документации по материалам](/manuals/material).
 
-Рендер-скрипт по-умолчанию сконфигурирован использовать ортографическую проекцию подходящую для 2D игр. Он предоставляет 3 разных ортографических проекции: `Stretch` (применяется по-умолчанию), `Fixed Fit` и `Fixed`.
 
-Также вы можете использовать проекцию перспективы, предусмотренную компонентом камеры, подходящую для 3D игр.
+## Проекция вида по умолчанию
 
-Компонент камеры может быть использован как для ортографической, так и перспективной проекций для изменения матрицы вида (по сути, какая часть игрового мира отображается). Узнайте больше о компоненте камеры в [Руководстве по камере](/manuals/camera).
+Скрипт рендера по умолчанию настроен на использование ортографической проекции, подходящей для 2D-игр. Он предоставляет три различных ортографических проекции: `Stretch` (по умолчанию), `Fixed Fit` и `Fixed`. В качестве альтернативы ортографическим проекциям вы также можете использовать матрицу проекции, предоставляемую компонентом камеры.
 
 ### Stretch проекция
 
@@ -115,15 +133,28 @@ Fixed проекция сохранит исходное соотношение
 msg.post("@render:", "use_fixed_projection", { near = -1, far = 1, zoom = 2 })
 ```
 
-### Проекция перспективы
+### Проекция камеры
 
-Проекция перспективы подходит для трехмерных игр, где игровые объекты рендерятся в перспективе и где размер объектов варьируется в зависимости от расстояния от положения воображаемого глаза/камеры.
+Когда используется рендер-скрипт по умолчанию и в проекте есть активированные [компоненты камеры](/manuals/camera), они имеют приоритет над любыми другими настройками вида и проекции, заданными в рендер-скрипте. Подробнее о работе с компонентами камеры в рендер-скриптах читайте в [документации по камере](/manuals/camera).
 
-Для включения проекции перспективы, предоставляемой компонентом камеры, вы посылаете следующее сообщение рендер скрипту:
+## Отсечение по усеченному конусу (Frustum culling)
 
-```lua
-msg.post("@render:", "use_camera_projection")
-```
+API рендеринга в Defold позволяет разработчикам использовать усечение по усеченному конусу. Когда усечение включено, вся графика, находящаяся вне заданной ограничивающей рамки или пирамиды вида (frustum), будет проигнорирована. В большом игровом мире, где одновременно отображается только часть контента, усечение может значительно сократить объем данных, передаваемых в GPU, тем самым повысив производительность и экономя заряд батареи (на мобильных устройствах). Обычно для создания ограничивающей рамки используется вид и проекция камеры. Рендер-скрипт по умолчанию использует вид и проекцию (от камеры) для расчета frustum.
+
+Усечение реализовано в движке по типу компонента. Текущий статус (Defold 1.9.0):
+
+| Компонент   | Поддержка |
+|-------------|-----------|
+| Спрайт      | ДА        |
+| Модель      | ДА        |
+| Меш         | ДА (1)    |
+| Текст       | ДА        |
+| Spine       | ДА        |
+| Particle fx | НЕТ       |
+| Tilemap     | ДА        |
+| Rive        | НЕТ       |
+
+1 = Ограничивающая рамка для меша должна быть задана вручную. [Подробнее](/manuals/mesh/#frustum-culling).
 
 
 ## Системы координат
@@ -238,10 +269,9 @@ local MSG_SET_VIEW_PROJ =       hash("set_view_projection")
           -- Ктото послал нам новый цвет очистки для использования.
           self.clear_color = message.color
       elseif message_id == MSG_SET_VIEW_PROJ then
-          -- Компонент камеры, завладевший фокусом будет посылать сообщения set_view_projection
-          -- в сокет @render. Мы можем использовать информацию о камере
-          -- для выставления отображения (и возможно проекции) для рендеринга.
-          -- Сейчас мы рендерим ортографически, поэтому здесь нет нужды в проекции камеры.
+          -- Компонент камеры, получивший фокус, будет посылать
+          -- сообщения set_view_projection в сокет @render.
+          -- Мы можем использовать эту информацию, чтобы установить вид (и, возможно, проекцию) рендеринга.
           camera.view = message.view
           self.camera_projection = message.projection or vmath.matrix4()
           update_camera(camera, state)
@@ -256,6 +286,72 @@ local MSG_SET_VIEW_PROJ =       hash("set_view_projection")
   msg.post("@render:", "clear_color", { color = vmath.vector4(0.3, 0.4, 0.5, 0) })
   ```
 
+## Ресурсы рендеринга
+Чтобы передать определенные ресурсы движка в рендер-скрипт, вы можете добавить их в таблицу `Render Resources` в `.render` файле проекта:
+
+![Render resources](images/render/render_resources.png)
+
+Использование этих ресурсов в рендер-скрипте:
+
+```lua
+-- "my_material" теперь будет использоваться для всех вызовов отрисовки, связанных с предикатом
+render.enable_material("my_material")
+-- всё, отрисованное через предикат, окажется в "my_render_target"
+render.set_render_target("my_render_target")
+render.draw(self.my_full_screen_predicate)
+render.set_render_target(render.RENDER_TARGET_DEFAULT)
+render.disable_material()
+
+-- привязка текстуры результата рендер-таргета к отрисовываемому через предикат
+render.enable_texture(0, "my_render_target", render.BUFFER_COLOR0_BIT)
+render.draw(self.my_tile_predicate)
+```
+
+::: sidenote
+Defold на текущий момент поддерживает только `Materials` и `Render Targets` как подключаемые ресурсы рендеринга, но в будущем поддержка будет расширена.
+:::
+
+## Обработчики текстур
+
+Текстуры в Defold представлены внутренне как handle (дескриптор), по сути — это число, которое уникально идентифицирует объект текстуры внутри движка. Это означает, что вы можете связать мир игровых объектов с рендеринговой системой, передав эти дескрипторы между игровыми скриптами и системой рендеринга. Например, скрипт может создать динамическую текстуру в `script`-файле, прикреплённом к игровому объекту, и передать её в рендерер для использования как глобальной текстуры в команде отрисовки.
+
+В `.script` файле:
+
+```lua
+local my_texture_resource = resource.create_texture("/my_texture.texture", tparams)
+-- примечание: my_texture_resource — это хеш пути к ресурсу, не пригодный как дескриптор!
+local my_texture_handle = resource.get_texture_info(my_texture_resource)
+-- my_texture_handle содержит информацию о текстуре, включая ширину, высоту и т.д.
+-- также он содержит нужный нам дескриптор (handle)
+msg.post("@render:", "set_texture", { handle = my_texture_handle.handle })
+```
+
+В `.render_script` файле:
+
+```lua
+function on_message(self, message_id, message)
+    if message_id == hash("set_texture") then
+        self.my_texture = message.handle
+    end
+end
+
+function update(self)
+    -- привязываем текстуру к состоянию отрисовки
+    render.enable_texture(0, self.my_texture)
+    -- выполняем отрисовку..
+end
+```
+
+::: sidenote
+В настоящее время нет способа изменить, на какую текстуру указывает ресурс — вы можете использовать только "сырые" дескрипторы в рендер-скрипте.
+:::
+
+## Поддерживаемые графические API
+
+API рендер-скрипта Defold транслирует операции рендеринга в следующие графические API:
+
+:[Graphics API](../shared/graphics-api.md)
+
 ## Системные сообщения
 
 `"set_view_projection"`

+ 5 - 1
docs/ru/manuals/resource.md

@@ -14,10 +14,14 @@ brief: Это руководство объясняет, как Defold авто
 - Данные об игровых объектах и компонентах (атласы, звуки и т.д.).
 - Прототипы фабрик (игровые объекты и коллекции).
 - Ссылки на компоненты прокси-коллекций (коллекции).
-- Пользовательские ресурсы, объявленные в *game.project*.
+ Пользовательские ресурсы, объявленные в *game.project*.
 
 ![Resource tree](images/resource/resource_tree.png)
 
+::: sidenote
+В Defold также существует понятие *bundle resources* (ресурсы бандла). Эти ресурсы включаются в приложение при сборке, но не являются частью дерева ресурсов. Ресурсы бандла могут включать в себя, например, платформенно-зависимые вспомогательные файлы или внешние файлы, [загружаемые с файловой системы](/manuals/file-access/#how-to-access-files-bundled-with-the-application) и используемые в игре (например, звуковые банки FMOD).
+:::
+
 При сборке игры в *бандл* будет включено только то, что находится в дереве ресурсов. Все, на что нет ссылок в дереве, будет исключено. Нет необходимости вручную выбирать, что включить или исключить из бандла.
 
 Когда игра *запускается*, движок стартует с корня загрузки дерева и извлекает ресурсы в память:

+ 12 - 2
docs/ru/manuals/script-properties.md

@@ -16,7 +16,12 @@ brief: В этом руководстве объясняется, как доб
 
 ## Определение свойства скрипта
 
-Свойства скрипта добавляются к компоненту Script путем их определения с помощью специальной функции `go.property()`. Эта функция должна использоваться на верхнем уровне - вне любых функций обратного вызова, таких как `init()` и `update()`. Значение по умолчанию, заданное для свойства, определяет тип свойства: number, boolean, hash, `msg.url`, `vmath.vector3`, `vmath.vector4`, `vmath.quaternion` и `resource` (см. ниже).
+Свойства скрипта добавляются к компоненту Script путем их определения с помощью специальной функции `go.property()`. Эта функция должна использоваться на верхнем уровне — вне любых функций жизненного цикла, таких как `init()` и `update()`. Значение по умолчанию, указанное для свойства, определяет его тип: `number`, `boolean`, `hash`, `msg.url`, `vmath.vector3`, `vmath.vector4`, `vmath.quaternion` и `resource` (см. ниже).
+
+::: important
+Обратите внимание, что разворот значения хеша работает только в отладочной сборке, чтобы облегчить отладку. В релизной сборке строковое значение в обратном виде не существует, поэтому использование `tostring()` для значения `hash` не имеет смысла.
+:::
+
 
 ```lua
 -- can.script
@@ -50,7 +55,12 @@ end
 
 ![Properties](images/script-properties/properties.png)
 
-Любое свойство, которое переопределяется новым значением для конкретного экземпляра, отмечено синим цветом. Кликните кнопку сброса рядом с именем свойства, чтобы вернуть значение по умолчанию (как установлено в скрипте).
+Любое свойство, которое переопределяется новым значением для конкретного экземпляра, отмечается синим цветом. Нажмите кнопку сброса рядом с именем свойства, чтобы вернуть значение по умолчанию (установленное в скрипте).
+
+
+::: important
+Свойства скрипта анализируются при сборке проекта. Выражения со значениями не вычисляются. Это означает, что конструкция вроде `go.property("hp", 3+6)` не будет работать, тогда как `go.property("hp", 9)` — будет.
+:::
 
 ## Доступ к свойствам скрипта
 

+ 43 - 17
docs/ru/manuals/script.md

@@ -5,34 +5,34 @@ brief: В этом руководстве описано, как добавит
 
 # Компонент Script
 
-Компонент Script позволяет создавать игровую логику, используя [язык программирования Lua](/manuals/lua). Скрипты добавляются к игровым объектам точно так же, как и любой другой [компонент](/manuals/components), при этом Defold будет выполнять код Lua как часть функций жизненного цикла движка.
+Компонент Script позволяет создавать игровую логику, используя [язык программирования Lua](/manuals/lua). 
 
 
 ## Типы скриптов
 
-В Defold существует три типа Lua-скриптов, для каждого из которых доступны различные библиотеки.
+В Defold существует три типа Lua-скриптов, и для каждого из них доступны разные библиотеки Defold.
 
-Скрипты логики
-: Расширение _.script_. Запускаются компонентами скриптов в игровых объектах. Как правило, используются для управления игровыми объектами и логикой, которая связывает игру с загрузкой уровней, правилами игры и так далее. Скрипты логики имеют доступ ко всем функциям библиотеки Defold, кроме функций [GUI](/ref/gui) и [Render](/ref/render).
+Скрипты игровых объектов
+: Расширение _.script_. Эти скрипты добавляются к игровым объектам точно так же, как и любой другой [компонент](/manuals/components), и Defold будет выполнять Lua-код как часть функций жизненного цикла движка. Скрипты игровых объектов обычно используются для управления игровыми объектами и логикой, объединяющей игру воедино: загрузкой уровней, игровыми правилами и так далее. Скрипты имеют доступ к функциям [GO](/ref/go) и ко всем библиотечным функциям Defold, за исключением [GUI](/ref/gui) и [Render](/ref/render).
 
 
-GUI-скрипты
-: Расширение _.gui_script_. Запускаются компонентами GUI и обычно содержат логику, необходимую для отображения элементов GUI, таких как HUD, меню и т.д. GUI-скрипты имеют доступ к функциям библиотеки [GUI](/ref/gui).
+Скрипты GUI
+: Расширение _.gui_script_. Выполняются компонентами GUI и обычно содержат логику, необходимую для отображения элементов GUI, таких как интерфейс, меню и т.п. Defold выполняет Lua-код как часть функций жизненного цикла движка. Скрипты GUI имеют доступ к функциям [GUI](/ref/gui) и ко всем библиотечным функциям Defold, за исключением [GO](/ref/go) и [Render](/ref/render).
 
 
-Render-скрипты
-: Расширение _.render_script_. Запускаются конвейером рендеринга и содержит логику, необходимую для рендеринга графики приложения/игры в каждом кадре. Рендер-скрипты имеют доступ к функциям библиотеки.
+Скрипты рендера
+: Расширение _.render_script_. Выполняются в рамках пайплайна рендеринга и содержат логику, необходимую для отрисовки всей графики приложения/игры в каждом кадре. Скрипт рендера занимает особое место в жизненном цикле вашей игры. Подробнее см. в [документации по жизненному циклу приложения](/manuals/application-lifecycle). Скрипты рендера имеют доступ к функциям [Render](/ref/render) и ко всем библиотечным функциям Defold, за исключением [GO](/ref/go) и [GUI](/ref/gui).
 
 
-## Script execution, callbacks and self
+## Выполнени Script, колбэки и self
 
 Defold выполняет Lua-скрипты как часть жизненного цикла движка и раскрывает этот жизненный цикл через набор предопределенных функций обратного вызова. При добавлении компонента скрипта к игровому объекту скрипт становится частью жизненного цикла игрового объекта и его компонента(ов). Скрипт оценивается в Lua-контексте при его загрузке, затем движок выполняет следующие функции и передает ссылку на текущий экземпляр компонента скрипта в качестве параметра. Эту ссылку `self` можно использовать для хранения состояния в экземпляре компонента.
 
 ::: important
-`self` --- это объект типа userdata, который действует как Lua-таблица, однако его нельзя итерировать с помощью `pairs()` или `ipairs()` и нельзя распечатать с помощью `pprint()`.
+`self` --- это объект типа userdata, который действует как Lua-таблица, однако его нельзя итерировать с помощью `pairs()` или `ipairs()` и нельзя распечатить с помощью `pprint()`.
 :::
 
-`init(self)`
+#### `init(self)`
 : Вызывается при инициализации компонента.
 
   ```lua
@@ -43,7 +43,7 @@ Defold выполняет Lua-скрипты как часть жизненно
   end
   ```
 
-`final(self)`
+#### `final(self)`
 : Вызывается при удалении компонента. Это полезно для очистки, например, если были порождены игровые объекты, которые должны быть удалены при удалении компонента.
 
   ```lua
@@ -54,7 +54,7 @@ Defold выполняет Lua-скрипты как часть жизненно
   end
   ```
 
-`update(self, dt)`
+#### `update(self, dt)`
 : Вызывается один раз в каждом кадре. `dt` содержит дельту времени с момента последнего кадра.
 
   ```lua
@@ -63,7 +63,16 @@ Defold выполняет Lua-скрипты как часть жизненно
   end
   ```
 
-`on_message(self, message_id, message, sender)`
+#### `fixed_update(self, dt)`
+: Обновление, не зависящее от частоты кадров. `dt` содержит дельту времени с момента последнего обновления. Эта функция вызывается, когда включен параметр `engine.fixed_update_frequency` (!= 0). Полезна, когда вы хотите управлять физическими объектами с регулярными интервалами для достижения стабильной симуляции физики при включенном параметре `physics.use_fixed_timestep` в *game.project*.
+
+  ```lua
+  function fixed_update(self, dt)
+      msg.post("#co", "apply_force", {force = vmath.vector3(1, 0, 0), position = go.get_world_position()})
+  end
+  ```
+
+#### `on_message(self, message_id, message, sender)`
 : При отправке сообщений компоненту Script через [`msg.post()`](/ref/msg#msg.post) движок вызывает эту функцию компонента-приемника. За подробностями обращайтесь к [руководству по передаче сообщений](/manuals/message-passing).
 
     ```lua
@@ -74,7 +83,7 @@ Defold выполняет Lua-скрипты как часть жизненно
     end
     ```
 
-`on_input(self, action_id, action)`
+#### `on_input(self, action_id, action)`
 : Если этот компонент получил фокус ввода (см. [`acquire_input_focus`](/ref/go/#acquire_input_focus)), движок вызывает эту функцию когда ввод зарегистрирован. За подробностями обращайтесь к [руководству по вводу](/manuals/input).
 
     ```lua
@@ -85,7 +94,7 @@ Defold выполняет Lua-скрипты как часть жизненно
     end
     ```
 
-`on_reload(self)`
+#### `on_reload(self)`
 : Эта функция вызывается при перезагрузке скрипта с помощью горячей перезагрузки в редакторе (<kbd>Edit ▸ Reload Resource</kbd>). Очень удобно для отладки, тестирования и оптимизации. За подробностями обращайтесь к [руководству по горячей перезагрузке](/manuals/hot-reload).
 
   ```lua
@@ -163,8 +172,25 @@ end
 Так чище и проще для понимания. Мы избавляемся от внутренних переменных состояния, которые часто трудно проследить через логику, и которые могут привести к трудноуловимым ошибкам. Мы также полностью избавляемся от функции `update()`. Это освобождает движок от необходимости вызывать скрипт 60 раз в секунду, даже если он простаивает.
 
 
+## Препроцессинг
+
+Можно использовать Lua-препроцессор и специальную разметку для условного включения кода в зависимости от варианта сборки. Пример:
+
+```lua
+-- Используйте одно из следующих ключевых слов: RELEASE, DEBUG или HEADLESS
+--#IF DEBUG
+local lives_num = 999
+--#ELSE 
+local lives_num = 3
+--#ENDIF
+```
+
+Препроцессор доступен как расширение сборки. Подробнее о его установке и использовании см. на [странице расширения на GitHub](https://github.com/defold/extension-lua-preprocessor).
+
+
 ## Поддержка со стороны редактора
 
-Редактор Defold поддерживает редактирование Lua-скриптов с подсветкой синтаксиса и автозаполнением. Чтобы заполнить имена функций Defold, нажмите *Ctrl+Space*, чтобы вызвать список функций, соответствующих тому, что вы вводите.
+Редактор Defold поддерживает редактирование Lua-скриптов с подсветкой синтаксиса и автодополнением. Чтобы автоматически подставить имена функций Defold, нажмите *Ctrl+Space* — появится список функций, соответствующих набираемому тексту.
 
 ![Auto completion](images/script/completion.png)
+

+ 265 - 3
docs/ru/manuals/shader.md

@@ -11,6 +11,7 @@ brief: Данное руководство объясняет вершинные
 
 * Смотрите [Руководство по рендеру](/manuals/render) с деталями по рендер конвейеру.
 * Смотрите [Руководство по материалам](/manuals/material) с деталями по материалам.
+* Смотрите [Compute manual](/manuals/compute) с деталями по вычислительным шейдерам.
 
 Спецификации OpenGL ES 2.0 (OpenGL для встраиваемых систем) и OpenGL ES Shading Language можно найти по адресу  https://www.khronos.org/registry/gles/
 
@@ -33,6 +34,13 @@ brief: Данное руководство объясняет вершинные
 
   Выходные данные фрагментного шейдера это цветовое значение для конкретного фрагмента (`gl_FragColor`).
 
+Вычислительный шейдер
+: Вычислительный шейдер — это шейдер общего назначения, который может использоваться для выполнения любых вычислений на GPU. Он не является частью графического конвейера, вычислительные шейдеры выполняются в отдельном контексте исполнения и не зависят от входных данных других шейдеров.
+
+  Входными данными вычислительного шейдера являются буферы констант (`uniforms`), текстурные изображения (`image2D`), сэмплеры (`sampler2D`) и буферы хранения (`buffer`).
+
+  Выход вычислительного шейдера не определяется явно, в отличие от вершинных и фрагментных шейдеров, нет необходимости выдавать конкретный результат. Поскольку вычислительные шейдеры универсальны, программист сам определяет, какой результат должен быть получен.
+
 Матрица мира
 : Позиции вершин формы модели хранятся относительно начала координат модели. Это называется "пространство модели". Однако мир игры это "пространство мира", где позиция, ориентация и масштаб каждой вершины выражены относительно начала координат пространства мира. Разделяя их таким образом, игровой движок способен двигать, вращать и масштабировать каждую модель без разрушения изначальных значений вершин, хранимых в компоненте модели.
 
@@ -49,7 +57,6 @@ brief: Данное руководство объясняет вершинные
 : Значение ассоциированное с отдельной вершиной. Атрибуты передаются шейдеру движком и если вы хотите получить доступ к атрибуту, вы просто объявляете его в программе вашего шейдера. Разные типы компонентов имеют разный набор атрибутов:
   - У спрайта есть `position` и `texcoord0`.
   - У сетки тайлов есть `position` и `texcoord0`.
-  - У Spine модели есть `position` и `texcoord0`.
   - У GUI-ноды есть `position`, `textcoord0` и `color`.
   - У ParticleFX есть `position`, `texcoord0` и `color`.
   - У модели есть `position`, `texcoord0` и `normal`.
@@ -69,8 +76,10 @@ brief: Данное руководство объясняет вершинные
 Сэмплеры
 : Шейдеры могут объявлять uniform переменные типа *sampler*. Сэмплеры используются для считывания значений из источника изображения:
 
-  - `sampler2D` --- считывает из изображения двумерной текстуры.
-  - `samplerCube` --- считывает из текстуры кубической развертки, состоящей из 6 изображений.
+  - `sampler2D` --- считывает данные из 2D текстуры изображения.
+  - `sampler2DArray` --- считывает данные из массива 2D текстур. В основном используется для атласов с разбиением на страницы.
+  - `samplerCube` --- считывает данные из текстуры кубической карты, состоящей из 6 изображений.
+  - `image2D` --- загружает (и потенциально сохраняет) данные текстуры в объект изображения. В основном используется в вычислительных шейдерах для хранения данных.
 
   Вы можете использовать сэмплер только в функциях поиска текстуры стандартной библиотеки GLSL. [Руководство по материалам](/manuals/material) объясняет как задавать настройки сэмплера.
 
@@ -94,6 +103,259 @@ Varying переменные
 
   ![Varying interpolation](images/shader/varying.png)
 
+## Написание современных GLSL шейдеров
+
+Поскольку движок Defold поддерживает несколько платформ и графических API, разработчикам должно быть легко писать шейдеры, работающие везде. Конвейер ассетов реализует это главным образом двумя способами (обозначаемыми как `шейдерные пайплайны`):
+
+1. Устаревший пайплайн, где шейдеры пишутся в формате совместимом с ES2 GLSL.
+2. Современный пайплайн, где шейдеры пишутся в формате совместимом с SPIR-v GLSL.
+
+Начиная с Defold 1.9.2 рекомендуется писать шейдеры с использованием нового пайплайна. Для этого большинство шейдеров нужно мигрировать на GLSL версии как минимум 140 (OpenGL 3.1). Чтобы выполнить миграцию, убедитесь, что соблюдены следующие требования:
+
+### Объявление версии
+Укажите `#version 140` в начале шейдера:
+
+```glsl
+#version 140
+```
+
+Именно так шейдерный пайплайн выбирается в процессе сборки, поэтому старые шейдеры всё ещё работают. Если директива версии не указана, Defold использует устаревший пайплайн по умолчанию.
+
+### Атрибуты
+В вершинных шейдерах замените ключевое слово `attribute` на `in`:
+
+```glsl
+// вместо:
+// attribute vec4 position;
+// используйте:
+in vec4 position;
+```
+
+Примечание: фрагментные (и compute) шейдеры не принимают входные значения от вершин.
+
+### Varying переменные
+В вершинных шейдерах varying переменные должны быть с префиксом `out`. Во фрагментных шейдерах — с префиксом `in`:
+
+```glsl
+// В вершинном шейдере, вместо:
+// varying vec4 var_color;
+// используйте:
+out vec4 var_color;
+
+// Во фрагментном шейдере, вместо:
+// varying vec4 var_color;
+// используйте:
+in vec4 var_color;
+```
+
+### Uniform-переменные (в Defold называются константами)
+
+Непрозрачные типы uniforms (sampler, image, atomic, SSBO) не требуют миграции, они могут использоваться как и раньше:
+
+```glsl
+uniform sampler2D my_texture;
+uniform image2D my_image;
+```
+
+Для непрозрачных типов необходимо объединить переменные в `uniform block`. Это просто группа uniform переменных, объявленная с использованием ключевого слова `uniform`:
+
+```glsl
+uniform vertex_inputs
+{
+    mat4 mtx_world;
+    mat4 mtx_proj;
+    mat4 mtx_view;
+    mat4 mtx_normal;
+    ...
+};
+
+void main()
+{
+    // Individual members of the uniform block can be used as-is
+    gl_Position = mtx_proj * mtx_view * mtx_world * vec4(position, 1.0);
+}
+```
+
+Все переменные в uniform-блоке становятся доступными для материалов и компонентов как отдельные константы. Миграция для использования render constant buffers или `go.set` и `go.get` не требуется.
+
+### Встроенные переменные
+
+Начиная с версии 140 во фрагментных шейдерах использование `gl_FragColor` устарело. Вместо этого используйте `out`:
+
+```glsl
+// вместо:
+// gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
+// используйте:
+out vec4 color_out;
+
+void main()
+{
+    color_out = vec4(1.0, 0.0, 0.0, 1.0);
+}
+```
+
+### Текстурные функции
+
+Функции вроде `texture2D` и `texture2DArray` больше не поддерживаются. Вместо них используйте `texture`:
+
+```glsl
+uniform sampler2D my_texture;
+uniform sampler2DArray my_texture_array;
+
+// вместо:
+// vec4 sampler_2d = texture2D(my_texture, uv);
+// vec4 sampler_2d_array = texture2DArray(my_texture_array, vec3(uv, slice));
+// используйте:
+vec4 sampler_2d = texture(my_texture, uv);
+vec4 sampler_2d_array = texture(my_texture_array, vec3(uv, slice));
+```
+
+### Точность
+
+Ранее для соответствия спецификациям OpenGL ES требовалось явно указывать точность переменных, входов, выходов и т. д. В этом больше нет необходимости — теперь точность автоматически назначается для платформ, которые это поддерживают.
+
+### Пример
+
+Ниже приведён пример встроенного вершинного и фрагментного шейдера спрайта, переведённого на современный формат:
+
+```glsl
+#version 140
+
+uniform vx_uniforms
+{
+    mat4 view_proj;
+};
+
+// positions are in world space
+in vec4 position;
+in vec2 texcoord0;
+
+out vec2 var_texcoord0;
+
+void main()
+{
+    gl_Position = view_proj * vec4(position.xyz, 1.0);
+    var_texcoord0 = texcoord0;
+}
+```
+
+```glsl
+#version 140
+
+in vec2 var_texcoord0;
+
+out vec4 color_out;
+
+uniform sampler2D texture_sampler;
+
+uniform fs_uniforms
+{
+    vec4 tint;
+};
+
+void main()
+{
+    // Premultiply alpha since all runtime textures already are
+    vec4 tint_pm = vec4(tint.xyz * tint.w, tint.w);
+    color_out = texture(texture_sampler, var_texcoord0.xy) * tint_pm;
+}
+
+```
+
+## Вставка сниппетов в шейдеры
+
+В Defold шейдерах поддерживается включение исходного кода из файлов с расширением `.glsl`, находящихся внутри проекта. Чтобы включить GLSL-файл в шейдер, используйте директиву `#include` — либо с двойными кавычками, либо со скобками. Пути в директиве должны быть либо относительными к корню проекта, либо относительными к текущему включающему файлу:
+
+```glsl
+// In file /main/my-shader.fp
+
+// Absolute path
+#include "/main/my-snippet.glsl"
+// The file is in the same folder
+#include "my-snippet.glsl"
+// The file is in a sub-folder on the same level as 'my-shader'
+#include "sub-folder/my-snippet.glsl"
+// The file is in a sub-folder on the parent directory, i.e /some-other-folder/my-snippet.glsl
+#include "../some-other-folder/my-snippet.glsl"
+// The file is on the parent directory, i.e /root-level-snippet.glsl
+#include "../root-level-snippet.glsl"
+```
+
+Особенности использования:
+
+- Файлы должны быть расположены внутри проекта. Абсолютные пути должны начинаться с символа `/`.
+- Вставку кода можно делать в любом месте файла, но нельзя вставлять файл внутри выражения. Например, `const float #include "my-float-name.glsl" = 1.0` не будет работать.
+
+### Защита от повторных включений
+
+Сниппеты могут сами включать другие `.glsl` файлы, что может привести к тому, что итоговый шейдер будет включать один и тот же код несколько раз. В зависимости от содержимого файлов это может привести к ошибкам компиляции из-за повторного определения одних и тех же символов. Чтобы избежать этого, используйте *защиту от повторного включения* (header guards) — это распространённая практика в нескольких языках программирования. Пример:
+
+```glsl
+// In my-shader.vs
+#include "math-functions.glsl"
+#include "pi.glsl"
+
+// In math-functions.glsl
+#include "pi.glsl"
+
+// In pi.glsl
+const float PI = 3.14159265359;
+```
+
+В этом примере константа `PI` будет определена дважды, что приведёт к ошибкам компиляции при запуске проекта. Вместо этого следует защитить содержимое файла с помощью *защиты от повторного включения* (header guards):
+
+```glsl
+// In pi.glsl
+#ifndef PI_GLSL_H
+#define PI_GLSL_H
+
+const float PI = 3.14159265359;
+
+#endif // PI_GLSL_H
+```
+
+Код из `pi.glsl` будет вставлен дважды в `my-shader.vs`, но поскольку он обёрнут защитой от повторного включения, символ `PI` будет определён только один раз, и шейдер успешно скомпилируется.
+
+Однако в зависимости от ситуации это не всегда строго необходимо. Если вы, например, хотите повторно использовать код локально внутри функции или в другом месте, где значения не должны быть доступны глобально в коде шейдера, тогда, скорее всего, не стоит использовать защиту от повторного включения. Пример:
+
+```glsl
+// В red-color.glsl
+vec3 my_red_color = vec3(1.0, 0.0, 0.0);
+
+// In my-shader.fp
+vec3 get_red_color()
+{
+  #include "red-color.glsl"
+  return my_red_color;
+}
+
+vec3 get_red_color_inverted()
+{
+  #include "red-color.glsl"
+  return 1.0 - my_red_color;
+}
+```
+
+## Код только для редактора
+
+Когда шейдеры отображаются в окне редактора Defold, доступна препроцессорная директива `EDITOR`. Это позволяет писать код, который ведёт себя по-разному в редакторе и в реальной игре.
+
+Это особенно полезно для:
+- Добавления отладочной визуализации, которая должна быть видна только в редакторе.
+- Реализации функций, специфичных для редактора, таких как режим каркасной сетки (wireframe) или предварительный просмотр материалов.
+- Обеспечения запасного отображения материалов, которые могут не поддерживаться в редакторе.
+
+Используйте директиву препроцессора `#ifdef EDITOR`, чтобы условно компилировать код только для редактора:
+
+```glsl
+#ifdef EDITOR
+    // Этот код будет выполняться только при отображении шейдера в редакторе Defold
+    color_out = vec4(1.0, 0.0, 1.0, 1.0); // Пурпурный цвет для предпросмотра
+#else
+    // Этот код будет выполняться при запуске в игре
+    color_out = texture(texture_sampler, var_texcoord0) * tint_pm;
+#endif
+```
 
 ## Процесс рендеринга
 

+ 4 - 0
docs/ru/manuals/sound.md

@@ -212,3 +212,7 @@ resource.set_sound(path, boom)
 ## Конфигурация проекта
 
 В файле *game.project* имеются несколько [настроек проекта](/manuals/project-settings#sound), относящихся к звуковым компонентам.
+
+## Потоковое воспроизведение звука
+
+Также возможно использование [потокового воспроизведения звуков](/manuals/sound-streaming).

+ 67 - 5
docs/ru/manuals/sprite.md

@@ -16,10 +16,11 @@ brief: Данное руководство описывает, как отобр
 Помимо свойств *Id*, *Position* и *Rotation* существуют следующие специфические свойства компонента:
 
 *Image*
-: Ресурс Atlas или Tile Source, используемый в спрайте.
+: Если в шейдере используется один семплер, это поле называется `Image`. В противном случае каждая ячейка называется в соответствии с именем текстурного семплера в материале.
+Каждая ячейка указывает ресурс атласа или источника тайлов, используемый для отображения спрайта на соответствующем семплере.
 
 *Default Animation*
-: Анимация, используемая для спрайта.
+: Анимация, используемая для спрайта. Информация об анимации берётся из первого атласа или источника тайлов.
 
 *Material*
 : Материал, используемый для рендеринга спрайта.
@@ -27,6 +28,14 @@ brief: Данное руководство описывает, как отобр
 *Blend Mode*
 : Режим наложения, используемый при рендеринге спрайта.
 
+*Size Mode*
+: Если установлено значение `Automatic`, редактор автоматически задаст размер спрайта. Если установлено значение `Manual`, вы можете задать размер самостоятельно.
+
+*Slice 9*
+: Установите для сохранения пиксельного размера текстуры спрайта по краям при изменении размера спрайта.
+
+:[Slice-9](../shared/slice-9-texturing.md)
+
 ### Режим наложения
 :[blend-modes](../shared/blend-modes.md)
 
@@ -55,9 +64,7 @@ brief: Данное руководство описывает, как отобр
 : Неравномерный масштаб спрайта (`vector3`).
 
 `size`
-: Размер спрайта (`vector3`) (READ ONLY).
-
-:[Slice-9](../shared/slice-9-texturing.md)
+: Размер спрайта (`vector3`). Его можно изменить только если размер спрайта установлен в ручной режим (manual).
 
 ## Константы материала
 
@@ -66,6 +73,61 @@ brief: Данное руководство описывает, как отобр
 `tint`
 : Цветовой оттенок спрайта (`vector4`). Для представления оттенка с компонентами x, y, z и w, соответствующими красному, зеленому, синему и альфа оттенкам, используется тип `vector4`.
 
+## Атрибуты материала
+
+Спрайт может переопределять вершинные атрибуты из текущего назначенного материала, которые передаются в вершинный шейдер от компонента (подробности см. в [руководстве по материалам](/manuals/material/#attributes)).
+
+Атрибуты, указанные в материале, будут отображаться как обычные свойства в инспекторе и могут быть заданы для отдельных компонентов спрайтов. Если какой-либо из атрибутов переопределён, он будет отображён как переопределённое свойство и сохранён в файле спрайта на диске:
+
+![sprite-attributes](../images/graphics/sprite-attributes.png)
+
 ## Конфигурация проекта
 
 В файле *game.project* имеются несколько [настроек проекта](/manuals/project-settings#sprite), относящихся к спрайтам.
+
+## Многотекстурные спрайты
+
+При использовании спрайтом нескольких текстур есть несколько моментов, которые следует учитывать.
+
+### Анимации
+
+Данные анимации (fps, имена кадров) берутся из первой текстуры. Мы будем называть её "управляющей анимацией".
+
+Идентификаторы изображений управляющей анимации используются для поиска изображений в других текстурах.
+Поэтому важно, чтобы идентификаторы кадров совпадали между текстурами.
+
+Например, если в вашем `diffuse.atlas` есть анимация `run` следующего вида:
+
+```
+run:
+    /main/images/hero_run_color_1.png
+    /main/images/hero_run_color_2.png
+    ...
+```
+
+Тогда идентификаторы кадров будут `run/hero_run_color_1`, что, скорее всего, не будет найдено, например, в `normal.atlas`:
+
+```
+run:
+    /main/images/hero_run_normal_1.png
+    /main/images/hero_run_normal_2.png
+    ...
+```
+
+Поэтому используйте `Паттерны переименования` в [атласе](/manuals/material/), чтобы переименовать их.
+Установите `_color=` и `_normal=` в соответствующих атласах, и вы получите имена кадров следующего вида в обоих атласах:
+
+```
+run/hero_run_1
+run/hero_run_2
+...
+```
+
+### UV координаты
+
+UV координаты берутся из первой текстуры. Так как имеется только один набор вершин, нельзя гарантировать
+корректное совпадение, если вторичные текстуры имеют либо больше UV координат, либо другую форму.
+
+Это важно учитывать, поэтому убедитесь, что изображения имеют достаточно схожую форму, иначе вы можете столкнуться с артефактами текстур.
+
+Размеры изображений в каждой текстуре могут отличаться.

+ 17 - 1
docs/ru/manuals/tilemap.md

@@ -32,7 +32,9 @@ brief: Данное руководство содержит детали под
 
    ![Painting tiles](images/tilemap/paint_tiles.png)
 
-Тайлы можно выбирать непосредственно из слоя и использовать выбранное в качестве кисти. Удерживая <kbd>Shift</kbd>, кликните по тайлу, чтобы выбрать его в качестве текущей кисти. Удерживая <kbd>Shift</kbd>, можно также кликнуть с протяжкой, чтобы выбрать блок плиток для использования в качестве более крупной кисти.
+Тайлы можно выбирать непосредственно из слоя и использовать выбранное в качестве кисти. Удерживая <kbd>Shift</kbd>, кликните по тайлу, чтобы выбрать его в качестве текущей кисти. Удерживая <kbd>Shift</kbd>, можно также кликнуть с протяжкой, чтобы выбрать блок плиток для использования в качестве более крупной кисти. Также можно вырезать плитки, удерживая <kbd>Shift+Ctrl</kbd>, или стереть их, удерживая <kbd>Shift+Alt</kbd>.
+
+Для поворота кисти по часовой стрелке используйте <kbd>Z</kbd>. Для отражения по горизонтали — <kbd>X</kbd>, а для отражения по вертикали — <kbd>Y</kbd>.
 
 ![Picking tiles](images/tilemap/pick_tiles.png)
 
@@ -99,3 +101,17 @@ end
 ## Конфигурация проекта
 
 В файле *game.project* имеются несколько [настроек проекта](/manuals/project-settings#tilemap), относящихся к тайловым картам.
+
+## Внешние инструменты
+
+Существуют внешние редакторы карт и уровней, которые могут экспортировать данные непосредственно в тайловые карты Defold:
+
+### Tiled
+
+[Tiled](https://www.mapeditor.org/) — это известный и широко используемый редактор карт для ортогональных, изометрических и гексагональных карт. Он поддерживает множество функций и может [экспортировать напрямую в Defold](https://doc.mapeditor.org/en/stable/manual/export-defold/). Подробнее о том, как экспортировать данные тайлмапа и дополнительную мета-информацию, читайте в [блоге пользователя Defold "goeshard"](https://goeshard.org/2025/01/01/using-tiled-object-layers-with-defold-tilemaps/).
+
+
+### Tilesetter
+
+[Tilesetter](https://www.tilesetter.org/docs/exporting#defold) позволяет автоматически создавать полноценные наборы тайлов из простых базовых плиток и содержит редактор карт, который может экспортировать данные непосредственно в Defold.
+

+ 1 - 0
docs/ru/manuals/working-offline.md

@@ -26,6 +26,7 @@ Defold будет периодически проверять наличие н
 
 Если вы столкнулись с проблемой будучи оффлайн, вы можете вручную сообщить об этом позже, используя опцию [Report Issue в меню «Help»](/manuals/getting-help/#report-a-problem-from-the-editor) редактора.
 
+
 ## Подгрузка зависимостей
 
 Defold поддерживает систему, в которой разработчики могут обмениваться кодом и ассетами через так называемые [Library Projects](/manuals/libraries/). Библиотеки - это zip-файлы, которые можно хостить в любом месте в Интернете. Обычно library-проекты под Defold можно найти на GitHub и других онлайн-репозиториях исходного кода. 

+ 55 - 3
docs/ru/manuals/writing-code.md

@@ -7,18 +7,70 @@ brief: В этом руководстве кратко описано, как р
 
 Хотя Defold позволяет создавать большую часть игрового контента с помощью визуальных инструментов, таких как редакторы тайловых карт и эффектов частиц, игровая логика по-прежнему создается с помощью редактора кода. Игровая логика пишется с использованием [языка программирования](https://www.lua.org/), при этом расширения для самого движка пишутся с использованием нативного для целевой платформы языка (языков).
 
-Defold имеет встроенный текстовый редактор, который позволяет открывать и редактировать файлы Lua (.lua), файлы сценариев Defold (.script, .gui_script и .render_script), а также любые другие файлы с расширением, не поддерживаемым редактором. Кроме того, редактор обеспечивает подсветку синтаксиса для файлов Lua и скриптов.
-
 ## Написание Lua-кода
 
 Defold использует Lua 5.1 и LuaJIT (в зависимости от целевой платформы), и необходимо следовать спецификации языка для этих конкретных версий Lua при написании игровой логики. За подробностями о работе с Lua в Defold обращайтесь к руководству [Lua в Defold](/manuals/lua).
 
+## Использование других языков, транспилируемых в Lua
+
+Defold поддерживает использование транспайлеров, создающих Lua-код. Установив расширение транспайлера, вы можете использовать альтернативные языки — такие как [Teal](https://github.com/defold/extension-teal) — для написания Lua с статической проверкой. Это функция в режиме предварительного просмотра, и у неё есть ограничения: текущая поддержка транспайлеров не предоставляет информацию о модулях и функциях, определённых в рантайме Defold. Это означает, что для использования API Defold, таких как `go.animate`, необходимо самостоятельно писать внешние определения.
+
 ## Написание нативного кода
 
 Defold позволяет расширять игровой движок нативным кодом для доступа к функциональности, специфичной для конкретной платформы и не предоставляемой самим движком. Нативный код также можно использовать, когда производительности Lua недостаточно (ресурсоемкие вычисления, обработка изображений и т.д.). За подробностями обращайтесь к [руководству по нативным расширениям](/manuals/extensions/).
 
+## Использование встроенного редактора кода
+
+Defold имеет встроенный редактор кода, который позволяет открывать и редактировать файлы Lua (.lua), сценарии Defold (.script, .gui_script и .render_script), а также любые другие файлы с расширениями, не поддерживаемыми редактором. Кроме того, редактор предоставляет подсветку синтаксиса для Lua и скриптов.
+
+![](/images/editor/code-editor.png)
+
+### Автодополнение кода
+
+Встроенный редактор кода показывает автодополнение функций во время написания кода:
+
+![](/images/editor/codecompletion.png)
+
+Нажатие <kbd>CTRL</kbd> + <kbd>Space</kbd> отображает дополнительную информацию о функциях, аргументах и возвращаемых значениях:
+
+![](/images/editor/apireference.png)
+
+### Настройка анализа кода (Linting)
+
+Встроенный редактор кода выполняет анализ кода с помощью [Luacheck](https://luacheck.readthedocs.io/en/stable/index.html) и [Lua language server](https://luals.github.io/wiki/diagnostics/). Чтобы настроить Luacheck, создайте файл `.luacheckrc` в корне проекта. Смотрите [страницу конфигурации Luacheck](https://luacheck.readthedocs.io/en/stable/config.html) для списка доступных параметров. Defold использует следующие параметры по умолчанию:
+
+
+```lua
+unused_args = false      -- не предупреждать об неиспользуемых аргументах (часто в .script-файлах)
+max_line_length = false  -- не предупреждать о длине строки
+ignore = {
+    "611",               -- строка содержит только пробелы
+    "612",               -- строка содержит пробелы в конце
+    "614"                -- пробелы в конце комментариев
+},
+```
+
 ## Использование внешнего редактора кода
 
 Редактор кода в Defold обеспечивает базовую функциональность, необходимую для написания кода, но для более сложных случаев использования или для опытных пользователей с любимым редактором кода можно позволить Defold открывать файлы с помощью внешнего редактора. В окне Preferences на вкладке Code можно определить внешний редактор, который будет использоваться при редактировании кода.
 
-Сообщество Defold создало плагины автозаполнения для популярных редакторов, таких как [Atom](https://atom.io/packages/defold-ide), [Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=selimanac.defold-vsc-snippets) и [Sublime](https://forum.defold.com/t/full-autocomplete-defold-api-for-sublime-text-3/10910). Кроме того, существуют также пакеты справочников API для [Dash и Zeal](https://forum.defold.com/t/defold-docset-for-dash/2417).
+### Visual Studio Code — Defold Kit
+
+Defold Kit — это плагин для Visual Studio Code со следующими возможностями:
+
+* Установка рекомендуемых расширений
+* Подсветка синтаксиса Lua, автодополнение и анализ кода
+* Применение релевантных настроек к рабочему пространству
+* Lua-аннотации для API Defold
+* Lua-аннотации для зависимостей
+* Сборка и запуск
+* Отладка с использованием точек останова
+* Сборка для всех платформ
+* Развёртывание на подключённые мобильные устройства
+
+Подробнее и установка Defold Kit — на [Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=astronachos.defold).
+
+
+## Программная документация
+
+Сообществом созданы пакеты справки по API для [Dash и Zeal](https://forum.defold.com/t/defold-docset-for-dash/2417).

+ 3 - 0
docs/ru/shared/blend-modes.md

@@ -8,3 +8,6 @@ Add
 
 Multiply
 : Затемняет фон значениями соответствующих пикселей компонента: `src.rgb * dst.rgb`
+
+Screen
+: Противоположность Multiply. Осветляет фон и значения соответствующих пикселей компонента: `src.rgb - dst.rgb * dst.rgb`

+ 22 - 34
docs/ru/shared/install.md

@@ -1,63 +1,51 @@
 ## Загрузка
 
-Перейдите на [страницу загрузки Defold](https://defold.com/download/), где найдете кнопку загрузки для macOS, Windows и Linux (Ubuntu):
+Перейдите на [страницу загрузки Defold](https://defold.com/download/), где вы найдёте кнопки загрузки для macOS, Windows и Linux (Ubuntu):
 
-![download editor](../shared/images/editor_download.png)
+![загрузка редактора](../shared/images/editor_download.png)
 
 ## Установка
 
-Установка в macOS
-: Загруженный файл представляет собой DMG-образ, содержащий программу.
+Установка на macOS
+: Загруженный файл представляет собой образ DMG, содержащий программу.
 
-  1. Перейдите к расположению файла "Defold-x86_64-macos.dmg" и выполните двойной клик по нему, чтобы открыть этот образ.
+  1. Найдите файл "Defold-x86_64-macos.dmg" и дважды щёлкните по нему, чтобы открыть образ.
   2. Перетащите приложение "Defold" на ссылку папки "Applications".
 
-  Чтобы запустить редактор, откройте папку "Applications" и выполните <kbd>двойной клик</kbd> по файлу "Defold".
+  Чтобы запустить редактор, откройте папку "Applications" и <kbd>дважды щёлкните</kbd> по файлу "Defold".
 
   ![Defold macOS](../shared/images/macos_content.png)
 
-Установка в Windows
-: Загруженный файл представляет собой ZIP-архив, который необходимо распаковать:
+Установка на Windows
+: Загруженный файл — это ZIP-архив, который необходимо распаковать:
 
-  1. Перейдите к расположению файла архива "Defold-x86_64-win32.zip", <kbd>кликните ПКМ</kbd> по папке и выберите команду *Extract All*, затем следуйте инструкциям, чтобы извлечь архив в папку с именем "Defold".
-  2. Переместите папку "Defold" в желаемое место, например `D:\Defold`. Не стоит использовать папки `C:\Program Files (x86)\` или `C:\Program Files\`, т.к. это помешает редактору обновляться.
+  1. Найдите архив "Defold-x86_64-win32.zip", <kbd>нажмите и удерживайте</kbd> (или <kbd>щёлкните правой кнопкой мыши</kbd>) по папке, выберите *Извлечь всё* и следуйте инструкциям, чтобы распаковать архив в папку с именем "Defold".
+  2. Переместите папку "Defold" в предпочитаемое место (например, `D:\Defold`). Не рекомендуется перемещать Defold в `C:\Program Files (x86)\` или `C:\Program Files\`, так как это может помешать обновлению редактора.
 
-  Чтобы запустить редактор, откройте папку "Defold" и выполните <kbd>двойной клик</kbd> по файлу "Defold.exe".
+  Чтобы запустить редактор, откройте папку "Defold" и <kbd>дважды щёлкните</kbd> по файлу "Defold.exe".
 
   ![Defold windows](../shared/images/windows_content.png)
 
-Установка в Linux
-: Загруженный файл представляет собой ZIP-архив, который необходимо распаковать:
+Установка на Linux
+: Загруженный файл — это ZIP-архив, который необходимо распаковать:
 
-  1. В терминале перейдите к расположению файла архива "Defold-x86_64-linux.zip" и распакуйте его в целевой каталог с именем "Defold".
+  1. В терминале найдите архив "Defold-x86_64-linux.zip" и распакуйте его в целевую папку с именем "Defold":
 
-     ```bash
-     $ unzip Defold-x86_64-linux.zip -d Defold
-     ```
+    ```bash
+    $ unzip Defold-x86_64-linux.zip -d Defold
+    ```
 
-  Чтобы запустить редактор, перейдите в каталог, куда было извлечено приложение, затем запустите исполняемый файл `Defold` или выполните по нему <kbd>двойной клик</kbd> в файловом менеджере.
+  Чтобы запустить редактор, перейдите в папку, куда вы его распаковали, затем выполните исполняемый файл `Defold` или <kbd>дважды щёлкните</kbd> по нему на рабочем столе.
 
   ```bash
   $ cd Defold
   $ ./Defold
   ```
 
-  Если возникнут проблемы с запуском редактора, открытием проекта или запуском игры на Defold, обращайтесь к разделу [часто задаваемых попросов по Linux](/faq/faq#linux-issues).
+  В меню `Help > Create Desktop Entry` есть помощник для создания ярлыка на рабочем столе.
 
-## Установка устаревших версий
+  Если возникли проблемы с запуском редактора, открытием проекта или запуском игры на Defold, обратитесь к [разделу про Linux в FAQ](/faq/faq#linux-questions).
 
-### Со страницы релиза Defold на GitHub
+## Установка старой версии
 
-Каждая стабильная версия Defold также [публикуется на GitHub](https://github.com/defold/defold/releases).
-
-### Со страницы загрузки Defold
-
-Старые версии редактора можно загрузить и установить по следующим ссылкам:
-
-* Windows: https://d.defold.com/archive/%sha1%/stable/editor2/Defold-x86_64-win32.zip
-* macOS: https://d.defold.com/archive/%sha1%/stable/editor2/Defold-x86_64-macos.dmg
-* Linux: https://d.defold.com/archive/%sha1%/stable/editor2/Defold-x86_64-linux.zip
-
-Следует заменить `%sha1%` на хэш релиза редактора, представляющего требуемую версию. Хэш каждой версии Defold можно обнаружить в ссылках на выпущенную версию на странице загрузки по адресу https://d.defold.com/stable/ (убедитесь, что скопировали только буквенно-цифровую часть без предшествующего символа "#"):
-
-![download editor](../shared/images/old_version_sha1.png)
+Все бета- и стабильные версии Defold также доступны на [GitHub](https://github.com/defold/defold/releases).

+ 13 - 4
docs/ru/shared/slice-9-texturing.md

@@ -6,7 +6,6 @@
 
 ![GUI scaling](../shared/images/gui_slice9_scaling.png)
 
-
 Нода Box *Slice9* включает в себя 4 числа, которые определяют количество пикселей для левого, верхнего, правого и нижнего полей, которые не должны подвергаться регулярному масштабированию:
 
 ![Slice 9 properties](../shared/images/gui_slice9_properties.png)
@@ -23,10 +22,20 @@
 
 ![GUI box node size](../shared/images/gui_slice9_size.png)
 
-Если изменить параметр Scale ноды Box --- нода и текстура будут масштабироваться без применения параметров *Slice9*.
+![Sprite size](../shared/images/sprite_slice9_size.png)
+
+::: important
+Если вы изменяете параметр масштабирования (scale) у ноды Box или спрайта (или у игрового объекта) — нода, спрайт и текстура масштабируются без применения параметров *Slice9*.
+:::
+
+::: important
+При использовании Slice9-текстурирования со спрайтами параметр [Sprite Trim Mode изображения](https://defold.com/manuals/atlas/#image-properties) должен быть установлен в значение Off.
+:::
+
+### Mipmaps и Slice9
 
-Из-за того, как работает мипмаппинг в рендере, при масштабировании сегментов текстуры иногда могут возникать артефакты. Это происходит при _масштабировании_ сегментов ниже исходного размера текстуры. Затем рендерер выбирает для сегмента мипмап с более низким разрешением, что приводит к появлению визуальных артефактов.
+Из-за особенностей работы mipmapping в рендерере масштабирование сегментов текстуры может вызывать артефакты. Это происходит при _уменьшении масштаба_ сегментов ниже исходного размера текстуры. В этом случае рендерер выбирает mipmap более низкого разрешения для сегмента, что приводит к визуальным артефактам.
 
 ![Slice 9 mipmapping](../shared/images/gui_slice9_mipmap.png)
 
-Чтобы избежать этой проблемы, убедитесь, что сегменты текстуры, которые будут масштабироваться, достаточно малы, чтобы никогда не масштабироваться в меньшую сторону, а только в большую.
+Чтобы избежать этой проблемы, убедитесь, что сегменты текстуры, которые будут масштабироваться, достаточно малы, чтобы их не приходилось уменьшать, а только увеличивать.