{"id":349983,"date":"2023-07-08T21:00:18","date_gmt":"2023-07-08T21:00:18","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=349983"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=349983","title":{"rendered":"<span>\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u044e \u043f\u0435\u0440\u0432\u0443\u044e \u0438\u0433\u0440\u0443 \u043d\u0430 Godot 3.5(\u0447\u0430\u0441\u0442\u044c 4) \u041a\u043e\u043d\u0435\u0446 \u0431\u043b\u0438\u0437\u043e\u043a\u2026<\/span>"},"content":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<ul>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/745716\/\" rel=\"noopener noreferrer nofollow\"><u>\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043f\u0435\u0440\u0432\u0443\u044e \u0447\u0430\u0441\u0442\u044c<\/u><\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/745956\/\" rel=\"noopener noreferrer nofollow\"><u>\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0432\u0442\u043e\u0440\u0443\u044e \u0447\u0430\u0441\u0442\u044c<\/u><\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/746328\/\" rel=\"noopener noreferrer nofollow\"><u>\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0442\u0440\u0435\u0442\u044c\u044e \u0447\u0430\u0441\u0442\u044c<\/u><\/a><\/p>\n<\/li>\n<\/ul>\n<hr\/>\n<p>\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043d\u0430\u0448\u0435\u0439 \u043f\u0435\u0440\u0432\u043e\u0439 \u0438\u0433\u0440\u044b. \u0412 \u044d\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0442\u043e, \u0437\u0430 \u0447\u0442\u043e \u0432\u044b \u043f\u0440\u043e\u0433\u043e\u043b\u043e\u0441\u043e\u0432\u0430\u043b\u0438, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u0414\u0435\u0440\u0435\u0432\u043e \u0442\u0430\u043b\u0430\u043d\u0442\u043e\u0432 \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u043e\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043a.<\/p>\n<h2>\u0414\u0435\u0440\u0435\u0432\u043e \u0442\u0430\u043b\u0430\u043d\u0442\u043e\u0432<\/h2>\n<p>\u0412 \u0447\u0451\u043c \u0432\u043e\u043e\u0431\u0449\u0435 \u0432\u0441\u044f \u0437\u0430\u0434\u0443\u043c\u043a\u0430. \u0418\u0433\u0440\u043e\u043a \u043c\u043e\u0436\u0435\u0442 \u0432 \u043b\u044e\u0431\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0441\u0432\u043e\u0451 \u0434\u0435\u0440\u0435\u0432\u043e \u0442\u0430\u043b\u0430\u043d\u0442\u043e\u0432 \u0438 \u0435\u0441\u043b\u0438 \u0443 \u043d\u0435\u0433\u043e \u0435\u0441\u0442\u044c \u043e\u0447\u043a\u0438 \u043f\u0440\u043e\u043a\u0430\u0447\u043a\u0438, \u0442\u043e \u043f\u0440\u043e\u043a\u0430\u0447\u0430\u0442\u044c.<\/p>\n<p>\u0421\u0430\u043c\u043e \u043f\u043e \u0441\u0435\u0431\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u0442\u044c \u0438\u0437 \u0432\u0435\u0442\u0432\u0435\u0439, \u043f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u043d\u0430 \u0432\u0435\u0442\u0432\u044c \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u043a\u043d\u043e \u0441 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u0438 2 \u043a\u043d\u043e\u043f\u043a\u0438, \u043f\u0440\u043e\u043a\u0430\u0447\u0430\u0442\u044c \u0438\u043b\u0438 \u043d\u0435\u0442. \u0415\u0441\u043b\u0438 \u0438\u0433\u0440\u043e\u043a \u043f\u0440\u043e\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u0442, \u0442\u043e \u043e\u0431 \u044d\u0442\u043e\u043c \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0438\u0433\u043d\u0430\u043b. \u0415\u0441\u043b\u0438 \u043a\u043e\u0440\u043e\u0442\u043a\u043e, \u0442\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a.<\/p>\n<h3>\u0412\u0435\u0442\u0432\u044c \u0434\u0435\u0440\u0435\u0432\u0430<\/h3>\n<p>\u0421\u043e\u0437\u0434\u0430\u0451\u043c \u043d\u043e\u0432\u0443\u044e \u0441\u0446\u0435\u043d\u0443 \u0438 \u0433\u043b\u0430\u0432\u043d\u044b\u043c \u0443\u0437\u043b\u043e\u043c \u0441\u0446\u0435\u043d\u044b \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c TextureButton, \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ae9\/460\/d2d\/ae9460d2ded841852b77bc6ddeab02b1.png\" width=\"276\" height=\"190\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ae9\/460\/d2d\/ae9460d2ded841852b77bc6ddeab02b1.png\"\/><\/figure>\n<ul>\n<li>\n<p>Sprite<\/p>\n<\/li>\n<li>\n<p>Node2D(DescriptionNode)<\/p>\n<\/li>\n<li>\n<p>ColorRect(Description), \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u0443 DescriptionNode<\/p>\n<\/li>\n<li>\n<p>Label(DescriptionLbl), \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u0443 Description<\/p>\n<\/li>\n<li>\n<p>TextureButton(DescriptionAccept), \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u0443 Description<\/p>\n<\/li>\n<li>\n<p>TextureButton(DescriptionCancel), \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u0443 Description<\/p>\n<\/li>\n<\/ul>\n<p>\u0423 TreeBranch \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c Texture, \u0438 \u0441\u0442\u0430\u0432\u0438\u043c Disabled &#8212; true. \u0412 Sprite \u0437\u0430\u043b\u0438\u0432\u0430\u0435\u043c \u0438\u043a\u043e\u043d\u043a\u0443 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. \u0423 DescriptionNode, \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c Z Index = 10. \u0412 Description, \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u043a\u0443 \u0442\u0430\u043a-\u0436\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0442\u043e\u0447\u043a\u0443 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0432 \u0446\u0435\u043d\u0442\u0440 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c <img loading=\"lazy\" decoding=\"async\" inline=\"true\" class=\"image image-inline\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/943\/d6f\/590\/943d6f5900b8298951993871a65618cc.png\" width=\"26\" height=\"27\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/943\/d6f\/590\/943d6f5900b8298951993871a65618cc.png\"\/> \u0438 \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u043c \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u044b\u0439 \u0446\u0435\u043d\u0442\u0440 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b. \u0412 DescriptionLbl \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0448\u0440\u0438\u0444\u0442. \u0412 DescriptionAccept \u0438 DescriptionCancel, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u043a\u0438. \u041f\u043e\u043a\u0430 \u043d\u0430 \u044d\u0442\u043e\u043c \u0432\u0441\u0451, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442 \u043d\u0430 \u043a\u043e\u0440\u0435\u043d\u044c \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0435\u0433\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e. \u041f\u043e\u0441\u043b\u0435 \u0432\u0441\u0435\u0445 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u0441\u0442\u0430\u0432\u0438\u043c \u0443 DescriptionLbl Visible = false.<\/p>\n<p>\u041a\u0430\u043a \u0432\u0435\u0442\u0432\u044c \u0434\u0435\u0440\u0435\u0432\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0443 \u043c\u0435\u043d\u044f:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/410\/575\/0c5\/4105750c57c1877b212e4020ec5a5140.png\" alt=\"DescriptionLbl Visible - false\" title=\"DescriptionLbl Visible - false\" width=\"279\" height=\"223\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/410\/575\/0c5\/4105750c57c1877b212e4020ec5a5140.png\"\/><\/p>\n<div><figcaption>DescriptionLbl Visible &#8212; false<\/figcaption><\/div>\n<\/figure>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/6f2\/c4e\/fef\/6f2c4efefddef79755e17226a42d000e.png\" alt=\"DescriptionLbl Visible - true\" title=\"DescriptionLbl Visible - true\" width=\"360\" height=\"351\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/6f2\/c4e\/fef\/6f2c4efefddef79755e17226a42d000e.png\"\/><\/p>\n<div><figcaption>DescriptionLbl Visible &#8212; true<\/figcaption><\/div>\n<\/figure>\n<p>\u0412\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u0440\u043e\u043a\u0430\u0447\u0435\u043a \u0431\u0443\u0434\u0443\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c\u0438: \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435 \u0430\u0442\u0430\u043a\u0438, \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435 \u0437\u0434\u043e\u0440\u043e\u0432\u044c\u044f, \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438, \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0440\u0443\u0436\u0438\u0435 &#171;\u0421\u0423\u041f\u0415\u0420&#187;. \u0412\u0441\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e: \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435, \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0443\u044e \u0432\u0435\u0442\u0432\u044c, \u043a\u0430\u043a\u043e\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0443\u043b\u0443\u0447\u0448\u0430\u0435\u043c, \u043d\u0430 \u043a\u0430\u043a\u043e\u0435 \u043f\u0440\u043e\u0446\u0435\u043d\u0442 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c, \u043a\u0430\u043a\u043e\u0435 \u043e\u0440\u0443\u0436\u0438\u0435 \u0443\u043b\u0443\u0447\u0448\u0430\u0435\u0442\u0441\u044f, \u0432\u0435\u0442\u0432\u0438 \u043d\u0430 \u044d\u0442\u043e\u043c \u0441\u043b\u043e\u0435 \u0438 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430. \u0422\u0430\u043a-\u0436\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f 3 \u0441\u0438\u0433\u043d\u0430\u043b\u0430, \u043e\u0434\u0438\u043d \u0431\u0443\u0434\u0435\u0442 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u043f\u0440\u043e\u043a\u0430\u0447\u0430\u043b\u0438 \u044d\u0442\u0443 \u0432\u0435\u0442\u0432\u044c, \u0432\u0442\u043e\u0440\u043e\u0439 \u0431\u0443\u0434\u0435\u0442 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u0438 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0438 \u0441\u0438\u0433\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0447\u0442\u043e \u0434\u0440\u0443\u0433\u0438\u0435 \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u043a\u0440\u044b\u0442\u044c, \u0442\u0440\u0435\u0442\u0438\u0439 \u0431\u0443\u0434\u0435\u0442 \u0441\u0438\u0433\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u043a\u0430\u0447\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0438 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043d\u0430 \u0441\u043a\u043e\u043b\u044c\u043a\u043e.<\/p>\n<pre><code class=\"python\">#\u042d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0434\u0435\u0440\u0435\u0432\u0430 onready var _description = $DescriptionNode onready var _description_Lbl = $DescriptionNode\/Description\/DescriptionLbl #\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0432\u0435\u0442\u0432\u0438 export(String, MULTILINE) var description_text #\u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0430\u044f \u0432\u0435\u0442\u0432\u044c export (NodePath) var previous_branch #\u041a\u0430\u043a\u043e\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0443\u043b\u0443\u0447\u0448\u0430\u0435\u043c export(int, \"Atack\", \"Speed\", \"Health\", \"WeaponUp\") var param_up #\u043d\u0430 \u0441\u043a\u043e\u043b\u044c\u043a\u043e % \u0443\u043b\u0443\u0447\u0448\u0430\u0435\u043c export var param_scale:float #\u043a\u0430\u043a\u043e\u0435 \u043e\u0440\u0443\u0436\u0438\u0435 \u0434\u0435\u043b\u0430\u0435\u043c \"\u0421\u0443\u043f\u0435\u0440\", \u0435\u0441\u043b\u0438 \u0432\u044b\u0431\u0440\u0430\u043d WeaponUp export (int, \"Blaster\", \"Shotgun\", \"Rifle\", \"Bazooka\") var param_weapon_name #\u043c\u0430\u0441\u0441\u0438\u0432 \u0432\u0435\u0442\u0432\u0435\u0439 \u043d\u0430 \u044d\u0442\u043e\u043c \u0441\u043b\u043e\u0435 export (Array, NodePath) var this_layer_branch #\u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0437\u0430\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 img export (Texture) var img #\u0441\u0438\u0433\u043d\u0430\u043b \u043e \u043f\u0440\u043e\u043a\u0430\u0447\u043a\u0435 \u0432\u0435\u0442\u0432\u0438 signal branch_pick #\u0441\u0438\u0433\u043d\u0430\u043b \u043e \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u044d\u0442\u043e\u0439 \u0432\u0435\u0442\u0432\u0438 signal close_description #\u0441\u0438\u0433\u043d\u0430\u043b \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f \u043d\u0430\u0432\u044b\u043a\u0430(\u0443\u0440\u043e\u043d, \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c, \u0445\u043f) signal skill_up(param_name,value)<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e _ready(), \u0432 \u043d\u0435\u0439 \u0431\u0443\u0434\u0443 \u0437\u0430\u043b\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u0430\u044f \u043d\u0430\u043c\u0438 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u0442\u0430\u043b\u0430\u043d\u0442\u0430, \u0438 \u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u0438\u0433\u043d\u0430\u043b\u044b, \u043e\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0437\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u0432 export &#8212; \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435<\/p>\n<pre><code class=\"python\">func _ready(): #\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0438 \u0440\u0435\u0436\u0438\u043c \u043f\u0430\u0443\u0437\u044b \u0434\u043b\u044f \u0434\u0435\u0440\u0435\u0432\u0430 pause_mode = Node.PAUSE_MODE_PROCESS #\u0417\u0430\u043b\u0438\u043b\u0438 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 $Sprite.texture = img #\u0420\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u043b\u0438 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 $Sprite.rotation_degrees -= rect_rotation #\u0420\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u043b\u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 $DescriptionNode\/Description.rect_rotation -=rect_rotation #\u041e\u0431\u044a\u044f\u0432\u0438\u043b\u0438 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0443\u044e \u0432\u0435\u0442\u0432\u044c var branch = get_node(previous_branch) #\u0415\u0441\u043b\u0438 \u043d\u0435 Null, \u0442\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u0441\u0438\u0433\u043d\u0430\u043b if (branch != null): branch.connect(\"branch_pick\",self,\"_on_branch_pick\") else: #\u0415\u0441\u043b\u0438 \u0443 \u0434\u0435\u0440\u0435\u0432\u0430 \u043d\u0435\u0442 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0432\u0435\u0442\u0432\u0435\u0439, \u0442\u043e \u044d\u0442\u043e \u043a\u043e\u0440\u0435\u043d\u044c \u0434\u0435\u0440\u0435\u0432\u0430 disabled = false #\u041f\u0440\u043e\u0431\u0435\u0433\u0430\u0435\u043c\u0441\u044f \u043f\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0443 \u0432\u0435\u0442\u0432\u0435\u0439 \u043d\u0430 \u044d\u0442\u043e\u043c \u0441\u043b\u043e\u0435 for i in range(this_layer_branch.size()): #\u041e\u0431\u0445\u044f\u0432\u0438\u043b\u0438 \u0432\u0435\u0442\u0432\u044c var layer_branch = get_node(this_layer_branch[i]) #\u0415\u0441\u043b\u0438 \u043d\u0435 null if (layer_branch != null): #\u0422\u043e \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043b\u0438 2 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 layer_branch.connect(\"branch_pick\",self,\"_on_branch_pick_this_layer\") layer_branch.connect(\"close_description\",self,\"_on_close_description_this_layer\")<\/code><\/pre>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u0435\u0439\u0447\u0430\u0441 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c, \u043a\u0430\u043a \u043f\u0440\u043e\u043a\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430<\/p>\n<pre><code class=\"python\">#\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432\u044b\u0431\u043e\u0440\u0430 \u0432\u0435\u0442\u0432\u0438 func skill_up(): match param_up: 0,1,2: #\u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u0430\u0442\u0430\u043a\u0430, \u0445\u043f \u0438\u043b\u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c emit_signal(\"skill_up\",param_up,param_scale) 3: #\u0415\u0441\u043b\u0438 \u043f\u0440\u043e\u043a\u0430\u0447\u0430\u043b\u0438 \u043e\u0440\u0443\u0436\u0438\u0435, \u0442\u043e \u0432\u044b\u0437\u0432\u0430\u043b\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0441\u0438\u043d\u0433\u043b\u0442\u043e\u043d\u0430 WeaponsName.weapon_level_up(param_weapon_name)<\/code><\/pre>\n<p>\u0415\u0449\u0451 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u0421\u0438\u043d\u0433\u043b\u0442\u043e\u043d WeaponsName, \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442\u0441\u044f true, \u0435\u0441\u043b\u0438 \u043e\u0440\u0443\u0436\u0438\u0435 \u0441\u0442\u0430\u043b\u043e \u0441\u0443\u043f\u0435\u0440 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442, \u043a\u0430\u043a\u043e\u0435 \u043e\u0440\u0443\u0436\u0438\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0443\u043f\u0435\u0440 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043e\u0447\u0438\u0441\u0442\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0434\u0435\u043b\u0430\u0435\u0442 \u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 false:<\/p>\n<pre><code class=\"python\">var blaster_up = false var shotgun_up = false var rifle_up = false var bazooka_up = false  func weapon_level_up(weapon): match weapon: 0: blaster_up = true 1: shotgun_up = true 2: rifle_up = true 3: bazooka_up = true  func clear_all(): blaster_up = false shotgun_up = false rifle_up = false bazooka_up = false<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432 \u043a\u043e\u0434 \u0441\u0438\u0433\u043d\u0430\u043b\u044b \u043e\u0442 TreeBranch, DescriptionAccept, DescriptionCancel, \u0438 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043b\u0438 \u0432 _ready()<\/p>\n<pre><code class=\"python\">#\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0432\u0435\u0442\u0432\u0438, #\u0442\u043e\u0435\u0441\u0442\u044c \u0435\u0441\u043b\u0438 \u0432\u044b\u0431\u0440\u0430\u043b\u0438 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0443\u044e \u0432\u0435\u0442\u0432\u044c, #\u0422\u043e \u0441\u043d\u044f\u0442\u044c disabled func _on_branch_pick(): disabled = false  #\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432, \u0432\u0435\u0442\u0432\u0438 \u0441 \u044d\u0442\u043e\u0433\u043e \u0441\u043b\u043e\u044f, #\u0435\u0441\u043b\u0438 \u0432\u044b\u0431\u0440\u0430\u043b\u0438 \u0441 \u044d\u0442\u043e\u0433\u043e \u0441\u043b\u043e\u044f, #\u0442\u043e \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u043c \u044d\u0442\u0443 \u0432\u0435\u0442\u0432\u044c func _on_branch_pick_this_layer(): disabled = true  #\u041e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u0441\u0438\u0433\u043d\u0430\u043b \u043e\u0442 \u0434\u0440\u0443\u0433\u0438\u0445 \u0432\u0435\u0442\u0432\u0435\u0439 \u044d\u0442\u043e\u0433\u043e \u0441\u043b\u043e\u044f,  #\u0442\u043e\u0435\u0441\u0442\u044c \u0435\u0441\u043b\u0438 \u043e\u0442\u043a\u0440\u044b\u043b\u0438 \u0434\u0440\u0443\u0433\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435, \u0442\u043e \u0437\u0430\u043a\u0440\u044b\u043b\u0438 \u044d\u0442\u043e func _on_close_description_this_layer(): _description_Lbl.text = \"\" _description.visible = false  #\u041f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u044f\u0435\u043c \u0441\u0438\u0433\u043d\u0430\u043b \u043e\u0442 TreeBranch \u0438 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c func _on_TreeBranch_pressed(): #\u0415\u0441\u043b\u0438 \u0443 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0439 \u0441\u0446\u0435\u043d\u044b, \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f  #level_up_count > 0, \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 if(get_parent().level_up_count > 0): emit_signal(\"close_description\") _description_Lbl.text = description_text _description.visible = true  #\u041f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u044f\u0435\u043c \u0441\u0438\u0433\u043d\u0430\u043b \u043e\u0442 DescriptionCancel \u0438 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c func _on_DescriptionCancel_pressed(): _description_Lbl.text = \"\" _description.visible = false  #\u041f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u044f\u0435\u043c \u0441\u0438\u0433\u043d\u0430\u043b \u043e\u0442 DescriptionAccept \u0438 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c func _on_DescriptionAccept_pressed(): #\u0443 \u043c\u0435\u043d\u044f \u0432 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u043a\u0435 texture_pressed \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0430,  #\u043a\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u043b\u0430 \u0431\u044b \u0432\u0435\u0442\u0432\u044c, \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0431\u043e\u0440\u0430 texture_disabled = texture_pressed _description_Lbl.text = \"\" _description.visible = false #\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u043b\u0438 \u0441\u0438\u0433\u043d\u0430\u043b emit_signal(\"branch_pick\") #\u0412\u044b\u0437\u0432\u0430\u043b\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044e skill_up() #\u0423\u043c\u0435\u043d\u044c\u0448\u0438\u043b\u0438 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u0441\u0447\u0451\u0442\u0447\u0438\u043a get_parent().level_up_count -=1 disabled = true<\/code><\/pre>\n<p>\u041a\u043e\u0434 \u043f\u0440\u043e\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e, \u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0446\u0435\u043d\u0430 \u0432\u0435\u0442\u0432\u0438 \u0434\u0435\u0440\u0435\u0432\u0430, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u043d\u0430 \u0441\u0446\u0435\u043d\u0443 \u0434\u0435\u0440\u0435\u0432\u0430, \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u0432\u0441\u0435 export \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0438 \u043e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c.<\/p>\n<h2>\u0421\u0446\u0435\u043d\u0430 \u0434\u0435\u0440\u0435\u0432\u0430 \u0442\u0430\u043b\u0430\u043d\u0442\u043e\u0432<\/h2>\n<p>\u0413\u043b\u0430\u0432\u043d\u044b\u043c \u0443\u0437\u043b\u043e\u043c \u0441\u0446\u0435\u043d\u044b \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c Node2d, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c sprite \u0438 \u0434\u0430\u043b\u044c\u0448\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043d\u0430\u0448\u0435 \u0434\u0435\u0440\u0435\u0432\u043e. \u0412\u0441\u0435 \u0435\u0433\u043e \u0432\u0435\u0442\u0432\u0438 \u043c\u043e\u0436\u043d\u043e \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u043e \u0432\u0440\u0430\u0449\u0430\u0442\u044c.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b27\/362\/9f5\/b273629f50e98a68cf5f440dc9f9c2d0.png\" alt=\"\u041f\u0440\u0438\u043c\u0435\u0440\u043d\u044b\u0439 \u0432\u0438\u0434 \u0441\u0446\u0435\u043d\u044b\" title=\"\u041f\u0440\u0438\u043c\u0435\u0440\u043d\u044b\u0439 \u0432\u0438\u0434 \u0441\u0446\u0435\u043d\u044b\" width=\"768\" height=\"555\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b27\/362\/9f5\/b273629f50e98a68cf5f440dc9f9c2d0.png\"\/><\/p>\n<div><figcaption>\u041f\u0440\u0438\u043c\u0435\u0440\u043d\u044b\u0439 \u0432\u0438\u0434 \u0441\u0446\u0435\u043d\u044b<\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a6e\/526\/f2b\/a6e526f2bb4411470c6a6c89af94e278.png\" alt=\"\u0432\u0438\u0434 \u0432 \u0438\u0433\u0440\u0435\" title=\"\u0432\u0438\u0434 \u0432 \u0438\u0433\u0440\u0435\" width=\"1012\" height=\"731\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a6e\/526\/f2b\/a6e526f2bb4411470c6a6c89af94e278.png\"\/><\/p>\n<div><figcaption>\u0432\u0438\u0434 \u0432 \u0438\u0433\u0440\u0435<\/figcaption><\/div>\n<\/figure>\n<figure class=\"float\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/0a1\/b9b\/f01\/0a1b9bf013f43b750cc0ffb301a06b35.png\" width=\"283\" height=\"537\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/0a1\/b9b\/f01\/0a1b9bf013f43b750cc0ffb301a06b35.png\"\/><\/figure>\n<p>\u041a\u0430\u043a \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u0434\u0435\u0440\u0435\u0432\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0438 \u043d\u0430\u0437\u0432\u0430\u0442\u044c. \u042f \u043d\u0430\u0437\u044b\u0432\u0430\u043b \u0442\u0430\u043a: Layer\u2116Branch\u2116.<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440\u044b \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u0432\u0435\u0442\u0432\u0435\u0439:<\/p>\n<figure class=\"float\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ac3\/fd6\/833\/ac3fd68334b97d8e216323ba54c1ed2b.png\" width=\"399\" height=\"399\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ac3\/fd6\/833\/ac3fd68334b97d8e216323ba54c1ed2b.png\"\/><\/figure>\n<p>\u042d\u0442\u0430 \u0432\u0435\u0442\u0432\u044c \u0431\u0443\u0434\u0435\u0442 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u043d\u0430 10%, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u0440\u043d\u0435\u043c \u0434\u0435\u0440\u0435\u0432\u0430 \u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u0434\u0440\u0443\u0433\u0438\u0445 \u0432\u0435\u0442\u0432\u0435\u0439 \u043d\u0435\u0442.<\/p>\n<figure class=\"float\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/29e\/84d\/060\/29e84d06081a6178d7b038f8eea674c7.png\" width=\"402\" height=\"510\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/29e\/84d\/060\/29e84d06081a6178d7b038f8eea674c7.png\"\/><\/figure>\n<p>\u042d\u0442\u0430 \u0432\u0435\u0442\u0432\u044c \u0431\u0443\u0434\u0435\u0442 \u0443\u043b\u0443\u0447\u0448\u0430\u0442\u044c \u043e\u0440\u0443\u0436\u0438\u0435(\u0432\u0438\u043d\u0442\u043e\u0432\u043a\u0443), \u0422\u0430\u043a-\u0436\u0435 \u043d\u0430 \u044d\u0442\u043e\u043c-\u0436\u0435 \u0441\u043b\u043e\u0435 \u0435\u0441\u0442\u044c 4 \u0432\u0435\u0442\u0432\u0438 \u0438 \u0443\u043a\u0430\u0437\u0430\u043d\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0430\u044f.<\/p>\n<p>\u0421 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438 \u0441\u0446\u0435\u043d\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438\u0441\u044c, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442 \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e:<\/p>\n<pre><code class=\"python\">extends Node2D #\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0438\u0433\u0440\u043e\u043a\u0430, \u0431\u0443\u0434\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u043e \u0441\u0446\u0435\u043d\u044b \u0438\u0433\u0440\u044b var player #\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0445\u0440\u0430\u043d\u044f\u0449\u0430\u044f \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0440\u043e\u043a\u0430\u0447\u0435\u043a var level_up_count = 0 #\u0421\u0438\u0433\u043d\u0430\u043b \u043e \u043f\u0440\u043e\u043a\u0430\u0447\u043a\u0435 signal branch_skill_up(param, scale)   func _ready(): init_tree()  #\u0421\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u043d\u0430\u0436\u0430\u0442\u0438\u044f, \u0435\u0441\u043b\u0438 \u043d\u0430\u0436\u0430\u0442\u0430 \u043a\u043d\u043e\u043f\u0430\u043a \u043c\u0435\u043d\u044e, \u0442\u043e \u0441\u0442\u0430\u0432\u0438\u043c \u0438\u0433\u0440\u0443 \u043d\u0430 \u043f\u0430\u0443\u0437\u0443, #\u0438 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c, \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u043c\u0430\u0441\u0448\u0442\u0430\u0431, \u0438 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 func _process(delta): if (Input.is_action_just_pressed(\"menu\")): get_tree().paused = !get_tree().paused visible = !visible scale = Vector2(1,1) position = player.position #\u041f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u043c \u0441\u0438\u0433\u043d\u0430\u043b \u043e\u0442 \u0432\u0441\u0435\u0445 \u043f\u043e\u0442\u043e\u043c\u043a\u043e\u043c \u0438 \u043f\u0440\u043e\u043a\u0430\u0447\u043a\u0435 func init_tree(): for i in get_child_count(): get_child(i).connect(\"skill_up\",self,\"_on_branch_skill_up_\")  #\u041e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u044d\u0442\u043e\u0442 \u0441\u0438\u0433\u043d\u0430\u043b(\u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u044f \u0441\u0432\u043e\u0439)  func _on_branch_skill_up_(param, scale): emit_signal(\"branch_skill_up\",param,scale) <\/code><\/pre>\n<p>\u0422\u0430\u043a-\u0436\u0435 \u043d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0435\u043c \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0443 &#171;menu&#187;, \u0443 \u043c\u0435\u043d\u044f \u044d\u0442\u043e \u043f\u0440\u043e\u0431\u0435\u043b.<\/p>\n<p>\u0422\u0430\u043a-\u0436\u0435 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c, \u0447\u0442\u043e \u043f\u0430\u0443\u0437\u0430 \u043d\u0435 \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u0443 \u044d\u0442\u043e\u0439 \u0441\u0446\u0435\u043d\u044b. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u043a\u043e\u0440\u0435\u043d\u044c \u0441\u0446\u0435\u043d\u044b \u0434\u0435\u0440\u0435\u0432\u0430 \u0442\u0430\u043b\u0430\u043d\u0442\u043e\u0432, \u0432 \u0438\u043d\u0441\u043f\u0435\u043a\u0442\u043e\u0440\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u043c pause mode \u0438 \u0441\u0442\u0430\u0432\u0438\u043c \u0435\u0433\u043e \u0432 Process<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c, \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432 \u043e \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u0438 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a \u0438 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043e\u0440\u0443\u0436\u0438\u0435.<\/p>\n<h3>\u041e\u0440\u0443\u0436\u0438\u0435<\/h3>\n<p>\u041d\u0430\u0447\u043d\u0451\u043c \u0441 \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043e\u0440\u0443\u0436\u0438\u044f. \u0411\u043b\u0430\u0441\u0442\u0435\u0440 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0441\u0442\u0440\u0435\u043b\u0438\u0432\u0430\u0442\u044c \u043f\u043e 2 \u043f\u0443\u043b\u0438, \u0434\u0440\u043e\u0431\u043e\u0432\u0438\u043a \u0432\u044b\u0441\u0442\u0440\u0435\u043b\u0438\u0432\u0430\u0442\u044c 11 \u043f\u0443\u043b\u044f\u043c\u0438, \u0443 \u0432\u0438\u043d\u0442\u043e\u0432\u043a\u0438 \u043f\u0435\u0440\u0435\u0437\u0430\u0440\u044f\u0434\u043a\u0430 \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u0441\u044f \u043d\u0430 50%, \u0440\u0430\u0434\u0438\u0443\u0441 \u0432\u0437\u0440\u044b\u0432\u0430 \u0443 \u0431\u0430\u0437\u0443\u043a\u0438 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u0441\u044f \u043d\u0430 50%. \u0417\u043d\u0430\u0447\u0438\u0442 \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u044b: <\/p>\n<ul>\n<li>\n<p>\u0421\u043a\u0440\u0438\u043f\u0442 \u0431\u043b\u0430\u0441\u0442\u0435\u0440\u0430<\/p>\n<\/li>\n<li>\n<p>\u0421\u043a\u0440\u0438\u043f\u0442 \u0434\u0440\u043e\u0431\u043e\u0432\u0438\u043a\u0430<\/p>\n<\/li>\n<li>\n<p>\u0421\u043a\u0440\u0438\u043f\u0442 \u0432\u0438\u043d\u0442\u043e\u0432\u043a\u0438<\/p>\n<\/li>\n<li>\n<p>\u0421\u043a\u0440\u0438\u043f\u0442 \u0440\u0430\u043a\u0435\u0442\u044b \u0434\u043b\u044f \u0431\u0430\u0437\u0443\u043a\u0438<\/p>\n<\/li>\n<\/ul>\n<h4>\u0421\u043a\u0440\u0438\u043f\u0442 \u0431\u043b\u0430\u0441\u0442\u0435\u0440\u0430<\/h4>\n<p>\u0412 \u0434\u0435\u0440\u0435\u0432\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c Timer(SecondFire), \u0432\u044b\u0441\u0442\u0430\u0432\u0438\u0442\u044c OneShot = true, Wait Timer = 0,1<\/p>\n<pre><code class=\"python\">#\u0414\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u0442\u0430\u0439\u043c\u0435\u0440 onready var _second_fire = $SecondFire  func fire(): if (_fire_couldown_timer.is_stopped()): # \u043d\u0435 \u043d\u0430 \u043f\u0435\u0440\u0435\u0437\u0430\u0440\u044f\u0434\u043a\u0435 #\u0415\u0441\u043b\u0438 \u043e\u0440\u0443\u0436\u0438\u0435 \u0421\u0443\u043f\u0435\u0440\u0441\u043a\u043e\u0435, \u0442\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0442\u0430\u0439\u043c\u0435\u0440 if (WeaponsName.blaster_up): _second_fire.start() spawn_bullet(0) # \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043f\u0443\u043b\u044e \u0441 0-\u043c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u043e\u043c _fire_couldown_timer.start() _weapon_sound.play()  #\u0422\u0430\u0439\u043c\u0435\u0440 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u043b, \u0441\u0442\u0440\u0435\u043b\u044f\u0435\u043c func _on_SecondFire_timeout(): spawn_bullet(0)<\/code><\/pre>\n<h4>\u0421\u043a\u0440\u0438\u043f\u0442 \u0434\u0440\u043e\u0431\u043e\u0432\u0438\u043a\u0430<\/h4>\n<pre><code class=\"python\">func fire(): if (_fire_couldown_timer.is_stopped()): if (WeaponsName.shotgun_up): spawn_bullet(5*PI\/12)# \u041f\u043e\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u043f\u0443\u043b\u044e \u043d\u0430 ~37,5 \u0433\u0440\u0430\u0434\u0443\u0441\u043e\u0432 spawn_bullet(4*PI\/12)# \u041f\u043e\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u043f\u0443\u043b\u044e \u043d\u0430 ~ 30 \u0433\u0440\u0430\u0434\u0443\u0441\u043e\u0432 spawn_bullet(3*PI\/12)# \u041f\u043e\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u043f\u0443\u043b\u044e \u043d\u0430 ~ 22,5 \u0433\u0440\u0430\u0434\u0443\u0441\u043e\u0432 spawn_bullet(2*PI\/12)# \u041f\u043e\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u043f\u0443\u043b\u044e \u043d\u0430 ~ 15 \u0433\u0440\u0430\u0434\u0443\u0441\u043e\u0432 spawn_bullet(PI\/12)# \u041f\u043e\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u043f\u0443\u043b\u044e \u043d\u0430 ~ 7,5 \u0433\u0440\u0430\u0434\u0443\u0441\u043e\u0432 spawn_bullet(0)# \u0432\u044b\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043f\u0443\u043b\u044e \u043f\u0440\u044f\u043c\u043e spawn_bullet(-PI\/12)# \u041f\u043e\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u043f\u0443\u043b\u044e \u043d\u0430 ~ -7,5 \u0433\u0440\u0430\u0434\u0443\u0441\u043e\u0432 spawn_bullet(-2*PI\/12)# \u041f\u043e\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u043f\u0443\u043b\u044e \u043d\u0430 ~ -15 \u0433\u0440\u0430\u0434\u0443\u0441\u043e\u0432 spawn_bullet(-3*PI\/12)# \u041f\u043e\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u043f\u0443\u043b\u044e \u043d\u0430 ~ -22,5 \u0433\u0440\u0430\u0434\u0443\u0441\u043e\u0432 spawn_bullet(-4*PI\/12)# \u041f\u043e\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u043f\u0443\u043b\u044e \u043d\u0430 ~ -30 \u0433\u0440\u0430\u0434\u0443\u0441\u043e\u0432 spawn_bullet(-5*PI\/12)# \u041f\u043e\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u043f\u0443\u043b\u044e \u043d\u0430 ~ -37,5 \u0433\u0440\u0430\u0434\u0443\u0441\u043e\u0432 else: spawn_bullet(PI\/12)# \u041f\u043e\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u043f\u0443\u043b\u044e \u043d\u0430 ~15 \u0433\u0440\u0430\u0434\u0443\u0441\u043e\u0432 spawn_bullet(PI\/24)# \u041f\u043e\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u043f\u0443\u043b\u044e \u043d\u0430 ~7,5 \u0433\u0440\u0430\u0434\u0443\u0441\u043e\u0432 spawn_bullet(0)# \u0432\u044b\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043f\u0443\u043b\u044e \u043f\u0440\u044f\u043c\u043e spawn_bullet(-PI\/24)# \u041f\u043e\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u043f\u0443\u043b\u044e \u043d\u0430 ~-7,5 \u0433\u0440\u0430\u0434\u0443\u0441\u043e\u0432 spawn_bullet(-PI\/12)# \u041f\u043e\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u043f\u0443\u043b\u044e \u043d\u0430 ~-15 \u0433\u0440\u0430\u0434\u0443\u0441\u043e\u0432 _fire_couldown_timer.start()# \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043f\u0435\u0440\u0435\u0437\u0430\u0440\u044f\u0434\u043a\u0443 _weapon_sound.play()<\/code><\/pre>\n<h4>\u0421\u043a\u0440\u0438\u043f\u0442 \u0432\u0438\u043d\u0442\u043e\u0432\u043a\u0438<\/h4>\n<pre><code class=\"python\">func fire(): if(_fire_couldown_timer.is_stopped()): spawn_bullet(0) _fire_couldown_timer.start() if (WeaponsName.rifle_up): fire_rate *= 0.5 #\u0415\u0441\u043b\u0438 \u043e\u0440\u0443\u0436\u0438\u0435 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u043e, \u0443\u043c\u043d\u043e\u0436\u0430\u0435\u043c \u043d\u0430 0.5 _fire_couldown_timer.wait_time = fire_rate _weapon_sound.play()<\/code><\/pre>\n<p>\u0421\u043a\u0440\u0438\u043f\u0442 \u0440\u0430\u043a\u0435\u0442\u044b \u0434\u043b\u044f \u0431\u0430\u0437\u0443\u043a\u0438<\/p>\n<pre><code class=\"python\">extends \"res:\/\/scenes\/Weapons\/DefaultWeapon\/DefaultBullet.gd\"  onready var _collision_shape = $CollisionShape2D#\u0424\u0438\u0433\u0443\u0440\u0430 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0439 \u0440\u0430\u043a\u0435\u0442\u044b onready var _collision_shape_bum = $Bum\/CollisionShapeBum#\u0424\u0438\u0433\u0443\u0440\u0430 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0439 \u0432\u0437\u0440\u044b\u0432\u0430 onready var _bum_live_time = $Bum\/BumLiveTime #\u0422\u0430\u0439\u043c\u0435\u0440 \u0436\u0438\u0437\u043d\u0438 \u0432\u0437\u0440\u044b\u0432\u0430 onready var _bum_sound = $Bum\/BumSound #\u0417\u0432\u0443\u043a \u0432\u0437\u0440\u044b\u0432\u0430  func collision_action(_collision_object):# \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u0441\u043d\u0430\u0440\u044f\u0434\u0430 if(_animated_sprite.animation == \"Fly\"):# \u0435\u0441\u043b\u0438 \u043e\u043d \u0431\u044b\u043b \u0441\u043d\u0430\u0440\u044f\u0434\u043e\u043c _animated_sprite.play(\"Bum\")# \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0432 \u0432\u0437\u0440\u044b\u0432 _collision_shape.disabled = true # \u0432\u044b\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043e\u0431\u044b\u0447\u043d\u0443\u044e \u0444\u0438\u0433\u0443\u0440\u0443 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f _collision_shape_bum.disabled = false # \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0444\u0438\u0433\u0443\u0440\u0443 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u0432\u0437\u0440\u044b\u0432\u0430 if(WeaponsName.bazooka_up):#\u0435\u0441\u043b\u0438 \u043e\u0440\u0443\u0436\u0438\u0435 \u0441\u0443\u043f\u0435\u0440 scale = Vector2(15,15) else: scale = Vector2(10,10)  # \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0440\u0430\u0437\u043c\u0435\u0440 \u0432 10 \u0440\u0430\u0437,  #\u0443 \u0432\u0430\u0441 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432 \u0434\u0440\u0443\u0433\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0430\u0437, \u0434\u043b\u044f \u043c\u043e\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u044d\u0442\u043e \u0432 \u0441\u0430\u043c\u044b\u0439 \u0440\u0430\u0437 velocity=Vector2(position.x,position.y) _bum_live_time.start() _bum_sound.play() func _on_Bum_body_entered(body): if(body.has_method(\"hit\")): body.hit(damage)   func _on_BumLiveTime_timeout(): queue_free() <\/code><\/pre>\n<p>\u0421 \u043e\u0440\u0443\u0436\u0438\u0435\u043c \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u0438, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0443.<\/p>\n<h3>\u0411\u043e\u043b\u0432\u0430\u043d\u043a\u0430 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436<\/h3>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e, \u0432 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0446\u0435\u043d\u0443 \u0434\u0435\u0440\u0435\u0432\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432.<\/p>\n<pre><code class=\"python\">export (NodePath) var skill_tree# \u0434\u0435\u0440\u0435\u0432\u043e \u043d\u0430\u0432\u044b\u043a\u043e\u0432<\/code><\/pre>\n<p>\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 _ready(), \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u0442\u044c \u0441\u0438\u0433\u043d\u0430\u043b \u043e\u0442 \u043d\u0430\u0448\u0435\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430.<\/p>\n<pre><code class=\"python\">#\u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u0434\u0435\u0440\u0435\u0432\u043e, \u0442\u043e \u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u043c \u0435\u0433\u043e \u0441\u0438\u0433\u043d\u0430\u043b var tree = get_node(skill_tree) if (tree != null): tree.connect(\"branch_skill_up\",self,\"_on_SkillTree_branch_skill_up\")<\/code><\/pre>\n<p>\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u043e\u0442 \u0434\u0435\u0440\u0435\u0432\u0430 _on_SkillTree_branch_skill_up, \u043d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0439\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c 2 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u0434\u043b\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0432\u0435\u0434\u044c \u0441\u0438\u0433\u043d\u0430\u043b \u0443 \u043d\u0430\u0441 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 2 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445.<\/p>\n<pre><code class=\"python\">#\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u043e\u0442 \u0434\u0435\u0440\u0435\u0432\u0430 func _on_SkillTree_branch_skill_up(param, scale): #\u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 match param: 0:#\u0443\u0440\u043e\u043d damage_scale += damage_scale * scale\/100# \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0443\u0440\u043e\u043d 1:#\u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c speed += speed * scale\/100# \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c 2:#\u0445\u043f health += round(health * scale\/100)# \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u043c \u0445\u043f _user_interface.init_health(health)#\u043f\u0435\u0440\u0435\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c ui _: pass<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u041f\u043e\u043b\u043d\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 \u0431\u043e\u043b\u0432\u0430\u043d\u043a\u0438 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">extends KinematicBody2D   #\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0434\u0435\u0440\u0435\u0432\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0432 \u043a\u043e\u0434 onready var _animated_sprite = $AnimatedSprite onready var _idle_animation_timer = $IdleAnimationTimer onready var _immortal_timer = $ImmortalTimer onready var _backpack = $Backpack onready var _user_interface = $Camera2D\/UserInterface #\u041e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u043c\u0435\u043d\u044f\u0442\u044c \u0438\u0437\u0432\u043d\u0435  export var health = 5 #\u0416\u0438\u0437\u043d\u0438 export var speed = 200 #\u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c  export var damage_scale:float = 1#\u041c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u044c \u0443\u0440\u043e\u043d\u0430 export (NodePath) var skill_tree# \u0434\u0435\u0440\u0435\u0432\u043e \u043d\u0430\u0432\u044b\u043a\u043e\u0432 #\u041e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u043a\u0440\u0438\u043f\u0442\u0430 var velocity = Vector2.ZERO #\u0412\u0435\u043a\u0442\u043e\u0440 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f var direction = Vector2.ZERO #\u0412\u0435\u043a\u0442\u043e\u0440 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f var backpack_items = [null,null,null,null,null,null]#\u0440\u044e\u043a\u0437\u0430\u043a var weapon_count = 0 #\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0445\u0440\u0430\u043d\u044f\u0449\u0430\u044f \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u0440\u0443\u0436\u0438\u044f #\u0421\u0438\u0433\u043d\u0430\u043b \u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u0443\u0440\u043e\u043d\u0430 signal take_damage(damage) #\u0421\u0438\u0433\u043d\u0430\u043b \u043e \u0441\u043c\u0435\u0440\u0442\u0438 signal dead #\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u043d\u0430\u0436\u0430\u0442\u0438\u0439 func get_input(): velocity = Vector2.ZERO if Input.is_action_pressed(\"left\"): velocity.x -= 1 if Input.is_action_pressed(\"right\"): velocity.x += 1 if Input.is_action_pressed(\"up\"): velocity.y -= 1 if Input.is_action_pressed(\"down\"): velocity.y += 1 direction = velocity.normalized() * speed  #\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0439 func get_anim(): if (_immortal_timer.is_stopped()): #\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0435 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f-\u043b\u0438 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044f \u0431\u0435\u0441\u0441\u043c\u0435\u0440\u0442\u0438\u044f if (velocity != Vector2.ZERO): #\u0415\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f, \u0442\u043e \u0438\u0434\u0451\u043c  _animated_sprite.play(\"Walk\") else: if (_animated_sprite.animation != \"IdleAnimation\"): #\u0418\u043d\u0430\u0447\u0435 \u0435\u0441\u043b\u0438 \u043d\u0435 \u0431\u0440\u0443\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044f, \u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0442\u043e\u0438\u043c _animated_sprite.play(\"Stand\") if (_idle_animation_timer.is_stopped()): #\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043e\u0442\u0447\u0451\u0442 \u0434\u043e \u0431\u0440\u0443\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 _idle_animation_timer.start() if (velocity.x > 0): # \u043f\u043e\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430 \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0443 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f _animated_sprite.flip_h = false  if (velocity.x &lt; 0): _animated_sprite.flip_h = true  #\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0443\u0440\u043e\u043d\u0430 func take_damage(dmg): if(_immortal_timer.is_stopped()): #\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0435 \u0431\u0435\u0441\u0441\u043c\u0435\u0440\u0442\u0435\u043d \u043b\u0438 \u043d\u0430\u0448 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436 health -= dmg _animated_sprite.play(\"TakeDamage\") emit_signal(\"take_damage\",dmg) #\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u0438\u0433\u043d\u0430\u043b \u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u0443\u0440\u043e\u043d\u0430 _user_interface.take_damage(dmg) _immortal_timer.start() #\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0442\u0430\u0439\u043c\u0435\u0440 \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0443\u0440\u043e\u043d\u0430 if(health &lt;= 0): emit_signal(\"dead\")#\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u0438\u0433\u043d\u0430\u043b \u043e \u0441\u043c\u0435\u0440\u0442\u0438   func _ready(): _animated_sprite.animation = \"Stand\" # \u041f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436 \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0442\u043e\u044f\u0442\u044c equip_all() #\u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u0434\u0435\u0440\u0435\u0432\u043e, \u0442\u043e \u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u043c \u0435\u0433\u043e \u0441\u0438\u0433\u043d\u0430\u043b var tree = get_node(skill_tree) if (tree != null): tree.connect(\"branch_skill_up\",self,\"_on_SkillTree_branch_skill_up\")   func _physics_process(delta): get_input() get_anim() var collider = move_and_collide(direction * delta) # \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e collider \u0434\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f   func _on_IdleAnimationTimer_timeout(): _animated_sprite.play(\"IdleAnimation\") # \u0412\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0411\u0420\u0423\u0422\u0410\u041b\u042c\u041d\u0423\u042e \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044e \u043f\u043e \u0438\u0441\u0442\u0435\u0447\u0435\u043d\u0438\u0438 \u0442\u0430\u0439\u043c\u0435\u0440\u0430  #\u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u0435\u043d\u0438\u044f \u043e\u0440\u0443\u0436\u0438\u044f func equip_item(slot):# \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u043d\u043e\u043c\u0435\u0440 \u0441\u043b\u043e\u0442\u0430 \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043d\u0443\u0436\u043d\u043e \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u043e\u0440\u0443\u0436\u0438\u0435 if (backpack_items[slot] != null):#\u0415\u0441\u043b\u0438 \u0441\u043b\u043e\u0442 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d var weapon = backpack_items[slot].instance() weapon.position = _backpack.get_slot_position(slot)#\u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u043e\u0437\u0438\u0446\u0443\u044e \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u043b\u043e\u0442\u0430 weapon.name = \"WeaponSlot\" + String(slot)#\u0418\u043c\u0435\u043d\u044f \u043e\u0440\u0443\u0436\u0438\u044f WeaponSlot0..5 add_child(weapon) weapon.scale = Vector2(0.5,0.5)# \u0443 \u043c\u0435\u043d\u044f \u0441\u0442\u043e\u0438\u0442 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0440\u0443\u0436\u0438\u0435, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0443 \u0432\u0430\u0441 \u043d\u0435\u0442 weapon.damage = ceil(weapon.damage*damage_scale)#\u041f\u0435\u0440\u0435\u043c\u043d\u043e\u0436\u0430\u0435\u043c \u0443\u0440\u043e\u043d \u0441 \u043d\u0430\u0448\u0438\u043c \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u043c \u0438 \u043e\u043a\u0440\u0443\u0433\u043b\u044f\u0435\u043c \u0432 \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0441\u0442\u043e\u0440\u043e\u043d\u0443   #\u043e\u0434\u0435\u0432\u0430\u0435\u043c \u0432\u0441\u0451 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0435 \u043e\u0440\u0443\u0436\u0438\u0435 func equip_all(): for i in range(6):#\u041f\u0440\u043e\u0431\u0435\u0433\u0430\u0435\u043c \u043f\u043e \u0432\u0441\u0435\u043c\u0443 \u043c\u0430\u0441\u0441\u0438\u0432\u0443 backpack_item if(get_node(\"WeaponSlot\"+String(i)) != null): var item =get_node(\"WeaponSlot\"+String(i)) #\u0418\u0449\u0435\u043c \u0443\u0437\u0435\u043b if (item != null): #\u0415\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u0442\u043e \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u0435\u0433\u043e \u0441\u043e \u0441\u0446\u0435\u043d\u044b item.queue_free() equip_item(i)# \u0438 \u0440\u0438\u0441\u0443\u0435\u043c \u043d\u043e\u0432\u044b\u0439  #\u0443\u0434\u0430\u043b\u044f\u0435\u043c \u043e\u0440\u0443\u0436\u0438\u0435 func remove_equip_item(slot):#\u041f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u043d\u043e\u043c\u0435\u0440 \u0441\u043b\u043e\u0442\u0430 if (slot >= 0 &amp;&amp; slot &lt;=5):#\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u043e\u043c\u0435\u0440 \u0441\u043b\u043e\u0442\u0430 var item = get_node(\"WeaponSlot\" + slot) backpack_items[slot] = null#\u043e\u0431\u043d\u0443\u043b\u044f\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u0440\u044e\u043a\u0437\u0430\u043a\u0435 item.queue_free()#\u0443\u0434\u0430\u043b\u044f\u0435\u043c \u043e\u0431\u044a\u0435\u043a\u0442 weapon_count -=1 #\u0443\u043c\u0435\u043d\u044c\u0448\u0438\u043b\u0438 \u043d\u0430 1 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043e\u0440\u0443\u0436\u0438\u044f  #\u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043e\u0440\u0443\u0436\u0438\u0435 func add_equip_item(item): for i in range(6): if (backpack_items[i] == null):#\u041d\u0430\u0445\u043e\u0434\u0438\u043c \u043f\u0435\u0440\u0432\u044b\u0439 \u043f\u0443\u0441\u0442\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 backpack_items[i] = item#\u0437\u0430\u043b\u0438\u0432\u0430\u0435\u043c \u0432 \u043d\u0435\u0433\u043e \u0441\u0446\u0435\u043d\u0443 \u043e\u0440\u0443\u0436\u0438\u044f weapon_count +=1 #\u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043b\u0438 \u043d\u0430 1 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043e\u0440\u0443\u0436\u0438\u044f equip_all()#\u041e\u0434\u0435\u0432\u0430\u0435\u043c \u0432\u0441\u0451 \u043e\u0440\u0443\u0436\u0438\u0435 return #\u041c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043e\u0440\u0443\u0436\u0438\u0435 func can_add(): if (weapon_count &lt; 6): return true else: return false #\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u043e\u0442 \u0434\u0435\u0440\u0435\u0432\u0430 func _on_SkillTree_branch_skill_up(param, scale): #\u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 match param: 0:#\u0443\u0440\u043e\u043d damage_scale += damage_scale * scale\/100# \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0443\u0440\u043e\u043d 1:#\u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c speed += speed * scale\/100# \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c 2:#\u0445\u043f health += round(health * scale\/100)# \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u043c \u0445\u043f _user_interface.init_health(health)#\u043f\u0435\u0440\u0435\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c ui _: pass <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u043a \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 \u0441\u0446\u0435\u043d\u044b \u0438\u0433\u0440\u044b \u0438 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u0441\u043a\u0440\u0438\u043f\u0442\u0430 \u0438\u0433\u0440\u044b.<\/p>\n<h3>\u0421\u0446\u0435\u043d\u0430 \u0438\u0433\u0440\u044b<\/h3>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432 \u0434\u0435\u0440\u0435\u0432\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0441\u0446\u0435\u043d\u0443 \u0434\u0435\u0440\u0435\u0432\u0430 \u0443\u043c\u0435\u043d\u0438\u0439. \u0418 \u043f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u043a \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u0441\u043a\u0440\u0438\u043f\u0442\u0430 \u0438\u0433\u0440\u044b.<\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u0431\u044a\u044f\u0432\u0438\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0434\u0435\u0440\u0435\u0432\u0430 \u0432 \u043a\u043e\u0434\u0435. <\/p>\n<pre><code class=\"python\">onready var _skill_tree = $SkillTree<\/code><\/pre>\n<p>\u0412 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 _ready(), \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0443 \u043d\u0430\u0448\u0435\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043e\u0439 \u0438\u0433\u0440\u043e\u043a\u0430 \u0432 \u0434\u0435\u0440\u0435\u0432\u043e \u0442\u0430\u043b\u0430\u043d\u0442\u043e\u0432<\/p>\n<pre><code class=\"python\">_skill_tree.player = player#\u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u043c \u0438\u0433\u0440\u043e\u043a\u0430 \u043a \u0434\u0435\u0440\u0435\u0432\u0443<\/code><\/pre>\n<p>\u0422\u0430\u043a-\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043e\u0447\u0438\u0449\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0434\u0435\u043b\u0430\u0442\u044c \u0432\u0441\u0451 \u043e\u0440\u0443\u0436\u0438\u0435 \u043e\u0431\u044b\u0447\u043d\u044b\u043c \u0438 \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u0432\u0441\u0435\u0445 \u0432\u0440\u0430\u0433\u043e\u0432 \u0441\u043e \u0441\u0446\u0435\u043d\u044b \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0435\u0451 \u0438\u0437 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 dead \u043e\u0442 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430.<\/p>\n<pre><code class=\"python\">func clear_level(): WeaponsName.clear_all()#\u0443\u0431\u0438\u0440\u0430\u0435\u043c \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f \u0441 \u043e\u0440\u0443\u0436\u0438\u044f get_tree().call_group(\"all_enemy\", \"queue_free\")#\u0423\u0434\u0430\u043b\u044f\u0435\u043c \u0432\u0441\u0435\u0445 \u0432\u0440\u0430\u0433\u043e\u0432 \u0441\u043e \u0441\u0446\u0435\u043d\u044b  #\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u0438\u0433\u043d\u0430\u043b, \u043e\u0442 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430 \u043e \u0441\u043c\u0435\u0440\u0442\u0438 func _on_Player_dead(): save_record(player._user_interface.get_score())#\u0437\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b clear_level() SceneLoader.build_map_path(\"MainMenu\")#\u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u0432 \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u043c\u0435\u043d\u044e<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u041f\u043e\u043b\u043d\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 \u0441\u0446\u0435\u043d\u044b \u0438\u0433\u0440\u044b<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">extends Node2D   #\u0421\u0446\u0435\u043d\u0430 \u0412\u0440\u0430\u0433\u0430 export (PackedScene) var zombie_enemy  #\u042d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0434\u0435\u0440\u0435\u0432\u0430 onready var _mob_spawn_timer = $MobSpawnTimer onready var player = $Player onready var _character_spawn_point = $CharacterSpawnPoint onready var spawn = $Spawn onready var _skill_tree = $SkillTree #\u041c\u0430\u0441\u0441\u0438\u0432 \u0432\u0441\u0435\u0433\u043e \u043e\u0440\u0443\u0436\u0438\u044f var weapon_massiv = [WeaponsName.BLASTER,WeaponsName.RIFLE, WeaponsName.BAZOOKA, WeaponsName.SHOTGUN] #\u0421\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0433\u0440\u044b var spawn_time = 5 #\u0412\u0440\u0435\u043c\u044f \u0447\u0430\u0441\u0442\u043e\u0442\u044b \u0441\u043f\u0430\u0432\u043d\u0430 \u0432\u0440\u0430\u0433\u043e\u0432 var zombie1_chance = 40#\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e \u0437\u043e\u043c\u0431\u0438 var smart_chance = 40#\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u0443\u043c\u043d\u043e\u0433\u043e \u0437\u043e\u043c\u0431\u0438 var shield_chance = 12#\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u0437\u043e\u043c\u0431\u0438 \u0441 \u0449\u0438\u0442\u043e\u043c var scary_chance = 4#\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u0441\u0442\u0440\u0430\u0448\u043d\u043e\u0433\u043e \u0437\u043e\u043c\u0431\u0438 var fat_chance = 4#\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u0442\u043e\u043b\u0441\u0442\u043e\u0433\u043e \u0437\u043e\u043c\u0431\u0438 var spawn_count = 3#\u043a\u043e\u043b-\u0432\u043e \u043f\u0440\u0438\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0445 \u0437\u043e\u043c\u0431\u0438 var difficult_tick = 0#\u043a\u043e\u043b-\u0432\u043e \u0440\u0430\u0437, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u043b\u0430\u0441\u044c \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c var weapon_add_chance = 0#\u0448\u0430\u043d\u0441 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043e\u0432  #\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0440\u0438\u0437\u044b\u0432\u0430 \u0442\u043e\u0447\u043a\u0438 \u0441\u043f\u0430\u0432\u043d\u0430 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u0446\u0435\u043d\u0430 \u0441 \u0432\u0440\u0430\u0433\u043e\u043c func spawn_point(enemy): var z = EnemyNames.SPAWNPOINT.instance() var rect_pos = spawn.rect_global_position var rect_size = spawn.rect_size #\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u0432\u0435\u043a\u0442\u043e\u0440 \u0441 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0437\u043e\u043c\u0431\u0438 \u043f\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u0441\u044f #\u0434\u043b\u044f \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u043f\u043e \u0445 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430: #\u0431\u0435\u0440\u0451\u043c \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0430 \u043e\u043f \u0445, \u043a\u0430\u043a \u043c\u0438\u043d\u043d\u0438\u043c\u0443\u043c #\u0438 \u0433\u043b\u043e\u0431\u0430\u043b \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u043e \u0445 + \u0440\u0430\u0437\u043c\u0435\u0440 \u043f\u043e \u0445, \u043a\u0430\u043a \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c #\u0434\u043b\u044f y \u0442\u043e\u0436\u0435 \u0441\u0430\u043c\u043e\u0435, \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043c\u0435\u0441\u0442\u043e \u0445-y z.position = Vector2(rand_range(rect_pos.x,rect_pos.x+rect_size.x),rand_range(rect_pos.y,rect_pos.y+rect_size.y)) z.z_index = 100#\u0421\u0442\u0430\u0432\u0438\u043c z_index \u0431\u043e\u043b\u044c\u0448\u0438\u043c, \u0447\u0442\u043e\u0431\u044b \u0442\u043e\u0447\u043a\u0430 \u0441\u043f\u0430\u0432\u043d\u0430 \u0432\u0441\u0435\u0433\u0434\u0430 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0433\u0430\u043b\u0430\u0441\u044c \u043f\u043e\u0432\u0435\u0440\u0445 \u0434\u0440\u0443\u0433\u0438\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 z.player = player#\u0417\u0430\u0434\u0430\u0451\u043c \u0438\u0433\u0440\u043e\u043a\u0430 z.zombie_enemy = enemy#\u0417\u0430\u0434\u0430\u0451\u043c \u0432\u0440\u0430\u0433\u0430 get_parent().add_child(z)# \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0442\u043e\u0447\u043a\u0443 \u0441\u043f\u0430\u0432\u043d\u0430  #\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 func _init(): spawn_hero(Vector2(0,0))#\u0412\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0433\u0435\u0440\u043e\u044f  #\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u0442\u0430\u0440\u0442\u0430(\u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043f\u043e\u0441\u043b\u0435 _init) func _ready(): _mob_spawn_timer.start()#\u0412\u043a\u043b\u044e\u0447\u0438\u043b\u0438 \u0442\u0430\u0439\u043c\u0435\u0440 \u0441\u043f\u0430\u0432\u043d\u0430 _skill_tree.player = player#\u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u043c \u0438\u0433\u0440\u043e\u043a\u0430 \u043a \u0434\u0435\u0440\u0435\u0432\u0443 randomize()# \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b player.position = _character_spawn_point.global_position #\u041f\u0435\u0440\u0435\u0434\u0430\u043b\u0438 \u0438\u0433\u0440\u043e\u043a\u0443 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0435 \u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 player._user_interface.init_health(player.health)# \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043d\u0430\u0448 UI player.connect(\"dead\",self,\"_on_Player_dead\")#\u041f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u043c \u0441\u0438\u0433\u043d\u0430\u043b \u043e \u0441\u043c\u0435\u0440\u0442\u0438 \u0438\u0433\u0440\u043e\u043a\u0430  #\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u0442\u0430\u0439\u043c\u0435\u0440\u0430 MobSpawnTimer func _on_MobSpawnTimer_timeout(): #\u0417\u0430\u0434\u0430\u0451\u043c \u0446\u0438\u043a\u043b \u0434\u043b\u044f \u043f\u0440\u0438\u0437\u044b\u0432\u0430 \u0437\u043e\u043c\u0431\u0438 for i in range(spawn_count): #\u0413\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u0448\u0430\u043d\u0441, \u0434\u0435\u043b\u0430\u0435\u043c \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u043e\u0442 \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043d\u0430 101 - \u0431\u0443\u0434\u0443\u0442 \u0447\u0438\u0441\u043b\u0430 \u0432 \u0440\u0430\u0434\u0438\u0443\u0441\u0435 \u043e\u0442 (0 \u0434\u043e 100) var chance = randi() % 101 if (chance &lt;= zombie1_chance): spawn_point(EnemyNames.ZOMBIE1) elif (chance &lt;= zombie1_chance + smart_chance): spawn_point(EnemyNames.SMARTZOMBIE) elif (chance &lt;= zombie1_chance + smart_chance + shield_chance): spawn_point(EnemyNames.ZOMBIESHEILD) elif (chance &lt;= zombie1_chance + smart_chance + shield_chance + scary_chance): spawn_point(EnemyNames.ZOMBIESCARY) elif (chance &lt;= zombie1_chance + smart_chance + + shield_chance + scary_chance + fat_chance): spawn_point(EnemyNames.FATZOMBIE) #\u0415\u0441\u043b\u0438 \u0432\u0434\u0440\u0443\u0433 \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u0448\u043b\u043e \u043d\u0435 \u0442\u0430\u043a, \u0442\u043e \u0441\u043f\u0430\u0432\u043d\u0438\u043c Zombie1 else: spawn_point(EnemyNames.ZOMBIE1) #\u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0441\u043b\u0435\u0434. \u0434\u0430\u043d\u043d\u044b\u0445 #zombie1_chance = 40 #smart_chance = 40 #shield_chance = 12 #scary_chance = 4 #fat_chance = 4 #\u0415\u0441\u043b\u0438 \u043e\u0442 0 \u0434\u043e 40, \u0442\u043e Zombie1, \u0435\u0441\u043b\u0438 \u043e\u0442 41 \u0434\u043e 80, \u0442\u043e Smart_zombie, #\u0415\u0441\u043b\u0438 \u0442\u043e 81 \u0434\u043e 92, \u0442\u043e Zombie_shield, \u0435\u0441\u043b\u0438 \u043e\u0442 93 \u0434\u043e 96, \u0442\u043e Zombie_scary #\u0415\u0441\u043b\u0438 \u043e\u0442 97 \u0434\u043e 100, \u0442\u043e Fat_zombie _mob_spawn_timer.wait_time = spawn_time#\u0437\u0430\u0434\u0430\u043b\u0438 \u0432\u0440\u0435\u043c\u044f \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043d\u0438\u044f _mob_spawn_timer.start()#\u0432\u043a\u043b\u044e\u0447\u0438\u043b\u0438    #\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u0438\u0433\u043d\u0430\u043b, \u043e\u0442 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430 \u043e \u0441\u043c\u0435\u0440\u0442\u0438 func _on_Player_dead(): save_record(player._user_interface.get_score())#\u0437\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b clear_level() SceneLoader.build_map_path(\"MainMenu\")#\u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u0432 \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u043c\u0435\u043d\u044e  #\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0433\u0435\u0440\u043e\u044f func spawn_hero(pos): var p if(SelectedCharacter.Character != null):#\u0415\u0441\u043b\u0438 \u0433\u0435\u0440\u043e\u0439 \u0432\u044b\u0431\u0440\u0430\u043d p = SelectedCharacter.Character.instance() else:#\u0415\u0441\u043b\u0438 \u0432\u0434\u0440\u0443\u0433 \u043a\u0430\u043a\u0438\u043c-\u0442\u043e \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043d\u0435 \u0432\u044b\u0431\u0440\u0430\u043d p = CharacterNames.BRUTALHERO.instance() p.name = \"Player\"#\u0417\u0430\u0434\u0430\u0451\u043c \u0438\u043c\u044f, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432 \u0434\u0435\u0440\u0435\u0432\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 p.position = pos add_child(p) p.skill_tree=\"..\/SkillTree\" player = p p.z_index = 2#\u0417\u0430\u0434\u0430\u0451\u043c z_index - 2, \u0447\u0442\u043e\u044b\u0431 \u0433\u0435\u0440\u043e\u0439 \u0445\u043e\u0434\u0438\u043b \u0441\u0432\u0435\u0440\u0445\u0443 \u043a\u0440\u043e\u0432\u0438   #\u0423\u0441\u043b\u043e\u0436\u043d\u044f\u0435\u043c \u0438\u0433\u0440\u0443 func _on_Difficult_timeout(): #\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u0448\u0430\u043d\u0441 \u043d\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043e\u0440\u0443\u0436\u0438\u044f var weapon_chance = randi() % 100 #\u0415\u0441\u043b\u0438 \u0447\u0438\u0441\u0442\u043e \u043c\u0435\u043d\u044c\u0448\u0435, \u043d\u0430\u0448\u0435\u0433\u043e \u0448\u0430\u043d\u0441\u0430 \u0438 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c if (weapon_chance &lt;= weapon_add_chance &amp;&amp; player.can_add()): #\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0435 \u043e\u0440\u0443\u0436\u0438\u044f \u0438\u0437 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0441 \u043e\u0440\u0443\u0436\u0438\u0435 player.add_equip_item(weapon_massiv[randi() % weapon_massiv.size()]) #\u041e\u0431\u043d\u0443\u043b\u044f\u0435\u043c \u0448\u0430\u043d\u0441 \u043d\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 weapon_add_chance = 0 else: #\u0415\u0441\u043b\u0438 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438, \u0442\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0448\u0430\u043d\u0441 weapon_add_chance+=5 #\u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0441\u0447\u0451\u0442\u0447\u0438\u043a \u0443\u0441\u043b\u043e\u0436\u043d\u0435\u043d\u0438\u044f difficult_tick += 1 #\u041a\u043e\u0433\u0434\u0430 \u0441\u0447\u0451\u0442\u0447\u0438\u043a \u043a\u0440\u0430\u0442\u0435\u043d 3, \u0442\u043e if (difficult_tick % 3 == 0): #\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0435\u0449\u0451 \u043e\u0434\u043d\u043e\u0433\u043e \u0437\u043e\u043c\u0431\u0438 spawn_count+=1 #\u0438 \u043c\u0435\u043d\u044f\u0435\u043c \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u0438 shield_chance += 4 if (shield_chance > 20): #\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u0441\u043f\u0430\u0432\u043d\u0430 \u0432 20% shield_chance = 20 fat_chance += 2 if (fat_chance > 20): #\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u0441\u043f\u0430\u0432\u043d\u0430 \u0432 20% fat_chance = 20 scary_chance += 2 if (scary_chance > 20):#\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u0441\u043f\u0430\u0432\u043d\u0430 \u0432 20% scary_chance = 20 zombie1_chance -= 4 if (zombie1_chance &lt; 20):#\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u0441\u043f\u0430\u0432\u043d\u0430 \u0432 20% zombie1_chance = 20 smart_chance -= 4 if (smart_chance &lt; 20):#\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u0441\u043f\u0430\u0432\u043d\u0430 \u0432 20% smart_chance = 20 #zombie1 \u0438 smart \u043a\u0440\u0430\u0439\u0442\u0435 \u043f\u0440\u043e\u0441\u0442\u044b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u0445 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u043c, \u0437\u0430 \u0441\u0447\u0451\u0442 \u044d\u0442\u043e\u0433\u043e #\u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u043d\u0430 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u0440\u0443\u0433\u0438\u0445 \u0437\u043e\u043c\u0431\u0438 #\u0441\u0443\u043c\u043c\u0430 \u0448\u0430\u043d\u0441\u0430 \u043f\u0440\u0438\u0437\u044b\u0432\u0430 \u0432\u0441\u0435\u0445 \u0437\u043e\u043c\u0431\u0438 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0440\u0430\u0432\u043d\u0430 100.  #\u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 \u0431\u0435\u0440\u0451\u0442 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0441\u0447\u0451\u0442 func save_record(score): #\u041e\u0431\u044a\u044f\u0432\u0438\u043b\u0438 \u043d\u0432\u043e\u044b\u0439 \u0444\u0430\u0439\u043b var save_file = File.new() #\u0421\u043e\u0437\u0434\u0430\u043b\u0438 \u043d\u043e\u0432\u044b\u0439 \"\u0441\u043b\u043e\u0432\u0430\u0440\u044c\" \u0437\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u0432 \u043d\u0435\u0433\u043e \u043b\u0443\u0447\u0448\u0438\u0439 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 var save_dict ={ \"BrutalHero\": CharacterNames.brutalhero_score, \"Cowboy\":CharacterNames.cowboy_score, \"Robot\":CharacterNames.robot_score, \"Soldier\":CharacterNames.soldier_score, } #\u0415\u0441\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0439 \u0433\u0435\u0440\u043e\u0439 \u0438 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0441\u0447\u0451\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u043b\u0443\u0447\u0448\u0435\u0433\u043e, \u0442\u043e \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0434\u0440\u0443\u0433\u043e\u0439 if(SelectedCharacter.Character == CharacterNames.BRUTALHERO &amp;&amp; score > save_dict[\"BrutalHero\"]): save_dict[\"BrutalHero\"] = score if(SelectedCharacter.Character == CharacterNames.COWBOY &amp;&amp; score > save_dict[\"Cowboy\"]): save_dict[\"Cowboy\"] = score if(SelectedCharacter.Character == CharacterNames.ROBOT &amp;&amp; score > save_dict[\"Robot\"]): save_dict[\"Robot\"] = score if(SelectedCharacter.Character == CharacterNames.SOLDIER &amp;&amp; score > save_dict[\"Soldier\"]): save_dict[\"Soldier\"] = score #\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0444\u0430\u0438\u043b \u0441 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435\u043c save_file.open(\"user:\/\/save.save\", File.WRITE) #\u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c save_file.store_line(to_json(save_dict))  func clear_level(): WeaponsName.clear_all()#\u0443\u0431\u0438\u0440\u0430\u0435\u043c \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f \u0441 \u043e\u0440\u0443\u0436\u0438\u044f get_tree().call_group(\"all_enemy\", \"queue_free\")#\u0423\u0434\u0430\u043b\u044f\u0435\u043c \u0432\u0441\u0435\u0445 \u0432\u0440\u0430\u0433\u043e\u0432 \u0441\u043e \u0441\u0446\u0435\u043d\u044b <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<h2>\u0423\u0440\u043e\u0432\u0435\u043d\u044c \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430<\/h2>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0434\u0435\u0440\u0435\u0432\u043e, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u043d\u0430 \u043f\u0440\u043e\u0431\u0435\u043b, \u043d\u043e \u0443 \u043d\u0430\u0441 \u043d\u0435\u0442 \u0441\u0430\u043c\u043e\u0433\u043e \u0433\u043b\u0430\u0432\u043d\u043e\u0433\u043e, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u0434\u043d\u044f\u0442\u044c \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0447\u043a\u043e \u0442\u0430\u043b\u0430\u043d\u0442\u043e\u0432. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043e\u0442\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043a\u0440\u0438\u043f\u0442 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430 \u0438 \u0441\u043a\u0440\u0438\u043f\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c, \u0447\u0442\u043e \u0437\u043e\u043c\u0431\u0438 \u043f\u043e\u0441\u043b\u0435 \u0441\u043c\u0435\u0440\u0442\u0438 \u0431\u0443\u0434\u0443 \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u043e\u043f\u044b\u0442.<\/p>\n<h3>\u0421\u0446\u0435\u043d\u0430 \u043e\u0447\u043a\u0430 \u043e\u043f\u044b\u0442\u0430<\/h3>\n<p>\u0413\u043b\u0430\u0432\u043d\u044b\u043c \u0443\u0437\u043b\u043e\u043c \u0441\u0446\u0435\u043d\u044b \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c StaticBody2D(ExpPoint), \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b:<\/p>\n<figure class=\"float\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/4c3\/d52\/72b\/4c3d5272b7f4b9a706d6417446de0c7a.png\" width=\"285\" height=\"94\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/4c3\/d52\/72b\/4c3d5272b7f4b9a706d6417446de0c7a.png\"\/><\/figure>\n<p>\u2981Sprite<br \/> \u2981CollisionShape<\/p>\n<p>\u0417\u0430\u043b\u0438\u0432\u0430\u0435\u043c \u0441\u043f\u0440\u0430\u0439\u0442, \u043f\u043e\u0434\u0433\u043e\u043d\u044f\u0435\u043c CollisionShape. \u0412 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0434\u043b\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u0441\u043b\u043e\u044f \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0439( \u0443 \u043c\u0435\u043d\u044f \u044d\u0442\u043e 7, \u043d\u0430\u0437\u0432\u0430\u043b Pick_up), \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0434\u043b\u044f CollisionObject2D:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/128\/8da\/28f\/1288da28f16c7dd9c716a6a6c9ed5a8e.png\" alt=\"\u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043e\u0447\u043a\u0430 \u043e\u043f\u044b\u0442\u0430\" title=\"\u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043e\u0447\u043a\u0430 \u043e\u043f\u044b\u0442\u0430\" width=\"391\" height=\"183\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/128\/8da\/28f\/1288da28f16c7dd9c716a6a6c9ed5a8e.png\"\/><\/p>\n<div><figcaption>\u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043e\u0447\u043a\u0430 \u043e\u043f\u044b\u0442\u0430<\/figcaption><\/div>\n<\/figure>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432 \u0433\u0440\u0443\u043f\u043f\u0443 all_enemy, \u0447\u0442\u043e\u0431\u044b \u0443\u0434\u0430\u043b\u044f\u043b\u043e\u0441\u044c \u043f\u043e\u0441\u043b\u0435 \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f \u0438\u0433\u0440\u044b.<\/p>\n<p>\u041d\u0430\u0432\u0435\u0448\u0438\u0432\u0430\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442 \u043d\u0430 ExpPoint, \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0435\u0433\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e:<\/p>\n<pre><code class=\"python\">extends StaticBody2D  #\u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e, \u043a\u043e\u043b-\u0432\u043e \u0434\u0430\u0432\u0430\u0435\u043c\u043e\u0433\u043e \u043e\u043f\u044b\u0442\u0430 export var exp_param = 1  #\u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043a\u043e\u0433\u0434\u0430 \u0438\u0433\u0440\u043e\u043a \u043f\u043e\u0434\u0431\u0435\u0440\u0451\u0442 \u043e\u043f\u044b\u0442 func pick_up_exp(): queue_free()  #\u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u0435\u0440\u043d\u0443\u0442 \u043a\u043e\u043b-\u0432\u043e \u0434\u0430\u0432\u0430\u0435\u043c\u043e\u0433\u043e \u043e\u043f\u044b\u0442\u0430 func get_exp_param(): return exp_param<\/code><\/pre>\n<h3>\u0421\u0446\u0435\u043d\u0430 \u0432\u0440\u0430\u0433\u0430<\/h3>\n<p>\u0421\u0430\u043c \u043e\u043f\u044b\u0442 \u0441\u043e\u0437\u0434\u0430\u043b\u0438, \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u0443\u0447\u0438\u0442\u044c \u0437\u043e\u043c\u0431\u0438, \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u043f\u043e\u0441\u043b\u0435 \u0441\u043c\u0435\u0440\u0442\u0438 \u044d\u0442\u043e\u0442 \u043e\u043f\u044b\u0442. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e:<\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432 \u043d\u0430\u0448 \u0441\u0438\u043d\u0433\u043b\u0442\u043e\u043d EnemyNames, \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0443 \u0441 \u0441\u0446\u0435\u043d\u043e\u0439 \u043e\u043f\u044b\u0442\u0430<\/p>\n<pre><code class=\"python\">#\u043e\u0447\u043a\u043e \u043e\u043f\u044b\u0442\u0430 const EXPPOINT = preload(\"res:\/\/scenes\/Game\/ExpPoint\/ExpPoint.tscn\")<\/code><\/pre>\n<p>\u0412 \u0441\u043a\u0440\u0438\u043f\u0442\u0435 \u0431\u043e\u043b\u0432\u0430\u043d\u043a\u0435 \u0434\u043b\u044f \u0432\u0440\u0430\u0433\u043e\u0432, \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0441 \u0441\u0446\u0435\u043d\u043e\u0439, \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u044b\u0432\u0430\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0441\u043f\u0430\u0432\u043d\u0430 \u043a\u0440\u043e\u0432\u0438 spawn_blood, \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e dead(), \u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u043c \u0435\u0451, \u043f\u043e\u0442\u043e\u043c \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e dead() \u0432 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0443\u0440\u043e\u043d\u0430, \u0435\u0441\u043b\u0438 \u0445\u043f \u043a\u043e\u043d\u0447\u0438\u043b\u0438\u0441\u044c:<\/p>\n<pre><code class=\"python\">var exp_scene = EnemyNames.EXPPOINT  #\u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u043c\u0435\u0440\u0442\u0438 \u0432\u0440\u0430\u0433\u0430 func dead(): var b = blood_scene.instance()  b.position = position#\u0437\u0430\u0434\u0430\u043b\u0438 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 b.rotation_degrees = randi() % 361#\u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u0443\u0433\u043e\u043b \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430  get_parent().add_child(b)#\u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u043a\u0440\u043e\u0432\u044c  var e = exp_scene.instance()#\u043e\u0431\u044a\u044f\u0432\u0438\u0438 \u0441\u0446\u0435\u043d\u0443 \u0441 \u043e\u043f\u044b\u0442\u043e\u043c  e.position = position#\u0437\u0430\u0434\u0430\u043b\u0438 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 e.rotation_degrees = randi() % 361#\u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u0443\u0433\u043e\u043b \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430 e.z_index = 50#\u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u043c z-index  get_parent().add_child(e)#\u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u043e\u043f\u044b\u0442  queue_free()#\u0443\u0434\u0430\u043b\u0438\u043b\u0438 \u0437\u043e\u043c\u0431\u0438  #\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0443\u0440\u043e\u043d\u0430 func hit(damage): health -= damage _red_health.rect_size.x -= health_size * damage if (health &lt;= 0): #\u0415\u0441\u043b\u0438 &lt;= 0, \u0442\u043e \u0443\u0434\u0430\u043b\u0438\u043b\u0441\u044f dead()<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u041f\u043e\u043b\u043d\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 \u0431\u043e\u043b\u0432\u0430\u043d\u043a\u0438 \u0432\u0440\u0430\u0433\u0430<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">extends KinematicBody2D  #\u043f\u043e\u0434\u0433\u0440\u0443\u0437\u0438\u043b\u0438 \u0441\u0446\u0435\u043d\u0443 \u0441 \u043a\u0440\u043e\u0432\u044c\u044e \u0438 \u043e\u043f\u044b\u0442\u043e\u043c var blood_scene = EnemyNames.ZOMBIEBLOOD var exp_scene = EnemyNames.EXPPOINT #\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0434\u0435\u0440\u0435\u0432\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0432 \u043a\u043e\u0434 onready var _animated_sprite = $AnimatedSprite onready var _red_health = $HealthBar\/RedHealth  #\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0438\u0433\u0440\u043e\u043a\u0430, \u043f\u043e\u0437\u0436\u0435 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f export onready var player #\u0425\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0438 \u0432\u0440\u0430\u0433\u0430 export var health = 5 export var speed:float = 2 export var damage = 1 #\u0415\u0449\u0451 \u0447\u0443-\u0447\u0443\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 #\u0414\u043b\u0438\u043d\u0430 \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043d\u0443\u0436\u043d\u043e \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440 RedHealth, \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f 1 \u0435\u0434. \u0443\u0440\u043e\u043d\u0430 onready var health_size = _red_health.rect_size.x \/ health   var motion = Vector2.ZERO var dir = Vector2.ZERO  #\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u043e \u0432\u044b\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u043d\u0438\u044e \u043f\u0443\u0442\u0438 \u043a \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0435 func find_position(pos): dir = (pos - position).normalized() motion = dir.normalized() * speed if(dir.x &lt; 0): _animated_sprite.set_flip_h(true) else: _animated_sprite.set_flip_h(false)   func _ready(): randomize()#\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043b\u0438 \u0440\u0430\u043d\u0434\u043e\u043c\u0430\u0439\u0437\u0435\u0440  _animated_sprite.playing = true #\u0412\u043a\u043b\u044e\u0447\u0438\u043b\u0438 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044e  #\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0443\u0440\u043e\u043d\u0430 func hit(damage): health -= damage _red_health.rect_size.x -= health_size * damage if (health &lt;= 0): #\u0415\u0441\u043b\u0438 &lt;= 0, \u0442\u043e \u0443\u0434\u0430\u043b\u0438\u043b\u0441\u044f dead()  func _physics_process(delta): #\u0415\u0441\u043b\u0438 \u0438\u0433\u0440\u043e\u043a\u0430 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u0442\u043e \u043d\u0435\u043a\u0443\u0434\u0430 \u0438\u0434\u0442\u0438 if (player != null): find_position(player.position) var collision = move_and_collide(motion) if collision:#\u0415\u0441\u043b\u0438 \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0441\u044f if collision.collider.has_method(\"take_damage\"):#\u0418 \u0435\u0441\u0442\u044c \u043c\u0435\u0442\u043e\u0434 take_damage collision.collider.take_damage(damage)#\u043d\u0430\u043d\u0451\u0441 \u0443\u0440\u043e\u043d  #\u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u043c\u0435\u0440\u0442\u0438 \u0432\u0440\u0430\u0433\u0430 func dead(): var b = blood_scene.instance()  b.position = position#\u0437\u0430\u0434\u0430\u043b\u0438 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 b.rotation_degrees = randi() % 361#\u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u0443\u0433\u043e\u043b \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430  get_parent().add_child(b)#\u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u043a\u0440\u043e\u0432\u044c  var e = exp_scene.instance()#\u043e\u0431\u044a\u044f\u0432\u0438\u0438 \u0441\u0446\u0435\u043d\u0443 \u0441 \u043e\u043f\u044b\u0442\u043e\u043c  e.position = position#\u0437\u0430\u0434\u0430\u043b\u0438 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 e.rotation_degrees = randi() % 361#\u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u0443\u0433\u043e\u043b \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430 e.z_index = 50#\u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u043c z-index  get_parent().add_child(e)#\u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u043e\u043f\u044b\u0442  queue_free()#\u0443\u0434\u0430\u043b\u0438\u043b\u0438 \u0437\u043e\u043c\u0431\u0438  func get_health(): return health <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<h2>\u0421\u0446\u0435\u043d\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430<\/h2>\n<p>\u041d\u0430 \u0441\u0446\u0435\u043d\u0443 \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0435\u0449\u0451 \u043e\u0434\u043d\u0443 \u043f\u043e\u043b\u043e\u0441\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u043e\u043f\u044b\u0442, \u043a\u0430\u043a \u043c\u044b \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u043b\u0438 \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/7d3\/792\/b01\/7d3792b0153f7cc2e36f49392844ddef.png\" width=\"1468\" height=\"417\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/7d3\/792\/b01\/7d3792b0153f7cc2e36f49392844ddef.png\"\/><\/figure>\n<p>\u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u0441\u043a\u0440\u0438\u043f\u0442\u0430:<\/p>\n<p>\u041d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0438\u0435 \u0437\u0430 \u043e\u043f\u044b\u0442, \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e\u043b\u043e\u0441\u043a\u0438 \u0441 \u043e\u043f\u044b\u0442\u043e\u043c \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043e\u043f\u044b\u0442\u0430<\/p>\n<pre><code class=\"python\">#\u042d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0434\u0435\u0440\u0435\u0432\u0430 onready var _score_add_timer = $Score\/ScoreAddTimer onready var _score = $Score onready var _current_health_bar = $CurrentHealthBar  var max_exp #\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b-\u0432\u043e \u043e\u043f\u044b\u0442\u0430 var current_exp #\u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u043a\u043e\u043b-\u0432\u043e \u043e\u043f\u044b\u0442\u0430 var exp_bar_size #\u0420\u0430\u0437\u043c\u0435\u0440 \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0443\u0436\u043d\u043e \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0442\u044c \u0436\u0451\u043b\u0442\u044b\u0439 \u043a\u0432\u0430\u0434\u0440\u0430\u0442  # \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0437\u0430\u0434\u0430\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043e\u043f\u044b\u0442\u0430 func init_exp(add_exp): max_exp = add_exp  current_exp = 0  _exp.text = String(current_exp) + \"\/\" + String(max_exp)#\u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0432 \u043b\u044d\u0439\u0431\u044d\u043b \u043d\u0430\u0448 \u043e\u043f\u044b\u0442 exp_bar_size = _current_exp_bar.rect_size.x \/ max_exp# \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u0434\u043b\u0438\u043d\u043d\u0443 \u0434\u0435\u043b\u0435\u043d\u0438\u044f _current_exp_bar.rect_size.x = 0 #\u043e\u0431\u043d\u0443\u043b\u044f\u0435\u043c \u043f\u043e\u043b\u043e\u0441\u043a\u0443 \u043e\u043f\u044b\u0442\u0430 \u0434\u043e 0  # \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u0430\u044f \u043f\u0440\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u043e\u043f\u044b\u0442\u0430 func take_exp(add_exp): current_exp += add_exp #\u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u043e\u043f\u044b\u0442 _exp.text = String(current_exp) + \"\/\" + String(max_exp)#\u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0432 \u043b\u044d\u0439\u0431\u044d\u043b \u043d\u0430\u0448 \u043e\u043f\u044b\u0442 _current_exp_bar.rect_size.x += exp_bar_size * add_exp#\u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0434\u043b\u0438\u043d\u0443 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0430<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u041f\u043e\u043b\u043d\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">extends Node2D  #\u042d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0434\u0435\u0440\u0435\u0432\u0430 onready var _score_add_timer = $Score\/ScoreAddTimer onready var _score = $Score onready var _current_health_bar = $CurrentHealthBar onready var _health = $CurrentHealthBar\/Health onready var _current_exp_bar = $CurrentExpBar onready var _exp = $CurrentExpBar\/Exp   var max_health #\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b-\u0432\u043e \u0445\u043f var current_health #\u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u043a\u043e\u043b-\u0432\u043e \u0445\u043f var health_bar_size #\u0420\u0430\u0437\u043c\u0435\u0440 \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0443\u0436\u043d\u043e \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0442\u044c \u0437\u0435\u043b\u0451\u043d\u044b\u0439 \u043a\u0432\u0430\u0434\u0440\u0430\u0442  var max_exp #\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b-\u0432\u043e \u043e\u043f\u044b\u0442\u0430 var current_exp #\u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u043a\u043e\u043b-\u0432\u043e \u043e\u043f\u044b\u0442\u0430 var exp_bar_size #\u0420\u0430\u0437\u043c\u0435\u0440 \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0443\u0436\u043d\u043e \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0442\u044c \u0436\u0451\u043b\u0442\u044b\u0439 \u043a\u0432\u0430\u0434\u0440\u0430\u0442  # \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0437\u0430\u0434\u0430\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043e\u043f\u044b\u0442\u0430 func init_exp(add_exp): max_exp = add_exp  current_exp = 0  _exp.text = String(current_exp) + \"\/\" + String(max_exp)#\u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0432 \u043b\u044d\u0439\u0431\u044d\u043b \u043d\u0430\u0448 \u043e\u043f\u044b\u0442 exp_bar_size = _current_exp_bar.rect_size.x \/ max_exp# \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u0434\u043b\u0438\u043d\u043d\u0443 \u0434\u0435\u043b\u0435\u043d\u0438\u044f _current_exp_bar.rect_size.x = 0 #\u043e\u0431\u043d\u0443\u043b\u044f\u0435\u043c \u043f\u043e\u043b\u043e\u0441\u043a\u0443 \u043e\u043f\u044b\u0442\u0430 \u0434\u043e 0  # \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0437\u0430\u0434\u0430\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0445\u043f func init_health(hp): max_health = hp current_health = hp _health.text = String(current_health) + \"\/\" + String(max_health)#\u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0432 \u043b\u044d\u0439\u0431\u044d\u043b \u043d\u0430\u0448\u0438 \u0445\u043f health_bar_size = _current_health_bar.rect_size.x \/ max_health# \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u0434\u043b\u0438\u043d\u043d\u0443 \u0434\u0435\u043b\u0435\u043d\u0438\u044f  # \u041f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0442\u0430\u0439\u043c\u0435\u0440 func _ready(): _score_add_timer.start()  # \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u0430\u044f \u043f\u0440\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u0443\u0440\u043e\u043d\u0430 func take_damage(damage): current_health -= damage  _health.text = String(current_health) + \"\/\" + String(max_health) _current_health_bar.rect_size.x -= health_bar_size * damage  # \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u0430\u044f \u043f\u0440\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u043e\u043f\u044b\u0442\u0430 func take_exp(add_exp): current_exp += add_exp #\u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u043e\u043f\u044b\u0442 _exp.text = String(current_exp) + \"\/\" + String(max_exp)#\u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0432 \u043b\u044d\u0439\u0431\u044d\u043b \u043d\u0430\u0448 \u043e\u043f\u044b\u0442 _current_exp_bar.rect_size.x += exp_bar_size * add_exp#\u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0434\u043b\u0438\u043d\u0443 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0430  # \u0421\u0438\u0433\u043d\u0430\u043b \u043e\u0442 \u0442\u0430\u0439\u043c\u0435\u0440\u0430 func _on_ScoreAddTimer_timeout(): _score.text = String(int(_score.text) + 1)  #\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0441\u0447\u0451\u0442\u0430 func get_score(): return int(_score.text) <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<h3>\u0421\u0446\u0435\u043d\u0430 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430<\/h3>\n<p>\u041d\u0443\u0436\u043d\u043e \u043e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u043f\u044b\u0442\u0430(\u0442\u0440\u0435\u0431\u0443\u0435\u043c\u044b \u0434\u043b\u044f \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u044f \u043e\u043f\u044b\u0442, \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0432\u043e \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u0441\u044f \u043e\u043f\u044b\u0442 \u043f\u0440\u0438 \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u0438, \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043e\u043f\u044b\u0442), \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0438\u0433\u043d\u0430\u043b \u043e \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u0438 \u0443\u0440\u043e\u0432\u043d\u044f, \u0432\u044b\u0437\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e init_exp(), \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 _ready(), \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0439 \u0434\u043b\u044f \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u0441 \u043e\u0447\u043a\u043e\u043c \u043e\u043f\u044b\u0442\u0430, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u044f \u0443\u0440\u043e\u0432\u043d\u044f level_up()<\/p>\n<pre><code class=\"python\">export var max_exp = 20#\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u043f\u044b\u0442\u0430 \u043d\u0430\u0434\u043e \u0434\u043b\u044f \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u044f \u0443\u0440\u043e\u0432\u043d\u044f export var scale_exp = 2# \u0432\u043e \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u0441\u044f \u0442\u0440\u0435\u0431\u0443\u0435\u043c\u044b \u043e\u043f\u044b\u0442 \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u044f var current_exp = 0 #\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0445\u0440\u0430\u043d\u044f\u0449\u0430\u044f \u043a\u043e\u043b-\u0432\u043e \u043e\u043f\u044b\u0442\u0430  #\u0421\u0438\u0433\u043d\u0430 \u043e \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u0438 \u0443\u0440\u043e\u043d\u044f signal lvl_up  func _ready(): _animated_sprite.animation = \"Stand\" # \u041f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436 \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0442\u043e\u044f\u0442\u044c equip_all() _user_interface.init_exp(max_exp)# \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u044f \u043e\u043f\u044b\u0442\u0430, \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 _user_interface.init_health(health)# \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u043f\u044b\u0442\u0430, \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 #\u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u0434\u0435\u0440\u0435\u0432\u043e, \u0442\u043e \u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u043c \u0435\u0433\u043e \u0441\u0438\u0433\u043d\u0430\u043b var tree = get_node(skill_tree) if (tree != null): tree.connect(\"branch_skill_up\",self,\"_on_SkillTree_branch_skill_up\")  func _physics_process(delta): get_input() get_anim() var collision= move_and_collide(direction * delta)  #\u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e collision \u0434\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f if collision:#\u0435\u0441\u043b\u0438 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0435 if collision.collider.has_method(\"pick_up_exp\"):#\u0418 \u0435\u0441\u0442\u044c \u043c\u0435\u0442\u043e\u0434 take_damage collision.collider.pick_up_exp()#\u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u043c \u043e\u043f\u044b\u0442 current_exp += collision.collider.get_exp_param()#\u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 level_up()#\u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u0435 \u043e\u043f\u044b\u0442\u0430 _user_interface.take_exp(collision.collider.get_exp_param())#\u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u043e\u043f\u044b\u0442  #\u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u043e\u0434\u043d\u044f\u0442\u0438\u044f \u043e\u043f\u044b\u0442\u0430 func level_up(): if (current_exp == max_exp):#\u0415\u0441\u043b\u0438 \u0434\u043e\u0441\u0442\u0438\u0433\u043b\u0438 \u043e\u043f\u044b\u0442\u0430 \u0434\u043b\u044f \u043b\u0432\u043b\u0430\u043f\u0430 emit_signal(\"lvl_up\")#\u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u0438\u0433\u043d\u0430\u043b max_exp *= scale_exp#\u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0442\u0440\u0435\u0431\u0443\u0435\u043c\u044b\u0439 \u043e\u043f\u044b\u0442 \u0434\u043b\u044f \u0441\u043b\u0435\u0434 \u0443\u0440\u043e\u0432\u043d\u044f current_exp = 0#\u043e\u0431\u043d\u0443\u043b\u044f\u0435\u043c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043e\u043f\u044b\u0442 _user_interface.init_exp()#\u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u041f\u043e\u043b\u043d\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 \u0431\u043e\u043b\u0432\u0430\u043d\u043a\u0438 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">extends KinematicBody2D   #\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0434\u0435\u0440\u0435\u0432\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0432 \u043a\u043e\u0434 onready var _animated_sprite = $AnimatedSprite onready var _idle_animation_timer = $IdleAnimationTimer onready var _immortal_timer = $ImmortalTimer onready var _backpack = $Backpack onready var _user_interface = $Camera2D\/UserInterface #\u041e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u043c\u0435\u043d\u044f\u0442\u044c \u0438\u0437\u0432\u043d\u0435  export var health = 5 #\u0416\u0438\u0437\u043d\u0438 export var speed = 200 #\u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c  export var damage_scale:float = 1#\u041c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u044c \u0443\u0440\u043e\u043d\u0430 export var max_exp = 20#\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u043f\u044b\u0442\u0430 \u043d\u0430\u0434\u043e \u0434\u043b\u044f \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u044f \u0443\u0440\u043e\u0432\u043d\u044f export var scale_exp = 2# \u0432\u043e \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u0441\u044f \u0442\u0440\u0435\u0431\u0443\u0435\u043c\u044b \u043e\u043f\u044b\u0442 \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u044f export (NodePath) var skill_tree# \u0434\u0435\u0440\u0435\u0432\u043e \u043d\u0430\u0432\u044b\u043a\u043e\u0432 #\u041e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u043a\u0440\u0438\u043f\u0442\u0430 var velocity = Vector2.ZERO #\u0412\u0435\u043a\u0442\u043e\u0440 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f var direction = Vector2.ZERO #\u0412\u0435\u043a\u0442\u043e\u0440 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f var backpack_items = [null,null,null,null,null,null]#\u0440\u044e\u043a\u0437\u0430\u043a var weapon_count = 0 #\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0445\u0440\u0430\u043d\u044f\u0449\u0430\u044f \u043a\u043e\u043b-\u0432\u043e \u043e\u0440\u0443\u0436\u0438\u044f var current_exp = 0 #\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0445\u0440\u0430\u043d\u044f\u0449\u0430\u044f \u043a\u043e\u043b-\u0432\u043e \u043e\u043f\u044b\u0442\u0430 #\u0421\u0438\u0433\u043d\u0430\u043b \u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u0443\u0440\u043e\u043d\u0430 signal take_damage(damage) #\u0421\u0438\u0433\u043d\u0430\u043b \u043e \u0441\u043c\u0435\u0440\u0442\u0438 signal dead #\u0421\u0438\u0433\u043d\u0430 \u043e \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u0438 \u0443\u0440\u043e\u043d\u044f signal lvl_up #\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u043d\u0430\u0436\u0430\u0442\u0438\u0439 func get_input(): velocity = Vector2.ZERO if Input.is_action_pressed(\"left\"): velocity.x -= 1 if Input.is_action_pressed(\"right\"): velocity.x += 1 if Input.is_action_pressed(\"up\"): velocity.y -= 1 if Input.is_action_pressed(\"down\"): velocity.y += 1 direction = velocity.normalized() * speed  #\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0439 func get_anim(): if (_immortal_timer.is_stopped()): #\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0435 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f-\u043b\u0438 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044f \u0431\u0435\u0441\u0441\u043c\u0435\u0440\u0442\u0438\u044f if (velocity != Vector2.ZERO): #\u0415\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f, \u0442\u043e \u0438\u0434\u0451\u043c  _animated_sprite.play(\"Walk\") else: if (_animated_sprite.animation != \"IdleAnimation\"): #\u0418\u043d\u0430\u0447\u0435 \u0435\u0441\u043b\u0438 \u043d\u0435 \u0431\u0440\u0443\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044f, \u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0442\u043e\u0438\u043c _animated_sprite.play(\"Stand\") if (_idle_animation_timer.is_stopped()): #\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043e\u0442\u0447\u0451\u0442 \u0434\u043e \u0431\u0440\u0443\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 _idle_animation_timer.start() if (velocity.x > 0): # \u043f\u043e\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430 \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0443 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f _animated_sprite.flip_h = false  if (velocity.x &lt; 0): _animated_sprite.flip_h = true  #\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0443\u0440\u043e\u043d\u0430 func take_damage(dmg): if(_immortal_timer.is_stopped()): #\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0435 \u0431\u0435\u0441\u0441\u043c\u0435\u0440\u0442\u0435\u043d \u043b\u0438 \u043d\u0430\u0448 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436 health -= dmg _animated_sprite.play(\"TakeDamage\") emit_signal(\"take_damage\",dmg) #\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u0438\u0433\u043d\u0430\u043b \u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u0443\u0440\u043e\u043d\u0430 _user_interface.take_damage(dmg) _immortal_timer.start() #\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0442\u0430\u0439\u043c\u0435\u0440 \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0443\u0440\u043e\u043d\u0430 if(health &lt;= 0): emit_signal(\"dead\")#\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u0438\u0433\u043d\u0430\u043b \u043e \u0441\u043c\u0435\u0440\u0442\u0438   func _ready(): _animated_sprite.animation = \"Stand\" # \u041f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436 \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0442\u043e\u044f\u0442\u044c equip_all() _user_interface.init_exp(max_exp)# \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u044f \u043e\u043f\u044b\u0442\u0430, \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 _user_interface.init_health(health)# \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u043f\u044b\u0442\u0430, \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 #\u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u0434\u0435\u0440\u0435\u0432\u043e, \u0442\u043e \u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u043c \u0435\u0433\u043e \u0441\u0438\u0433\u043d\u0430\u043b var tree = get_node(skill_tree) if (tree != null): tree.connect(\"branch_skill_up\",self,\"_on_SkillTree_branch_skill_up\")   func _physics_process(delta): get_input() get_anim() var collision= move_and_collide(direction * delta)  #\u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e collision \u0434\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f if collision:#\u0435\u0441\u043b\u0438 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0435 if collision.collider.has_method(\"pick_up_exp\"):#\u0418 \u0435\u0441\u0442\u044c \u043c\u0435\u0442\u043e\u0434 take_damage collision.collider.pick_up_exp()#\u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u043c \u043e\u043f\u044b\u0442 current_exp += collision.collider.get_exp_param()#\u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 level_up()#\u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u0435 \u043e\u043f\u044b\u0442\u0430 _user_interface.take_exp(collision.collider.get_exp_param())#\u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u043e\u043f\u044b\u0442 func _on_IdleAnimationTimer_timeout(): _animated_sprite.play(\"IdleAnimation\") # \u0412\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0411\u0420\u0423\u0422\u0410\u041b\u042c\u041d\u0423\u042e \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044e \u043f\u043e \u0438\u0441\u0442\u0435\u0447\u0435\u043d\u0438\u0438 \u0442\u0430\u0439\u043c\u0435\u0440\u0430  #\u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u0435\u043d\u0438\u044f \u043e\u0440\u0443\u0436\u0438\u044f func equip_item(slot):# \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u043d\u043e\u043c\u0435\u0440 \u0441\u043b\u043e\u0442\u0430 \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043d\u0443\u0436\u043d\u043e \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u043e\u0440\u0443\u0436\u0438\u0435 if (backpack_items[slot] != null):#\u0415\u0441\u043b\u0438 \u0441\u043b\u043e\u0442 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d var weapon = backpack_items[slot].instance() weapon.position = _backpack.get_slot_position(slot)#\u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u043e\u0437\u0438\u0446\u0443\u044e \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u043b\u043e\u0442\u0430 weapon.name = \"WeaponSlot\" + String(slot)#\u0418\u043c\u0435\u043d\u044f \u043e\u0440\u0443\u0436\u0438\u044f WeaponSlot0..5 add_child(weapon) weapon.scale = Vector2(0.5,0.5)# \u0443 \u043c\u0435\u043d\u044f \u0441\u0442\u043e\u0438\u0442 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0440\u0443\u0436\u0438\u0435, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0443 \u0432\u0430\u0441 \u043d\u0435\u0442 weapon.damage = ceil(weapon.damage*damage_scale)#\u041f\u0435\u0440\u0435\u043c\u043d\u043e\u0436\u0430\u0435\u043c \u0443\u0440\u043e\u043d \u0441 \u043d\u0430\u0448\u0438\u043c \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u043c \u0438 \u043e\u043a\u0440\u0443\u0433\u043b\u044f\u0435\u043c \u0432 \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0441\u0442\u043e\u0440\u043e\u043d\u0443   #\u043e\u0434\u0435\u0432\u0430\u0435\u043c \u0432\u0441\u0451 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0435 \u043e\u0440\u0443\u0436\u0438\u0435 func equip_all(): for i in range(6):#\u041f\u0440\u043e\u0431\u0435\u0433\u0430\u0435\u043c \u043f\u043e \u0432\u0441\u0435\u043c\u0443 \u043c\u0430\u0441\u0441\u0438\u0432\u0443 backpack_item if(get_node(\"WeaponSlot\"+String(i)) != null): var item =get_node(\"WeaponSlot\"+String(i)) #\u0418\u0449\u0435\u043c \u0443\u0437\u0435\u043b if (item != null): #\u0415\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u0442\u043e \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u0435\u0433\u043e \u0441\u043e \u0441\u0446\u0435\u043d\u044b item.queue_free() equip_item(i)# \u0438 \u0440\u0438\u0441\u0443\u0435\u043c \u043d\u043e\u0432\u044b\u0439  #\u0443\u0434\u0430\u043b\u044f\u0435\u043c \u043e\u0440\u0443\u0436\u0438\u0435 func remove_equip_item(slot):#\u041f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u043d\u043e\u043c\u0435\u0440 \u0441\u043b\u043e\u0442\u0430 if (slot >= 0 &amp;&amp; slot &lt;=5):#\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u043e\u043c\u0435\u0440 \u0441\u043b\u043e\u0442\u0430 var item = get_node(\"WeaponSlot\" + slot) backpack_items[slot] = null#\u043e\u0431\u043d\u0443\u043b\u044f\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u0440\u044e\u043a\u0437\u0430\u043a\u0435 item.queue_free()#\u0443\u0434\u0430\u043b\u044f\u0435\u043c \u043e\u0431\u044a\u0435\u043a\u0442 weapon_count -=1 #\u0443\u043c\u0435\u043d\u044c\u0448\u0438\u043b\u0438 \u043d\u0430 1 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043e\u0440\u0443\u0436\u0438\u044f  #\u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043e\u0440\u0443\u0436\u0438\u0435 func add_equip_item(item): for i in range(6): if (backpack_items[i] == null):#\u041d\u0430\u0445\u043e\u0434\u0438\u043c \u043f\u0435\u0440\u0432\u044b\u0439 \u043f\u0443\u0441\u0442\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 backpack_items[i] = item#\u0437\u0430\u043b\u0438\u0432\u0430\u0435\u043c \u0432 \u043d\u0435\u0433\u043e \u0441\u0446\u0435\u043d\u0443 \u043e\u0440\u0443\u0436\u0438\u044f weapon_count +=1 #\u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043b\u0438 \u043d\u0430 1 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043e\u0440\u0443\u0436\u0438\u044f equip_all()#\u041e\u0434\u0435\u0432\u0430\u0435\u043c \u0432\u0441\u0451 \u043e\u0440\u0443\u0436\u0438\u0435 return #\u041c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043e\u0440\u0443\u0436\u0438\u0435 func can_add(): if (weapon_count &lt; 6): return true else: return false #\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u043e\u0442 \u0434\u0435\u0440\u0435\u0432\u0430 func _on_SkillTree_branch_skill_up(param, scale): #\u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 match param: 0:#\u0443\u0440\u043e\u043d damage_scale += damage_scale * scale\/100# \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0443\u0440\u043e\u043d 1:#\u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c speed += speed * scale\/100# \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c 2:#\u0445\u043f health += round(health * scale\/100)# \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u043c \u0445\u043f _user_interface.init_health(health)#\u043f\u0435\u0440\u0435\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c ui _: pass  #\u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u043e\u0434\u043d\u044f\u0442\u0438\u044f \u043e\u043f\u044b\u0442\u0430 func level_up(): if (current_exp == max_exp):#\u0415\u0441\u043b\u0438 \u0434\u043e\u0441\u0442\u0438\u0433\u043b\u0438 \u043e\u043f\u044b\u0442\u0430 \u0434\u043b\u044f \u043b\u0432\u043b\u0430\u043f\u0430 emit_signal(\"lvl_up\")#\u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u0438\u0433\u043d\u0430\u043b max_exp *= scale_exp#\u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0442\u0440\u0435\u0431\u0443\u0435\u043c\u044b\u0439 \u043e\u043f\u044b\u0442 \u0434\u043b\u044f \u0441\u043b\u0435\u0434 \u0443\u0440\u043e\u0432\u043d\u044f current_exp = 0#\u043e\u0431\u043d\u0443\u043b\u044f\u0435\u043c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043e\u043f\u044b\u0442 _user_interface.init_exp()#\u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<h2>\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043a<\/h2>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u0443\u0447\u0438\u0442\u044c \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430 \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u043e\u0441\u0442\u0440\u043e\u0439\u043a\u0438. \u041f\u043e \u043d\u0430\u0436\u0430\u0442\u0438\u044e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0439 \u043a\u043b\u0430\u0432\u0438\u0448\u0438, \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u044f\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u043c\u0435\u043d\u044e \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043f\u043e\u0441\u0442\u0440\u043e\u0439\u043a\u0443 \u0438 \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0435\u0451 \u0437\u0430 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043e\u043f\u044b\u0442.<\/p>\n<h3>\u0411\u043e\u043b\u0432\u0430\u043d\u043a\u0430 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043a<\/h3>\n<p>\u0421\u043e\u0437\u0434\u0430\u0451\u043c \u043d\u043e\u0432\u0443\u044e \u0441\u0446\u0435\u043d\u0443, \u0433\u043b\u0430\u0432\u043d\u044b\u043c \u0443\u0437\u043b\u043e\u043c \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c KinematicBody2D(DefaultBuilding),\u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0435 \u043a \u043d\u0435\u043c\u0443:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c2f\/883\/2ef\/c2f8832efd9bec5c67afd7b4593cb106.png\" width=\"287\" height=\"101\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c2f\/883\/2ef\/c2f8832efd9bec5c67afd7b4593cb106.png\"\/><\/figure>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u0446\u0435\u043d\u0443 \u0432 \u043d\u043e\u0432\u0443\u044e \u0433\u0440\u0443\u043f\u043f\u0443 all_buildings, \u0447\u0442\u043e\u0431\u044b \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u0438\u0445 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u0441\u0446\u0435\u043d\u044b \u0438\u0433\u0440\u044b. \u041d\u0430 \u044d\u0442\u043e \u0431\u043e\u043b\u0432\u0430\u043d\u043a\u0430 \u043f\u043e\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0433\u043e\u0442\u043e\u0432\u0430.<\/p>\n<h3>\u0411\u043e\u043b\u0432\u0430\u043d\u043a\u0430 \u0437\u0430\u0449\u0438\u0442\u043d\u043e\u0439 \u043f\u043e\u0441\u0442\u0440\u043e\u0439\u043a\u0438<\/h3>\n<p>\u0412\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0433\u043b\u0430\u0432\u043d\u044b\u043c \u0443\u0437\u043b\u043e\u043c \u0441\u0446\u0435\u043d\u044b \u0411\u043e\u043b\u0432\u0430\u043d\u043a\u0443 \u0434\u043b\u044f \u043f\u043e\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0435\u0449\u0451 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/4cc\/143\/11c\/4cc14311c72921043144474d9c0b5082.png\" width=\"281\" height=\"180\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/4cc\/143\/11c\/4cc14311c72921043144474d9c0b5082.png\"\/><\/figure>\n<p>\u0412\u044b\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c 2 ColorRect, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u043b\u043e\u0441\u043a\u043e\u0439 \u0436\u0438\u0437\u043d\u0438, \u0442\u0430\u043a-\u0436\u0435, \u043a\u0430\u043a \u0434\u0435\u043b\u0430\u043b\u0438 \u044d\u0442\u043e \u0434\u043b\u044f \u0431\u043e\u043b\u0432\u0430\u043d\u043a\u0438 \u0432\u0440\u0430\u0433\u0430. \u041d\u0430\u0432\u0435\u0448\u0438\u0432\u0430\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442 \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0435\u0433\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e:<\/p>\n<pre><code class=\"python\">extends KinematicBody2D  #\u041e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0434\u0435\u0440\u0435\u0432\u0430 onready var _health_bar = $HealthBar onready var _red_health_bar = $HealthBar\/RedHealthBar onready var _immortal_timer = $ImmortalTimer  #\u041e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0445\u043f export var health = 5  #\u041e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0434\u043b\u0438\u043d\u044b \u043a\u0440\u0430\u0441\u043d\u043e\u0439 \u043f\u043e\u043b\u043e\u0441\u043a\u0438 var health_bar_size  #\u041f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u043c \u0440\u0430\u0437\u043c\u0435\u0440 \u043a\u0440\u0430\u0441\u043d\u043e\u0439 \u043f\u043e\u043b\u043e\u0441\u043a\u0438 func _ready(): health_bar_size = round(_red_health_bar.rect_size.x \/ health)  #\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0443\u0440\u043e\u043d\u0430 func take_damage(dmg): #\u0415\u0441\u043b\u0438 \u043c\u043e\u0436\u043d\u043e \u0443\u0434\u0430\u0440\u0438\u0442\u044c if(_immortal_timer.is_stopped()): health -= dmg#\u043d\u0430\u043d\u043e\u0441\u0438\u043c \u0443\u0440\u043e\u043d _immortal_timer.start()#\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b\u0438 \u0442\u0430\u0439\u043c\u0435\u0440 #\u0423\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u043c \u043a\u0440\u0430\u0441\u043d\u0443\u044e \u043f\u043e\u043b\u043e\u0441\u043a\u0443 _red_health_bar.rect_size.x -= health_bar_size * dmg #\u0415\u0441\u043b\u0438 \u0445\u043f \u043a\u043e\u043d\u0447\u0438\u043b\u0438\u0441\u044c, \u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0441\u043c\u0435\u0440\u0442\u0438 if(health &lt;= 0): dead() #\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u043c\u0435\u0440\u0442\u0438 func dead(): #\u0411\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u043f\u043e\u0441\u0442\u0440\u043e\u0439\u043a\u0438 pass <\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u0434\u0430\u0442\u044c \u0441\u043b\u043e\u0438 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0439, \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 \u0438\u043c\u0435\u043d\u0443\u0435\u043c \u043d\u043e\u0432\u044b\u0439 \u0441\u043b\u043e\u0439 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0439( \u0443 \u043c\u0435\u043d\u044f 8, \u043d\u0430\u0437\u0432\u0430\u043b Protect_building) \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u043c \u0437\u0430\u0449\u0438\u0442\u043d\u043e\u0439 \u043f\u043e\u0441\u0442\u0440\u043e\u0439\u043a\u0435 \u044d\u0442\u043e\u0442 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0438 \u0432 \u043c\u0430\u0441\u043a\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c, \u0447\u0442\u043e \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u0432\u0440\u0430\u0433\u0430\u043c\u0438<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/8ce\/4a0\/4ee\/8ce4a04eefb85e8bb9e2573c30483d33.png\" width=\"404\" height=\"162\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/8ce\/4a0\/4ee\/8ce4a04eefb85e8bb9e2573c30483d33.png\"\/><\/figure>\n<h3>\u041e\u0431\u044b\u0447\u043d\u0430\u044f \u0431\u0430\u0440\u0440\u0438\u043a\u0430\u0434\u0430<\/h3>\n<p>\u0412\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0433\u043b\u0430\u0432\u043d\u044b\u043c \u0443\u0437\u043b\u043e\u043c \u0441\u0446\u0435\u043d\u044b \u0431\u043e\u043b\u0432\u0430\u043d\u043a\u0443 \u0437\u0430\u0449\u0438\u0442\u043d\u043e\u0439 \u043f\u043e\u0441\u0442\u0440\u043e\u0439\u043a\u0438, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0445\u043f \u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435, \u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0441\u043c\u0435\u0440\u0442\u0438:<\/p>\n<pre><code class=\"python\">extends \"res:\/\/scenes\/Buildings\/ProtectBuilding\/DefaultProtectBuilding.gd\"  #\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u043c\u0435\u0440\u0442\u0438 func dead(): #\u042d\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u0430\u044f \u0431\u0430\u0440\u0438\u043a\u0430\u0434\u0430, \u043e\u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0443\u0434\u0430\u043b\u044f\u0442\u044c\u0441\u044f queue_free() <\/code><\/pre>\n<p>\u0423 \u043c\u0435\u043d\u044f \u0441\u0442\u043e\u0438\u0442 10 \u0436\u0438\u0437\u043d\u0435\u0439<\/p>\n<h3>\u0412\u0437\u0440\u044b\u0432\u0430\u044e\u0449\u0430\u044f\u0441\u044f \u0431\u0430\u0440\u0440\u0438\u043a\u0430\u0434\u0430<\/h3>\n<p>\u0413\u043b\u0430\u0432\u043d\u044b\u043c \u0443\u0437\u043b\u043e\u043c \u0441\u0446\u0435\u043d\u044b \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0431\u043e\u043b\u0432\u0430\u043d\u043a\u0443 \u0437\u0430\u0449\u0438\u0442\u043d\u043e\u0439 \u043f\u043e\u0441\u0442\u0440\u043e\u0439\u043a\u0438. \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/db2\/d10\/4ce\/db2d104ce11632ab8ae5e61f30007b7f.png\" width=\"282\" height=\"278\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/db2\/d10\/4ce\/db2d104ce11632ab8ae5e61f30007b7f.png\"\/><\/figure>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0443 \u0431\u0430\u0440\u0440\u0438\u043a\u0430\u0434\u044b \u0437\u0430\u043a\u043e\u043d\u0447\u0430\u0442\u0441\u044f \u0436\u0438\u0437\u043d\u0438, \u043e\u043d\u0430 \u0432\u0437\u043e\u0440\u0432\u0451\u0442\u0441\u044f. \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044e \u0432\u0437\u0440\u044b\u0432\u0430. \u0420\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442 \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0435\u0433\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e:<\/p>\n<pre><code class=\"python\">extends \"res:\/\/scenes\/Buildings\/ProtectBuilding\/DefaultProtectBuilding.gd\"  onready var _animated_sprite = $AnimatedSprite onready var _collision_shape = $CollisionShape2D onready var _collision_shape_bum = $Bum\/CollisionShapeBum#\u0420\u0430\u0434\u0438\u0443\u0441 \u0432\u044b\u0437\u0440\u044b\u0432\u0430 onready var _bum_live_time = $Bum\/BumLiveTime #\u0422\u0430\u0439\u043c\u0435\u0440 \u0436\u0438\u0437\u043d\u0438 \u0432\u0437\u0440\u044b\u0432\u0430 onready var _bum_sound = $Bum\/BumSound #\u0417\u0432\u0443\u043a \u0432\u0437\u0440\u044b\u0432\u0430  export var damage = 3#\u0423\u0440\u043e\u043d \u0432\u0437\u0440\u044b\u0432\u0430  #\u041f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0441\u043c\u0435\u0440\u0442\u0438 func dead(): _animated_sprite.play(\"Bum\")# \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0432 \u0432\u0437\u0440\u044b\u0432 _collision_shape.disabled = true # \u0432\u044b\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043e\u0431\u044b\u0447\u043d\u0443\u044e \u0444\u0438\u0433\u0443\u0440\u0443 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f _collision_shape_bum.disabled = false # \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0444\u0438\u0433\u0443\u0440\u0443 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u0432\u0437\u0440\u044b\u0432\u0430 _bum_live_time.start()#\u0412\u043a\u043b\u044e\u0430\u0435\u043c \u0442\u0430\u0439\u043c\u0435\u0440 _bum_sound.play()#\u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u0435\u043c \u0437\u0432\u0443\u043a  #\u0415\u0441\u043b\u0438 \u043a\u0442\u043e-\u0442\u043e \u0432 \u0432\u0437\u0440\u044b\u0432\u0435 func _on_Bum_body_entered(body): #\u0438 \u0435\u0441\u0442\u044c \u043c\u0435\u0442\u043e\u0434 hit if(body.has_method(\"hit\")): #\u043d\u0430\u043d\u043e\u0441\u0438\u043c \u0443\u0440\u043e\u043d body.hit(damage)  #\u0442\u0430\u0439\u043c\u0435\u0440 \u043a\u043e\u043d\u0447\u0438\u043b\u0441\u044f, \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u0432\u0437\u0440\u044b\u0432 func _on_BumLiveTime_timeout(): queue_free() <\/code><\/pre>\n<p>\u0423 \u043c\u0435\u043d\u044f \u0441\u0442\u043e\u0438\u0442 5 \u0436\u0438\u0437\u043d\u0435\u0439 \u0438 \u0443\u0440\u043e\u043d 2<\/p>\n<h3>\u0411\u043e\u043b\u0432\u0430\u043d\u043a\u0430 \u0430\u0442\u0430\u043a\u0443\u044e\u0449\u0435\u0439 \u043f\u043e\u0441\u0442\u0440\u043e\u0439\u043a\u0438<\/h3>\n<p>\u0412\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0433\u043b\u0430\u0432\u043d\u044b\u043c \u0443\u0437\u043b\u043e\u043c \u0441\u0446\u0435\u043d\u044b, \u0431\u043e\u043b\u0432\u0430\u043d\u043a\u0443 \u043f\u043e\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432 \u0434\u0435\u0440\u0435\u0432\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 Timer(CouldownTimer):<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/24e\/413\/fa2\/24e413fa28d81d8e2454b24b9de9ab13.png\" width=\"280\" height=\"141\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/24e\/413\/fa2\/24e413fa28d81d8e2454b24b9de9ab13.png\"\/><\/figure>\n<p>\u041d\u0430\u0432\u0435\u0448\u0438\u0432\u0430\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442 \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0435\u0433\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e:<\/p>\n<pre><code class=\"python\">extends KinematicBody2D #\u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0434\u0435\u0440\u0435\u0432\u0430 onready var _couldown_timer = $CouldownTimer #\u0437\u0430\u0434\u0430\u0451\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 export (PackedScene) var bullet_scene#\u043f\u0443\u043b\u044f export var damage = 1#\u0443\u0440\u043e\u043d export var fire_rate = 2#\u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0430\u0442\u0430\u043a\u0438 #\u043f\u0440\u0438\u0441\u0432\u043e\u0438\u043b\u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0430\u0442\u0430\u043a\u0438 \u0442\u0430\u0439\u043c\u0435\u0440\u0443 func _ready(): _couldown_timer.wait_time = fire_rate #\u043a\u043e\u0433\u0434\u0430 \u0442\u0430\u0439\u043c\u0435\u0440 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u043b, \u0441\u0442\u0440\u0435\u043b\u044f\u0435\u043c func _on_CouldownTimer_timeout(): fire() #\u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0432\u044b\u0441\u0442\u0440\u0435\u043b\u0430 \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c func fire(): pass #\u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u0443\u043b\u0438 func spawn_bullet(rot): # \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430 \u043f\u0443\u043b\u0438, \u043f\u043e\u0437\u0436\u0435 \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f  var b = bullet_scene.instance() #\u0437\u0430\u0434\u0430\u043b\u0438 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438 \u043f\u043e\u0432\u043e\u0440\u043e\u0442 var new_position = position var direction = rotation - rot get_parent().add_child(b)# \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u0443\u043b\u044e, \u043a\u0430\u043a \u043f\u043e\u0442\u043e\u043c\u043a\u0430 \u043e\u0440\u0443\u0436\u0438\u044f b.scale = Vector2(0.5,0.5) b.start(new_position,direction) b.damage = damage# \u0437\u0430\u0434\u0430\u0451\u043c \u043f\u0443\u043b\u0435 \u0443\u0440\u043e\u043d <\/code><\/pre>\n<p>\u0421 \u0430\u0442\u0430\u043a\u0443\u044e\u0449\u0438\u043c\u0438 \u043f\u043e\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438 \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0435 \u043c\u044b, \u043d\u0435 \u0432\u0440\u0430\u0433\u0438.<\/p>\n<h3>\u0422\u0443\u0440\u0435\u043b\u044c \u0441\u0442\u0440\u0435\u043b\u044f\u044e\u0449\u0430\u044f \u0432\u043e \u043a\u0440\u0443\u0433<\/h3>\n<p>\u0413\u043b\u0430\u0432\u043d\u044b\u043c \u0443\u0437\u043b\u043e\u043c \u0441\u0446\u0435\u043d\u044b \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0431\u043e\u043b\u0432\u0430\u043d\u043a\u0443 \u0430\u0442\u0430\u043a\u0443\u044e\u0449\u0435\u0439 \u043f\u043e\u0441\u0442\u0440\u043e\u0439\u043a\u0438. \u0420\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442 \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e:<\/p>\n<pre><code class=\"python\">extends \"res:\/\/scenes\/Buildings\/AtackBuilding\/DefaultAtackBuilding.gd\"   func fire(): #\u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043f\u0443\u043b\u0438 \u0441 \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430\u043c\u0438 spawn_bullet(0) spawn_bullet(PI\/4) spawn_bullet(2*PI\/4) spawn_bullet(3*PI\/4) spawn_bullet(4*PI\/4) spawn_bullet(5*PI\/4) spawn_bullet(6*PI\/4) spawn_bullet(7*PI\/4) #\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043f\u0435\u0440\u0435\u0437\u0430\u0440\u044f\u0434\u043a\u0443 _couldown_timer.start() <\/code><\/pre>\n<p> \u0423 \u043c\u0435\u043d\u044f \u0441\u0442\u043e\u0438\u0442 1 \u0443\u0440\u043e\u043d\u0430 ,\u043f\u0435\u0440\u0435\u0437\u0430\u0440\u044f\u0434\u043a\u0430 2, \u0441\u0446\u0435\u043d\u0430 \u043f\u0443\u043b\u0438 \u0434\u0440\u043e\u0431\u043e\u0432\u0438\u043a\u0430<\/p>\n<h3>\u0422\u0443\u0440\u0435\u043b\u044c \u0441\u0442\u0440\u0435\u043b\u044f\u044e\u0449\u0430\u044f \u0440\u0430\u043a\u0435\u0442\u0430\u043c\u0438<\/h3>\n<p>\u0413\u043b\u0430\u0432\u043d\u044b\u043c \u0443\u0437\u043b\u043e\u043c \u0441\u0446\u0435\u043d\u044b \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0431\u043e\u043b\u0432\u0430\u043d\u043a\u0443 \u0430\u0442\u0430\u043a\u0443\u044e\u0449\u0435\u0439 \u043f\u043e\u0441\u0442\u0440\u043e\u0439\u043a\u0438. \u0422\u0443\u0440\u0435\u043b\u044c \u0431\u0443\u0434\u0435\u0442 \u0441\u0442\u0440\u0435\u043b\u044f\u0442\u044c \u0440\u0430\u043a\u0435\u0442\u0430\u043c\u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u043c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0438. \u0420\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442 \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e:<\/p>\n<pre><code class=\"python\">func fire(): spawn_bullet(randi() % 361) _couldown_timer.start()<\/code><\/pre>\n<p>\u0413\u043b\u0430\u0432\u043d\u043e\u0435 \u0432 \u0441\u0446\u0435\u043d\u0443 \u043f\u0443\u043b\u0438, \u0437\u0430\u043b\u0435\u0439\u0442\u0435 \u0441\u0446\u0435\u043d\u0443 \u0441\u043d\u0430\u0440\u044f\u0434\u0430 \u0431\u0430\u0437\u0443\u043a\u0438. \u0423 \u043c\u0435\u043d\u044f \u0441\u0442\u043e\u0438\u0442 2 \u0443\u0440\u043e\u043d\u0430 \u0438 \u043f\u0435\u0440\u0435\u0437\u0430\u0440\u044f\u0434\u043a\u0430 5.<\/p>\n<p>\u0425\u043e\u0440\u043e\u0448\u043e, \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0441\u043e\u0437\u0434\u0430\u043b\u0438, \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0434\u043b\u044f \u043d\u0438\u0445 \u043c\u0435\u043d\u044e.<\/p>\n<h3>\u0421\u0446\u0435\u043d\u0430 \u0431\u043e\u043b\u0432\u0430\u043d\u043a\u0438 \u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u043e\u0441\u0442\u0440\u043e\u0439\u043a\u0438<\/h3>\n<p>\u0421\u043e\u0437\u0434\u0430\u0451\u043c \u043d\u043e\u0432\u0443\u044e \u0441\u0446\u0435\u043d\u044b. \u0413\u043b\u0430\u0432\u043d\u044b\u043c \u0443\u0437\u043b\u043e\u043c \u0441\u0446\u0435\u043d\u044b \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c TextureButton(BuildingsButton), \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/9fa\/32d\/aa2\/9fa32daa27556716e8b66e5cca7d416f.png\" width=\"279\" height=\"103\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/9fa\/32d\/aa2\/9fa32daa27556716e8b66e5cca7d416f.png\"\/><\/figure>\n<p>\u0412 BuildingsButton \u0437\u0430\u043b\u0438\u0432\u0430\u0435\u043c \u0441\u043f\u0440\u0430\u0439\u0442, \u0432 label \u0431\u0443\u0434\u0435\u0442 \u043f\u0438\u0441\u0430\u0442\u044c\u0441\u044f \u0446\u0435\u043d\u0430 \u043f\u043e\u0441\u0442\u0440\u043e\u0439\u043a\u0438, \u0432 \u0441\u043f\u0440\u0430\u0439\u0442\u0435 \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u043f\u043e\u0441\u0442\u0440\u043e\u0439\u043a\u0438. \u041d\u0430\u0432\u0435\u0448\u0438\u0432\u0430\u0435\u043c \u043d\u0430 \u043a\u043e\u0440\u0435\u043d\u044c \u0441\u043a\u0440\u0438\u043f\u0442 \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0435\u0433\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e:<\/p>\n<pre><code class=\"python\">extends TextureButton  #\u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 #\u041a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u043c\u0430\u044f \u0432 Sprite export (Texture) var img #\u041a\u0430\u043a\u0443\u044e \u043f\u043e\u0441\u0442\u0440\u043e\u0439\u043a\u0443 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u0440\u0438 \u043f\u043e\u043a\u0443\u043f\u043a\u0435 export (PackedScene) var building_scene #\u0426\u0435\u043d\u0430 export var building_price: int #\u0421\u0438\u0433\u043d\u0430\u043b \u043e \u043f\u043e\u043a\u0443\u043f\u043a\u0435 signal building_buy(building_scene, building_price)  # \u0412 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 _ready() \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u0435\u043c \u0438\u043a\u043e\u043d\u043a\u0443 \u043a\u043d\u043e\u043f\u043a\u0438, \u0442\u0435\u043a\u0441\u0442 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u0438  #\u0438 \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0435\u043c \u0441\u0438\u0433\u043d\u0430\u043b \u043d\u0430\u0436\u0430\u0442\u0438\u044f \u043a\u043d\u043e\u043f\u043a\u0438 func _ready(): $Sprite.texture = img $Label.text = String(building_price) + \" Exp\" connect(\"pressed\",self,\"_on_BuildingsButton_pressed\")  func _on_BuildingsButton_pressed(): emit_signal(\"building_buy\",building_scene,building_price) <\/code><\/pre>\n<h3>\u041c\u0435\u043d\u044e \u0432\u044b\u0431\u043e\u0440\u0430 \u043f\u043e\u0441\u0442\u0440\u043e\u0439\u043a\u0438<\/h3>\n<p>\u0413\u043b\u0430\u0432\u043d\u044b\u043c \u0443\u0437\u043b\u043e\u043c \u0441\u0446\u0435\u043d\u044b \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c Node2D(BuildingMenu), \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u043c\u0438 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c Sprite \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043d\u0430\u0448\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0435 \u0440\u0430\u043d\u0435\u0435 \u043a\u043d\u043e\u043f\u043a\u0438, \u043d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u044f \u0438\u0445 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c.<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/436\/e56\/33e\/436e5633ea3feedd6637f255243871a1.png\" width=\"276\" height=\"172\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/436\/e56\/33e\/436e5633ea3feedd6637f255243871a1.png\"\/><\/figure>\n<p>\u041d\u0430\u0432\u0435\u0448\u0438\u0432\u0430\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442 \u043d\u0430 BuildingMenu \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e:<\/p>\n<pre><code class=\"python\">extends Node2D #\u0421\u0438\u0433\u043d\u0430\u043b \u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0439\u043a\u0435 signal building_stand(building,building_price) #\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043c\u043e\u0436\u043d\u043e-\u043b\u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043c\u0435\u043d\u044e var can_show = true #\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0438\u0433\u0440\u043e\u043a\u0430 var player  #\u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0435\u043c \u043a\u043d\u043e\u043f\u043a\u0438 func _ready(): connect_button()  #\u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u043a\u043d\u043e\u043f\u043e\u043a func connect_button(): #\u041f\u0440\u043e\u0431\u0435\u0433\u0430\u0435\u043c\u0441\u044f \u043f\u043e \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c \u0434\u0435\u0440\u0435\u0432\u0430 for i in range(get_child_count()): #\u0415\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 if (get_child(i).has_method(\"_on_BuildingsButton_pressed\")): #\u0422\u043e \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0435\u043c \u043e\u0442 \u044d\u0442\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0441\u0438\u0433\u043d\u0430\u043b var btn = get_child(i).connect(\"building_buy\",self,\"_on_building_buy\") #\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 func _on_building_buy(scene,price): emit_signal(\"building_stand\",scene,price)#\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u0438\u0433\u043d\u0430\u043b \u0434\u0430\u043b\u044c\u0448\u0435  #\u0421\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u043d\u0430\u0436\u0430\u0442\u0438\u0435 \u043d\u0430 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u0435\u043d\u044e func _process(delta): #\u0415\u0441\u043b\u0438 \u043d\u0430\u0436\u0430\u0442\u0430 \u043a\u043d\u043e\u043f\u043a\u0430, \u0443 \u043c\u0435\u043d\u044f \u044d\u0442\u043e Z if(Input.is_action_just_pressed(\"Open_build_menu\")): #\u0415\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c if(can_show): show()#\u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c can_show = false#\u043c\u0435\u043d\u044f\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e position = player.position#\u0412\u044b\u0441\u0442\u0432\u043b\u044f\u0435\u043c \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 position.x += 225 get_tree().paused = true#\u0432\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043f\u0430\u0443\u0437\u0443 else:#\u0418\u043d\u0430\u0447\u0435 hide()#\u041f\u0440\u044f\u0447\u0435\u043c can_show = true#\u043c\u0435\u043d\u044f\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e get_tree().paused = false#\u0432\u044b\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043f\u0430\u0443\u0437\u0443 <\/code><\/pre>\n<p>\u0422\u0430\u043a-\u0436\u0435 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c, \u0447\u0442\u043e \u043f\u0430\u0443\u0437\u0430 \u043d\u0435 \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u0443 \u044d\u0442\u043e\u0439 \u0441\u0446\u0435\u043d\u044b. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u043a\u043e\u0440\u0435\u043d\u044c \u0441\u0446\u0435\u043d\u044b \u043c\u0435\u043d\u044e \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043a, \u0432 \u0438\u043d\u0441\u043f\u0435\u043a\u0442\u043e\u0440\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u043c pause mode \u0438 \u0441\u0442\u0430\u0432\u0438\u043c \u0435\u0433\u043e \u0432 Process.<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u0430\u043a \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442:<\/p>\n<figure class=\"float\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/6ee\/045\/dc6\/6ee045dc690887975482efd25c08336a.png\" width=\"297\" height=\"375\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/6ee\/045\/dc6\/6ee045dc690887975482efd25c08336a.png\"\/><\/figure>\n<h3>\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441<\/h3>\n<p>\u0412 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435, \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u044e\u0449\u0443\u044e \u043e\u043f\u044b\u0442:<\/p>\n<pre><code class=\"python\"># \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u043f\u0438\u0441\u044b\u0432\u0430\u043d\u0438\u044f \u043e\u043f\u044b\u0442\u0430 func remove_exp(minus_exp): current_exp -= minus_exp#\u0412\u044b\u0447\u043b\u0438 \u043e\u043f\u044b\u0442 _current_exp_bar.rect_size.x -= exp_bar_size * minus_exp#\u0443\u043c\u0435\u043d\u044c\u0448\u0438\u043b\u0438 \u0434\u043b\u0438\u043d\u0443 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0430 _exp.text = String(current_exp) + \"\/\" + String(max_exp)#\u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0432 \u043b\u044d\u0439\u0431\u044d\u043b \u043d\u0430\u0448 \u043e\u043f\u044b\u0442<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u041f\u043e\u043b\u043d\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">extends Node2D  #\u042d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0434\u0435\u0440\u0435\u0432\u0430 onready var _score_add_timer = $Score\/ScoreAddTimer onready var _score = $Score onready var _current_health_bar = $CurrentHealthBar onready var _health = $CurrentHealthBar\/Health onready var _current_exp_bar = $CurrentExpBar onready var _exp = $CurrentExpBar\/Exp onready var _buildings_menu = $BuildingsMenu  var max_health #\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b-\u0432\u043e \u0445\u043f var current_health #\u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u043a\u043e\u043b-\u0432\u043e \u0445\u043f var health_bar_size #\u0420\u0430\u0437\u043c\u0435\u0440 \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0443\u0436\u043d\u043e \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0442\u044c \u0437\u0435\u043b\u0451\u043d\u044b\u0439 \u043a\u0432\u0430\u0434\u0440\u0430\u0442  var max_exp #\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b-\u0432\u043e \u043e\u043f\u044b\u0442\u0430 var current_exp #\u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u043a\u043e\u043b-\u0432\u043e \u043e\u043f\u044b\u0442\u0430 var exp_bar_size #\u0420\u0430\u0437\u043c\u0435\u0440 \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0443\u0436\u043d\u043e \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0442\u044c \u0436\u0451\u043b\u0442\u044b\u0439 \u043a\u0432\u0430\u0434\u0440\u0430\u0442  # \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0437\u0430\u0434\u0430\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043e\u043f\u044b\u0442\u0430 func init_exp(add_exp): max_exp = add_exp  current_exp = 0  _exp.text = String(current_exp) + \"\/\" + String(max_exp)#\u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0432 \u043b\u044d\u0439\u0431\u044d\u043b \u043d\u0430\u0448 \u043e\u043f\u044b\u0442 exp_bar_size = _current_exp_bar.rect_size.x \/ max_exp# \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u0434\u043b\u0438\u043d\u043d\u0443 \u0434\u0435\u043b\u0435\u043d\u0438\u044f _current_exp_bar.rect_size.x = 0 #\u043e\u0431\u043d\u0443\u043b\u044f\u0435\u043c \u043f\u043e\u043b\u043e\u0441\u043a\u0443 \u043e\u043f\u044b\u0442\u0430 \u0434\u043e 0  # \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0437\u0430\u0434\u0430\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0445\u043f func init_health(hp): max_health = hp current_health = hp _health.text = String(current_health) + \"\/\" + String(max_health)#\u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0432 \u043b\u044d\u0439\u0431\u044d\u043b \u043d\u0430\u0448\u0438 \u0445\u043f health_bar_size = _current_health_bar.rect_size.x \/ max_health# \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u0434\u043b\u0438\u043d\u043d\u0443 \u0434\u0435\u043b\u0435\u043d\u0438\u044f  # \u041f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0442\u0430\u0439\u043c\u0435\u0440 func _ready(): _score_add_timer.start()  # \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u0430\u044f \u043f\u0440\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u0443\u0440\u043e\u043d\u0430 func take_damage(damage): current_health -= damage  _health.text = String(current_health) + \"\/\" + String(max_health) _current_health_bar.rect_size.x -= health_bar_size * damage  # \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u0430\u044f \u043f\u0440\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u043e\u043f\u044b\u0442\u0430 func take_exp(add_exp): current_exp += add_exp #\u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u043e\u043f\u044b\u0442 _exp.text = String(current_exp) + \"\/\" + String(max_exp)#\u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0432 \u043b\u044d\u0439\u0431\u044d\u043b \u043d\u0430\u0448 \u043e\u043f\u044b\u0442 _current_exp_bar.rect_size.x += exp_bar_size * add_exp#\u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0434\u043b\u0438\u043d\u0443 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0430  # \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u043f\u0438\u0441\u044b\u0432\u0430\u043d\u0438\u044f \u043e\u043f\u044b\u0442\u0430 func remove_exp(minus_exp): current_exp -= minus_exp#\u0412\u044b\u0447\u043b\u0438 \u043e\u043f\u044b\u0442 _current_exp_bar.rect_size.x -= exp_bar_size * minus_exp#\u0443\u043c\u0435\u043d\u044c\u0448\u0438\u043b\u0438 \u0434\u043b\u0438\u043d\u0443 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0430 _exp.text = String(current_exp) + \"\/\" + String(max_exp)#\u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0432 \u043b\u044d\u0439\u0431\u044d\u043b \u043d\u0430\u0448 \u043e\u043f\u044b\u0442  # \u0421\u0438\u0433\u043d\u0430\u043b \u043e\u0442 \u0442\u0430\u0439\u043c\u0435\u0440\u0430 func _on_ScoreAddTimer_timeout(): _score.text = String(int(_score.text) + 1)  #\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0441\u0447\u0451\u0442\u0430 func get_score(): return int(_score.text)  <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<h3>\u0411\u043e\u043b\u0432\u0430\u043d\u043a\u0430 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430<\/h3>\n<p>\u041a \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0443 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u043e\u0442 \u043c\u0435\u043d\u044e \u0438 \u0435\u0433\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443.<\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u043d\u0430\u0448\u0435\u0433\u043e \u043c\u0435\u043d\u044e:<\/p>\n<pre><code class=\"python\">export (NodePath) var build_menu# \u0434\u0435\u0440\u0435\u0432\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0439\u043a\u0438<\/code><\/pre>\n<p>\u0412 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 _ready(), \u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u043c \u0441\u0438\u0433\u043d\u0430\u043b:<\/p>\n<pre><code class=\"python\">#\u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u043c\u0435\u043d\u044e, \u0442\u043e \u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u043c \u0435\u0433\u043e \u0441\u0438\u0433\u043d\u0430\u043b var menu = get_node(build_menu) if (menu != null): menu.connect(\"building_stand\",self,\"build\")<\/code><\/pre>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u0438\u0433\u043d\u0430\u043b\u0430:<\/p>\n<pre><code class=\"python\">#\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u043f\u043e\u0441\u0442\u0440\u043e\u0439\u043a\u0438 func build(build_scene, build_price): #\u0415\u0441\u043b\u0438 \u043e\u043f\u044b\u0442\u0430 >=, \u0447\u0435\u043c \u0441\u0442\u043e\u0438\u0442 \u043f\u043e\u0441\u0442\u0440\u043e\u0439\u043a\u0430 if (current_exp >= build_price): #\u0432\u044b\u0447\u0438\u0442\u0430\u0435\u043c \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c current_exp -= build_price #\u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c UI _user_interface.remove_exp(build_price) #\u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u043e\u0441\u0442\u0440\u043e\u0439\u043a\u0443 var b = build_scene.instance()  b.position = position  get_parent().add_child(b)<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u041f\u043e\u043b\u043d\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">extends KinematicBody2D   #\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0434\u0435\u0440\u0435\u0432\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0432 \u043a\u043e\u0434 onready var _animated_sprite = $AnimatedSprite onready var _idle_animation_timer = $IdleAnimationTimer onready var _immortal_timer = $ImmortalTimer onready var _backpack = $Backpack onready var _user_interface = $Camera2D\/UserInterface #\u041e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u043c\u0435\u043d\u044f\u0442\u044c \u0438\u0437\u0432\u043d\u0435  export var health = 5 #\u0416\u0438\u0437\u043d\u0438 export var speed = 200 #\u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c  export var damage_scale:float = 1#\u041c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u044c \u0443\u0440\u043e\u043d\u0430 export var max_exp = 20#\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u043f\u044b\u0442\u0430 \u043d\u0430\u0434\u043e \u0434\u043b\u044f \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u044f \u0443\u0440\u043e\u0432\u043d\u044f export var scale_exp = 2# \u0432\u043e \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u0441\u044f \u0442\u0440\u0435\u0431\u0443\u0435\u043c\u044b \u043e\u043f\u044b\u0442 \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u044f export (NodePath) var skill_tree# \u0434\u0435\u0440\u0435\u0432\u043e \u043d\u0430\u0432\u044b\u043a\u043e\u0432 export (NodePath) var build_menu# \u0434\u0435\u0440\u0435\u0432\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0439\u043a\u0438 #\u041e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u043a\u0440\u0438\u043f\u0442\u0430 var velocity = Vector2.ZERO #\u0412\u0435\u043a\u0442\u043e\u0440 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f var direction = Vector2.ZERO #\u0412\u0435\u043a\u0442\u043e\u0440 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f var backpack_items = [null,null,null,null,null,null]#\u0440\u044e\u043a\u0437\u0430\u043a var weapon_count = 0 #\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0445\u0440\u0430\u043d\u044f\u0449\u0430\u044f \u043a\u043e\u043b-\u0432\u043e \u043e\u0440\u0443\u0436\u0438\u044f var current_exp = 0 #\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0445\u0440\u0430\u043d\u044f\u0449\u0430\u044f \u043a\u043e\u043b-\u0432\u043e \u043e\u043f\u044b\u0442\u0430 #\u0421\u0438\u0433\u043d\u0430\u043b \u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u0443\u0440\u043e\u043d\u0430 signal take_damage(damage) #\u0421\u0438\u0433\u043d\u0430\u043b \u043e \u0441\u043c\u0435\u0440\u0442\u0438 signal dead #\u0421\u0438\u0433\u043d\u0430 \u043e \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u0438 \u0443\u0440\u043e\u043d\u044f signal lvl_up #\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u043d\u0430\u0436\u0430\u0442\u0438\u0439 func get_input(): velocity = Vector2.ZERO if Input.is_action_pressed(\"left\"): velocity.x -= 1 if Input.is_action_pressed(\"right\"): velocity.x += 1 if Input.is_action_pressed(\"up\"): velocity.y -= 1 if Input.is_action_pressed(\"down\"): velocity.y += 1 direction = velocity.normalized() * speed  #\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0439 func get_anim(): if (_immortal_timer.is_stopped()): #\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0435 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f-\u043b\u0438 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044f \u0431\u0435\u0441\u0441\u043c\u0435\u0440\u0442\u0438\u044f if (velocity != Vector2.ZERO): #\u0415\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f, \u0442\u043e \u0438\u0434\u0451\u043c  _animated_sprite.play(\"Walk\") else: if (_animated_sprite.animation != \"IdleAnimation\"): #\u0418\u043d\u0430\u0447\u0435 \u0435\u0441\u043b\u0438 \u043d\u0435 \u0431\u0440\u0443\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044f, \u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0442\u043e\u0438\u043c _animated_sprite.play(\"Stand\") if (_idle_animation_timer.is_stopped()): #\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043e\u0442\u0447\u0451\u0442 \u0434\u043e \u0431\u0440\u0443\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 _idle_animation_timer.start() if (velocity.x > 0): # \u043f\u043e\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430 \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0443 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f _animated_sprite.flip_h = false  if (velocity.x &lt; 0): _animated_sprite.flip_h = true  #\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0443\u0440\u043e\u043d\u0430 func take_damage(dmg): if(_immortal_timer.is_stopped()): #\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0435 \u0431\u0435\u0441\u0441\u043c\u0435\u0440\u0442\u0435\u043d \u043b\u0438 \u043d\u0430\u0448 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436 health -= dmg _animated_sprite.play(\"TakeDamage\") emit_signal(\"take_damage\",dmg) #\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u0438\u0433\u043d\u0430\u043b \u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u0443\u0440\u043e\u043d\u0430 _user_interface.take_damage(dmg) _immortal_timer.start() #\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0442\u0430\u0439\u043c\u0435\u0440 \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0443\u0440\u043e\u043d\u0430 if(health &lt;= 0): emit_signal(\"dead\")#\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u0438\u0433\u043d\u0430\u043b \u043e \u0441\u043c\u0435\u0440\u0442\u0438   func _ready(): _animated_sprite.animation = \"Stand\" # \u041f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436 \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0442\u043e\u044f\u0442\u044c equip_all() _user_interface.init_exp(max_exp)# \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u044f \u043e\u043f\u044b\u0442\u0430, \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 _user_interface.init_health(health)# \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u043f\u044b\u0442\u0430, \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 #\u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u0434\u0435\u0440\u0435\u0432\u043e, \u0442\u043e \u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u043c \u0435\u0433\u043e \u0441\u0438\u0433\u043d\u0430\u043b var tree = get_node(skill_tree) if (tree != null): tree.connect(\"branch_skill_up\",self,\"_on_SkillTree_branch_skill_up\") #\u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u043c\u0435\u043d\u044e, \u0442\u043e \u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u043c \u0435\u0433\u043e \u0441\u0438\u0433\u043d\u0430\u043b var menu = get_node(build_menu) if (menu != null): menu.connect(\"building_stand\",self,\"build\")   func _physics_process(delta): get_input() get_anim() var collision= move_and_collide(direction * delta)  #\u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e collision \u0434\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f if collision:#\u0435\u0441\u043b\u0438 \u0441\u0442\u043e\u043b\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0435 if collision.collider.has_method(\"pick_up_exp\"):#\u0418 \u0435\u0441\u0442\u044c \u043c\u0435\u0442\u043e\u0434 take_damage collision.collider.pick_up_exp()#\u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u043c \u043e\u043f\u044b\u0442 current_exp += collision.collider.get_exp_param()#\u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 level_up()#\u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u0435 \u043e\u043f\u044b\u0442\u0430 _user_interface.take_exp(collision.collider.get_exp_param())#\u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u043e\u043f\u044b\u0442 func _on_IdleAnimationTimer_timeout(): _animated_sprite.play(\"IdleAnimation\") # \u0412\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0411\u0420\u0423\u0422\u0410\u041b\u042c\u041d\u0423\u042e \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044e \u043f\u043e \u0438\u0441\u0442\u0435\u0447\u0435\u043d\u0438\u0438 \u0442\u0430\u0439\u043c\u0435\u0440\u0430  #\u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u0435\u043d\u0438\u044f \u043e\u0440\u0443\u0436\u0438\u044f func equip_item(slot):# \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u043d\u043e\u043c\u0435\u0440 \u0441\u043b\u043e\u0442\u0430 \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043d\u0443\u0436\u043d\u043e \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u043e\u0440\u0443\u0436\u0438\u0435 if (backpack_items[slot] != null):#\u0415\u0441\u043b\u0438 \u0441\u043b\u043e\u0442 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d var weapon = backpack_items[slot].instance() weapon.position = _backpack.get_slot_position(slot)#\u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u043e\u0437\u0438\u0446\u0443\u044e \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u043b\u043e\u0442\u0430 weapon.name = \"WeaponSlot\" + String(slot)#\u0418\u043c\u0435\u043d\u044f \u043e\u0440\u0443\u0436\u0438\u044f WeaponSlot0..5 add_child(weapon) weapon.scale = Vector2(0.5,0.5)# \u0443 \u043c\u0435\u043d\u044f \u0441\u0442\u043e\u0438\u0442 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0440\u0443\u0436\u0438\u0435, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0443 \u0432\u0430\u0441 \u043d\u0435\u0442 weapon.damage = ceil(weapon.damage*damage_scale)#\u041f\u0435\u0440\u0435\u043c\u043d\u043e\u0436\u0430\u0435\u043c \u0443\u0440\u043e\u043d \u0441 \u043d\u0430\u0448\u0438\u043c \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u043c \u0438 \u043e\u043a\u0440\u0443\u0433\u043b\u044f\u0435\u043c \u0432 \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0441\u0442\u043e\u0440\u043e\u043d\u0443   #\u043e\u0434\u0435\u0432\u0430\u0435\u043c \u0432\u0441\u0451 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0435 \u043e\u0440\u0443\u0436\u0438\u0435 func equip_all(): for i in range(6):#\u041f\u0440\u043e\u0431\u0435\u0433\u0430\u0435\u043c \u043f\u043e \u0432\u0441\u0435\u043c\u0443 \u043c\u0430\u0441\u0441\u0438\u0432\u0443 backpack_item if(get_node(\"WeaponSlot\"+String(i)) != null): var item =get_node(\"WeaponSlot\"+String(i)) #\u0418\u0449\u0435\u043c \u0443\u0437\u0435\u043b if (item != null): #\u0415\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u0442\u043e \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u0435\u0433\u043e \u0441\u043e \u0441\u0446\u0435\u043d\u044b item.queue_free() equip_item(i)# \u0438 \u0440\u0438\u0441\u0443\u0435\u043c \u043d\u043e\u0432\u044b\u0439  #\u0443\u0434\u0430\u043b\u044f\u0435\u043c \u043e\u0440\u0443\u0436\u0438\u0435 func remove_equip_item(slot):#\u041f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u043d\u043e\u043c\u0435\u0440 \u0441\u043b\u043e\u0442\u0430 if (slot >= 0 &amp;&amp; slot &lt;=5):#\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u043e\u043c\u0435\u0440 \u0441\u043b\u043e\u0442\u0430 var item = get_node(\"WeaponSlot\" + slot) backpack_items[slot] = null#\u043e\u0431\u043d\u0443\u043b\u044f\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u0440\u044e\u043a\u0437\u0430\u043a\u0435 item.queue_free()#\u0443\u0434\u0430\u043b\u044f\u0435\u043c \u043e\u0431\u044a\u0435\u043a\u0442 weapon_count -=1 #\u0443\u043c\u0435\u043d\u044c\u0448\u0438\u043b\u0438 \u043d\u0430 1 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043e\u0440\u0443\u0436\u0438\u044f  #\u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043e\u0440\u0443\u0436\u0438\u0435 func add_equip_item(item): for i in range(6): if (backpack_items[i] == null):#\u041d\u0430\u0445\u043e\u0434\u0438\u043c \u043f\u0435\u0440\u0432\u044b\u0439 \u043f\u0443\u0441\u0442\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 backpack_items[i] = item#\u0437\u0430\u043b\u0438\u0432\u0430\u0435\u043c \u0432 \u043d\u0435\u0433\u043e \u0441\u0446\u0435\u043d\u0443 \u043e\u0440\u0443\u0436\u0438\u044f weapon_count +=1 #\u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043b\u0438 \u043d\u0430 1 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043e\u0440\u0443\u0436\u0438\u044f equip_all()#\u041e\u0434\u0435\u0432\u0430\u0435\u043c \u0432\u0441\u0451 \u043e\u0440\u0443\u0436\u0438\u0435 return #\u041c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043e\u0440\u0443\u0436\u0438\u0435 func can_add(): if (weapon_count &lt; 6): return true else: return false #\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u043e\u0442 \u0434\u0435\u0440\u0435\u0432\u0430 func _on_SkillTree_branch_skill_up(param, scale): #\u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 match param: 0:#\u0443\u0440\u043e\u043d damage_scale += damage_scale * scale\/100# \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0443\u0440\u043e\u043d 1:#\u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c speed += speed * scale\/100# \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c 2:#\u0445\u043f health += round(health * scale\/100)# \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u043c \u0445\u043f _user_interface.init_health(health)#\u043f\u0435\u0440\u0435\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c ui _: pass  #\u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u043e\u0434\u043d\u044f\u0442\u0438\u044f \u043e\u043f\u044b\u0442\u0430 func level_up(): if (current_exp == max_exp):#\u0415\u0441\u043b\u0438 \u0434\u043e\u0441\u0442\u0438\u0433\u043b\u0438 \u043e\u043f\u044b\u0442\u0430 \u0434\u043b\u044f \u043b\u0432\u043b\u0430\u043f\u0430 emit_signal(\"lvl_up\")#\u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u0438\u0433\u043d\u0430\u043b max_exp *= scale_exp#\u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0442\u0440\u0435\u0431\u0443\u0435\u043c\u044b\u0439 \u043e\u043f\u044b\u0442 \u0434\u043b\u044f \u0441\u043b\u0435\u0434 \u0443\u0440\u043e\u0432\u043d\u044f current_exp = 0#\u043e\u0431\u043d\u0443\u043b\u044f\u0435\u043c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043e\u043f\u044b\u0442 _user_interface.init_exp(max_exp)#\u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441  #\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u043f\u043e\u0441\u0442\u0440\u043e\u0439\u043a\u0438 func build(build_scene, build_price): #\u0415\u0441\u043b\u0438 \u043e\u043f\u044b\u0442\u0430 >=, \u0447\u0435\u043c \u0441\u0442\u043e\u0438\u0442 \u043f\u043e\u0441\u0442\u0440\u043e\u0439\u043a\u0430 if (current_exp >= build_price): #\u0432\u044b\u0447\u0438\u0442\u0430\u0435\u043c \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c current_exp -= build_price #\u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c UI _user_interface.remove_exp(build_price) #\u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u043e\u0441\u0442\u0440\u043e\u0439\u043a\u0443 var b = build_scene.instance()  b.position = position  get_parent().add_child(b) <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<h3>\u0421\u0446\u0435\u043d\u0430 \u0438\u0433\u0440\u044b<\/h3>\n<p>\u0412 \u0434\u0435\u0440\u0435\u0432\u043e \u0441\u0446\u0435\u043d\u044b \u0438\u0433\u0440\u044b, \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u0430\u0448\u0435 \u043c\u0435\u043d\u044e \u0438 \u0441\u043a\u0440\u044b\u0442\u044c \u0435\u0433\u043e.<\/p>\n<p>\u0412 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043f\u0440\u0438\u0437\u044b\u0432\u0430 \u0433\u0435\u0440\u043e\u044f, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0435\u043c\u0443 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0443 \u043f\u0443\u0442\u0438 \u0434\u0435\u0440\u0435\u0432\u0430:<\/p>\n<pre><code class=\"python\">#\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0433\u0435\u0440\u043e\u044f func spawn_hero(pos): var p if(SelectedCharacter.Character != null):#\u0415\u0441\u043b\u0438 \u0433\u0435\u0440\u043e\u0439 \u0432\u044b\u0431\u0440\u0430\u043d p = SelectedCharacter.Character.instance() else:#\u0415\u0441\u043b\u0438 \u0432\u0434\u0440\u0443\u0433 \u043a\u0430\u043a\u0438\u043c-\u0442\u043e \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043d\u0435 \u0432\u044b\u0431\u0440\u0430\u043d p = CharacterNames.BRUTALHERO.instance() p.name = \"Player\"#\u0417\u0430\u0434\u0430\u0451\u043c \u0438\u043c\u044f, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432 \u0434\u0435\u0440\u0435\u0432\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 p.position = pos p._user_interface add_child(p) #\u041f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u043f\u0443\u0442\u044c \u043a \u0434\u0435\u0440\u0435\u0432\u0443 p.skill_tree=\"..\/SkillTree\" #\u041f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u043f\u0443\u0442\u044c \u043a \u043c\u0435\u043d\u044e p.build_menu =\"..\/BuildingsMenu\" player = p p.z_index = 2#\u0417\u0430\u0434\u0430\u0451\u043c z_index - 2, \u0447\u0442\u043e\u044b\u0431 \u0433\u0435\u0440\u043e\u0439 \u0445\u043e\u0434\u0438\u043b \u0441\u0432\u0435\u0440\u0445\u0443 \u043a\u0440\u043e\u0432\u0438<\/code><\/pre>\n<p>\u0412 \u0444\u0443\u043d\u043a\u0446\u0438\u044e _ready(), \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0443 \u0438\u0433\u0440\u043e\u043a\u0430 \u043a \u043c\u0435\u043d\u044e \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043a:<\/p>\n<pre><code class=\"python\">#\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u0442\u0430\u0440\u0442\u0430(\u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043f\u043e\u0441\u043b\u0435 _init) func _ready(): _mob_spawn_timer.start()#\u0412\u043a\u043b\u044e\u0447\u0438\u043b\u0438 \u0442\u0430\u0439\u043c\u0435\u0440 \u0441\u043f\u0430\u0432\u043d\u0430 _skill_tree.player = player#\u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u043c \u0438\u0433\u0440\u043e\u043a\u0430 \u043a \u0434\u0435\u0440\u0435\u0432\u0443 _skill_tree.add_connect() $BuildingsMenu.player = player#\u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u043c \u0438\u0433\u0440\u043e\u043a\u0430 \u043a \u043c\u0435\u043d\u044e \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043a randomize()# \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b player.position = _character_spawn_point.global_position #\u041f\u0435\u0440\u0435\u0434\u0430\u043b\u0438 \u0438\u0433\u0440\u043e\u043a\u0443 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0435 \u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 player._user_interface.init_health(player.health)# \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043d\u0430\u0448 UI player.connect(\"dead\",self,\"_on_Player_dead\")#\u041f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u043c \u0441\u0438\u0433\u043d\u0430\u043b \u043e \u0441\u043c\u0435\u0440\u0442\u0438 \u0438\u0433\u0440\u043e\u043a\u0430<\/code><\/pre>\n<p>\u0438 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e clear_all(), \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0433\u0440\u0443\u043f\u043f\u044b \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043a:<\/p>\n<pre><code class=\"python\">func clear_level(): WeaponsName.clear_all()#\u0443\u0431\u0438\u0440\u0430\u0435\u043c \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f \u0441 \u043e\u0440\u0443\u0436\u0438\u044f get_tree().call_group(\"all_enemy\", \"queue_free\")#\u0423\u0434\u0430\u043b\u044f\u0435\u043c \u0432\u0441\u0435\u0445 \u0432\u0440\u0430\u0433\u043e\u0432 \u0441\u043e \u0441\u0446\u0435\u043d\u044b get_tree().call_group(\"all_buildings\", \"queue_free\")#\u0423\u0434\u0430\u043b\u044f\u0435\u043c \u0432\u0441\u0435 \u043f\u043e\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0441\u043e \u0441\u0446\u0435\u043d\u044b<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u041f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 \u0441\u0446\u0435\u043d\u044b \u0438\u0433\u0440\u044b<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">extends Node2D   #\u0421\u0446\u0435\u043d\u0430 \u0412\u0440\u0430\u0433\u0430 export (PackedScene) var zombie_enemy  #\u042d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0434\u0435\u0440\u0435\u0432\u0430 onready var _mob_spawn_timer = $MobSpawnTimer onready var player = $Player onready var _character_spawn_point = $CharacterSpawnPoint onready var spawn = $Spawn onready var _skill_tree = $SkillTree #\u041c\u0430\u0441\u0441\u0438\u0432 \u0432\u0441\u0435\u0433\u043e \u043e\u0440\u0443\u0436\u0438\u044f var weapon_massiv = [WeaponsName.BLASTER,WeaponsName.RIFLE, WeaponsName.BAZOOKA, WeaponsName.SHOTGUN] #\u0421\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0433\u0440\u044b var spawn_time = 5 #\u0412\u0440\u0435\u043c\u044f \u0447\u0430\u0441\u0442\u043e\u0442\u044b \u0441\u043f\u0430\u0432\u043d\u0430 \u0432\u0440\u0430\u0433\u043e\u0432 var zombie1_chance = 40#\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e \u0437\u043e\u043c\u0431\u0438 var smart_chance = 40#\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u0443\u043c\u043d\u043e\u0433\u043e \u0437\u043e\u043c\u0431\u0438 var shield_chance = 12#\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u0437\u043e\u043c\u0431\u0438 \u0441 \u0449\u0438\u0442\u043e\u043c var scary_chance = 4#\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u0441\u0442\u0440\u0430\u0448\u043d\u043e\u0433\u043e \u0437\u043e\u043c\u0431\u0438 var fat_chance = 4#\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u0442\u043e\u043b\u0441\u0442\u043e\u0433\u043e \u0437\u043e\u043c\u0431\u0438 var spawn_count = 3#\u043a\u043e\u043b-\u0432\u043e \u043f\u0440\u0438\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0445 \u0437\u043e\u043c\u0431\u0438 var difficult_tick = 0#\u043a\u043e\u043b-\u0432\u043e \u0440\u0430\u0437, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u043b\u0430\u0441\u044c \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c var weapon_add_chance = 0#\u0448\u0430\u043d\u0441 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043e\u0432  #\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0440\u0438\u0437\u044b\u0432\u0430 \u0442\u043e\u0447\u043a\u0438 \u0441\u043f\u0430\u0432\u043d\u0430 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u0446\u0435\u043d\u0430 \u0441 \u0432\u0440\u0430\u0433\u043e\u043c func spawn_point(enemy): var z = EnemyNames.SPAWNPOINT.instance() var rect_pos = spawn.rect_global_position var rect_size = spawn.rect_size #\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u0432\u0435\u043a\u0442\u043e\u0440 \u0441 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0437\u043e\u043c\u0431\u0438 \u043f\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u0441\u044f #\u0434\u043b\u044f \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u043f\u043e \u0445 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430: #\u0431\u0435\u0440\u0451\u043c \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0430 \u043e\u043f \u0445, \u043a\u0430\u043a \u043c\u0438\u043d\u043d\u0438\u043c\u0443\u043c #\u0438 \u0433\u043b\u043e\u0431\u0430\u043b \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u043e \u0445 + \u0440\u0430\u0437\u043c\u0435\u0440 \u043f\u043e \u0445, \u043a\u0430\u043a \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c #\u0434\u043b\u044f y \u0442\u043e\u0436\u0435 \u0441\u0430\u043c\u043e\u0435, \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043c\u0435\u0441\u0442\u043e \u0445-y z.position = Vector2(rand_range(rect_pos.x,rect_pos.x+rect_size.x),rand_range(rect_pos.y,rect_pos.y+rect_size.y)) z.z_index = 100#\u0421\u0442\u0430\u0432\u0438\u043c z_index \u0431\u043e\u043b\u044c\u0448\u0438\u043c, \u0447\u0442\u043e\u0431\u044b \u0442\u043e\u0447\u043a\u0430 \u0441\u043f\u0430\u0432\u043d\u0430 \u0432\u0441\u0435\u0433\u0434\u0430 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0433\u0430\u043b\u0430\u0441\u044c \u043f\u043e\u0432\u0435\u0440\u0445 \u0434\u0440\u0443\u0433\u0438\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 z.player = player#\u0417\u0430\u0434\u0430\u0451\u043c \u0438\u0433\u0440\u043e\u043a\u0430 z.zombie_enemy = enemy#\u0417\u0430\u0434\u0430\u0451\u043c \u0432\u0440\u0430\u0433\u0430 get_parent().add_child(z)# \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0442\u043e\u0447\u043a\u0443 \u0441\u043f\u0430\u0432\u043d\u0430  #\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 func _init(): spawn_hero(Vector2(0,0))#\u0412\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0433\u0435\u0440\u043e\u044f  #\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u0442\u0430\u0440\u0442\u0430(\u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043f\u043e\u0441\u043b\u0435 _init) func _ready(): _mob_spawn_timer.start()#\u0412\u043a\u043b\u044e\u0447\u0438\u043b\u0438 \u0442\u0430\u0439\u043c\u0435\u0440 \u0441\u043f\u0430\u0432\u043d\u0430 _skill_tree.player = player#\u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u043c \u0438\u0433\u0440\u043e\u043a\u0430 \u043a \u0434\u0435\u0440\u0435\u0432\u0443 _skill_tree.add_connect() $BuildingsMenu.player = player#\u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u043c \u0438\u0433\u0440\u043e\u043a\u0430 \u043a \u043c\u0435\u043d\u044e \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043a randomize()# \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b player.position = _character_spawn_point.global_position #\u041f\u0435\u0440\u0435\u0434\u0430\u043b\u0438 \u0438\u0433\u0440\u043e\u043a\u0443 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0435 \u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 player._user_interface.init_health(player.health)# \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043d\u0430\u0448 UI player.connect(\"dead\",self,\"_on_Player_dead\")#\u041f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u043c \u0441\u0438\u0433\u043d\u0430\u043b \u043e \u0441\u043c\u0435\u0440\u0442\u0438 \u0438\u0433\u0440\u043e\u043a\u0430  #\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u0442\u0430\u0439\u043c\u0435\u0440\u0430 MobSpawnTimer func _on_MobSpawnTimer_timeout(): #\u0417\u0430\u0434\u0430\u0451\u043c \u0446\u0438\u043a\u043b \u0434\u043b\u044f \u043f\u0440\u0438\u0437\u044b\u0432\u0430 \u0437\u043e\u043c\u0431\u0438 for i in range(spawn_count): #\u0413\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u0448\u0430\u043d\u0441, \u0434\u0435\u043b\u0430\u0435\u043c \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u043e\u0442 \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043d\u0430 101 - \u0431\u0443\u0434\u0443\u0442 \u0447\u0438\u0441\u043b\u0430 \u0432 \u0440\u0430\u0434\u0438\u0443\u0441\u0435 \u043e\u0442 (0 \u0434\u043e 100) var chance = randi() % 101 if (chance &lt;= zombie1_chance): spawn_point(EnemyNames.ZOMBIE1) elif (chance &lt;= zombie1_chance + smart_chance): spawn_point(EnemyNames.SMARTZOMBIE) elif (chance &lt;= zombie1_chance + smart_chance + shield_chance): spawn_point(EnemyNames.ZOMBIESHEILD) elif (chance &lt;= zombie1_chance + smart_chance + shield_chance + scary_chance): spawn_point(EnemyNames.ZOMBIESCARY) elif (chance &lt;= zombie1_chance + smart_chance + + shield_chance + scary_chance + fat_chance): spawn_point(EnemyNames.FATZOMBIE) #\u0415\u0441\u043b\u0438 \u0432\u0434\u0440\u0443\u0433 \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u0448\u043b\u043e \u043d\u0435 \u0442\u0430\u043a, \u0442\u043e \u0441\u043f\u0430\u0432\u043d\u0438\u043c Zombie1 else: spawn_point(EnemyNames.ZOMBIE1) #\u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0441\u043b\u0435\u0434. \u0434\u0430\u043d\u043d\u044b\u0445 #zombie1_chance = 40 #smart_chance = 40 #shield_chance = 12 #scary_chance = 4 #fat_chance = 4 #\u0415\u0441\u043b\u0438 \u043e\u0442 0 \u0434\u043e 40, \u0442\u043e Zombie1, \u0435\u0441\u043b\u0438 \u043e\u0442 41 \u0434\u043e 80, \u0442\u043e Smart_zombie, #\u0415\u0441\u043b\u0438 \u0442\u043e 81 \u0434\u043e 92, \u0442\u043e Zombie_shield, \u0435\u0441\u043b\u0438 \u043e\u0442 93 \u0434\u043e 96, \u0442\u043e Zombie_scary #\u0415\u0441\u043b\u0438 \u043e\u0442 97 \u0434\u043e 100, \u0442\u043e Fat_zombie _mob_spawn_timer.wait_time = spawn_time#\u0437\u0430\u0434\u0430\u043b\u0438 \u0432\u0440\u0435\u043c\u044f \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043d\u0438\u044f _mob_spawn_timer.start()#\u0432\u043a\u043b\u044e\u0447\u0438\u043b\u0438    #\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u0438\u0433\u043d\u0430\u043b, \u043e\u0442 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430 \u043e \u0441\u043c\u0435\u0440\u0442\u0438 func _on_Player_dead(): save_record(player._user_interface.get_score())#\u0437\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b clear_level() SceneLoader.build_map_path(\"MainMenu\")#\u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u0432 \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u043c\u0435\u043d\u044e  #\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0433\u0435\u0440\u043e\u044f func spawn_hero(pos): var p if(SelectedCharacter.Character != null):#\u0415\u0441\u043b\u0438 \u0433\u0435\u0440\u043e\u0439 \u0432\u044b\u0431\u0440\u0430\u043d p = SelectedCharacter.Character.instance() else:#\u0415\u0441\u043b\u0438 \u0432\u0434\u0440\u0443\u0433 \u043a\u0430\u043a\u0438\u043c-\u0442\u043e \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043d\u0435 \u0432\u044b\u0431\u0440\u0430\u043d p = CharacterNames.BRUTALHERO.instance() p.name = \"Player\"#\u0417\u0430\u0434\u0430\u0451\u043c \u0438\u043c\u044f, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432 \u0434\u0435\u0440\u0435\u0432\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 p.position = pos p._user_interface add_child(p) #\u041f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u043f\u0443\u0442\u044c \u043a \u0434\u0435\u0440\u0435\u0432\u0443 p.skill_tree=\"..\/SkillTree\" #\u041f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u043f\u0443\u0442\u044c \u043a \u043c\u0435\u043d\u044e p.build_menu =\"..\/BuildingsMenu\" player = p p.z_index = 2#\u0417\u0430\u0434\u0430\u0451\u043c z_index - 2, \u0447\u0442\u043e\u044b\u0431 \u0433\u0435\u0440\u043e\u0439 \u0445\u043e\u0434\u0438\u043b \u0441\u0432\u0435\u0440\u0445\u0443 \u043a\u0440\u043e\u0432\u0438   #\u0423\u0441\u043b\u043e\u0436\u043d\u044f\u0435\u043c \u0438\u0433\u0440\u0443 func _on_Difficult_timeout(): #\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u0448\u0430\u043d\u0441 \u043d\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043e\u0440\u0443\u0436\u0438\u044f var weapon_chance = randi() % 100 #\u0415\u0441\u043b\u0438 \u0447\u0438\u0441\u0442\u043e \u043c\u0435\u043d\u044c\u0448\u0435, \u043d\u0430\u0448\u0435\u0433\u043e \u0448\u0430\u043d\u0441\u0430 \u0438 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c if (weapon_chance &lt;= weapon_add_chance &amp;&amp; player.can_add()): #\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0435 \u043e\u0440\u0443\u0436\u0438\u044f \u0438\u0437 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0441 \u043e\u0440\u0443\u0436\u0438\u0435 player.add_equip_item(weapon_massiv[randi() % weapon_massiv.size()]) #\u041e\u0431\u043d\u0443\u043b\u044f\u0435\u043c \u0448\u0430\u043d\u0441 \u043d\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 weapon_add_chance = 0 else: #\u0415\u0441\u043b\u0438 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438, \u0442\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0448\u0430\u043d\u0441 weapon_add_chance+=5 #\u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0441\u0447\u0451\u0442\u0447\u0438\u043a \u0443\u0441\u043b\u043e\u0436\u043d\u0435\u043d\u0438\u044f difficult_tick += 1 #\u041a\u043e\u0433\u0434\u0430 \u0441\u0447\u0451\u0442\u0447\u0438\u043a \u043a\u0440\u0430\u0442\u0435\u043d 3, \u0442\u043e if (difficult_tick % 3 == 0): #\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0435\u0449\u0451 \u043e\u0434\u043d\u043e\u0433\u043e \u0437\u043e\u043c\u0431\u0438 spawn_count+=1 #\u0438 \u043c\u0435\u043d\u044f\u0435\u043c \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u0438 shield_chance += 4 if (shield_chance > 20): #\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u0441\u043f\u0430\u0432\u043d\u0430 \u0432 20% shield_chance = 20 fat_chance += 2 if (fat_chance > 20): #\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u0441\u043f\u0430\u0432\u043d\u0430 \u0432 20% fat_chance = 20 scary_chance += 2 if (scary_chance > 20):#\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u0441\u043f\u0430\u0432\u043d\u0430 \u0432 20% scary_chance = 20 zombie1_chance -= 4 if (zombie1_chance &lt; 20):#\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u0441\u043f\u0430\u0432\u043d\u0430 \u0432 20% zombie1_chance = 20 smart_chance -= 4 if (smart_chance &lt; 20):#\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u0441\u043f\u0430\u0432\u043d\u0430 \u0432 20% smart_chance = 20 #zombie1 \u0438 smart \u043a\u0440\u0430\u0439\u0442\u0435 \u043f\u0440\u043e\u0441\u0442\u044b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u0445 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u043c, \u0437\u0430 \u0441\u0447\u0451\u0442 \u044d\u0442\u043e\u0433\u043e #\u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u043d\u0430 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u0440\u0443\u0433\u0438\u0445 \u0437\u043e\u043c\u0431\u0438 #\u0441\u0443\u043c\u043c\u0430 \u0448\u0430\u043d\u0441\u0430 \u043f\u0440\u0438\u0437\u044b\u0432\u0430 \u0432\u0441\u0435\u0445 \u0437\u043e\u043c\u0431\u0438 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0440\u0430\u0432\u043d\u0430 100.  #\u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 \u0431\u0435\u0440\u0451\u0442 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0441\u0447\u0451\u0442 func save_record(score): #\u041e\u0431\u044a\u044f\u0432\u0438\u043b\u0438 \u043d\u0432\u043e\u044b\u0439 \u0444\u0430\u0439\u043b var save_file = File.new() #\u0421\u043e\u0437\u0434\u0430\u043b\u0438 \u043d\u043e\u0432\u044b\u0439 \"\u0441\u043b\u043e\u0432\u0430\u0440\u044c\" \u0437\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u0432 \u043d\u0435\u0433\u043e \u043b\u0443\u0447\u0448\u0438\u0439 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 var save_dict ={ \"BrutalHero\": CharacterNames.brutalhero_score, \"Cowboy\":CharacterNames.cowboy_score, \"Robot\":CharacterNames.robot_score, \"Soldier\":CharacterNames.soldier_score, } #\u0415\u0441\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0439 \u0433\u0435\u0440\u043e\u0439 \u0438 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0441\u0447\u0451\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u043b\u0443\u0447\u0448\u0435\u0433\u043e, \u0442\u043e \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0434\u0440\u0443\u0433\u043e\u0439 if(SelectedCharacter.Character == CharacterNames.BRUTALHERO &amp;&amp; score > save_dict[\"BrutalHero\"]): save_dict[\"BrutalHero\"] = score if(SelectedCharacter.Character == CharacterNames.COWBOY &amp;&amp; score > save_dict[\"Cowboy\"]): save_dict[\"Cowboy\"] = score if(SelectedCharacter.Character == CharacterNames.ROBOT &amp;&amp; score > save_dict[\"Robot\"]): save_dict[\"Robot\"] = score if(SelectedCharacter.Character == CharacterNames.SOLDIER &amp;&amp; score > save_dict[\"Soldier\"]): save_dict[\"Soldier\"] = score #\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0444\u0430\u0438\u043b \u0441 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435\u043c save_file.open(\"user:\/\/save.save\", File.WRITE) #\u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c save_file.store_line(to_json(save_dict))  func clear_level(): WeaponsName.clear_all()#\u0443\u0431\u0438\u0440\u0430\u0435\u043c \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f \u0441 \u043e\u0440\u0443\u0436\u0438\u044f get_tree().call_group(\"all_enemy\", \"queue_free\")#\u0423\u0434\u0430\u043b\u044f\u0435\u043c \u0432\u0441\u0435\u0445 \u0432\u0440\u0430\u0433\u043e\u0432 \u0441\u043e \u0441\u0446\u0435\u043d\u044b get_tree().call_group(\"all_buildings\", \"queue_free\")#\u0423\u0434\u0430\u043b\u044f\u0435\u043c \u0432\u0441\u0435 \u043f\u043e\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0441\u043e \u0441\u0446\u0435\u043d\u044b <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<h2>\u041f\u043e\u0434\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0438\u0442\u043e\u0433\u043e\u0432<\/h2>\n<p>\u0422\u044f\u0436\u0451\u043b\u0430\u044f \u0432\u044b\u0434\u0430\u043b\u0430\u0441\u044c \u0441\u0442\u0430\u0442\u044c\u044f, \u043c\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430, \u0441\u0442\u0430\u0440\u0430\u043b\u0441\u044f \u0432\u0441\u0451 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c. \u041d\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0443 \u0434\u0435\u0440\u0435\u0432\u043e \u0443\u043c\u0435\u043d\u0438\u0439 \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u043e\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043a.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/efc\/ce8\/b54\/efcce8b54f29a0968966f08731a76fbd.gif\" width=\"600\" height=\"338\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/efc\/ce8\/b54\/efcce8b54f29a0968966f08731a76fbd.gif\"\/><\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/88d\/9c4\/78b\/88d9c478b314cda539353952f9037b2a.gif\" width=\"600\" height=\"338\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/88d\/9c4\/78b\/88d9c478b314cda539353952f9037b2a.gif\"\/><\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/0c9\/4b4\/27b\/0c94b427b56e56dc1e033c787e3a67c5.gif\" width=\"600\" height=\"338\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/0c9\/4b4\/27b\/0c94b427b56e56dc1e033c787e3a67c5.gif\"\/><\/figure>\n<p>\u0418\u0433\u0440\u0443 \u0443\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u043a\u0443\u0434\u0430-\u043d\u0438\u0431\u0443\u0434\u044c \u0437\u0430\u043b\u0438\u0442\u044c \u043d\u0430 \u0432\u0441\u0435\u043e\u0431\u0449\u0435\u0435 \u043e\u0431\u043e\u0437\u0440\u0435\u043d\u0438\u0435, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u044d\u0442\u043e \u043f\u043e\u0437\u0436\u0435.<\/p>\n<p>\u041f\u043e \u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0443 \u043f\u043e\u0437\u0436\u0435 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0439\u0442\u0438 \u0435\u0449\u0451 \u043e\u0434\u043d\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u0441 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u043c \u043c\u0443\u043b\u044c\u0442\u0438\u043f\u043b\u0435\u0435\u0440\u043e\u043c, \u043d\u043e \u043f\u043e\u043a\u0430 \u043d\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0435\u0433\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u043f\u043e\u0434\u043e\u0436\u0434\u0430\u0442\u044c. \u041d\u0438\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0433\u043e\u043b\u043e\u0441\u043e\u0432\u0430\u043d\u0438\u0439, \u043f\u0440\u043e\u0433\u043e\u043b\u043e\u0441\u0443\u0439\u0442\u0435 \u0432\u043e \u0432\u0441\u0435\u0445, \u0447\u0442\u043e\u0431\u044b \u044f \u043f\u043e\u043d\u044f\u043b, \u043a\u0430\u043a\u0438\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c \u0437\u0430\u043d\u044f\u0442\u044c\u0441\u044f \u0434\u0430\u043b\u044c\u0448\u0435. \u0413\u043e\u043b\u043e\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u0437\u0430\u043a\u043e\u043d\u0447\u0430\u0442\u0441\u044f 10.07.2023 \u0432 8 \u043f\u043e \u041c\u0421\u041a, \u0443\u0441\u043f\u0435\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u043e\u0433\u043e\u043b\u043e\u0441\u043e\u0432\u0430\u0442\u044c<\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p> <!----> <!----><\/div>\n<p> <!----> <\/p>\n<div class=\"tm-article-poll-container\">\n<div class=\"tm-article-poll tm-article-poll_variant-bordered\">\n<div class=\"tm-notice tm-article-poll__notice tm-notice_positive\"><!----> <\/p>\n<div class=\"tm-notice__inner\"><!----> <\/p>\n<div class=\"tm-notice__content\"><span>\u0422\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u043c\u043e\u0433\u0443\u0442 \u0443\u0447\u0430\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0432 \u043e\u043f\u0440\u043e\u0441\u0435. <a rel=\"nofollow\" href=\"\/kek\/v1\/auth\/habrahabr\/?back=\/ru\/articles\/746790\/&#038;hl=ru\">\u0412\u043e\u0439\u0434\u0438\u0442\u0435<\/a>, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430.<\/span><\/div>\n<\/div>\n<\/div>\n<div class=\"tm-article-poll__header\">\u0417\u0430 \u043a\u0430\u043a\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0432\u0437\u044f\u0442\u044c\u0441\u044f \u0434\u0430\u043b\u044c\u0448\u0435<\/div>\n<div class=\"tm-article-poll__answers\">\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent\">             0%           <\/span> <span class=\"tm-article-poll__answer-label\">\u0421\u0432\u043e\u0439 PvZ \u0441 \u0433\u043e\u0440\u043e\u0445\u043e\u043c \u0438 \u0442\u0430\u043a\u043e\u0441<\/span> <span class=\"tm-article-poll__answer-votes\">             0           <\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress\" style=\"width:0%;\"><\/div>\n<\/div>\n<\/div>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent tm-article-poll__answer-percent_winning\">             100%           <\/span> <span class=\"tm-article-poll__answer-label\">\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0441\u0432\u043e\u0439 PlateUp!, \u0433\u0434\u0435 \u043d\u0430\u043a\u043e\u043d\u0435\u0446-\u0442\u043e \u043d\u0430\u043a\u043e\u0440\u043c\u0438\u043c \u0432\u0441\u0435\u043c \u043d\u0435\u043d\u0430\u0441\u044b\u0442\u043d\u044b\u0445 \u043c\u043e\u043d\u0441\u0442\u0440\u043e\u0432<\/span> <span class=\"tm-article-poll__answer-votes\">             1           <\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress tm-article-poll__answer-progress_winning\" style=\"width:100%;\"><\/div>\n<\/div>\n<\/div>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent\">             0%           <\/span> <span class=\"tm-article-poll__answer-label\">\u041f\u0440\u0438\u0434\u0443\u043c\u0430\u043d\u043d\u0430\u044f \u0438\u0433\u0440\u0430 \u0442\u0443\u0430\u043b\u0435\u0442\u043d\u044b\u0439 \u043d\u0438\u043d\u0434\u0437\u044f( \u041f\u0440\u043e\u0441\u0442\u0438\u0442\u0435, \u0447\u0442\u043e?!)<\/span> <span class=\"tm-article-poll__answer-votes\">             0           <\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress\" style=\"width:0%;\"><\/div>\n<\/div>\n<\/div>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent\">             0%           <\/span> <span class=\"tm-article-poll__answer-label\">\u0411\u043e\u043b\u044c\u0448\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u043f\u0440\u043e \u043a\u043b\u0438\u043a\u0435\u0440\u044b \u00ab\u041e\u0442 \u043a\u043b\u0438\u043a\u0430 \u0434\u043e \u0421\u0423\u041f\u0415\u0420-\u041d\u0415\u0420\u0415\u0410\u041b\u042c\u041d\u041e-\u0412\u041e\u0421\u0425\u0418\u0422\u0418\u0422\u0415\u041b\u042c\u041d\u041e\u0419-\u0421\u041f\u0410\u0420\u0416\u0418\u00bb<\/span> <span class=\"tm-article-poll__answer-votes\">             0           <\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress\" style=\"width:0%;\"><\/div>\n<\/div>\n<\/div>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent\">             0%           <\/span> <span class=\"tm-article-poll__answer-label\">\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 Sokoban, \u043f\u0440\u043e \u0433\u0440\u0443\u0441\u0442\u043d\u043e\u0433\u043e \u043f\u0435\u0441\u0438\u043a\u0430 \u0432 \u043a\u043e\u0441\u043c\u043e\u0441\u0435.<\/span> <span class=\"tm-article-poll__answer-votes\">             0           <\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress\" style=\"width:0%;\"><\/div>\n<\/div>\n<\/div>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent\">             0%           <\/span> <span class=\"tm-article-poll__answer-label\">\u041a\u0430\u0440\u0442\u043e\u0447\u043d\u044b\u0439 \u0440\u043e\u0433\u0430\u043b\u0438\u043a \u043f\u0440\u043e \u043f\u0440\u0438\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u0438\u0435\u2026 \u0420\u043e\u0433\u0430\u043b\u0438\u043a\u043e\u0432<\/span> <span class=\"tm-article-poll__answer-votes\">             0           <\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress\" style=\"width:0%;\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"tm-article-poll__stats\">        \u041f\u0440\u043e\u0433\u043e\u043b\u043e\u0441\u043e\u0432\u0430\u043b 1 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c.          \u0412\u043e\u0437\u0434\u0435\u0440\u0436\u0430\u0432\u0448\u0438\u0445\u0441\u044f \u043d\u0435\u0442.      <\/div>\n<\/div>\n<div class=\"tm-article-poll tm-article-poll_variant-bordered\">\n<div class=\"tm-notice tm-article-poll__notice tm-notice_positive\"><!----> <\/p>\n<div class=\"tm-notice__inner\"><!----> <\/p>\n<div class=\"tm-notice__content\"><span>\u0422\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u043c\u043e\u0433\u0443\u0442 \u0443\u0447\u0430\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0432 \u043e\u043f\u0440\u043e\u0441\u0435. <a rel=\"nofollow\" href=\"\/kek\/v1\/auth\/habrahabr\/?back=\/ru\/articles\/746790\/&#038;hl=ru\">\u0412\u043e\u0439\u0434\u0438\u0442\u0435<\/a>, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430.<\/span><\/div>\n<\/div>\n<\/div>\n<div class=\"tm-article-poll__header\">\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u0438 \u0442\u0430\u043a \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e?<\/div>\n<div class=\"tm-article-poll__answers\">\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent tm-article-poll__answer-percent_winning\">             100%           <\/span> <span class=\"tm-article-poll__answer-label\">\u0414\u0430<\/span> <span class=\"tm-article-poll__answer-votes\">             3           <\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress tm-article-poll__answer-progress_winning\" style=\"width:100%;\"><\/div>\n<\/div>\n<\/div>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent\">             0%           <\/span> <span class=\"tm-article-poll__answer-label\">\u041d\u0435\u0442<\/span> <span class=\"tm-article-poll__answer-votes\">             0           <\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress\" style=\"width:0%;\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"tm-article-poll__stats\">        \u041f\u0440\u043e\u0433\u043e\u043b\u043e\u0441\u043e\u0432\u0430\u043b\u0438 3 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.           \u0412\u043e\u0437\u0434\u0435\u0440\u0436\u0430\u0432\u0448\u0438\u0445\u0441\u044f \u043d\u0435\u0442.      <\/div>\n<\/div>\n<\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/746790\/\"> https:\/\/habr.com\/ru\/articles\/746790\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<ul>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/745716\/\" rel=\"noopener noreferrer nofollow\"><u>\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043f\u0435\u0440\u0432\u0443\u044e \u0447\u0430\u0441\u0442\u044c<\/u><\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/745956\/\" rel=\"noopener noreferrer nofollow\"><u>\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0432\u0442\u043e\u0440\u0443\u044e \u0447\u0430\u0441\u0442\u044c<\/u><\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/746328\/\" rel=\"noopener noreferrer nofollow\"><u>\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0442\u0440\u0435\u0442\u044c\u044e \u0447\u0430\u0441\u0442\u044c<\/u><\/a><\/p>\n<\/li>\n<\/ul>\n<hr\/>\n<p>\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043d\u0430\u0448\u0435\u0439 \u043f\u0435\u0440\u0432\u043e\u0439 \u0438\u0433\u0440\u044b. \u0412 \u044d\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0442\u043e, \u0437\u0430 \u0447\u0442\u043e \u0432\u044b \u043f\u0440\u043e\u0433\u043e\u043b\u043e\u0441\u043e\u0432\u0430\u043b\u0438, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u0414\u0435\u0440\u0435\u0432\u043e \u0442\u0430\u043b\u0430\u043d\u0442\u043e\u0432 \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u043e\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043a.<\/p>\n<h2>\u0414\u0435\u0440\u0435\u0432\u043e \u0442\u0430\u043b\u0430\u043d\u0442\u043e\u0432<\/h2>\n<p>\u0412 \u0447\u0451\u043c \u0432\u043e\u043e\u0431\u0449\u0435 \u0432\u0441\u044f \u0437\u0430\u0434\u0443\u043c\u043a\u0430. \u0418\u0433\u0440\u043e\u043a \u043c\u043e\u0436\u0435\u0442 \u0432 \u043b\u044e\u0431\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0441\u0432\u043e\u0451 \u0434\u0435\u0440\u0435\u0432\u043e \u0442\u0430\u043b\u0430\u043d\u0442\u043e\u0432 \u0438 \u0435\u0441\u043b\u0438 \u0443 \u043d\u0435\u0433\u043e \u0435\u0441\u0442\u044c \u043e\u0447\u043a\u0438 \u043f\u0440\u043e\u043a\u0430\u0447\u043a\u0438, \u0442\u043e \u043f\u0440\u043e\u043a\u0430\u0447\u0430\u0442\u044c.<\/p>\n<p>\u0421\u0430\u043c\u043e \u043f\u043e \u0441\u0435\u0431\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u0442\u044c \u0438\u0437 \u0432\u0435\u0442\u0432\u0435\u0439, \u043f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u043d\u0430 \u0432\u0435\u0442\u0432\u044c \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u043a\u043d\u043e \u0441 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u0438 2 \u043a\u043d\u043e\u043f\u043a\u0438, \u043f\u0440\u043e\u043a\u0430\u0447\u0430\u0442\u044c \u0438\u043b\u0438 \u043d\u0435\u0442. \u0415\u0441\u043b\u0438 \u0438\u0433\u0440\u043e\u043a \u043f\u0440\u043e\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u0442, \u0442\u043e \u043e\u0431 \u044d\u0442\u043e\u043c \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0438\u0433\u043d\u0430\u043b. \u0415\u0441\u043b\u0438 \u043a\u043e\u0440\u043e\u0442\u043a\u043e, \u0442\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a.<\/p>\n<h3>\u0412\u0435\u0442\u0432\u044c \u0434\u0435\u0440\u0435\u0432\u0430<\/h3>\n<p>\u0421\u043e\u0437\u0434\u0430\u0451\u043c \u043d\u043e\u0432\u0443\u044e \u0441\u0446\u0435\u043d\u0443 \u0438 \u0433\u043b\u0430\u0432\u043d\u044b\u043c \u0443\u0437\u043b\u043e\u043c \u0441\u0446\u0435\u043d\u044b \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c TextureButton, \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b:<\/p>\n<figure class=\"\"><\/figure>\n<ul>\n<li>\n<p>Sprite<\/p>\n<\/li>\n<li>\n<p>Node2D(DescriptionNode)<\/p>\n<\/li>\n<li>\n<p>ColorRect(Description), \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u0443 DescriptionNode<\/p>\n<\/li>\n<li>\n<p>Label(DescriptionLbl), \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u0443 Description<\/p>\n<\/li>\n<li>\n<p>TextureButton(DescriptionAccept), \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u0443 Description<\/p>\n<\/li>\n<li>\n<p>TextureButton(DescriptionCancel), \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u0443 Description<\/p>\n<\/li>\n<\/ul>\n<p>\u0423 TreeBranch \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c Texture, \u0438 \u0441\u0442\u0430\u0432\u0438\u043c Disabled &#8212; true. \u0412 Sprite \u0437\u0430\u043b\u0438\u0432\u0430\u0435\u043c \u0438\u043a\u043e\u043d\u043a\u0443 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. \u0423 DescriptionNode, \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c Z Index = 10. \u0412 Description, \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u043a\u0443 \u0442\u0430\u043a-\u0436\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0442\u043e\u0447\u043a\u0443 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0432 \u0446\u0435\u043d\u0442\u0440 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c  \u0438 \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u043c \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u044b\u0439 \u0446\u0435\u043d\u0442\u0440 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b. \u0412 DescriptionLbl \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0448\u0440\u0438\u0444\u0442. \u0412 DescriptionAccept \u0438 DescriptionCancel, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u043a\u0438. \u041f\u043e\u043a\u0430 \u043d\u0430 \u044d\u0442\u043e\u043c \u0432\u0441\u0451, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442 \u043d\u0430 \u043a\u043e\u0440\u0435\u043d\u044c \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0435\u0433\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e. \u041f\u043e\u0441\u043b\u0435 \u0432\u0441\u0435\u0445 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u0441\u0442\u0430\u0432\u0438\u043c \u0443 DescriptionLbl Visible = false.<\/p>\n<p>\u041a\u0430\u043a \u0432\u0435\u0442\u0432\u044c \u0434\u0435\u0440\u0435\u0432\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0443 \u043c\u0435\u043d\u044f:<\/p>\n<figure class=\"\">\n<div><figcaption>DescriptionLbl Visible &#8212; false<\/figcaption><\/div>\n<\/figure>\n<figure class=\"\">\n<div><figcaption>DescriptionLbl Visible &#8212; true<\/figcaption><\/div>\n<\/figure>\n<p>\u0412\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u0440\u043e\u043a\u0430\u0447\u0435\u043a \u0431\u0443\u0434\u0443\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c\u0438: \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435 \u0430\u0442\u0430\u043a\u0438, \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435 \u0437\u0434\u043e\u0440\u043e\u0432\u044c\u044f, \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438, \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0440\u0443\u0436\u0438\u0435 &#171;\u0421\u0423\u041f\u0415\u0420&#187;. \u0412\u0441\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e: \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435, \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0443\u044e \u0432\u0435\u0442\u0432\u044c, \u043a\u0430\u043a\u043e\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0443\u043b\u0443\u0447\u0448\u0430\u0435\u043c, \u043d\u0430 \u043a\u0430\u043a\u043e\u0435 \u043f\u0440\u043e\u0446\u0435\u043d\u0442 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c, \u043a\u0430\u043a\u043e\u0435 \u043e\u0440\u0443\u0436\u0438\u0435 \u0443\u043b\u0443\u0447\u0448\u0430\u0435\u0442\u0441\u044f, \u0432\u0435\u0442\u0432\u0438 \u043d\u0430 \u044d\u0442\u043e\u043c \u0441\u043b\u043e\u0435 \u0438 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430. \u0422\u0430\u043a-\u0436\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f 3 \u0441\u0438\u0433\u043d\u0430\u043b\u0430, \u043e\u0434\u0438\u043d \u0431\u0443\u0434\u0435\u0442 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u043f\u0440\u043e\u043a\u0430\u0447\u0430\u043b\u0438 \u044d\u0442\u0443 \u0432\u0435\u0442\u0432\u044c, \u0432\u0442\u043e\u0440\u043e\u0439 \u0431\u0443\u0434\u0435\u0442 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u0438 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0438 \u0441\u0438\u0433\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0447\u0442\u043e \u0434\u0440\u0443\u0433\u0438\u0435 \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u043a\u0440\u044b\u0442\u044c, \u0442\u0440\u0435\u0442\u0438\u0439 \u0431\u0443\u0434\u0435\u0442 \u0441\u0438\u0433\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u043a\u0430\u0447\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0438 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043d\u0430 \u0441\u043a\u043e\u043b\u044c\u043a\u043e.<\/p>\n<pre><code class=\"python\">#\u042d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0434\u0435\u0440\u0435\u0432\u0430 onready var _description = $DescriptionNode onready var _description_Lbl = $DescriptionNode\/Description\/DescriptionLbl #\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0432\u0435\u0442\u0432\u0438 export(String, MULTILINE) var description_text #\u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0430\u044f \u0432\u0435\u0442\u0432\u044c export (NodePath) var previous_branch #\u041a\u0430\u043a\u043e\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0443\u043b\u0443\u0447\u0448\u0430\u0435\u043c export(int, \"Atack\", \"Speed\", \"Health\", \"WeaponUp\") var param_up #\u043d\u0430 \u0441\u043a\u043e\u043b\u044c\u043a\u043e % \u0443\u043b\u0443\u0447\u0448\u0430\u0435\u043c export var param_scale:float #\u043a\u0430\u043a\u043e\u0435 \u043e\u0440\u0443\u0436\u0438\u0435 \u0434\u0435\u043b\u0430\u0435\u043c \"\u0421\u0443\u043f\u0435\u0440\", \u0435\u0441\u043b\u0438 \u0432\u044b\u0431\u0440\u0430\u043d WeaponUp export (int, \"Blaster\", \"Shotgun\", \"Rifle\", \"Bazooka\") var param_weapon_name #\u043c\u0430\u0441\u0441\u0438\u0432 \u0432\u0435\u0442\u0432\u0435\u0439 \u043d\u0430 \u044d\u0442\u043e\u043c \u0441\u043b\u043e\u0435 export (Array, NodePath) var this_layer_branch #\u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0437\u0430\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 img export (Texture) var img #\u0441\u0438\u0433\u043d\u0430\u043b \u043e \u043f\u0440\u043e\u043a\u0430\u0447\u043a\u0435 \u0432\u0435\u0442\u0432\u0438 signal branch_pick #\u0441\u0438\u0433\u043d\u0430\u043b \u043e \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u044d\u0442\u043e\u0439 \u0432\u0435\u0442\u0432\u0438 signal close_description #\u0441\u0438\u0433\u043d\u0430\u043b \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f \u043d\u0430\u0432\u044b\u043a\u0430(\u0443\u0440\u043e\u043d, \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c, \u0445\u043f) signal skill_up(param_name,value)<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e _ready(), \u0432 \u043d\u0435\u0439 \u0431\u0443\u0434\u0443 \u0437\u0430\u043b\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u0430\u044f \u043d\u0430\u043c\u0438 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u0442\u0430\u043b\u0430\u043d\u0442\u0430, \u0438 \u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u0438\u0433\u043d\u0430\u043b\u044b, \u043e\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0437\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u0432 export &#8212; \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435<\/p>\n<pre><code class=\"python\">func _ready(): #\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0438 \u0440\u0435\u0436\u0438\u043c \u043f\u0430\u0443\u0437\u044b \u0434\u043b\u044f \u0434\u0435\u0440\u0435\u0432\u0430 pause_mode = Node.PAUSE_MODE_PROCESS #\u0417\u0430\u043b\u0438\u043b\u0438 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 $Sprite.texture = img #\u0420\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u043b\u0438 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 $Sprite.rotation_degrees -= rect_rotation #\u0420\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u043b\u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 $DescriptionNode\/Description.rect_rotation -=rect_rotation #\u041e\u0431\u044a\u044f\u0432\u0438\u043b\u0438 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0443\u044e \u0432\u0435\u0442\u0432\u044c var branch = get_node(previous_branch) #\u0415\u0441\u043b\u0438 \u043d\u0435 Null, \u0442\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u0441\u0438\u0433\u043d\u0430\u043b if (branch != null): branch.connect(\"branch_pick\",self,\"_on_branch_pick\") else: #\u0415\u0441\u043b\u0438 \u0443 \u0434\u0435\u0440\u0435\u0432\u0430 \u043d\u0435\u0442 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0432\u0435\u0442\u0432\u0435\u0439, \u0442\u043e \u044d\u0442\u043e \u043a\u043e\u0440\u0435\u043d\u044c \u0434\u0435\u0440\u0435\u0432\u0430 disabled = false #\u041f\u0440\u043e\u0431\u0435\u0433\u0430\u0435\u043c\u0441\u044f \u043f\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0443 \u0432\u0435\u0442\u0432\u0435\u0439 \u043d\u0430 \u044d\u0442\u043e\u043c \u0441\u043b\u043e\u0435 for i in range(this_layer_branch.size()): #\u041e\u0431\u0445\u044f\u0432\u0438\u043b\u0438 \u0432\u0435\u0442\u0432\u044c var layer_branch = get_node(this_layer_branch[i]) #\u0415\u0441\u043b\u0438 \u043d\u0435 null if (layer_branch != null): #\u0422\u043e \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043b\u0438 2 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 layer_branch.connect(\"branch_pick\",self,\"_on_branch_pick_this_layer\") layer_branch.connect(\"close_description\",self,\"_on_close_description_this_layer\")<\/code><\/pre>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u0435\u0439\u0447\u0430\u0441 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c, \u043a\u0430\u043a \u043f\u0440\u043e\u043a\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430<\/p>\n<pre><code class=\"python\">#\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432\u044b\u0431\u043e\u0440\u0430 \u0432\u0435\u0442\u0432\u0438 func skill_up(): match param_up: 0,1,2: #\u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u0430\u0442\u0430\u043a\u0430, \u0445\u043f \u0438\u043b\u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c emit_signal(\"skill_up\",param_up,param_scale) 3: #\u0415\u0441\u043b\u0438 \u043f\u0440\u043e\u043a\u0430\u0447\u0430\u043b\u0438 \u043e\u0440\u0443\u0436\u0438\u0435, \u0442\u043e \u0432\u044b\u0437\u0432\u0430\u043b\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0441\u0438\u043d\u0433\u043b\u0442\u043e\u043d\u0430 WeaponsName.weapon_level_up(param_weapon_name)<\/code><\/pre>\n<p>\u0415\u0449\u0451 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u0421\u0438\u043d\u0433\u043b\u0442\u043e\u043d WeaponsName, \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442\u0441\u044f true, \u0435\u0441\u043b\u0438 \u043e\u0440\u0443\u0436\u0438\u0435 \u0441\u0442\u0430\u043b\u043e \u0441\u0443\u043f\u0435\u0440 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442, \u043a\u0430\u043a\u043e\u0435 \u043e\u0440\u0443\u0436\u0438\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0443\u043f\u0435\u0440 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043e\u0447\u0438\u0441\u0442\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0434\u0435\u043b\u0430\u0435\u0442 \u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 false:<\/p>\n<pre><code class=\"python\">var blaster_up = false var shotgun_up = false var rifle_up = false var bazooka_up = false  func weapon_level_up(weapon): match weapon: 0: blaster_up = true 1: shotgun_up = true 2: rifle_up = true 3: bazooka_up = true  func clear_all(): blaster_up = false shotgun_up = false rifle_up = false bazooka_up = false<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432 \u043a\u043e\u0434 \u0441\u0438\u0433\u043d\u0430\u043b\u044b \u043e\u0442 TreeBranch, DescriptionAccept, DescriptionCancel, \u0438 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043b\u0438 \u0432 _ready()<\/p>\n<pre><code class=\"python\">#\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0432\u0435\u0442\u0432\u0438, #\u0442\u043e\u0435\u0441\u0442\u044c \u0435\u0441\u043b\u0438 \u0432\u044b\u0431\u0440\u0430\u043b\u0438 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0443\u044e \u0432\u0435\u0442\u0432\u044c, #\u0422\u043e \u0441\u043d\u044f\u0442\u044c disabled func _on_branch_pick(): disabled = false  #\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432, \u0432\u0435\u0442\u0432\u0438 \u0441 \u044d\u0442\u043e\u0433\u043e \u0441\u043b\u043e\u044f, #\u0435\u0441\u043b\u0438 \u0432\u044b\u0431\u0440\u0430\u043b\u0438 \u0441 \u044d\u0442\u043e\u0433\u043e \u0441\u043b\u043e\u044f, #\u0442\u043e \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u043c \u044d\u0442\u0443 \u0432\u0435\u0442\u0432\u044c func _on_branch_pick_this_layer(): disabled = true  #\u041e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u0441\u0438\u0433\u043d\u0430\u043b \u043e\u0442 \u0434\u0440\u0443\u0433\u0438\u0445 \u0432\u0435\u0442\u0432\u0435\u0439 \u044d\u0442\u043e\u0433\u043e \u0441\u043b\u043e\u044f,  #\u0442\u043e\u0435\u0441\u0442\u044c \u0435\u0441\u043b\u0438 \u043e\u0442\u043a\u0440\u044b\u043b\u0438 \u0434\u0440\u0443\u0433\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435, \u0442\u043e \u0437\u0430\u043a\u0440\u044b\u043b\u0438 \u044d\u0442\u043e func _on_close_description_this_layer(): _description_Lbl.text = \"\" _description.visible = false  #\u041f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u044f\u0435\u043c \u0441\u0438\u0433\u043d\u0430\u043b \u043e\u0442 TreeBranch \u0438 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c func _on_TreeBranch_pressed(): #\u0415\u0441\u043b\u0438 \u0443 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0439 \u0441\u0446\u0435\u043d\u044b, \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f  #level_up_count > 0, \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 if(get_parent().level_up_count > 0): emit_signal(\"close_description\") _description_Lbl.text = description_text _description.visible = true  #\u041f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u044f\u0435\u043c \u0441\u0438\u0433\u043d\u0430\u043b \u043e\u0442 DescriptionCancel \u0438 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c func _on_DescriptionCancel_pressed(): _description_Lbl.text = \"\" _description.visible = false  #\u041f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u044f\u0435\u043c \u0441\u0438\u0433\u043d\u0430\u043b \u043e\u0442 DescriptionAccept \u0438 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c func _on_DescriptionAccept_pressed(): #\u0443 \u043c\u0435\u043d\u044f \u0432 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u043a\u0435 texture_pressed \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0430,  #\u043a\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u043b\u0430 \u0431\u044b \u0432\u0435\u0442\u0432\u044c, \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0431\u043e\u0440\u0430 texture_disabled = texture_pressed _description_Lbl.text = \"\" _description.visible = false #\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u043b\u0438 \u0441\u0438\u0433\u043d\u0430\u043b emit_signal(\"branch_pick\") #\u0412\u044b\u0437\u0432\u0430\u043b\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044e skill_up() #\u0423\u043c\u0435\u043d\u044c\u0448\u0438\u043b\u0438 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u0441\u0447\u0451\u0442\u0447\u0438\u043a get_parent().level_up_count -=1 disabled = true<\/code><\/pre>\n<p>\u041a\u043e\u0434 \u043f\u0440\u043e\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e, \u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0446\u0435\u043d\u0430 \u0432\u0435\u0442\u0432\u0438 \u0434\u0435\u0440\u0435\u0432\u0430, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u043d\u0430 \u0441\u0446\u0435\u043d\u0443 \u0434\u0435\u0440\u0435\u0432\u0430, \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u0432\u0441\u0435 export \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0438 \u043e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c.<\/p>\n<h2>\u0421\u0446\u0435\u043d\u0430 \u0434\u0435\u0440\u0435\u0432\u0430 \u0442\u0430\u043b\u0430\u043d\u0442\u043e\u0432<\/h2>\n<p>\u0413\u043b\u0430\u0432\u043d\u044b\u043c \u0443\u0437\u043b\u043e\u043c \u0441\u0446\u0435\u043d\u044b \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c Node2d, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c sprite \u0438 \u0434\u0430\u043b\u044c\u0448\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043d\u0430\u0448\u0435 \u0434\u0435\u0440\u0435\u0432\u043e. \u0412\u0441\u0435 \u0435\u0433\u043e \u0432\u0435\u0442\u0432\u0438 \u043c\u043e\u0436\u043d\u043e \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u043e \u0432\u0440\u0430\u0449\u0430\u0442\u044c.<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u041f\u0440\u0438\u043c\u0435\u0440\u043d\u044b\u0439 \u0432\u0438\u0434 \u0441\u0446\u0435\u043d\u044b<\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width\">\n<div><figcaption>\u0432\u0438\u0434 \u0432 \u0438\u0433\u0440\u0435<\/figcaption><\/div>\n<\/figure>\n<figure class=\"float\"><\/figure>\n<p>\u041a\u0430\u043a \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u0434\u0435\u0440\u0435\u0432\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0438 \u043d\u0430\u0437\u0432\u0430\u0442\u044c. \u042f \u043d\u0430\u0437\u044b\u0432\u0430\u043b \u0442\u0430\u043a: Layer\u2116Branch\u2116.<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440\u044b \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u0432\u0435\u0442\u0432\u0435\u0439:<\/p>\n<figure class=\"float\"><\/figure>\n<p>\u042d\u0442\u0430 \u0432\u0435\u0442\u0432\u044c \u0431\u0443\u0434\u0435\u0442 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u043d\u0430 10%, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u0440\u043d\u0435\u043c \u0434\u0435\u0440\u0435\u0432\u0430 \u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u0434\u0440\u0443\u0433\u0438\u0445 \u0432\u0435\u0442\u0432\u0435\u0439 \u043d\u0435\u0442.<\/p>\n<figure class=\"float\"><\/figure>\n<p>\u042d\u0442\u0430 \u0432\u0435\u0442\u0432\u044c \u0431\u0443\u0434\u0435\u0442 \u0443\u043b\u0443\u0447\u0448\u0430\u0442\u044c \u043e\u0440\u0443\u0436\u0438\u0435(\u0432\u0438\u043d\u0442\u043e\u0432\u043a\u0443), \u0422\u0430\u043a-\u0436\u0435 \u043d\u0430 \u044d\u0442\u043e\u043c-\u0436\u0435 \u0441\u043b\u043e\u0435 \u0435\u0441\u0442\u044c 4 \u0432\u0435\u0442\u0432\u0438 \u0438 \u0443\u043a\u0430\u0437\u0430\u043d\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0430\u044f.<\/p>\n<p>\u0421 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438 \u0441\u0446\u0435\u043d\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438\u0441\u044c, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442 \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e:<\/p>\n<pre><code class=\"python\">extends Node2D #\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0438\u0433\u0440\u043e\u043a\u0430, \u0431\u0443\u0434\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u043e \u0441\u0446\u0435\u043d\u044b \u0438\u0433\u0440\u044b var player #\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0445\u0440\u0430\u043d\u044f\u0449\u0430\u044f \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0440\u043e\u043a\u0430\u0447\u0435\u043a var level_up_count = 0 #\u0421\u0438\u0433\u043d\u0430\u043b \u043e \u043f\u0440\u043e\u043a\u0430\u0447\u043a\u0435 signal branch_skill_up(param, scale)   func _ready(): init_tree()  #\u0421\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u043d\u0430\u0436\u0430\u0442\u0438\u044f, \u0435\u0441\u043b\u0438 \u043d\u0430\u0436\u0430\u0442\u0430 \u043a\u043d\u043e\u043f\u0430\u043a \u043c\u0435\u043d\u044e, \u0442\u043e \u0441\u0442\u0430\u0432\u0438\u043c \u0438\u0433\u0440\u0443 \u043d\u0430 \u043f\u0430\u0443\u0437\u0443, #\u0438 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c, \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u043c\u0430\u0441\u0448\u0442\u0430\u0431, \u0438 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 func _process(delta): if (Input.is_action_just_pressed(\"menu\")): get_tree().paused = !get_tree().paused visible = !visible scale = Vector2(1,1) position = player.position #\u041f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u043c \u0441\u0438\u0433\u043d\u0430\u043b \u043e\u0442 \u0432\u0441\u0435\u0445 \u043f\u043e\u0442\u043e\u043c\u043a\u043e\u043c \u0438 \u043f\u0440\u043e\u043a\u0430\u0447\u043a\u0435 func init_tree(): for i in get_child_count(): get_child(i).connect(\"skill_up\",self,\"_on_branch_skill_up_\")  #\u041e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u044d\u0442\u043e\u0442 \u0441\u0438\u0433\u043d\u0430\u043b(\u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u044f \u0441\u0432\u043e\u0439)  func _on_branch_skill_up_(param, scale): emit_signal(\"branch_skill_up\",param,scale) <\/code><\/pre>\n<p>\u0422\u0430\u043a-\u0436\u0435 \u043d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0435\u043c \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0443 &#171;menu&#187;, \u0443 \u043c\u0435\u043d\u044f \u044d\u0442\u043e \u043f\u0440\u043e\u0431\u0435\u043b.<\/p>\n<p>\u0422\u0430\u043a-\u0436\u0435 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c, \u0447\u0442\u043e \u043f\u0430\u0443\u0437\u0430 \u043d\u0435 \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u0443 \u044d\u0442\u043e\u0439 \u0441\u0446\u0435\u043d\u044b. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u043a\u043e\u0440\u0435\u043d\u044c \u0441\u0446\u0435\u043d\u044b \u0434\u0435\u0440\u0435\u0432\u0430 \u0442\u0430\u043b\u0430\u043d\u0442\u043e\u0432, \u0432 \u0438\u043d\u0441\u043f\u0435\u043a\u0442\u043e\u0440\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u043c pause mode \u0438 \u0441\u0442\u0430\u0432\u0438\u043c \u0435\u0433\u043e \u0432 Process<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c, \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432 \u043e \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u0438 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a \u0438 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043e\u0440\u0443\u0436\u0438\u0435.<\/p>\n<h3>\u041e\u0440\u0443\u0436\u0438\u0435<\/h3>\n<p>\u041d\u0430\u0447\u043d\u0451\u043c \u0441 \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043e\u0440\u0443\u0436\u0438\u044f. \u0411\u043b\u0430\u0441\u0442\u0435\u0440 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0441\u0442\u0440\u0435\u043b\u0438\u0432\u0430\u0442\u044c \u043f\u043e 2 \u043f\u0443\u043b\u0438, \u0434\u0440\u043e\u0431\u043e\u0432\u0438\u043a \u0432\u044b\u0441\u0442\u0440\u0435\u043b\u0438\u0432\u0430\u0442\u044c 11 \u043f\u0443\u043b\u044f\u043c\u0438, \u0443 \u0432\u0438\u043d\u0442\u043e\u0432\u043a\u0438 \u043f\u0435\u0440\u0435\u0437\u0430\u0440\u044f\u0434\u043a\u0430 \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u0441\u044f \u043d\u0430 50%, \u0440\u0430\u0434\u0438\u0443\u0441 \u0432\u0437\u0440\u044b\u0432\u0430 \u0443 \u0431\u0430\u0437\u0443\u043a\u0438 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u0441\u044f \u043d\u0430 50%. \u0417\u043d\u0430\u0447\u0438\u0442 \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u044b: <\/p>\n<ul>\n<li>\n<p>\u0421\u043a\u0440\u0438\u043f\u0442 \u0431\u043b\u0430\u0441\u0442\u0435\u0440\u0430<\/p>\n<\/li>\n<li>\n<p>\u0421\u043a\u0440\u0438\u043f\u0442 \u0434\u0440\u043e\u0431\u043e\u0432\u0438\u043a\u0430<\/p>\n<\/li>\n<li>\n<p>\u0421\u043a\u0440\u0438\u043f\u0442 \u0432\u0438\u043d\u0442\u043e\u0432\u043a\u0438<\/p>\n<\/li>\n<li>\n<p>\u0421\u043a\u0440\u0438\u043f\u0442 \u0440\u0430\u043a\u0435\u0442\u044b \u0434\u043b\u044f \u0431\u0430\u0437\u0443\u043a\u0438<\/p>\n<\/li>\n<\/ul>\n<h4>\u0421\u043a\u0440\u0438\u043f\u0442 \u0431\u043b\u0430\u0441\u0442\u0435\u0440\u0430<\/h4>\n<p>\u0412 \u0434\u0435\u0440\u0435\u0432\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c Timer(SecondFire), \u0432\u044b\u0441\u0442\u0430\u0432\u0438\u0442\u044c OneShot = true, Wait Timer = 0,1<\/p>\n<pre><code class=\"python\">#\u0414\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u0442\u0430\u0439\u043c\u0435\u0440 onready var _second_fire = $SecondFire  func fire(): if (_fire_couldown_timer.is_stopped()): # \u043d\u0435 \u043d\u0430 \u043f\u0435\u0440\u0435\u0437\u0430\u0440\u044f\u0434\u043a\u0435 #\u0415\u0441\u043b\u0438 \u043e\u0440\u0443\u0436\u0438\u0435 \u0421\u0443\u043f\u0435\u0440\u0441\u043a\u043e\u0435, \u0442\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0442\u0430\u0439\u043c\u0435\u0440 if (WeaponsName.blaster_up): _second_fire.start() spawn_bullet(0) # \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043f\u0443\u043b\u044e \u0441 0-\u043c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u043e\u043c _fire_couldown_timer.start() _weapon_sound.play()  #\u0422\u0430\u0439\u043c\u0435\u0440 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u043b, \u0441\u0442\u0440\u0435\u043b\u044f\u0435\u043c func _on_SecondFire_timeout(): spawn_bullet(0)<\/code><\/pre>\n<h4>\u0421\u043a\u0440\u0438\u043f\u0442 \u0434\u0440\u043e\u0431\u043e\u0432\u0438\u043a\u0430<\/h4>\n<pre><code class=\"python\">func fire(): if (_fire_couldown_timer.is_stopped()): if (WeaponsName.shotgun_up): spawn_bullet(5*PI\/12)# \u041f\u043e\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u043f\u0443\u043b\u044e \u043d\u0430 ~37,5 \u0433\u0440\u0430\u0434\u0443\u0441\u043e\u0432 spawn_bullet(4*PI\/12)# \u041f\u043e\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u043f\u0443\u043b\u044e \u043d\u0430 ~ 30 \u0433\u0440\u0430\u0434\u0443\u0441\u043e\u0432 spawn_bullet(3*PI\/12)# \u041f\u043e\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u043f\u0443\u043b\u044e \u043d\u0430 ~ 22,5 \u0433\u0440\u0430\u0434\u0443\u0441\u043e\u0432 spawn_bullet(2*PI\/12)# \u041f\u043e\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u043f\u0443\u043b\u044e \u043d\u0430 ~ 15 \u0433\u0440\u0430\u0434\u0443\u0441\u043e\u0432 spawn_bullet(PI\/12)# \u041f\u043e\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u043f\u0443\u043b\u044e \u043d\u0430 ~ 7,5 \u0433\u0440\u0430\u0434\u0443\u0441\u043e\u0432 spawn_bullet(0)# \u0432\u044b\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043f\u0443\u043b\u044e \u043f\u0440\u044f\u043c\u043e spawn_bullet(-PI\/12)# \u041f\u043e\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u043f\u0443\u043b\u044e \u043d\u0430 ~ -7,5 \u0433\u0440\u0430\u0434\u0443\u0441\u043e\u0432 spawn_bullet(-2*PI\/12)# \u041f\u043e\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u043f\u0443\u043b\u044e \u043d\u0430 ~ -15 \u0433\u0440\u0430\u0434\u0443\u0441\u043e\u0432 spawn_bullet(-3*PI\/12)# \u041f\u043e\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u043f\u0443\u043b\u044e \u043d\u0430 ~ -22,5 \u0433\u0440\u0430\u0434\u0443\u0441\u043e\u0432<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-349983","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/349983","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=349983"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/349983\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=349983"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=349983"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=349983"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}