{"id":74088,"date":"2024-08-20T09:19:21","date_gmt":"2024-08-20T05:49:21","guid":{"rendered":"https:\/\/nabfollower.com\/blog\/how-to-create-an-information-asymmetric-autonomous-world-mud-circom-3bdn\/"},"modified":"2024-08-20T09:19:21","modified_gmt":"2024-08-20T05:49:21","slug":"how-to-create-an-information-asymmetric-autonomous-world-mud-circom-3bdn","status":"publish","type":"post","link":"https:\/\/nabfollower.com\/blog\/how-to-create-an-information-asymmetric-autonomous-world-mud-circom-3bdn\/","title":{"rendered":"\u0646\u062d\u0648\u0647 \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u062c\u0647\u0627\u0646 \u062e\u0648\u062f\u0645\u062e\u062a\u0627\u0631 \u0646\u0627\u0645\u062a\u0642\u0627\u0631\u0646 \u0627\u0637\u0644\u0627\u0639\u0627\u062a\u06cc: MUD + Circom"},"content":{"rendered":"<p>Summarize this content to 400 words in Persian Lang<br \/>\n            \u062f\u0631 \u0627\u06cc\u0646 \u0622\u0645\u0648\u0632\u0634\u060c \u0645\u0627 \u06cc\u06a9 \u0628\u0627\u0632\u06cc 100% \u0631\u0648\u06cc \u0632\u0646\u062c\u06cc\u0631\u0647 \u0628\u0627 \u0639\u062f\u0645 \u062a\u0642\u0627\u0631\u0646 \u0627\u0637\u0644\u0627\u0639\u0627\u062a\u06cc \u0627\u06cc\u062c\u0627\u062f \u062e\u0648\u0627\u0647\u06cc\u0645 \u06a9\u0631\u062f\u060c \u0628\u0647 \u0639\u0628\u0627\u0631\u062a \u062f\u06cc\u06af\u0631\u060c \u06cc\u06a9 \u062f\u0646\u06cc\u0627\u06cc \u0645\u0633\u062a\u0642\u0644 \u06a9\u0647 \u062d\u0627\u0644\u062a \u062e\u0635\u0648\u0635\u06cc \u0648 \u0645\u062d\u0627\u0633\u0628\u0627\u062a \u0622\u0646 \u062f\u0631 \u0627\u062a\u0631\u06cc\u0648\u0645 \u06a9\u0627\u0645\u0644\u0627\u064b \u0642\u0627\u0628\u0644 \u062a\u0623\u06cc\u06cc\u062f \u0627\u0633\u062a. \u0645\u0627 \u0627\u0632 MUD\u060c \u0645\u0648\u062a\u0648\u0631 \u062c\u0647\u0627\u0646 \u0647\u0627\u06cc \u062e\u0648\u062f\u0645\u062e\u062a\u0627\u0631\u060c \u0648 Circom\u060c \u067e\u0631\u06a9\u0627\u0631\u0628\u0631\u062f\u062a\u0631\u06cc\u0646 \u0632\u0628\u0627\u0646 \u0628\u0631\u0627\u06cc \u0645\u062f\u0627\u0631\u0647\u0627\u06cc ZK \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u062e\u0648\u0627\u0647\u06cc\u0645 \u06a9\u0631\u062f.<\/p>\n<p>\u0634\u0645\u0627 \u06cc\u0627\u062f \u062e\u0648\u0627\u0647\u06cc\u062f \u06af\u0631\u0641\u062a \u06a9\u0647:<\/p>\n<p>\u0632\u0628\u0627\u0646 Circom \u0631\u0627 \u0628\u0627 \u0686\u0627\u0631\u0686\u0648\u0628 MUD \u062a\u0631\u06a9\u06cc\u0628 \u06a9\u0646\u06cc\u062f<br \/>\n\u06cc\u06a9 \u062f\u0646\u06cc\u0627\u06cc \u0645\u0633\u062a\u0642\u0644 \u0628\u0627 \u0645\u062d\u0627\u0633\u0628\u0627\u062a \u0648 \u0645\u062a\u063a\u06cc\u0631\u0647\u0627\u06cc \u062e\u0635\u0648\u0635\u06cc \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f<br \/>\n\u0627\u062b\u0628\u0627\u062a \u0647\u0627\u06cc zk-SNARK \u0631\u0627 \u0645\u0633\u062a\u0642\u06cc\u0645\u0627\u064b \u0627\u0632 \u0645\u0631\u0648\u0631\u06af\u0631 \u062e\u0648\u062f \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Snark.js \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f<\/p>\n<p>  \u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<p>  \u0628\u0627\u0632\u06cc<\/p>\n<p>\u062f\u0631 \u0634\u0631\u0648\u0639 \u0628\u0627\u0632\u06cc\u060c \u0647\u0631 \u0628\u0627\u0632\u06cc\u06a9\u0646 4 \u0648\u0627\u062d\u062f \u062a\u0648\u0644\u06cc\u062f \u0645\u06cc \u06a9\u0646\u062f \u06a9\u0647 \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u062f\u0631 \u0646\u0642\u0634\u0647 \u062d\u0631\u06a9\u062a \u06a9\u0646\u062f. \u0647\u0631 \u0648\u0627\u062d\u062f \u0627\u0632 \u0646\u0648\u0639 \u0645\u062a\u0641\u0627\u0648\u062a\u06cc \u0627\u0633\u062a\u060c \u0627\u0645\u0627 \u0627\u06cc\u0646 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u062e\u0635\u0648\u0635\u06cc \u0627\u0633\u062a \u0648 \u0641\u0642\u0637 \u0628\u0631\u0627\u06cc \u0635\u0627\u062d\u0628 \u0648\u0627\u062d\u062f\u0647\u0627 \u0642\u0627\u0628\u0644 \u0645\u0634\u0627\u0647\u062f\u0647 \u0627\u0633\u062a.<\/p>\n<p>\ud83d\udc09 \u06a9\u0647 \ud83e\uddd9 \u0631\u0627 \u0645\u06cc \u0632\u0646\u062f \u06a9\u0647 \ud83e\uddcc \u0631\u0627 \u0645\u06cc \u0632\u0646\u062f \u06a9\u0647 \ud83d\udde1\ufe0f \u0631\u0627 \u0645\u06cc \u0632\u0646\u062f. \u0627\u0645\u0627 \ud83d\udde1\ufe0f \u06cc\u06a9 \u0648\u0627\u062d\u062f \u0648\u06cc\u0698\u0647 \u0627\u0633\u062a \u0632\u06cc\u0631\u0627 \u062a\u0646\u0647\u0627 \u0648\u0627\u062d\u062f\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \ud83d\udc09 \u0631\u0627 \u0634\u06a9\u0633\u062a \u062f\u0647\u062f<\/p>\n<p>\u0686\u0647\u0627\u0631 \u0646\u0648\u0639 \u062a\u0639\u0631\u06cc\u0641 \u0634\u062f\u0647 \u062f\u0631 \u0628\u0627\u0632\u06cc \u0639\u0628\u0627\u0631\u062a\u0646\u062f \u0627\u0632 \ud83d\udc09\u060c \u06a9\u0647 \ud83e\uddd9 \u0631\u0627 \u0634\u06a9\u0633\u062a \u0645\u06cc \u062f\u0647\u062f\u060c \u06a9\u0647 \ud83e\uddcc \u0631\u0627 \u0634\u06a9\u0633\u062a \u0645\u06cc \u062f\u0647\u062f\u060c \u06a9\u0647 \ud83d\udde1\ufe0f \u0631\u0627 \u0634\u06a9\u0633\u062a \u0645\u06cc \u062f\u0647\u062f. \u0628\u0627 \u0627\u06cc\u0646 \u062d\u0627\u0644\u060c \ud83d\udde1\ufe0f \u06cc\u06a9 \u0648\u0627\u062d\u062f \u0648\u06cc\u0698\u0647 \u0627\u0633\u062a \u0632\u06cc\u0631\u0627 \u062a\u0646\u0647\u0627 \u0648\u0627\u062d\u062f\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \ud83d\udc09 \u0631\u0627 \u0634\u06a9\u0633\u062a \u062f\u0647\u062f. \u0646\u0628\u0631\u062f\u0647\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u06cc\u06a9 zk-SNARK \u0627\u0646\u062c\u0627\u0645 \u0645\u06cc \u0634\u0648\u062f \u06a9\u0647 \u0646\u0648\u0639 \u0645\u0647\u0627\u062c\u0645 \u0631\u0627 \u0646\u0634\u0627\u0646 \u0645\u06cc \u062f\u0647\u062f \u0648 \u0628\u0647 \u062f\u0646\u0628\u0627\u0644 \u0622\u0646 zk-SNARK \u062f\u06cc\u06af\u0631\u06cc \u06a9\u0647 \u0646\u062a\u06cc\u062c\u0647 \u0646\u0628\u0631\u062f \u0631\u0627 \u0628\u062f\u0648\u0646 \u0645\u0634\u062e\u0635 \u06a9\u0631\u062f\u0646 \u0646\u0648\u0639 \u0648\u0627\u062d\u062f \u0645\u0648\u0631\u062f \u062d\u0645\u0644\u0647 \u0645\u062d\u0627\u0633\u0628\u0647 \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p>\u0645\u0639\u0645\u0627\u0631\u06cc \u0628\u0627\u0632\u06cc \u062a\u0645\u0627\u0645 \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u0639\u0645\u0648\u0645\u06cc \u0648 \u0645\u0646\u0637\u0642 \u0631\u0627 \u062f\u0631 MUD \u0642\u0631\u0627\u0631 \u0645\u06cc \u062f\u0647\u062f\u060c \u062f\u0631 \u062d\u0627\u0644\u06cc \u06a9\u0647 \u062a\u0645\u0627\u0645 \u062c\u0646\u0628\u0647 \u0647\u0627\u06cc \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 \u062d\u0631\u06cc\u0645 \u062e\u0635\u0648\u0635\u06cc \u062f\u0631 Circom \u0645\u062f\u06cc\u0631\u06cc\u062a \u0645\u06cc \u0634\u0648\u0646\u062f.<\/p>\n<p>  \u06cc\u06a9 \u067e\u0631\u0648\u0698\u0647 MUD \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f<\/p>\n<p>pnpm create mud@latest tutorial<br \/>\ncd tutorial<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>  1. \u062f\u0648\u0644\u062a \u0631\u0627 \u062a\u0639\u0631\u06cc\u0641 \u06a9\u0646\u06cc\u062f<\/p>\n<p>\u0645\u0648\u0642\u0639\u06cc\u062a \u0634\u062e\u0635\u06cc\u062a\u200c\u0647\u0627 \u062f\u0631 \u062c\u062f\u0627\u0648\u0644 MUD \u062a\u0639\u0631\u06cc\u0641 \u0634\u062f\u0647\u060c \u0639\u0645\u0648\u0645\u06cc \u0646\u06af\u0647 \u062f\u0627\u0634\u062a\u0647 \u0645\u06cc\u200c\u0634\u0648\u0646\u062f. \u0639\u0644\u0627\u0648\u0647 \u0628\u0631 \u0627\u06cc\u0646\u060c \u0645\u0642\u062f\u0627\u0631\u06cc ZK \u0627\u0636\u0627\u0641\u0647 \u0645\u06cc \u06a9\u0646\u06cc\u0645 commitments \u0628\u0631\u0627\u06cc \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u0627\u0632 \u0627\u06cc\u0646\u06a9\u0647 \u0647\u06cc\u0686 \u06a9\u0633 \u0646\u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u062a\u0642\u0644\u0628 \u06a9\u0646\u062f\u060c \u0627\u06cc\u0646 \u0628\u062e\u0634 \u062f\u0631 \u0628\u062e\u0634 ZK \u0622\u06cc\u0646\u062f\u0647 \u0645\u0639\u0646\u06cc \u0628\u06cc\u0634\u062a\u0631\u06cc \u062e\u0648\u0627\u0647\u062f \u062f\u0627\u0634\u062a.<\/p>\n<p>packages\/contracts\/mud.config.ts<\/p>\n<p>import { defineWorld } from &#8220;@latticexyz\/world&#8221;;<\/p>\n<p>export default defineWorld({<br \/>\n  namespace: &#8220;app&#8221;,<br \/>\n  enums: {<br \/>\n    Direction: [<br \/>\n      &#8220;Up&#8221;,<br \/>\n      &#8220;Down&#8221;,<br \/>\n      &#8220;Left&#8221;,<br \/>\n      &#8220;Right&#8221;<br \/>\n    ]\n  },<br \/>\n  tables: {<br \/>\n    Character: {<br \/>\n      schema: {<br \/>\n        x: &#8220;int32&#8221;,<br \/>\n        y: &#8220;int32&#8221;,<br \/>\n        owner: &#8220;address&#8221;,<br \/>\n        id: &#8220;uint32&#8221;,<br \/>\n        attackedAt: &#8220;uint32&#8221;,<br \/>\n        attackedByValue: &#8220;uint32&#8221;,<br \/>\n        revealedValue: &#8220;uint32&#8221;,<br \/>\n        isDead: &#8220;bool&#8221;,<br \/>\n      },<br \/>\n      key: [&#8220;x&#8221;, &#8220;y&#8221;]\n    },<br \/>\n    PlayerPrivateState: {<br \/>\n      schema: {<br \/>\n        account: &#8220;address&#8221;,<br \/>\n        commitment: &#8220;uint256&#8221;,<br \/>\n      },<br \/>\n      key: [&#8220;account&#8221;]\n    },<br \/>\n    VerifierContracts: {<br \/>\n      schema: {<br \/>\n        revealContractAddress: &#8220;address&#8221;,<br \/>\n        defendContractAddress: &#8220;address&#8221;<br \/>\n      },<br \/>\n      key: [],<br \/>\n    },<br \/>\n  },<br \/>\n});<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>  2. \u0645\u062f\u0627\u0631\u0647\u0627\u06cc \u0631\u0632\u0645\u06cc \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f<\/p>\n<p>\u0645\u062f\u0627\u0631\u0647\u0627\u06cc \u0646\u0628\u0631\u062f \u0634\u0627\u0645\u0644 SNARK \u062d\u0645\u0644\u0647 \u0648 SNARK \u062f\u0641\u0627\u0639\u06cc \u0627\u0633\u062a.<\/p>\n<p>  \u0627\u0644\u0641 \u0628\u0647 SNARK \u062d\u0645\u0644\u0647 \u06a9\u0646\u06cc\u062f<\/p>\n<p>\u0648\u0642\u062a\u06cc \u06cc\u06a9 \u0634\u062e\u0635\u06cc\u062a \u062d\u0645\u0644\u0647 \u0645\u06cc \u06a9\u0646\u062f\u060c \u0646\u0648\u0639 \u062e\u0648\u062f \u0631\u0627 \u0622\u0634\u06a9\u0627\u0631 \u0645\u06cc \u06a9\u0646\u062f. \u0628\u0631\u0627\u06cc \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u0627\u0632 \u0627\u06cc\u0646\u06a9\u0647 \u0628\u0627\u0632\u06cc\u06a9\u0646 \u062a\u0642\u0644\u0628 \u0646\u0645\u06cc \u06a9\u0646\u062f\u060c \u06cc\u06a9 SNARK \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc \u06a9\u0646\u06cc\u0645 \u06a9\u0647 \u0627\u0646\u0648\u0627\u0639 \u0627\u0648\u0644\u06cc\u0647 \u062a\u0639\u0631\u06cc\u0641 \u0634\u062f\u0647 \u062a\u0648\u0633\u0637 \u0628\u0627\u0632\u06cc\u06a9\u0646 \u062f\u0631 \u0634\u0631\u0648\u0639 \u0628\u0627\u0632\u06cc \u0631\u0627 \u0647\u0634 \u0645\u06cc \u06a9\u0646\u062f. \u0645\u062f\u0627\u0631 \u062a\u0636\u0645\u06cc\u0646 \u0645\u06cc \u06a9\u0646\u062f \u06a9\u0647 \u0628\u0627\u0632\u06cc\u06a9\u0646 \u06cc\u06a9 \u06a9\u0627\u0631\u0627\u06a9\u062a\u0631 \u0627\u0632 \u0647\u0631 \u0646\u0648\u0639 \u0631\u0627 \u0627\u062e\u062a\u0635\u0627\u0635 \u062f\u0627\u062f\u0647 \u0627\u0633\u062a \u0648 \u0633\u067e\u0633 \u0647\u0645\u0647 \u0686\u06cc\u0632 \u0628\u0627 a \u0647\u0634 \u0645\u06cc \u0634\u0648\u062f privateSalt\u060c \u06a9\u0647 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u06cc\u06a9 \u06a9\u0644\u06cc\u062f \u062e\u0635\u0648\u0635\u06cc \u0639\u0645\u0644 \u0645\u06cc \u06a9\u0646\u062f \u0648 \u0627\u0632 \u062d\u0645\u0644\u0627\u062a brute-force \u062c\u0644\u0648\u06af\u06cc\u0631\u06cc \u0645\u06cc \u06a9\u0646\u062f \u062a\u0627 \u0648\u0636\u0639\u06cc\u062a \u0627\u0648\u0644\u06cc\u0647 \u0627\u06cc \u06a9\u0647 \u0628\u0627\u0632\u06cc\u06a9\u0646 \u0628\u0647 \u0622\u0646 \u0645\u062a\u0639\u0647\u062f \u0634\u062f\u0647 \u0627\u0633\u062a \u0631\u0627 \u0622\u0634\u06a9\u0627\u0631 \u06a9\u0646\u062f. \u0627\u06cc\u0646 \u0647\u0634 a \u0646\u0627\u0645\u06cc\u062f\u0647 \u0645\u06cc \u0634\u0648\u062f commitment\u060c \u06a9\u0647 \u062f\u0631 \u06cc\u06a9 \u062c\u062f\u0648\u0644 MUD \u0630\u062e\u06cc\u0631\u0647 \u0645\u06cc \u0634\u0648\u062f \u06a9\u0647 \u0628\u0647 \u062a\u0623\u06cc\u06cc\u062f \u0627\u06cc\u0646\u06a9\u0647 \u0647\u0645\u0647 \u0686\u06cc\u0632 \u0628\u0647 \u062f\u0631\u0633\u062a\u06cc \u0627\u062a\u0641\u0627\u0642 \u0627\u0641\u062a\u0627\u062f\u0647 \u0627\u0633\u062a \u06a9\u0645\u06a9 \u0645\u06cc \u06a9\u0646\u062f. \u062c\u0632\u0626\u06cc\u0627\u062a \u0628\u06cc\u0634\u062a\u0631 \u062f\u0631 \u0627\u06cc\u0646 \u0645\u0648\u0631\u062f \u062f\u0631 \u0628\u062e\u0634 \u0642\u0631\u0627\u0631\u062f\u0627\u062f\u0647\u0627\u06cc \u0632\u06cc\u0631 \u067e\u0648\u0634\u0634 \u062f\u0627\u062f\u0647 \u062e\u0648\u0627\u0647\u062f \u0634\u062f.<\/p>\n<p>packages\/zk\/circuits\/reveal\/reveal.circom<\/p>\n<p>pragma circom 2.0.0;<\/p>\n<p>include &#8220;..\/circomlib\/circuits\/poseidon.circom&#8221;;<br \/>\ninclude &#8220;..\/circomlib\/circuits\/comparators.circom&#8221;;<\/p>\n<p>template spawn() {<br \/>\n    \/\/ Input signals<br \/>\n    signal input character1;<br \/>\n    signal input character2;<br \/>\n    signal input character3;<br \/>\n    signal input character4;<br \/>\n    signal input privateSalt;<br \/>\n    signal input characterReveal; \/\/ The character index to reveal (1, 2, 3, or 4)<br \/>\n    signal input valueReveal; \/\/ The value that is claimed to be assigned to the character<\/p>\n<p>    \/\/ Output signal for the hash<br \/>\n    signal output hash;<\/p>\n<p>    \/\/ Poseidon hash calculation<br \/>\n    component poseidonComponent = Poseidon(5);<br \/>\n    poseidonComponent.inputs[0]  character1;<br \/>\n    poseidonComponent.inputs[1]  character2;<br \/>\n    poseidonComponent.inputs[2]  character3;<br \/>\n    poseidonComponent.inputs[3]  character4;<br \/>\n    poseidonComponent.inputs[4]  privateSalt;<br \/>\n    hash  poseidonComponent.out;<\/p>\n<p>    \/\/ Comparator components for character reveal verification<br \/>\n    component isChar1 = IsEqual();<br \/>\n    component isChar2 = IsEqual();<br \/>\n    component isChar3 = IsEqual();<br \/>\n    component isChar4 = IsEqual();<br \/>\n    isChar1.in[0]  characterReveal;<br \/>\n    isChar1.in[1]  1;<br \/>\n    isChar2.in[0]  characterReveal;<br \/>\n    isChar2.in[1]  2;<br \/>\n    isChar3.in[0]  characterReveal;<br \/>\n    isChar3.in[1]  3;<br \/>\n    isChar4.in[0]  characterReveal;<br \/>\n    isChar4.in[1]  4;<\/p>\n<p>    \/\/ Value check depending on the revealed character<br \/>\n    component checkChar1 = IsEqual();<br \/>\n    component checkChar2 = IsEqual();<br \/>\n    component checkChar3 = IsEqual();<br \/>\n    component checkChar4 = IsEqual();<\/p>\n<p>    checkChar1.in[0]  isChar1.out * character1 + (1 &#8211; isChar1.out) * 0;<br \/>\n    checkChar1.in[1]  valueReveal;<\/p>\n<p>    checkChar2.in[0]  isChar2.out * character2 + (1 &#8211; isChar2.out) * 0;<br \/>\n    checkChar2.in[1]  valueReveal;<\/p>\n<p>    checkChar3.in[0]  isChar3.out * character3 + (1 &#8211; isChar3.out) * 0;<br \/>\n    checkChar3.in[1]  valueReveal;<\/p>\n<p>    checkChar4.in[0]  isChar4.out * character4 + (1 &#8211; isChar4.out) * 0;<br \/>\n    checkChar4.in[1]  valueReveal;<\/p>\n<p>    signal validReveal1;<br \/>\n    signal validReveal2;<br \/>\n    signal validReveal3;<br \/>\n    signal validReveal4;<\/p>\n<p>    validReveal1  checkChar1.out;<br \/>\n    validReveal2  checkChar2.out;<br \/>\n    validReveal3  checkChar3.out;<br \/>\n    validReveal4  checkChar4.out;<\/p>\n<p>    signal validReveal  validReveal1 + validReveal2 + validReveal3 + validReveal4;<br \/>\n    validReveal === 1;<\/p>\n<p>    \/\/ Comparators to check for presence of values 1, 2, 3, 4<br \/>\n    component isOne1 = IsEqual();<br \/>\n    component isOne2 = IsEqual();<br \/>\n    component isOne3 = IsEqual();<br \/>\n    component isOne4 = IsEqual();<br \/>\n    isOne1.in[0]  character1;<br \/>\n    isOne1.in[1]  1;<br \/>\n    isOne2.in[0]  character2;<br \/>\n    isOne2.in[1]  1;<br \/>\n    isOne3.in[0]  character3;<br \/>\n    isOne3.in[1]  1;<br \/>\n    isOne4.in[0]  character4;<br \/>\n    isOne4.in[1]  1;<br \/>\n    signal oneExists  isOne1.out + isOne2.out + isOne3.out + isOne4.out;<br \/>\n    oneExists === 1;<\/p>\n<p>    component isTwo1 = IsEqual();<br \/>\n    component isTwo2 = IsEqual();<br \/>\n    component isTwo3 = IsEqual();<br \/>\n    component isTwo4 = IsEqual();<br \/>\n    isTwo1.in[0]  character1;<br \/>\n    isTwo1.in[1]  2;<br \/>\n    isTwo2.in[0]  character2;<br \/>\n    isTwo2.in[1]  2;<br \/>\n    isTwo3.in[0]  character3;<br \/>\n    isTwo3.in[1]  2;<br \/>\n    isTwo4.in[0]  character4;<br \/>\n    isTwo4.in[1]  2;<br \/>\n    signal twoExists  isTwo1.out + isTwo2.out + isTwo3.out + isTwo4.out;<br \/>\n    twoExists === 1;<\/p>\n<p>    component isThree1 = IsEqual();<br \/>\n    component isThree2 = IsEqual();<br \/>\n    component isThree3 = IsEqual();<br \/>\n    component isThree4 = IsEqual();<br \/>\n    isThree1.in[0]  character1;<br \/>\n    isThree1.in[1]  3;<br \/>\n    isThree2.in[0]  character2;<br \/>\n    isThree2.in[1]  3;<br \/>\n    isThree3.in[0]  character3;<br \/>\n    isThree3.in[1]  3;<br \/>\n    isThree4.in[0]  character4;<br \/>\n    isThree4.in[1]  3;<br \/>\n    signal threeExists  isThree1.out + isThree2.out + isThree3.out + isThree4.out;<br \/>\n    threeExists === 1;<\/p>\n<p>    component isFour1 = IsEqual();<br \/>\n    component isFour2 = IsEqual();<br \/>\n    component isFour3 = IsEqual();<br \/>\n    component isFour4 = IsEqual();<br \/>\n    isFour1.in[0]  character1;<br \/>\n    isFour1.in[1]  4;<br \/>\n    isFour2.in[0]  character2;<br \/>\n    isFour2.in[1]  4;<br \/>\n    isFour3.in[0]  character3;<br \/>\n    isFour3.in[1]  4;<br \/>\n    isFour4.in[0]  character4;<br \/>\n    isFour4.in[1]  4;<br \/>\n    signal fourExists  isFour1.out + isFour2.out + isFour3.out + isFour4.out;<br \/>\n    fourExists === 1;<br \/>\n}<\/p>\n<p>component main {public [characterReveal, valueReveal]} = spawn();<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>  \u0628 SNARK \u062f\u0641\u0627\u0639\u06cc<\/p>\n<p>\u0647\u0646\u06af\u0627\u0645\u06cc \u06a9\u0647 \u06cc\u06a9 \u0634\u062e\u0635\u06cc\u062a \u0645\u0648\u0631\u062f \u062d\u0645\u0644\u0647 \u0642\u0631\u0627\u0631 \u0645\u06cc \u06af\u06cc\u0631\u062f\u060c \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a\u06cc \u0645\u06cc \u0634\u0648\u062f \u06a9\u0647 \u0646\u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u062d\u0631\u06a9\u062a \u06a9\u0646\u062f \u06cc\u0627 \u062d\u0645\u0644\u0647 \u06a9\u0646\u062f. \u0628\u0631\u0627\u06cc \u062e\u0631\u0648\u062c \u0627\u0632 \u0627\u06cc\u0646 \u062d\u0627\u0644\u062a\u060c \u0634\u062e\u0635\u06cc\u062a \u0628\u0627\u06cc\u062f \u06cc\u06a9 SNARK \u0627\u0631\u0627\u0626\u0647 \u06a9\u0646\u062f \u06a9\u0647 \u062b\u0627\u0628\u062a \u06a9\u0646\u062f \u062f\u0641\u0627\u0639\u0634 \u0645\u0648\u0641\u0642 \u0628\u0648\u062f\u0647 \u0627\u0633\u062a \u0628\u062f\u0648\u0646 \u0627\u06cc\u0646\u06a9\u0647 \u0646\u0648\u0639 \u0622\u0646 \u0645\u0634\u062e\u0635 \u0634\u0648\u062f. \u0627\u06cc\u0646 \u0627\u0632 \u0637\u0631\u06cc\u0642 \u0645\u062f\u0627\u0631\u06cc \u0628\u0647 \u062f\u0633\u062a \u0645\u06cc \u0622\u06cc\u062f \u06a9\u0647 \u062f\u0641\u0627\u0639 \u0631\u0627 \u0628\u0631 \u0627\u0633\u0627\u0633 \u0646\u0648\u0639 \u0639\u0645\u0648\u0645\u06cc \u0645\u0647\u0627\u062c\u0645 \u0648 \u0646\u0648\u0639 \u062e\u0635\u0648\u0635\u06cc \u0645\u062f\u0627\u0641\u0639 \u062a\u0623\u06cc\u06cc\u062f \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p>packages\/zk\/circuits\/defend\/defend.circom<\/p>\n<p>pragma circom 2.0.0;<\/p>\n<p>include &#8220;..\/circomlib\/circuits\/poseidon.circom&#8221;;<br \/>\ninclude &#8220;..\/circomlib\/circuits\/comparators.circom&#8221;;<\/p>\n<p>template CharacterBattleCheck() {<br \/>\n    \/\/ Input signals<br \/>\n    signal input character1;<br \/>\n    signal input character2;<br \/>\n    signal input character3;<br \/>\n    signal input character4;<br \/>\n    signal input privateSalt;<br \/>\n    signal input characterTarget; \/\/ 1-based index: 1 for character1, 2 for character2, etc.<br \/>\n    signal input attackerLevel;<\/p>\n<p>    \/\/ Output signal for the hash<br \/>\n    signal output hash;<\/p>\n<p>    \/\/ Output signal for the battle result<br \/>\n    signal output battleResult;<\/p>\n<p>    \/\/ Poseidon hash calculation<br \/>\n    component poseidonComponent = Poseidon(5);<br \/>\n    poseidonComponent.inputs[0]  character1;<br \/>\n    poseidonComponent.inputs[1]  character2;<br \/>\n    poseidonComponent.inputs[2]  character3;<br \/>\n    poseidonComponent.inputs[3]  character4;<br \/>\n    poseidonComponent.inputs[4]  privateSalt;<br \/>\n    hash  poseidonComponent.out;<\/p>\n<p>    \/\/ Create binary indicators for each target<br \/>\n    signal isTarget1;<br \/>\n    signal isTarget2;<br \/>\n    signal isTarget3;<br \/>\n    signal isTarget4;<\/p>\n<p>    \/\/ Check if characterTarget matches 1, 2, 3, or 4<br \/>\n    component isTarget1Eq = IsEqual();<br \/>\n    isTarget1Eq.in[0]  characterTarget;<br \/>\n    isTarget1Eq.in[1]  1;<br \/>\n    isTarget1  isTarget1Eq.out;<\/p>\n<p>    component isTarget2Eq = IsEqual();<br \/>\n    isTarget2Eq.in[0]  characterTarget;<br \/>\n    isTarget2Eq.in[1]  2;<br \/>\n    isTarget2  isTarget2Eq.out;<\/p>\n<p>    component isTarget3Eq = IsEqual();<br \/>\n    isTarget3Eq.in[0]  characterTarget;<br \/>\n    isTarget3Eq.in[1]  3;<br \/>\n    isTarget3  isTarget3Eq.out;<\/p>\n<p>    component isTarget4Eq = IsEqual();<br \/>\n    isTarget4Eq.in[0]  characterTarget;<br \/>\n    isTarget4Eq.in[1]  4;<br \/>\n    isTarget4  isTarget4Eq.out;<\/p>\n<p>    \/\/ Ensure exactly one of the targets is selected<br \/>\n    signal sumTargets;<br \/>\n    sumTargets  isTarget1 + isTarget2 + isTarget3 + isTarget4;<br \/>\n    sumTargets === 1;<\/p>\n<p>    \/\/ Use separate variables to hold the selected character values<br \/>\n    signal selectedCharacter1;<br \/>\n    signal selectedCharacter2;<br \/>\n    signal selectedCharacter3;<br \/>\n    signal selectedCharacter4;<\/p>\n<p>    \/\/ Enforce that only one of the selectedCharacter variables holds the value<br \/>\n    selectedCharacter1  isTarget1 * character1;<br \/>\n    selectedCharacter2  isTarget2 * character2;<br \/>\n    selectedCharacter3  isTarget3 * character3;<br \/>\n    selectedCharacter4  isTarget4 * character4;<\/p>\n<p>    \/\/ Aggregate the selected character value<br \/>\n    signal selectedCharacter;<br \/>\n    selectedCharacter  selectedCharacter1 + selectedCharacter2 + selectedCharacter3 + selectedCharacter4;<\/p>\n<p>    \/\/ Compare attackerLevel and selectedCharacter<br \/>\n    component compareLevel = LessThan(4); \/\/ Assuming levels are within 4 bits (0-15)<br \/>\n    compareLevel.in[0]  selectedCharacter;<br \/>\n    compareLevel.in[1]  attackerLevel;<br \/>\n    signal attackerWinsNormal  compareLevel.out;<\/p>\n<p>    \/\/ Special rule: attackerLevel == 1 and selectedCharacter == 4<br \/>\n    component isAttackerLevelOneEq = IsEqual();<br \/>\n    isAttackerLevelOneEq.in[0]  attackerLevel;<br \/>\n    isAttackerLevelOneEq.in[1]  1;<br \/>\n    signal isAttackerLevelOne  isAttackerLevelOneEq.out;<\/p>\n<p>    component isCharacterTargetFourEq = IsEqual();<br \/>\n    isCharacterTargetFourEq.in[0]  selectedCharacter;<br \/>\n    isCharacterTargetFourEq.in[1]  4;<br \/>\n    signal isCharacterTargetFour  isCharacterTargetFourEq.out;<\/p>\n<p>    signal attackerWinsSpecial;<br \/>\n    attackerWinsSpecial  isAttackerLevelOne * isCharacterTargetFour;<\/p>\n<p>    \/\/ Determine if the attacker wins either normally or via special rule<br \/>\n    signal attackerWins;<br \/>\n    attackerWins  attackerWinsNormal + attackerWinsSpecial;<\/p>\n<p>    \/\/ Convert attackerWins to a binary value (0 or 1)<br \/>\n    signal isAttackerWins;<br \/>\n    signal zeroFlag;<br \/>\n    signal oneFlag;<\/p>\n<p>    \/\/ Determine zeroFlag: 1 if attackerWins == 0, else 0<br \/>\n    zeroFlag  attackerWins * (attackerWins &#8211; 1);<br \/>\n    oneFlag  1 &#8211; zeroFlag;<\/p>\n<p>    \/\/ isAttackerWins should be 1 if attackerWins &gt; 0, else 0<br \/>\n    isAttackerWins  attackerWins &#8211; zeroFlag;<\/p>\n<p>    \/\/ Calculate the battleResult: 1 if defender wins, 2 if attacker wins<br \/>\n    signal defenderWins;<br \/>\n    defenderWins  1 &#8211; isAttackerWins;<\/p>\n<p>    \/\/ Output battleResult: 1 if defender wins, 2 if attacker wins<br \/>\n    battleResult  1 + isAttackerWins;<\/p>\n<p>    log(battleResult);<br \/>\n}<\/p>\n<p>component main {public [characterTarget, attackerLevel]} = CharacterBattleCheck();<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0647\u0645\u0627\u0646\u0637\u0648\u0631 \u06a9\u0647 \u0645\u06cc \u0628\u06cc\u0646\u06cc\u062f\u060c \u0645\u0627 \u0627\u0632 \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 \u0647\u0627\u06cc Poseidon \u0648 \u0645\u0642\u0627\u06cc\u0633\u0647 \u06a9\u0646\u0646\u062f\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u06cc\u0645\u060c \u0622\u0646\u0647\u0627 \u0631\u0627 \u0646\u0635\u0628 \u06a9\u0646\u06cc\u062f.<\/p>\n<p>cd packages\/zk\/circuits<br \/>\ngit clone https:\/\/github.com\/iden3\/circomlib.git<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>  \u062c \u0642\u0631\u0627\u0631\u062f\u0627\u062f\u0647\u0627\u06cc \u062a\u0623\u06cc\u06cc\u062f \u06a9\u0646\u0646\u062f\u0647 \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f<\/p>\n<p>\u0648\u0627\u0631\u062f \u067e\u0648\u0634\u0647 \u0622\u0634\u06a9\u0627\u0631 \u0645\u062f\u0627\u0631 \u0634\u0648\u06cc\u062f.<\/p>\n<p>cd reveal<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0645\u062f\u0627\u0631 \u0631\u0627 \u06a9\u0627\u0645\u067e\u0627\u06cc\u0644 \u06a9\u0646\u06cc\u062f.<\/p>\n<p>circom reveal.circom &#8211;r1cs &#8211;wasm &#8211;sym<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0642\u0631\u0627\u0631\u062f\u0627\u062f groth16 \u0645\u0631\u0627\u0633\u0645 \u0648 \u062a\u0627\u06cc\u06cc\u062f \u06a9\u0646\u0646\u062f\u0647 \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f.<\/p>\n<p>snarkjs powersoftau new bn128 12 pot12_0000.ptau -v<br \/>\nsnarkjs powersoftau contribute pot12_0000.ptau pot12_0001.ptau &#8211;name=&#8221;First contribution&#8221; -v<br \/>\nsnarkjs powersoftau prepare phase2 pot12_0001.ptau pot12_final.ptau -v<br \/>\nsnarkjs groth16 setup reveal.r1cs pot12_final.ptau reveal_0000.zkey<br \/>\nsnarkjs zkey contribute reveal_0000.zkey reveal_0001.zkey &#8211;name=&#8221;1st Contributor Name&#8221; -v<br \/>\nsnarkjs zkey export verificationkey reveal_0001.zkey verification_key.json<br \/>\nsnarkjs zkey export solidityverifier reveal_0001.zkey ..\/..\/..\/contracts\/src\/RevealVerifier.sol<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0622\u0646 \u0631\u0627 \u062f\u0631 \u067e\u0648\u0634\u0647 \u0642\u0631\u0627\u0631\u062f\u0627\u062f MUD \u0642\u0631\u0627\u0631 \u062f\u0647\u06cc\u062f.<\/p>\n<p>mkdir ..\/..\/..\/client\/public\/zk_artifacts\/<br \/>\ncp reveal_js\/reveal.wasm ..\/..\/..\/client\/public\/zk_artifacts\/<br \/>\ncp reveal_0001.zkey ..\/..\/..\/client\/public\/zk_artifacts\/reveal_final.zkey<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u062d\u0627\u0644\u0627 \u0647\u0645\u06cc\u0646 \u06a9\u0627\u0631 \u0631\u0627 \u0628\u0627 \u0645\u062f\u0627\u0631 \u062f\u0641\u0627\u0639\u06cc \u0627\u0646\u062c\u0627\u0645 \u062f\u0647\u06cc\u062f.<\/p>\n<p>cd ..\/defend<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u06a9\u0627\u0645\u067e\u0627\u06cc\u0644.<\/p>\n<p>circom defend.circom &#8211;r1cs &#8211;wasm &#8211;sym<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0648 \u062a\u0627\u06cc\u06cc\u062f \u06a9\u0646\u0646\u062f\u0647 \u0631\u0627 \u062a\u0648\u0644\u06cc\u062f \u06a9\u0646\u06cc\u062f.<\/p>\n<p>snarkjs powersoftau new bn128 12 pot12_0000.ptau -v<br \/>\nsnarkjs powersoftau contribute pot12_0000.ptau pot12_0001.ptau &#8211;name=&#8221;First contribution&#8221; -v<br \/>\nsnarkjs powersoftau prepare phase2 pot12_0001.ptau pot12_final.ptau -v<br \/>\nsnarkjs groth16 setup defend.r1cs pot12_final.ptau defend_0000.zkey<br \/>\nsnarkjs zkey contribute defend_0000.zkey defend_0001.zkey &#8211;name=&#8221;1st Contributor Name&#8221; -v<br \/>\nsnarkjs zkey export verificationkey defend_0001.zkey verification_key.json<br \/>\nsnarkjs zkey export solidityverifier defend_0001.zkey ..\/..\/..\/contracts\/src\/DefendVerifier.sol<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0622\u0646 \u0631\u0627 \u062f\u0631 \u067e\u0648\u0634\u0647 \u0642\u0631\u0627\u0631\u062f\u0627\u062f\u0647\u0627 \u0642\u0631\u0627\u0631 \u062f\u0647\u06cc\u062f.<\/p>\n<p>mkdir ..\/..\/..\/client\/public\/zk_artifacts\/<br \/>\ncp defend_js\/defend.wasm ..\/..\/..\/client\/public\/zk_artifacts\/<br \/>\ncp defend_0001.zkey ..\/..\/..\/client\/public\/zk_artifacts\/defend_final.zkey<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0634\u0645\u0627 \u0647\u0645\u0686\u0646\u06cc\u0646 \u0628\u0627\u06cc\u062f \u0646\u0627\u0645 \u0639\u0645\u0648\u0645\u06cc \u0631\u0627 \u062a\u063a\u06cc\u06cc\u0631 \u062f\u0647\u06cc\u062f Groth16Verifier \u0628\u0647 RevealVerifier \u0648 DefendVerifier\u0628\u0647 \u062a\u0631\u062a\u06cc\u0628 \u062f\u0631 \u0642\u0631\u0627\u0631\u062f\u0627\u062f\u0647\u0627\u06cc\u06cc \u06a9\u0647 \u0627\u062e\u06cc\u0631\u0627\u064b \u062f\u0631 \u0622\u0646 \u0642\u0631\u0627\u0631 \u062f\u0627\u062f\u06cc\u0645 packages\/client\/public\/zk_artifacts\/.<\/p>\n<p>  3. \u0645\u0646\u0637\u0642 \u0628\u0627\u0632\u06cc<\/p>\n<p>\u0686\u0646\u062f \u0641\u0627\u06cc\u0644 \u0631\u0627 \u06a9\u0647 \u0627\u0632 \u0622\u0646\u0647\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0646\u062e\u0648\u0627\u0647\u06cc\u0645 \u06a9\u0631\u062f \u062d\u0630\u0641 \u06a9\u0646\u06cc\u062f.<\/p>\n<p>cd ..\/..\/..\/..\/<br \/>\nrm packages\/contracts\/src\/systems\/IncrementSystem.sol packages\/contracts\/test\/CounterTest.t.sol<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u062a\u0645\u0627\u0645 \u0645\u0646\u0637\u0642 \u0628\u0627\u0632\u06cc \u062f\u0631 Solidity \u062a\u0639\u0631\u06cc\u0641 \u0634\u062f\u0647 \u0627\u0633\u062a. \u0627\u06cc\u0646 \u0634\u0627\u0645\u0644 \u0645\u0631\u0627\u062d\u0644 \u0627\u0648\u0644\u06cc\u0647 \u062a\u062e\u0645 \u0631\u06cc\u0632\u06cc\u060c \u0628\u0647 \u062f\u0646\u0628\u0627\u0644 \u0622\u0646 \u0645\u0631\u062d\u0644\u0647 \u062d\u0645\u0644\u0647 \u0648 \u062f\u0641\u0627\u0639 \u0627\u0633\u062a \u06a9\u0647 \u0647\u0631 \u06a9\u062f\u0627\u0645 \u062f\u0627\u0631\u0627\u06cc \u0627\u062b\u0628\u0627\u062a ZK \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 \u062e\u0648\u062f \u0647\u0633\u062a\u0646\u062f. \u0627\u0644\u0641 \u0631\u0627 \u0646\u06cc\u0632 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0631\u062f\u06cc\u0645 killUnresponsiveCharacter \u0639\u0645\u0644\u06a9\u0631\u062f\u060c \u06a9\u0647 \u0627\u06af\u0631 \u0628\u0627\u0632\u06cc\u06a9\u0646\u06cc \u0646\u062a\u0648\u0627\u0646\u062f \u062f\u0631 \u06cc\u06a9 \u0632\u0645\u0627\u0646 \u0645\u0639\u06cc\u0646 \u0627\u062b\u0628\u0627\u062a ZK \u062f\u0641\u0627\u0639\u06cc \u062e\u0648\u062f \u0631\u0627 \u0627\u0631\u0627\u0626\u0647 \u06a9\u0646\u062f\u060c \u062d\u0630\u0641 \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p>packages\/contracts\/src\/systems\/MyGameSystem.sol<\/p>\n<p>\/\/ SPDX-License-Identifier: MIT<br \/>\npragma solidity &gt;=0.8.24;<\/p>\n<p>import { System } from &#8220;@latticexyz\/world\/src\/System.sol&#8221;;<br \/>\nimport { Character, CharacterData, VerifierContracts } from &#8220;..\/codegen\/index.sol&#8221;;<br \/>\nimport { PlayerPrivateState } from &#8220;..\/codegen\/index.sol&#8221;;<br \/>\nimport { Direction } from &#8220;..\/codegen\/common.sol&#8221;;<br \/>\nimport { getKeysWithValue } from &#8220;@latticexyz\/world-modules\/src\/modules\/keyswithvalue\/getKeysWithValue.sol&#8221;;<\/p>\n<p>import { EncodedLengths, EncodedLengthsLib } from &#8220;@latticexyz\/store\/src\/EncodedLengths.sol&#8221;;<\/p>\n<p>interface ICircomRevealVerifier {<br \/>\n    function verifyProof(uint[2] calldata _pA, uint[2][2] calldata _pB, uint[2] calldata _pC, uint[3] calldata _pubSignals) external view returns (bool);<br \/>\n}<\/p>\n<p>interface ICircomDefendVerifier {<br \/>\n    function verifyProof(uint[2] calldata _pA, uint[2][2] calldata _pB, uint[2] calldata _pC, uint[4] calldata _pubSignals) external view returns (bool);<br \/>\n}<\/p>\n<p>contract MyGameSystem is System {<br \/>\n  function spawn(int32 x, int32 y, uint256 commitment) public {<br \/>\n    \/\/require(PlayerPrivateState.getCommitment(_msgSender()) == 0, &#8220;Player already spawned&#8221;);<\/p>\n<p>    Character.set(x, y, _msgSender(), 1, 0, 0, 0, false);<br \/>\n    Character.set(x, y + 1, _msgSender(), 2, 0, 0, 0, false);<br \/>\n    Character.set(x, y + 2, _msgSender(), 3, 0, 0, 0, false);<br \/>\n    Character.set(x, y + 3, _msgSender(), 4, 0, 0, 0, false);<\/p>\n<p>    PlayerPrivateState.set(_msgSender(), commitment);<br \/>\n  }<\/p>\n<p>  function move(int32 characterAtX, int32 characterAtY, Direction direction) public {<br \/>\n    CharacterData memory character = Character.get(characterAtX, characterAtY);<\/p>\n<p>    \/\/require(!character.isDead, &#8220;Character is dead&#8221;);<br \/>\n    require(character.attackedAt == 0, &#8220;Character is under attack&#8221;);<br \/>\n    require(character.owner == _msgSender(), &#8220;Only owner&#8221;);<\/p>\n<p>    int32 x = characterAtX;<br \/>\n    int32 y = characterAtY;<\/p>\n<p>    if(direction == Direction.Up)<br \/>\n      y -= 1;<br \/>\n    if(direction == Direction.Down)<br \/>\n      y += 1;<br \/>\n    if(direction == Direction.Left)<br \/>\n      x -= 1;<br \/>\n    if(direction == Direction.Right)<br \/>\n      x += 1;<\/p>\n<p>    CharacterData memory characterAtDestination = Character.get(x, y);<br \/>\n    require(characterAtDestination.owner == address(0), &#8220;Destination is occupied&#8221;);<\/p>\n<p>    Character.deleteRecord(characterAtX, characterAtY);<br \/>\n    Character.set(x, y, _msgSender(), character.id, 0, 0, character.revealedValue, false);<br \/>\n  }<\/p>\n<p>  function attack(uint[2] calldata _pA, uint[2][2] calldata _pB, uint[2] calldata _pC, uint[3] calldata _pubSignals,<br \/>\n    int32 fromX, int32 fromY, int32 toX, int32 toY<br \/>\n  ) public {<br \/>\n    ICircomRevealVerifier(VerifierContracts.getRevealContractAddress()).verifyProof(_pA, _pB, _pC, _pubSignals);<br \/>\n    uint256 commitment = _pubSignals[0];<br \/>\n    uint256 characterReveal = _pubSignals[1];<br \/>\n    uint256 valueReveal = _pubSignals[2];<\/p>\n<p>    require(PlayerPrivateState.getCommitment(_msgSender()) == commitment, &#8220;Invalid commitment&#8221;);<br \/>\n    require(characterReveal == Character.getId(fromX, fromY), &#8220;Invalid attacker id&#8221;);<br \/>\n    require(Character.getOwner(fromX, fromY) == _msgSender(), &#8220;You&#8217;re not the planet owner&#8221;);<br \/>\n    Character.setRevealedValue(fromX, fromY, uint32(valueReveal));<br \/>\n    Character.setAttackedAt(toX, toY, uint32(block.timestamp));<br \/>\n    Character.setAttackedByValue(toX, toY, uint32(valueReveal));<br \/>\n  }<\/p>\n<p>  function defend(uint[2] calldata _pA, uint[2][2] calldata _pB, uint[2] calldata _pC, uint[4] calldata _pubSignals,<br \/>\n    int32 x, int32 y<br \/>\n  ) public {<br \/>\n    ICircomDefendVerifier(VerifierContracts.getDefendContractAddress()).verifyProof(_pA, _pB, _pC, _pubSignals);<\/p>\n<p>    uint256 commitment = _pubSignals[0];<br \/>\n    uint256 battleResult = _pubSignals[1];<br \/>\n    uint256 characterTarget = _pubSignals[2];<br \/>\n    uint256 attackerLevel = _pubSignals[3];<\/p>\n<p>    require(PlayerPrivateState.getCommitment(Character.getOwner(x, y)) == commitment, &#8220;Invalid commitment&#8221;);<br \/>\n    require(characterTarget == Character.getId(x, y), &#8220;Invalid character id&#8221;);<br \/>\n    require(attackerLevel == Character.getAttackedByValue(x, y), &#8220;Invalid attacked by value in proof&#8221;);<\/p>\n<p>    if(battleResult == 1) { \/\/ defense won<br \/>\n      Character.setAttackedAt(x, y, 0);<br \/>\n      Character.setAttackedByValue(x, y, 0);<br \/>\n    } else { \/\/ attack won<br \/>\n      Character.setIsDead(x, y, true);<br \/>\n    }<br \/>\n  }<\/p>\n<p>  function killUnresponsiveCharacter(int32 x, int32 y) public {<br \/>\n    uint32 attackedAt = Character.getAttackedAt(x, y);<br \/>\n    uint32 MAX_WAIT_TIME = 1 minutes;<br \/>\n    require(attackedAt&gt;0 &amp;&amp; (attackedAt &#8211; uint32(block.timestamp)) &gt;  MAX_WAIT_TIME, &#8220;Can kill character now&#8221;);<br \/>\n    Character.setIsDead(x, y, true);<br \/>\n  }<br \/>\n}<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0628\u0647 \u06cc\u0627\u062f \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f \u06a9\u0647 \u062f\u0631 MUD\u060c \u0645\u0627 \u0627\u0632 \u0633\u0627\u0632\u0646\u062f\u0647 \u0647\u0627\u06cc \u0633\u0646\u062a\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0646\u0645\u06cc \u06a9\u0646\u06cc\u0645. \u0627\u06cc\u0646 \u0628\u0647 \u0627\u06cc\u0646 \u062f\u0644\u06cc\u0644 \u0627\u0633\u062a \u06a9\u0647 \u06cc\u06a9 \u0645\u062c\u0631\u062f System \u0642\u0631\u0627\u0631\u062f\u0627\u062f \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u0648\u0636\u0639\u06cc\u062a \u062c\u0647\u0627\u0646 \u0647\u0627\u06cc \u0645\u062a\u0639\u062f\u062f \u0631\u0627 \u0645\u062f\u06cc\u0631\u06cc\u062a \u06a9\u0646\u062f. \u062f\u0631 \u0639\u0648\u0636\u060c \u0645\u0627 \u0627\u0632 PostDeploy \u0642\u0631\u0627\u0631\u062f\u0627\u062f\u060c \u062c\u0627\u06cc\u06cc \u06a9\u0647 \u0645\u0627 \u0642\u0631\u0627\u0631\u062f\u0627\u062f\u0647\u0627\u06cc \u062a\u0623\u06cc\u06cc\u062f \u06a9\u0646\u0646\u062f\u0647 \u0631\u0627 \u0645\u0633\u062a\u0642\u0631 \u0645\u06cc \u06a9\u0646\u06cc\u0645.<\/p>\n<p>packages\/contracts\/script\/PostDeploy.s.sol<\/p>\n<p>\/\/ SPDX-License-Identifier: MIT<br \/>\npragma solidity &gt;=0.8.24;<\/p>\n<p>import { Script } from &#8220;forge-std\/Script.sol&#8221;;<br \/>\nimport { console } from &#8220;forge-std\/console.sol&#8221;;<br \/>\nimport { StoreSwitch } from &#8220;@latticexyz\/store\/src\/StoreSwitch.sol&#8221;;<\/p>\n<p>import { RevealVerifier } from &#8220;..\/src\/RevealVerifier.sol&#8221;;<br \/>\nimport { DefendVerifier } from &#8220;..\/src\/DefendVerifier.sol&#8221;;<\/p>\n<p>import { IWorld } from &#8220;..\/src\/codegen\/world\/IWorld.sol&#8221;;<\/p>\n<p>import { VerifierContracts } from &#8220;..\/src\/codegen\/index.sol&#8221;;<\/p>\n<p>contract PostDeploy is Script {<br \/>\n  function run(address worldAddress) external {<br \/>\n    \/\/ Specify a store so that you can use tables directly in PostDeploy<br \/>\n    StoreSwitch.setStoreAddress(worldAddress);<\/p>\n<p>    \/\/ Load the private key from the `PRIVATE_KEY` environment variable (in .env)<br \/>\n    uint256 deployerPrivateKey = vm.envUint(&#8220;PRIVATE_KEY&#8221;);<\/p>\n<p>    \/\/ Start broadcasting transactions from the deployer account<br \/>\n    vm.startBroadcast(deployerPrivateKey);<\/p>\n<p>    address revealVerifier = address(new RevealVerifier());<br \/>\n    VerifierContracts.setRevealContractAddress(revealVerifier);<\/p>\n<p>    address defendVerifier = address(new DefendVerifier());<br \/>\n    VerifierContracts.setDefendContractAddress(defendVerifier);<\/p>\n<p>    vm.stopBroadcast();<br \/>\n  }<br \/>\n}<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>  4. \u0645\u0634\u062a\u0631\u06cc \u0628\u0627 Phaser + Snarkjs<\/p>\n<p>\u0641\u0627\u06cc\u0644\u06cc \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f \u06a9\u0647 \u0645\u0646\u0637\u0642 \u0631\u0627\u0628\u0637 \u06a9\u0627\u0631\u0628\u0631\u06cc \u0631\u0627 \u0645\u062f\u06cc\u0631\u06cc\u062a \u06a9\u0646\u062f. \u0627\u06cc\u0646 \u0641\u0627\u06cc\u0644 \u0627\u0639\u0645\u0627\u0644 \u0645\u0627\u0648\u0633 \u0631\u0627 \u0628\u0631\u0627\u06cc \u06a9\u0634\u06cc\u062f\u0646 \u0628\u0647 \u062d\u0631\u06a9\u062a\u060c \u0627\u062a\u0635\u0627\u0644 \u062f\u0648 \u06a9\u0627\u0631\u0627\u06a9\u062a\u0631 \u0628\u0647 \u062d\u0645\u0644\u0647 \u0648 \u06a9\u0644\u06cc\u06a9 \u06a9\u0631\u062f\u0646 \u0628\u0631\u0627\u06cc \u062f\u0641\u0627\u0639 \u0631\u0627 \u0645\u062f\u06cc\u0631\u06cc\u062a \u0645\u06cc \u06a9\u0646\u062f. \u0639\u0644\u0627\u0648\u0647 \u0628\u0631 \u0627\u06cc\u0646\u060c \u0645\u0646\u0637\u0642 \u0627\u0646\u06cc\u0645\u06cc\u0634\u0646 \u0647\u0627 \u0631\u0627 \u062a\u0639\u0631\u06cc\u0641 \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p>packages\/client\/src\/layers\/phaser\/systems\/myGameSystem.ts<\/p>\n<p>import { Has, defineEnterSystem, defineExitSystem, defineSystem, getComponentValueStrict, getComponentValue } from &#8220;@latticexyz\/recs&#8221;;<br \/>\nimport { PhaserLayer } from &#8220;..\/createPhaserLayer&#8221;;<br \/>\nimport {<br \/>\n  pixelCoordToTileCoord,<br \/>\n  tileCoordToPixelCoord<br \/>\n} from &#8220;@latticexyz\/phaserx&#8221;;<br \/>\nimport { TILE_WIDTH, TILE_HEIGHT, Animations, Directions } from &#8220;..\/constants&#8221;;<\/p>\n<p>function decodePosition(hexString) {<br \/>\n    if (hexString.startsWith(&#8216;0x&#8217;)) {<br \/>\n        hexString = hexString.slice(2);<br \/>\n    }<\/p>\n<p>    const halfLength = hexString.length \/ 2;<br \/>\n    const firstHalfHex = hexString.slice(0, halfLength);<br \/>\n    const secondHalfHex = hexString.slice(halfLength);<\/p>\n<p>    const firstHalfInt32 = getSignedInt32(firstHalfHex);<br \/>\n    const secondHalfInt32 = getSignedInt32(secondHalfHex);<\/p>\n<p>    return { x: firstHalfInt32, y: secondHalfInt32 };<br \/>\n}<\/p>\n<p>function getSignedInt32(hexStr) {<br \/>\n    const int32Value = parseInt(hexStr.slice(-8), 16);<\/p>\n<p>    if (int32Value &gt; 0x7FFFFFFF) {<br \/>\n        return int32Value &#8211; 0x100000000;<br \/>\n    }<br \/>\n    return int32Value;<br \/>\n}<\/p>\n<p>function encodePosition(x: number, y: number): string {<br \/>\n    const xHex = int256ToHex(x);<br \/>\n    const yHex = int256ToHex(y);<\/p>\n<p>    \/\/ Concatenate the two 32-byte hex values to form a 64-byte hex string<br \/>\n    return &#8216;0x&#8217; + xHex + yHex;<br \/>\n}<\/p>\n<p>function int256ToHex(value: number): string {<br \/>\n    \/\/ If the value is negative, convert it to a 256-bit unsigned integer<br \/>\n    if (value  0) {<br \/>\n        value = BigInt(&#8216;0x10000000000000000000000000000000000000000000000000000000000000000&#8217;) + BigInt(value);<br \/>\n    } else {<br \/>\n        value = BigInt(value);<br \/>\n    }<\/p>\n<p>    \/\/ Convert the integer to a hexadecimal string, ensuring it has 64 characters (256 bits)<br \/>\n    let hexStr = value.toString(16);<br \/>\n    while (hexStr.length  64) {<br \/>\n        hexStr = &#8216;0&#8217; + hexStr;<br \/>\n    }<\/p>\n<p>    return hexStr;<br \/>\n}<\/p>\n<p>export const createMyGameSystem = (layer: PhaserLayer) =&gt; {<br \/>\n  const {<br \/>\n    world,<br \/>\n    networkLayer: {<br \/>\n      components: { Character },<br \/>\n      systemCalls: { spawn, move, attack, defend, playerEntity }<br \/>\n    },<br \/>\n    scenes: {<br \/>\n        Main: { objectPool, input }<br \/>\n    }<br \/>\n  } = layer;<\/p>\n<p>  let startPoint: { x: number; y: number } | null = null;<br \/>\n  let draggedEntity: string | null = null;<\/p>\n<p>  let playerRectangle1 = objectPool.get(&#8220;PlayerRectangle1&#8221;, &#8220;Rectangle&#8221;);<br \/>\n  let playerRectangle2 = objectPool.get(&#8220;PlayerRectangle2&#8221;, &#8220;Rectangle&#8221;);<br \/>\n  let playerRectangle3 = objectPool.get(&#8220;PlayerRectangle3&#8221;, &#8220;Rectangle&#8221;);<br \/>\n  let playerRectangle4 = objectPool.get(&#8220;PlayerRectangle4&#8221;, &#8220;Rectangle&#8221;);<br \/>\n  let arrowLine1 = objectPool.get(&#8220;ArrowLine1&#8221;, &#8220;Line&#8221;);<br \/>\n  let arrowLine2 = objectPool.get(&#8220;ArrowLine2&#8221;, &#8220;Line&#8221;);<br \/>\n  let arrowLine3 = objectPool.get(&#8220;ArrowLine3&#8221;, &#8220;Line&#8221;);<\/p>\n<p>  let secretCharacterValues = [0, 4, 1, 2, 3];<br \/>\n  let privateSalt = 123;<\/p>\n<p>  input.pointerdown$.subscribe((event) =&gt; {<br \/>\n    const { worldX, worldY } = event.pointer;<br \/>\n    const player = pixelCoordToTileCoord({ x: worldX, y: worldY }, TILE_WIDTH, TILE_HEIGHT);<\/p>\n<p>    if (player.x === 0 &amp;&amp; player.y === 0) return;<\/p>\n<p>    let coordinates = pixelCoordToTileCoord({ x: worldX, y: worldY }, TILE_WIDTH, TILE_HEIGHT);<br \/>\n    let encodedPosition = encodePosition(coordinates.x, coordinates.y);<\/p>\n<p>    const character = getComponentValue(Character, encodedPosition);<\/p>\n<p>    if (character) {<br \/>\n        startPoint = { x: worldX, y: worldY };<br \/>\n        draggedEntity = `${player.x}-${player.y}`;<br \/>\n    } else {<br \/>\n        spawn(player.x, player.y, 123);<br \/>\n    }<br \/>\n  });<\/p>\n<p>  input.pointermove$.subscribe((event) =&gt; {<br \/>\n    if (startPoint &amp;&amp; draggedEntity) {<br \/>\n        const { worldX, worldY } = event.pointer;<\/p>\n<p>        \/\/ Draw the main line<br \/>\n        arrowLine1.setComponent({<br \/>\n          id: &#8220;line&#8221;,<br \/>\n          once: (line) =&gt; {<br \/>\n            line.visible = true;<br \/>\n            line.isStroked = true;<br \/>\n            line.setFillStyle(0xff00ff);<br \/>\n            line.geom.x1 = startPoint.x;<br \/>\n            line.geom.y1 = startPoint.y;<br \/>\n            line.geom.x2 = worldX;<br \/>\n            line.geom.y2 = worldY;<br \/>\n          },<br \/>\n        });<\/p>\n<p>        \/\/ Draw an arrowhead effect at the end point<br \/>\n        const arrowLength = 20;<br \/>\n        const angle = Math.atan2(worldY &#8211; startPoint.y, worldX &#8211; startPoint.x);<\/p>\n<p>        arrowLine2.setComponent({<br \/>\n          id: &#8220;line&#8221;,<br \/>\n          once: (line) =&gt; {<br \/>\n            line.visible = true;<br \/>\n            line.isStroked = true;<br \/>\n            line.setFillStyle(0x00ff00);<br \/>\n            line.geom.x1 = worldX;<br \/>\n            line.geom.y1 = worldY;<br \/>\n            line.geom.x2 = worldX &#8211; arrowLength * Math.cos(angle &#8211; Math.PI \/ 6);<br \/>\n            line.geom.y2 = worldY &#8211; arrowLength * Math.sin(angle &#8211; Math.PI \/ 6);<br \/>\n          },<br \/>\n        });<\/p>\n<p>        arrowLine3.setComponent({<br \/>\n          id: &#8220;line&#8221;,<br \/>\n          once: (line) =&gt; {<br \/>\n            line.visible = true;<br \/>\n            line.isStroked = true;<br \/>\n            line.setFillStyle(0x00ff00);<br \/>\n            line.geom.x1 = worldX;<br \/>\n            line.geom.y1 = worldY;<br \/>\n            line.geom.x2 = worldX &#8211; arrowLength * Math.cos(angle + Math.PI \/ 6);<br \/>\n            line.geom.y2 = worldY &#8211; arrowLength * Math.sin(angle + Math.PI \/ 6);<br \/>\n          },<br \/>\n        });<br \/>\n    }<br \/>\n  });<\/p>\n<p>  input.pointerup$.subscribe((event) =&gt; {<br \/>\n    if (startPoint &amp;&amp; draggedEntity) {<\/p>\n<p>      const { worldX, worldY } = event.pointer;<\/p>\n<p>      const startTile = pixelCoordToTileCoord(startPoint, TILE_WIDTH, TILE_HEIGHT);<br \/>\n      const endTile = pixelCoordToTileCoord({ x: worldX, y: worldY }, TILE_WIDTH, TILE_HEIGHT);<\/p>\n<p>      const encodedDestinationPosition = encodePosition(endTile.x, endTile.y);<br \/>\n      const destinationCharacter = getComponentValue(Character, encodedDestinationPosition);<br \/>\n      const direction = calculateDirection(startTile, endTile);<\/p>\n<p>      if(startTile.x == endTile.x<br \/>\n          &amp;&amp; startTile.y == endTile.y)<br \/>\n      {<\/p>\n<p>        console.log(`Defending character at (${startTile.x}, ${startTile.y})`);<\/p>\n<p>        defend(startTile.x, startTile.y,<br \/>\n        {<br \/>\n          character1: secretCharacterValues[1],<br \/>\n          character2: secretCharacterValues[2],<br \/>\n          character3: secretCharacterValues[3],<br \/>\n          character4: secretCharacterValues[4],<br \/>\n          privateSalt: privateSalt,<br \/>\n          characterTarget: destinationCharacter.id,<br \/>\n          attackerLevel: destinationCharacter.attackedByValue<br \/>\n        });<\/p>\n<p>      } else if (destinationCharacter) {<br \/>\n        const encodedStartPosition = encodePosition(startTile.x, startTile.y);<br \/>\n        const startCharacter = getComponentValue(Character, encodedStartPosition);<\/p>\n<p>        attack(startTile.x, startTile.y, endTile.x, endTile.y,<br \/>\n          {<br \/>\n            character1: secretCharacterValues[1],<br \/>\n            character2: secretCharacterValues[2],<br \/>\n            character3: secretCharacterValues[3],<br \/>\n            character4: secretCharacterValues[4],<br \/>\n            privateSalt: privateSalt,<br \/>\n            characterReveal: startCharacter.id,<br \/>\n            valueReveal: secretCharacterValues[startCharacter.id]\n          }<br \/>\n        );<br \/>\n        console.log(`Attacked character from (${startTile.x}, ${startTile.y}) to (${endTile.x}, ${endTile.y})`);<br \/>\n      } else if (direction != null) {<br \/>\n        move(startTile.x, startTile.y, direction);<br \/>\n        console.log(`Moved character from (${startTile.x}, ${startTile.y}) to (${endTile.x}, ${endTile.y}) in direction ${direction}`);<br \/>\n      } <\/p>\n<p>      startPoint = null;<br \/>\n      draggedEntity = null;<br \/>\n    }<br \/>\n  });<\/p>\n<p>  defineEnterSystem(world, [Has(Character)], ({ entity }) =&gt; {<br \/>\n    const character = getComponentValue(Character, entity);<\/p>\n<p>    const characterObj = objectPool.get(entity, &#8220;Sprite&#8221;);<br \/>\n    characterObj.setComponent({<br \/>\n      id: &#8216;animation&#8217;,<br \/>\n      once: (sprite) =&gt; {<br \/>\n        let characterAnimation = character.revealedValue;<br \/>\n        const playerIsOwner = &#8220;0x&#8221; + playerEntity.slice(26).toLowerCase() == &#8220;&#8221; + character.owner.toLowerCase()<br \/>\n        if(playerIsOwner) {<br \/>\n          characterAnimation = secretCharacterValues[character.id];<br \/>\n        }<br \/>\n        if(playerIsOwner) {<br \/>\n          const characterPosition = tileCoordToPixelCoord(decodePosition(entity), TILE_WIDTH, TILE_HEIGHT);<br \/>\n          let rectangle = null<\/p>\n<p>          switch (character.id)  {<br \/>\n            case 1:<br \/>\n              rectangle = playerRectangle1;<br \/>\n              break;<br \/>\n            case 2:<br \/>\n              rectangle = playerRectangle2;<br \/>\n              break;<br \/>\n            case 3:<br \/>\n              rectangle = playerRectangle3;<br \/>\n              break;<br \/>\n            case 4:<br \/>\n              rectangle = playerRectangle4;<br \/>\n              break;<br \/>\n          }<\/p>\n<p>          rectangle.setComponent({<br \/>\n            id: &#8220;rectangle&#8221;,<br \/>\n            once: (rectangle) =&gt; {<br \/>\n              rectangle.setPosition(characterPosition.x, characterPosition.y);<br \/>\n              rectangle.setSize(32,32);<br \/>\n              rectangle.setFillStyle(0x0000ff);<br \/>\n              rectangle.setAlpha(0.25);<br \/>\n            },<br \/>\n          });<\/p>\n<p>        }<br \/>\n        switch (characterAnimation)  {<br \/>\n          case 1:<br \/>\n            sprite.play(Animations.A);<br \/>\n            break;<br \/>\n          case 2:<br \/>\n            sprite.play(Animations.B);<br \/>\n            break;<br \/>\n          case 3:<br \/>\n            sprite.play(Animations.C);<br \/>\n            break;<br \/>\n          case 4:<br \/>\n            sprite.play(Animations.D);<br \/>\n            break;<br \/>\n          default:<br \/>\n            sprite.play(Animations.Unknown);<br \/>\n        }<br \/>\n      }<br \/>\n    });<br \/>\n  });<\/p>\n<p>  defineExitSystem(world, [Has(Character)], ({ entity }) =&gt; {<br \/>\n    objectPool.remove(entity);<br \/>\n  });<\/p>\n<p>  defineSystem(world, [Has(Character)], ({ entity }) =&gt; {<br \/>\n    const character = getComponentValue(Character, entity);<br \/>\n    if(!character)<br \/>\n      return;<br \/>\n    const pixelPosition = tileCoordToPixelCoord(decodePosition(entity), TILE_WIDTH, TILE_HEIGHT);<br \/>\n    const characterObj = objectPool.get(entity, &#8220;Sprite&#8221;);<\/p>\n<p>    if (character.isDead) {<br \/>\n      characterObj.setComponent({<br \/>\n        id: &#8216;animation&#8217;,<br \/>\n        once: (sprite) =&gt; {<br \/>\n          sprite.play(Animations.Dead);<br \/>\n        }<br \/>\n      });<br \/>\n    } else if (character.attackedAt != 0) {<br \/>\n      characterObj.setComponent({<br \/>\n        id: &#8216;animation&#8217;,<br \/>\n        once: (sprite) =&gt; {<br \/>\n          sprite.play(Animations.Attacked);<br \/>\n        }<br \/>\n      });<br \/>\n    } else<br \/>\n    {<br \/>\n      characterObj.setComponent({<br \/>\n        id: &#8216;animation&#8217;,<br \/>\n        once: (sprite) =&gt; {<br \/>\n          let characterAnimation = character.revealedValue;<br \/>\n          const playerIsOwner = &#8220;0x&#8221; + playerEntity.slice(26).toLowerCase() == &#8220;&#8221; + character.owner.toLowerCase()<br \/>\n          if(playerIsOwner) {<br \/>\n            characterAnimation = secretCharacterValues[character.id];<br \/>\n          }<br \/>\n          if(playerIsOwner) {<br \/>\n            \/\/sprite.setBackgroundColor(&#8220;#0000ff&#8221;);<br \/>\n          }<br \/>\n          switch (characterAnimation)  {<br \/>\n            case 1:<br \/>\n              sprite.play(Animations.A);<br \/>\n              break;<br \/>\n            case 2:<br \/>\n              sprite.play(Animations.B);<br \/>\n              break;<br \/>\n            case 3:<br \/>\n              sprite.play(Animations.C);<br \/>\n              break;<br \/>\n            case 4:<br \/>\n              sprite.play(Animations.D);<br \/>\n              break;<br \/>\n            default:<br \/>\n              sprite.play(Animations.Unknown);<br \/>\n          }<br \/>\n        }<br \/>\n      });<br \/>\n    }<\/p>\n<p>    characterObj.setComponent({<br \/>\n      id: &#8220;position&#8221;,<br \/>\n      once: (sprite) =&gt; {<br \/>\n        sprite.setPosition(pixelPosition.x, pixelPosition.y);<br \/>\n      }<br \/>\n    });<\/p>\n<p>    arrowLine1.setComponent({<br \/>\n      id: &#8220;line&#8221;,<br \/>\n      once: (line) =&gt; {<br \/>\n        line.visible = false;<br \/>\n      },<br \/>\n    });<\/p>\n<p>    arrowLine2.setComponent({<br \/>\n      id: &#8220;line&#8221;,<br \/>\n      once: (line) =&gt; {<br \/>\n        line.visible = false;<br \/>\n      },<br \/>\n    });<\/p>\n<p>    arrowLine3.setComponent({<br \/>\n      id: &#8220;line&#8221;,<br \/>\n      once: (line) =&gt; {<br \/>\n        line.visible = false;<br \/>\n      },<br \/>\n    });<br \/>\n  });<\/p>\n<p>  function calculateDirection(start: { x: number, y: number }, end: { x: number, y: number }) {<br \/>\n    if (end.y  start.y) return Directions.UP;<br \/>\n    if (end.y &gt; start.y) return Directions.DOWN;<br \/>\n    if (end.x  start.x) return Directions.LEFT;<br \/>\n    if (end.x &gt; start.x) return Directions.RIGHT;<br \/>\n    return null;<br \/>\n  }<br \/>\n};<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>  5. \u062a\u0639\u0627\u0645\u0644 Client-Ethereum \u0648 Client-SNARK<\/p>\n<p>\u0627\u0628\u062a\u062f\u0627 \u0628\u0627\u06cc\u062f \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 \u0627\u06cc \u0631\u0627 \u0646\u0635\u0628 \u06a9\u0646\u06cc\u0645 \u06a9\u0647 \u0628\u0647 \u0645\u0627 \u062f\u0631 \u062a\u0648\u0644\u06cc\u062f SNARK \u06a9\u0645\u06a9 \u06a9\u0646\u062f.<\/p>\n<p>cd packages\/client\/<br \/>\npnpm install snarkjs<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0627\u06a9\u0646\u0648\u0646 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u0645 \u062a\u0631\u0627\u06a9\u0646\u0634\u200c\u0647\u0627\u06cc \u0632\u0646\u062c\u06cc\u0631\u0647\u200c\u0627\u06cc \u0648 \u062a\u0648\u0644\u06cc\u062f \u0627\u062b\u0628\u0627\u062a\u200c\u0647\u0627\u06cc ZK \u0631\u0627 \u062a\u0639\u0631\u06cc\u0641 \u06a9\u0646\u06cc\u0645.<\/p>\n<p>packages\/client\/src\/mud\/createSystemCalls.ts<\/p>\n<p>import { getComponentValue } from &#8220;@latticexyz\/recs&#8221;;<br \/>\nimport { ClientComponents } from &#8220;.\/createClientComponents&#8221;;<br \/>\nimport { SetupNetworkResult } from &#8220;.\/setupNetwork&#8221;;<br \/>\nimport { singletonEntity } from &#8220;@latticexyz\/store-sync\/recs&#8221;;<br \/>\nimport { groth16 } from &#8220;snarkjs&#8221;;<\/p>\n<p>export type SystemCalls = ReturnTypetypeof createSystemCalls&gt;;<\/p>\n<p>export function createSystemCalls(<br \/>\n  { worldContract, waitForTransaction, playerEntity }: SetupNetworkResult,<br \/>\n  { Character }: ClientComponents,<br \/>\n) {<br \/>\n  const spawn = async (x: number, y: number) =&gt; {<br \/>\n    const { proof, publicSignals } = await groth16.fullProve(<br \/>\n      {<br \/>\n          character1: 4,<br \/>\n          character2: 1,<br \/>\n          character3: 2,<br \/>\n          character4: 3,<br \/>\n          privateSalt: 123,<br \/>\n          characterReveal: 1,<br \/>\n          valueReveal: 4,<br \/>\n      },<br \/>\n      &#8220;.\/zk_artifacts\/reveal.wasm&#8221;,<br \/>\n      &#8220;.\/zk_artifacts\/reveal_final.zkey&#8221;<br \/>\n    );<br \/>\n    let commitment : number = publicSignals[0];<br \/>\n    const tx = await worldContract.write.app__spawn([x, y, commitment]);<br \/>\n    await waitForTransaction(tx);<br \/>\n    return getComponentValue(Character, singletonEntity);<br \/>\n  };<\/p>\n<p>  const move = async (x: number, y: number, direction: number) =&gt; {<br \/>\n    const tx = await worldContract.write.app__move([x, y, direction]);<br \/>\n    await waitForTransaction(tx);<br \/>\n    return getComponentValue(Character,  singletonEntity);<br \/>\n  }<\/p>\n<p>  const attack = async (fromX: number, fromY: number, toX: number, toY: number, circuitInputs: any) =&gt; {<br \/>\n    const { proof, publicSignals } = await groth16.fullProve(circuitInputs,<br \/>\n      &#8220;.\/zk_artifacts\/reveal.wasm&#8221;,<br \/>\n      &#8220;.\/zk_artifacts\/reveal_final.zkey&#8221;<br \/>\n    );<\/p>\n<p>    let pa = proof.pi_a<br \/>\n    let pb = proof.pi_b<br \/>\n    let pc = proof.pi_c<br \/>\n    pa.pop()<br \/>\n    pb.pop()<br \/>\n    pc.pop()<\/p>\n<p>    const tx = await worldContract.write.app__attack([pa, pb, pc, publicSignals, fromX, fromY, toX, toY]);<br \/>\n    await waitForTransaction(tx);<br \/>\n    return getComponentValue(Character,  singletonEntity);<br \/>\n  }<\/p>\n<p>  const defend = async (x: number, y: number, circuitInputs: any) =&gt; {<br \/>\n    const { proof, publicSignals } = await groth16.fullProve(circuitInputs,<br \/>\n      &#8220;.\/zk_artifacts\/defend.wasm&#8221;,<br \/>\n      &#8220;.\/zk_artifacts\/defend_final.zkey&#8221;<br \/>\n    );<\/p>\n<p>    let pa = proof.pi_a<br \/>\n    let pb = proof.pi_b<br \/>\n    let pc = proof.pi_c<br \/>\n    pa.pop()<br \/>\n    pb.pop()<br \/>\n    pc.pop()<\/p>\n<p>    const tx = await worldContract.write.app__defend([pa, pb, pc, publicSignals, x, y]);<br \/>\n    await waitForTransaction(tx);<br \/>\n    return getComponentValue(Character,  singletonEntity);<br \/>\n  }<\/p>\n<p>  return {<br \/>\n    spawn, move, attack, defend, playerEntity<br \/>\n  };<br \/>\n}<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>  6. \u0627\u0636\u0627\u0641\u0647 \u06a9\u0631\u062f\u0646 \u0627\u0646\u06cc\u0645\u06cc\u0634\u0646 \u0647\u0627\u06cc \u0628\u0627\u0632\u06cc<\/p>\n<p>\u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u0632 \u0647\u0631 \u0627\u0646\u06cc\u0645\u06cc\u0634\u0646\u06cc \u06a9\u0647 \u062f\u0648\u0633\u062a \u062f\u0627\u0631\u06cc\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f\u060c \u0627\u0645\u0627 \u0627\u06af\u0631 \u0645\u06cc\u200c\u062e\u0648\u0627\u0647\u06cc\u062f \u0627\u0632 \u0647\u0645\u0627\u0646 \u0627\u0646\u06cc\u0645\u06cc\u0634\u0646\u200c\u0647\u0627\u06cc\u06cc \u06a9\u0647 \u0645\u0646 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u200c\u06a9\u0646\u0645 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f\u060c \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u06cc\u0646 \u062f\u0627\u0631\u0627\u06cc\u06cc\u200c\u0647\u0627 \u0631\u0627 \u062f\u0627\u0646\u0644\u0648\u062f \u06a9\u0646\u06cc\u062f:<\/p>\n<p>packages\/art\/sprites\/A\/1.png<\/p>\n<p>packages\/art\/sprites\/B\/1.png<\/p>\n<p>packages\/art\/sprites\/C\/1.png<\/p>\n<p>packages\/art\/sprites\/D\/1.png<\/p>\n<p>packages\/art\/sprites\/Attacked\/1.png<\/p>\n<p>packages\/art\/sprites\/Dead\/1.png<\/p>\n<p>packages\/art\/sprites\/Unknown\/1.png<\/p>\n<p>\u0627\u0637\u0644\u0633 \u0631\u0627 \u062a\u0648\u0644\u06cc\u062f \u06a9\u0646\u06cc\u062f.<\/p>\n<p>cd packages\/art<br \/>\nyarn<br \/>\nyarn generate-multiatlas-sprites<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0648 \u0627\u0646\u06cc\u0645\u06cc\u0634\u0646 \u0647\u0627\u06cc \u0628\u0627\u0632\u06cc \u0631\u0627 \u062a\u0639\u0631\u06cc\u0641 \u0645\u06cc \u06a9\u0646\u06cc\u0645. \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u0646\u06cc\u0645\u06cc\u0634\u0646 \u0647\u0627\u06cc \u0686\u0646\u062f \u0641\u0631\u06cc\u0645\u06cc \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f \u0648 \u0631\u0641\u062a\u0627\u0631 \u0648 \u0633\u0631\u0639\u062a \u0622\u0646\u0647\u0627 \u0631\u0627 \u062a\u0646\u0638\u06cc\u0645 \u06a9\u0646\u06cc\u062f.<\/p>\n<p>\u0627\u0646\u06cc\u0645\u06cc\u0634\u0646 \u0647\u0627\u06cc \u0628\u0627\u0632\u06cc \u0631\u0627 \u062a\u0639\u0631\u06cc\u0641 \u06a9\u0646\u06cc\u062f. \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0634\u0647\u0631\u062a\u060c \u0633\u0631\u0639\u062a \u0648 \u0631\u0641\u062a\u0627\u0631 \u0631\u0627 \u062a\u0646\u0638\u06cc\u0645 \u06a9\u0646\u06cc\u062f.<\/p>\n<p>packages\/client\/src\/layers\/phaser\/configurePhaser.ts<\/p>\n<p>import Phaser from &#8220;phaser&#8221;;<br \/>\nimport {<br \/>\n  defineSceneConfig,<br \/>\n  AssetType,<br \/>\n  defineScaleConfig,<br \/>\n  defineMapConfig,<br \/>\n  defineCameraConfig,<br \/>\n} from &#8220;@latticexyz\/phaserx&#8221;;<br \/>\nimport worldTileset from &#8220;..\/..\/..\/public\/assets\/tilesets\/world.png&#8221;;<br \/>\nimport { TileAnimations, Tileset } from &#8220;..\/..\/artTypes\/world&#8221;;<br \/>\nimport { Assets, Maps, Scenes, TILE_HEIGHT, TILE_WIDTH, Animations } from &#8220;.\/constants&#8221;;<\/p>\n<p>const ANIMATION_INTERVAL = 200;<\/p>\n<p>const mainMap = defineMapConfig({<br \/>\n  chunkSize: TILE_WIDTH * 64, \/\/ tile size * tile amount<br \/>\n  tileWidth: TILE_WIDTH,<br \/>\n  tileHeight: TILE_HEIGHT,<br \/>\n  backgroundTile: [Tileset.Grass],<br \/>\n  animationInterval: ANIMATION_INTERVAL,<br \/>\n  tileAnimations: TileAnimations,<br \/>\n  layers: {<br \/>\n    layers: {<br \/>\n      Background: { tilesets: [&#8220;Default&#8221;] },<br \/>\n      Foreground: { tilesets: [&#8220;Default&#8221;] },<br \/>\n    },<br \/>\n    defaultLayer: &#8220;Background&#8221;,<br \/>\n  },<br \/>\n});<\/p>\n<p>export const phaserConfig = {<br \/>\n  sceneConfig: {<br \/>\n    [Scenes.Main]: defineSceneConfig({<br \/>\n      assets: {<br \/>\n        [Assets.Tileset]: {<br \/>\n          type: AssetType.Image,<br \/>\n          key: Assets.Tileset,<br \/>\n          path: worldTileset,<br \/>\n        },<br \/>\n        [Assets.MainAtlas]: {<br \/>\n          type: AssetType.MultiAtlas,<br \/>\n          key: Assets.MainAtlas,<br \/>\n          \/\/ Add a timestamp to the end of the path to prevent caching<br \/>\n          path: `\/assets\/atlases\/atlas.json?timestamp=${Date.now()}`,<br \/>\n          options: {<br \/>\n            imagePath: &#8220;\/assets\/atlases\/&#8221;,<br \/>\n          },<br \/>\n        },<br \/>\n      },<br \/>\n      maps: {<br \/>\n        [Maps.Main]: mainMap,<br \/>\n      },<br \/>\n      sprites: {<br \/>\n      },<br \/>\n      animations: [<br \/>\n        {<br \/>\n          key: Animations.A,<br \/>\n          assetKey: Assets.MainAtlas,<br \/>\n          startFrame: 1,<br \/>\n          endFrame: 1,<br \/>\n          frameRate: 3,<br \/>\n          repeat: -1,<br \/>\n          duration: 1,<br \/>\n          prefix: &#8220;sprites\/A\/&#8221;,<br \/>\n          suffix: &#8220;.png&#8221;,<br \/>\n        },<br \/>\n        {<br \/>\n          key: Animations.B,<br \/>\n          assetKey: Assets.MainAtlas,<br \/>\n          startFrame: 1,<br \/>\n          endFrame: 1,<br \/>\n          frameRate: 3,<br \/>\n          repeat: -1,<br \/>\n          duration: 1,<br \/>\n          prefix: &#8220;sprites\/B\/&#8221;,<br \/>\n          suffix: &#8220;.png&#8221;,<br \/>\n        },<br \/>\n        {<br \/>\n          key: Animations.C,<br \/>\n          assetKey: Assets.MainAtlas,<br \/>\n          startFrame: 1,<br \/>\n          endFrame: 1,<br \/>\n          frameRate: 3,<br \/>\n          repeat: -1,<br \/>\n          duration: 1,<br \/>\n          prefix: &#8220;sprites\/C\/&#8221;,<br \/>\n          suffix: &#8220;.png&#8221;,<br \/>\n        },<br \/>\n        {<br \/>\n          key: Animations.D,<br \/>\n          assetKey: Assets.MainAtlas,<br \/>\n          startFrame: 1,<br \/>\n          endFrame: 1,<br \/>\n          frameRate: 3,<br \/>\n          repeat: -1,<br \/>\n          duration: 1,<br \/>\n          prefix: &#8220;sprites\/D\/&#8221;,<br \/>\n          suffix: &#8220;.png&#8221;,<br \/>\n        },<br \/>\n        {<br \/>\n          key: Animations.Dead,<br \/>\n          assetKey: Assets.MainAtlas,<br \/>\n          startFrame: 1,<br \/>\n          endFrame: 1,<br \/>\n          frameRate: 12,<br \/>\n          repeat: -1,<br \/>\n          duration: 1,<br \/>\n          prefix: &#8220;sprites\/Dead\/&#8221;,<br \/>\n          suffix: &#8220;.png&#8221;,<br \/>\n        },<br \/>\n        {<br \/>\n          key: Animations.Unknown,<br \/>\n          assetKey: Assets.MainAtlas,<br \/>\n          startFrame: 1,<br \/>\n          endFrame: 1,<br \/>\n          frameRate: 12,<br \/>\n          repeat: -1,<br \/>\n          duration: 1,<br \/>\n          prefix: &#8220;sprites\/Unknown\/&#8221;,<br \/>\n          suffix: &#8220;.png&#8221;,<br \/>\n        },<br \/>\n        {<br \/>\n          key: Animations.Attacked,<br \/>\n          assetKey: Assets.MainAtlas,<br \/>\n          startFrame: 1,<br \/>\n          endFrame: 1,<br \/>\n          frameRate: 12,<br \/>\n          repeat: -1,<br \/>\n          duration: 1,<br \/>\n          prefix: &#8220;sprites\/Attacked\/&#8221;,<br \/>\n          suffix: &#8220;.png&#8221;,<br \/>\n        },<br \/>\n      ],<br \/>\n      tilesets: {<br \/>\n        Default: {<br \/>\n          assetKey: Assets.Tileset,<br \/>\n          tileWidth: TILE_WIDTH,<br \/>\n          tileHeight: TILE_HEIGHT,<br \/>\n        },<br \/>\n      },<br \/>\n    }),<br \/>\n  },<br \/>\n  scale: defineScaleConfig({<br \/>\n    parent: &#8220;phaser-game&#8221;,<br \/>\n    zoom: 1,<br \/>\n    mode: Phaser.Scale.NONE,<br \/>\n  }),<br \/>\n  cameraConfig: defineCameraConfig({<br \/>\n    pinchSpeed: 1,<br \/>\n    wheelSpeed: 1,<br \/>\n    maxZoom: 3,<br \/>\n    minZoom: 1,<br \/>\n  }),<br \/>\n  cullingChunkSize: TILE_HEIGHT * 16,<br \/>\n};<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>  7. \u0647\u0645\u0647 \u0686\u06cc\u0632 \u0631\u0627 \u0628\u0647 \u0647\u0645 \u0645\u062a\u0635\u0644 \u06a9\u0646\u06cc\u062f<\/p>\n<p>packages\/client\/src\/layers\/phaser\/constants.ts<\/p>\n<p>export enum Scenes {<br \/>\n  Main = &#8220;Main&#8221;,<br \/>\n}<\/p>\n<p>export enum Maps {<br \/>\n  Main = &#8220;Main&#8221;,<br \/>\n}<\/p>\n<p>export enum Animations {<br \/>\n  A = &#8220;A&#8221;,<br \/>\n  B = &#8220;B&#8221;,<br \/>\n  C = &#8220;C&#8221;,<br \/>\n  D = &#8220;D&#8221;,<br \/>\n  Dead = &#8220;Dead&#8221;,<br \/>\n  Unknown = &#8220;Unknown&#8221;,<br \/>\n  Attacked = &#8220;Attacked&#8221;,<br \/>\n}<\/p>\n<p>export enum Directions {<br \/>\n  UP = 0,<br \/>\n  DOWN = 1,<br \/>\n  LEFT = 2,<br \/>\n  RIGHT = 3,<br \/>\n}<\/p>\n<p>export enum Assets {<br \/>\n  MainAtlas = &#8220;MainAtlas&#8221;,<br \/>\n  Tileset = &#8220;Tileset&#8221;,<br \/>\n}<\/p>\n<p>export const TILE_HEIGHT = 32;<br \/>\nexport const TILE_WIDTH = 32;<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>packages\/client\/src\/layers\/phaser\/systems\/registerSystems.ts<\/p>\n<p>import { PhaserLayer } from &#8220;..\/createPhaserLayer&#8221;;<br \/>\nimport { createCamera } from &#8220;.\/createCamera&#8221;;<br \/>\nimport { createMapSystem } from &#8220;.\/createMapSystem&#8221;;<br \/>\nimport { createMyGameSystem } from &#8220;.\/myGameSystem&#8221;;<\/p>\n<p>export const registerSystems = (layer: PhaserLayer) =&gt; {<br \/>\n  createCamera(layer);<br \/>\n  createMapSystem(layer);<br \/>\n  createMyGameSystem(layer);<br \/>\n};<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>  8. \u0628\u0627\u0632\u06cc \u0631\u0627 \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f<\/p>\n<p>\u0628\u0647 \u0641\u0647\u0631\u0633\u062a \u0627\u0635\u0644\u06cc \u067e\u0631\u0648\u0698\u0647 \u0628\u0631\u06af\u0631\u062f\u06cc\u062f.<\/p>\n<p>cd ..\/..\/<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0648 \u0628\u0627\u0632\u06cc \u0631\u0627 \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f.<\/p>\n<p>pnpm dev<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0627\u06a9\u0646\u0648\u0646 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0628\u0627\u0632\u06cc \u0631\u0627 \u062f\u0631 \u062f\u0648 \u0645\u0631\u0648\u0631\u06af\u0631 \u0645\u062e\u062a\u0644\u0641 \u0628\u0627\u0632 \u06a9\u0646\u06cc\u062f. \u0647\u0631 \u0628\u0627\u0632\u06cc\u06a9\u0646 \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u0628\u0627 \u06a9\u0644\u06cc\u06a9 \u0628\u0631 \u0631\u0648\u06cc \u06cc\u06a9 \u0641\u0636\u0627\u06cc \u062e\u0627\u0644\u06cc \u062a\u062e\u0645 \u0631\u06cc\u0632\u06cc \u06a9\u0646\u062f. \u0628\u0631\u0627\u06cc \u062d\u0631\u06a9\u062a \u0628\u0647 \u0641\u0636\u0627\u06cc \u062e\u0627\u0644\u06cc \u0645\u062c\u0627\u0648\u0631 \u0628\u06a9\u0634\u06cc\u062f. \u0628\u0631\u0627\u06cc \u062d\u0645\u0644\u0647 \u0628\u0647 \u0628\u0627\u0632\u06cc\u06a9\u0646 \u062f\u06cc\u06af\u0631\u06cc \u0628\u06a9\u0634\u06cc\u062f. \u0628\u0631\u0627\u06cc \u0627\u06cc\u062c\u0627\u062f SNARK \u062f\u0641\u0627\u0639\u06cc \u0631\u0648\u06cc \u0628\u0627\u0632\u06cc\u06a9\u0646 \u0645\u0648\u0631\u062f \u062d\u0645\u0644\u0647 \u06a9\u0644\u06cc\u06a9 \u06a9\u0646\u06cc\u062f.<\/p>\n<p>\u062f\u0631 \u0628\u0627\u0632\u06cc \u0628\u0631\u0627\u06cc \u062a\u062e\u0645 \u0631\u06cc\u0632\u06cc \u06a9\u0644\u06cc\u06a9 \u06a9\u0646\u06cc\u062f\u060c \u0628\u0631\u0627\u06cc \u062d\u0631\u06a9\u062a \u0628\u0647 \u0641\u0636\u0627\u06cc \u062e\u0627\u0644\u06cc \u0645\u062c\u0627\u0648\u0631 \u0628\u06a9\u0634\u06cc\u062f\u060c \u0628\u0631\u0627\u06cc \u062d\u0645\u0644\u0647 \u0628\u0647 \u0633\u0645\u062a \u062d\u0631\u06cc\u0641 \u0628\u06a9\u0634\u06cc\u062f \u0648 \u0628\u0631\u0627\u06cc \u062f\u0641\u0627\u0639 \u06a9\u0644\u06cc\u06a9 \u06a9\u0646\u06cc\u062f.<\/p>\n<p>\u0628\u0627 \u062a\u0634\u06a9\u0631 \u0627\u0632 \u062e\u0648\u0627\u0646\u062f\u0646 \u0627\u06cc\u0646 \u0631\u0627\u0647\u0646\u0645\u0627!<\/p>\n<p>\u0645\u0646 \u0631\u0627 \u062f\u0631 dev.to \u0648 YouTube \u0628\u0631\u0627\u06cc \u0647\u0645\u0647 \u0686\u06cc\u0632\u0647\u0627\u06cc\u06cc \u06a9\u0647 \u0628\u0647 \u062a\u0648\u0633\u0639\u0647 \u0628\u0644\u0627\u06a9 \u0686\u06cc\u0646 \u0628\u0647 \u0632\u0628\u0627\u0646 \u0627\u0633\u067e\u0627\u0646\u06cc\u0627\u06cc\u06cc \u0645\u0631\u062a\u0628\u0637 \u0627\u0633\u062a \u062f\u0646\u0628\u0627\u0644 \u06a9\u0646\u06cc\u062f.<\/p>\n<div data-article-id=\"1965642\" id=\"article-body\">\n<p>\u062f\u0631 \u0627\u06cc\u0646 \u0622\u0645\u0648\u0632\u0634\u060c \u0645\u0627 \u06cc\u06a9 \u0628\u0627\u0632\u06cc 100% \u0631\u0648\u06cc \u0632\u0646\u062c\u06cc\u0631\u0647 \u0628\u0627 \u0639\u062f\u0645 \u062a\u0642\u0627\u0631\u0646 \u0627\u0637\u0644\u0627\u0639\u0627\u062a\u06cc \u0627\u06cc\u062c\u0627\u062f \u062e\u0648\u0627\u0647\u06cc\u0645 \u06a9\u0631\u062f\u060c \u0628\u0647 \u0639\u0628\u0627\u0631\u062a \u062f\u06cc\u06af\u0631\u060c \u06cc\u06a9 \u062f\u0646\u06cc\u0627\u06cc \u0645\u0633\u062a\u0642\u0644 \u06a9\u0647 \u062d\u0627\u0644\u062a \u062e\u0635\u0648\u0635\u06cc \u0648 \u0645\u062d\u0627\u0633\u0628\u0627\u062a \u0622\u0646 \u062f\u0631 \u0627\u062a\u0631\u06cc\u0648\u0645 \u06a9\u0627\u0645\u0644\u0627\u064b \u0642\u0627\u0628\u0644 \u062a\u0623\u06cc\u06cc\u062f \u0627\u0633\u062a. \u0645\u0627 \u0627\u0632 MUD\u060c \u0645\u0648\u062a\u0648\u0631 \u062c\u0647\u0627\u0646 \u0647\u0627\u06cc \u062e\u0648\u062f\u0645\u062e\u062a\u0627\u0631\u060c \u0648 Circom\u060c \u067e\u0631\u06a9\u0627\u0631\u0628\u0631\u062f\u062a\u0631\u06cc\u0646 \u0632\u0628\u0627\u0646 \u0628\u0631\u0627\u06cc \u0645\u062f\u0627\u0631\u0647\u0627\u06cc ZK \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u062e\u0648\u0627\u0647\u06cc\u0645 \u06a9\u0631\u062f.<\/p>\n<p><em><strong>\u0634\u0645\u0627 \u06cc\u0627\u062f \u062e\u0648\u0627\u0647\u06cc\u062f \u06af\u0631\u0641\u062a \u06a9\u0647:<\/strong><\/em><\/p>\n<ul>\n<li>\u0632\u0628\u0627\u0646 Circom \u0631\u0627 \u0628\u0627 \u0686\u0627\u0631\u0686\u0648\u0628 MUD \u062a\u0631\u06a9\u06cc\u0628 \u06a9\u0646\u06cc\u062f<\/li>\n<li>\u06cc\u06a9 \u062f\u0646\u06cc\u0627\u06cc \u0645\u0633\u062a\u0642\u0644 \u0628\u0627 \u0645\u062d\u0627\u0633\u0628\u0627\u062a \u0648 \u0645\u062a\u063a\u06cc\u0631\u0647\u0627\u06cc \u062e\u0635\u0648\u0635\u06cc \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f<\/li>\n<li>\u0627\u062b\u0628\u0627\u062a \u0647\u0627\u06cc zk-SNARK \u0631\u0627 \u0645\u0633\u062a\u0642\u06cc\u0645\u0627\u064b \u0627\u0632 \u0645\u0631\u0648\u0631\u06af\u0631 \u062e\u0648\u062f \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Snark.js \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f<\/li>\n<\/ul>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_85 counter-hierarchy ez-toc-counter-rtl ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">\u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"\u062a\u063a\u06cc\u06cc\u0631 \u0648\u0636\u0639\u06cc\u062a \u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/nabfollower.com\/blog\/how-to-create-an-information-asymmetric-autonomous-world-mud-circom-3bdn\/#%D9%81%D9%87%D8%B1%D8%B3%D8%AA_%D9%85%D8%B7%D8%A7%D9%84%D8%A8\" >\u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/nabfollower.com\/blog\/how-to-create-an-information-asymmetric-autonomous-world-mud-circom-3bdn\/#%D8%A8%D8%A7%D8%B2%DB%8C\" >\u0628\u0627\u0632\u06cc<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/nabfollower.com\/blog\/how-to-create-an-information-asymmetric-autonomous-world-mud-circom-3bdn\/#%DB%8C%DA%A9_%D9%BE%D8%B1%D9%88%DA%98%D9%87_MUD_%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF_%DA%A9%D9%86%DB%8C%D8%AF\" >\u06cc\u06a9 \u067e\u0631\u0648\u0698\u0647 MUD \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/nabfollower.com\/blog\/how-to-create-an-information-asymmetric-autonomous-world-mud-circom-3bdn\/#1_%D8%AF%D9%88%D9%84%D8%AA_%D8%B1%D8%A7_%D8%AA%D8%B9%D8%B1%DB%8C%D9%81_%DA%A9%D9%86%DB%8C%D8%AF\" >1. \u062f\u0648\u0644\u062a \u0631\u0627 \u062a\u0639\u0631\u06cc\u0641 \u06a9\u0646\u06cc\u062f<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/nabfollower.com\/blog\/how-to-create-an-information-asymmetric-autonomous-world-mud-circom-3bdn\/#2_%D9%85%D8%AF%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_%D8%B1%D8%B2%D9%85%DB%8C_%D8%B1%D8%A7_%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF_%DA%A9%D9%86%DB%8C%D8%AF\" >2. \u0645\u062f\u0627\u0631\u0647\u0627\u06cc \u0631\u0632\u0645\u06cc \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/nabfollower.com\/blog\/how-to-create-an-information-asymmetric-autonomous-world-mud-circom-3bdn\/#%D8%A7%D9%84%D9%81_%D8%A8%D9%87_SNARK_%D8%AD%D9%85%D9%84%D9%87_%DA%A9%D9%86%DB%8C%D8%AF\" >\u0627\u0644\u0641 \u0628\u0647 SNARK \u062d\u0645\u0644\u0647 \u06a9\u0646\u06cc\u062f<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/nabfollower.com\/blog\/how-to-create-an-information-asymmetric-autonomous-world-mud-circom-3bdn\/#%D8%A8_SNARK_%D8%AF%D9%81%D8%A7%D8%B9%DB%8C\" >\u0628 SNARK \u062f\u0641\u0627\u0639\u06cc<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/nabfollower.com\/blog\/how-to-create-an-information-asymmetric-autonomous-world-mud-circom-3bdn\/#%D8%AC_%D9%82%D8%B1%D8%A7%D8%B1%D8%AF%D8%A7%D8%AF%D9%87%D8%A7%DB%8C_%D8%AA%D8%A3%DB%8C%DB%8C%D8%AF_%DA%A9%D9%86%D9%86%D8%AF%D9%87_%D8%B1%D8%A7_%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF_%DA%A9%D9%86%DB%8C%D8%AF\" >\u062c \u0642\u0631\u0627\u0631\u062f\u0627\u062f\u0647\u0627\u06cc \u062a\u0623\u06cc\u06cc\u062f \u06a9\u0646\u0646\u062f\u0647 \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/nabfollower.com\/blog\/how-to-create-an-information-asymmetric-autonomous-world-mud-circom-3bdn\/#3_%D9%85%D9%86%D8%B7%D9%82_%D8%A8%D8%A7%D8%B2%DB%8C\" >3. \u0645\u0646\u0637\u0642 \u0628\u0627\u0632\u06cc<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/nabfollower.com\/blog\/how-to-create-an-information-asymmetric-autonomous-world-mud-circom-3bdn\/#4_%D9%85%D8%B4%D8%AA%D8%B1%DB%8C_%D8%A8%D8%A7_Phaser_Snarkjs\" >4. \u0645\u0634\u062a\u0631\u06cc \u0628\u0627 Phaser + Snarkjs<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/nabfollower.com\/blog\/how-to-create-an-information-asymmetric-autonomous-world-mud-circom-3bdn\/#5_%D8%AA%D8%B9%D8%A7%D9%85%D9%84_Client-Ethereum_%D9%88_Client-SNARK\" >5. \u062a\u0639\u0627\u0645\u0644 Client-Ethereum \u0648 Client-SNARK<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/nabfollower.com\/blog\/how-to-create-an-information-asymmetric-autonomous-world-mud-circom-3bdn\/#6_%D8%A7%D8%B6%D8%A7%D9%81%D9%87_%DA%A9%D8%B1%D8%AF%D9%86_%D8%A7%D9%86%DB%8C%D9%85%DB%8C%D8%B4%D9%86_%D9%87%D8%A7%DB%8C_%D8%A8%D8%A7%D8%B2%DB%8C\" >6. \u0627\u0636\u0627\u0641\u0647 \u06a9\u0631\u062f\u0646 \u0627\u0646\u06cc\u0645\u06cc\u0634\u0646 \u0647\u0627\u06cc \u0628\u0627\u0632\u06cc<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-13\" href=\"https:\/\/nabfollower.com\/blog\/how-to-create-an-information-asymmetric-autonomous-world-mud-circom-3bdn\/#7_%D9%87%D9%85%D9%87_%DA%86%DB%8C%D8%B2_%D8%B1%D8%A7_%D8%A8%D9%87_%D9%87%D9%85_%D9%85%D8%AA%D8%B5%D9%84_%DA%A9%D9%86%DB%8C%D8%AF\" >7. \u0647\u0645\u0647 \u0686\u06cc\u0632 \u0631\u0627 \u0628\u0647 \u0647\u0645 \u0645\u062a\u0635\u0644 \u06a9\u0646\u06cc\u062f<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-14\" href=\"https:\/\/nabfollower.com\/blog\/how-to-create-an-information-asymmetric-autonomous-world-mud-circom-3bdn\/#8_%D8%A8%D8%A7%D8%B2%DB%8C_%D8%B1%D8%A7_%D8%A7%D8%AC%D8%B1%D8%A7_%DA%A9%D9%86%DB%8C%D8%AF\" >8. \u0628\u0627\u0632\u06cc \u0631\u0627 \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f<\/a><\/li><\/ul><\/nav><\/div>\n<h2><span class=\"ez-toc-section\" id=\"%D9%81%D9%87%D8%B1%D8%B3%D8%AA_%D9%85%D8%B7%D8%A7%D9%84%D8%A8\"><\/span>\n<p>  \u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<h2><span class=\"ez-toc-section\" id=\"%D8%A8%D8%A7%D8%B2%DB%8C\"><\/span>\n<p>  \u0628\u0627\u0632\u06cc<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u062f\u0631 \u0634\u0631\u0648\u0639 \u0628\u0627\u0632\u06cc\u060c \u0647\u0631 \u0628\u0627\u0632\u06cc\u06a9\u0646 4 \u0648\u0627\u062d\u062f \u062a\u0648\u0644\u06cc\u062f \u0645\u06cc \u06a9\u0646\u062f \u06a9\u0647 \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u062f\u0631 \u0646\u0642\u0634\u0647 \u062d\u0631\u06a9\u062a \u06a9\u0646\u062f. \u0647\u0631 \u0648\u0627\u062d\u062f \u0627\u0632 \u0646\u0648\u0639 \u0645\u062a\u0641\u0627\u0648\u062a\u06cc \u0627\u0633\u062a\u060c \u0627\u0645\u0627 \u0627\u06cc\u0646 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u062e\u0635\u0648\u0635\u06cc \u0627\u0633\u062a \u0648 \u0641\u0642\u0637 \u0628\u0631\u0627\u06cc \u0635\u0627\u062d\u0628 \u0648\u0627\u062d\u062f\u0647\u0627 \u0642\u0627\u0628\u0644 \u0645\u0634\u0627\u0647\u062f\u0647 \u0627\u0633\u062a.<\/p>\n<p><\/p>\n<p><em>\ud83d\udc09 \u06a9\u0647 \ud83e\uddd9 \u0631\u0627 \u0645\u06cc \u0632\u0646\u062f \u06a9\u0647 \ud83e\uddcc \u0631\u0627 \u0645\u06cc \u0632\u0646\u062f \u06a9\u0647 \ud83d\udde1\ufe0f \u0631\u0627 \u0645\u06cc \u0632\u0646\u062f. \u0627\u0645\u0627 \ud83d\udde1\ufe0f \u06cc\u06a9 \u0648\u0627\u062d\u062f \u0648\u06cc\u0698\u0647 \u0627\u0633\u062a \u0632\u06cc\u0631\u0627 \u062a\u0646\u0647\u0627 \u0648\u0627\u062d\u062f\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \ud83d\udc09 \u0631\u0627 \u0634\u06a9\u0633\u062a \u062f\u0647\u062f<\/em><\/p>\n<p>\u0686\u0647\u0627\u0631 \u0646\u0648\u0639 \u062a\u0639\u0631\u06cc\u0641 \u0634\u062f\u0647 \u062f\u0631 \u0628\u0627\u0632\u06cc \u0639\u0628\u0627\u0631\u062a\u0646\u062f \u0627\u0632 \ud83d\udc09\u060c \u06a9\u0647 \ud83e\uddd9 \u0631\u0627 \u0634\u06a9\u0633\u062a \u0645\u06cc \u062f\u0647\u062f\u060c \u06a9\u0647 \ud83e\uddcc \u0631\u0627 \u0634\u06a9\u0633\u062a \u0645\u06cc \u062f\u0647\u062f\u060c \u06a9\u0647 \ud83d\udde1\ufe0f \u0631\u0627 \u0634\u06a9\u0633\u062a \u0645\u06cc \u062f\u0647\u062f. \u0628\u0627 \u0627\u06cc\u0646 \u062d\u0627\u0644\u060c \ud83d\udde1\ufe0f \u06cc\u06a9 \u0648\u0627\u062d\u062f \u0648\u06cc\u0698\u0647 \u0627\u0633\u062a \u0632\u06cc\u0631\u0627 \u062a\u0646\u0647\u0627 \u0648\u0627\u062d\u062f\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \ud83d\udc09 \u0631\u0627 \u0634\u06a9\u0633\u062a \u062f\u0647\u062f. \u0646\u0628\u0631\u062f\u0647\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u06cc\u06a9 zk-SNARK \u0627\u0646\u062c\u0627\u0645 \u0645\u06cc \u0634\u0648\u062f \u06a9\u0647 \u0646\u0648\u0639 \u0645\u0647\u0627\u062c\u0645 \u0631\u0627 \u0646\u0634\u0627\u0646 \u0645\u06cc \u062f\u0647\u062f \u0648 \u0628\u0647 \u062f\u0646\u0628\u0627\u0644 \u0622\u0646 zk-SNARK \u062f\u06cc\u06af\u0631\u06cc \u06a9\u0647 \u0646\u062a\u06cc\u062c\u0647 \u0646\u0628\u0631\u062f \u0631\u0627 \u0628\u062f\u0648\u0646 \u0645\u0634\u062e\u0635 \u06a9\u0631\u062f\u0646 \u0646\u0648\u0639 \u0648\u0627\u062d\u062f \u0645\u0648\u0631\u062f \u062d\u0645\u0644\u0647 \u0645\u062d\u0627\u0633\u0628\u0647 \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/media.dev.to\/cdn-cgi\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz2weou7eb9uo3y7dmmb5.png\" alt=\"\u0645\u0639\u0645\u0627\u0631\u06cc \u0628\u0627\u0632\u06cc\" loading=\"lazy\" width=\"800\" height=\"450\" title=\"\"><br \/><em>\u0645\u0639\u0645\u0627\u0631\u06cc \u0628\u0627\u0632\u06cc \u062a\u0645\u0627\u0645 \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u0639\u0645\u0648\u0645\u06cc \u0648 \u0645\u0646\u0637\u0642 \u0631\u0627 \u062f\u0631 MUD \u0642\u0631\u0627\u0631 \u0645\u06cc \u062f\u0647\u062f\u060c \u062f\u0631 \u062d\u0627\u0644\u06cc \u06a9\u0647 \u062a\u0645\u0627\u0645 \u062c\u0646\u0628\u0647 \u0647\u0627\u06cc \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 \u062d\u0631\u06cc\u0645 \u062e\u0635\u0648\u0635\u06cc \u062f\u0631 Circom \u0645\u062f\u06cc\u0631\u06cc\u062a \u0645\u06cc \u0634\u0648\u0646\u062f.<\/em><\/p>\n<h2><span class=\"ez-toc-section\" id=\"%DB%8C%DA%A9_%D9%BE%D8%B1%D9%88%DA%98%D9%87_MUD_%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF_%DA%A9%D9%86%DB%8C%D8%AF\"><\/span>\n<p>  \u06cc\u06a9 \u067e\u0631\u0648\u0698\u0647 MUD \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>pnpm create mud@latest tutorial\ncd tutorial\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"1_%D8%AF%D9%88%D9%84%D8%AA_%D8%B1%D8%A7_%D8%AA%D8%B9%D8%B1%DB%8C%D9%81_%DA%A9%D9%86%DB%8C%D8%AF\"><\/span>\n<p>  1. \u062f\u0648\u0644\u062a \u0631\u0627 \u062a\u0639\u0631\u06cc\u0641 \u06a9\u0646\u06cc\u062f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0645\u0648\u0642\u0639\u06cc\u062a \u0634\u062e\u0635\u06cc\u062a\u200c\u0647\u0627 \u062f\u0631 \u062c\u062f\u0627\u0648\u0644 MUD \u062a\u0639\u0631\u06cc\u0641 \u0634\u062f\u0647\u060c \u0639\u0645\u0648\u0645\u06cc \u0646\u06af\u0647 \u062f\u0627\u0634\u062a\u0647 \u0645\u06cc\u200c\u0634\u0648\u0646\u062f. \u0639\u0644\u0627\u0648\u0647 \u0628\u0631 \u0627\u06cc\u0646\u060c \u0645\u0642\u062f\u0627\u0631\u06cc ZK \u0627\u0636\u0627\u0641\u0647 \u0645\u06cc \u06a9\u0646\u06cc\u0645 <code>commitments<\/code> \u0628\u0631\u0627\u06cc \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u0627\u0632 \u0627\u06cc\u0646\u06a9\u0647 \u0647\u06cc\u0686 \u06a9\u0633 \u0646\u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u062a\u0642\u0644\u0628 \u06a9\u0646\u062f\u060c \u0627\u06cc\u0646 \u0628\u062e\u0634 \u062f\u0631 \u0628\u062e\u0634 ZK \u0622\u06cc\u0646\u062f\u0647 \u0645\u0639\u0646\u06cc \u0628\u06cc\u0634\u062a\u0631\u06cc \u062e\u0648\u0627\u0647\u062f \u062f\u0627\u0634\u062a.<\/p>\n<p><code>packages\/contracts\/mud.config.ts<\/code><\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">defineWorld<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">@latticexyz\/world<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"k\">default<\/span> <span class=\"nf\">defineWorld<\/span><span class=\"p\">({<\/span>\n  <span class=\"na\">namespace<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">app<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n  <span class=\"na\">enums<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n    <span class=\"na\">Direction<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span>\n      <span class=\"dl\">\"<\/span><span class=\"s2\">Up<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n      <span class=\"dl\">\"<\/span><span class=\"s2\">Down<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n      <span class=\"dl\">\"<\/span><span class=\"s2\">Left<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n      <span class=\"dl\">\"<\/span><span class=\"s2\">Right<\/span><span class=\"dl\">\"<\/span>\n    <span class=\"p\">]<\/span>\n  <span class=\"p\">},<\/span>\n  <span class=\"na\">tables<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n    <span class=\"na\">Character<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n      <span class=\"na\">schema<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n        <span class=\"na\">x<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">int32<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n        <span class=\"na\">y<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">int32<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n        <span class=\"na\">owner<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">address<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n        <span class=\"na\">id<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">uint32<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n        <span class=\"na\">attackedAt<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">uint32<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n        <span class=\"na\">attackedByValue<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">uint32<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n        <span class=\"na\">revealedValue<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">uint32<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n        <span class=\"na\">isDead<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">bool<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n      <span class=\"p\">},<\/span>\n      <span class=\"na\">key<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">x<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">y<\/span><span class=\"dl\">\"<\/span><span class=\"p\">]<\/span>\n    <span class=\"p\">},<\/span>\n    <span class=\"na\">PlayerPrivateState<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n      <span class=\"na\">schema<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n        <span class=\"na\">account<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">address<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n        <span class=\"na\">commitment<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">uint256<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n      <span class=\"p\">},<\/span>\n      <span class=\"na\">key<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">account<\/span><span class=\"dl\">\"<\/span><span class=\"p\">]<\/span>\n    <span class=\"p\">},<\/span>\n    <span class=\"na\">VerifierContracts<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n      <span class=\"na\">schema<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n        <span class=\"na\">revealContractAddress<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">address<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n        <span class=\"na\">defendContractAddress<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">address<\/span><span class=\"dl\">\"<\/span>\n      <span class=\"p\">},<\/span>\n      <span class=\"na\">key<\/span><span class=\"p\">:<\/span> <span class=\"p\">[],<\/span>\n    <span class=\"p\">},<\/span>\n  <span class=\"p\">},<\/span>\n<span class=\"p\">});<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"2_%D9%85%D8%AF%D8%A7%D8%B1%D9%87%D8%A7%DB%8C_%D8%B1%D8%B2%D9%85%DB%8C_%D8%B1%D8%A7_%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF_%DA%A9%D9%86%DB%8C%D8%AF\"><\/span>\n<p>  2. \u0645\u062f\u0627\u0631\u0647\u0627\u06cc \u0631\u0632\u0645\u06cc \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0645\u062f\u0627\u0631\u0647\u0627\u06cc \u0646\u0628\u0631\u062f \u0634\u0627\u0645\u0644 SNARK \u062d\u0645\u0644\u0647 \u0648 SNARK \u062f\u0641\u0627\u0639\u06cc \u0627\u0633\u062a.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"%D8%A7%D9%84%D9%81_%D8%A8%D9%87_SNARK_%D8%AD%D9%85%D9%84%D9%87_%DA%A9%D9%86%DB%8C%D8%AF\"><\/span>\n<p>  \u0627\u0644\u0641 \u0628\u0647 SNARK \u062d\u0645\u0644\u0647 \u06a9\u0646\u06cc\u062f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0648\u0642\u062a\u06cc \u06cc\u06a9 \u0634\u062e\u0635\u06cc\u062a \u062d\u0645\u0644\u0647 \u0645\u06cc \u06a9\u0646\u062f\u060c \u0646\u0648\u0639 \u062e\u0648\u062f \u0631\u0627 \u0622\u0634\u06a9\u0627\u0631 \u0645\u06cc \u06a9\u0646\u062f. \u0628\u0631\u0627\u06cc \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u0627\u0632 \u0627\u06cc\u0646\u06a9\u0647 \u0628\u0627\u0632\u06cc\u06a9\u0646 \u062a\u0642\u0644\u0628 \u0646\u0645\u06cc \u06a9\u0646\u062f\u060c \u06cc\u06a9 SNARK \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc \u06a9\u0646\u06cc\u0645 \u06a9\u0647 \u0627\u0646\u0648\u0627\u0639 \u0627\u0648\u0644\u06cc\u0647 \u062a\u0639\u0631\u06cc\u0641 \u0634\u062f\u0647 \u062a\u0648\u0633\u0637 \u0628\u0627\u0632\u06cc\u06a9\u0646 \u062f\u0631 \u0634\u0631\u0648\u0639 \u0628\u0627\u0632\u06cc \u0631\u0627 \u0647\u0634 \u0645\u06cc \u06a9\u0646\u062f. \u0645\u062f\u0627\u0631 \u062a\u0636\u0645\u06cc\u0646 \u0645\u06cc \u06a9\u0646\u062f \u06a9\u0647 \u0628\u0627\u0632\u06cc\u06a9\u0646 \u06cc\u06a9 \u06a9\u0627\u0631\u0627\u06a9\u062a\u0631 \u0627\u0632 \u0647\u0631 \u0646\u0648\u0639 \u0631\u0627 \u0627\u062e\u062a\u0635\u0627\u0635 \u062f\u0627\u062f\u0647 \u0627\u0633\u062a \u0648 \u0633\u067e\u0633 \u0647\u0645\u0647 \u0686\u06cc\u0632 \u0628\u0627 a \u0647\u0634 \u0645\u06cc \u0634\u0648\u062f <code>privateSalt<\/code>\u060c \u06a9\u0647 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u06cc\u06a9 \u06a9\u0644\u06cc\u062f \u062e\u0635\u0648\u0635\u06cc \u0639\u0645\u0644 \u0645\u06cc \u06a9\u0646\u062f \u0648 \u0627\u0632 \u062d\u0645\u0644\u0627\u062a brute-force \u062c\u0644\u0648\u06af\u06cc\u0631\u06cc \u0645\u06cc \u06a9\u0646\u062f \u062a\u0627 \u0648\u0636\u0639\u06cc\u062a \u0627\u0648\u0644\u06cc\u0647 \u0627\u06cc \u06a9\u0647 \u0628\u0627\u0632\u06cc\u06a9\u0646 \u0628\u0647 \u0622\u0646 \u0645\u062a\u0639\u0647\u062f \u0634\u062f\u0647 \u0627\u0633\u062a \u0631\u0627 \u0622\u0634\u06a9\u0627\u0631 \u06a9\u0646\u062f. \u0627\u06cc\u0646 \u0647\u0634 a \u0646\u0627\u0645\u06cc\u062f\u0647 \u0645\u06cc \u0634\u0648\u062f <code>commitment<\/code>\u060c \u06a9\u0647 \u062f\u0631 \u06cc\u06a9 \u062c\u062f\u0648\u0644 MUD \u0630\u062e\u06cc\u0631\u0647 \u0645\u06cc \u0634\u0648\u062f \u06a9\u0647 \u0628\u0647 \u062a\u0623\u06cc\u06cc\u062f \u0627\u06cc\u0646\u06a9\u0647 \u0647\u0645\u0647 \u0686\u06cc\u0632 \u0628\u0647 \u062f\u0631\u0633\u062a\u06cc \u0627\u062a\u0641\u0627\u0642 \u0627\u0641\u062a\u0627\u062f\u0647 \u0627\u0633\u062a \u06a9\u0645\u06a9 \u0645\u06cc \u06a9\u0646\u062f. \u062c\u0632\u0626\u06cc\u0627\u062a \u0628\u06cc\u0634\u062a\u0631 \u062f\u0631 \u0627\u06cc\u0646 \u0645\u0648\u0631\u062f \u062f\u0631 \u0628\u062e\u0634 \u0642\u0631\u0627\u0631\u062f\u0627\u062f\u0647\u0627\u06cc \u0632\u06cc\u0631 \u067e\u0648\u0634\u0634 \u062f\u0627\u062f\u0647 \u062e\u0648\u0627\u0647\u062f \u0634\u062f.<\/p>\n<p><code>packages\/zk\/circuits\/reveal\/reveal.circom<\/code><\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight cpp\"><code><span class=\"n\">pragma<\/span> <span class=\"n\">circom<\/span> <span class=\"mf\">2.0.0<\/span><span class=\"p\">;<\/span>\n\n<span class=\"n\">include<\/span> <span class=\"s\">\"..\/circomlib\/circuits\/poseidon.circom\"<\/span><span class=\"p\">;<\/span>\n<span class=\"n\">include<\/span> <span class=\"s\">\"..\/circomlib\/circuits\/comparators.circom\"<\/span><span class=\"p\">;<\/span>\n\n<span class=\"k\">template<\/span> <span class=\"nf\">spawn<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n    <span class=\"c1\">\/\/ Input signals<\/span>\n    <span class=\"n\">signal<\/span> <span class=\"n\">input<\/span> <span class=\"n\">character1<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">signal<\/span> <span class=\"n\">input<\/span> <span class=\"n\">character2<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">signal<\/span> <span class=\"n\">input<\/span> <span class=\"n\">character3<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">signal<\/span> <span class=\"n\">input<\/span> <span class=\"n\">character4<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">signal<\/span> <span class=\"n\">input<\/span> <span class=\"n\">privateSalt<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">signal<\/span> <span class=\"n\">input<\/span> <span class=\"n\">characterReveal<\/span><span class=\"p\">;<\/span> <span class=\"c1\">\/\/ The character index to reveal (1, 2, 3, or 4)<\/span>\n    <span class=\"n\">signal<\/span> <span class=\"n\">input<\/span> <span class=\"n\">valueReveal<\/span><span class=\"p\">;<\/span> <span class=\"c1\">\/\/ The value that is claimed to be assigned to the character<\/span>\n\n    <span class=\"c1\">\/\/ Output signal for the hash<\/span>\n    <span class=\"n\">signal<\/span> <span class=\"n\">output<\/span> <span class=\"n\">hash<\/span><span class=\"p\">;<\/span>\n\n    <span class=\"c1\">\/\/ Poseidon hash calculation<\/span>\n    <span class=\"n\">component<\/span> <span class=\"n\">poseidonComponent<\/span> <span class=\"o\">=<\/span> <span class=\"n\">Poseidon<\/span><span class=\"p\">(<\/span><span class=\"mi\">5<\/span><span class=\"p\">);<\/span>\n    <span class=\"n\">poseidonComponent<\/span><span class=\"p\">.<\/span><span class=\"n\">inputs<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]<\/span> <span class=\"o\"> <span class=\"n\">character1<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">poseidonComponent<\/span><span class=\"p\">.<\/span><span class=\"n\">inputs<\/span><span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">]<\/span> <span class=\"o\"> <span class=\"n\">character2<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">poseidonComponent<\/span><span class=\"p\">.<\/span><span class=\"n\">inputs<\/span><span class=\"p\">[<\/span><span class=\"mi\">2<\/span><span class=\"p\">]<\/span> <span class=\"o\"> <span class=\"n\">character3<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">poseidonComponent<\/span><span class=\"p\">.<\/span><span class=\"n\">inputs<\/span><span class=\"p\">[<\/span><span class=\"mi\">3<\/span><span class=\"p\">]<\/span> <span class=\"o\"> <span class=\"n\">character4<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">poseidonComponent<\/span><span class=\"p\">.<\/span><span class=\"n\">inputs<\/span><span class=\"p\">[<\/span><span class=\"mi\">4<\/span><span class=\"p\">]<\/span> <span class=\"o\"> <span class=\"n\">privateSalt<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">hash<\/span> <span class=\"o\"> <span class=\"n\">poseidonComponent<\/span><span class=\"p\">.<\/span><span class=\"n\">out<\/span><span class=\"p\">;<\/span>\n\n    <span class=\"c1\">\/\/ Comparator components for character reveal verification<\/span>\n    <span class=\"n\">component<\/span> <span class=\"n\">isChar1<\/span> <span class=\"o\">=<\/span> <span class=\"n\">IsEqual<\/span><span class=\"p\">();<\/span>\n    <span class=\"n\">component<\/span> <span class=\"n\">isChar2<\/span> <span class=\"o\">=<\/span> <span class=\"n\">IsEqual<\/span><span class=\"p\">();<\/span>\n    <span class=\"n\">component<\/span> <span class=\"n\">isChar3<\/span> <span class=\"o\">=<\/span> <span class=\"n\">IsEqual<\/span><span class=\"p\">();<\/span>\n    <span class=\"n\">component<\/span> <span class=\"n\">isChar4<\/span> <span class=\"o\">=<\/span> <span class=\"n\">IsEqual<\/span><span class=\"p\">();<\/span>\n    <span class=\"n\">isChar1<\/span><span class=\"p\">.<\/span><span class=\"n\">in<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]<\/span> <span class=\"o\"> <span class=\"n\">characterReveal<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">isChar1<\/span><span class=\"p\">.<\/span><span class=\"n\">in<\/span><span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">]<\/span> <span class=\"o\"> <span class=\"mi\">1<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">isChar2<\/span><span class=\"p\">.<\/span><span class=\"n\">in<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]<\/span> <span class=\"o\"> <span class=\"n\">characterReveal<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">isChar2<\/span><span class=\"p\">.<\/span><span class=\"n\">in<\/span><span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">]<\/span> <span class=\"o\"> <span class=\"mi\">2<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">isChar3<\/span><span class=\"p\">.<\/span><span class=\"n\">in<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]<\/span> <span class=\"o\"> <span class=\"n\">characterReveal<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">isChar3<\/span><span class=\"p\">.<\/span><span class=\"n\">in<\/span><span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">]<\/span> <span class=\"o\"> <span class=\"mi\">3<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">isChar4<\/span><span class=\"p\">.<\/span><span class=\"n\">in<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]<\/span> <span class=\"o\"> <span class=\"n\">characterReveal<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">isChar4<\/span><span class=\"p\">.<\/span><span class=\"n\">in<\/span><span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">]<\/span> <span class=\"o\"> <span class=\"mi\">4<\/span><span class=\"p\">;<\/span>\n\n    <span class=\"c1\">\/\/ Value check depending on the revealed character<\/span>\n    <span class=\"n\">component<\/span> <span class=\"n\">checkChar1<\/span> <span class=\"o\">=<\/span> <span class=\"n\">IsEqual<\/span><span class=\"p\">();<\/span>\n    <span class=\"n\">component<\/span> <span class=\"n\">checkChar2<\/span> <span class=\"o\">=<\/span> <span class=\"n\">IsEqual<\/span><span class=\"p\">();<\/span>\n    <span class=\"n\">component<\/span> <span class=\"n\">checkChar3<\/span> <span class=\"o\">=<\/span> <span class=\"n\">IsEqual<\/span><span class=\"p\">();<\/span>\n    <span class=\"n\">component<\/span> <span class=\"n\">checkChar4<\/span> <span class=\"o\">=<\/span> <span class=\"n\">IsEqual<\/span><span class=\"p\">();<\/span>\n\n    <span class=\"n\">checkChar1<\/span><span class=\"p\">.<\/span><span class=\"n\">in<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]<\/span> <span class=\"o\"> <span class=\"n\">isChar1<\/span><span class=\"p\">.<\/span><span class=\"n\">out<\/span> <span class=\"o\">*<\/span> <span class=\"n\">character1<\/span> <span class=\"o\">+<\/span> <span class=\"p\">(<\/span><span class=\"mi\">1<\/span> <span class=\"o\">-<\/span> <span class=\"n\">isChar1<\/span><span class=\"p\">.<\/span><span class=\"n\">out<\/span><span class=\"p\">)<\/span> <span class=\"o\">*<\/span> <span class=\"mi\">0<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">checkChar1<\/span><span class=\"p\">.<\/span><span class=\"n\">in<\/span><span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">]<\/span> <span class=\"o\"> <span class=\"n\">valueReveal<\/span><span class=\"p\">;<\/span>\n\n    <span class=\"n\">checkChar2<\/span><span class=\"p\">.<\/span><span class=\"n\">in<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]<\/span> <span class=\"o\"> <span class=\"n\">isChar2<\/span><span class=\"p\">.<\/span><span class=\"n\">out<\/span> <span class=\"o\">*<\/span> <span class=\"n\">character2<\/span> <span class=\"o\">+<\/span> <span class=\"p\">(<\/span><span class=\"mi\">1<\/span> <span class=\"o\">-<\/span> <span class=\"n\">isChar2<\/span><span class=\"p\">.<\/span><span class=\"n\">out<\/span><span class=\"p\">)<\/span> <span class=\"o\">*<\/span> <span class=\"mi\">0<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">checkChar2<\/span><span class=\"p\">.<\/span><span class=\"n\">in<\/span><span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">]<\/span> <span class=\"o\"> <span class=\"n\">valueReveal<\/span><span class=\"p\">;<\/span>\n\n    <span class=\"n\">checkChar3<\/span><span class=\"p\">.<\/span><span class=\"n\">in<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]<\/span> <span class=\"o\"> <span class=\"n\">isChar3<\/span><span class=\"p\">.<\/span><span class=\"n\">out<\/span> <span class=\"o\">*<\/span> <span class=\"n\">character3<\/span> <span class=\"o\">+<\/span> <span class=\"p\">(<\/span><span class=\"mi\">1<\/span> <span class=\"o\">-<\/span> <span class=\"n\">isChar3<\/span><span class=\"p\">.<\/span><span class=\"n\">out<\/span><span class=\"p\">)<\/span> <span class=\"o\">*<\/span> <span class=\"mi\">0<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">checkChar3<\/span><span class=\"p\">.<\/span><span class=\"n\">in<\/span><span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">]<\/span> <span class=\"o\"> <span class=\"n\">valueReveal<\/span><span class=\"p\">;<\/span>\n\n    <span class=\"n\">checkChar4<\/span><span class=\"p\">.<\/span><span class=\"n\">in<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]<\/span> <span class=\"o\"> <span class=\"n\">isChar4<\/span><span class=\"p\">.<\/span><span class=\"n\">out<\/span> <span class=\"o\">*<\/span> <span class=\"n\">character4<\/span> <span class=\"o\">+<\/span> <span class=\"p\">(<\/span><span class=\"mi\">1<\/span> <span class=\"o\">-<\/span> <span class=\"n\">isChar4<\/span><span class=\"p\">.<\/span><span class=\"n\">out<\/span><span class=\"p\">)<\/span> <span class=\"o\">*<\/span> <span class=\"mi\">0<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">checkChar4<\/span><span class=\"p\">.<\/span><span class=\"n\">in<\/span><span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">]<\/span> <span class=\"o\"> <span class=\"n\">valueReveal<\/span><span class=\"p\">;<\/span>\n\n    <span class=\"n\">signal<\/span> <span class=\"n\">validReveal1<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">signal<\/span> <span class=\"n\">validReveal2<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">signal<\/span> <span class=\"n\">validReveal3<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">signal<\/span> <span class=\"n\">validReveal4<\/span><span class=\"p\">;<\/span>\n\n    <span class=\"n\">validReveal1<\/span> <span class=\"o\"> <span class=\"n\">checkChar1<\/span><span class=\"p\">.<\/span><span class=\"n\">out<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">validReveal2<\/span> <span class=\"o\"> <span class=\"n\">checkChar2<\/span><span class=\"p\">.<\/span><span class=\"n\">out<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">validReveal3<\/span> <span class=\"o\"> <span class=\"n\">checkChar3<\/span><span class=\"p\">.<\/span><span class=\"n\">out<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">validReveal4<\/span> <span class=\"o\"> <span class=\"n\">checkChar4<\/span><span class=\"p\">.<\/span><span class=\"n\">out<\/span><span class=\"p\">;<\/span>\n\n    <span class=\"n\">signal<\/span> <span class=\"n\">validReveal<\/span> <span class=\"o\"> <span class=\"n\">validReveal1<\/span> <span class=\"o\">+<\/span> <span class=\"n\">validReveal2<\/span> <span class=\"o\">+<\/span> <span class=\"n\">validReveal3<\/span> <span class=\"o\">+<\/span> <span class=\"n\">validReveal4<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">validReveal<\/span> <span class=\"o\">===<\/span> <span class=\"mi\">1<\/span><span class=\"p\">;<\/span>\n\n    <span class=\"c1\">\/\/ Comparators to check for presence of values 1, 2, 3, 4<\/span>\n    <span class=\"n\">component<\/span> <span class=\"n\">isOne1<\/span> <span class=\"o\">=<\/span> <span class=\"n\">IsEqual<\/span><span class=\"p\">();<\/span>\n    <span class=\"n\">component<\/span> <span class=\"n\">isOne2<\/span> <span class=\"o\">=<\/span> <span class=\"n\">IsEqual<\/span><span class=\"p\">();<\/span>\n    <span class=\"n\">component<\/span> <span class=\"n\">isOne3<\/span> <span class=\"o\">=<\/span> <span class=\"n\">IsEqual<\/span><span class=\"p\">();<\/span>\n    <span class=\"n\">component<\/span> <span class=\"n\">isOne4<\/span> <span class=\"o\">=<\/span> <span class=\"n\">IsEqual<\/span><span class=\"p\">();<\/span>\n    <span class=\"n\">isOne1<\/span><span class=\"p\">.<\/span><span class=\"n\">in<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]<\/span> <span class=\"o\"> <span class=\"n\">character1<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">isOne1<\/span><span class=\"p\">.<\/span><span class=\"n\">in<\/span><span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">]<\/span> <span class=\"o\"> <span class=\"mi\">1<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">isOne2<\/span><span class=\"p\">.<\/span><span class=\"n\">in<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]<\/span> <span class=\"o\"> <span class=\"n\">character2<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">isOne2<\/span><span class=\"p\">.<\/span><span class=\"n\">in<\/span><span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">]<\/span> <span class=\"o\"> <span class=\"mi\">1<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">isOne3<\/span><span class=\"p\">.<\/span><span class=\"n\">in<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]<\/span> <span class=\"o\"> <span class=\"n\">character3<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">isOne3<\/span><span class=\"p\">.<\/span><span class=\"n\">in<\/span><span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">]<\/span> <span class=\"o\"> <span class=\"mi\">1<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">isOne4<\/span><span class=\"p\">.<\/span><span class=\"n\">in<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]<\/span> <span class=\"o\"> <span class=\"n\">character4<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">isOne4<\/span><span class=\"p\">.<\/span><span class=\"n\">in<\/span><span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">]<\/span> <span class=\"o\"> <span class=\"mi\">1<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">signal<\/span> <span class=\"n\">oneExists<\/span> <span class=\"o\"> <span class=\"n\">isOne1<\/span><span class=\"p\">.<\/span><span class=\"n\">out<\/span> <span class=\"o\">+<\/span> <span class=\"n\">isOne2<\/span><span class=\"p\">.<\/span><span class=\"n\">out<\/span> <span class=\"o\">+<\/span> <span class=\"n\">isOne3<\/span><span class=\"p\">.<\/span><span class=\"n\">out<\/span> <span class=\"o\">+<\/span> <span class=\"n\">isOne4<\/span><span class=\"p\">.<\/span><span class=\"n\">out<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">oneExists<\/span> <span class=\"o\">===<\/span> <span class=\"mi\">1<\/span><span class=\"p\">;<\/span>\n\n    <span class=\"n\">component<\/span> <span class=\"n\">isTwo1<\/span> <span class=\"o\">=<\/span> <span class=\"n\">IsEqual<\/span><span class=\"p\">();<\/span>\n    <span class=\"n\">component<\/span> <span class=\"n\">isTwo2<\/span> <span class=\"o\">=<\/span> <span class=\"n\">IsEqual<\/span><span class=\"p\">();<\/span>\n    <span class=\"n\">component<\/span> <span class=\"n\">isTwo3<\/span> <span class=\"o\">=<\/span> <span class=\"n\">IsEqual<\/span><span class=\"p\">();<\/span>\n    <span class=\"n\">component<\/span> <span class=\"n\">isTwo4<\/span> <span class=\"o\">=<\/span> <span class=\"n\">IsEqual<\/span><span class=\"p\">();<\/span>\n    <span class=\"n\">isTwo1<\/span><span class=\"p\">.<\/span><span class=\"n\">in<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]<\/span> <span class=\"o\"> <span class=\"n\">character1<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">isTwo1<\/span><span class=\"p\">.<\/span><span class=\"n\">in<\/span><span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">]<\/span> <span class=\"o\"> <span class=\"mi\">2<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">isTwo2<\/span><span class=\"p\">.<\/span><span class=\"n\">in<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]<\/span> <span class=\"o\"> <span class=\"n\">character2<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">isTwo2<\/span><span class=\"p\">.<\/span><span class=\"n\">in<\/span><span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">]<\/span> <span class=\"o\"> <span class=\"mi\">2<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">isTwo3<\/span><span class=\"p\">.<\/span><span class=\"n\">in<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]<\/span> <span class=\"o\"> <span class=\"n\">character3<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">isTwo3<\/span><span class=\"p\">.<\/span><span class=\"n\">in<\/span><span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">]<\/span> <span class=\"o\"> <span class=\"mi\">2<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">isTwo4<\/span><span class=\"p\">.<\/span><span class=\"n\">in<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]<\/span> <span class=\"o\"> <span class=\"n\">character4<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">isTwo4<\/span><span class=\"p\">.<\/span><span class=\"n\">in<\/span><span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">]<\/span> <span class=\"o\"> <span class=\"mi\">2<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">signal<\/span> <span class=\"n\">twoExists<\/span> <span class=\"o\"> <span class=\"n\">isTwo1<\/span><span class=\"p\">.<\/span><span class=\"n\">out<\/span> <span class=\"o\">+<\/span> <span class=\"n\">isTwo2<\/span><span class=\"p\">.<\/span><span class=\"n\">out<\/span> <span class=\"o\">+<\/span> <span class=\"n\">isTwo3<\/span><span class=\"p\">.<\/span><span class=\"n\">out<\/span> <span class=\"o\">+<\/span> <span class=\"n\">isTwo4<\/span><span class=\"p\">.<\/span><span class=\"n\">out<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">twoExists<\/span> <span class=\"o\">===<\/span> <span class=\"mi\">1<\/span><span class=\"p\">;<\/span>\n\n    <span class=\"n\">component<\/span> <span class=\"n\">isThree1<\/span> <span class=\"o\">=<\/span> <span class=\"n\">IsEqual<\/span><span class=\"p\">();<\/span>\n    <span class=\"n\">component<\/span> <span class=\"n\">isThree2<\/span> <span class=\"o\">=<\/span> <span class=\"n\">IsEqual<\/span><span class=\"p\">();<\/span>\n    <span class=\"n\">component<\/span> <span class=\"n\">isThree3<\/span> <span class=\"o\">=<\/span> <span class=\"n\">IsEqual<\/span><span class=\"p\">();<\/span>\n    <span class=\"n\">component<\/span> <span class=\"n\">isThree4<\/span> <span class=\"o\">=<\/span> <span class=\"n\">IsEqual<\/span><span class=\"p\">();<\/span>\n    <span class=\"n\">isThree1<\/span><span class=\"p\">.<\/span><span class=\"n\">in<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]<\/span> <span class=\"o\"> <span class=\"n\">character1<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">isThree1<\/span><span class=\"p\">.<\/span><span class=\"n\">in<\/span><span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">]<\/span> <span class=\"o\"> <span class=\"mi\">3<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">isThree2<\/span><span class=\"p\">.<\/span><span class=\"n\">in<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]<\/span> <span class=\"o\"> <span class=\"n\">character2<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">isThree2<\/span><span class=\"p\">.<\/span><span class=\"n\">in<\/span><span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">]<\/span> <span class=\"o\"> <span class=\"mi\">3<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">isThree3<\/span><span class=\"p\">.<\/span><span class=\"n\">in<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]<\/span> <span class=\"o\"> <span class=\"n\">character3<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">isThree3<\/span><span class=\"p\">.<\/span><span class=\"n\">in<\/span><span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">]<\/span> <span class=\"o\"> <span class=\"mi\">3<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">isThree4<\/span><span class=\"p\">.<\/span><span class=\"n\">in<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]<\/span> <span class=\"o\"> <span class=\"n\">character4<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">isThree4<\/span><span class=\"p\">.<\/span><span class=\"n\">in<\/span><span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">]<\/span> <span class=\"o\"> <span class=\"mi\">3<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">signal<\/span> <span class=\"n\">threeExists<\/span> <span class=\"o\"> <span class=\"n\">isThree1<\/span><span class=\"p\">.<\/span><span class=\"n\">out<\/span> <span class=\"o\">+<\/span> <span class=\"n\">isThree2<\/span><span class=\"p\">.<\/span><span class=\"n\">out<\/span> <span class=\"o\">+<\/span> <span class=\"n\">isThree3<\/span><span class=\"p\">.<\/span><span class=\"n\">out<\/span> <span class=\"o\">+<\/span> <span class=\"n\">isThree4<\/span><span class=\"p\">.<\/span><span class=\"n\">out<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">threeExists<\/span> <span class=\"o\">===<\/span> <span class=\"mi\">1<\/span><span class=\"p\">;<\/span>\n\n    <span class=\"n\">component<\/span> <span class=\"n\">isFour1<\/span> <span class=\"o\">=<\/span> <span class=\"n\">IsEqual<\/span><span class=\"p\">();<\/span>\n    <span class=\"n\">component<\/span> <span class=\"n\">isFour2<\/span> <span class=\"o\">=<\/span> <span class=\"n\">IsEqual<\/span><span class=\"p\">();<\/span>\n    <span class=\"n\">component<\/span> <span class=\"n\">isFour3<\/span> <span class=\"o\">=<\/span> <span class=\"n\">IsEqual<\/span><span class=\"p\">();<\/span>\n    <span class=\"n\">component<\/span> <span class=\"n\">isFour4<\/span> <span class=\"o\">=<\/span> <span class=\"n\">IsEqual<\/span><span class=\"p\">();<\/span>\n    <span class=\"n\">isFour1<\/span><span class=\"p\">.<\/span><span class=\"n\">in<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]<\/span> <span class=\"o\"> <span class=\"n\">character1<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">isFour1<\/span><span class=\"p\">.<\/span><span class=\"n\">in<\/span><span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">]<\/span> <span class=\"o\"> <span class=\"mi\">4<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">isFour2<\/span><span class=\"p\">.<\/span><span class=\"n\">in<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]<\/span> <span class=\"o\"> <span class=\"n\">character2<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">isFour2<\/span><span class=\"p\">.<\/span><span class=\"n\">in<\/span><span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">]<\/span> <span class=\"o\"> <span class=\"mi\">4<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">isFour3<\/span><span class=\"p\">.<\/span><span class=\"n\">in<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]<\/span> <span class=\"o\"> <span class=\"n\">character3<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">isFour3<\/span><span class=\"p\">.<\/span><span class=\"n\">in<\/span><span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">]<\/span> <span class=\"o\"> <span class=\"mi\">4<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">isFour4<\/span><span class=\"p\">.<\/span><span class=\"n\">in<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]<\/span> <span class=\"o\"> <span class=\"n\">character4<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">isFour4<\/span><span class=\"p\">.<\/span><span class=\"n\">in<\/span><span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">]<\/span> <span class=\"o\"> <span class=\"mi\">4<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">signal<\/span> <span class=\"n\">fourExists<\/span> <span class=\"o\"> <span class=\"n\">isFour1<\/span><span class=\"p\">.<\/span><span class=\"n\">out<\/span> <span class=\"o\">+<\/span> <span class=\"n\">isFour2<\/span><span class=\"p\">.<\/span><span class=\"n\">out<\/span> <span class=\"o\">+<\/span> <span class=\"n\">isFour3<\/span><span class=\"p\">.<\/span><span class=\"n\">out<\/span> <span class=\"o\">+<\/span> <span class=\"n\">isFour4<\/span><span class=\"p\">.<\/span><span class=\"n\">out<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">fourExists<\/span> <span class=\"o\">===<\/span> <span class=\"mi\">1<\/span><span class=\"p\">;<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"n\">component<\/span> <span class=\"n\">main<\/span> <span class=\"p\">{<\/span><span class=\"k\">public<\/span> <span class=\"p\">[<\/span><span class=\"n\">characterReveal<\/span><span class=\"p\">,<\/span> <span class=\"n\">valueReveal<\/span><span class=\"p\">]}<\/span> <span class=\"o\">=<\/span> <span class=\"n\">spawn<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h3><span class=\"ez-toc-section\" id=\"%D8%A8_SNARK_%D8%AF%D9%81%D8%A7%D8%B9%DB%8C\"><\/span>\n<p>  \u0628 SNARK \u062f\u0641\u0627\u0639\u06cc<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0647\u0646\u06af\u0627\u0645\u06cc \u06a9\u0647 \u06cc\u06a9 \u0634\u062e\u0635\u06cc\u062a \u0645\u0648\u0631\u062f \u062d\u0645\u0644\u0647 \u0642\u0631\u0627\u0631 \u0645\u06cc \u06af\u06cc\u0631\u062f\u060c \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a\u06cc \u0645\u06cc \u0634\u0648\u062f \u06a9\u0647 \u0646\u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u062d\u0631\u06a9\u062a \u06a9\u0646\u062f \u06cc\u0627 \u062d\u0645\u0644\u0647 \u06a9\u0646\u062f. \u0628\u0631\u0627\u06cc \u062e\u0631\u0648\u062c \u0627\u0632 \u0627\u06cc\u0646 \u062d\u0627\u0644\u062a\u060c \u0634\u062e\u0635\u06cc\u062a \u0628\u0627\u06cc\u062f \u06cc\u06a9 SNARK \u0627\u0631\u0627\u0626\u0647 \u06a9\u0646\u062f \u06a9\u0647 \u062b\u0627\u0628\u062a \u06a9\u0646\u062f \u062f\u0641\u0627\u0639\u0634 \u0645\u0648\u0641\u0642 \u0628\u0648\u062f\u0647 \u0627\u0633\u062a \u0628\u062f\u0648\u0646 \u0627\u06cc\u0646\u06a9\u0647 \u0646\u0648\u0639 \u0622\u0646 \u0645\u0634\u062e\u0635 \u0634\u0648\u062f. \u0627\u06cc\u0646 \u0627\u0632 \u0637\u0631\u06cc\u0642 \u0645\u062f\u0627\u0631\u06cc \u0628\u0647 \u062f\u0633\u062a \u0645\u06cc \u0622\u06cc\u062f \u06a9\u0647 \u062f\u0641\u0627\u0639 \u0631\u0627 \u0628\u0631 \u0627\u0633\u0627\u0633 \u0646\u0648\u0639 \u0639\u0645\u0648\u0645\u06cc \u0645\u0647\u0627\u062c\u0645 \u0648 \u0646\u0648\u0639 \u062e\u0635\u0648\u0635\u06cc \u0645\u062f\u0627\u0641\u0639 \u062a\u0623\u06cc\u06cc\u062f \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p><code>packages\/zk\/circuits\/defend\/defend.circom<\/code><\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight cpp\"><code><span class=\"n\">pragma<\/span> <span class=\"n\">circom<\/span> <span class=\"mf\">2.0.0<\/span><span class=\"p\">;<\/span>\n\n<span class=\"n\">include<\/span> <span class=\"s\">\"..\/circomlib\/circuits\/poseidon.circom\"<\/span><span class=\"p\">;<\/span>\n<span class=\"n\">include<\/span> <span class=\"s\">\"..\/circomlib\/circuits\/comparators.circom\"<\/span><span class=\"p\">;<\/span>\n\n<span class=\"k\">template<\/span> <span class=\"nf\">CharacterBattleCheck<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n    <span class=\"c1\">\/\/ Input signals<\/span>\n    <span class=\"n\">signal<\/span> <span class=\"n\">input<\/span> <span class=\"n\">character1<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">signal<\/span> <span class=\"n\">input<\/span> <span class=\"n\">character2<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">signal<\/span> <span class=\"n\">input<\/span> <span class=\"n\">character3<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">signal<\/span> <span class=\"n\">input<\/span> <span class=\"n\">character4<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">signal<\/span> <span class=\"n\">input<\/span> <span class=\"n\">privateSalt<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">signal<\/span> <span class=\"n\">input<\/span> <span class=\"n\">characterTarget<\/span><span class=\"p\">;<\/span> <span class=\"c1\">\/\/ 1-based index: 1 for character1, 2 for character2, etc.<\/span>\n    <span class=\"n\">signal<\/span> <span class=\"n\">input<\/span> <span class=\"n\">attackerLevel<\/span><span class=\"p\">;<\/span>\n\n    <span class=\"c1\">\/\/ Output signal for the hash<\/span>\n    <span class=\"n\">signal<\/span> <span class=\"n\">output<\/span> <span class=\"n\">hash<\/span><span class=\"p\">;<\/span>\n\n    <span class=\"c1\">\/\/ Output signal for the battle result<\/span>\n    <span class=\"n\">signal<\/span> <span class=\"n\">output<\/span> <span class=\"n\">battleResult<\/span><span class=\"p\">;<\/span>\n\n    <span class=\"c1\">\/\/ Poseidon hash calculation<\/span>\n    <span class=\"n\">component<\/span> <span class=\"n\">poseidonComponent<\/span> <span class=\"o\">=<\/span> <span class=\"n\">Poseidon<\/span><span class=\"p\">(<\/span><span class=\"mi\">5<\/span><span class=\"p\">);<\/span>\n    <span class=\"n\">poseidonComponent<\/span><span class=\"p\">.<\/span><span class=\"n\">inputs<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]<\/span> <span class=\"o\"> <span class=\"n\">character1<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">poseidonComponent<\/span><span class=\"p\">.<\/span><span class=\"n\">inputs<\/span><span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">]<\/span> <span class=\"o\"> <span class=\"n\">character2<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">poseidonComponent<\/span><span class=\"p\">.<\/span><span class=\"n\">inputs<\/span><span class=\"p\">[<\/span><span class=\"mi\">2<\/span><span class=\"p\">]<\/span> <span class=\"o\"> <span class=\"n\">character3<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">poseidonComponent<\/span><span class=\"p\">.<\/span><span class=\"n\">inputs<\/span><span class=\"p\">[<\/span><span class=\"mi\">3<\/span><span class=\"p\">]<\/span> <span class=\"o\"> <span class=\"n\">character4<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">poseidonComponent<\/span><span class=\"p\">.<\/span><span class=\"n\">inputs<\/span><span class=\"p\">[<\/span><span class=\"mi\">4<\/span><span class=\"p\">]<\/span> <span class=\"o\"> <span class=\"n\">privateSalt<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">hash<\/span> <span class=\"o\"> <span class=\"n\">poseidonComponent<\/span><span class=\"p\">.<\/span><span class=\"n\">out<\/span><span class=\"p\">;<\/span>\n\n    <span class=\"c1\">\/\/ Create binary indicators for each target<\/span>\n    <span class=\"n\">signal<\/span> <span class=\"n\">isTarget1<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">signal<\/span> <span class=\"n\">isTarget2<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">signal<\/span> <span class=\"n\">isTarget3<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">signal<\/span> <span class=\"n\">isTarget4<\/span><span class=\"p\">;<\/span>\n\n    <span class=\"c1\">\/\/ Check if characterTarget matches 1, 2, 3, or 4<\/span>\n    <span class=\"n\">component<\/span> <span class=\"n\">isTarget1Eq<\/span> <span class=\"o\">=<\/span> <span class=\"n\">IsEqual<\/span><span class=\"p\">();<\/span>\n    <span class=\"n\">isTarget1Eq<\/span><span class=\"p\">.<\/span><span class=\"n\">in<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]<\/span> <span class=\"o\"> <span class=\"n\">characterTarget<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">isTarget1Eq<\/span><span class=\"p\">.<\/span><span class=\"n\">in<\/span><span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">]<\/span> <span class=\"o\"> <span class=\"mi\">1<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">isTarget1<\/span> <span class=\"o\"> <span class=\"n\">isTarget1Eq<\/span><span class=\"p\">.<\/span><span class=\"n\">out<\/span><span class=\"p\">;<\/span>\n\n    <span class=\"n\">component<\/span> <span class=\"n\">isTarget2Eq<\/span> <span class=\"o\">=<\/span> <span class=\"n\">IsEqual<\/span><span class=\"p\">();<\/span>\n    <span class=\"n\">isTarget2Eq<\/span><span class=\"p\">.<\/span><span class=\"n\">in<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]<\/span> <span class=\"o\"> <span class=\"n\">characterTarget<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">isTarget2Eq<\/span><span class=\"p\">.<\/span><span class=\"n\">in<\/span><span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">]<\/span> <span class=\"o\"> <span class=\"mi\">2<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">isTarget2<\/span> <span class=\"o\"> <span class=\"n\">isTarget2Eq<\/span><span class=\"p\">.<\/span><span class=\"n\">out<\/span><span class=\"p\">;<\/span>\n\n    <span class=\"n\">component<\/span> <span class=\"n\">isTarget3Eq<\/span> <span class=\"o\">=<\/span> <span class=\"n\">IsEqual<\/span><span class=\"p\">();<\/span>\n    <span class=\"n\">isTarget3Eq<\/span><span class=\"p\">.<\/span><span class=\"n\">in<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]<\/span> <span class=\"o\"> <span class=\"n\">characterTarget<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">isTarget3Eq<\/span><span class=\"p\">.<\/span><span class=\"n\">in<\/span><span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">]<\/span> <span class=\"o\"> <span class=\"mi\">3<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">isTarget3<\/span> <span class=\"o\"> <span class=\"n\">isTarget3Eq<\/span><span class=\"p\">.<\/span><span class=\"n\">out<\/span><span class=\"p\">;<\/span>\n\n    <span class=\"n\">component<\/span> <span class=\"n\">isTarget4Eq<\/span> <span class=\"o\">=<\/span> <span class=\"n\">IsEqual<\/span><span class=\"p\">();<\/span>\n    <span class=\"n\">isTarget4Eq<\/span><span class=\"p\">.<\/span><span class=\"n\">in<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]<\/span> <span class=\"o\"> <span class=\"n\">characterTarget<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">isTarget4Eq<\/span><span class=\"p\">.<\/span><span class=\"n\">in<\/span><span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">]<\/span> <span class=\"o\"> <span class=\"mi\">4<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">isTarget4<\/span> <span class=\"o\"> <span class=\"n\">isTarget4Eq<\/span><span class=\"p\">.<\/span><span class=\"n\">out<\/span><span class=\"p\">;<\/span>\n\n    <span class=\"c1\">\/\/ Ensure exactly one of the targets is selected<\/span>\n    <span class=\"n\">signal<\/span> <span class=\"n\">sumTargets<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">sumTargets<\/span> <span class=\"o\"> <span class=\"n\">isTarget1<\/span> <span class=\"o\">+<\/span> <span class=\"n\">isTarget2<\/span> <span class=\"o\">+<\/span> <span class=\"n\">isTarget3<\/span> <span class=\"o\">+<\/span> <span class=\"n\">isTarget4<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">sumTargets<\/span> <span class=\"o\">===<\/span> <span class=\"mi\">1<\/span><span class=\"p\">;<\/span>\n\n    <span class=\"c1\">\/\/ Use separate variables to hold the selected character values<\/span>\n    <span class=\"n\">signal<\/span> <span class=\"n\">selectedCharacter1<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">signal<\/span> <span class=\"n\">selectedCharacter2<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">signal<\/span> <span class=\"n\">selectedCharacter3<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">signal<\/span> <span class=\"n\">selectedCharacter4<\/span><span class=\"p\">;<\/span>\n\n    <span class=\"c1\">\/\/ Enforce that only one of the selectedCharacter variables holds the value<\/span>\n    <span class=\"n\">selectedCharacter1<\/span> <span class=\"o\"> <span class=\"n\">isTarget1<\/span> <span class=\"o\">*<\/span> <span class=\"n\">character1<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">selectedCharacter2<\/span> <span class=\"o\"> <span class=\"n\">isTarget2<\/span> <span class=\"o\">*<\/span> <span class=\"n\">character2<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">selectedCharacter3<\/span> <span class=\"o\"> <span class=\"n\">isTarget3<\/span> <span class=\"o\">*<\/span> <span class=\"n\">character3<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">selectedCharacter4<\/span> <span class=\"o\"> <span class=\"n\">isTarget4<\/span> <span class=\"o\">*<\/span> <span class=\"n\">character4<\/span><span class=\"p\">;<\/span>\n\n    <span class=\"c1\">\/\/ Aggregate the selected character value<\/span>\n    <span class=\"n\">signal<\/span> <span class=\"n\">selectedCharacter<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">selectedCharacter<\/span> <span class=\"o\"> <span class=\"n\">selectedCharacter1<\/span> <span class=\"o\">+<\/span> <span class=\"n\">selectedCharacter2<\/span> <span class=\"o\">+<\/span> <span class=\"n\">selectedCharacter3<\/span> <span class=\"o\">+<\/span> <span class=\"n\">selectedCharacter4<\/span><span class=\"p\">;<\/span>\n\n    <span class=\"c1\">\/\/ Compare attackerLevel and selectedCharacter<\/span>\n    <span class=\"n\">component<\/span> <span class=\"n\">compareLevel<\/span> <span class=\"o\">=<\/span> <span class=\"n\">LessThan<\/span><span class=\"p\">(<\/span><span class=\"mi\">4<\/span><span class=\"p\">);<\/span> <span class=\"c1\">\/\/ Assuming levels are within 4 bits (0-15)<\/span>\n    <span class=\"n\">compareLevel<\/span><span class=\"p\">.<\/span><span class=\"n\">in<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]<\/span> <span class=\"o\"> <span class=\"n\">selectedCharacter<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">compareLevel<\/span><span class=\"p\">.<\/span><span class=\"n\">in<\/span><span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">]<\/span> <span class=\"o\"> <span class=\"n\">attackerLevel<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">signal<\/span> <span class=\"n\">attackerWinsNormal<\/span> <span class=\"o\"> <span class=\"n\">compareLevel<\/span><span class=\"p\">.<\/span><span class=\"n\">out<\/span><span class=\"p\">;<\/span>\n\n    <span class=\"c1\">\/\/ Special rule: attackerLevel == 1 and selectedCharacter == 4<\/span>\n    <span class=\"n\">component<\/span> <span class=\"n\">isAttackerLevelOneEq<\/span> <span class=\"o\">=<\/span> <span class=\"n\">IsEqual<\/span><span class=\"p\">();<\/span>\n    <span class=\"n\">isAttackerLevelOneEq<\/span><span class=\"p\">.<\/span><span class=\"n\">in<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]<\/span> <span class=\"o\"> <span class=\"n\">attackerLevel<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">isAttackerLevelOneEq<\/span><span class=\"p\">.<\/span><span class=\"n\">in<\/span><span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">]<\/span> <span class=\"o\"> <span class=\"mi\">1<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">signal<\/span> <span class=\"n\">isAttackerLevelOne<\/span> <span class=\"o\"> <span class=\"n\">isAttackerLevelOneEq<\/span><span class=\"p\">.<\/span><span class=\"n\">out<\/span><span class=\"p\">;<\/span>\n\n    <span class=\"n\">component<\/span> <span class=\"n\">isCharacterTargetFourEq<\/span> <span class=\"o\">=<\/span> <span class=\"n\">IsEqual<\/span><span class=\"p\">();<\/span>\n    <span class=\"n\">isCharacterTargetFourEq<\/span><span class=\"p\">.<\/span><span class=\"n\">in<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]<\/span> <span class=\"o\"> <span class=\"n\">selectedCharacter<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">isCharacterTargetFourEq<\/span><span class=\"p\">.<\/span><span class=\"n\">in<\/span><span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">]<\/span> <span class=\"o\"> <span class=\"mi\">4<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">signal<\/span> <span class=\"n\">isCharacterTargetFour<\/span> <span class=\"o\"> <span class=\"n\">isCharacterTargetFourEq<\/span><span class=\"p\">.<\/span><span class=\"n\">out<\/span><span class=\"p\">;<\/span>\n\n    <span class=\"n\">signal<\/span> <span class=\"n\">attackerWinsSpecial<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">attackerWinsSpecial<\/span> <span class=\"o\"> <span class=\"n\">isAttackerLevelOne<\/span> <span class=\"o\">*<\/span> <span class=\"n\">isCharacterTargetFour<\/span><span class=\"p\">;<\/span>\n\n    <span class=\"c1\">\/\/ Determine if the attacker wins either normally or via special rule<\/span>\n    <span class=\"n\">signal<\/span> <span class=\"n\">attackerWins<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">attackerWins<\/span> <span class=\"o\"> <span class=\"n\">attackerWinsNormal<\/span> <span class=\"o\">+<\/span> <span class=\"n\">attackerWinsSpecial<\/span><span class=\"p\">;<\/span>\n\n    <span class=\"c1\">\/\/ Convert attackerWins to a binary value (0 or 1)<\/span>\n    <span class=\"n\">signal<\/span> <span class=\"n\">isAttackerWins<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">signal<\/span> <span class=\"n\">zeroFlag<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">signal<\/span> <span class=\"n\">oneFlag<\/span><span class=\"p\">;<\/span>\n\n    <span class=\"c1\">\/\/ Determine zeroFlag: 1 if attackerWins == 0, else 0<\/span>\n    <span class=\"n\">zeroFlag<\/span> <span class=\"o\"> <span class=\"n\">attackerWins<\/span> <span class=\"o\">*<\/span> <span class=\"p\">(<\/span><span class=\"n\">attackerWins<\/span> <span class=\"o\">-<\/span> <span class=\"mi\">1<\/span><span class=\"p\">);<\/span>\n    <span class=\"n\">oneFlag<\/span> <span class=\"o\"> <span class=\"mi\">1<\/span> <span class=\"o\">-<\/span> <span class=\"n\">zeroFlag<\/span><span class=\"p\">;<\/span>\n\n    <span class=\"c1\">\/\/ isAttackerWins should be 1 if attackerWins &gt; 0, else 0<\/span>\n    <span class=\"n\">isAttackerWins<\/span> <span class=\"o\"> <span class=\"n\">attackerWins<\/span> <span class=\"o\">-<\/span> <span class=\"n\">zeroFlag<\/span><span class=\"p\">;<\/span>\n\n    <span class=\"c1\">\/\/ Calculate the battleResult: 1 if defender wins, 2 if attacker wins<\/span>\n    <span class=\"n\">signal<\/span> <span class=\"n\">defenderWins<\/span><span class=\"p\">;<\/span>\n    <span class=\"n\">defenderWins<\/span> <span class=\"o\"> <span class=\"mi\">1<\/span> <span class=\"o\">-<\/span> <span class=\"n\">isAttackerWins<\/span><span class=\"p\">;<\/span>\n\n    <span class=\"c1\">\/\/ Output battleResult: 1 if defender wins, 2 if attacker wins<\/span>\n    <span class=\"n\">battleResult<\/span> <span class=\"o\"> <span class=\"mi\">1<\/span> <span class=\"o\">+<\/span> <span class=\"n\">isAttackerWins<\/span><span class=\"p\">;<\/span>\n\n    <span class=\"n\">log<\/span><span class=\"p\">(<\/span><span class=\"n\">battleResult<\/span><span class=\"p\">);<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"n\">component<\/span> <span class=\"n\">main<\/span> <span class=\"p\">{<\/span><span class=\"k\">public<\/span> <span class=\"p\">[<\/span><span class=\"n\">characterTarget<\/span><span class=\"p\">,<\/span> <span class=\"n\">attackerLevel<\/span><span class=\"p\">]}<\/span> <span class=\"o\">=<\/span> <span class=\"n\">CharacterBattleCheck<\/span><span class=\"p\">();<\/span>\n<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0647\u0645\u0627\u0646\u0637\u0648\u0631 \u06a9\u0647 \u0645\u06cc \u0628\u06cc\u0646\u06cc\u062f\u060c \u0645\u0627 \u0627\u0632 \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 \u0647\u0627\u06cc Poseidon \u0648 \u0645\u0642\u0627\u06cc\u0633\u0647 \u06a9\u0646\u0646\u062f\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u06cc\u0645\u060c \u0622\u0646\u0647\u0627 \u0631\u0627 \u0646\u0635\u0628 \u06a9\u0646\u06cc\u062f.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code><span class=\"nb\">cd <\/span>packages\/zk\/circuits\ngit clone https:\/\/github.com\/iden3\/circomlib.git\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h3><span class=\"ez-toc-section\" id=\"%D8%AC_%D9%82%D8%B1%D8%A7%D8%B1%D8%AF%D8%A7%D8%AF%D9%87%D8%A7%DB%8C_%D8%AA%D8%A3%DB%8C%DB%8C%D8%AF_%DA%A9%D9%86%D9%86%D8%AF%D9%87_%D8%B1%D8%A7_%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF_%DA%A9%D9%86%DB%8C%D8%AF\"><\/span>\n<p>  \u062c \u0642\u0631\u0627\u0631\u062f\u0627\u062f\u0647\u0627\u06cc \u062a\u0623\u06cc\u06cc\u062f \u06a9\u0646\u0646\u062f\u0647 \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0648\u0627\u0631\u062f \u067e\u0648\u0634\u0647 \u0622\u0634\u06a9\u0627\u0631 \u0645\u062f\u0627\u0631 \u0634\u0648\u06cc\u062f.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code><span class=\"nb\">cd <\/span>reveal\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0645\u062f\u0627\u0631 \u0631\u0627 \u06a9\u0627\u0645\u067e\u0627\u06cc\u0644 \u06a9\u0646\u06cc\u062f.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>circom reveal.circom <span class=\"nt\">--r1cs<\/span> <span class=\"nt\">--wasm<\/span> <span class=\"nt\">--sym<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0642\u0631\u0627\u0631\u062f\u0627\u062f groth16 \u0645\u0631\u0627\u0633\u0645 \u0648 \u062a\u0627\u06cc\u06cc\u062f \u06a9\u0646\u0646\u062f\u0647 \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>snarkjs powersoftau new bn128 12 pot12_0000.ptau <span class=\"nt\">-v<\/span>\nsnarkjs powersoftau contribute pot12_0000.ptau pot12_0001.ptau <span class=\"nt\">--name<\/span><span class=\"o\">=<\/span><span class=\"s2\">\"First contribution\"<\/span> <span class=\"nt\">-v<\/span>\nsnarkjs powersoftau prepare phase2 pot12_0001.ptau pot12_final.ptau <span class=\"nt\">-v<\/span>\nsnarkjs groth16 setup reveal.r1cs pot12_final.ptau reveal_0000.zkey\nsnarkjs zkey contribute reveal_0000.zkey reveal_0001.zkey <span class=\"nt\">--name<\/span><span class=\"o\">=<\/span><span class=\"s2\">\"1st Contributor Name\"<\/span> <span class=\"nt\">-v<\/span>\nsnarkjs zkey <span class=\"nb\">export <\/span>verificationkey reveal_0001.zkey verification_key.json\nsnarkjs zkey <span class=\"nb\">export <\/span>solidityverifier reveal_0001.zkey ..\/..\/..\/contracts\/src\/RevealVerifier.sol\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0622\u0646 \u0631\u0627 \u062f\u0631 \u067e\u0648\u0634\u0647 \u0642\u0631\u0627\u0631\u062f\u0627\u062f MUD \u0642\u0631\u0627\u0631 \u062f\u0647\u06cc\u062f.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code><span class=\"nb\">mkdir<\/span> ..\/..\/..\/client\/public\/zk_artifacts\/\n<span class=\"nb\">cp <\/span>reveal_js\/reveal.wasm ..\/..\/..\/client\/public\/zk_artifacts\/\n<span class=\"nb\">cp <\/span>reveal_0001.zkey ..\/..\/..\/client\/public\/zk_artifacts\/reveal_final.zkey\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u062d\u0627\u0644\u0627 \u0647\u0645\u06cc\u0646 \u06a9\u0627\u0631 \u0631\u0627 \u0628\u0627 \u0645\u062f\u0627\u0631 \u062f\u0641\u0627\u0639\u06cc \u0627\u0646\u062c\u0627\u0645 \u062f\u0647\u06cc\u062f.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code><span class=\"nb\">cd<\/span> ..\/defend\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u06a9\u0627\u0645\u067e\u0627\u06cc\u0644.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>circom defend.circom <span class=\"nt\">--r1cs<\/span> <span class=\"nt\">--wasm<\/span> <span class=\"nt\">--sym<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0648 \u062a\u0627\u06cc\u06cc\u062f \u06a9\u0646\u0646\u062f\u0647 \u0631\u0627 \u062a\u0648\u0644\u06cc\u062f \u06a9\u0646\u06cc\u062f.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>snarkjs powersoftau new bn128 12 pot12_0000.ptau <span class=\"nt\">-v<\/span>\nsnarkjs powersoftau contribute pot12_0000.ptau pot12_0001.ptau <span class=\"nt\">--name<\/span><span class=\"o\">=<\/span><span class=\"s2\">\"First contribution\"<\/span> <span class=\"nt\">-v<\/span>\nsnarkjs powersoftau prepare phase2 pot12_0001.ptau pot12_final.ptau <span class=\"nt\">-v<\/span>\nsnarkjs groth16 setup defend.r1cs pot12_final.ptau defend_0000.zkey\nsnarkjs zkey contribute defend_0000.zkey defend_0001.zkey <span class=\"nt\">--name<\/span><span class=\"o\">=<\/span><span class=\"s2\">\"1st Contributor Name\"<\/span> <span class=\"nt\">-v<\/span>\nsnarkjs zkey <span class=\"nb\">export <\/span>verificationkey defend_0001.zkey verification_key.json\nsnarkjs zkey <span class=\"nb\">export <\/span>solidityverifier defend_0001.zkey ..\/..\/..\/contracts\/src\/DefendVerifier.sol\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0622\u0646 \u0631\u0627 \u062f\u0631 \u067e\u0648\u0634\u0647 \u0642\u0631\u0627\u0631\u062f\u0627\u062f\u0647\u0627 \u0642\u0631\u0627\u0631 \u062f\u0647\u06cc\u062f.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code><span class=\"nb\">mkdir<\/span> ..\/..\/..\/client\/public\/zk_artifacts\/\n<span class=\"nb\">cp <\/span>defend_js\/defend.wasm ..\/..\/..\/client\/public\/zk_artifacts\/\n<span class=\"nb\">cp <\/span>defend_0001.zkey ..\/..\/..\/client\/public\/zk_artifacts\/defend_final.zkey\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0634\u0645\u0627 \u0647\u0645\u0686\u0646\u06cc\u0646 \u0628\u0627\u06cc\u062f \u0646\u0627\u0645 \u0639\u0645\u0648\u0645\u06cc \u0631\u0627 \u062a\u063a\u06cc\u06cc\u0631 \u062f\u0647\u06cc\u062f <code>Groth16Verifier<\/code> \u0628\u0647 <code>RevealVerifier<\/code> \u0648 <code>DefendVerifier<\/code>\u0628\u0647 \u062a\u0631\u062a\u06cc\u0628 \u062f\u0631 \u0642\u0631\u0627\u0631\u062f\u0627\u062f\u0647\u0627\u06cc\u06cc \u06a9\u0647 \u0627\u062e\u06cc\u0631\u0627\u064b \u062f\u0631 \u0622\u0646 \u0642\u0631\u0627\u0631 \u062f\u0627\u062f\u06cc\u0645 <code>packages\/client\/public\/zk_artifacts\/<\/code>.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"3_%D9%85%D9%86%D8%B7%D9%82_%D8%A8%D8%A7%D8%B2%DB%8C\"><\/span>\n<p>  3. \u0645\u0646\u0637\u0642 \u0628\u0627\u0632\u06cc<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0686\u0646\u062f \u0641\u0627\u06cc\u0644 \u0631\u0627 \u06a9\u0647 \u0627\u0632 \u0622\u0646\u0647\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0646\u062e\u0648\u0627\u0647\u06cc\u0645 \u06a9\u0631\u062f \u062d\u0630\u0641 \u06a9\u0646\u06cc\u062f.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>cd ..\/..\/..\/..\/\nrm packages\/contracts\/src\/systems\/IncrementSystem.sol packages\/contracts\/test\/CounterTest.t.sol\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u062a\u0645\u0627\u0645 \u0645\u0646\u0637\u0642 \u0628\u0627\u0632\u06cc \u062f\u0631 Solidity \u062a\u0639\u0631\u06cc\u0641 \u0634\u062f\u0647 \u0627\u0633\u062a. \u0627\u06cc\u0646 \u0634\u0627\u0645\u0644 \u0645\u0631\u0627\u062d\u0644 \u0627\u0648\u0644\u06cc\u0647 \u062a\u062e\u0645 \u0631\u06cc\u0632\u06cc\u060c \u0628\u0647 \u062f\u0646\u0628\u0627\u0644 \u0622\u0646 \u0645\u0631\u062d\u0644\u0647 \u062d\u0645\u0644\u0647 \u0648 \u062f\u0641\u0627\u0639 \u0627\u0633\u062a \u06a9\u0647 \u0647\u0631 \u06a9\u062f\u0627\u0645 \u062f\u0627\u0631\u0627\u06cc \u0627\u062b\u0628\u0627\u062a ZK \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 \u062e\u0648\u062f \u0647\u0633\u062a\u0646\u062f. \u0627\u0644\u0641 \u0631\u0627 \u0646\u06cc\u0632 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0631\u062f\u06cc\u0645 <code>killUnresponsiveCharacter<\/code> \u0639\u0645\u0644\u06a9\u0631\u062f\u060c \u06a9\u0647 \u0627\u06af\u0631 \u0628\u0627\u0632\u06cc\u06a9\u0646\u06cc \u0646\u062a\u0648\u0627\u0646\u062f \u062f\u0631 \u06cc\u06a9 \u0632\u0645\u0627\u0646 \u0645\u0639\u06cc\u0646 \u0627\u062b\u0628\u0627\u062a ZK \u062f\u0641\u0627\u0639\u06cc \u062e\u0648\u062f \u0631\u0627 \u0627\u0631\u0627\u0626\u0647 \u06a9\u0646\u062f\u060c \u062d\u0630\u0641 \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p><code>packages\/contracts\/src\/systems\/MyGameSystem.sol<\/code><\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight javascript\"><code><span class=\"c1\">\/\/ SPDX-License-Identifier: MIT<\/span>\n<span class=\"nx\">pragma<\/span> <span class=\"nx\">solidity<\/span> <span class=\"o\">&gt;=<\/span><span class=\"mf\">0.8<\/span><span class=\"p\">.<\/span><span class=\"mi\">24<\/span><span class=\"p\">;<\/span>\n\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">System<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">@latticexyz\/world\/src\/System.sol<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">Character<\/span><span class=\"p\">,<\/span> <span class=\"nx\">CharacterData<\/span><span class=\"p\">,<\/span> <span class=\"nx\">VerifierContracts<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">..\/codegen\/index.sol<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">PlayerPrivateState<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">..\/codegen\/index.sol<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">Direction<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">..\/codegen\/common.sol<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">getKeysWithValue<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">@latticexyz\/world-modules\/src\/modules\/keyswithvalue\/getKeysWithValue.sol<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">EncodedLengths<\/span><span class=\"p\">,<\/span> <span class=\"nx\">EncodedLengthsLib<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">@latticexyz\/store\/src\/EncodedLengths.sol<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n\n<span class=\"kr\">interface<\/span> <span class=\"nx\">ICircomRevealVerifier<\/span> <span class=\"p\">{<\/span>\n    <span class=\"kd\">function<\/span> <span class=\"nf\">verifyProof<\/span><span class=\"p\">(<\/span><span class=\"nx\">uint<\/span><span class=\"p\">[<\/span><span class=\"mi\">2<\/span><span class=\"p\">]<\/span> <span class=\"nx\">calldata<\/span> <span class=\"nx\">_pA<\/span><span class=\"p\">,<\/span> <span class=\"nx\">uint<\/span><span class=\"p\">[<\/span><span class=\"mi\">2<\/span><span class=\"p\">][<\/span><span class=\"mi\">2<\/span><span class=\"p\">]<\/span> <span class=\"nx\">calldata<\/span> <span class=\"nx\">_pB<\/span><span class=\"p\">,<\/span> <span class=\"nx\">uint<\/span><span class=\"p\">[<\/span><span class=\"mi\">2<\/span><span class=\"p\">]<\/span> <span class=\"nx\">calldata<\/span> <span class=\"nx\">_pC<\/span><span class=\"p\">,<\/span> <span class=\"nx\">uint<\/span><span class=\"p\">[<\/span><span class=\"mi\">3<\/span><span class=\"p\">]<\/span> <span class=\"nx\">calldata<\/span> <span class=\"nx\">_pubSignals<\/span><span class=\"p\">)<\/span> <span class=\"nx\">external<\/span> <span class=\"nx\">view<\/span> <span class=\"nf\">returns <\/span><span class=\"p\">(<\/span><span class=\"nx\">bool<\/span><span class=\"p\">);<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"kr\">interface<\/span> <span class=\"nx\">ICircomDefendVerifier<\/span> <span class=\"p\">{<\/span>\n    <span class=\"kd\">function<\/span> <span class=\"nf\">verifyProof<\/span><span class=\"p\">(<\/span><span class=\"nx\">uint<\/span><span class=\"p\">[<\/span><span class=\"mi\">2<\/span><span class=\"p\">]<\/span> <span class=\"nx\">calldata<\/span> <span class=\"nx\">_pA<\/span><span class=\"p\">,<\/span> <span class=\"nx\">uint<\/span><span class=\"p\">[<\/span><span class=\"mi\">2<\/span><span class=\"p\">][<\/span><span class=\"mi\">2<\/span><span class=\"p\">]<\/span> <span class=\"nx\">calldata<\/span> <span class=\"nx\">_pB<\/span><span class=\"p\">,<\/span> <span class=\"nx\">uint<\/span><span class=\"p\">[<\/span><span class=\"mi\">2<\/span><span class=\"p\">]<\/span> <span class=\"nx\">calldata<\/span> <span class=\"nx\">_pC<\/span><span class=\"p\">,<\/span> <span class=\"nx\">uint<\/span><span class=\"p\">[<\/span><span class=\"mi\">4<\/span><span class=\"p\">]<\/span> <span class=\"nx\">calldata<\/span> <span class=\"nx\">_pubSignals<\/span><span class=\"p\">)<\/span> <span class=\"nx\">external<\/span> <span class=\"nx\">view<\/span> <span class=\"nf\">returns <\/span><span class=\"p\">(<\/span><span class=\"nx\">bool<\/span><span class=\"p\">);<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"nx\">contract<\/span> <span class=\"nx\">MyGameSystem<\/span> <span class=\"nx\">is<\/span> <span class=\"nx\">System<\/span> <span class=\"p\">{<\/span>\n  <span class=\"kd\">function<\/span> <span class=\"nf\">spawn<\/span><span class=\"p\">(<\/span><span class=\"nx\">int32<\/span> <span class=\"nx\">x<\/span><span class=\"p\">,<\/span> <span class=\"nx\">int32<\/span> <span class=\"nx\">y<\/span><span class=\"p\">,<\/span> <span class=\"nx\">uint256<\/span> <span class=\"nx\">commitment<\/span><span class=\"p\">)<\/span> <span class=\"kr\">public<\/span> <span class=\"p\">{<\/span>\n    <span class=\"c1\">\/\/require(PlayerPrivateState.getCommitment(_msgSender()) == 0, \"Player already spawned\");<\/span>\n\n    <span class=\"nx\">Character<\/span><span class=\"p\">.<\/span><span class=\"nf\">set<\/span><span class=\"p\">(<\/span><span class=\"nx\">x<\/span><span class=\"p\">,<\/span> <span class=\"nx\">y<\/span><span class=\"p\">,<\/span> <span class=\"nf\">_msgSender<\/span><span class=\"p\">(),<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"kc\">false<\/span><span class=\"p\">);<\/span>\n    <span class=\"nx\">Character<\/span><span class=\"p\">.<\/span><span class=\"nf\">set<\/span><span class=\"p\">(<\/span><span class=\"nx\">x<\/span><span class=\"p\">,<\/span> <span class=\"nx\">y<\/span> <span class=\"o\">+<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"nf\">_msgSender<\/span><span class=\"p\">(),<\/span> <span class=\"mi\">2<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"kc\">false<\/span><span class=\"p\">);<\/span>\n    <span class=\"nx\">Character<\/span><span class=\"p\">.<\/span><span class=\"nf\">set<\/span><span class=\"p\">(<\/span><span class=\"nx\">x<\/span><span class=\"p\">,<\/span> <span class=\"nx\">y<\/span> <span class=\"o\">+<\/span> <span class=\"mi\">2<\/span><span class=\"p\">,<\/span> <span class=\"nf\">_msgSender<\/span><span class=\"p\">(),<\/span> <span class=\"mi\">3<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"kc\">false<\/span><span class=\"p\">);<\/span>\n    <span class=\"nx\">Character<\/span><span class=\"p\">.<\/span><span class=\"nf\">set<\/span><span class=\"p\">(<\/span><span class=\"nx\">x<\/span><span class=\"p\">,<\/span> <span class=\"nx\">y<\/span> <span class=\"o\">+<\/span> <span class=\"mi\">3<\/span><span class=\"p\">,<\/span> <span class=\"nf\">_msgSender<\/span><span class=\"p\">(),<\/span> <span class=\"mi\">4<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"kc\">false<\/span><span class=\"p\">);<\/span>\n\n    <span class=\"nx\">PlayerPrivateState<\/span><span class=\"p\">.<\/span><span class=\"nf\">set<\/span><span class=\"p\">(<\/span><span class=\"nf\">_msgSender<\/span><span class=\"p\">(),<\/span> <span class=\"nx\">commitment<\/span><span class=\"p\">);<\/span>\n  <span class=\"p\">}<\/span>\n\n  <span class=\"kd\">function<\/span> <span class=\"nf\">move<\/span><span class=\"p\">(<\/span><span class=\"nx\">int32<\/span> <span class=\"nx\">characterAtX<\/span><span class=\"p\">,<\/span> <span class=\"nx\">int32<\/span> <span class=\"nx\">characterAtY<\/span><span class=\"p\">,<\/span> <span class=\"nx\">Direction<\/span> <span class=\"nx\">direction<\/span><span class=\"p\">)<\/span> <span class=\"kr\">public<\/span> <span class=\"p\">{<\/span>\n    <span class=\"nx\">CharacterData<\/span> <span class=\"nx\">memory<\/span> <span class=\"nx\">character<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">Character<\/span><span class=\"p\">.<\/span><span class=\"nf\">get<\/span><span class=\"p\">(<\/span><span class=\"nx\">characterAtX<\/span><span class=\"p\">,<\/span> <span class=\"nx\">characterAtY<\/span><span class=\"p\">);<\/span>\n\n    <span class=\"c1\">\/\/require(!character.isDead, \"Character is dead\");<\/span>\n    <span class=\"nf\">require<\/span><span class=\"p\">(<\/span><span class=\"nx\">character<\/span><span class=\"p\">.<\/span><span class=\"nx\">attackedAt<\/span> <span class=\"o\">==<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">Character is under attack<\/span><span class=\"dl\">\"<\/span><span class=\"p\">);<\/span>\n    <span class=\"nf\">require<\/span><span class=\"p\">(<\/span><span class=\"nx\">character<\/span><span class=\"p\">.<\/span><span class=\"nx\">owner<\/span> <span class=\"o\">==<\/span> <span class=\"nf\">_msgSender<\/span><span class=\"p\">(),<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">Only owner<\/span><span class=\"dl\">\"<\/span><span class=\"p\">);<\/span>\n\n    <span class=\"nx\">int32<\/span> <span class=\"nx\">x<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">characterAtX<\/span><span class=\"p\">;<\/span>\n    <span class=\"nx\">int32<\/span> <span class=\"nx\">y<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">characterAtY<\/span><span class=\"p\">;<\/span>\n\n    <span class=\"k\">if<\/span><span class=\"p\">(<\/span><span class=\"nx\">direction<\/span> <span class=\"o\">==<\/span> <span class=\"nx\">Direction<\/span><span class=\"p\">.<\/span><span class=\"nx\">Up<\/span><span class=\"p\">)<\/span>\n      <span class=\"nx\">y<\/span> <span class=\"o\">-=<\/span> <span class=\"mi\">1<\/span><span class=\"p\">;<\/span>\n    <span class=\"k\">if<\/span><span class=\"p\">(<\/span><span class=\"nx\">direction<\/span> <span class=\"o\">==<\/span> <span class=\"nx\">Direction<\/span><span class=\"p\">.<\/span><span class=\"nx\">Down<\/span><span class=\"p\">)<\/span>\n      <span class=\"nx\">y<\/span> <span class=\"o\">+=<\/span> <span class=\"mi\">1<\/span><span class=\"p\">;<\/span>\n    <span class=\"k\">if<\/span><span class=\"p\">(<\/span><span class=\"nx\">direction<\/span> <span class=\"o\">==<\/span> <span class=\"nx\">Direction<\/span><span class=\"p\">.<\/span><span class=\"nx\">Left<\/span><span class=\"p\">)<\/span>\n      <span class=\"nx\">x<\/span> <span class=\"o\">-=<\/span> <span class=\"mi\">1<\/span><span class=\"p\">;<\/span>\n    <span class=\"k\">if<\/span><span class=\"p\">(<\/span><span class=\"nx\">direction<\/span> <span class=\"o\">==<\/span> <span class=\"nx\">Direction<\/span><span class=\"p\">.<\/span><span class=\"nx\">Right<\/span><span class=\"p\">)<\/span>\n      <span class=\"nx\">x<\/span> <span class=\"o\">+=<\/span> <span class=\"mi\">1<\/span><span class=\"p\">;<\/span>\n\n    <span class=\"nx\">CharacterData<\/span> <span class=\"nx\">memory<\/span> <span class=\"nx\">characterAtDestination<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">Character<\/span><span class=\"p\">.<\/span><span class=\"nf\">get<\/span><span class=\"p\">(<\/span><span class=\"nx\">x<\/span><span class=\"p\">,<\/span> <span class=\"nx\">y<\/span><span class=\"p\">);<\/span>\n    <span class=\"nf\">require<\/span><span class=\"p\">(<\/span><span class=\"nx\">characterAtDestination<\/span><span class=\"p\">.<\/span><span class=\"nx\">owner<\/span> <span class=\"o\">==<\/span> <span class=\"nf\">address<\/span><span class=\"p\">(<\/span><span class=\"mi\">0<\/span><span class=\"p\">),<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">Destination is occupied<\/span><span class=\"dl\">\"<\/span><span class=\"p\">);<\/span>\n\n    <span class=\"nx\">Character<\/span><span class=\"p\">.<\/span><span class=\"nf\">deleteRecord<\/span><span class=\"p\">(<\/span><span class=\"nx\">characterAtX<\/span><span class=\"p\">,<\/span> <span class=\"nx\">characterAtY<\/span><span class=\"p\">);<\/span>\n    <span class=\"nx\">Character<\/span><span class=\"p\">.<\/span><span class=\"nf\">set<\/span><span class=\"p\">(<\/span><span class=\"nx\">x<\/span><span class=\"p\">,<\/span> <span class=\"nx\">y<\/span><span class=\"p\">,<\/span> <span class=\"nf\">_msgSender<\/span><span class=\"p\">(),<\/span> <span class=\"nx\">character<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"nx\">character<\/span><span class=\"p\">.<\/span><span class=\"nx\">revealedValue<\/span><span class=\"p\">,<\/span> <span class=\"kc\">false<\/span><span class=\"p\">);<\/span>\n  <span class=\"p\">}<\/span>\n\n  <span class=\"kd\">function<\/span> <span class=\"nf\">attack<\/span><span class=\"p\">(<\/span><span class=\"nx\">uint<\/span><span class=\"p\">[<\/span><span class=\"mi\">2<\/span><span class=\"p\">]<\/span> <span class=\"nx\">calldata<\/span> <span class=\"nx\">_pA<\/span><span class=\"p\">,<\/span> <span class=\"nx\">uint<\/span><span class=\"p\">[<\/span><span class=\"mi\">2<\/span><span class=\"p\">][<\/span><span class=\"mi\">2<\/span><span class=\"p\">]<\/span> <span class=\"nx\">calldata<\/span> <span class=\"nx\">_pB<\/span><span class=\"p\">,<\/span> <span class=\"nx\">uint<\/span><span class=\"p\">[<\/span><span class=\"mi\">2<\/span><span class=\"p\">]<\/span> <span class=\"nx\">calldata<\/span> <span class=\"nx\">_pC<\/span><span class=\"p\">,<\/span> <span class=\"nx\">uint<\/span><span class=\"p\">[<\/span><span class=\"mi\">3<\/span><span class=\"p\">]<\/span> <span class=\"nx\">calldata<\/span> <span class=\"nx\">_pubSignals<\/span><span class=\"p\">,<\/span>\n    <span class=\"nx\">int32<\/span> <span class=\"nx\">fromX<\/span><span class=\"p\">,<\/span> <span class=\"nx\">int32<\/span> <span class=\"nx\">fromY<\/span><span class=\"p\">,<\/span> <span class=\"nx\">int32<\/span> <span class=\"nx\">toX<\/span><span class=\"p\">,<\/span> <span class=\"nx\">int32<\/span> <span class=\"nx\">toY<\/span>\n  <span class=\"p\">)<\/span> <span class=\"kr\">public<\/span> <span class=\"p\">{<\/span>\n    <span class=\"nc\">ICircomRevealVerifier<\/span><span class=\"p\">(<\/span><span class=\"nx\">VerifierContracts<\/span><span class=\"p\">.<\/span><span class=\"nf\">getRevealContractAddress<\/span><span class=\"p\">()).<\/span><span class=\"nf\">verifyProof<\/span><span class=\"p\">(<\/span><span class=\"nx\">_pA<\/span><span class=\"p\">,<\/span> <span class=\"nx\">_pB<\/span><span class=\"p\">,<\/span> <span class=\"nx\">_pC<\/span><span class=\"p\">,<\/span> <span class=\"nx\">_pubSignals<\/span><span class=\"p\">);<\/span>\n    <span class=\"nx\">uint256<\/span> <span class=\"nx\">commitment<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">_pubSignals<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">];<\/span>\n    <span class=\"nx\">uint256<\/span> <span class=\"nx\">characterReveal<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">_pubSignals<\/span><span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">];<\/span>\n    <span class=\"nx\">uint256<\/span> <span class=\"nx\">valueReveal<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">_pubSignals<\/span><span class=\"p\">[<\/span><span class=\"mi\">2<\/span><span class=\"p\">];<\/span>\n\n    <span class=\"nf\">require<\/span><span class=\"p\">(<\/span><span class=\"nx\">PlayerPrivateState<\/span><span class=\"p\">.<\/span><span class=\"nf\">getCommitment<\/span><span class=\"p\">(<\/span><span class=\"nf\">_msgSender<\/span><span class=\"p\">())<\/span> <span class=\"o\">==<\/span> <span class=\"nx\">commitment<\/span><span class=\"p\">,<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">Invalid commitment<\/span><span class=\"dl\">\"<\/span><span class=\"p\">);<\/span>\n    <span class=\"nf\">require<\/span><span class=\"p\">(<\/span><span class=\"nx\">characterReveal<\/span> <span class=\"o\">==<\/span> <span class=\"nx\">Character<\/span><span class=\"p\">.<\/span><span class=\"nf\">getId<\/span><span class=\"p\">(<\/span><span class=\"nx\">fromX<\/span><span class=\"p\">,<\/span> <span class=\"nx\">fromY<\/span><span class=\"p\">),<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">Invalid attacker id<\/span><span class=\"dl\">\"<\/span><span class=\"p\">);<\/span>\n    <span class=\"nf\">require<\/span><span class=\"p\">(<\/span><span class=\"nx\">Character<\/span><span class=\"p\">.<\/span><span class=\"nf\">getOwner<\/span><span class=\"p\">(<\/span><span class=\"nx\">fromX<\/span><span class=\"p\">,<\/span> <span class=\"nx\">fromY<\/span><span class=\"p\">)<\/span> <span class=\"o\">==<\/span> <span class=\"nf\">_msgSender<\/span><span class=\"p\">(),<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">You're not the planet owner<\/span><span class=\"dl\">\"<\/span><span class=\"p\">);<\/span>\n    <span class=\"nx\">Character<\/span><span class=\"p\">.<\/span><span class=\"nf\">setRevealedValue<\/span><span class=\"p\">(<\/span><span class=\"nx\">fromX<\/span><span class=\"p\">,<\/span> <span class=\"nx\">fromY<\/span><span class=\"p\">,<\/span> <span class=\"nf\">uint32<\/span><span class=\"p\">(<\/span><span class=\"nx\">valueReveal<\/span><span class=\"p\">));<\/span>\n    <span class=\"nx\">Character<\/span><span class=\"p\">.<\/span><span class=\"nf\">setAttackedAt<\/span><span class=\"p\">(<\/span><span class=\"nx\">toX<\/span><span class=\"p\">,<\/span> <span class=\"nx\">toY<\/span><span class=\"p\">,<\/span> <span class=\"nf\">uint32<\/span><span class=\"p\">(<\/span><span class=\"nx\">block<\/span><span class=\"p\">.<\/span><span class=\"nx\">timestamp<\/span><span class=\"p\">));<\/span>\n    <span class=\"nx\">Character<\/span><span class=\"p\">.<\/span><span class=\"nf\">setAttackedByValue<\/span><span class=\"p\">(<\/span><span class=\"nx\">toX<\/span><span class=\"p\">,<\/span> <span class=\"nx\">toY<\/span><span class=\"p\">,<\/span> <span class=\"nf\">uint32<\/span><span class=\"p\">(<\/span><span class=\"nx\">valueReveal<\/span><span class=\"p\">));<\/span>\n  <span class=\"p\">}<\/span>\n\n  <span class=\"kd\">function<\/span> <span class=\"nf\">defend<\/span><span class=\"p\">(<\/span><span class=\"nx\">uint<\/span><span class=\"p\">[<\/span><span class=\"mi\">2<\/span><span class=\"p\">]<\/span> <span class=\"nx\">calldata<\/span> <span class=\"nx\">_pA<\/span><span class=\"p\">,<\/span> <span class=\"nx\">uint<\/span><span class=\"p\">[<\/span><span class=\"mi\">2<\/span><span class=\"p\">][<\/span><span class=\"mi\">2<\/span><span class=\"p\">]<\/span> <span class=\"nx\">calldata<\/span> <span class=\"nx\">_pB<\/span><span class=\"p\">,<\/span> <span class=\"nx\">uint<\/span><span class=\"p\">[<\/span><span class=\"mi\">2<\/span><span class=\"p\">]<\/span> <span class=\"nx\">calldata<\/span> <span class=\"nx\">_pC<\/span><span class=\"p\">,<\/span> <span class=\"nx\">uint<\/span><span class=\"p\">[<\/span><span class=\"mi\">4<\/span><span class=\"p\">]<\/span> <span class=\"nx\">calldata<\/span> <span class=\"nx\">_pubSignals<\/span><span class=\"p\">,<\/span>\n    <span class=\"nx\">int32<\/span> <span class=\"nx\">x<\/span><span class=\"p\">,<\/span> <span class=\"nx\">int32<\/span> <span class=\"nx\">y<\/span>\n  <span class=\"p\">)<\/span> <span class=\"kr\">public<\/span> <span class=\"p\">{<\/span>\n    <span class=\"nc\">ICircomDefendVerifier<\/span><span class=\"p\">(<\/span><span class=\"nx\">VerifierContracts<\/span><span class=\"p\">.<\/span><span class=\"nf\">getDefendContractAddress<\/span><span class=\"p\">()).<\/span><span class=\"nf\">verifyProof<\/span><span class=\"p\">(<\/span><span class=\"nx\">_pA<\/span><span class=\"p\">,<\/span> <span class=\"nx\">_pB<\/span><span class=\"p\">,<\/span> <span class=\"nx\">_pC<\/span><span class=\"p\">,<\/span> <span class=\"nx\">_pubSignals<\/span><span class=\"p\">);<\/span>\n\n    <span class=\"nx\">uint256<\/span> <span class=\"nx\">commitment<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">_pubSignals<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">];<\/span>\n    <span class=\"nx\">uint256<\/span> <span class=\"nx\">battleResult<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">_pubSignals<\/span><span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">];<\/span>\n    <span class=\"nx\">uint256<\/span> <span class=\"nx\">characterTarget<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">_pubSignals<\/span><span class=\"p\">[<\/span><span class=\"mi\">2<\/span><span class=\"p\">];<\/span>\n    <span class=\"nx\">uint256<\/span> <span class=\"nx\">attackerLevel<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">_pubSignals<\/span><span class=\"p\">[<\/span><span class=\"mi\">3<\/span><span class=\"p\">];<\/span>\n\n    <span class=\"nf\">require<\/span><span class=\"p\">(<\/span><span class=\"nx\">PlayerPrivateState<\/span><span class=\"p\">.<\/span><span class=\"nf\">getCommitment<\/span><span class=\"p\">(<\/span><span class=\"nx\">Character<\/span><span class=\"p\">.<\/span><span class=\"nf\">getOwner<\/span><span class=\"p\">(<\/span><span class=\"nx\">x<\/span><span class=\"p\">,<\/span> <span class=\"nx\">y<\/span><span class=\"p\">))<\/span> <span class=\"o\">==<\/span> <span class=\"nx\">commitment<\/span><span class=\"p\">,<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">Invalid commitment<\/span><span class=\"dl\">\"<\/span><span class=\"p\">);<\/span>\n    <span class=\"nf\">require<\/span><span class=\"p\">(<\/span><span class=\"nx\">characterTarget<\/span> <span class=\"o\">==<\/span> <span class=\"nx\">Character<\/span><span class=\"p\">.<\/span><span class=\"nf\">getId<\/span><span class=\"p\">(<\/span><span class=\"nx\">x<\/span><span class=\"p\">,<\/span> <span class=\"nx\">y<\/span><span class=\"p\">),<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">Invalid character id<\/span><span class=\"dl\">\"<\/span><span class=\"p\">);<\/span>\n    <span class=\"nf\">require<\/span><span class=\"p\">(<\/span><span class=\"nx\">attackerLevel<\/span> <span class=\"o\">==<\/span> <span class=\"nx\">Character<\/span><span class=\"p\">.<\/span><span class=\"nf\">getAttackedByValue<\/span><span class=\"p\">(<\/span><span class=\"nx\">x<\/span><span class=\"p\">,<\/span> <span class=\"nx\">y<\/span><span class=\"p\">),<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">Invalid attacked by value in proof<\/span><span class=\"dl\">\"<\/span><span class=\"p\">);<\/span>\n\n    <span class=\"k\">if<\/span><span class=\"p\">(<\/span><span class=\"nx\">battleResult<\/span> <span class=\"o\">==<\/span> <span class=\"mi\">1<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span> <span class=\"c1\">\/\/ defense won<\/span>\n      <span class=\"nx\">Character<\/span><span class=\"p\">.<\/span><span class=\"nf\">setAttackedAt<\/span><span class=\"p\">(<\/span><span class=\"nx\">x<\/span><span class=\"p\">,<\/span> <span class=\"nx\">y<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">);<\/span>\n      <span class=\"nx\">Character<\/span><span class=\"p\">.<\/span><span class=\"nf\">setAttackedByValue<\/span><span class=\"p\">(<\/span><span class=\"nx\">x<\/span><span class=\"p\">,<\/span> <span class=\"nx\">y<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">);<\/span>\n    <span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"p\">{<\/span> <span class=\"c1\">\/\/ attack won<\/span>\n      <span class=\"nx\">Character<\/span><span class=\"p\">.<\/span><span class=\"nf\">setIsDead<\/span><span class=\"p\">(<\/span><span class=\"nx\">x<\/span><span class=\"p\">,<\/span> <span class=\"nx\">y<\/span><span class=\"p\">,<\/span> <span class=\"kc\">true<\/span><span class=\"p\">);<\/span>\n    <span class=\"p\">}<\/span>\n  <span class=\"p\">}<\/span>\n\n  <span class=\"kd\">function<\/span> <span class=\"nf\">killUnresponsiveCharacter<\/span><span class=\"p\">(<\/span><span class=\"nx\">int32<\/span> <span class=\"nx\">x<\/span><span class=\"p\">,<\/span> <span class=\"nx\">int32<\/span> <span class=\"nx\">y<\/span><span class=\"p\">)<\/span> <span class=\"kr\">public<\/span> <span class=\"p\">{<\/span>\n    <span class=\"nx\">uint32<\/span> <span class=\"nx\">attackedAt<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">Character<\/span><span class=\"p\">.<\/span><span class=\"nf\">getAttackedAt<\/span><span class=\"p\">(<\/span><span class=\"nx\">x<\/span><span class=\"p\">,<\/span> <span class=\"nx\">y<\/span><span class=\"p\">);<\/span>\n    <span class=\"nx\">uint32<\/span> <span class=\"nx\">MAX_WAIT_TIME<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">1<\/span> <span class=\"nx\">minutes<\/span><span class=\"p\">;<\/span>\n    <span class=\"nf\">require<\/span><span class=\"p\">(<\/span><span class=\"nx\">attackedAt<\/span><span class=\"o\">&gt;<\/span><span class=\"mi\">0<\/span> <span class=\"o\">&amp;&amp;<\/span> <span class=\"p\">(<\/span><span class=\"nx\">attackedAt<\/span> <span class=\"o\">-<\/span> <span class=\"nf\">uint32<\/span><span class=\"p\">(<\/span><span class=\"nx\">block<\/span><span class=\"p\">.<\/span><span class=\"nx\">timestamp<\/span><span class=\"p\">))<\/span> <span class=\"o\">&gt;<\/span>  <span class=\"nx\">MAX_WAIT_TIME<\/span><span class=\"p\">,<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">Can kill character now<\/span><span class=\"dl\">\"<\/span><span class=\"p\">);<\/span>\n    <span class=\"nx\">Character<\/span><span class=\"p\">.<\/span><span class=\"nf\">setIsDead<\/span><span class=\"p\">(<\/span><span class=\"nx\">x<\/span><span class=\"p\">,<\/span> <span class=\"nx\">y<\/span><span class=\"p\">,<\/span> <span class=\"kc\">true<\/span><span class=\"p\">);<\/span>\n  <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0628\u0647 \u06cc\u0627\u062f \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f \u06a9\u0647 \u062f\u0631 MUD\u060c \u0645\u0627 \u0627\u0632 \u0633\u0627\u0632\u0646\u062f\u0647 \u0647\u0627\u06cc \u0633\u0646\u062a\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0646\u0645\u06cc \u06a9\u0646\u06cc\u0645. \u0627\u06cc\u0646 \u0628\u0647 \u0627\u06cc\u0646 \u062f\u0644\u06cc\u0644 \u0627\u0633\u062a \u06a9\u0647 \u06cc\u06a9 \u0645\u062c\u0631\u062f <code>System<\/code> \u0642\u0631\u0627\u0631\u062f\u0627\u062f \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u0648\u0636\u0639\u06cc\u062a \u062c\u0647\u0627\u0646 \u0647\u0627\u06cc \u0645\u062a\u0639\u062f\u062f \u0631\u0627 \u0645\u062f\u06cc\u0631\u06cc\u062a \u06a9\u0646\u062f. \u062f\u0631 \u0639\u0648\u0636\u060c \u0645\u0627 \u0627\u0632 <code>PostDeploy<\/code> \u0642\u0631\u0627\u0631\u062f\u0627\u062f\u060c \u062c\u0627\u06cc\u06cc \u06a9\u0647 \u0645\u0627 \u0642\u0631\u0627\u0631\u062f\u0627\u062f\u0647\u0627\u06cc \u062a\u0623\u06cc\u06cc\u062f \u06a9\u0646\u0646\u062f\u0647 \u0631\u0627 \u0645\u0633\u062a\u0642\u0631 \u0645\u06cc \u06a9\u0646\u06cc\u0645.<\/p>\n<p><code>packages\/contracts\/script\/PostDeploy.s.sol<\/code><\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight javascript\"><code><span class=\"c1\">\/\/ SPDX-License-Identifier: MIT<\/span>\n<span class=\"nx\">pragma<\/span> <span class=\"nx\">solidity<\/span> <span class=\"o\">&gt;=<\/span><span class=\"mf\">0.8<\/span><span class=\"p\">.<\/span><span class=\"mi\">24<\/span><span class=\"p\">;<\/span>\n\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">Script<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">forge-std\/Script.sol<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">console<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">forge-std\/console.sol<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">StoreSwitch<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">@latticexyz\/store\/src\/StoreSwitch.sol<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">RevealVerifier<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">..\/src\/RevealVerifier.sol<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">DefendVerifier<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">..\/src\/DefendVerifier.sol<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">IWorld<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">..\/src\/codegen\/world\/IWorld.sol<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">VerifierContracts<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">..\/src\/codegen\/index.sol<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n\n<span class=\"nx\">contract<\/span> <span class=\"nx\">PostDeploy<\/span> <span class=\"nx\">is<\/span> <span class=\"nx\">Script<\/span> <span class=\"p\">{<\/span>\n  <span class=\"kd\">function<\/span> <span class=\"nf\">run<\/span><span class=\"p\">(<\/span><span class=\"nx\">address<\/span> <span class=\"nx\">worldAddress<\/span><span class=\"p\">)<\/span> <span class=\"nx\">external<\/span> <span class=\"p\">{<\/span>\n    <span class=\"c1\">\/\/ Specify a store so that you can use tables directly in PostDeploy<\/span>\n    <span class=\"nx\">StoreSwitch<\/span><span class=\"p\">.<\/span><span class=\"nf\">setStoreAddress<\/span><span class=\"p\">(<\/span><span class=\"nx\">worldAddress<\/span><span class=\"p\">);<\/span>\n\n    <span class=\"c1\">\/\/ Load the private key from the `PRIVATE_KEY` environment variable (in .env)<\/span>\n    <span class=\"nx\">uint256<\/span> <span class=\"nx\">deployerPrivateKey<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">vm<\/span><span class=\"p\">.<\/span><span class=\"nf\">envUint<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">PRIVATE_KEY<\/span><span class=\"dl\">\"<\/span><span class=\"p\">);<\/span>\n\n    <span class=\"c1\">\/\/ Start broadcasting transactions from the deployer account<\/span>\n    <span class=\"nx\">vm<\/span><span class=\"p\">.<\/span><span class=\"nf\">startBroadcast<\/span><span class=\"p\">(<\/span><span class=\"nx\">deployerPrivateKey<\/span><span class=\"p\">);<\/span>\n\n    <span class=\"nx\">address<\/span> <span class=\"nx\">revealVerifier<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">address<\/span><span class=\"p\">(<\/span><span class=\"k\">new<\/span> <span class=\"nc\">RevealVerifier<\/span><span class=\"p\">());<\/span>\n    <span class=\"nx\">VerifierContracts<\/span><span class=\"p\">.<\/span><span class=\"nf\">setRevealContractAddress<\/span><span class=\"p\">(<\/span><span class=\"nx\">revealVerifier<\/span><span class=\"p\">);<\/span>\n\n    <span class=\"nx\">address<\/span> <span class=\"nx\">defendVerifier<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">address<\/span><span class=\"p\">(<\/span><span class=\"k\">new<\/span> <span class=\"nc\">DefendVerifier<\/span><span class=\"p\">());<\/span>\n    <span class=\"nx\">VerifierContracts<\/span><span class=\"p\">.<\/span><span class=\"nf\">setDefendContractAddress<\/span><span class=\"p\">(<\/span><span class=\"nx\">defendVerifier<\/span><span class=\"p\">);<\/span>\n\n    <span class=\"nx\">vm<\/span><span class=\"p\">.<\/span><span class=\"nf\">stopBroadcast<\/span><span class=\"p\">();<\/span>\n  <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"4_%D9%85%D8%B4%D8%AA%D8%B1%DB%8C_%D8%A8%D8%A7_Phaser_Snarkjs\"><\/span>\n<p>  4. \u0645\u0634\u062a\u0631\u06cc \u0628\u0627 Phaser + Snarkjs<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0641\u0627\u06cc\u0644\u06cc \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f \u06a9\u0647 \u0645\u0646\u0637\u0642 \u0631\u0627\u0628\u0637 \u06a9\u0627\u0631\u0628\u0631\u06cc \u0631\u0627 \u0645\u062f\u06cc\u0631\u06cc\u062a \u06a9\u0646\u062f. \u0627\u06cc\u0646 \u0641\u0627\u06cc\u0644 \u0627\u0639\u0645\u0627\u0644 \u0645\u0627\u0648\u0633 \u0631\u0627 \u0628\u0631\u0627\u06cc \u06a9\u0634\u06cc\u062f\u0646 \u0628\u0647 \u062d\u0631\u06a9\u062a\u060c \u0627\u062a\u0635\u0627\u0644 \u062f\u0648 \u06a9\u0627\u0631\u0627\u06a9\u062a\u0631 \u0628\u0647 \u062d\u0645\u0644\u0647 \u0648 \u06a9\u0644\u06cc\u06a9 \u06a9\u0631\u062f\u0646 \u0628\u0631\u0627\u06cc \u062f\u0641\u0627\u0639 \u0631\u0627 \u0645\u062f\u06cc\u0631\u06cc\u062a \u0645\u06cc \u06a9\u0646\u062f. \u0639\u0644\u0627\u0648\u0647 \u0628\u0631 \u0627\u06cc\u0646\u060c \u0645\u0646\u0637\u0642 \u0627\u0646\u06cc\u0645\u06cc\u0634\u0646 \u0647\u0627 \u0631\u0627 \u062a\u0639\u0631\u06cc\u0641 \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p><code>packages\/client\/src\/layers\/phaser\/systems\/myGameSystem.ts<\/code><\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">Has<\/span><span class=\"p\">,<\/span> <span class=\"nx\">defineEnterSystem<\/span><span class=\"p\">,<\/span> <span class=\"nx\">defineExitSystem<\/span><span class=\"p\">,<\/span> <span class=\"nx\">defineSystem<\/span><span class=\"p\">,<\/span> <span class=\"nx\">getComponentValueStrict<\/span><span class=\"p\">,<\/span> <span class=\"nx\">getComponentValue<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">@latticexyz\/recs<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">PhaserLayer<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">..\/createPhaserLayer<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> \n  <span class=\"nx\">pixelCoordToTileCoord<\/span><span class=\"p\">,<\/span>\n  <span class=\"nx\">tileCoordToPixelCoord<\/span>\n<span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">@latticexyz\/phaserx<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">TILE_WIDTH<\/span><span class=\"p\">,<\/span> <span class=\"nx\">TILE_HEIGHT<\/span><span class=\"p\">,<\/span> <span class=\"nx\">Animations<\/span><span class=\"p\">,<\/span> <span class=\"nx\">Directions<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">..\/constants<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n\n<span class=\"kd\">function<\/span> <span class=\"nf\">decodePosition<\/span><span class=\"p\">(<\/span><span class=\"nx\">hexString<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">hexString<\/span><span class=\"p\">.<\/span><span class=\"nf\">startsWith<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">0x<\/span><span class=\"dl\">'<\/span><span class=\"p\">))<\/span> <span class=\"p\">{<\/span>\n        <span class=\"nx\">hexString<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">hexString<\/span><span class=\"p\">.<\/span><span class=\"nf\">slice<\/span><span class=\"p\">(<\/span><span class=\"mi\">2<\/span><span class=\"p\">);<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"kd\">const<\/span> <span class=\"nx\">halfLength<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">hexString<\/span><span class=\"p\">.<\/span><span class=\"nx\">length<\/span> <span class=\"o\">\/<\/span> <span class=\"mi\">2<\/span><span class=\"p\">;<\/span>\n    <span class=\"kd\">const<\/span> <span class=\"nx\">firstHalfHex<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">hexString<\/span><span class=\"p\">.<\/span><span class=\"nf\">slice<\/span><span class=\"p\">(<\/span><span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"nx\">halfLength<\/span><span class=\"p\">);<\/span>\n    <span class=\"kd\">const<\/span> <span class=\"nx\">secondHalfHex<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">hexString<\/span><span class=\"p\">.<\/span><span class=\"nf\">slice<\/span><span class=\"p\">(<\/span><span class=\"nx\">halfLength<\/span><span class=\"p\">);<\/span>\n\n    <span class=\"kd\">const<\/span> <span class=\"nx\">firstHalfInt32<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">getSignedInt32<\/span><span class=\"p\">(<\/span><span class=\"nx\">firstHalfHex<\/span><span class=\"p\">);<\/span>\n    <span class=\"kd\">const<\/span> <span class=\"nx\">secondHalfInt32<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">getSignedInt32<\/span><span class=\"p\">(<\/span><span class=\"nx\">secondHalfHex<\/span><span class=\"p\">);<\/span>\n\n    <span class=\"k\">return<\/span> <span class=\"p\">{<\/span> <span class=\"na\">x<\/span><span class=\"p\">:<\/span> <span class=\"nx\">firstHalfInt32<\/span><span class=\"p\">,<\/span> <span class=\"na\">y<\/span><span class=\"p\">:<\/span> <span class=\"nx\">secondHalfInt32<\/span> <span class=\"p\">};<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"kd\">function<\/span> <span class=\"nf\">getSignedInt32<\/span><span class=\"p\">(<\/span><span class=\"nx\">hexStr<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n    <span class=\"kd\">const<\/span> <span class=\"nx\">int32Value<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">parseInt<\/span><span class=\"p\">(<\/span><span class=\"nx\">hexStr<\/span><span class=\"p\">.<\/span><span class=\"nf\">slice<\/span><span class=\"p\">(<\/span><span class=\"o\">-<\/span><span class=\"mi\">8<\/span><span class=\"p\">),<\/span> <span class=\"mi\">16<\/span><span class=\"p\">);<\/span>\n\n    <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">int32Value<\/span> <span class=\"o\">&gt;<\/span> <span class=\"mh\">0x7FFFFFFF<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"nx\">int32Value<\/span> <span class=\"o\">-<\/span> <span class=\"mh\">0x100000000<\/span><span class=\"p\">;<\/span>\n    <span class=\"p\">}<\/span>\n    <span class=\"k\">return<\/span> <span class=\"nx\">int32Value<\/span><span class=\"p\">;<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"kd\">function<\/span> <span class=\"nf\">encodePosition<\/span><span class=\"p\">(<\/span><span class=\"nx\">x<\/span><span class=\"p\">:<\/span> <span class=\"kr\">number<\/span><span class=\"p\">,<\/span> <span class=\"nx\">y<\/span><span class=\"p\">:<\/span> <span class=\"kr\">number<\/span><span class=\"p\">):<\/span> <span class=\"kr\">string<\/span> <span class=\"p\">{<\/span>\n    <span class=\"kd\">const<\/span> <span class=\"nx\">xHex<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">int256ToHex<\/span><span class=\"p\">(<\/span><span class=\"nx\">x<\/span><span class=\"p\">);<\/span>\n    <span class=\"kd\">const<\/span> <span class=\"nx\">yHex<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">int256ToHex<\/span><span class=\"p\">(<\/span><span class=\"nx\">y<\/span><span class=\"p\">);<\/span>\n\n    <span class=\"c1\">\/\/ Concatenate the two 32-byte hex values to form a 64-byte hex string<\/span>\n    <span class=\"k\">return<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">0x<\/span><span class=\"dl\">'<\/span> <span class=\"o\">+<\/span> <span class=\"nx\">xHex<\/span> <span class=\"o\">+<\/span> <span class=\"nx\">yHex<\/span><span class=\"p\">;<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"kd\">function<\/span> <span class=\"nf\">int256ToHex<\/span><span class=\"p\">(<\/span><span class=\"nx\">value<\/span><span class=\"p\">:<\/span> <span class=\"kr\">number<\/span><span class=\"p\">):<\/span> <span class=\"kr\">string<\/span> <span class=\"p\">{<\/span>\n    <span class=\"c1\">\/\/ If the value is negative, convert it to a 256-bit unsigned integer<\/span>\n    <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">value<\/span> <span class=\"o\"> <span class=\"mi\">0<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n        <span class=\"nx\">value<\/span> <span class=\"o\">=<\/span> <span class=\"nc\">BigInt<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">0x10000000000000000000000000000000000000000000000000000000000000000<\/span><span class=\"dl\">'<\/span><span class=\"p\">)<\/span> <span class=\"o\">+<\/span> <span class=\"nc\">BigInt<\/span><span class=\"p\">(<\/span><span class=\"nx\">value<\/span><span class=\"p\">);<\/span>\n    <span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"p\">{<\/span>\n        <span class=\"nx\">value<\/span> <span class=\"o\">=<\/span> <span class=\"nc\">BigInt<\/span><span class=\"p\">(<\/span><span class=\"nx\">value<\/span><span class=\"p\">);<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"c1\">\/\/ Convert the integer to a hexadecimal string, ensuring it has 64 characters (256 bits)<\/span>\n    <span class=\"kd\">let<\/span> <span class=\"nx\">hexStr<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">value<\/span><span class=\"p\">.<\/span><span class=\"nf\">toString<\/span><span class=\"p\">(<\/span><span class=\"mi\">16<\/span><span class=\"p\">);<\/span>\n    <span class=\"k\">while <\/span><span class=\"p\">(<\/span><span class=\"nx\">hexStr<\/span><span class=\"p\">.<\/span><span class=\"nx\">length<\/span> <span class=\"o\"> <span class=\"mi\">64<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n        <span class=\"nx\">hexStr<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">0<\/span><span class=\"dl\">'<\/span> <span class=\"o\">+<\/span> <span class=\"nx\">hexStr<\/span><span class=\"p\">;<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"k\">return<\/span> <span class=\"nx\">hexStr<\/span><span class=\"p\">;<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"kd\">const<\/span> <span class=\"nx\">createMyGameSystem<\/span> <span class=\"o\">=<\/span> <span class=\"p\">(<\/span><span class=\"nx\">layer<\/span><span class=\"p\">:<\/span> <span class=\"nx\">PhaserLayer<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"p\">{<\/span>\n    <span class=\"nx\">world<\/span><span class=\"p\">,<\/span>\n    <span class=\"na\">networkLayer<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n      <span class=\"na\">components<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">Character<\/span> <span class=\"p\">},<\/span>\n      <span class=\"na\">systemCalls<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">spawn<\/span><span class=\"p\">,<\/span> <span class=\"nx\">move<\/span><span class=\"p\">,<\/span> <span class=\"nx\">attack<\/span><span class=\"p\">,<\/span> <span class=\"nx\">defend<\/span><span class=\"p\">,<\/span> <span class=\"nx\">playerEntity<\/span> <span class=\"p\">}<\/span>\n    <span class=\"p\">},<\/span>\n    <span class=\"na\">scenes<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n        <span class=\"na\">Main<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">objectPool<\/span><span class=\"p\">,<\/span> <span class=\"nx\">input<\/span> <span class=\"p\">}<\/span>\n    <span class=\"p\">}<\/span>\n  <span class=\"p\">}<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">layer<\/span><span class=\"p\">;<\/span>\n\n  <span class=\"kd\">let<\/span> <span class=\"na\">startPoint<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span> <span class=\"na\">x<\/span><span class=\"p\">:<\/span> <span class=\"kr\">number<\/span><span class=\"p\">;<\/span> <span class=\"nl\">y<\/span><span class=\"p\">:<\/span> <span class=\"kr\">number<\/span> <span class=\"p\">}<\/span> <span class=\"o\">|<\/span> <span class=\"kc\">null<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">null<\/span><span class=\"p\">;<\/span>\n  <span class=\"kd\">let<\/span> <span class=\"na\">draggedEntity<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span> <span class=\"o\">|<\/span> <span class=\"kc\">null<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">null<\/span><span class=\"p\">;<\/span>\n\n  <span class=\"kd\">let<\/span> <span class=\"nx\">playerRectangle1<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">objectPool<\/span><span class=\"p\">.<\/span><span class=\"nf\">get<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">PlayerRectangle1<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">Rectangle<\/span><span class=\"dl\">\"<\/span><span class=\"p\">);<\/span>\n  <span class=\"kd\">let<\/span> <span class=\"nx\">playerRectangle2<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">objectPool<\/span><span class=\"p\">.<\/span><span class=\"nf\">get<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">PlayerRectangle2<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">Rectangle<\/span><span class=\"dl\">\"<\/span><span class=\"p\">);<\/span>\n  <span class=\"kd\">let<\/span> <span class=\"nx\">playerRectangle3<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">objectPool<\/span><span class=\"p\">.<\/span><span class=\"nf\">get<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">PlayerRectangle3<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">Rectangle<\/span><span class=\"dl\">\"<\/span><span class=\"p\">);<\/span>\n  <span class=\"kd\">let<\/span> <span class=\"nx\">playerRectangle4<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">objectPool<\/span><span class=\"p\">.<\/span><span class=\"nf\">get<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">PlayerRectangle4<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">Rectangle<\/span><span class=\"dl\">\"<\/span><span class=\"p\">);<\/span>\n  <span class=\"kd\">let<\/span> <span class=\"nx\">arrowLine1<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">objectPool<\/span><span class=\"p\">.<\/span><span class=\"nf\">get<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">ArrowLine1<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">Line<\/span><span class=\"dl\">\"<\/span><span class=\"p\">);<\/span>\n  <span class=\"kd\">let<\/span> <span class=\"nx\">arrowLine2<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">objectPool<\/span><span class=\"p\">.<\/span><span class=\"nf\">get<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">ArrowLine2<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">Line<\/span><span class=\"dl\">\"<\/span><span class=\"p\">);<\/span>\n  <span class=\"kd\">let<\/span> <span class=\"nx\">arrowLine3<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">objectPool<\/span><span class=\"p\">.<\/span><span class=\"nf\">get<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">ArrowLine3<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">Line<\/span><span class=\"dl\">\"<\/span><span class=\"p\">);<\/span>\n\n  <span class=\"kd\">let<\/span> <span class=\"nx\">secretCharacterValues<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"mi\">4<\/span><span class=\"p\">,<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"mi\">2<\/span><span class=\"p\">,<\/span> <span class=\"mi\">3<\/span><span class=\"p\">];<\/span>\n  <span class=\"kd\">let<\/span> <span class=\"nx\">privateSalt<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">123<\/span><span class=\"p\">;<\/span>\n\n  <span class=\"nx\">input<\/span><span class=\"p\">.<\/span><span class=\"nx\">pointerdown$<\/span><span class=\"p\">.<\/span><span class=\"nf\">subscribe<\/span><span class=\"p\">((<\/span><span class=\"nx\">event<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n    <span class=\"kd\">const<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">worldX<\/span><span class=\"p\">,<\/span> <span class=\"nx\">worldY<\/span> <span class=\"p\">}<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">event<\/span><span class=\"p\">.<\/span><span class=\"nx\">pointer<\/span><span class=\"p\">;<\/span>\n    <span class=\"kd\">const<\/span> <span class=\"nx\">player<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">pixelCoordToTileCoord<\/span><span class=\"p\">({<\/span> <span class=\"na\">x<\/span><span class=\"p\">:<\/span> <span class=\"nx\">worldX<\/span><span class=\"p\">,<\/span> <span class=\"na\">y<\/span><span class=\"p\">:<\/span> <span class=\"nx\">worldY<\/span> <span class=\"p\">},<\/span> <span class=\"nx\">TILE_WIDTH<\/span><span class=\"p\">,<\/span> <span class=\"nx\">TILE_HEIGHT<\/span><span class=\"p\">);<\/span>\n\n    <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">player<\/span><span class=\"p\">.<\/span><span class=\"nx\">x<\/span> <span class=\"o\">===<\/span> <span class=\"mi\">0<\/span> <span class=\"o\">&amp;&amp;<\/span> <span class=\"nx\">player<\/span><span class=\"p\">.<\/span><span class=\"nx\">y<\/span> <span class=\"o\">===<\/span> <span class=\"mi\">0<\/span><span class=\"p\">)<\/span> <span class=\"k\">return<\/span><span class=\"p\">;<\/span>\n\n    <span class=\"kd\">let<\/span> <span class=\"nx\">coordinates<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">pixelCoordToTileCoord<\/span><span class=\"p\">({<\/span> <span class=\"na\">x<\/span><span class=\"p\">:<\/span> <span class=\"nx\">worldX<\/span><span class=\"p\">,<\/span> <span class=\"na\">y<\/span><span class=\"p\">:<\/span> <span class=\"nx\">worldY<\/span> <span class=\"p\">},<\/span> <span class=\"nx\">TILE_WIDTH<\/span><span class=\"p\">,<\/span> <span class=\"nx\">TILE_HEIGHT<\/span><span class=\"p\">);<\/span>\n    <span class=\"kd\">let<\/span> <span class=\"nx\">encodedPosition<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">encodePosition<\/span><span class=\"p\">(<\/span><span class=\"nx\">coordinates<\/span><span class=\"p\">.<\/span><span class=\"nx\">x<\/span><span class=\"p\">,<\/span> <span class=\"nx\">coordinates<\/span><span class=\"p\">.<\/span><span class=\"nx\">y<\/span><span class=\"p\">);<\/span>\n\n    <span class=\"kd\">const<\/span> <span class=\"nx\">character<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">getComponentValue<\/span><span class=\"p\">(<\/span><span class=\"nx\">Character<\/span><span class=\"p\">,<\/span> <span class=\"nx\">encodedPosition<\/span><span class=\"p\">);<\/span>\n\n    <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">character<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n        <span class=\"nx\">startPoint<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span> <span class=\"na\">x<\/span><span class=\"p\">:<\/span> <span class=\"nx\">worldX<\/span><span class=\"p\">,<\/span> <span class=\"na\">y<\/span><span class=\"p\">:<\/span> <span class=\"nx\">worldY<\/span> <span class=\"p\">};<\/span>\n        <span class=\"nx\">draggedEntity<\/span> <span class=\"o\">=<\/span> <span class=\"s2\">`<\/span><span class=\"p\">${<\/span><span class=\"nx\">player<\/span><span class=\"p\">.<\/span><span class=\"nx\">x<\/span><span class=\"p\">}<\/span><span class=\"s2\">-<\/span><span class=\"p\">${<\/span><span class=\"nx\">player<\/span><span class=\"p\">.<\/span><span class=\"nx\">y<\/span><span class=\"p\">}<\/span><span class=\"s2\">`<\/span><span class=\"p\">;<\/span>\n    <span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"p\">{<\/span>\n        <span class=\"nf\">spawn<\/span><span class=\"p\">(<\/span><span class=\"nx\">player<\/span><span class=\"p\">.<\/span><span class=\"nx\">x<\/span><span class=\"p\">,<\/span> <span class=\"nx\">player<\/span><span class=\"p\">.<\/span><span class=\"nx\">y<\/span><span class=\"p\">,<\/span> <span class=\"mi\">123<\/span><span class=\"p\">);<\/span>\n    <span class=\"p\">}<\/span>\n  <span class=\"p\">});<\/span>\n\n  <span class=\"nx\">input<\/span><span class=\"p\">.<\/span><span class=\"nx\">pointermove$<\/span><span class=\"p\">.<\/span><span class=\"nf\">subscribe<\/span><span class=\"p\">((<\/span><span class=\"nx\">event<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">startPoint<\/span> <span class=\"o\">&amp;&amp;<\/span> <span class=\"nx\">draggedEntity<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n        <span class=\"kd\">const<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">worldX<\/span><span class=\"p\">,<\/span> <span class=\"nx\">worldY<\/span> <span class=\"p\">}<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">event<\/span><span class=\"p\">.<\/span><span class=\"nx\">pointer<\/span><span class=\"p\">;<\/span>\n\n        <span class=\"c1\">\/\/ Draw the main line<\/span>\n        <span class=\"nx\">arrowLine1<\/span><span class=\"p\">.<\/span><span class=\"nf\">setComponent<\/span><span class=\"p\">({<\/span>\n          <span class=\"na\">id<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">line<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">once<\/span><span class=\"p\">:<\/span> <span class=\"p\">(<\/span><span class=\"nx\">line<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n            <span class=\"nx\">line<\/span><span class=\"p\">.<\/span><span class=\"nx\">visible<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">true<\/span><span class=\"p\">;<\/span>\n            <span class=\"nx\">line<\/span><span class=\"p\">.<\/span><span class=\"nx\">isStroked<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">true<\/span><span class=\"p\">;<\/span>\n            <span class=\"nx\">line<\/span><span class=\"p\">.<\/span><span class=\"nf\">setFillStyle<\/span><span class=\"p\">(<\/span><span class=\"mh\">0xff00ff<\/span><span class=\"p\">);<\/span>\n            <span class=\"nx\">line<\/span><span class=\"p\">.<\/span><span class=\"nx\">geom<\/span><span class=\"p\">.<\/span><span class=\"nx\">x1<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">startPoint<\/span><span class=\"p\">.<\/span><span class=\"nx\">x<\/span><span class=\"p\">;<\/span>\n            <span class=\"nx\">line<\/span><span class=\"p\">.<\/span><span class=\"nx\">geom<\/span><span class=\"p\">.<\/span><span class=\"nx\">y1<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">startPoint<\/span><span class=\"p\">.<\/span><span class=\"nx\">y<\/span><span class=\"p\">;<\/span>\n            <span class=\"nx\">line<\/span><span class=\"p\">.<\/span><span class=\"nx\">geom<\/span><span class=\"p\">.<\/span><span class=\"nx\">x2<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">worldX<\/span><span class=\"p\">;<\/span>\n            <span class=\"nx\">line<\/span><span class=\"p\">.<\/span><span class=\"nx\">geom<\/span><span class=\"p\">.<\/span><span class=\"nx\">y2<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">worldY<\/span><span class=\"p\">;<\/span>\n          <span class=\"p\">},<\/span>\n        <span class=\"p\">});<\/span>\n\n        <span class=\"c1\">\/\/ Draw an arrowhead effect at the end point<\/span>\n        <span class=\"kd\">const<\/span> <span class=\"nx\">arrowLength<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">20<\/span><span class=\"p\">;<\/span>\n        <span class=\"kd\">const<\/span> <span class=\"nx\">angle<\/span> <span class=\"o\">=<\/span> <span class=\"nb\">Math<\/span><span class=\"p\">.<\/span><span class=\"nf\">atan2<\/span><span class=\"p\">(<\/span><span class=\"nx\">worldY<\/span> <span class=\"o\">-<\/span> <span class=\"nx\">startPoint<\/span><span class=\"p\">.<\/span><span class=\"nx\">y<\/span><span class=\"p\">,<\/span> <span class=\"nx\">worldX<\/span> <span class=\"o\">-<\/span> <span class=\"nx\">startPoint<\/span><span class=\"p\">.<\/span><span class=\"nx\">x<\/span><span class=\"p\">);<\/span>\n\n        <span class=\"nx\">arrowLine2<\/span><span class=\"p\">.<\/span><span class=\"nf\">setComponent<\/span><span class=\"p\">({<\/span>\n          <span class=\"na\">id<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">line<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">once<\/span><span class=\"p\">:<\/span> <span class=\"p\">(<\/span><span class=\"nx\">line<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n            <span class=\"nx\">line<\/span><span class=\"p\">.<\/span><span class=\"nx\">visible<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">true<\/span><span class=\"p\">;<\/span>\n            <span class=\"nx\">line<\/span><span class=\"p\">.<\/span><span class=\"nx\">isStroked<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">true<\/span><span class=\"p\">;<\/span>\n            <span class=\"nx\">line<\/span><span class=\"p\">.<\/span><span class=\"nf\">setFillStyle<\/span><span class=\"p\">(<\/span><span class=\"mh\">0x00ff00<\/span><span class=\"p\">);<\/span>\n            <span class=\"nx\">line<\/span><span class=\"p\">.<\/span><span class=\"nx\">geom<\/span><span class=\"p\">.<\/span><span class=\"nx\">x1<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">worldX<\/span><span class=\"p\">;<\/span>\n            <span class=\"nx\">line<\/span><span class=\"p\">.<\/span><span class=\"nx\">geom<\/span><span class=\"p\">.<\/span><span class=\"nx\">y1<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">worldY<\/span><span class=\"p\">;<\/span>\n            <span class=\"nx\">line<\/span><span class=\"p\">.<\/span><span class=\"nx\">geom<\/span><span class=\"p\">.<\/span><span class=\"nx\">x2<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">worldX<\/span> <span class=\"o\">-<\/span> <span class=\"nx\">arrowLength<\/span> <span class=\"o\">*<\/span> <span class=\"nb\">Math<\/span><span class=\"p\">.<\/span><span class=\"nf\">cos<\/span><span class=\"p\">(<\/span><span class=\"nx\">angle<\/span> <span class=\"o\">-<\/span> <span class=\"nb\">Math<\/span><span class=\"p\">.<\/span><span class=\"nx\">PI<\/span> <span class=\"o\">\/<\/span> <span class=\"mi\">6<\/span><span class=\"p\">);<\/span>\n            <span class=\"nx\">line<\/span><span class=\"p\">.<\/span><span class=\"nx\">geom<\/span><span class=\"p\">.<\/span><span class=\"nx\">y2<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">worldY<\/span> <span class=\"o\">-<\/span> <span class=\"nx\">arrowLength<\/span> <span class=\"o\">*<\/span> <span class=\"nb\">Math<\/span><span class=\"p\">.<\/span><span class=\"nf\">sin<\/span><span class=\"p\">(<\/span><span class=\"nx\">angle<\/span> <span class=\"o\">-<\/span> <span class=\"nb\">Math<\/span><span class=\"p\">.<\/span><span class=\"nx\">PI<\/span> <span class=\"o\">\/<\/span> <span class=\"mi\">6<\/span><span class=\"p\">);<\/span>\n          <span class=\"p\">},<\/span>\n        <span class=\"p\">});<\/span>\n\n        <span class=\"nx\">arrowLine3<\/span><span class=\"p\">.<\/span><span class=\"nf\">setComponent<\/span><span class=\"p\">({<\/span>\n          <span class=\"na\">id<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">line<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">once<\/span><span class=\"p\">:<\/span> <span class=\"p\">(<\/span><span class=\"nx\">line<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n            <span class=\"nx\">line<\/span><span class=\"p\">.<\/span><span class=\"nx\">visible<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">true<\/span><span class=\"p\">;<\/span>\n            <span class=\"nx\">line<\/span><span class=\"p\">.<\/span><span class=\"nx\">isStroked<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">true<\/span><span class=\"p\">;<\/span>\n            <span class=\"nx\">line<\/span><span class=\"p\">.<\/span><span class=\"nf\">setFillStyle<\/span><span class=\"p\">(<\/span><span class=\"mh\">0x00ff00<\/span><span class=\"p\">);<\/span>\n            <span class=\"nx\">line<\/span><span class=\"p\">.<\/span><span class=\"nx\">geom<\/span><span class=\"p\">.<\/span><span class=\"nx\">x1<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">worldX<\/span><span class=\"p\">;<\/span>\n            <span class=\"nx\">line<\/span><span class=\"p\">.<\/span><span class=\"nx\">geom<\/span><span class=\"p\">.<\/span><span class=\"nx\">y1<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">worldY<\/span><span class=\"p\">;<\/span>\n            <span class=\"nx\">line<\/span><span class=\"p\">.<\/span><span class=\"nx\">geom<\/span><span class=\"p\">.<\/span><span class=\"nx\">x2<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">worldX<\/span> <span class=\"o\">-<\/span> <span class=\"nx\">arrowLength<\/span> <span class=\"o\">*<\/span> <span class=\"nb\">Math<\/span><span class=\"p\">.<\/span><span class=\"nf\">cos<\/span><span class=\"p\">(<\/span><span class=\"nx\">angle<\/span> <span class=\"o\">+<\/span> <span class=\"nb\">Math<\/span><span class=\"p\">.<\/span><span class=\"nx\">PI<\/span> <span class=\"o\">\/<\/span> <span class=\"mi\">6<\/span><span class=\"p\">);<\/span>\n            <span class=\"nx\">line<\/span><span class=\"p\">.<\/span><span class=\"nx\">geom<\/span><span class=\"p\">.<\/span><span class=\"nx\">y2<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">worldY<\/span> <span class=\"o\">-<\/span> <span class=\"nx\">arrowLength<\/span> <span class=\"o\">*<\/span> <span class=\"nb\">Math<\/span><span class=\"p\">.<\/span><span class=\"nf\">sin<\/span><span class=\"p\">(<\/span><span class=\"nx\">angle<\/span> <span class=\"o\">+<\/span> <span class=\"nb\">Math<\/span><span class=\"p\">.<\/span><span class=\"nx\">PI<\/span> <span class=\"o\">\/<\/span> <span class=\"mi\">6<\/span><span class=\"p\">);<\/span>\n          <span class=\"p\">},<\/span>\n        <span class=\"p\">});<\/span>\n    <span class=\"p\">}<\/span>\n  <span class=\"p\">});<\/span>\n\n  <span class=\"nx\">input<\/span><span class=\"p\">.<\/span><span class=\"nx\">pointerup$<\/span><span class=\"p\">.<\/span><span class=\"nf\">subscribe<\/span><span class=\"p\">((<\/span><span class=\"nx\">event<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">startPoint<\/span> <span class=\"o\">&amp;&amp;<\/span> <span class=\"nx\">draggedEntity<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n\n      <span class=\"kd\">const<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">worldX<\/span><span class=\"p\">,<\/span> <span class=\"nx\">worldY<\/span> <span class=\"p\">}<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">event<\/span><span class=\"p\">.<\/span><span class=\"nx\">pointer<\/span><span class=\"p\">;<\/span>\n\n      <span class=\"kd\">const<\/span> <span class=\"nx\">startTile<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">pixelCoordToTileCoord<\/span><span class=\"p\">(<\/span><span class=\"nx\">startPoint<\/span><span class=\"p\">,<\/span> <span class=\"nx\">TILE_WIDTH<\/span><span class=\"p\">,<\/span> <span class=\"nx\">TILE_HEIGHT<\/span><span class=\"p\">);<\/span>\n      <span class=\"kd\">const<\/span> <span class=\"nx\">endTile<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">pixelCoordToTileCoord<\/span><span class=\"p\">({<\/span> <span class=\"na\">x<\/span><span class=\"p\">:<\/span> <span class=\"nx\">worldX<\/span><span class=\"p\">,<\/span> <span class=\"na\">y<\/span><span class=\"p\">:<\/span> <span class=\"nx\">worldY<\/span> <span class=\"p\">},<\/span> <span class=\"nx\">TILE_WIDTH<\/span><span class=\"p\">,<\/span> <span class=\"nx\">TILE_HEIGHT<\/span><span class=\"p\">);<\/span>\n\n      <span class=\"kd\">const<\/span> <span class=\"nx\">encodedDestinationPosition<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">encodePosition<\/span><span class=\"p\">(<\/span><span class=\"nx\">endTile<\/span><span class=\"p\">.<\/span><span class=\"nx\">x<\/span><span class=\"p\">,<\/span> <span class=\"nx\">endTile<\/span><span class=\"p\">.<\/span><span class=\"nx\">y<\/span><span class=\"p\">);<\/span>\n      <span class=\"kd\">const<\/span> <span class=\"nx\">destinationCharacter<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">getComponentValue<\/span><span class=\"p\">(<\/span><span class=\"nx\">Character<\/span><span class=\"p\">,<\/span> <span class=\"nx\">encodedDestinationPosition<\/span><span class=\"p\">);<\/span>\n      <span class=\"kd\">const<\/span> <span class=\"nx\">direction<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">calculateDirection<\/span><span class=\"p\">(<\/span><span class=\"nx\">startTile<\/span><span class=\"p\">,<\/span> <span class=\"nx\">endTile<\/span><span class=\"p\">);<\/span>\n\n      <span class=\"k\">if<\/span><span class=\"p\">(<\/span><span class=\"nx\">startTile<\/span><span class=\"p\">.<\/span><span class=\"nx\">x<\/span> <span class=\"o\">==<\/span> <span class=\"nx\">endTile<\/span><span class=\"p\">.<\/span><span class=\"nx\">x<\/span>\n          <span class=\"o\">&amp;&amp;<\/span> <span class=\"nx\">startTile<\/span><span class=\"p\">.<\/span><span class=\"nx\">y<\/span> <span class=\"o\">==<\/span> <span class=\"nx\">endTile<\/span><span class=\"p\">.<\/span><span class=\"nx\">y<\/span><span class=\"p\">)<\/span>\n      <span class=\"p\">{<\/span>\n\n        <span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nf\">log<\/span><span class=\"p\">(<\/span><span class=\"s2\">`Defending character at (<\/span><span class=\"p\">${<\/span><span class=\"nx\">startTile<\/span><span class=\"p\">.<\/span><span class=\"nx\">x<\/span><span class=\"p\">}<\/span><span class=\"s2\">, <\/span><span class=\"p\">${<\/span><span class=\"nx\">startTile<\/span><span class=\"p\">.<\/span><span class=\"nx\">y<\/span><span class=\"p\">}<\/span><span class=\"s2\">)`<\/span><span class=\"p\">);<\/span>\n\n        <span class=\"nf\">defend<\/span><span class=\"p\">(<\/span><span class=\"nx\">startTile<\/span><span class=\"p\">.<\/span><span class=\"nx\">x<\/span><span class=\"p\">,<\/span> <span class=\"nx\">startTile<\/span><span class=\"p\">.<\/span><span class=\"nx\">y<\/span><span class=\"p\">,<\/span>\n        <span class=\"p\">{<\/span>\n          <span class=\"na\">character1<\/span><span class=\"p\">:<\/span> <span class=\"nx\">secretCharacterValues<\/span><span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">],<\/span>\n          <span class=\"na\">character2<\/span><span class=\"p\">:<\/span> <span class=\"nx\">secretCharacterValues<\/span><span class=\"p\">[<\/span><span class=\"mi\">2<\/span><span class=\"p\">],<\/span>\n          <span class=\"na\">character3<\/span><span class=\"p\">:<\/span> <span class=\"nx\">secretCharacterValues<\/span><span class=\"p\">[<\/span><span class=\"mi\">3<\/span><span class=\"p\">],<\/span>\n          <span class=\"na\">character4<\/span><span class=\"p\">:<\/span> <span class=\"nx\">secretCharacterValues<\/span><span class=\"p\">[<\/span><span class=\"mi\">4<\/span><span class=\"p\">],<\/span>\n          <span class=\"na\">privateSalt<\/span><span class=\"p\">:<\/span> <span class=\"nx\">privateSalt<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">characterTarget<\/span><span class=\"p\">:<\/span> <span class=\"nx\">destinationCharacter<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">attackerLevel<\/span><span class=\"p\">:<\/span> <span class=\"nx\">destinationCharacter<\/span><span class=\"p\">.<\/span><span class=\"nx\">attackedByValue<\/span>\n        <span class=\"p\">});<\/span>\n\n      <span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">destinationCharacter<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n        <span class=\"kd\">const<\/span> <span class=\"nx\">encodedStartPosition<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">encodePosition<\/span><span class=\"p\">(<\/span><span class=\"nx\">startTile<\/span><span class=\"p\">.<\/span><span class=\"nx\">x<\/span><span class=\"p\">,<\/span> <span class=\"nx\">startTile<\/span><span class=\"p\">.<\/span><span class=\"nx\">y<\/span><span class=\"p\">);<\/span>\n        <span class=\"kd\">const<\/span> <span class=\"nx\">startCharacter<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">getComponentValue<\/span><span class=\"p\">(<\/span><span class=\"nx\">Character<\/span><span class=\"p\">,<\/span> <span class=\"nx\">encodedStartPosition<\/span><span class=\"p\">);<\/span>\n\n        <span class=\"nf\">attack<\/span><span class=\"p\">(<\/span><span class=\"nx\">startTile<\/span><span class=\"p\">.<\/span><span class=\"nx\">x<\/span><span class=\"p\">,<\/span> <span class=\"nx\">startTile<\/span><span class=\"p\">.<\/span><span class=\"nx\">y<\/span><span class=\"p\">,<\/span> <span class=\"nx\">endTile<\/span><span class=\"p\">.<\/span><span class=\"nx\">x<\/span><span class=\"p\">,<\/span> <span class=\"nx\">endTile<\/span><span class=\"p\">.<\/span><span class=\"nx\">y<\/span><span class=\"p\">,<\/span>\n          <span class=\"p\">{<\/span>\n            <span class=\"na\">character1<\/span><span class=\"p\">:<\/span> <span class=\"nx\">secretCharacterValues<\/span><span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">],<\/span>\n            <span class=\"na\">character2<\/span><span class=\"p\">:<\/span> <span class=\"nx\">secretCharacterValues<\/span><span class=\"p\">[<\/span><span class=\"mi\">2<\/span><span class=\"p\">],<\/span>\n            <span class=\"na\">character3<\/span><span class=\"p\">:<\/span> <span class=\"nx\">secretCharacterValues<\/span><span class=\"p\">[<\/span><span class=\"mi\">3<\/span><span class=\"p\">],<\/span>\n            <span class=\"na\">character4<\/span><span class=\"p\">:<\/span> <span class=\"nx\">secretCharacterValues<\/span><span class=\"p\">[<\/span><span class=\"mi\">4<\/span><span class=\"p\">],<\/span>\n            <span class=\"na\">privateSalt<\/span><span class=\"p\">:<\/span> <span class=\"nx\">privateSalt<\/span><span class=\"p\">,<\/span>\n            <span class=\"na\">characterReveal<\/span><span class=\"p\">:<\/span> <span class=\"nx\">startCharacter<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span><span class=\"p\">,<\/span>\n            <span class=\"na\">valueReveal<\/span><span class=\"p\">:<\/span> <span class=\"nx\">secretCharacterValues<\/span><span class=\"p\">[<\/span><span class=\"nx\">startCharacter<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span><span class=\"p\">]<\/span>\n          <span class=\"p\">}<\/span>\n        <span class=\"p\">);<\/span>\n        <span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nf\">log<\/span><span class=\"p\">(<\/span><span class=\"s2\">`Attacked character from (<\/span><span class=\"p\">${<\/span><span class=\"nx\">startTile<\/span><span class=\"p\">.<\/span><span class=\"nx\">x<\/span><span class=\"p\">}<\/span><span class=\"s2\">, <\/span><span class=\"p\">${<\/span><span class=\"nx\">startTile<\/span><span class=\"p\">.<\/span><span class=\"nx\">y<\/span><span class=\"p\">}<\/span><span class=\"s2\">) to (<\/span><span class=\"p\">${<\/span><span class=\"nx\">endTile<\/span><span class=\"p\">.<\/span><span class=\"nx\">x<\/span><span class=\"p\">}<\/span><span class=\"s2\">, <\/span><span class=\"p\">${<\/span><span class=\"nx\">endTile<\/span><span class=\"p\">.<\/span><span class=\"nx\">y<\/span><span class=\"p\">}<\/span><span class=\"s2\">)`<\/span><span class=\"p\">);<\/span>\n      <span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">direction<\/span> <span class=\"o\">!=<\/span> <span class=\"kc\">null<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n        <span class=\"nf\">move<\/span><span class=\"p\">(<\/span><span class=\"nx\">startTile<\/span><span class=\"p\">.<\/span><span class=\"nx\">x<\/span><span class=\"p\">,<\/span> <span class=\"nx\">startTile<\/span><span class=\"p\">.<\/span><span class=\"nx\">y<\/span><span class=\"p\">,<\/span> <span class=\"nx\">direction<\/span><span class=\"p\">);<\/span>\n        <span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nf\">log<\/span><span class=\"p\">(<\/span><span class=\"s2\">`Moved character from (<\/span><span class=\"p\">${<\/span><span class=\"nx\">startTile<\/span><span class=\"p\">.<\/span><span class=\"nx\">x<\/span><span class=\"p\">}<\/span><span class=\"s2\">, <\/span><span class=\"p\">${<\/span><span class=\"nx\">startTile<\/span><span class=\"p\">.<\/span><span class=\"nx\">y<\/span><span class=\"p\">}<\/span><span class=\"s2\">) to (<\/span><span class=\"p\">${<\/span><span class=\"nx\">endTile<\/span><span class=\"p\">.<\/span><span class=\"nx\">x<\/span><span class=\"p\">}<\/span><span class=\"s2\">, <\/span><span class=\"p\">${<\/span><span class=\"nx\">endTile<\/span><span class=\"p\">.<\/span><span class=\"nx\">y<\/span><span class=\"p\">}<\/span><span class=\"s2\">) in direction <\/span><span class=\"p\">${<\/span><span class=\"nx\">direction<\/span><span class=\"p\">}<\/span><span class=\"s2\">`<\/span><span class=\"p\">);<\/span>\n      <span class=\"p\">}<\/span> \n\n      <span class=\"nx\">startPoint<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">null<\/span><span class=\"p\">;<\/span>\n      <span class=\"nx\">draggedEntity<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">null<\/span><span class=\"p\">;<\/span>\n    <span class=\"p\">}<\/span>\n  <span class=\"p\">});<\/span>\n\n  <span class=\"nf\">defineEnterSystem<\/span><span class=\"p\">(<\/span><span class=\"nx\">world<\/span><span class=\"p\">,<\/span> <span class=\"p\">[<\/span><span class=\"nc\">Has<\/span><span class=\"p\">(<\/span><span class=\"nx\">Character<\/span><span class=\"p\">)],<\/span> <span class=\"p\">({<\/span> <span class=\"nx\">entity<\/span> <span class=\"p\">})<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n    <span class=\"kd\">const<\/span> <span class=\"nx\">character<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">getComponentValue<\/span><span class=\"p\">(<\/span><span class=\"nx\">Character<\/span><span class=\"p\">,<\/span> <span class=\"nx\">entity<\/span><span class=\"p\">);<\/span>\n\n    <span class=\"kd\">const<\/span> <span class=\"nx\">characterObj<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">objectPool<\/span><span class=\"p\">.<\/span><span class=\"nf\">get<\/span><span class=\"p\">(<\/span><span class=\"nx\">entity<\/span><span class=\"p\">,<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">Sprite<\/span><span class=\"dl\">\"<\/span><span class=\"p\">);<\/span>\n    <span class=\"nx\">characterObj<\/span><span class=\"p\">.<\/span><span class=\"nf\">setComponent<\/span><span class=\"p\">({<\/span>\n      <span class=\"na\">id<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">animation<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n      <span class=\"na\">once<\/span><span class=\"p\">:<\/span> <span class=\"p\">(<\/span><span class=\"nx\">sprite<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n        <span class=\"kd\">let<\/span> <span class=\"nx\">characterAnimation<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">character<\/span><span class=\"p\">.<\/span><span class=\"nx\">revealedValue<\/span><span class=\"p\">;<\/span>\n        <span class=\"kd\">const<\/span> <span class=\"nx\">playerIsOwner<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">0x<\/span><span class=\"dl\">\"<\/span> <span class=\"o\">+<\/span> <span class=\"nx\">playerEntity<\/span><span class=\"p\">.<\/span><span class=\"nf\">slice<\/span><span class=\"p\">(<\/span><span class=\"mi\">26<\/span><span class=\"p\">).<\/span><span class=\"nf\">toLowerCase<\/span><span class=\"p\">()<\/span> <span class=\"o\">==<\/span> <span class=\"dl\">\"\"<\/span> <span class=\"o\">+<\/span> <span class=\"nx\">character<\/span><span class=\"p\">.<\/span><span class=\"nx\">owner<\/span><span class=\"p\">.<\/span><span class=\"nf\">toLowerCase<\/span><span class=\"p\">()<\/span>\n        <span class=\"k\">if<\/span><span class=\"p\">(<\/span><span class=\"nx\">playerIsOwner<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n          <span class=\"nx\">characterAnimation<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">secretCharacterValues<\/span><span class=\"p\">[<\/span><span class=\"nx\">character<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span><span class=\"p\">];<\/span>\n        <span class=\"p\">}<\/span>\n        <span class=\"k\">if<\/span><span class=\"p\">(<\/span><span class=\"nx\">playerIsOwner<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n          <span class=\"kd\">const<\/span> <span class=\"nx\">characterPosition<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">tileCoordToPixelCoord<\/span><span class=\"p\">(<\/span><span class=\"nf\">decodePosition<\/span><span class=\"p\">(<\/span><span class=\"nx\">entity<\/span><span class=\"p\">),<\/span> <span class=\"nx\">TILE_WIDTH<\/span><span class=\"p\">,<\/span> <span class=\"nx\">TILE_HEIGHT<\/span><span class=\"p\">);<\/span>\n          <span class=\"kd\">let<\/span> <span class=\"nx\">rectangle<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">null<\/span>\n\n          <span class=\"k\">switch <\/span><span class=\"p\">(<\/span><span class=\"nx\">character<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span><span class=\"p\">)<\/span>  <span class=\"p\">{<\/span>\n            <span class=\"k\">case<\/span> <span class=\"mi\">1<\/span><span class=\"p\">:<\/span>\n              <span class=\"nx\">rectangle<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">playerRectangle1<\/span><span class=\"p\">;<\/span>\n              <span class=\"k\">break<\/span><span class=\"p\">;<\/span>\n            <span class=\"k\">case<\/span> <span class=\"mi\">2<\/span><span class=\"p\">:<\/span>\n              <span class=\"nx\">rectangle<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">playerRectangle2<\/span><span class=\"p\">;<\/span>\n              <span class=\"k\">break<\/span><span class=\"p\">;<\/span>\n            <span class=\"k\">case<\/span> <span class=\"mi\">3<\/span><span class=\"p\">:<\/span>\n              <span class=\"nx\">rectangle<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">playerRectangle3<\/span><span class=\"p\">;<\/span>\n              <span class=\"k\">break<\/span><span class=\"p\">;<\/span>\n            <span class=\"k\">case<\/span> <span class=\"mi\">4<\/span><span class=\"p\">:<\/span>\n              <span class=\"nx\">rectangle<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">playerRectangle4<\/span><span class=\"p\">;<\/span>\n              <span class=\"k\">break<\/span><span class=\"p\">;<\/span>\n          <span class=\"p\">}<\/span>\n\n          <span class=\"nx\">rectangle<\/span><span class=\"p\">.<\/span><span class=\"nf\">setComponent<\/span><span class=\"p\">({<\/span>\n            <span class=\"na\">id<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">rectangle<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n            <span class=\"na\">once<\/span><span class=\"p\">:<\/span> <span class=\"p\">(<\/span><span class=\"nx\">rectangle<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n              <span class=\"nx\">rectangle<\/span><span class=\"p\">.<\/span><span class=\"nf\">setPosition<\/span><span class=\"p\">(<\/span><span class=\"nx\">characterPosition<\/span><span class=\"p\">.<\/span><span class=\"nx\">x<\/span><span class=\"p\">,<\/span> <span class=\"nx\">characterPosition<\/span><span class=\"p\">.<\/span><span class=\"nx\">y<\/span><span class=\"p\">);<\/span>\n              <span class=\"nx\">rectangle<\/span><span class=\"p\">.<\/span><span class=\"nf\">setSize<\/span><span class=\"p\">(<\/span><span class=\"mi\">32<\/span><span class=\"p\">,<\/span><span class=\"mi\">32<\/span><span class=\"p\">);<\/span>\n              <span class=\"nx\">rectangle<\/span><span class=\"p\">.<\/span><span class=\"nf\">setFillStyle<\/span><span class=\"p\">(<\/span><span class=\"mh\">0x0000ff<\/span><span class=\"p\">);<\/span>\n              <span class=\"nx\">rectangle<\/span><span class=\"p\">.<\/span><span class=\"nf\">setAlpha<\/span><span class=\"p\">(<\/span><span class=\"mf\">0.25<\/span><span class=\"p\">);<\/span>\n            <span class=\"p\">},<\/span>\n          <span class=\"p\">});<\/span>\n\n        <span class=\"p\">}<\/span>\n        <span class=\"k\">switch <\/span><span class=\"p\">(<\/span><span class=\"nx\">characterAnimation<\/span><span class=\"p\">)<\/span>  <span class=\"p\">{<\/span>\n          <span class=\"k\">case<\/span> <span class=\"mi\">1<\/span><span class=\"p\">:<\/span>\n            <span class=\"nx\">sprite<\/span><span class=\"p\">.<\/span><span class=\"nf\">play<\/span><span class=\"p\">(<\/span><span class=\"nx\">Animations<\/span><span class=\"p\">.<\/span><span class=\"nx\">A<\/span><span class=\"p\">);<\/span>\n            <span class=\"k\">break<\/span><span class=\"p\">;<\/span>\n          <span class=\"k\">case<\/span> <span class=\"mi\">2<\/span><span class=\"p\">:<\/span>\n            <span class=\"nx\">sprite<\/span><span class=\"p\">.<\/span><span class=\"nf\">play<\/span><span class=\"p\">(<\/span><span class=\"nx\">Animations<\/span><span class=\"p\">.<\/span><span class=\"nx\">B<\/span><span class=\"p\">);<\/span>\n            <span class=\"k\">break<\/span><span class=\"p\">;<\/span>\n          <span class=\"k\">case<\/span> <span class=\"mi\">3<\/span><span class=\"p\">:<\/span>\n            <span class=\"nx\">sprite<\/span><span class=\"p\">.<\/span><span class=\"nf\">play<\/span><span class=\"p\">(<\/span><span class=\"nx\">Animations<\/span><span class=\"p\">.<\/span><span class=\"nx\">C<\/span><span class=\"p\">);<\/span>\n            <span class=\"k\">break<\/span><span class=\"p\">;<\/span>\n          <span class=\"k\">case<\/span> <span class=\"mi\">4<\/span><span class=\"p\">:<\/span>\n            <span class=\"nx\">sprite<\/span><span class=\"p\">.<\/span><span class=\"nf\">play<\/span><span class=\"p\">(<\/span><span class=\"nx\">Animations<\/span><span class=\"p\">.<\/span><span class=\"nx\">D<\/span><span class=\"p\">);<\/span>\n            <span class=\"k\">break<\/span><span class=\"p\">;<\/span>\n          <span class=\"nl\">default<\/span><span class=\"p\">:<\/span>\n            <span class=\"nx\">sprite<\/span><span class=\"p\">.<\/span><span class=\"nf\">play<\/span><span class=\"p\">(<\/span><span class=\"nx\">Animations<\/span><span class=\"p\">.<\/span><span class=\"nx\">Unknown<\/span><span class=\"p\">);<\/span>\n        <span class=\"p\">}<\/span>\n      <span class=\"p\">}<\/span>\n    <span class=\"p\">});<\/span>\n  <span class=\"p\">});<\/span>\n\n  <span class=\"nf\">defineExitSystem<\/span><span class=\"p\">(<\/span><span class=\"nx\">world<\/span><span class=\"p\">,<\/span> <span class=\"p\">[<\/span><span class=\"nc\">Has<\/span><span class=\"p\">(<\/span><span class=\"nx\">Character<\/span><span class=\"p\">)],<\/span> <span class=\"p\">({<\/span> <span class=\"nx\">entity<\/span> <span class=\"p\">})<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n    <span class=\"nx\">objectPool<\/span><span class=\"p\">.<\/span><span class=\"nf\">remove<\/span><span class=\"p\">(<\/span><span class=\"nx\">entity<\/span><span class=\"p\">);<\/span>\n  <span class=\"p\">});<\/span>\n\n  <span class=\"nf\">defineSystem<\/span><span class=\"p\">(<\/span><span class=\"nx\">world<\/span><span class=\"p\">,<\/span> <span class=\"p\">[<\/span><span class=\"nc\">Has<\/span><span class=\"p\">(<\/span><span class=\"nx\">Character<\/span><span class=\"p\">)],<\/span> <span class=\"p\">({<\/span> <span class=\"nx\">entity<\/span> <span class=\"p\">})<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n    <span class=\"kd\">const<\/span> <span class=\"nx\">character<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">getComponentValue<\/span><span class=\"p\">(<\/span><span class=\"nx\">Character<\/span><span class=\"p\">,<\/span> <span class=\"nx\">entity<\/span><span class=\"p\">);<\/span>\n    <span class=\"k\">if<\/span><span class=\"p\">(<\/span><span class=\"o\">!<\/span><span class=\"nx\">character<\/span><span class=\"p\">)<\/span>\n      <span class=\"k\">return<\/span><span class=\"p\">;<\/span>\n    <span class=\"kd\">const<\/span> <span class=\"nx\">pixelPosition<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">tileCoordToPixelCoord<\/span><span class=\"p\">(<\/span><span class=\"nf\">decodePosition<\/span><span class=\"p\">(<\/span><span class=\"nx\">entity<\/span><span class=\"p\">),<\/span> <span class=\"nx\">TILE_WIDTH<\/span><span class=\"p\">,<\/span> <span class=\"nx\">TILE_HEIGHT<\/span><span class=\"p\">);<\/span>\n    <span class=\"kd\">const<\/span> <span class=\"nx\">characterObj<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">objectPool<\/span><span class=\"p\">.<\/span><span class=\"nf\">get<\/span><span class=\"p\">(<\/span><span class=\"nx\">entity<\/span><span class=\"p\">,<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">Sprite<\/span><span class=\"dl\">\"<\/span><span class=\"p\">);<\/span>\n\n    <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">character<\/span><span class=\"p\">.<\/span><span class=\"nx\">isDead<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n      <span class=\"nx\">characterObj<\/span><span class=\"p\">.<\/span><span class=\"nf\">setComponent<\/span><span class=\"p\">({<\/span>\n        <span class=\"na\">id<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">animation<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n        <span class=\"na\">once<\/span><span class=\"p\">:<\/span> <span class=\"p\">(<\/span><span class=\"nx\">sprite<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n          <span class=\"nx\">sprite<\/span><span class=\"p\">.<\/span><span class=\"nf\">play<\/span><span class=\"p\">(<\/span><span class=\"nx\">Animations<\/span><span class=\"p\">.<\/span><span class=\"nx\">Dead<\/span><span class=\"p\">);<\/span>\n        <span class=\"p\">}<\/span>\n      <span class=\"p\">});<\/span>\n    <span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">character<\/span><span class=\"p\">.<\/span><span class=\"nx\">attackedAt<\/span> <span class=\"o\">!=<\/span> <span class=\"mi\">0<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n      <span class=\"nx\">characterObj<\/span><span class=\"p\">.<\/span><span class=\"nf\">setComponent<\/span><span class=\"p\">({<\/span>\n        <span class=\"na\">id<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">animation<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n        <span class=\"na\">once<\/span><span class=\"p\">:<\/span> <span class=\"p\">(<\/span><span class=\"nx\">sprite<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n          <span class=\"nx\">sprite<\/span><span class=\"p\">.<\/span><span class=\"nf\">play<\/span><span class=\"p\">(<\/span><span class=\"nx\">Animations<\/span><span class=\"p\">.<\/span><span class=\"nx\">Attacked<\/span><span class=\"p\">);<\/span>\n        <span class=\"p\">}<\/span>\n      <span class=\"p\">});<\/span>\n    <span class=\"p\">}<\/span> <span class=\"k\">else<\/span>\n    <span class=\"p\">{<\/span>\n      <span class=\"nx\">characterObj<\/span><span class=\"p\">.<\/span><span class=\"nf\">setComponent<\/span><span class=\"p\">({<\/span>\n        <span class=\"na\">id<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">animation<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\n        <span class=\"na\">once<\/span><span class=\"p\">:<\/span> <span class=\"p\">(<\/span><span class=\"nx\">sprite<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n          <span class=\"kd\">let<\/span> <span class=\"nx\">characterAnimation<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">character<\/span><span class=\"p\">.<\/span><span class=\"nx\">revealedValue<\/span><span class=\"p\">;<\/span>\n          <span class=\"kd\">const<\/span> <span class=\"nx\">playerIsOwner<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">0x<\/span><span class=\"dl\">\"<\/span> <span class=\"o\">+<\/span> <span class=\"nx\">playerEntity<\/span><span class=\"p\">.<\/span><span class=\"nf\">slice<\/span><span class=\"p\">(<\/span><span class=\"mi\">26<\/span><span class=\"p\">).<\/span><span class=\"nf\">toLowerCase<\/span><span class=\"p\">()<\/span> <span class=\"o\">==<\/span> <span class=\"dl\">\"\"<\/span> <span class=\"o\">+<\/span> <span class=\"nx\">character<\/span><span class=\"p\">.<\/span><span class=\"nx\">owner<\/span><span class=\"p\">.<\/span><span class=\"nf\">toLowerCase<\/span><span class=\"p\">()<\/span>\n          <span class=\"k\">if<\/span><span class=\"p\">(<\/span><span class=\"nx\">playerIsOwner<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n            <span class=\"nx\">characterAnimation<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">secretCharacterValues<\/span><span class=\"p\">[<\/span><span class=\"nx\">character<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span><span class=\"p\">];<\/span>\n          <span class=\"p\">}<\/span>\n          <span class=\"k\">if<\/span><span class=\"p\">(<\/span><span class=\"nx\">playerIsOwner<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n            <span class=\"c1\">\/\/sprite.setBackgroundColor(\"#0000ff\");<\/span>\n          <span class=\"p\">}<\/span>\n          <span class=\"k\">switch <\/span><span class=\"p\">(<\/span><span class=\"nx\">characterAnimation<\/span><span class=\"p\">)<\/span>  <span class=\"p\">{<\/span>\n            <span class=\"k\">case<\/span> <span class=\"mi\">1<\/span><span class=\"p\">:<\/span>\n              <span class=\"nx\">sprite<\/span><span class=\"p\">.<\/span><span class=\"nf\">play<\/span><span class=\"p\">(<\/span><span class=\"nx\">Animations<\/span><span class=\"p\">.<\/span><span class=\"nx\">A<\/span><span class=\"p\">);<\/span>\n              <span class=\"k\">break<\/span><span class=\"p\">;<\/span>\n            <span class=\"k\">case<\/span> <span class=\"mi\">2<\/span><span class=\"p\">:<\/span>\n              <span class=\"nx\">sprite<\/span><span class=\"p\">.<\/span><span class=\"nf\">play<\/span><span class=\"p\">(<\/span><span class=\"nx\">Animations<\/span><span class=\"p\">.<\/span><span class=\"nx\">B<\/span><span class=\"p\">);<\/span>\n              <span class=\"k\">break<\/span><span class=\"p\">;<\/span>\n            <span class=\"k\">case<\/span> <span class=\"mi\">3<\/span><span class=\"p\">:<\/span>\n              <span class=\"nx\">sprite<\/span><span class=\"p\">.<\/span><span class=\"nf\">play<\/span><span class=\"p\">(<\/span><span class=\"nx\">Animations<\/span><span class=\"p\">.<\/span><span class=\"nx\">C<\/span><span class=\"p\">);<\/span>\n              <span class=\"k\">break<\/span><span class=\"p\">;<\/span>\n            <span class=\"k\">case<\/span> <span class=\"mi\">4<\/span><span class=\"p\">:<\/span>\n              <span class=\"nx\">sprite<\/span><span class=\"p\">.<\/span><span class=\"nf\">play<\/span><span class=\"p\">(<\/span><span class=\"nx\">Animations<\/span><span class=\"p\">.<\/span><span class=\"nx\">D<\/span><span class=\"p\">);<\/span>\n              <span class=\"k\">break<\/span><span class=\"p\">;<\/span>\n            <span class=\"nl\">default<\/span><span class=\"p\">:<\/span>\n              <span class=\"nx\">sprite<\/span><span class=\"p\">.<\/span><span class=\"nf\">play<\/span><span class=\"p\">(<\/span><span class=\"nx\">Animations<\/span><span class=\"p\">.<\/span><span class=\"nx\">Unknown<\/span><span class=\"p\">);<\/span>\n          <span class=\"p\">}<\/span>\n        <span class=\"p\">}<\/span>\n      <span class=\"p\">});<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"nx\">characterObj<\/span><span class=\"p\">.<\/span><span class=\"nf\">setComponent<\/span><span class=\"p\">({<\/span>\n      <span class=\"na\">id<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">position<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n      <span class=\"na\">once<\/span><span class=\"p\">:<\/span> <span class=\"p\">(<\/span><span class=\"nx\">sprite<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n        <span class=\"nx\">sprite<\/span><span class=\"p\">.<\/span><span class=\"nf\">setPosition<\/span><span class=\"p\">(<\/span><span class=\"nx\">pixelPosition<\/span><span class=\"p\">.<\/span><span class=\"nx\">x<\/span><span class=\"p\">,<\/span> <span class=\"nx\">pixelPosition<\/span><span class=\"p\">.<\/span><span class=\"nx\">y<\/span><span class=\"p\">);<\/span>\n      <span class=\"p\">}<\/span>\n    <span class=\"p\">});<\/span>\n\n    <span class=\"nx\">arrowLine1<\/span><span class=\"p\">.<\/span><span class=\"nf\">setComponent<\/span><span class=\"p\">({<\/span>\n      <span class=\"na\">id<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">line<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n      <span class=\"na\">once<\/span><span class=\"p\">:<\/span> <span class=\"p\">(<\/span><span class=\"nx\">line<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n        <span class=\"nx\">line<\/span><span class=\"p\">.<\/span><span class=\"nx\">visible<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">false<\/span><span class=\"p\">;<\/span>\n      <span class=\"p\">},<\/span>\n    <span class=\"p\">});<\/span>\n\n    <span class=\"nx\">arrowLine2<\/span><span class=\"p\">.<\/span><span class=\"nf\">setComponent<\/span><span class=\"p\">({<\/span>\n      <span class=\"na\">id<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">line<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n      <span class=\"na\">once<\/span><span class=\"p\">:<\/span> <span class=\"p\">(<\/span><span class=\"nx\">line<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n        <span class=\"nx\">line<\/span><span class=\"p\">.<\/span><span class=\"nx\">visible<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">false<\/span><span class=\"p\">;<\/span>\n      <span class=\"p\">},<\/span>\n    <span class=\"p\">});<\/span>\n\n    <span class=\"nx\">arrowLine3<\/span><span class=\"p\">.<\/span><span class=\"nf\">setComponent<\/span><span class=\"p\">({<\/span>\n      <span class=\"na\">id<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">line<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n      <span class=\"na\">once<\/span><span class=\"p\">:<\/span> <span class=\"p\">(<\/span><span class=\"nx\">line<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n        <span class=\"nx\">line<\/span><span class=\"p\">.<\/span><span class=\"nx\">visible<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">false<\/span><span class=\"p\">;<\/span>\n      <span class=\"p\">},<\/span>\n    <span class=\"p\">});<\/span>\n  <span class=\"p\">});<\/span>\n\n  <span class=\"kd\">function<\/span> <span class=\"nf\">calculateDirection<\/span><span class=\"p\">(<\/span><span class=\"na\">start<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span> <span class=\"na\">x<\/span><span class=\"p\">:<\/span> <span class=\"kr\">number<\/span><span class=\"p\">,<\/span> <span class=\"na\">y<\/span><span class=\"p\">:<\/span> <span class=\"kr\">number<\/span> <span class=\"p\">},<\/span> <span class=\"na\">end<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span> <span class=\"na\">x<\/span><span class=\"p\">:<\/span> <span class=\"kr\">number<\/span><span class=\"p\">,<\/span> <span class=\"na\">y<\/span><span class=\"p\">:<\/span> <span class=\"kr\">number<\/span> <span class=\"p\">})<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">end<\/span><span class=\"p\">.<\/span><span class=\"nx\">y<\/span> <span class=\"o\"> <span class=\"nx\">start<\/span><span class=\"p\">.<\/span><span class=\"nx\">y<\/span><span class=\"p\">)<\/span> <span class=\"k\">return<\/span> <span class=\"nx\">Directions<\/span><span class=\"p\">.<\/span><span class=\"nx\">UP<\/span><span class=\"p\">;<\/span>\n    <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">end<\/span><span class=\"p\">.<\/span><span class=\"nx\">y<\/span> <span class=\"o\">&gt;<\/span> <span class=\"nx\">start<\/span><span class=\"p\">.<\/span><span class=\"nx\">y<\/span><span class=\"p\">)<\/span> <span class=\"k\">return<\/span> <span class=\"nx\">Directions<\/span><span class=\"p\">.<\/span><span class=\"nx\">DOWN<\/span><span class=\"p\">;<\/span>\n    <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">end<\/span><span class=\"p\">.<\/span><span class=\"nx\">x<\/span> <span class=\"o\"> <span class=\"nx\">start<\/span><span class=\"p\">.<\/span><span class=\"nx\">x<\/span><span class=\"p\">)<\/span> <span class=\"k\">return<\/span> <span class=\"nx\">Directions<\/span><span class=\"p\">.<\/span><span class=\"nx\">LEFT<\/span><span class=\"p\">;<\/span>\n    <span class=\"k\">if <\/span><span class=\"p\">(<\/span><span class=\"nx\">end<\/span><span class=\"p\">.<\/span><span class=\"nx\">x<\/span> <span class=\"o\">&gt;<\/span> <span class=\"nx\">start<\/span><span class=\"p\">.<\/span><span class=\"nx\">x<\/span><span class=\"p\">)<\/span> <span class=\"k\">return<\/span> <span class=\"nx\">Directions<\/span><span class=\"p\">.<\/span><span class=\"nx\">RIGHT<\/span><span class=\"p\">;<\/span>\n    <span class=\"k\">return<\/span> <span class=\"kc\">null<\/span><span class=\"p\">;<\/span>\n  <span class=\"p\">}<\/span>\n<span class=\"p\">};<\/span>\n<\/span><\/span><\/span><\/span><\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"5_%D8%AA%D8%B9%D8%A7%D9%85%D9%84_Client-Ethereum_%D9%88_Client-SNARK\"><\/span>\n<p>  5. \u062a\u0639\u0627\u0645\u0644 Client-Ethereum \u0648 Client-SNARK<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0627\u0628\u062a\u062f\u0627 \u0628\u0627\u06cc\u062f \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 \u0627\u06cc \u0631\u0627 \u0646\u0635\u0628 \u06a9\u0646\u06cc\u0645 \u06a9\u0647 \u0628\u0647 \u0645\u0627 \u062f\u0631 \u062a\u0648\u0644\u06cc\u062f SNARK \u06a9\u0645\u06a9 \u06a9\u0646\u062f.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code><span class=\"nb\">cd <\/span>packages\/client\/\npnpm <span class=\"nb\">install <\/span>snarkjs\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0627\u06a9\u0646\u0648\u0646 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u0645 \u062a\u0631\u0627\u06a9\u0646\u0634\u200c\u0647\u0627\u06cc \u0632\u0646\u062c\u06cc\u0631\u0647\u200c\u0627\u06cc \u0648 \u062a\u0648\u0644\u06cc\u062f \u0627\u062b\u0628\u0627\u062a\u200c\u0647\u0627\u06cc ZK \u0631\u0627 \u062a\u0639\u0631\u06cc\u0641 \u06a9\u0646\u06cc\u0645.<\/p>\n<p><code>packages\/client\/src\/mud\/createSystemCalls.ts<\/code><\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">getComponentValue<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">@latticexyz\/recs<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">ClientComponents<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">.\/createClientComponents<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">SetupNetworkResult<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">.\/setupNetwork<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">singletonEntity<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">@latticexyz\/store-sync\/recs<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">groth16<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">snarkjs<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"kd\">type<\/span> <span class=\"nx\">SystemCalls<\/span> <span class=\"o\">=<\/span> <span class=\"nb\">ReturnType<\/span><span class=\"o\"><span class=\"k\">typeof<\/span> <span class=\"nx\">createSystemCalls<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">;<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"kd\">function<\/span> <span class=\"nf\">createSystemCalls<\/span><span class=\"p\">(<\/span>\n  <span class=\"p\">{<\/span> <span class=\"nx\">worldContract<\/span><span class=\"p\">,<\/span> <span class=\"nx\">waitForTransaction<\/span><span class=\"p\">,<\/span> <span class=\"nx\">playerEntity<\/span> <span class=\"p\">}:<\/span> <span class=\"nx\">SetupNetworkResult<\/span><span class=\"p\">,<\/span>\n  <span class=\"p\">{<\/span> <span class=\"nx\">Character<\/span> <span class=\"p\">}:<\/span> <span class=\"nx\">ClientComponents<\/span><span class=\"p\">,<\/span>\n<span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n  <span class=\"kd\">const<\/span> <span class=\"nx\">spawn<\/span> <span class=\"o\">=<\/span> <span class=\"k\">async <\/span><span class=\"p\">(<\/span><span class=\"nx\">x<\/span><span class=\"p\">:<\/span> <span class=\"kr\">number<\/span><span class=\"p\">,<\/span> <span class=\"nx\">y<\/span><span class=\"p\">:<\/span> <span class=\"kr\">number<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n    <span class=\"kd\">const<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">proof<\/span><span class=\"p\">,<\/span> <span class=\"nx\">publicSignals<\/span> <span class=\"p\">}<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nx\">groth16<\/span><span class=\"p\">.<\/span><span class=\"nf\">fullProve<\/span><span class=\"p\">(<\/span>\n      <span class=\"p\">{<\/span>\n          <span class=\"na\">character1<\/span><span class=\"p\">:<\/span> <span class=\"mi\">4<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">character2<\/span><span class=\"p\">:<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">character3<\/span><span class=\"p\">:<\/span> <span class=\"mi\">2<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">character4<\/span><span class=\"p\">:<\/span> <span class=\"mi\">3<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">privateSalt<\/span><span class=\"p\">:<\/span> <span class=\"mi\">123<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">characterReveal<\/span><span class=\"p\">:<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">valueReveal<\/span><span class=\"p\">:<\/span> <span class=\"mi\">4<\/span><span class=\"p\">,<\/span>\n      <span class=\"p\">},<\/span>\n      <span class=\"dl\">\"<\/span><span class=\"s2\">.\/zk_artifacts\/reveal.wasm<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n      <span class=\"dl\">\"<\/span><span class=\"s2\">.\/zk_artifacts\/reveal_final.zkey<\/span><span class=\"dl\">\"<\/span>\n    <span class=\"p\">);<\/span>\n    <span class=\"kd\">let<\/span> <span class=\"na\">commitment<\/span> <span class=\"p\">:<\/span> <span class=\"kr\">number<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">publicSignals<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">];<\/span>\n    <span class=\"kd\">const<\/span> <span class=\"nx\">tx<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nx\">worldContract<\/span><span class=\"p\">.<\/span><span class=\"nx\">write<\/span><span class=\"p\">.<\/span><span class=\"nf\">app__spawn<\/span><span class=\"p\">([<\/span><span class=\"nx\">x<\/span><span class=\"p\">,<\/span> <span class=\"nx\">y<\/span><span class=\"p\">,<\/span> <span class=\"nx\">commitment<\/span><span class=\"p\">]);<\/span>\n    <span class=\"k\">await<\/span> <span class=\"nf\">waitForTransaction<\/span><span class=\"p\">(<\/span><span class=\"nx\">tx<\/span><span class=\"p\">);<\/span>\n    <span class=\"k\">return<\/span> <span class=\"nf\">getComponentValue<\/span><span class=\"p\">(<\/span><span class=\"nx\">Character<\/span><span class=\"p\">,<\/span> <span class=\"nx\">singletonEntity<\/span><span class=\"p\">);<\/span>\n  <span class=\"p\">};<\/span>\n\n  <span class=\"kd\">const<\/span> <span class=\"nx\">move<\/span> <span class=\"o\">=<\/span> <span class=\"k\">async <\/span><span class=\"p\">(<\/span><span class=\"nx\">x<\/span><span class=\"p\">:<\/span> <span class=\"kr\">number<\/span><span class=\"p\">,<\/span> <span class=\"nx\">y<\/span><span class=\"p\">:<\/span> <span class=\"kr\">number<\/span><span class=\"p\">,<\/span> <span class=\"nx\">direction<\/span><span class=\"p\">:<\/span> <span class=\"kr\">number<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n    <span class=\"kd\">const<\/span> <span class=\"nx\">tx<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nx\">worldContract<\/span><span class=\"p\">.<\/span><span class=\"nx\">write<\/span><span class=\"p\">.<\/span><span class=\"nf\">app__move<\/span><span class=\"p\">([<\/span><span class=\"nx\">x<\/span><span class=\"p\">,<\/span> <span class=\"nx\">y<\/span><span class=\"p\">,<\/span> <span class=\"nx\">direction<\/span><span class=\"p\">]);<\/span>\n    <span class=\"k\">await<\/span> <span class=\"nf\">waitForTransaction<\/span><span class=\"p\">(<\/span><span class=\"nx\">tx<\/span><span class=\"p\">);<\/span>\n    <span class=\"k\">return<\/span> <span class=\"nf\">getComponentValue<\/span><span class=\"p\">(<\/span><span class=\"nx\">Character<\/span><span class=\"p\">,<\/span>  <span class=\"nx\">singletonEntity<\/span><span class=\"p\">);<\/span>\n  <span class=\"p\">}<\/span>\n\n  <span class=\"kd\">const<\/span> <span class=\"nx\">attack<\/span> <span class=\"o\">=<\/span> <span class=\"k\">async <\/span><span class=\"p\">(<\/span><span class=\"nx\">fromX<\/span><span class=\"p\">:<\/span> <span class=\"kr\">number<\/span><span class=\"p\">,<\/span> <span class=\"nx\">fromY<\/span><span class=\"p\">:<\/span> <span class=\"kr\">number<\/span><span class=\"p\">,<\/span> <span class=\"nx\">toX<\/span><span class=\"p\">:<\/span> <span class=\"kr\">number<\/span><span class=\"p\">,<\/span> <span class=\"nx\">toY<\/span><span class=\"p\">:<\/span> <span class=\"kr\">number<\/span><span class=\"p\">,<\/span> <span class=\"nx\">circuitInputs<\/span><span class=\"p\">:<\/span> <span class=\"kr\">any<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n    <span class=\"kd\">const<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">proof<\/span><span class=\"p\">,<\/span> <span class=\"nx\">publicSignals<\/span> <span class=\"p\">}<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nx\">groth16<\/span><span class=\"p\">.<\/span><span class=\"nf\">fullProve<\/span><span class=\"p\">(<\/span><span class=\"nx\">circuitInputs<\/span><span class=\"p\">,<\/span>\n      <span class=\"dl\">\"<\/span><span class=\"s2\">.\/zk_artifacts\/reveal.wasm<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n      <span class=\"dl\">\"<\/span><span class=\"s2\">.\/zk_artifacts\/reveal_final.zkey<\/span><span class=\"dl\">\"<\/span>\n    <span class=\"p\">);<\/span>\n\n    <span class=\"kd\">let<\/span> <span class=\"nx\">pa<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">proof<\/span><span class=\"p\">.<\/span><span class=\"nx\">pi_a<\/span>\n    <span class=\"kd\">let<\/span> <span class=\"nx\">pb<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">proof<\/span><span class=\"p\">.<\/span><span class=\"nx\">pi_b<\/span>\n    <span class=\"kd\">let<\/span> <span class=\"nx\">pc<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">proof<\/span><span class=\"p\">.<\/span><span class=\"nx\">pi_c<\/span>\n    <span class=\"nx\">pa<\/span><span class=\"p\">.<\/span><span class=\"nf\">pop<\/span><span class=\"p\">()<\/span>\n    <span class=\"nx\">pb<\/span><span class=\"p\">.<\/span><span class=\"nf\">pop<\/span><span class=\"p\">()<\/span>\n    <span class=\"nx\">pc<\/span><span class=\"p\">.<\/span><span class=\"nf\">pop<\/span><span class=\"p\">()<\/span>\n\n    <span class=\"kd\">const<\/span> <span class=\"nx\">tx<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nx\">worldContract<\/span><span class=\"p\">.<\/span><span class=\"nx\">write<\/span><span class=\"p\">.<\/span><span class=\"nf\">app__attack<\/span><span class=\"p\">([<\/span><span class=\"nx\">pa<\/span><span class=\"p\">,<\/span> <span class=\"nx\">pb<\/span><span class=\"p\">,<\/span> <span class=\"nx\">pc<\/span><span class=\"p\">,<\/span> <span class=\"nx\">publicSignals<\/span><span class=\"p\">,<\/span> <span class=\"nx\">fromX<\/span><span class=\"p\">,<\/span> <span class=\"nx\">fromY<\/span><span class=\"p\">,<\/span> <span class=\"nx\">toX<\/span><span class=\"p\">,<\/span> <span class=\"nx\">toY<\/span><span class=\"p\">]);<\/span>\n    <span class=\"k\">await<\/span> <span class=\"nf\">waitForTransaction<\/span><span class=\"p\">(<\/span><span class=\"nx\">tx<\/span><span class=\"p\">);<\/span>\n    <span class=\"k\">return<\/span> <span class=\"nf\">getComponentValue<\/span><span class=\"p\">(<\/span><span class=\"nx\">Character<\/span><span class=\"p\">,<\/span>  <span class=\"nx\">singletonEntity<\/span><span class=\"p\">);<\/span>\n  <span class=\"p\">}<\/span>\n\n  <span class=\"kd\">const<\/span> <span class=\"nx\">defend<\/span> <span class=\"o\">=<\/span> <span class=\"k\">async <\/span><span class=\"p\">(<\/span><span class=\"nx\">x<\/span><span class=\"p\">:<\/span> <span class=\"kr\">number<\/span><span class=\"p\">,<\/span> <span class=\"nx\">y<\/span><span class=\"p\">:<\/span> <span class=\"kr\">number<\/span><span class=\"p\">,<\/span> <span class=\"nx\">circuitInputs<\/span><span class=\"p\">:<\/span> <span class=\"kr\">any<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n    <span class=\"kd\">const<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">proof<\/span><span class=\"p\">,<\/span> <span class=\"nx\">publicSignals<\/span> <span class=\"p\">}<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nx\">groth16<\/span><span class=\"p\">.<\/span><span class=\"nf\">fullProve<\/span><span class=\"p\">(<\/span><span class=\"nx\">circuitInputs<\/span><span class=\"p\">,<\/span>\n      <span class=\"dl\">\"<\/span><span class=\"s2\">.\/zk_artifacts\/defend.wasm<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n      <span class=\"dl\">\"<\/span><span class=\"s2\">.\/zk_artifacts\/defend_final.zkey<\/span><span class=\"dl\">\"<\/span>\n    <span class=\"p\">);<\/span>\n\n    <span class=\"kd\">let<\/span> <span class=\"nx\">pa<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">proof<\/span><span class=\"p\">.<\/span><span class=\"nx\">pi_a<\/span>\n    <span class=\"kd\">let<\/span> <span class=\"nx\">pb<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">proof<\/span><span class=\"p\">.<\/span><span class=\"nx\">pi_b<\/span>\n    <span class=\"kd\">let<\/span> <span class=\"nx\">pc<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">proof<\/span><span class=\"p\">.<\/span><span class=\"nx\">pi_c<\/span>\n    <span class=\"nx\">pa<\/span><span class=\"p\">.<\/span><span class=\"nf\">pop<\/span><span class=\"p\">()<\/span>\n    <span class=\"nx\">pb<\/span><span class=\"p\">.<\/span><span class=\"nf\">pop<\/span><span class=\"p\">()<\/span>\n    <span class=\"nx\">pc<\/span><span class=\"p\">.<\/span><span class=\"nf\">pop<\/span><span class=\"p\">()<\/span>\n\n    <span class=\"kd\">const<\/span> <span class=\"nx\">tx<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nx\">worldContract<\/span><span class=\"p\">.<\/span><span class=\"nx\">write<\/span><span class=\"p\">.<\/span><span class=\"nf\">app__defend<\/span><span class=\"p\">([<\/span><span class=\"nx\">pa<\/span><span class=\"p\">,<\/span> <span class=\"nx\">pb<\/span><span class=\"p\">,<\/span> <span class=\"nx\">pc<\/span><span class=\"p\">,<\/span> <span class=\"nx\">publicSignals<\/span><span class=\"p\">,<\/span> <span class=\"nx\">x<\/span><span class=\"p\">,<\/span> <span class=\"nx\">y<\/span><span class=\"p\">]);<\/span>\n    <span class=\"k\">await<\/span> <span class=\"nf\">waitForTransaction<\/span><span class=\"p\">(<\/span><span class=\"nx\">tx<\/span><span class=\"p\">);<\/span>\n    <span class=\"k\">return<\/span> <span class=\"nf\">getComponentValue<\/span><span class=\"p\">(<\/span><span class=\"nx\">Character<\/span><span class=\"p\">,<\/span>  <span class=\"nx\">singletonEntity<\/span><span class=\"p\">);<\/span>\n  <span class=\"p\">}<\/span>\n\n  <span class=\"k\">return<\/span> <span class=\"p\">{<\/span>\n    <span class=\"nx\">spawn<\/span><span class=\"p\">,<\/span> <span class=\"nx\">move<\/span><span class=\"p\">,<\/span> <span class=\"nx\">attack<\/span><span class=\"p\">,<\/span> <span class=\"nx\">defend<\/span><span class=\"p\">,<\/span> <span class=\"nx\">playerEntity<\/span>\n  <span class=\"p\">};<\/span>\n<span class=\"p\">}<\/span>\n<\/span><\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"6_%D8%A7%D8%B6%D8%A7%D9%81%D9%87_%DA%A9%D8%B1%D8%AF%D9%86_%D8%A7%D9%86%DB%8C%D9%85%DB%8C%D8%B4%D9%86_%D9%87%D8%A7%DB%8C_%D8%A8%D8%A7%D8%B2%DB%8C\"><\/span>\n<p>  6. \u0627\u0636\u0627\u0641\u0647 \u06a9\u0631\u062f\u0646 \u0627\u0646\u06cc\u0645\u06cc\u0634\u0646 \u0647\u0627\u06cc \u0628\u0627\u0632\u06cc<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u0632 \u0647\u0631 \u0627\u0646\u06cc\u0645\u06cc\u0634\u0646\u06cc \u06a9\u0647 \u062f\u0648\u0633\u062a \u062f\u0627\u0631\u06cc\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f\u060c \u0627\u0645\u0627 \u0627\u06af\u0631 \u0645\u06cc\u200c\u062e\u0648\u0627\u0647\u06cc\u062f \u0627\u0632 \u0647\u0645\u0627\u0646 \u0627\u0646\u06cc\u0645\u06cc\u0634\u0646\u200c\u0647\u0627\u06cc\u06cc \u06a9\u0647 \u0645\u0646 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u200c\u06a9\u0646\u0645 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f\u060c \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u06cc\u0646 \u062f\u0627\u0631\u0627\u06cc\u06cc\u200c\u0647\u0627 \u0631\u0627 \u062f\u0627\u0646\u0644\u0648\u062f \u06a9\u0646\u06cc\u062f:<\/p>\n<p><code>packages\/art\/sprites\/A\/1.png<\/code><br \/><img decoding=\"async\" src=\"https:\/\/media.dev.to\/cdn-cgi\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpuy9kkd3bgtadwgvqysl.png\" alt=\"\u06a9\u0627\u0628\u0627\u0644\u0631\u0648\" loading=\"lazy\" width=\"32\" height=\"32\" title=\"\"><\/p>\n<p><code>packages\/art\/sprites\/B\/1.png<\/code><br \/><img decoding=\"async\" src=\"https:\/\/media.dev.to\/cdn-cgi\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmw7kht9jdca95wguxy8p.png\" alt=\"\u063a\u0648\u0644 \u067e\u06cc\u06a9\u0631\" loading=\"lazy\" width=\"32\" height=\"32\" title=\"\"><\/p>\n<p><code>packages\/art\/sprites\/C\/1.png<\/code><br \/><img decoding=\"async\" src=\"https:\/\/media.dev.to\/cdn-cgi\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F76c7l8rrxq6ypsy9uaes.png\" alt=\"\u062e\u0634\u06a9\" loading=\"lazy\" width=\"32\" height=\"32\" title=\"\"><\/p>\n<p><code>packages\/art\/sprites\/D\/1.png<\/code><br \/><img decoding=\"async\" src=\"https:\/\/media.dev.to\/cdn-cgi\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhlx4mhoozj5a3vrawseo.png\" alt=\"\u0627\u0698\u062f\u0647\u0627\" loading=\"lazy\" width=\"32\" height=\"32\" title=\"\"><\/p>\n<p><code>packages\/art\/sprites\/Attacked\/1.png<\/code><br \/><img decoding=\"async\" src=\"https:\/\/media.dev.to\/cdn-cgi\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F40ukpkgg0tfcddwlec88.png\" alt=\"\u062d\u0645\u0644\u0647 \u06a9\u0631\u062f\" loading=\"lazy\" width=\"32\" height=\"32\" title=\"\"><\/p>\n<p><code>packages\/art\/sprites\/Dead\/1.png<\/code><br \/><img decoding=\"async\" src=\"https:\/\/media.dev.to\/cdn-cgi\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff8ttdf3kt8qoj96m5z60.png\" alt=\"\u0645\u0631\u062f\u0647\" loading=\"lazy\" width=\"32\" height=\"32\" title=\"\"><\/p>\n<p><code>packages\/art\/sprites\/Unknown\/1.png<\/code><br \/><img decoding=\"async\" src=\"https:\/\/media.dev.to\/cdn-cgi\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo7e55hhigacjebk4hzk5.png\" alt=\"\u0646\u0627\u0634\u0646\u0627\u062e\u062a\u0647\" loading=\"lazy\" width=\"32\" height=\"32\" title=\"\"><\/p>\n<p>\u0627\u0637\u0644\u0633 \u0631\u0627 \u062a\u0648\u0644\u06cc\u062f \u06a9\u0646\u06cc\u062f.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>cd packages\/art\nyarn\nyarn generate-multiatlas-sprites\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0648 \u0627\u0646\u06cc\u0645\u06cc\u0634\u0646 \u0647\u0627\u06cc \u0628\u0627\u0632\u06cc \u0631\u0627 \u062a\u0639\u0631\u06cc\u0641 \u0645\u06cc \u06a9\u0646\u06cc\u0645. \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u0646\u06cc\u0645\u06cc\u0634\u0646 \u0647\u0627\u06cc \u0686\u0646\u062f \u0641\u0631\u06cc\u0645\u06cc \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f \u0648 \u0631\u0641\u062a\u0627\u0631 \u0648 \u0633\u0631\u0639\u062a \u0622\u0646\u0647\u0627 \u0631\u0627 \u062a\u0646\u0638\u06cc\u0645 \u06a9\u0646\u06cc\u062f.<\/p>\n<p>\u0627\u0646\u06cc\u0645\u06cc\u0634\u0646 \u0647\u0627\u06cc \u0628\u0627\u0632\u06cc \u0631\u0627 \u062a\u0639\u0631\u06cc\u0641 \u06a9\u0646\u06cc\u062f. \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0634\u0647\u0631\u062a\u060c \u0633\u0631\u0639\u062a \u0648 \u0631\u0641\u062a\u0627\u0631 \u0631\u0627 \u062a\u0646\u0638\u06cc\u0645 \u06a9\u0646\u06cc\u062f.<\/p>\n<p><code>packages\/client\/src\/layers\/phaser\/configurePhaser.ts<\/code><\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"k\">import<\/span> <span class=\"nx\">Phaser<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">phaser<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span>\n  <span class=\"nx\">defineSceneConfig<\/span><span class=\"p\">,<\/span>\n  <span class=\"nx\">AssetType<\/span><span class=\"p\">,<\/span>\n  <span class=\"nx\">defineScaleConfig<\/span><span class=\"p\">,<\/span>\n  <span class=\"nx\">defineMapConfig<\/span><span class=\"p\">,<\/span>\n  <span class=\"nx\">defineCameraConfig<\/span><span class=\"p\">,<\/span>\n<span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">@latticexyz\/phaserx<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"nx\">worldTileset<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">..\/..\/..\/public\/assets\/tilesets\/world.png<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">TileAnimations<\/span><span class=\"p\">,<\/span> <span class=\"nx\">Tileset<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">..\/..\/artTypes\/world<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">Assets<\/span><span class=\"p\">,<\/span> <span class=\"nx\">Maps<\/span><span class=\"p\">,<\/span> <span class=\"nx\">Scenes<\/span><span class=\"p\">,<\/span> <span class=\"nx\">TILE_HEIGHT<\/span><span class=\"p\">,<\/span> <span class=\"nx\">TILE_WIDTH<\/span><span class=\"p\">,<\/span> <span class=\"nx\">Animations<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">.\/constants<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n\n<span class=\"kd\">const<\/span> <span class=\"nx\">ANIMATION_INTERVAL<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">200<\/span><span class=\"p\">;<\/span>\n\n<span class=\"kd\">const<\/span> <span class=\"nx\">mainMap<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">defineMapConfig<\/span><span class=\"p\">({<\/span>\n  <span class=\"na\">chunkSize<\/span><span class=\"p\">:<\/span> <span class=\"nx\">TILE_WIDTH<\/span> <span class=\"o\">*<\/span> <span class=\"mi\">64<\/span><span class=\"p\">,<\/span> <span class=\"c1\">\/\/ tile size * tile amount<\/span>\n  <span class=\"na\">tileWidth<\/span><span class=\"p\">:<\/span> <span class=\"nx\">TILE_WIDTH<\/span><span class=\"p\">,<\/span>\n  <span class=\"na\">tileHeight<\/span><span class=\"p\">:<\/span> <span class=\"nx\">TILE_HEIGHT<\/span><span class=\"p\">,<\/span>\n  <span class=\"na\">backgroundTile<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span><span class=\"nx\">Tileset<\/span><span class=\"p\">.<\/span><span class=\"nx\">Grass<\/span><span class=\"p\">],<\/span>\n  <span class=\"na\">animationInterval<\/span><span class=\"p\">:<\/span> <span class=\"nx\">ANIMATION_INTERVAL<\/span><span class=\"p\">,<\/span>\n  <span class=\"na\">tileAnimations<\/span><span class=\"p\">:<\/span> <span class=\"nx\">TileAnimations<\/span><span class=\"p\">,<\/span>\n  <span class=\"na\">layers<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n    <span class=\"na\">layers<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n      <span class=\"na\">Background<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span> <span class=\"na\">tilesets<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">Default<\/span><span class=\"dl\">\"<\/span><span class=\"p\">]<\/span> <span class=\"p\">},<\/span>\n      <span class=\"na\">Foreground<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span> <span class=\"na\">tilesets<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">Default<\/span><span class=\"dl\">\"<\/span><span class=\"p\">]<\/span> <span class=\"p\">},<\/span>\n    <span class=\"p\">},<\/span>\n    <span class=\"na\">defaultLayer<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">Background<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n  <span class=\"p\">},<\/span>\n<span class=\"p\">});<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"kd\">const<\/span> <span class=\"nx\">phaserConfig<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\n  <span class=\"na\">sceneConfig<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n    <span class=\"p\">[<\/span><span class=\"nx\">Scenes<\/span><span class=\"p\">.<\/span><span class=\"nx\">Main<\/span><span class=\"p\">]:<\/span> <span class=\"nf\">defineSceneConfig<\/span><span class=\"p\">({<\/span>\n      <span class=\"na\">assets<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n        <span class=\"p\">[<\/span><span class=\"nx\">Assets<\/span><span class=\"p\">.<\/span><span class=\"nx\">Tileset<\/span><span class=\"p\">]:<\/span> <span class=\"p\">{<\/span>\n          <span class=\"na\">type<\/span><span class=\"p\">:<\/span> <span class=\"nx\">AssetType<\/span><span class=\"p\">.<\/span><span class=\"nx\">Image<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">key<\/span><span class=\"p\">:<\/span> <span class=\"nx\">Assets<\/span><span class=\"p\">.<\/span><span class=\"nx\">Tileset<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">path<\/span><span class=\"p\">:<\/span> <span class=\"nx\">worldTileset<\/span><span class=\"p\">,<\/span>\n        <span class=\"p\">},<\/span>\n        <span class=\"p\">[<\/span><span class=\"nx\">Assets<\/span><span class=\"p\">.<\/span><span class=\"nx\">MainAtlas<\/span><span class=\"p\">]:<\/span> <span class=\"p\">{<\/span>\n          <span class=\"na\">type<\/span><span class=\"p\">:<\/span> <span class=\"nx\">AssetType<\/span><span class=\"p\">.<\/span><span class=\"nx\">MultiAtlas<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">key<\/span><span class=\"p\">:<\/span> <span class=\"nx\">Assets<\/span><span class=\"p\">.<\/span><span class=\"nx\">MainAtlas<\/span><span class=\"p\">,<\/span>\n          <span class=\"c1\">\/\/ Add a timestamp to the end of the path to prevent caching<\/span>\n          <span class=\"na\">path<\/span><span class=\"p\">:<\/span> <span class=\"s2\">`\/assets\/atlases\/atlas.json?timestamp=<\/span><span class=\"p\">${<\/span><span class=\"nb\">Date<\/span><span class=\"p\">.<\/span><span class=\"nf\">now<\/span><span class=\"p\">()}<\/span><span class=\"s2\">`<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">options<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n            <span class=\"na\">imagePath<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">\/assets\/atlases\/<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n          <span class=\"p\">},<\/span>\n        <span class=\"p\">},<\/span>\n      <span class=\"p\">},<\/span>\n      <span class=\"na\">maps<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n        <span class=\"p\">[<\/span><span class=\"nx\">Maps<\/span><span class=\"p\">.<\/span><span class=\"nx\">Main<\/span><span class=\"p\">]:<\/span> <span class=\"nx\">mainMap<\/span><span class=\"p\">,<\/span>\n      <span class=\"p\">},<\/span>\n      <span class=\"na\">sprites<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n      <span class=\"p\">},<\/span>\n      <span class=\"na\">animations<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span>\n        <span class=\"p\">{<\/span>\n          <span class=\"na\">key<\/span><span class=\"p\">:<\/span> <span class=\"nx\">Animations<\/span><span class=\"p\">.<\/span><span class=\"nx\">A<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">assetKey<\/span><span class=\"p\">:<\/span> <span class=\"nx\">Assets<\/span><span class=\"p\">.<\/span><span class=\"nx\">MainAtlas<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">startFrame<\/span><span class=\"p\">:<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">endFrame<\/span><span class=\"p\">:<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">frameRate<\/span><span class=\"p\">:<\/span> <span class=\"mi\">3<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">repeat<\/span><span class=\"p\">:<\/span> <span class=\"o\">-<\/span><span class=\"mi\">1<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">duration<\/span><span class=\"p\">:<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">prefix<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">sprites\/A\/<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">suffix<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">.png<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n        <span class=\"p\">},<\/span>\n        <span class=\"p\">{<\/span>\n          <span class=\"na\">key<\/span><span class=\"p\">:<\/span> <span class=\"nx\">Animations<\/span><span class=\"p\">.<\/span><span class=\"nx\">B<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">assetKey<\/span><span class=\"p\">:<\/span> <span class=\"nx\">Assets<\/span><span class=\"p\">.<\/span><span class=\"nx\">MainAtlas<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">startFrame<\/span><span class=\"p\">:<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">endFrame<\/span><span class=\"p\">:<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">frameRate<\/span><span class=\"p\">:<\/span> <span class=\"mi\">3<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">repeat<\/span><span class=\"p\">:<\/span> <span class=\"o\">-<\/span><span class=\"mi\">1<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">duration<\/span><span class=\"p\">:<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">prefix<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">sprites\/B\/<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">suffix<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">.png<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n        <span class=\"p\">},<\/span>\n        <span class=\"p\">{<\/span>\n          <span class=\"na\">key<\/span><span class=\"p\">:<\/span> <span class=\"nx\">Animations<\/span><span class=\"p\">.<\/span><span class=\"nx\">C<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">assetKey<\/span><span class=\"p\">:<\/span> <span class=\"nx\">Assets<\/span><span class=\"p\">.<\/span><span class=\"nx\">MainAtlas<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">startFrame<\/span><span class=\"p\">:<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">endFrame<\/span><span class=\"p\">:<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">frameRate<\/span><span class=\"p\">:<\/span> <span class=\"mi\">3<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">repeat<\/span><span class=\"p\">:<\/span> <span class=\"o\">-<\/span><span class=\"mi\">1<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">duration<\/span><span class=\"p\">:<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">prefix<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">sprites\/C\/<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">suffix<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">.png<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n        <span class=\"p\">},<\/span>\n        <span class=\"p\">{<\/span>\n          <span class=\"na\">key<\/span><span class=\"p\">:<\/span> <span class=\"nx\">Animations<\/span><span class=\"p\">.<\/span><span class=\"nx\">D<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">assetKey<\/span><span class=\"p\">:<\/span> <span class=\"nx\">Assets<\/span><span class=\"p\">.<\/span><span class=\"nx\">MainAtlas<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">startFrame<\/span><span class=\"p\">:<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">endFrame<\/span><span class=\"p\">:<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">frameRate<\/span><span class=\"p\">:<\/span> <span class=\"mi\">3<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">repeat<\/span><span class=\"p\">:<\/span> <span class=\"o\">-<\/span><span class=\"mi\">1<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">duration<\/span><span class=\"p\">:<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">prefix<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">sprites\/D\/<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">suffix<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">.png<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n        <span class=\"p\">},<\/span>\n        <span class=\"p\">{<\/span>\n          <span class=\"na\">key<\/span><span class=\"p\">:<\/span> <span class=\"nx\">Animations<\/span><span class=\"p\">.<\/span><span class=\"nx\">Dead<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">assetKey<\/span><span class=\"p\">:<\/span> <span class=\"nx\">Assets<\/span><span class=\"p\">.<\/span><span class=\"nx\">MainAtlas<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">startFrame<\/span><span class=\"p\">:<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">endFrame<\/span><span class=\"p\">:<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">frameRate<\/span><span class=\"p\">:<\/span> <span class=\"mi\">12<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">repeat<\/span><span class=\"p\">:<\/span> <span class=\"o\">-<\/span><span class=\"mi\">1<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">duration<\/span><span class=\"p\">:<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">prefix<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">sprites\/Dead\/<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">suffix<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">.png<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n        <span class=\"p\">},<\/span>\n        <span class=\"p\">{<\/span>\n          <span class=\"na\">key<\/span><span class=\"p\">:<\/span> <span class=\"nx\">Animations<\/span><span class=\"p\">.<\/span><span class=\"nx\">Unknown<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">assetKey<\/span><span class=\"p\">:<\/span> <span class=\"nx\">Assets<\/span><span class=\"p\">.<\/span><span class=\"nx\">MainAtlas<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">startFrame<\/span><span class=\"p\">:<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">endFrame<\/span><span class=\"p\">:<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">frameRate<\/span><span class=\"p\">:<\/span> <span class=\"mi\">12<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">repeat<\/span><span class=\"p\">:<\/span> <span class=\"o\">-<\/span><span class=\"mi\">1<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">duration<\/span><span class=\"p\">:<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">prefix<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">sprites\/Unknown\/<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">suffix<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">.png<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n        <span class=\"p\">},<\/span>\n        <span class=\"p\">{<\/span>\n          <span class=\"na\">key<\/span><span class=\"p\">:<\/span> <span class=\"nx\">Animations<\/span><span class=\"p\">.<\/span><span class=\"nx\">Attacked<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">assetKey<\/span><span class=\"p\">:<\/span> <span class=\"nx\">Assets<\/span><span class=\"p\">.<\/span><span class=\"nx\">MainAtlas<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">startFrame<\/span><span class=\"p\">:<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">endFrame<\/span><span class=\"p\">:<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">frameRate<\/span><span class=\"p\">:<\/span> <span class=\"mi\">12<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">repeat<\/span><span class=\"p\">:<\/span> <span class=\"o\">-<\/span><span class=\"mi\">1<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">duration<\/span><span class=\"p\">:<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">prefix<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">sprites\/Attacked\/<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">suffix<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">.png<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n        <span class=\"p\">},<\/span>\n      <span class=\"p\">],<\/span>\n      <span class=\"na\">tilesets<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n        <span class=\"na\">Default<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\n          <span class=\"na\">assetKey<\/span><span class=\"p\">:<\/span> <span class=\"nx\">Assets<\/span><span class=\"p\">.<\/span><span class=\"nx\">Tileset<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">tileWidth<\/span><span class=\"p\">:<\/span> <span class=\"nx\">TILE_WIDTH<\/span><span class=\"p\">,<\/span>\n          <span class=\"na\">tileHeight<\/span><span class=\"p\">:<\/span> <span class=\"nx\">TILE_HEIGHT<\/span><span class=\"p\">,<\/span>\n        <span class=\"p\">},<\/span>\n      <span class=\"p\">},<\/span>\n    <span class=\"p\">}),<\/span>\n  <span class=\"p\">},<\/span>\n  <span class=\"na\">scale<\/span><span class=\"p\">:<\/span> <span class=\"nf\">defineScaleConfig<\/span><span class=\"p\">({<\/span>\n    <span class=\"na\">parent<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">phaser-game<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n    <span class=\"na\">zoom<\/span><span class=\"p\">:<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span>\n    <span class=\"na\">mode<\/span><span class=\"p\">:<\/span> <span class=\"nx\">Phaser<\/span><span class=\"p\">.<\/span><span class=\"nx\">Scale<\/span><span class=\"p\">.<\/span><span class=\"nx\">NONE<\/span><span class=\"p\">,<\/span>\n  <span class=\"p\">}),<\/span>\n  <span class=\"na\">cameraConfig<\/span><span class=\"p\">:<\/span> <span class=\"nf\">defineCameraConfig<\/span><span class=\"p\">({<\/span>\n    <span class=\"na\">pinchSpeed<\/span><span class=\"p\">:<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span>\n    <span class=\"na\">wheelSpeed<\/span><span class=\"p\">:<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span>\n    <span class=\"na\">maxZoom<\/span><span class=\"p\">:<\/span> <span class=\"mi\">3<\/span><span class=\"p\">,<\/span>\n    <span class=\"na\">minZoom<\/span><span class=\"p\">:<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span>\n  <span class=\"p\">}),<\/span>\n  <span class=\"na\">cullingChunkSize<\/span><span class=\"p\">:<\/span> <span class=\"nx\">TILE_HEIGHT<\/span> <span class=\"o\">*<\/span> <span class=\"mi\">16<\/span><span class=\"p\">,<\/span>\n<span class=\"p\">};<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"7_%D9%87%D9%85%D9%87_%DA%86%DB%8C%D8%B2_%D8%B1%D8%A7_%D8%A8%D9%87_%D9%87%D9%85_%D9%85%D8%AA%D8%B5%D9%84_%DA%A9%D9%86%DB%8C%D8%AF\"><\/span>\n<p>  7. \u0647\u0645\u0647 \u0686\u06cc\u0632 \u0631\u0627 \u0628\u0647 \u0647\u0645 \u0645\u062a\u0635\u0644 \u06a9\u0646\u06cc\u062f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p><code>packages\/client\/src\/layers\/phaser\/constants.ts<\/code><\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"k\">export<\/span> <span class=\"kr\">enum<\/span> <span class=\"nx\">Scenes<\/span> <span class=\"p\">{<\/span>\n  <span class=\"nx\">Main<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">Main<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"kr\">enum<\/span> <span class=\"nx\">Maps<\/span> <span class=\"p\">{<\/span>\n  <span class=\"nx\">Main<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">Main<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"kr\">enum<\/span> <span class=\"nx\">Animations<\/span> <span class=\"p\">{<\/span>\n  <span class=\"nx\">A<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">A<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n  <span class=\"nx\">B<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">B<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n  <span class=\"nx\">C<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">C<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n  <span class=\"nx\">D<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">D<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n  <span class=\"nx\">Dead<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">Dead<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n  <span class=\"nx\">Unknown<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">Unknown<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n  <span class=\"nx\">Attacked<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">Attacked<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"kr\">enum<\/span> <span class=\"nx\">Directions<\/span> <span class=\"p\">{<\/span>\n  <span class=\"nx\">UP<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span>  \n  <span class=\"nx\">DOWN<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span>  \n  <span class=\"nx\">LEFT<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">2<\/span><span class=\"p\">,<\/span>  \n  <span class=\"nx\">RIGHT<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">3<\/span><span class=\"p\">,<\/span>  \n<span class=\"p\">}<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"kr\">enum<\/span> <span class=\"nx\">Assets<\/span> <span class=\"p\">{<\/span>\n  <span class=\"nx\">MainAtlas<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">MainAtlas<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n  <span class=\"nx\">Tileset<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">Tileset<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"kd\">const<\/span> <span class=\"nx\">TILE_HEIGHT<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">32<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">export<\/span> <span class=\"kd\">const<\/span> <span class=\"nx\">TILE_WIDTH<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">32<\/span><span class=\"p\">;<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><code>packages\/client\/src\/layers\/phaser\/systems\/registerSystems.ts<\/code><\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight typescript\"><code><span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">PhaserLayer<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">..\/createPhaserLayer<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">createCamera<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">.\/createCamera<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">createMapSystem<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">.\/createMapSystem<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">createMyGameSystem<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">.\/myGameSystem<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\n\n<span class=\"k\">export<\/span> <span class=\"kd\">const<\/span> <span class=\"nx\">registerSystems<\/span> <span class=\"o\">=<\/span> <span class=\"p\">(<\/span><span class=\"nx\">layer<\/span><span class=\"p\">:<\/span> <span class=\"nx\">PhaserLayer<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\n  <span class=\"nf\">createCamera<\/span><span class=\"p\">(<\/span><span class=\"nx\">layer<\/span><span class=\"p\">);<\/span>\n  <span class=\"nf\">createMapSystem<\/span><span class=\"p\">(<\/span><span class=\"nx\">layer<\/span><span class=\"p\">);<\/span>\n  <span class=\"nf\">createMyGameSystem<\/span><span class=\"p\">(<\/span><span class=\"nx\">layer<\/span><span class=\"p\">);<\/span>\n<span class=\"p\">};<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"8_%D8%A8%D8%A7%D8%B2%DB%8C_%D8%B1%D8%A7_%D8%A7%D8%AC%D8%B1%D8%A7_%DA%A9%D9%86%DB%8C%D8%AF\"><\/span>\n<p>  8. \u0628\u0627\u0632\u06cc \u0631\u0627 \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0628\u0647 \u0641\u0647\u0631\u0633\u062a \u0627\u0635\u0644\u06cc \u067e\u0631\u0648\u0698\u0647 \u0628\u0631\u06af\u0631\u062f\u06cc\u062f.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code><span class=\"nb\">cd<\/span> ..\/..\/\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0648 \u0628\u0627\u0632\u06cc \u0631\u0627 \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>pnpm dev\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0627\u06a9\u0646\u0648\u0646 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0628\u0627\u0632\u06cc \u0631\u0627 \u062f\u0631 \u062f\u0648 \u0645\u0631\u0648\u0631\u06af\u0631 \u0645\u062e\u062a\u0644\u0641 \u0628\u0627\u0632 \u06a9\u0646\u06cc\u062f. \u0647\u0631 \u0628\u0627\u0632\u06cc\u06a9\u0646 \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u0628\u0627 \u06a9\u0644\u06cc\u06a9 \u0628\u0631 \u0631\u0648\u06cc \u06cc\u06a9 \u0641\u0636\u0627\u06cc \u062e\u0627\u0644\u06cc \u062a\u062e\u0645 \u0631\u06cc\u0632\u06cc \u06a9\u0646\u062f. \u0628\u0631\u0627\u06cc \u062d\u0631\u06a9\u062a \u0628\u0647 \u0641\u0636\u0627\u06cc \u062e\u0627\u0644\u06cc \u0645\u062c\u0627\u0648\u0631 \u0628\u06a9\u0634\u06cc\u062f. \u0628\u0631\u0627\u06cc \u062d\u0645\u0644\u0647 \u0628\u0647 \u0628\u0627\u0632\u06cc\u06a9\u0646 \u062f\u06cc\u06af\u0631\u06cc \u0628\u06a9\u0634\u06cc\u062f. \u0628\u0631\u0627\u06cc \u0627\u06cc\u062c\u0627\u062f SNARK \u062f\u0641\u0627\u0639\u06cc \u0631\u0648\u06cc \u0628\u0627\u0632\u06cc\u06a9\u0646 \u0645\u0648\u0631\u062f \u062d\u0645\u0644\u0647 \u06a9\u0644\u06cc\u06a9 \u06a9\u0646\u06cc\u062f.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/media.dev.to\/cdn-cgi\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy54uzmlr5ys92565w8i3.png\" alt=\"\u0646\u0633\u062e\u0647 \u06cc \u0646\u0645\u0627\u06cc\u0634\u06cc \u0628\u0627\u0632\u06cc\" loading=\"lazy\" width=\"800\" height=\"420\" title=\"\"><\/p>\n<p><em>\u062f\u0631 \u0628\u0627\u0632\u06cc \u0628\u0631\u0627\u06cc \u062a\u062e\u0645 \u0631\u06cc\u0632\u06cc \u06a9\u0644\u06cc\u06a9 \u06a9\u0646\u06cc\u062f\u060c \u0628\u0631\u0627\u06cc \u062d\u0631\u06a9\u062a \u0628\u0647 \u0641\u0636\u0627\u06cc \u062e\u0627\u0644\u06cc \u0645\u062c\u0627\u0648\u0631 \u0628\u06a9\u0634\u06cc\u062f\u060c \u0628\u0631\u0627\u06cc \u062d\u0645\u0644\u0647 \u0628\u0647 \u0633\u0645\u062a \u062d\u0631\u06cc\u0641 \u0628\u06a9\u0634\u06cc\u062f \u0648 \u0628\u0631\u0627\u06cc \u062f\u0641\u0627\u0639 \u06a9\u0644\u06cc\u06a9 \u06a9\u0646\u06cc\u062f.<\/em><\/p>\n<p><strong>\u0628\u0627 \u062a\u0634\u06a9\u0631 \u0627\u0632 \u062e\u0648\u0627\u0646\u062f\u0646 \u0627\u06cc\u0646 \u0631\u0627\u0647\u0646\u0645\u0627!<\/strong><\/p>\n<p>\u0645\u0646 \u0631\u0627 \u062f\u0631 dev.to \u0648 YouTube \u0628\u0631\u0627\u06cc \u0647\u0645\u0647 \u0686\u06cc\u0632\u0647\u0627\u06cc\u06cc \u06a9\u0647 \u0628\u0647 \u062a\u0648\u0633\u0639\u0647 \u0628\u0644\u0627\u06a9 \u0686\u06cc\u0646 \u0628\u0647 \u0632\u0628\u0627\u0646 \u0627\u0633\u067e\u0627\u0646\u06cc\u0627\u06cc\u06cc \u0645\u0631\u062a\u0628\u0637 \u0627\u0633\u062a \u062f\u0646\u0628\u0627\u0644 \u06a9\u0646\u06cc\u062f.<\/p>\n<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Summarize this content to 400 words in Persian Lang \u062f\u0631 \u0627\u06cc\u0646 \u0622\u0645\u0648\u0632\u0634\u060c \u0645\u0627 \u06cc\u06a9 \u0628\u0627\u0632\u06cc 100% \u0631\u0648\u06cc \u0632\u0646\u062c\u06cc\u0631\u0647 \u0628\u0627 \u0639\u062f\u0645 \u062a\u0642\u0627\u0631\u0646 \u0627\u0637\u0644\u0627\u0639\u0627\u062a\u06cc \u0627\u06cc\u062c\u0627\u062f \u062e\u0648\u0627\u0647\u06cc\u0645 \u06a9\u0631\u062f\u060c \u0628\u0647 \u0639\u0628\u0627\u0631\u062a \u062f\u06cc\u06af\u0631\u060c \u06cc\u06a9 \u062f\u0646\u06cc\u0627\u06cc \u0645\u0633\u062a\u0642\u0644 \u06a9\u0647 \u062d\u0627\u0644\u062a \u062e\u0635\u0648\u0635\u06cc \u0648 \u0645\u062d\u0627\u0633\u0628\u0627\u062a \u0622\u0646 \u062f\u0631 \u0627\u062a\u0631\u06cc\u0648\u0645 \u06a9\u0627\u0645\u0644\u0627\u064b \u0642\u0627\u0628\u0644 \u062a\u0623\u06cc\u06cc\u062f \u0627\u0633\u062a. \u0645\u0627 \u0627\u0632 MUD\u060c \u0645\u0648\u062a\u0648\u0631 \u062c\u0647\u0627\u0646 \u0647\u0627\u06cc \u062e\u0648\u062f\u0645\u062e\u062a\u0627\u0631\u060c \u0648 Circom\u060c \u067e\u0631\u06a9\u0627\u0631\u0628\u0631\u062f\u062a\u0631\u06cc\u0646 \u0632\u0628\u0627\u0646 \u0628\u0631\u0627\u06cc &hellip;<\/p>\n","protected":false},"author":2,"featured_media":74089,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"","fifu_image_alt":"","footnotes":""},"categories":[339],"tags":[],"class_list":["post-74088","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dev"],"_links":{"self":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/74088","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/comments?post=74088"}],"version-history":[{"count":0,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/74088\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media\/74089"}],"wp:attachment":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media?parent=74088"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/categories?post=74088"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/tags?post=74088"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}