{"id":611,"date":"2026-09-07T22:03:12","date_gmt":"2026-09-07T18:33:12","guid":{"rendered":"https:\/\/mtgrayli.yclass.ir\/wordpress\/?page_id=611"},"modified":"2026-09-07T22:05:50","modified_gmt":"2026-09-07T18:35:50","slug":"game-creator","status":"publish","type":"page","link":"https:\/\/mtgrayli.yclass.ir\/wordpress\/game-creator\/","title":{"rendered":"game creator"},"content":{"rendered":"\n    <div id=\"nexus-gc\">\n\n        <style>\n        #nexus-gc {\n            width:100%;\n            min-height:700px;\n            background:#0f172a;\n            color:#fff;\n            font-family:Arial,sans-serif;\n            border-radius:14px;\n            overflow:hidden;\n            box-shadow:0 10px 40px rgba(0,0,0,.35);\n        }\n\n        #nexus-gc * {\n            box-sizing:border-box;\n        }\n\n        .ngc-header {\n            height:60px;\n            background:#1e293b;\n            display:flex;\n            align-items:center;\n            gap:8px;\n            padding:10px 14px;\n        }\n\n        .ngc-title {\n            font-size:19px;\n            font-weight:bold;\n            margin-right:auto;\n        }\n\n        .ngc-btn {\n            border:0;\n            border-radius:7px;\n            padding:9px 13px;\n            color:#fff;\n            background:#334155;\n            cursor:pointer;\n            font-size:13px;\n        }\n\n        .ngc-btn:hover {\n            filter:brightness(1.15);\n        }\n\n        .ngc-plugin-open {\n            background:#7c3aed;\n        }\n\n        .ngc-test {\n            background:#2563eb;\n        }\n\n        .ngc-save {\n            background:#16a34a;\n        }\n\n        .ngc-main {\n            display:flex;\n            min-height:640px;\n        }\n\n        .ngc-tools {\n            width:180px;\n            padding:12px;\n            background:#111827;\n        }\n\n        .ngc-tools-title {\n            color:#94a3b8;\n            font-size:12px;\n            margin:7px 0 10px;\n        }\n\n        .ngc-tool {\n            display:block;\n            width:100%;\n            margin-bottom:7px;\n            border:0;\n            border-radius:7px;\n            padding:10px;\n            text-align:left;\n            background:#1f2937;\n            color:#fff;\n            cursor:pointer;\n        }\n\n        .ngc-tool:hover {\n            background:#334155;\n        }\n\n        .ngc-tool.active {\n            background:#2563eb;\n        }\n\n        .ngc-center {\n            flex:1;\n            background:#0b1120;\n            padding:15px;\n            overflow:auto;\n        }\n\n        .ngc-game-name {\n            width:100%;\n            max-width:900px;\n            background:#1e293b;\n            color:#fff;\n            border:1px solid #334155;\n            border-radius:7px;\n            padding:10px;\n            margin-bottom:12px;\n        }\n\n        .ngc-player-hp-wrapper {\n            width:900px;\n            max-width:100%;\n            margin-bottom:10px;\n            display:none;\n        }\n\n        .ngc-player-hp-top {\n            display:flex;\n            align-items:center;\n            justify-content:space-between;\n            margin-bottom:5px;\n            font-size:13px;\n            font-weight:bold;\n        }\n\n        .ngc-player-hp-title {\n            color:#fff;\n        }\n\n        .ngc-player-hp-value {\n            color:#cbd5e1;\n        }\n\n        .ngc-player-hp-bar {\n            width:100%;\n            height:20px;\n            background:#1f2937;\n            border:2px solid #334155;\n            border-radius:8px;\n            overflow:hidden;\n            box-shadow:0 3px 10px rgba(0,0,0,.25);\n        }\n\n        .ngc-player-hp-fill {\n            width:100%;\n            height:100%;\n            background:#22c55e;\n            transition:width:.2s ease;\n        }\n\n        .ngc-player-hp-fill.warning {\n            background:#f59e0b;\n        }\n\n        .ngc-player-hp-fill.danger {\n            background:#ef4444;\n        }\n\n        .ngc-canvas {\n            position:relative;\n            width:900px;\n            height:520px;\n            background:#dbeafe;\n            background-image:\n                linear-gradient(#cbd5e1 1px,transparent 1px),\n                linear-gradient(90deg,#cbd5e1 1px,transparent 1px);\n            background-size:20px 20px;\n            border-radius:10px;\n            overflow:hidden;\n            box-shadow:0 0 0 2px #334155;\n        }\n\n        .ngc-object {\n            position:absolute;\n            user-select:none;\n            cursor:pointer;\n        }\n\n        .ngc-object.ngc-selected {\n            outline:3px solid #facc15;\n            z-index:20;\n        }\n\n        .ngc-block {\n            width:50px;\n            height:50px;\n            background:#64748b;\n            border:2px solid #475569;\n        }\n\n        .ngc-ground {\n            width:100px;\n            height:25px;\n            background:#16a34a;\n            border:2px solid #15803d;\n        }\n\n        .ngc-player {\n            width:40px;\n            height:60px;\n            background:#2563eb;\n            border-radius:7px;\n            overflow:hidden;\n            text-align:center;\n            line-height:60px;\n            font-weight:bold;\n            z-index:10;\n        }\n\n        .ngc-player img {\n            width:100%;\n            height:100%;\n            object-fit:cover;\n            display:block;\n        }\n\n        .ngc-enemy {\n            width:42px;\n            height:58px;\n            background:#dc2626;\n            border-radius:8px;\n            text-align:center;\n            line-height:58px;\n            font-size:24px;\n            z-index:9;\n        }\n\n        .ngc-enemy-hp {\n            position:absolute;\n            top:-10px;\n            left:0;\n            width:42px;\n            height:5px;\n            background:#111827;\n            border-radius:5px;\n            overflow:hidden;\n            pointer-events:none;\n        }\n\n        .ngc-enemy-hp-fill {\n            width:100%;\n            height:100%;\n            background:#22c55e;\n            transition:width:.15s ease;\n        }\n\n        .ngc-coin {\n            width:30px;\n            height:30px;\n            border-radius:50%;\n            background:#facc15;\n            border:3px solid #ca8a04;\n            text-align:center;\n            line-height:24px;\n            font-size:17px;\n        }\n\n        .ngc-door {\n            width:45px;\n            height:70px;\n            background:#78350f;\n            border:3px solid #451a03;\n            text-align:center;\n            line-height:64px;\n            font-size:22px;\n        }\n\n        .ngc-bomb {\n            width:32px;\n            height:32px;\n            border-radius:50%;\n            background:#111;\n            border:3px solid #ef4444;\n            text-align:center;\n            line-height:26px;\n        }\n\n        .ngc-heart {\n            width:32px;\n            height:32px;\n            background:#ef4444;\n            border-radius:50%;\n            text-align:center;\n            line-height:32px;\n        }\n\n        .ngc-bullet {\n            position:absolute;\n            width:10px;\n            height:10px;\n            border-radius:50%;\n            background:#111827;\n            border:2px solid #facc15;\n            z-index:100;\n            pointer-events:none;\n            box-shadow:0 0 8px rgba(250,204,21,.8);\n        }\n\n        .ngc-right {\n            width:290px;\n            background:#111827;\n            padding:15px;\n        }\n\n        .ngc-right h3 {\n            margin-top:0;\n        }\n\n        .ngc-field {\n            margin-bottom:12px;\n        }\n\n        .ngc-field label {\n            display:block;\n            color:#94a3b8;\n            font-size:12px;\n            margin-bottom:5px;\n        }\n\n        .ngc-input,\n        .ngc-code {\n            width:100%;\n            background:#1e293b;\n            border:1px solid #334155;\n            border-radius:6px;\n            color:#fff;\n            padding:9px;\n        }\n\n        .ngc-code {\n            height:260px;\n            resize:vertical;\n            font-family:monospace;\n            font-size:12px;\n        }\n\n        .ngc-empty {\n            color:#94a3b8;\n            font-size:13px;\n        }\n\n        #ngc-plugin-overlay {\n            position:fixed;\n            inset:0;\n            z-index:999999;\n            display:none;\n            align-items:center;\n            justify-content:center;\n            background:rgba(0,0,0,.75);\n            padding:20px;\n        }\n\n        #ngc-plugin-window {\n            width:900px;\n            max-width:100%;\n            max-height:90vh;\n            overflow:auto;\n            background:#111827;\n            border:1px solid #374151;\n            border-radius:14px;\n            padding:20px;\n            box-shadow:0 20px 80px rgba(0,0,0,.6);\n        }\n\n        .ngc-plugin-header {\n            display:flex;\n            align-items:center;\n            margin-bottom:20px;\n        }\n\n        .ngc-plugin-header h2 {\n            margin:0;\n            margin-right:auto;\n        }\n\n        .ngc-plugin-close {\n            background:#dc2626;\n        }\n\n        .ngc-plugin-grid {\n            display:grid;\n            grid-template-columns:repeat(3,1fr);\n            gap:12px;\n        }\n\n        .ngc-plugin-card {\n            background:#1e293b;\n            border:1px solid #334155;\n            border-radius:10px;\n            padding:15px;\n            transition:.15s;\n        }\n\n        .ngc-plugin-card.enabled {\n            border-color:#22c55e;\n        }\n\n        .ngc-plugin-name {\n            font-size:16px;\n            font-weight:bold;\n            margin-bottom:8px;\n        }\n\n        .ngc-plugin-description {\n            color:#94a3b8;\n            font-size:12px;\n            min-height:38px;\n            line-height:1.5;\n        }\n\n        .ngc-plugin-toggle {\n            width:100%;\n            border:0;\n            border-radius:6px;\n            padding:9px;\n            cursor:pointer;\n            background:#7c3aed;\n            color:#fff;\n        }\n\n        .ngc-plugin-card.enabled .ngc-plugin-toggle {\n            background:#16a34a;\n        }\n\n        .ngc-plugin-commands {\n            margin-top:20px;\n            background:#020617;\n            border-radius:8px;\n            padding:15px;\n            font-family:monospace;\n            white-space:pre-wrap;\n            font-size:12px;\n            line-height:1.7;\n            color:#cbd5e1;\n        }\n\n        .ngc-hud {\n            position:absolute;\n            top:10px;\n            left:10px;\n            display:none;\n            z-index:500;\n            background:rgba(0,0,0,.8);\n            border-radius:8px;\n            padding:8px 12px;\n            font-weight:bold;\n        }\n\n        .ngc-notification {\n            position:fixed;\n            right:20px;\n            bottom:20px;\n            z-index:1000000;\n            display:none;\n            background:#1e293b;\n            border:1px solid #475569;\n            border-radius:8px;\n            padding:12px 18px;\n        }\n\n        .ngc-game-over {\n            position:absolute;\n            inset:0;\n            display:none;\n            align-items:center;\n            justify-content:center;\n            flex-direction:column;\n            background:rgba(0,0,0,.78);\n            z-index:900;\n        }\n\n        .ngc-game-over-title {\n            font-size:42px;\n            font-weight:bold;\n            color:#ef4444;\n            margin-bottom:10px;\n        }\n\n        .ngc-game-over-text {\n            font-size:16px;\n            color:#fff;\n        }\n\n        @media(max-width:1100px) {\n            .ngc-main {\n                flex-direction:column;\n            }\n\n            .ngc-tools,\n            .ngc-right {\n                width:100%;\n            }\n\n            .ngc-plugin-grid {\n                grid-template-columns:1fr;\n            }\n        }\n        <\/style>\n\n\n        <div class=\"ngc-header\">\n\n            <div class=\"ngc-title\">\n                \ud83c\udfae Nexus Game Creator\n            <\/div>\n\n            <button type=\"button\"\n                    class=\"ngc-btn ngc-plugin-open\"\n                    id=\"ngc-open-plugin-button\">\n                \ud83e\udde9 Plugins\n            <\/button>\n\n            <button type=\"button\"\n                    class=\"ngc-btn ngc-save\"\n                    id=\"ngc-save-button\">\n                \ud83d\udcbe Save\n            <\/button>\n\n            <button type=\"button\"\n                    class=\"ngc-btn ngc-test\"\n                    id=\"ngc-test-button\">\n                \u25b6 Test\n            <\/button>\n\n        <\/div>\n\n\n        <div class=\"ngc-main\">\n\n\n            <div class=\"ngc-tools\">\n\n                <div class=\"ngc-tools-title\">\n                    OBJECTS\n                <\/div>\n\n                <button type=\"button\" class=\"ngc-tool active\" data-tool=\"select\">\n                    \ud83d\uddb1 Select\n                <\/button>\n\n                <button type=\"button\" class=\"ngc-tool\" data-tool=\"block\">\n                    \ud83e\uddf1 Block\n                <\/button>\n\n                <button type=\"button\" class=\"ngc-tool\" data-tool=\"ground\">\n                    \ud83d\udfe9 Ground\n                <\/button>\n\n                <button type=\"button\" class=\"ngc-tool\" data-tool=\"player\">\n                    \ud83e\uddcd Player\n                <\/button>\n\n                <button type=\"button\" class=\"ngc-tool\" data-tool=\"enemy\">\n                    \ud83d\udc7e Enemy\n                <\/button>\n\n                <button type=\"button\" class=\"ngc-tool\" data-tool=\"coin\">\n                    \ud83e\ude99 Coin\n                <\/button>\n\n                <button type=\"button\" class=\"ngc-tool\" data-tool=\"door\">\n                    \ud83d\udeaa Door\n                <\/button>\n\n                <button type=\"button\" class=\"ngc-tool\" data-tool=\"bomb\">\n                    \ud83d\udca3 Bomb\n                <\/button>\n\n                <button type=\"button\" class=\"ngc-tool\" data-tool=\"heart\">\n                    \u2764\ufe0f Heart\n                <\/button>\n\n                <button type=\"button\" class=\"ngc-tool\" data-tool=\"delete\">\n                    \ud83d\uddd1 Delete\n                <\/button>\n\n            <\/div>\n\n\n            <div class=\"ngc-center\">\n\n                <input\n                    type=\"text\"\n                    id=\"ngc-game-name\"\n                    class=\"ngc-game-name\"\n                    value=\"My Nexus Game\"\n                    placeholder=\"Game name\">\n\n\n                <div id=\"ngc-player-hp-wrapper\"\n                     class=\"ngc-player-hp-wrapper\">\n\n                    <div class=\"ngc-player-hp-top\">\n\n                        <span class=\"ngc-player-hp-title\">\n                            \u2764\ufe0f Player HP\n                        <\/span>\n\n                        <span id=\"ngc-player-hp-value\"\n                              class=\"ngc-player-hp-value\">\n                            100 \/ 100\n                        <\/span>\n\n                    <\/div>\n\n                    <div class=\"ngc-player-hp-bar\">\n\n                        <div id=\"ngc-player-hp-fill\"\n                             class=\"ngc-player-hp-fill\">\n                        <\/div>\n\n                    <\/div>\n\n                <\/div>\n\n\n                <div id=\"ngc-canvas\"\n                     class=\"ngc-canvas\">\n\n                    <div id=\"ngc-hud\"\n                         class=\"ngc-hud\">\n\n                        \ud83e\ude99 <span id=\"ngc-coins\">0<\/span>\n\n                    <\/div>\n\n\n                    <div id=\"ngc-game-over\"\n                         class=\"ngc-game-over\">\n\n                        <div class=\"ngc-game-over-title\">\n                            GAME OVER\n                        <\/div>\n\n                        <div class=\"ngc-game-over-text\">\n                            Player has been defeated.\n                        <\/div>\n\n                    <\/div>\n\n                <\/div>\n\n            <\/div>\n\n\n            <div class=\"ngc-right\">\n\n                <h3>\n                    Properties\n                <\/h3>\n\n                <div id=\"ngc-empty-properties\"\n                     class=\"ngc-empty\">\n\n                    \u06cc\u06a9 \u0622\u0628\u062c\u06a9\u062a \u0631\u0627 \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u0646.\n\n                <\/div>\n\n                <div id=\"ngc-properties\"\n                     style=\"display:none;\">\n\n                    <div class=\"ngc-field\">\n\n                        <label>\n                            Object name\n                        <\/label>\n\n                        <input id=\"ngc-object-name\"\n                               class=\"ngc-input\"\n                               type=\"text\">\n\n                    <\/div>\n\n\n                    <div class=\"ngc-field\">\n\n                        <label>\n                            Code\n                        <\/label>\n\n                        <textarea\n                            id=\"ngc-object-code\"\n                            class=\"ngc-code\"\n                            placeholder=\"when game starts:\nset enemy hp 100\n\nwhen clicked:\nshoot 25\"><\/textarea>\n\n                    <\/div>\n\n\n                    <div id=\"ngc-player-image-box\"\n                         class=\"ngc-field\"\n                         style=\"display:none;\">\n\n                        <label>\n                            Player image\n                        <\/label>\n\n                        <input id=\"ngc-player-image\"\n                               class=\"ngc-input\"\n                               type=\"file\"\n                               accept=\"image\/*\">\n\n                    <\/div>\n\n\n                    <button type=\"button\"\n                            class=\"ngc-btn\"\n                            id=\"ngc-apply-button\">\n\n                        Apply\n\n                    <\/button>\n\n                <\/div>\n\n\n                <div class=\"ngc-plugin-commands\"\n                     id=\"ngc-command-help\">\n\nBasic commands:\n\nwhen game starts:\nwhen clicked:\nif key \"d\" pressed:\nif touching \"Coin\":\n\nmove 10 px right\nmove 10 px left\nmove 10 px up\nmove 10 px down\n\ndestroy \"Coin\"\nadd 10 coins\n\nCombat:\n\ndamage \"Enemy\" 20\nkill \"Enemy\"\n\nShooting:\n\nshoot 25\nshoot 25 right\nshoot 25 left\nshoot 25 up\nshoot 25 down\nshoot \"Enemy\" 25\nbullet speed 8\n\nEnemy:\n\nset enemy hp 100\n\nPlugins add more commands.\n\n                <\/div>\n\n            <\/div>\n\n        <\/div>\n\n\n        <div id=\"ngc-plugin-overlay\">\n\n            <div id=\"ngc-plugin-window\">\n\n                <div class=\"ngc-plugin-header\">\n\n                    <h2>\n                        \ud83e\udde9 Nexus Plugins\n                    <\/h2>\n\n                    <button type=\"button\"\n                            class=\"ngc-btn ngc-plugin-close\"\n                            id=\"ngc-close-plugin-button\">\n                        \u2716 Close\n                    <\/button>\n\n                <\/div>\n\n\n                <div class=\"ngc-plugin-grid\"\n                     id=\"ngc-plugin-grid\">\n\n\n                    <div class=\"ngc-plugin-card\"\n                         data-plugin=\"combat\">\n\n                        <div class=\"ngc-plugin-name\">\n                            \u2694\ufe0f Combat\n                        <\/div>\n\n                        <div class=\"ngc-plugin-description\">\n                            Damage\u060c Attack\u060c HP \u062f\u0634\u0645\u0646 \u0648 \u0633\u06cc\u0633\u062a\u0645 \u0645\u0628\u0627\u0631\u0632\u0647.\n                        <\/div>\n\n                        <button type=\"button\"\n                                class=\"ngc-plugin-toggle\">\n                            Enable\n                        <\/button>\n\n                    <\/div>\n\n\n                    <div class=\"ngc-plugin-card\"\n                         data-plugin=\"health\">\n\n                        <div class=\"ngc-plugin-name\">\n                            \u2764\ufe0f Health\n                        <\/div>\n\n                        <div class=\"ngc-plugin-description\">\n                            HP\u060c Heal \u0648 \u0633\u06cc\u0633\u062a\u0645 \u062c\u0627\u0646 Player.\n                        <\/div>\n\n                        <button type=\"button\"\n                                class=\"ngc-plugin-toggle\">\n                            Enable\n                        <\/button>\n\n                    <\/div>\n\n\n                    <div class=\"ngc-plugin-card\"\n                         data-plugin=\"enemy_ai\">\n\n                        <div class=\"ngc-plugin-name\">\n                            \ud83d\udc7e Enemy AI\n                        <\/div>\n\n                        <div class=\"ngc-plugin-description\">\n                            \u062f\u0646\u0628\u0627\u0644 \u06a9\u0631\u062f\u0646 Player \u062a\u0648\u0633\u0637 \u062f\u0634\u0645\u0646.\n                        <\/div>\n\n                        <button type=\"button\"\n                                class=\"ngc-plugin-toggle\">\n                            Enable\n                        <\/button>\n\n                    <\/div>\n\n\n                    <div class=\"ngc-plugin-card\"\n                         data-plugin=\"inventory\">\n\n                        <div class=\"ngc-plugin-name\">\n                            \ud83c\udf92 Inventory\n                        <\/div>\n\n                        <div class=\"ngc-plugin-description\">\n                            \u0627\u0636\u0627\u0641\u0647 \u0648 \u062d\u0630\u0641 \u06a9\u0631\u062f\u0646 \u0622\u06cc\u062a\u0645\u200c\u0647\u0627.\n                        <\/div>\n\n                        <button type=\"button\"\n                                class=\"ngc-plugin-toggle\">\n                            Enable\n                        <\/button>\n\n                    <\/div>\n\n\n                    <div class=\"ngc-plugin-card\"\n                         data-plugin=\"economy\">\n\n                        <div class=\"ngc-plugin-name\">\n                            \ud83e\ude99 Economy\n                        <\/div>\n\n                        <div class=\"ngc-plugin-description\">\n                            \u0633\u06cc\u0633\u062a\u0645 \u0633\u06a9\u0647 \u062f\u0627\u062e\u0644 \u0628\u0627\u0632\u06cc.\n                        <\/div>\n\n                        <button type=\"button\"\n                                class=\"ngc-plugin-toggle\">\n                            Enable\n                        <\/button>\n\n                    <\/div>\n\n\n                    <div class=\"ngc-plugin-card\"\n                         data-plugin=\"teleport\">\n\n                        <div class=\"ngc-plugin-name\">\n                            \ud83d\ude80 Teleport\n                        <\/div>\n\n                        <div class=\"ngc-plugin-description\">\n                            \u0627\u0646\u062a\u0642\u0627\u0644 \u0622\u0628\u062c\u06a9\u062a\u200c\u0647\u0627 \u0628\u0647 \u0645\u062e\u062a\u0635\u0627\u062a \u0645\u062e\u062a\u0644\u0641.\n                        <\/div>\n\n                        <button type=\"button\"\n                                class=\"ngc-plugin-toggle\">\n                            Enable\n                        <\/button>\n\n                    <\/div>\n\n\n                    <div class=\"ngc-plugin-card\"\n                         data-plugin=\"variables\">\n\n                        <div class=\"ngc-plugin-name\">\n                            \ud83e\udde0 Variables\n                        <\/div>\n\n                        <div class=\"ngc-plugin-description\">\n                            \u0633\u0627\u062e\u062a \u0648 \u062a\u063a\u06cc\u06cc\u0631 \u0645\u062a\u063a\u06cc\u0631\u0647\u0627\u06cc \u0628\u0627\u0632\u06cc.\n                        <\/div>\n\n                        <button type=\"button\"\n                                class=\"ngc-plugin-toggle\">\n                            Enable\n                        <\/button>\n\n                    <\/div>\n\n\n                    <div class=\"ngc-plugin-card\"\n                         data-plugin=\"dialogue\">\n\n                        <div class=\"ngc-plugin-name\">\n                            \ud83d\udcac Dialogue\n                        <\/div>\n\n                        <div class=\"ngc-plugin-description\">\n                            \u0646\u0645\u0627\u06cc\u0634 \u067e\u06cc\u0627\u0645 \u0648 \u062f\u06cc\u0627\u0644\u0648\u06af.\n                        <\/div>\n\n                        <button type=\"button\"\n                                class=\"ngc-plugin-toggle\">\n                            Enable\n                        <\/button>\n\n                    <\/div>\n\n\n                    <div class=\"ngc-plugin-card\"\n                         data-plugin=\"random\">\n\n                        <div class=\"ngc-plugin-name\">\n                            \ud83c\udfb2 Random\n                        <\/div>\n\n                        <div class=\"ngc-plugin-description\">\n                            \u0627\u0639\u062f\u0627\u062f \u062a\u0635\u0627\u062f\u0641\u06cc.\n                        <\/div>\n\n                        <button type=\"button\"\n                                class=\"ngc-plugin-toggle\">\n                            Enable\n                        <\/button>\n\n                    <\/div>\n\n\n                    <div class=\"ngc-plugin-card\"\n                         data-plugin=\"timer\">\n\n                        <div class=\"ngc-plugin-name\">\n                            \u23f1\ufe0f Timer\n                        <\/div>\n\n                        <div class=\"ngc-plugin-description\">\n                            Timer \u0648 Wait.\n                        <\/div>\n\n                        <button type=\"button\"\n                                class=\"ngc-plugin-toggle\">\n                            Enable\n                        <\/button>\n\n                    <\/div>\n\n\n                    <div class=\"ngc-plugin-card\"\n                         data-plugin=\"sound\">\n\n                        <div class=\"ngc-plugin-name\">\n                            \ud83d\udd0a Sound\n                        <\/div>\n\n                        <div class=\"ngc-plugin-description\">\n                            \u0633\u06cc\u0633\u062a\u0645 \u0635\u062f\u0627 \u0628\u0631\u0627\u06cc \u0628\u0627\u0632\u06cc.\n                        <\/div>\n\n                        <button type=\"button\"\n                                class=\"ngc-plugin-toggle\">\n                            Enable\n                        <\/button>\n\n                    <\/div>\n\n\n                    <div class=\"ngc-plugin-card\"\n                         data-plugin=\"events\">\n\n                        <div class=\"ngc-plugin-name\">\n                            \ud83c\udfaf Events\n                        <\/div>\n\n                        <div class=\"ngc-plugin-description\">\n                            \u0631\u0648\u06cc\u062f\u0627\u062f\u0647\u0627\u06cc \u0628\u06cc\u0634\u062a\u0631 \u0628\u0631\u0627\u06cc \u0628\u0627\u0632\u06cc.\n                        <\/div>\n\n                        <button type=\"button\"\n                                class=\"ngc-plugin-toggle\">\n                            Enable\n                        <\/button>\n\n                    <\/div>\n\n                <\/div>\n\n\n                <div id=\"ngc-plugin-command-list\"\n                     class=\"ngc-plugin-commands\">\n\n                    \u067e\u0644\u0627\u06af\u06cc\u0646\u06cc \u0641\u0639\u0627\u0644 \u0646\u06cc\u0633\u062a.\n\n                <\/div>\n\n            <\/div>\n\n        <\/div>\n\n\n        <div id=\"ngc-notification\"\n             class=\"ngc-notification\">\n        <\/div>\n\n\n        <script>\n\n        (function(){\n\n            \"use strict\";\n\n            var root =\n                document.getElementById(\"nexus-gc\");\n\n            if(!root){\n                return;\n            }\n\n            var canvas =\n                root.querySelector(\"#ngc-canvas\");\n\n            var selectedObject = null;\n            var currentTool = \"select\";\n            var objectID = 0;\n            var testMode = false;\n            var coins = 0;\n            var hp = 100;\n            var maxHP = 100;\n            var variables = {};\n            var inventory = [];\n            var activePlugins = {};\n            var bullets = [];\n            var bulletSpeed = 8;\n            var gameOver = false;\n\n\n            \/* =================================================\n               PLUGIN DATA\n            ================================================= *\/\n\n            var pluginData = {\n\n                combat:{\n                    name:\"\u2694\ufe0f Combat\",\n                    commands:[\n                        'damage \"Enemy\" 20',\n                        'damage \"Player\" 10',\n                        'kill \"Enemy\"',\n                        'shoot \"Enemy\" 25',\n                        'set enemy hp 100',\n                        'bullet speed 8'\n                    ]\n                },\n\n                health:{\n                    name:\"\u2764\ufe0f Health\",\n                    commands:[\n                        \"set hp 100\",\n                        \"heal 20\",\n                        \"damage 20\"\n                    ]\n                },\n\n                enemy_ai:{\n                    name:\"\ud83d\udc7e Enemy AI\",\n                    commands:[\n                        'follow \"Player\"',\n                        \"enemy speed 2\"\n                    ]\n                },\n\n                inventory:{\n                    name:\"\ud83c\udf92 Inventory\",\n                    commands:[\n                        'give \"Sword\"',\n                        'remove item \"Sword\"',\n                        'if has \"Sword\":'\n                    ]\n                },\n\n                economy:{\n                    name:\"\ud83e\ude99 Economy\",\n                    commands:[\n                        \"add 10 coins\",\n                        \"remove 10 coins\",\n                        \"if coins >= 100:\"\n                    ]\n                },\n\n                teleport:{\n                    name:\"\ud83d\ude80 Teleport\",\n                    commands:[\n                        'teleport \"Player\" 400 250'\n                    ]\n                },\n\n                variables:{\n                    name:\"\ud83e\udde0 Variables\",\n                    commands:[\n                        \"set score 10\",\n                        \"add score 5\"\n                    ]\n                },\n\n                dialogue:{\n                    name:\"\ud83d\udcac Dialogue\",\n                    commands:[\n                        'say \"Hello!\"'\n                    ]\n                },\n\n                random:{\n                    name:\"\ud83c\udfb2 Random\",\n                    commands:[\n                        \"random 1 10\"\n                    ]\n                },\n\n                timer:{\n                    name:\"\u23f1\ufe0f Timer\",\n                    commands:[\n                        \"wait 2 seconds\"\n                    ]\n                },\n\n                sound:{\n                    name:\"\ud83d\udd0a Sound\",\n                    commands:[\n                        'play sound \"coin\"'\n                    ]\n                },\n\n                events:{\n                    name:\"\ud83c\udfaf Events\",\n                    commands:[\n                        \"when game starts:\",\n                        \"when clicked:\",\n                        'if key \"e\" pressed:',\n                        'if touching \"Coin\":'\n                    ]\n                }\n\n            };\n\n\n            \/* =================================================\n               NOTICE\n            ================================================= *\/\n\n            function showNotice(text){\n\n                var box =\n                    root.querySelector(\"#ngc-notification\");\n\n                box.textContent = text;\n                box.style.display = \"block\";\n\n                setTimeout(function(){\n                    box.style.display = \"none\";\n                },1800);\n\n            }\n\n\n            \/* =================================================\n               PLAYER\n            ================================================= *\/\n\n            function getPlayer(){\n\n                return root.querySelector(\n                    '.ngc-object[data-type=\"player\"]'\n                );\n\n            }\n\n\n            function updatePlayerHPBar(){\n\n                var wrapper =\n                    root.querySelector(\"#ngc-player-hp-wrapper\");\n\n                var fill =\n                    root.querySelector(\"#ngc-player-hp-fill\");\n\n                var value =\n                    root.querySelector(\"#ngc-player-hp-value\");\n\n                var player = getPlayer();\n\n                if(!player){\n\n                    wrapper.style.display = \"none\";\n                    return;\n\n                }\n\n                wrapper.style.display = \"block\";\n\n                if(hp < 0){\n                    hp = 0;\n                }\n\n                if(hp > maxHP){\n                    hp = maxHP;\n                }\n\n                var percent =\n                    (hp \/ maxHP) * 100;\n\n                fill.style.width =\n                    percent + \"%\";\n\n                value.textContent =\n                    hp + \" \/ \" + maxHP;\n\n                fill.classList.remove(\"warning\");\n                fill.classList.remove(\"danger\");\n\n                if(percent <= 50){\n                    fill.classList.add(\"warning\");\n                }\n\n                if(percent <= 25){\n\n                    fill.classList.remove(\"warning\");\n                    fill.classList.add(\"danger\");\n\n                }\n\n            }\n\n\n            \/* =================================================\n               PLUGINS\n            ================================================= *\/\n\n            var openPluginButton =\n                root.querySelector(\"#ngc-open-plugin-button\");\n\n            var closePluginButton =\n                root.querySelector(\"#ngc-close-plugin-button\");\n\n            var pluginOverlay =\n                root.querySelector(\"#ngc-plugin-overlay\");\n\n\n            openPluginButton.onclick =\n                function(e){\n\n                    e.preventDefault();\n                    e.stopPropagation();\n\n                    pluginOverlay.style.display = \"flex\";\n\n                };\n\n\n            closePluginButton.onclick =\n                function(e){\n\n                    e.preventDefault();\n                    e.stopPropagation();\n\n                    pluginOverlay.style.display = \"none\";\n\n                };\n\n\n            pluginOverlay.onclick =\n                function(e){\n\n                    if(e.target === pluginOverlay){\n                        pluginOverlay.style.display = \"none\";\n                    }\n\n                };\n\n\n            root.querySelectorAll(\n                \".ngc-plugin-card\"\n            ).forEach(function(card){\n\n                var id =\n                    card.getAttribute(\"data-plugin\");\n\n                var button =\n                    card.querySelector(\".ngc-plugin-toggle\");\n\n\n                button.onclick =\n                    function(e){\n\n                        e.preventDefault();\n                        e.stopPropagation();\n\n                        if(activePlugins[id]){\n\n                            delete activePlugins[id];\n\n                            card.classList.remove(\"enabled\");\n\n                            button.textContent = \"Enable\";\n\n                            showNotice(\n                                pluginData[id].name +\n                                \" disabled\"\n                            );\n\n                        }\n                        else{\n\n                            activePlugins[id] = true;\n\n                            card.classList.add(\"enabled\");\n\n                            button.textContent = \"Disable\";\n\n                            showNotice(\n                                pluginData[id].name +\n                                \" enabled\"\n                            );\n\n                        }\n\n                        updatePluginCommands();\n\n                    };\n\n            });\n\n\n            function updatePluginCommands(){\n\n                var box =\n                    root.querySelector(\n                        \"#ngc-plugin-command-list\"\n                    );\n\n                var output = \"\";\n\n                Object.keys(activePlugins).forEach(\n                    function(id){\n\n                        output +=\n                            pluginData[id].name +\n                            \"\\n\";\n\n                        pluginData[id].commands.forEach(\n                            function(command){\n\n                                output +=\n                                    \"  \" +\n                                    command +\n                                    \"\\n\";\n\n                            }\n                        );\n\n                        output += \"\\n\";\n\n                    }\n                );\n\n\n                if(!output){\n                    output = \"\u067e\u0644\u0627\u06af\u06cc\u0646\u06cc \u0641\u0639\u0627\u0644 \u0646\u06cc\u0633\u062a.\";\n                }\n\n                box.textContent = output;\n\n            }\n\n\n            \/* =================================================\n               TOOLS\n            ================================================= *\/\n\n            root.querySelectorAll(\n                \".ngc-tool\"\n            ).forEach(function(button){\n\n                button.onclick =\n                    function(){\n\n                        currentTool =\n                            button.getAttribute(\"data-tool\");\n\n                        root.querySelectorAll(\n                            \".ngc-tool\"\n                        ).forEach(function(b){\n\n                            b.classList.remove(\"active\");\n\n                        });\n\n                        button.classList.add(\"active\");\n\n                    };\n\n            });\n\n\n            \/* =================================================\n               ENEMY HP\n            ================================================= *\/\n\n            function setupEnemy(object){\n\n                object.dataset.hp =\n                    object.dataset.hp || \"100\";\n\n                object.dataset.maxhp =\n                    object.dataset.maxhp || \"100\";\n\n\n                if(\n                    object.querySelector(\n                        \".ngc-enemy-hp\"\n                    )\n                ){\n                    updateEnemyHPBar(object);\n                    return;\n                }\n\n\n                var hpBar =\n                    document.createElement(\"div\");\n\n                hpBar.className =\n                    \"ngc-enemy-hp\";\n\n\n                var fill =\n                    document.createElement(\"div\");\n\n                fill.className =\n                    \"ngc-enemy-hp-fill\";\n\n\n                hpBar.appendChild(fill);\n                object.appendChild(hpBar);\n\n                updateEnemyHPBar(object);\n\n            }\n\n\n            function updateEnemyHPBar(enemy){\n\n                if(!enemy){\n                    return;\n                }\n\n                var hpValue =\n                    parseFloat(\n                        enemy.dataset.hp || 100\n                    );\n\n                var maxValue =\n                    parseFloat(\n                        enemy.dataset.maxhp || 100\n                    );\n\n                var fill =\n                    enemy.querySelector(\n                        \".ngc-enemy-hp-fill\"\n                    );\n\n                if(!fill){\n                    return;\n                }\n\n                var percent =\n                    Math.max(\n                        0,\n                        Math.min(\n                            100,\n                            (hpValue \/ maxValue) * 100\n                        )\n                    );\n\n                fill.style.width =\n                    percent + \"%\";\n\n            }\n\n\n            \/* =================================================\n               CREATE OBJECT\n            ================================================= *\/\n\n            function createObject(type,x,y){\n\n                objectID++;\n\n                var object =\n                    document.createElement(\"div\");\n\n                object.className =\n                    \"ngc-object ngc-\" + type;\n\n                object.dataset.id =\n                    \"object_\" + objectID;\n\n                object.dataset.type =\n                    type;\n\n                object.dataset.name =\n                    type + \"_\" + objectID;\n\n                object.dataset.code = \"\";\n\n                object.style.left =\n                    x + \"px\";\n\n                object.style.top =\n                    y + \"px\";\n\n\n                if(type === \"player\"){\n\n                    object.textContent = \"P\";\n\n                    object.dataset.hp = \"100\";\n                    object.dataset.maxhp = \"100\";\n\n                }\n\n\n                if(type === \"enemy\"){\n\n                    object.textContent = \"\ud83d\udc7e\";\n\n                    object.dataset.hp = \"100\";\n                    object.dataset.maxhp = \"100\";\n                    object.dataset.speed = \"1\";\n\n                }\n\n\n                if(type === \"coin\"){\n                    object.textContent = \"\ud83e\ude99\";\n                }\n\n                if(type === \"door\"){\n                    object.textContent = \"\ud83d\udeaa\";\n                }\n\n                if(type === \"bomb\"){\n                    object.textContent = \"\ud83d\udca3\";\n                }\n\n                if(type === \"heart\"){\n                    object.textContent = \"\u2764\ufe0f\";\n                }\n\n\n                canvas.appendChild(object);\n\n\n                if(type === \"enemy\"){\n                    setupEnemy(object);\n                }\n\n\n                attachObject(object);\n                selectObject(object);\n\n\n                if(type === \"player\"){\n                    updatePlayerHPBar();\n                }\n\n            }\n\n\n            \/* =================================================\n               OBJECT EVENTS\n            ================================================= *\/\n\n            function attachObject(object){\n\n                object.addEventListener(\n                    \"mousedown\",\n                    function(e){\n\n                        e.stopPropagation();\n\n                        if(testMode){\n                            return;\n                        }\n\n                        if(currentTool === \"delete\"){\n\n                            object.remove();\n\n                            selectedObject = null;\n\n                            updateProperties();\n                            updatePlayerHPBar();\n\n                            return;\n\n                        }\n\n\n                        selectObject(object);\n\n\n                        if(currentTool === \"select\"){\n\n                            dragObject(\n                                object,\n                                e\n                            );\n\n                        }\n\n                    }\n                );\n\n\n                object.addEventListener(\n                    \"click\",\n                    function(e){\n\n                        e.stopPropagation();\n\n                        if(testMode){\n\n                            executeClicked(object);\n\n                        }\n\n                    }\n                );\n\n            }\n\n\n            \/* =================================================\n               SELECT\n            ================================================= *\/\n\n            function selectObject(object){\n\n                if(selectedObject){\n\n                    selectedObject.classList.remove(\n                        \"ngc-selected\"\n                    );\n\n                }\n\n                selectedObject = object;\n\n                object.classList.add(\n                    \"ngc-selected\"\n                );\n\n                updateProperties();\n\n            }\n\n\n            \/* =================================================\n               DRAG\n            ================================================= *\/\n\n            function dragObject(object,event){\n\n                var startX = event.clientX;\n                var startY = event.clientY;\n\n                var originalX =\n                    parseInt(object.style.left) || 0;\n\n                var originalY =\n                    parseInt(object.style.top) || 0;\n\n\n                function move(e){\n\n                    var x =\n                        originalX +\n                        e.clientX -\n                        startX;\n\n                    var y =\n                        originalY +\n                        e.clientY -\n                        startY;\n\n\n                    x =\n                        Math.max(\n                            0,\n                            Math.min(\n                                900-object.offsetWidth,\n                                x\n                            )\n                        );\n\n\n                    y =\n                        Math.max(\n                            0,\n                            Math.min(\n                                520-object.offsetHeight,\n                                y\n                            )\n                        );\n\n\n                    object.style.left =\n                        x + \"px\";\n\n                    object.style.top =\n                        y + \"px\";\n\n                }\n\n\n                function stop(){\n\n                    document.removeEventListener(\n                        \"mousemove\",\n                        move\n                    );\n\n                    document.removeEventListener(\n                        \"mouseup\",\n                        stop\n                    );\n\n                }\n\n\n                document.addEventListener(\n                    \"mousemove\",\n                    move\n                );\n\n                document.addEventListener(\n                    \"mouseup\",\n                    stop\n                );\n\n            }\n\n\n            \/* =================================================\n               CANVAS\n            ================================================= *\/\n\n            canvas.addEventListener(\n                \"mousedown\",\n                function(e){\n\n                    if(testMode){\n                        return;\n                    }\n\n                    if(e.target !== canvas){\n                        return;\n                    }\n\n\n                    var rect =\n                        canvas.getBoundingClientRect();\n\n                    var x =\n                        e.clientX -\n                        rect.left;\n\n                    var y =\n                        e.clientY -\n                        rect.top;\n\n\n                    if(currentTool === \"select\"){\n\n                        if(selectedObject){\n\n                            selectedObject.classList.remove(\n                                \"ngc-selected\"\n                            );\n\n                        }\n\n                        selectedObject = null;\n\n                        updateProperties();\n\n                        return;\n\n                    }\n\n\n                    if(currentTool === \"delete\"){\n                        return;\n                    }\n\n\n                    createObject(\n                        currentTool,\n                        Math.round(x\/20)*20,\n                        Math.round(y\/20)*20\n                    );\n\n                }\n            );\n\n\n            \/* =================================================\n               PROPERTIES\n            ================================================= *\/\n\n            function updateProperties(){\n\n                var empty =\n                    root.querySelector(\n                        \"#ngc-empty-properties\"\n                    );\n\n                var properties =\n                    root.querySelector(\n                        \"#ngc-properties\"\n                    );\n\n\n                if(!selectedObject){\n\n                    empty.style.display = \"block\";\n                    properties.style.display = \"none\";\n\n                    return;\n\n                }\n\n\n                empty.style.display = \"none\";\n                properties.style.display = \"block\";\n\n\n                root.querySelector(\n                    \"#ngc-object-name\"\n                ).value =\n                    selectedObject.dataset.name || \"\";\n\n\n                root.querySelector(\n                    \"#ngc-object-code\"\n                ).value =\n                    selectedObject.dataset.code || \"\";\n\n\n                var imageBox =\n                    root.querySelector(\n                        \"#ngc-player-image-box\"\n                    );\n\n\n                if(\n                    selectedObject.dataset.type === \"player\"\n                ){\n\n                    imageBox.style.display = \"block\";\n\n                }\n                else{\n\n                    imageBox.style.display = \"none\";\n\n                }\n\n            }\n\n\n            \/* =================================================\n               APPLY\n            ================================================= *\/\n\n            root.querySelector(\n                \"#ngc-apply-button\"\n            ).onclick =\n                function(){\n\n                    if(!selectedObject){\n                        return;\n                    }\n\n\n                    var name =\n                        root.querySelector(\n                            \"#ngc-object-name\"\n                        ).value.trim();\n\n\n                    if(\n                        name &&\n                        !\/^[A-Za-z_][A-Za-z0-9_-]*$\/.test(name)\n                    ){\n\n                        showNotice(\n                            \"\u0646\u0627\u0645 \u0646\u0627\u0645\u0639\u062a\u0628\u0631 \u0627\u0633\u062a.\"\n                        );\n\n                        return;\n\n                    }\n\n\n                    var duplicate = false;\n\n\n                    root.querySelectorAll(\n                        \".ngc-object\"\n                    ).forEach(function(object){\n\n                        if(\n                            object !== selectedObject &&\n                            object.dataset.name === name\n                        ){\n\n                            duplicate = true;\n\n                        }\n\n                    });\n\n\n                    if(duplicate){\n\n                        showNotice(\n                            \"\u0627\u06cc\u0646 \u0646\u0627\u0645 \u0642\u0628\u0644\u0627\u064b \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0634\u062f\u0647.\"\n                        );\n\n                        return;\n\n                    }\n\n\n                    if(name){\n                        selectedObject.dataset.name = name;\n                    }\n\n\n                    selectedObject.dataset.code =\n                        root.querySelector(\n                            \"#ngc-object-code\"\n                        ).value;\n\n\n                    showNotice(\n                        \"\u2705 \u0630\u062e\u06cc\u0631\u0647 \u0634\u062f\"\n                    );\n\n                };\n\n\n            \/* =================================================\n               PLAYER IMAGE\n            ================================================= *\/\n\n            root.querySelector(\n                \"#ngc-player-image\"\n            ).addEventListener(\n                \"change\",\n                function(){\n\n                    if(!selectedObject){\n                        return;\n                    }\n\n                    if(\n                        selectedObject.dataset.type !== \"player\"\n                    ){\n                        return;\n                    }\n\n\n                    var file = this.files[0];\n\n                    if(!file){\n                        return;\n                    }\n\n\n                    var reader =\n                        new FileReader();\n\n\n                    reader.onload =\n                        function(e){\n\n                            selectedObject.innerHTML = \"\";\n\n\n                            var img =\n                                document.createElement(\"img\");\n\n                            img.src =\n                                e.target.result;\n\n\n                            selectedObject.appendChild(img);\n\n                            selectedObject.dataset.image =\n                                e.target.result;\n\n                        };\n\n\n                    reader.readAsDataURL(file);\n\n                }\n            );\n\n\n            \/* =================================================\n               FIND OBJECT\n            ================================================= *\/\n\n            function findObject(name){\n\n                var found = null;\n\n\n                root.querySelectorAll(\n                    \".ngc-object\"\n                ).forEach(function(object){\n\n                    if(\n                        object.dataset.name === name\n                    ){\n\n                        found = object;\n\n                    }\n\n                });\n\n\n                return found;\n\n            }\n\n\n            \/*\n             * \u067e\u06cc\u062f\u0627 \u06a9\u0631\u062f\u0646 \u0647\u062f\u0641 \u0628\u0647 \u0635\u0648\u0631\u062a \u0647\u0648\u0634\u0645\u0646\u062f\n             *\n             * Enemy => \u0627\u0648\u0644\u06cc\u0646 \u062f\u0634\u0645\u0646\n             * Player => \u0628\u0627\u0632\u06cc\u06a9\u0646\n             *\/\n\n            function findSmartTarget(name){\n\n                var target =\n                    findObject(name);\n\n                if(target){\n                    return target;\n                }\n\n\n                var lower =\n                    String(name).toLowerCase();\n\n\n                if(\n                    lower === \"enemy\" ||\n                    lower === \"enemies\"\n                ){\n\n                    return root.querySelector(\n                        '.ngc-object[data-type=\"enemy\"]'\n                    );\n\n                }\n\n\n                if(\n                    lower === \"player\"\n                ){\n\n                    return getPlayer();\n\n                }\n\n\n                return null;\n\n            }\n\n\n            \/* =================================================\n               MOVE\n            ================================================= *\/\n\n            function moveObject(\n                object,\n                amount,\n                direction\n            ){\n\n                if(!object){\n                    return;\n                }\n\n\n                var x =\n                    parseInt(object.style.left) || 0;\n\n                var y =\n                    parseInt(object.style.top) || 0;\n\n\n                if(direction === \"right\")\n                    x += amount;\n\n                if(direction === \"left\")\n                    x -= amount;\n\n                if(direction === \"up\")\n                    y -= amount;\n\n                if(direction === \"down\")\n                    y += amount;\n\n\n                x =\n                    Math.max(\n                        0,\n                        Math.min(\n                            900-object.offsetWidth,\n                            x\n                        )\n                    );\n\n\n                y =\n                    Math.max(\n                        0,\n                        Math.min(\n                            520-object.offsetHeight,\n                            y\n                        )\n                    );\n\n\n                object.style.left =\n                    x + \"px\";\n\n                object.style.top =\n                    y + \"px\";\n\n            }\n\n\n            \/* =================================================\n               COLLISION\n            ================================================= *\/\n\n            function touching(a,b){\n\n                if(!a || !b){\n                    return false;\n                }\n\n\n                var ar =\n                    a.getBoundingClientRect();\n\n                var br =\n                    b.getBoundingClientRect();\n\n\n                return !(\n                    ar.right < br.left ||\n                    ar.left > br.right ||\n                    ar.bottom < br.top ||\n                    ar.top > br.bottom\n                );\n\n            }\n\n\n            \/* =================================================\n               CREATE BULLET\n            ================================================= *\/\n\n            function createBullet(\n                sx,\n                sy,\n                vx,\n                vy,\n                damageAmount,\n                target,\n                owner\n            ){\n\n                if(!testMode){\n                    return;\n                }\n\n\n                var bullet =\n                    document.createElement(\"div\");\n\n                bullet.className =\n                    \"ngc-bullet\";\n\n\n                bullet.style.left =\n                    (sx - 5) + \"px\";\n\n                bullet.style.top =\n                    (sy - 5) + \"px\";\n\n\n                canvas.appendChild(bullet);\n\n\n                bullets.push({\n\n                    element:bullet,\n\n                    x:sx - 5,\n\n                    y:sy - 5,\n\n                    vx:vx,\n\n                    vy:vy,\n\n                    target:target || null,\n\n                    owner:owner || null,\n\n                    damage:\n                        parseFloat(damageAmount) || 0\n\n                });\n\n            }\n\n\n            \/* =================================================\n               TARGET SHOOT\n            ================================================= *\/\n\n            function shootBullet(\n                shooter,\n                target,\n                damageAmount\n            ){\n\n                if(\n                    !shooter ||\n                    !target ||\n                    !testMode\n                ){\n\n                    return;\n\n                }\n\n\n                var sx =\n                    (parseFloat(\n                        shooter.style.left\n                    ) || 0) +\n                    shooter.offsetWidth \/ 2;\n\n\n                var sy =\n                    (parseFloat(\n                        shooter.style.top\n                    ) || 0) +\n                    shooter.offsetHeight \/ 2;\n\n\n                var tx =\n                    (parseFloat(\n                        target.style.left\n                    ) || 0) +\n                    target.offsetWidth \/ 2;\n\n\n                var ty =\n                    (parseFloat(\n                        target.style.top\n                    ) || 0) +\n                    target.offsetHeight \/ 2;\n\n\n                var dx =\n                    tx - sx;\n\n                var dy =\n                    ty - sy;\n\n\n                var distance =\n                    Math.sqrt(\n                        dx*dx +\n                        dy*dy\n                    );\n\n\n                if(distance <= 0){\n                    return;\n                }\n\n\n                var vx =\n                    (dx \/ distance) *\n                    bulletSpeed;\n\n\n                var vy =\n                    (dy \/ distance) *\n                    bulletSpeed;\n\n\n                createBullet(\n                    sx,\n                    sy,\n                    vx,\n                    vy,\n                    damageAmount,\n                    target,\n                    shooter\n                );\n\n            }\n\n\n            \/* =================================================\n               DIRECTIONAL SHOOT\n            ================================================= *\/\n\n            function shootBulletDirection(\n                shooter,\n                damageAmount,\n                direction\n            ){\n\n                if(\n                    !shooter ||\n                    !testMode\n                ){\n\n                    return;\n\n                }\n\n\n                var sx =\n                    (parseFloat(\n                        shooter.style.left\n                    ) || 0) +\n                    shooter.offsetWidth \/ 2;\n\n\n                var sy =\n                    (parseFloat(\n                        shooter.style.top\n                    ) || 0) +\n                    shooter.offsetHeight \/ 2;\n\n\n                var vx = 0;\n                var vy = 0;\n\n\n                if(direction === \"left\"){\n                    vx = -bulletSpeed;\n                }\n                else if(direction === \"up\"){\n                    vy = -bulletSpeed;\n                }\n                else if(direction === \"down\"){\n                    vy = bulletSpeed;\n                }\n                else{\n                    vx = bulletSpeed;\n                }\n\n\n                createBullet(\n                    sx,\n                    sy,\n                    vx,\n                    vy,\n                    damageAmount,\n                    null,\n                    shooter\n                );\n\n            }\n\n\n            \/* =================================================\n               BULLET LOOP\n            ================================================= *\/\n\n            function updateBullets(){\n\n                if(!testMode){\n                    return;\n                }\n\n\n                for(\n                    var i = bullets.length - 1;\n                    i >= 0;\n                    i--\n                ){\n\n                    var bullet =\n                        bullets[i];\n\n\n                    if(\n                        !bullet.element ||\n                        !bullet.element.parentNode\n                    ){\n\n                        bullets.splice(i,1);\n                        continue;\n\n                    }\n\n\n                    bullet.x += bullet.vx;\n                    bullet.y += bullet.vy;\n\n\n                    bullet.element.style.left =\n                        bullet.x + \"px\";\n\n                    bullet.element.style.top =\n                        bullet.y + \"px\";\n\n\n                    if(\n                        bullet.x < -20 ||\n                        bullet.x > 920 ||\n                        bullet.y < -20 ||\n                        bullet.y > 540\n                    ){\n\n                        bullet.element.remove();\n\n                        bullets.splice(i,1);\n\n                        continue;\n\n                    }\n\n\n                    \/*\n                     * \u062a\u06cc\u0631 \u062f\u0627\u0631\u0627\u06cc \u0647\u062f\u0641 \u0645\u0634\u062e\u0635\n                     *\/\n\n                    if(bullet.target){\n\n                        var target =\n                            bullet.target;\n\n\n                        if(\n                            !target.parentNode\n                        ){\n\n                            bullet.element.remove();\n\n                            bullets.splice(i,1);\n\n                            continue;\n\n                        }\n\n\n                        if(\n                            touching(\n                                bullet.element,\n                                target\n                            )\n                        ){\n\n                            applyDamageToObject(\n                                target,\n                                bullet.damage\n                            );\n\n\n                            bullet.element.remove();\n\n                            bullets.splice(i,1);\n\n                        }\n\n\n                        continue;\n\n                    }\n\n\n                    \/*\n                     * \u062a\u06cc\u0631 \u0622\u0632\u0627\u062f:\n                     * Player -> Enemy\n                     * Enemy -> Player\n                     *\/\n\n                    var owner =\n                        bullet.owner;\n\n                    var ownerType =\n                        owner ?\n                        owner.dataset.type :\n                        \"player\";\n\n\n                    var hitTarget = null;\n\n\n                    root.querySelectorAll(\n                        \".ngc-object\"\n                    ).forEach(function(object){\n\n                        if(hitTarget){\n                            return;\n                        }\n\n\n                        if(!object.parentNode){\n                            return;\n                        }\n\n\n                        if(object === owner){\n                            return;\n                        }\n\n\n                        if(\n                            ownerType === \"player\" &&\n                            object.dataset.type !== \"enemy\"\n                        ){\n\n                            return;\n\n                        }\n\n\n                        if(\n                            ownerType === \"enemy\" &&\n                            object.dataset.type !== \"player\"\n                        ){\n\n                            return;\n\n                        }\n\n\n                        if(\n                            touching(\n                                bullet.element,\n                                object\n                            )\n                        ){\n\n                            hitTarget =\n                                object;\n\n                        }\n\n                    });\n\n\n                    if(hitTarget){\n\n                        applyDamageToObject(\n                            hitTarget,\n                            bullet.damage\n                        );\n\n\n                        bullet.element.remove();\n\n                        bullets.splice(i,1);\n\n                    }\n\n                }\n\n            }\n\n\n            \/* =================================================\n               DAMAGE OBJECT\n            ================================================= *\/\n\n            function applyDamageToObject(\n                target,\n                amount\n            ){\n\n                if(!target){\n                    return;\n                }\n\n\n                amount =\n                    parseFloat(amount) || 0;\n\n\n                if(\n                    target.dataset.type === \"enemy\"\n                ){\n\n                    var enemyHP =\n                        parseFloat(\n                            target.dataset.hp || 100\n                        );\n\n\n                    enemyHP -= amount;\n\n                    target.dataset.hp =\n                        enemyHP;\n\n\n                    updateEnemyHPBar(\n                        target\n                    );\n\n\n                    if(enemyHP <= 0){\n\n                        target.remove();\n\n                        showNotice(\n                            \"\ud83d\udca5 Enemy defeated!\"\n                        );\n\n                    }\n\n\n                    return;\n\n                }\n\n\n                if(\n                    target.dataset.type === \"player\"\n                ){\n\n                    hp -= amount;\n\n                    updateHUD();\n\n\n                    if(hp <= 0){\n\n                        hp = 0;\n\n                        updateHUD();\n\n                        playerDeath();\n\n                    }\n\n                }\n\n            }\n\n\n            \/* =================================================\n               PLAYER DEATH\n            ================================================= *\/\n\n            function playerDeath(){\n\n                if(gameOver){\n                    return;\n                }\n\n\n                gameOver = true;\n\n\n                var player =\n                    getPlayer();\n\n\n                if(player){\n\n                    player.style.opacity =\n                        \"0.4\";\n\n                }\n\n\n                root.querySelector(\n                    \"#ngc-game-over\"\n                ).style.display =\n                    \"flex\";\n\n\n                showNotice(\n                    \"\ud83d\udc80 Player defeated\"\n                );\n\n            }\n\n\n            \/* =================================================\n               PARSER\n            ================================================= *\/\n\n            function parseCode(code){\n\n                var lines =\n                    code\n                    .split(\"\\n\")\n                    .map(function(line){\n                        return line.trim();\n                    })\n                    .filter(function(line){\n                        return line !== \"\";\n                    });\n\n\n                var result = {\n\n                    start:[],\n                    click:[],\n                    keys:{},\n                    touches:[]\n\n                };\n\n\n                var mode = \"none\";\n                var currentKey = null;\n\n\n                lines.forEach(function(line){\n\n                    if(\n                        line === \"when game starts:\"\n                    ){\n\n                        mode = \"start\";\n                        currentKey = null;\n                        return;\n\n                    }\n\n\n                    if(\n                        line === \"when clicked:\"\n                    ){\n\n                        mode = \"click\";\n                        currentKey = null;\n                        return;\n\n                    }\n\n\n                    var key =\n                        line.match(\n                            \/^if key [\"'](.+)[\"'] pressed:$\/\n                        );\n\n\n                    if(key){\n\n                        currentKey = key[1];\n\n                        result.keys[\n                            currentKey\n                        ] = [];\n\n                        mode = \"key\";\n\n                        return;\n\n                    }\n\n\n                    var touch =\n                        line.match(\n                            \/^if touching [\"'](.+)[\"']:$\/\n                        );\n\n\n                    if(touch){\n\n                        result.touches.push({\n\n                            name:touch[1],\n\n                            actions:[]\n\n                        });\n\n\n                        mode = \"touch\";\n\n                        return;\n\n                    }\n\n\n                    if(mode === \"start\"){\n\n                        result.start.push(line);\n\n                    }\n                    else if(mode === \"click\"){\n\n                        result.click.push(line);\n\n                    }\n                    else if(mode === \"key\"){\n\n                        if(currentKey !== null){\n\n                            result.keys[\n                                currentKey\n                            ].push(line);\n\n                        }\n\n                    }\n                    else if(mode === \"touch\"){\n\n                        if(result.touches.length){\n\n                            result.touches[\n                                result.touches.length - 1\n                            ].actions.push(line);\n\n                        }\n\n                    }\n\n                });\n\n\n                return result;\n\n            }\n\n\n            \/* =================================================\n               ACTIONS\n            ================================================= *\/\n\n            function executeActions(\n                actions,\n                object\n            ){\n\n                actions.forEach(function(action){\n\n                    if(gameOver){\n                        return;\n                    }\n\n\n                    \/* MOVE *\/\n\n                    var move =\n                        action.match(\n                            \/^move (-?\\d+) px (right|left|up|down)$\/\n                        );\n\n\n                    if(move){\n\n                        moveObject(\n                            object,\n                            parseInt(move[1]),\n                            move[2]\n                        );\n\n                        return;\n\n                    }\n\n\n                    \/* =========================================\n                       SHOOT - TARGET\n                    ========================================= *\/\n\n                    var shootTargetCommand =\n                        action.match(\n                            \/^shoot [\"'](.+)[\"'] (-?\\d+)$\/\n                        );\n\n\n                    if(shootTargetCommand){\n\n                        var shootTargetName =\n                            shootTargetCommand[1];\n\n\n                        var shootTarget =\n                            findSmartTarget(\n                                shootTargetName\n                            );\n\n\n                        if(shootTarget){\n\n                            shootBullet(\n                                object,\n                                shootTarget,\n                                parseFloat(\n                                    shootTargetCommand[2]\n                                )\n                            );\n\n                        }\n                        else{\n\n                            showNotice(\n                                \"\u26a0\ufe0f \u0647\u062f\u0641 \u067e\u06cc\u062f\u0627 \u0646\u0634\u062f: \" +\n                                shootTargetName\n                            );\n\n                        }\n\n\n                        return;\n\n                    }\n\n\n                    \/* =========================================\n                       SHOOT - DIRECTION\n                    ========================================= *\/\n\n                    var shootDirectionCommand =\n                        action.match(\n                            \/^shoot (-?\\d+)(?: (right|left|up|down))?$\/\n                        );\n\n\n                    if(shootDirectionCommand){\n\n                        var damageAmount =\n                            parseFloat(\n                                shootDirectionCommand[1]\n                            );\n\n\n                        var direction =\n                            shootDirectionCommand[2] ||\n                            \"right\";\n\n\n                        shootBulletDirection(\n                            object,\n                            damageAmount,\n                            direction\n                        );\n\n\n                        return;\n\n                    }\n\n\n                    \/* BULLET SPEED *\/\n\n                    var bulletSpeedCommand =\n                        action.match(\n                            \/^bullet speed (-?\\d+(?:\\.\\d+)?)$\/\n                        );\n\n\n                    if(bulletSpeedCommand){\n\n                        bulletSpeed =\n                            Math.max(\n                                1,\n                                parseFloat(\n                                    bulletSpeedCommand[1]\n                                )\n                            );\n\n\n                        return;\n\n                    }\n\n\n                    \/* SET ENEMY HP *\/\n\n                    var setEnemyHP =\n                        action.match(\n                            \/^set enemy hp (-?\\d+)$\/\n                        );\n\n\n                    if(\n                        setEnemyHP &&\n                        activePlugins.combat\n                    ){\n\n                        var enemyTarget =\n                            object;\n\n\n                        if(\n                            enemyTarget &&\n                            enemyTarget.dataset.type ===\n                            \"enemy\"\n                        ){\n\n                            enemyTarget.dataset.hp =\n                                Math.max(\n                                    0,\n                                    parseInt(\n                                        setEnemyHP[1]\n                                    )\n                                );\n\n\n                            enemyTarget.dataset.maxhp =\n                                Math.max(\n                                    1,\n                                    parseInt(\n                                        setEnemyHP[1]\n                                    )\n                                );\n\n\n                            updateEnemyHPBar(\n                                enemyTarget\n                            );\n\n                        }\n\n\n                        return;\n\n                    }\n\n\n                    \/* DESTROY *\/\n\n                    var destroy =\n                        action.match(\n                            \/^destroy [\"'](.+)[\"']$\/\n                        );\n\n\n                    if(destroy){\n\n                        var target =\n                            findSmartTarget(\n                                destroy[1]\n                            );\n\n\n                        if(target){\n                            target.remove();\n                        }\n\n\n                        updatePlayerHPBar();\n\n                        return;\n\n                    }\n\n\n                    \/* ADD COINS *\/\n\n                    var addCoins =\n                        action.match(\n                            \/^add (-?\\d+) coins$\/\n                        );\n\n\n                    if(addCoins){\n\n                        coins +=\n                            parseInt(\n                                addCoins[1]\n                            );\n\n\n                        if(coins < 0){\n                            coins = 0;\n                        }\n\n\n                        updateHUD();\n\n                        return;\n\n                    }\n\n\n                    \/* REMOVE COINS *\/\n\n                    var removeCoins =\n                        action.match(\n                            \/^remove (-?\\d+) coins$\/\n                        );\n\n\n                    if(\n                        removeCoins &&\n                        activePlugins.economy\n                    ){\n\n                        coins -=\n                            parseInt(\n                                removeCoins[1]\n                            );\n\n\n                        if(coins < 0){\n                            coins = 0;\n                        }\n\n\n                        updateHUD();\n\n                        return;\n\n                    }\n\n\n                    \/* SET HP *\/\n\n                    var setHP =\n                        action.match(\n                            \/^set hp (-?\\d+)$\/\n                        );\n\n\n                    if(\n                        setHP &&\n                        (\n                            activePlugins.health ||\n                            activePlugins.combat\n                        )\n                    ){\n\n                        hp =\n                            Math.max(\n                                0,\n                                parseInt(\n                                    setHP[1]\n                                )\n                            );\n\n\n                        if(hp > maxHP){\n                            maxHP = hp;\n                        }\n\n\n                        updateHUD();\n                        updatePlayerHPBar();\n\n                        return;\n\n                    }\n\n\n                    \/* HEAL *\/\n\n                    var heal =\n                        action.match(\n                            \/^heal (-?\\d+)$\/\n                        );\n\n\n                    if(\n                        heal &&\n                        activePlugins.health\n                    ){\n\n                        hp +=\n                            parseInt(\n                                heal[1]\n                            );\n\n\n                        if(hp > maxHP){\n                            hp = maxHP;\n                        }\n\n\n                        updateHUD();\n                        updatePlayerHPBar();\n\n                        return;\n\n                    }\n\n\n                    \/* DAMAGE *\/\n\n                    var damage =\n                        action.match(\n                            \/^damage [\"'](.+)[\"'] (-?\\d+)$\/\n                        );\n\n\n                    if(\n                        damage &&\n                        (\n                            activePlugins.health ||\n                            activePlugins.combat\n                        )\n                    ){\n\n                        var damageTarget =\n                            findSmartTarget(\n                                damage[1]\n                            );\n\n\n                        if(damageTarget){\n\n                            applyDamageToObject(\n                                damageTarget,\n                                parseInt(\n                                    damage[2]\n                                )\n                            );\n\n                        }\n\n\n                        return;\n\n                    }\n\n\n                    \/* KILL *\/\n\n                    var kill =\n                        action.match(\n                            \/^kill [\"'](.+)[\"']$\/\n                        );\n\n\n                    if(\n                        kill &&\n                        activePlugins.combat\n                    ){\n\n                        var killTarget =\n                            findSmartTarget(\n                                kill[1]\n                            );\n\n\n                        if(killTarget){\n                            killTarget.remove();\n                        }\n\n\n                        updatePlayerHPBar();\n\n                        return;\n\n                    }\n\n\n                    \/* TELEPORT *\/\n\n                    var teleport =\n                        action.match(\n                            \/^teleport [\"'](.+)[\"'] (-?\\d+) (-?\\d+)$\/\n                        );\n\n\n                    if(\n                        teleport &&\n                        activePlugins.teleport\n                    ){\n\n                        var teleportTarget =\n                            findSmartTarget(\n                                teleport[1]\n                            );\n\n\n                        if(teleportTarget){\n\n                            teleportTarget.style.left =\n                                parseInt(\n                                    teleport[2]\n                                ) + \"px\";\n\n\n                            teleportTarget.style.top =\n                                parseInt(\n                                    teleport[3]\n                                ) + \"px\";\n\n                        }\n\n\n                        return;\n\n                    }\n\n\n                    \/* GIVE ITEM *\/\n\n                    var give =\n                        action.match(\n                            \/^give [\"'](.+)[\"']$\/\n                        );\n\n\n                    if(\n                        give &&\n                        activePlugins.inventory\n                    ){\n\n                        if(\n                            inventory.indexOf(\n                                give[1]\n                            ) === -1\n                        ){\n\n                            inventory.push(\n                                give[1]\n                            );\n\n                        }\n\n\n                        return;\n\n                    }\n\n\n                    \/* REMOVE ITEM *\/\n\n                    var removeItem =\n                        action.match(\n                            \/^remove item [\"'](.+)[\"']$\/\n                        );\n\n\n                    if(\n                        removeItem &&\n                        activePlugins.inventory\n                    ){\n\n                        inventory =\n                            inventory.filter(\n                                function(item){\n\n                                    return item !==\n                                        removeItem[1];\n\n                                }\n                            );\n\n\n                        return;\n\n                    }\n\n\n                    \/* SAY *\/\n\n                    var say =\n                        action.match(\n                            \/^say [\"'](.+)[\"']$\/\n                        );\n\n\n                    if(\n                        say &&\n                        activePlugins.dialogue\n                    ){\n\n                        showNotice(\n                            \"\ud83d\udcac \" +\n                            say[1]\n                        );\n\n                        return;\n\n                    }\n\n\n                    \/* SET VARIABLE *\/\n\n                    var setVariable =\n                        action.match(\n                            \/^set ([A-Za-z_][A-Za-z0-9_]*) (-?\\d+)$\/\n                        );\n\n\n                    if(\n                        setVariable &&\n                        activePlugins.variables\n                    ){\n\n                        variables[\n                            setVariable[1]\n                        ] =\n                            parseInt(\n                                setVariable[2]\n                            );\n\n                        return;\n\n                    }\n\n\n                    \/* ADD VARIABLE *\/\n\n                    var addVariable =\n                        action.match(\n                            \/^add ([A-Za-z_][A-Za-z0-9_]*) (-?\\d+)$\/\n                        );\n\n\n                    if(\n                        addVariable &&\n                        activePlugins.variables\n                    ){\n\n                        if(\n                            typeof variables[\n                                addVariable[1]\n                            ] !== \"number\"\n                        ){\n\n                            variables[\n                                addVariable[1]\n                            ] = 0;\n\n                        }\n\n\n                        variables[\n                            addVariable[1]\n                        ] +=\n                            parseInt(\n                                addVariable[2]\n                            );\n\n                        return;\n\n                    }\n\n\n                    \/* RANDOM *\/\n\n                    var random =\n                        action.match(\n                            \/^random (-?\\d+) (-?\\d+)$\/\n                        );\n\n\n                    if(\n                        random &&\n                        activePlugins.random\n                    ){\n\n                        var min =\n                            parseInt(\n                                random[1]\n                            );\n\n\n                        var max =\n                            parseInt(\n                                random[2]\n                            );\n\n\n                        variables.random =\n                            Math.floor(\n                                Math.random() *\n                                (max-min+1)\n                            ) + min;\n\n                        return;\n\n                    }\n\n\n                    \/* SOUND *\/\n\n                    var sound =\n                        action.match(\n                            \/^play sound [\"'](.+)[\"']$\/\n                        );\n\n\n                    if(\n                        sound &&\n                        activePlugins.sound\n                    ){\n\n                        showNotice(\n                            \"\ud83d\udd0a \" +\n                            sound[1]\n                        );\n\n                        return;\n\n                    }\n\n\n                    \/* STOP *\/\n\n                    if(action === \"stop\"){\n                        return;\n                    }\n\n                });\n\n            }\n\n\n            \/* =================================================\n               START\n            ================================================= *\/\n\n            function executeStart(){\n\n                root.querySelectorAll(\n                    \".ngc-object\"\n                ).forEach(function(object){\n\n                    var code =\n                        object.dataset.code || \"\";\n\n                    if(!code){\n                        return;\n                    }\n\n\n                    var parsed =\n                        parseCode(code);\n\n\n                    executeActions(\n                        parsed.start,\n                        object\n                    );\n\n                });\n\n            }\n\n\n            \/* =================================================\n               CLICK\n            ================================================= *\/\n\n            function executeClicked(object){\n\n                var code =\n                    object.dataset.code || \"\";\n\n\n                if(!code){\n                    return;\n                }\n\n\n                var parsed =\n                    parseCode(code);\n\n\n                executeActions(\n                    parsed.click,\n                    object\n                );\n\n            }\n\n\n            \/* =================================================\n               KEYBOARD\n            ================================================= *\/\n\n            document.addEventListener(\n                \"keydown\",\n                function(e){\n\n                    if(!testMode){\n                        return;\n                    }\n\n\n                    if(gameOver){\n                        return;\n                    }\n\n\n                    \/*\n                     * \u062c\u0644\u0648\u06af\u06cc\u0631\u06cc \u0627\u0632 \u0634\u0644\u06cc\u06a9 \u0628\u06cc\u200c\u0646\u0647\u0627\u06cc\u062a\n                     * \u0647\u0646\u06af\u0627\u0645 \u0646\u06af\u0647 \u062f\u0627\u0634\u062a\u0646 \u06a9\u0644\u06cc\u062f\n                     *\/\n\n                    if(e.repeat){\n                        return;\n                    }\n\n\n                    var key =\n                        e.key.toLowerCase();\n\n\n                    root.querySelectorAll(\n                        \".ngc-object\"\n                    ).forEach(function(object){\n\n                        var code =\n                            object.dataset.code || \"\";\n\n\n                        if(!code){\n                            return;\n                        }\n\n\n                        var parsed =\n                            parseCode(code);\n\n\n                        Object.keys(\n                            parsed.keys\n                        ).forEach(function(\n                            configuredKey\n                        ){\n\n                            if(\n                                configuredKey.toLowerCase() ===\n                                key\n                            ){\n\n                                executeActions(\n                                    parsed.keys[\n                                        configuredKey\n                                    ],\n                                    object\n                                );\n\n                            }\n\n                        });\n\n                    });\n\n                }\n            );\n\n\n            \/* =================================================\n               TOUCH\n            ================================================= *\/\n\n            function processTouch(){\n\n                if(gameOver){\n                    return;\n                }\n\n\n                root.querySelectorAll(\n                    \".ngc-object\"\n                ).forEach(function(object){\n\n                    var code =\n                        object.dataset.code || \"\";\n\n\n                    if(!code){\n                        return;\n                    }\n\n\n                    var parsed =\n                        parseCode(code);\n\n\n                    parsed.touches.forEach(\n                        function(condition){\n\n                            var target =\n                                findSmartTarget(\n                                    condition.name\n                                );\n\n\n                            if(\n                                target &&\n                                touching(\n                                    object,\n                                    target\n                                )\n                            ){\n\n                                executeActions(\n                                    condition.actions,\n                                    object\n                                );\n\n                            }\n\n                        }\n                    );\n\n                });\n\n            }\n\n\n            \/* =================================================\n               ENEMY AI\n            ================================================= *\/\n\n            function enemyAI(){\n\n                if(\n                    !activePlugins.enemy_ai ||\n                    gameOver\n                ){\n\n                    return;\n\n                }\n\n\n                var player =\n                    getPlayer();\n\n\n                if(!player){\n                    return;\n                }\n\n\n                var px =\n                    parseInt(\n                        player.style.left\n                    ) || 0;\n\n\n                var py =\n                    parseInt(\n                        player.style.top\n                    ) || 0;\n\n\n                root.querySelectorAll(\n                    '.ngc-object[data-type=\"enemy\"]'\n                ).forEach(function(enemy){\n\n                    var ex =\n                        parseFloat(\n                            enemy.style.left\n                        ) || 0;\n\n\n                    var ey =\n                        parseFloat(\n                            enemy.style.top\n                        ) || 0;\n\n\n                    var speed =\n                        parseFloat(\n                            enemy.dataset.speed || \"1\"\n                        );\n\n\n                    if(ex < px){\n\n                        enemy.style.left =\n                            (ex + speed) + \"px\";\n\n                    }\n                    else if(ex > px){\n\n                        enemy.style.left =\n                            (ex - speed) + \"px\";\n\n                    }\n\n\n                    if(ey < py){\n\n                        enemy.style.top =\n                            (ey + speed) + \"px\";\n\n                    }\n                    else if(ey > py){\n\n                        enemy.style.top =\n                            (ey - speed) + \"px\";\n\n                    }\n\n\n                    if(\n                        touching(\n                            enemy,\n                            player\n                        )\n                    ){\n\n                        if(activePlugins.combat){\n\n                            applyDamageToObject(\n                                player,\n                                10 \/ 60\n                            );\n\n                        }\n\n                    }\n\n                });\n\n            }\n\n\n            \/* =================================================\n               HUD\n            ================================================= *\/\n\n            function updateHUD(){\n\n                root.querySelector(\n                    \"#ngc-coins\"\n                ).textContent =\n                    coins;\n\n\n                updatePlayerHPBar();\n\n            }\n\n\n            \/* =================================================\n               TEST\n            ================================================= *\/\n\n            var testButton =\n                root.querySelector(\n                    \"#ngc-test-button\"\n                );\n\n\n            testButton.onclick =\n                function(){\n\n                    testMode =\n                        !testMode;\n\n\n                    if(testMode){\n\n                        coins = 0;\n                        hp = 100;\n                        maxHP = 100;\n                        gameOver = false;\n\n\n                        \/*\n                         * \u067e\u0627\u06a9 \u06a9\u0631\u062f\u0646 \u062a\u06cc\u0631\u0647\u0627\u06cc \u0642\u0628\u0644\u06cc\n                         *\/\n\n                        bullets.forEach(\n                            function(bullet){\n\n                                if(\n                                    bullet.element &&\n                                    bullet.element.parentNode\n                                ){\n\n                                    bullet.element.remove();\n\n                                }\n\n                            }\n                        );\n\n\n                        bullets = [];\n\n\n                        root.querySelector(\n                            \"#ngc-game-over\"\n                        ).style.display =\n                            \"none\";\n\n\n                        root.querySelectorAll(\n                            \".ngc-object[data-type='enemy']\"\n                        ).forEach(function(enemy){\n\n                            enemy.dataset.hp =\n                                enemy.dataset.maxhp ||\n                                \"100\";\n\n\n                            enemy.style.opacity = \"1\";\n\n\n                            updateEnemyHPBar(\n                                enemy\n                            );\n\n                        });\n\n\n                        var player =\n                            getPlayer();\n\n\n                        if(player){\n\n                            player.style.opacity =\n                                \"1\";\n\n                        }\n\n\n                        updateHUD();\n\n\n                        root.querySelector(\n                            \"#ngc-hud\"\n                        ).style.display =\n                            \"block\";\n\n\n                        testButton.textContent =\n                            \"\u23f9 Stop\";\n\n\n                        root.querySelectorAll(\n                            \".ngc-object\"\n                        ).forEach(function(object){\n\n                            object.classList.remove(\n                                \"ngc-selected\"\n                            );\n\n                        });\n\n\n                        selectedObject = null;\n\n                        updateProperties();\n\n\n                        executeStart();\n\n                        updatePlayerHPBar();\n\n\n                        showNotice(\n                            \"\u25b6 Test Mode\"\n                        );\n\n\n                        testLoop();\n\n                    }\n                    else{\n\n                        root.querySelector(\n                            \"#ngc-hud\"\n                        ).style.display =\n                            \"none\";\n\n\n                        root.querySelector(\n                            \"#ngc-game-over\"\n                        ).style.display =\n                            \"none\";\n\n\n                        testButton.textContent =\n                            \"\u25b6 Test\";\n\n\n                        bullets.forEach(\n                            function(bullet){\n\n                                if(\n                                    bullet.element &&\n                                    bullet.element.parentNode\n                                ){\n\n                                    bullet.element.remove();\n\n                                }\n\n                            }\n                        );\n\n\n                        bullets = [];\n\n\n                        showNotice(\n                            \"\u23f9 Test stopped\"\n                        );\n\n                    }\n\n                };\n\n\n            \/* =================================================\n               TEST LOOP\n            ================================================= *\/\n\n            function testLoop(){\n\n                if(!testMode){\n                    return;\n                }\n\n\n                processTouch();\n\n                enemyAI();\n\n                updateBullets();\n\n\n                requestAnimationFrame(\n                    testLoop\n                );\n\n            }\n\n\n            \/* =================================================\n               SAVE\n            ================================================= *\/\n\n            root.querySelector(\n                \"#ngc-save-button\"\n            ).onclick =\n                function(){\n\n                    var objects = [];\n\n\n                    root.querySelectorAll(\n                        \".ngc-object\"\n                    ).forEach(function(object){\n\n                        objects.push({\n\n                            type:\n                                object.dataset.type,\n\n                            name:\n                                object.dataset.name,\n\n                            code:\n                                object.dataset.code,\n\n                            x:\n                                parseInt(\n                                    object.style.left\n                                ) || 0,\n\n                            y:\n                                parseInt(\n                                    object.style.top\n                                ) || 0,\n\n                            image:\n                                object.dataset.image ||\n                                null,\n\n                            hp:\n                                object.dataset.hp ||\n                                null,\n\n                            maxhp:\n                                object.dataset.maxhp ||\n                                null,\n\n                            speed:\n                                object.dataset.speed ||\n                                null\n\n                        });\n\n                    });\n\n\n                    var game = {\n\n                        name:\n                            root.querySelector(\n                                \"#ngc-game-name\"\n                            ).value,\n\n                        plugins:\n                            Object.keys(\n                                activePlugins\n                            ),\n\n                        objects:\n                            objects\n\n                    };\n\n\n                    localStorage.setItem(\n                        \"nexus_game_creator_v2\",\n                        JSON.stringify(game)\n                    );\n\n\n                    showNotice(\n                        \"\ud83d\udcbe Game saved\"\n                    );\n\n                };\n\n\n            \/* =================================================\n               LOAD\n            ================================================= *\/\n\n            function loadGame(){\n\n                var raw =\n                    localStorage.getItem(\n                        \"nexus_game_creator_v2\"\n                    );\n\n\n                if(!raw){\n\n                    updatePlayerHPBar();\n\n                    return;\n\n                }\n\n\n                var game;\n\n\n                try{\n\n                    game =\n                        JSON.parse(raw);\n\n                }\n                catch(error){\n\n                    return;\n\n                }\n\n\n                if(game.name){\n\n                    root.querySelector(\n                        \"#ngc-game-name\"\n                    ).value =\n                        game.name;\n\n                }\n\n\n                if(\n                    Array.isArray(\n                        game.plugins\n                    )\n                ){\n\n                    game.plugins.forEach(\n                        function(id){\n\n                            var card =\n                                root.querySelector(\n                                    '.ngc-plugin-card[data-plugin=\"' +\n                                    id +\n                                    '\"]'\n                                );\n\n\n                            if(!card){\n                                return;\n                            }\n\n\n                            activePlugins[id] = true;\n\n                            card.classList.add(\n                                \"enabled\"\n                            );\n\n\n                            card.querySelector(\n                                \".ngc-plugin-toggle\"\n                            ).textContent =\n                                \"Disable\";\n\n                        }\n                    );\n\n\n                    updatePluginCommands();\n\n                }\n\n\n                if(\n                    Array.isArray(\n                        game.objects\n                    )\n                ){\n\n                    game.objects.forEach(\n                        function(data){\n\n                            objectID++;\n\n\n                            var object =\n                                document.createElement(\"div\");\n\n\n                            object.className =\n                                \"ngc-object ngc-\" +\n                                data.type;\n\n\n                            object.dataset.id =\n                                \"object_\" +\n                                objectID;\n\n\n                            object.dataset.type =\n                                data.type;\n\n\n                            object.dataset.name =\n                                data.name ||\n                                data.type +\n                                \"_\" +\n                                objectID;\n\n\n                            object.dataset.code =\n                                data.code ||\n                                \"\";\n\n\n                            object.style.left =\n                                (data.x || 0) +\n                                \"px\";\n\n\n                            object.style.top =\n                                (data.y || 0) +\n                                \"px\";\n\n\n                            if(data.hp !== null){\n\n                                object.dataset.hp =\n                                    data.hp;\n\n                            }\n\n\n                            if(data.maxhp !== null){\n\n                                object.dataset.maxhp =\n                                    data.maxhp;\n\n                            }\n\n\n                            if(data.speed !== null){\n\n                                object.dataset.speed =\n                                    data.speed;\n\n                            }\n\n\n                            if(data.image){\n\n                                object.dataset.image =\n                                    data.image;\n\n\n                                var img =\n                                    document.createElement(\"img\");\n\n\n                                img.src =\n                                    data.image;\n\n\n                                object.appendChild(img);\n\n                            }\n                            else{\n\n                                if(\n                                    data.type === \"player\"\n                                ){\n                                    object.textContent = \"P\";\n                                }\n\n\n                                if(\n                                    data.type === \"enemy\"\n                                ){\n                                    object.textContent = \"\ud83d\udc7e\";\n                                }\n\n\n                                if(\n                                    data.type === \"coin\"\n                                ){\n                                    object.textContent = \"\ud83e\ude99\";\n                                }\n\n\n                                if(\n                                    data.type === \"door\"\n                                ){\n                                    object.textContent = \"\ud83d\udeaa\";\n                                }\n\n\n                                if(\n                                    data.type === \"bomb\"\n                                ){\n                                    object.textContent = \"\ud83d\udca3\";\n                                }\n\n\n                                if(\n                                    data.type === \"heart\"\n                                ){\n                                    object.textContent = \"\u2764\ufe0f\";\n                                }\n\n                            }\n\n\n                            canvas.appendChild(object);\n\n\n                            if(\n                                data.type === \"enemy\"\n                            ){\n\n                                setupEnemy(object);\n\n                            }\n\n\n                            attachObject(object);\n\n                        }\n                    );\n\n                }\n\n\n                updatePlayerHPBar();\n\n            }\n\n\n            \/* =================================================\n               INITIALIZE\n            ================================================= *\/\n\n            updatePluginCommands();\n\n            updateProperties();\n\n            loadGame();\n\n            updatePlayerHPBar();\n\n        })();\n\n        <\/script>\n\n    <\/div>\n\n    \n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":"","footnotes":""},"class_list":["post-611","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/mtgrayli.yclass.ir\/wordpress\/wp-json\/wp\/v2\/pages\/611","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mtgrayli.yclass.ir\/wordpress\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/mtgrayli.yclass.ir\/wordpress\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/mtgrayli.yclass.ir\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/mtgrayli.yclass.ir\/wordpress\/wp-json\/wp\/v2\/comments?post=611"}],"version-history":[{"count":3,"href":"https:\/\/mtgrayli.yclass.ir\/wordpress\/wp-json\/wp\/v2\/pages\/611\/revisions"}],"predecessor-version":[{"id":615,"href":"https:\/\/mtgrayli.yclass.ir\/wordpress\/wp-json\/wp\/v2\/pages\/611\/revisions\/615"}],"wp:attachment":[{"href":"https:\/\/mtgrayli.yclass.ir\/wordpress\/wp-json\/wp\/v2\/media?parent=611"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}