asmrobot
2019-11-13 576b92fd82f568572bc4beb125fa0ba0191a602f
add map editor
462 files added
417 files deleted
72 files renamed
37 files modified
9684 ■■■■■ changed files
doc/PosImages/a/001838a9-44d4-429c-87b0-acbbdb50a9f1.jpg patch | view | raw | blame | history
doc/PosImages/a/00810715-1616-42bf-a895-397c310f5048.jpg patch | view | raw | blame | history
doc/PosImages/a/008867b8-08f7-4c34-b4e1-770ed1010d21.jpg patch | view | raw | blame | history
doc/PosImages/a/012cdaa0-e70c-44cf-b6bf-457e2a955403.jpg patch | view | raw | blame | history
doc/PosImages/a/029008b3-bf99-4a2e-bd74-d13de9936959.jpg patch | view | raw | blame | history
doc/PosImages/a/038d4596-f8d9-4492-8dee-f4cafad712bc.jpg patch | view | raw | blame | history
doc/PosImages/a/04746e02-feb6-4771-96eb-479d7eb4c817.jpg patch | view | raw | blame | history
doc/PosImages/a/049f6918-b0a1-45e6-a024-455fd83190a9.jpg patch | view | raw | blame | history
doc/PosImages/a/04d00170-b8e6-407d-ab96-a99422bac926.jpg patch | view | raw | blame | history
doc/PosImages/a/04e2a451-9f79-40bc-bc44-104821f8980a.jpg patch | view | raw | blame | history
doc/PosImages/a/0502fa4a-1f14-4cdd-9742-db1618354123.jpg patch | view | raw | blame | history
doc/PosImages/a/05430a99-25ab-4fdc-af2c-cc4a8795022e.jpg patch | view | raw | blame | history
doc/PosImages/a/05cf8263-5406-4785-9e12-f5d6c2504624.jpg patch | view | raw | blame | history
doc/PosImages/a/0789cccc-73ea-4520-8eb5-3ca4928a4df9.jpg patch | view | raw | blame | history
doc/PosImages/a/07d112eb-6139-48bf-b59e-fdcba3b7152f.jpg patch | view | raw | blame | history
doc/PosImages/a/07dd31cf-15ab-452c-9962-bec66e2749b0.jpg patch | view | raw | blame | history
doc/PosImages/a/087b71c2-ba35-4f55-844b-55ac61fd5f2c.jpg patch | view | raw | blame | history
doc/PosImages/a/09224e49-81bf-4d04-9e4a-4bb6a6a1c00c.jpg patch | view | raw | blame | history
doc/PosImages/a/092d9991-de17-43c8-99b5-c0c346e31394.jpg patch | view | raw | blame | history
doc/PosImages/a/094f8ab7-413e-4697-883e-e64915d21b50.jpg patch | view | raw | blame | history
doc/PosImages/a/097221a6-8cf1-44bb-a6a2-542d2a40ab65.jpg patch | view | raw | blame | history
doc/PosImages/a/0a344a91-5edc-4d86-83e8-056adc888c50.jpg patch | view | raw | blame | history
doc/PosImages/a/0a5a5580-dc1c-4e64-b795-ed5e88a5584d.jpg patch | view | raw | blame | history
doc/PosImages/a/0a74b5e9-6636-4553-b12e-99feaa72405e.jpg patch | view | raw | blame | history
doc/PosImages/a/0a867efe-63b3-4c6c-8400-633fcb20deed.jpg patch | view | raw | blame | history
doc/PosImages/a/0bcd88b4-a39a-43a3-baa8-c01c0fc1e111.jpg patch | view | raw | blame | history
doc/PosImages/a/0d023a73-1ab5-45e7-8542-3afe97e738c7.jpg patch | view | raw | blame | history
doc/PosImages/a/0d8ba12e-57a9-44de-b2b4-1f2991ebac0e.jpg patch | view | raw | blame | history
doc/PosImages/a/0dc87f91-b0f5-4ea0-9885-24c06ee7ceaf.jpg patch | view | raw | blame | history
doc/PosImages/a/0de56ec8-2737-4d6e-bbc3-42cb18d71203.jpg patch | view | raw | blame | history
doc/PosImages/a/0e7f30a1-bfd3-4d1c-aeca-241c1c96488f.jpg patch | view | raw | blame | history
doc/PosImages/a/101a17f4-ad9e-4dad-bbcc-ead0075abd52.jpg patch | view | raw | blame | history
doc/PosImages/a/117ab5f2-3ce0-4177-8770-ebda4c03afd8.jpg patch | view | raw | blame | history
doc/PosImages/a/1181f28f-b458-42e2-bd1f-0d8790e070b9.jpg patch | view | raw | blame | history
doc/PosImages/a/135de44c-512b-404e-96af-30d9fa34d3dd.jpg patch | view | raw | blame | history
doc/PosImages/a/1393f222-93eb-49a1-b642-1b1edddcc282.jpg patch | view | raw | blame | history
doc/PosImages/a/14493755-df26-4c2e-b636-6e862e5e6664.jpg patch | view | raw | blame | history
doc/PosImages/a/15513395-3ff8-486c-a0db-8c675d8f24d0.jpg patch | view | raw | blame | history
doc/PosImages/a/156dcfa4-47e7-4512-82a2-d53069a2b4fd.jpg patch | view | raw | blame | history
doc/PosImages/a/158750da-f6e8-435c-8fef-0aff7cd97901.jpg patch | view | raw | blame | history
doc/PosImages/a/15993aef-e0cc-4856-91f7-63a8f180b0da.jpg patch | view | raw | blame | history
doc/PosImages/a/16237c2d-0122-4b0c-8e58-453fe94ca38f.jpg patch | view | raw | blame | history
doc/PosImages/a/16912443-7267-4e0f-ac52-f75b86656b46.jpg patch | view | raw | blame | history
doc/PosImages/a/169169aa-2716-4a27-b605-0579975fd010.jpg patch | view | raw | blame | history
doc/PosImages/a/16cfcb4e-c71a-4eef-9198-825412711125.jpg patch | view | raw | blame | history
doc/PosImages/a/16f5bee0-2b53-4607-88d1-129c879e94fd.jpg patch | view | raw | blame | history
doc/PosImages/a/16fbea96-94c0-4080-95ee-61ad8305df52.jpg patch | view | raw | blame | history
doc/PosImages/a/180647f4-5283-480b-b500-e988fb98254b.jpg patch | view | raw | blame | history
doc/PosImages/a/1865de8c-04f9-4c3d-a73c-e10e674d5f0a.jpg patch | view | raw | blame | history
doc/PosImages/a/18785531-fc73-4aee-a10f-ed4f8c434209.jpg patch | view | raw | blame | history
doc/PosImages/a/18a0d81d-ad68-4a90-8f11-cc5a83c10925.jpg patch | view | raw | blame | history
doc/PosImages/a/1a3ca9eb-9c9d-487c-be8d-9019f65102c9.jpg patch | view | raw | blame | history
doc/PosImages/a/1a753464-877a-4b10-a772-500f128b9b7a.jpg patch | view | raw | blame | history
doc/PosImages/a/1b0c5cc0-b541-4f7f-a478-bf33f1dea59e.jpg patch | view | raw | blame | history
doc/PosImages/a/1b543d00-38c0-43f8-b6b0-a569692d7b18.jpg patch | view | raw | blame | history
doc/PosImages/a/1caeda2d-b1b5-4862-a4e0-b4a99f4c0a66.jpg patch | view | raw | blame | history
doc/PosImages/a/1dc482c9-2f78-480d-b8ab-0d03079d8c09.jpg patch | view | raw | blame | history
doc/PosImages/a/1e80c40f-a686-4981-95c5-5089dad62cd3.jpg patch | view | raw | blame | history
doc/PosImages/a/1e924d02-7891-4064-aed9-de4d448276bc.jpg patch | view | raw | blame | history
doc/PosImages/a/2124ef77-a65f-4123-8828-ec69376bd023.jpg patch | view | raw | blame | history
doc/PosImages/a/216dc6ce-c33f-4c83-a5dd-59fe9e669403.jpg patch | view | raw | blame | history
doc/PosImages/a/2175bb93-39e6-4544-a2ec-ea40bd8eb20b.jpg patch | view | raw | blame | history
doc/PosImages/a/22ae001c-f179-4bdb-afd4-2040dfb85851.jpg patch | view | raw | blame | history
doc/PosImages/a/2358792c-0603-4e27-a4e5-6f062270650c.jpg patch | view | raw | blame | history
doc/PosImages/a/23cacb1e-cd6d-4520-979a-90555d80029e.jpg patch | view | raw | blame | history
doc/PosImages/a/25bb7754-bf08-4349-a2a0-dbf0dd15f3f4.jpg patch | view | raw | blame | history
doc/PosImages/a/262e8bb6-af0f-4f35-b16a-7b521ab5578d.jpg patch | view | raw | blame | history
doc/PosImages/a/2668f54e-e3ce-46db-94e8-cd98bd3006c2.jpg patch | view | raw | blame | history
doc/PosImages/a/26eba38b-80ec-47ae-b73e-9bbffb4a0280.jpg patch | view | raw | blame | history
doc/PosImages/a/28518ac1-fda3-461f-a962-522ed1159233.jpg patch | view | raw | blame | history
doc/PosImages/a/2861b156-44ed-452c-8213-5af890f2e3bb.jpg patch | view | raw | blame | history
doc/PosImages/a/2995ead0-ff8f-4f86-bd60-69f8eeeb9656.jpg patch | view | raw | blame | history
doc/PosImages/a/2c43a52f-2786-4c4f-9ba1-417940015c24.jpg patch | view | raw | blame | history
doc/PosImages/a/2d569395-d3d1-46fb-ae35-960b9b5a1690.jpg patch | view | raw | blame | history
doc/PosImages/a/2e1dde50-81ca-4a1c-8741-35b94c957d19.jpg patch | view | raw | blame | history
doc/PosImages/a/2e7c2e99-9a83-44bc-b193-e344d8a01d3f.jpg patch | view | raw | blame | history
doc/PosImages/a/2f58d94e-c684-4eea-9a45-2092e094e31e.jpg patch | view | raw | blame | history
doc/PosImages/a/2fefd9fb-1794-43c2-9450-c160b7f0bd54.jpg patch | view | raw | blame | history
doc/PosImages/a/314722f2-8cc7-4daa-bc8c-91b92f4f788d.jpg patch | view | raw | blame | history
doc/PosImages/a/3234795c-15d4-459d-baaf-530b36e629f5.jpg patch | view | raw | blame | history
doc/PosImages/a/32b15889-5fa2-42e2-bb7d-f042065ac11a.jpg patch | view | raw | blame | history
doc/PosImages/a/32c56a41-74b5-4ed6-88e3-7f2c89fccfa6.jpg patch | view | raw | blame | history
doc/PosImages/a/32c66cd9-2759-452c-bee2-57ebce1092c7.jpg patch | view | raw | blame | history
doc/PosImages/a/33e0aa4b-a766-497a-b83d-97a582df46e5.jpg patch | view | raw | blame | history
doc/PosImages/a/379f0346-93cf-4e9f-b4cc-b0e0f1747940.jpg patch | view | raw | blame | history
doc/PosImages/a/38d7c8e3-8d3f-4a47-a08f-ad725c2ae22a.jpg patch | view | raw | blame | history
doc/PosImages/a/39de151e-247e-49c9-b130-e46a55596218.jpg patch | view | raw | blame | history
doc/PosImages/a/39e68825-2377-4fd3-b79d-0b4d9a38a126.jpg patch | view | raw | blame | history
doc/PosImages/a/3adebe80-0d84-4f77-94db-682b7dad3237.jpg patch | view | raw | blame | history
doc/PosImages/a/3bb49b0d-838e-4155-8645-9e04ffbd2d53.jpg patch | view | raw | blame | history
doc/PosImages/a/3bdf0cdc-662c-4250-a348-36bbe46ef922.jpg patch | view | raw | blame | history
doc/PosImages/a/3c4f88db-6eae-4df5-8435-e183ed707122.jpg patch | view | raw | blame | history
doc/PosImages/a/3cedff15-bd2b-44db-a94b-f7de4badc1d3.jpg patch | view | raw | blame | history
doc/PosImages/a/3d41d91d-10a9-4687-85ea-0fc11e1a4cfd.jpg patch | view | raw | blame | history
doc/PosImages/a/3d81a7be-7089-4d99-8733-16fdc22b4c11.jpg patch | view | raw | blame | history
doc/PosImages/a/3e0a0f57-5189-48ee-9246-bb237ba4da82.jpg patch | view | raw | blame | history
doc/PosImages/a/3eb922e4-ef11-4df3-9eb5-edd9c2be26d6.jpg patch | view | raw | blame | history
doc/PosImages/a/3f1aaff9-7033-4e95-8034-1f11b1f83085.jpg patch | view | raw | blame | history
doc/PosImages/a/3f7a14f0-a89c-4997-af65-9b688d3ec520.jpg patch | view | raw | blame | history
doc/PosImages/a/3ff24f64-816d-4ca1-b614-c5e9781ed8ef.jpg patch | view | raw | blame | history
doc/PosImages/a/4003cc69-4c42-4cad-a8a3-0d04884eb96c.jpg patch | view | raw | blame | history
doc/PosImages/a/4025024e-bc16-4ae4-8b00-78df02db0da7.jpg patch | view | raw | blame | history
doc/PosImages/a/4057df3e-f9c7-499d-8e97-6b2026428b53.jpg patch | view | raw | blame | history
doc/PosImages/a/40f42840-8e22-4e4a-80b3-49d9b067e6e2.jpg patch | view | raw | blame | history
doc/PosImages/a/41097ef6-6f0e-4ac5-a68d-f732f614caa7.jpg patch | view | raw | blame | history
doc/PosImages/a/41241068-24bd-4f3b-a795-13fe336c6e78.jpg patch | view | raw | blame | history
doc/PosImages/a/422f2780-660c-4c7a-a35a-95aa6d37b5d1.jpg patch | view | raw | blame | history
doc/PosImages/a/42a6437b-db66-40b2-92e9-0cc998d35609.jpg patch | view | raw | blame | history
doc/PosImages/a/438e5b35-526e-40f9-ac6f-86c81e0815e8.jpg patch | view | raw | blame | history
doc/PosImages/a/43e82cd0-c709-4783-bb36-4ca04082af0f.jpg patch | view | raw | blame | history
doc/PosImages/a/44f681a2-482d-4e80-a94a-61fea5bd90a8.jpg patch | view | raw | blame | history
doc/PosImages/a/45b9c106-fa92-4631-8775-266c9c2a522c.jpg patch | view | raw | blame | history
doc/PosImages/a/47b6cb38-12dd-49d0-b0a5-d5f623b753fc.jpg patch | view | raw | blame | history
doc/PosImages/a/47ff06c0-5cc0-46a6-851a-462e3cb7d8bb.jpg patch | view | raw | blame | history
doc/PosImages/a/48e70dc1-3494-4a9d-ab01-08455cbd116d.jpg patch | view | raw | blame | history
doc/PosImages/a/495580d1-6a45-4d94-b660-f76cc143bffa.jpg patch | view | raw | blame | history
doc/PosImages/a/49bc74ee-6568-4286-8f65-8138b21149ba.jpg patch | view | raw | blame | history
doc/PosImages/a/49d87149-db3e-4f92-9ae9-582b5d1d0af0.jpg patch | view | raw | blame | history
doc/PosImages/a/49e717d9-fc0f-4e4a-9311-f8e24271163a.jpg patch | view | raw | blame | history
doc/PosImages/a/4abcf160-b8b2-4ea9-80a1-2f02f33d3276.jpg patch | view | raw | blame | history
doc/PosImages/a/4b25a672-69f5-4082-aca2-298c29f37eaa.jpg patch | view | raw | blame | history
doc/PosImages/a/4c8bcd46-f896-4086-acd5-24c896fb3a6f.jpg patch | view | raw | blame | history
doc/PosImages/a/4d87fe76-8708-45f3-916d-c32896849a5b.jpg patch | view | raw | blame | history
doc/PosImages/a/4f5a7440-d98c-4c9b-aecb-2ba38b6b1aec.jpg patch | view | raw | blame | history
doc/PosImages/a/4fd3f17f-a86c-4669-9d38-c6b7da5973ef.jpg patch | view | raw | blame | history
doc/PosImages/a/4ff401d3-8bdb-4bb5-baa1-d7f44697274c.jpg patch | view | raw | blame | history
doc/PosImages/a/5017d24d-823f-43bb-8faa-5c673585f0f4.jpg patch | view | raw | blame | history
doc/PosImages/a/507c56ee-8e3d-400f-bde0-7f032077fda5.jpg patch | view | raw | blame | history
doc/PosImages/a/51336d81-7f05-4f11-ab85-52bb6a511ec6.jpg patch | view | raw | blame | history
doc/PosImages/a/51a0f874-9995-40c6-bed7-86c735930c22.jpg patch | view | raw | blame | history
doc/PosImages/a/5236c0cb-d71d-445a-9edd-5f7e01dc6f09.jpg patch | view | raw | blame | history
doc/PosImages/a/53217955-5a7f-4f96-a9fc-4174ae596151.jpg patch | view | raw | blame | history
doc/PosImages/a/53b99b17-8376-44cf-be68-6e1d951f1f27.jpg patch | view | raw | blame | history
doc/PosImages/a/53dc6d9e-51b0-452f-8933-0ae4dd45efcc.jpg patch | view | raw | blame | history
doc/PosImages/a/546867f0-0bbe-44ec-a66e-ce8bcaf98ae5.jpg patch | view | raw | blame | history
doc/PosImages/a/54f080de-a97f-4581-be1e-6fc0f2bc2f94.jpg patch | view | raw | blame | history
doc/PosImages/a/55b000dc-1b55-4eb8-97c6-9b8fa17815ec.jpg patch | view | raw | blame | history
doc/PosImages/a/57b7020a-b49f-4549-b9cb-ad1a94f276eb.jpg patch | view | raw | blame | history
doc/PosImages/a/57bd6de8-c83f-455d-a48c-dfe7056ac13d.jpg patch | view | raw | blame | history
doc/PosImages/a/58e3385c-8f5b-4717-871d-9a961957900f.jpg patch | view | raw | blame | history
doc/PosImages/a/58f7137e-6754-45f2-8181-83a7d38c1879.jpg patch | view | raw | blame | history
doc/PosImages/a/59dd3a27-ee5b-4f87-91e7-6b91db15cb27.jpg patch | view | raw | blame | history
doc/PosImages/a/5bb48ab0-86c4-44fb-a75b-67ef2062ddc4.jpg patch | view | raw | blame | history
doc/PosImages/a/5c3fc71a-1e3c-49d4-888b-4994b41abb3e.jpg patch | view | raw | blame | history
doc/PosImages/a/5c7d0352-62a8-4bec-9c40-b9159a348ba2.jpg patch | view | raw | blame | history
doc/PosImages/a/5caf1745-076b-49ff-865b-fc810f377fff.jpg patch | view | raw | blame | history
doc/PosImages/a/5d55c856-dd7b-489e-a4cf-44b7ce224463.jpg patch | view | raw | blame | history
doc/PosImages/a/5e5ce7c5-6ba0-4c2d-9540-9fbc502df819.jpg patch | view | raw | blame | history
doc/PosImages/a/5f1b011a-2430-41bc-bce5-fed0bee02fa3.jpg patch | view | raw | blame | history
doc/PosImages/a/5f3af8b4-fa9a-49c5-900f-3d5bcc769dc9.jpg patch | view | raw | blame | history
doc/PosImages/a/5f75c543-f2f5-4edc-954e-0b6f0b959dbc.jpg patch | view | raw | blame | history
doc/PosImages/a/5f92f47b-4b91-4182-8ffc-046429ae2240.jpg patch | view | raw | blame | history
doc/PosImages/a/5fcf35e5-8c8d-40eb-96ed-2633a086f109.jpg patch | view | raw | blame | history
doc/PosImages/a/5fdd9bb5-4ced-43a9-9641-37185575fd26.jpg patch | view | raw | blame | history
doc/PosImages/a/608786f2-f43c-4eb4-8a52-b1f5466d4b80.jpg patch | view | raw | blame | history
doc/PosImages/a/60927d4f-265f-4d51-9c12-493f36f39231.jpg patch | view | raw | blame | history
doc/PosImages/a/61b62861-55d4-47dd-b0eb-023f4765b0c0.jpg patch | view | raw | blame | history
doc/PosImages/a/62be6cff-617c-45d1-b192-b3c9c047cbbd.jpg patch | view | raw | blame | history
doc/PosImages/a/63c9066f-15fd-482b-8ef8-bb9305d2355a.jpg patch | view | raw | blame | history
doc/PosImages/a/63cb628a-6dd5-4bb6-b6e1-f8978733a4fc.jpg patch | view | raw | blame | history
doc/PosImages/a/64d42d35-9612-4d98-975b-8be767172502.jpg patch | view | raw | blame | history
doc/PosImages/a/64ed2d26-e859-4be7-93c9-caafe28b14ef.jpg patch | view | raw | blame | history
doc/PosImages/a/6645d7f2-629e-4695-90ae-3e6d15f565d5.jpg patch | view | raw | blame | history
doc/PosImages/a/66c3388f-0714-4237-a6c9-2a8d0fa7cd27.jpg patch | view | raw | blame | history
doc/PosImages/a/69a18a76-7242-4c19-a49e-7277f6155247.jpg patch | view | raw | blame | history
doc/PosImages/a/6a087e15-11d4-4c53-8668-fce04e157b57.jpg patch | view | raw | blame | history
doc/PosImages/a/6ac43a08-40ed-49bb-9345-d40752696f01.jpg patch | view | raw | blame | history
doc/PosImages/a/6c32cc83-6e84-42c4-852f-9adab612451c.jpg patch | view | raw | blame | history
doc/PosImages/a/6c67d8f5-84e9-4210-a16d-e9788e908f08.jpg patch | view | raw | blame | history
doc/PosImages/a/6e2fc0db-4b2a-4a91-9584-79eea6e1ea89.jpg patch | view | raw | blame | history
doc/PosImages/a/6fddc7e2-6161-4eeb-8a7b-6f75e2c5e12b.jpg patch | view | raw | blame | history
doc/PosImages/a/72efc11a-4dcf-414c-8a13-7dc9af35e271.jpg patch | view | raw | blame | history
doc/PosImages/a/735b031f-4faa-48db-9ec2-090bf6db8fbd.jpg patch | view | raw | blame | history
doc/PosImages/a/73a8c671-77fb-41ba-a405-f3c2c973a7f1.jpg patch | view | raw | blame | history
doc/PosImages/a/73d2476b-e741-4888-8560-8a09cd6d0f75.jpg patch | view | raw | blame | history
doc/PosImages/a/73e7d831-6952-40a4-a18a-dbac03ff55fc.jpg patch | view | raw | blame | history
doc/PosImages/a/77085a85-8e45-47ab-bb5a-46c6045f1dad.jpg patch | view | raw | blame | history
doc/PosImages/a/771266f4-e941-446d-8db4-d73abaa2ff00.jpg patch | view | raw | blame | history
doc/PosImages/a/773c34f3-aae6-4e57-afe7-d9545d607094.jpg patch | view | raw | blame | history
doc/PosImages/a/77b1f3e5-e501-4f28-b19f-d6eed2f7871e.jpg patch | view | raw | blame | history
doc/PosImages/a/77c5db4d-3899-42c4-8a8c-8fa4f3446653.jpg patch | view | raw | blame | history
doc/PosImages/a/782d67a0-1195-4f98-838e-2a31ca9152d6.jpg patch | view | raw | blame | history
doc/PosImages/a/786bb4bd-6c46-4249-a9d0-40b191a62647.jpg patch | view | raw | blame | history
doc/PosImages/a/790973a9-5438-4c12-be09-a6cebe807575.jpg patch | view | raw | blame | history
doc/PosImages/a/797f30dc-c6e4-4f82-ab71-da03f200d70b.jpg patch | view | raw | blame | history
doc/PosImages/a/7a01f43d-7941-4c00-8731-4b24a06fb0d1.jpg patch | view | raw | blame | history
doc/PosImages/a/7a102d17-5413-4448-bf9b-41c6a7180027.jpg patch | view | raw | blame | history
doc/PosImages/a/7a61964e-d86c-4623-98ec-e4e0ab14889b.jpg patch | view | raw | blame | history
doc/PosImages/a/7ae7a0b7-1b74-465c-a16a-80a39080816d.jpg patch | view | raw | blame | history
doc/PosImages/a/7b7ff76f-4f82-4bf8-a9bf-ae2e7df4dde0.jpg patch | view | raw | blame | history
doc/PosImages/a/7bdd1b88-c859-4142-869c-8b05a17d6efc.jpg patch | view | raw | blame | history
doc/PosImages/a/7be5749c-adc4-48bf-b9c3-c19ca065e6ed.jpg patch | view | raw | blame | history
doc/PosImages/a/7c2ec387-476c-4dfb-bf15-80c0839787de.jpg patch | view | raw | blame | history
doc/PosImages/a/7d2ced29-c141-4490-8a56-b85627674886.jpg patch | view | raw | blame | history
doc/PosImages/a/7d32ad0d-a76a-4220-8fff-758b630b2b44.jpg patch | view | raw | blame | history
doc/PosImages/a/7e2fe464-895f-48a2-95f4-4e12e1b3e106.jpg patch | view | raw | blame | history
doc/PosImages/a/7e432802-7c2a-4e8f-9222-38b46ce16ce9.jpg patch | view | raw | blame | history
doc/PosImages/a/7ed3903f-e371-4fb5-b595-897299c598d5.jpg patch | view | raw | blame | history
doc/PosImages/a/7f68b63e-f8cd-4648-9a00-7d5db1f46aba.jpg patch | view | raw | blame | history
doc/PosImages/a/7fdcf76e-f67e-482f-9326-1da08a70205f.jpg patch | view | raw | blame | history
doc/PosImages/a/8044b0bf-d6eb-4af7-bc03-83594d091726.jpg patch | view | raw | blame | history
doc/PosImages/a/80726a58-39ad-4d2f-8134-8abd368345dc.jpg patch | view | raw | blame | history
doc/PosImages/a/80de72a0-4eea-4e50-837a-fed209e4d55e.jpg patch | view | raw | blame | history
doc/PosImages/a/812c30d8-a3a4-4886-bb54-b8d3e147fed7.jpg patch | view | raw | blame | history
doc/PosImages/a/81df7fd7-a8a1-4ca2-94b0-47e2ee25b1cd.jpg patch | view | raw | blame | history
doc/PosImages/a/82b31439-47eb-41ee-a167-74773e097aca.jpg patch | view | raw | blame | history
doc/PosImages/a/84ad2d05-bdc9-4376-9ada-a6e81af74c10.jpg patch | view | raw | blame | history
doc/PosImages/a/8501df93-24b3-4996-ad3d-c38a023c10ce.jpg patch | view | raw | blame | history
doc/PosImages/a/85086a60-2493-4e4c-8e58-057bbd8ceb6b.jpg patch | view | raw | blame | history
doc/PosImages/a/855e9a1d-8ab6-458f-9eda-5ef4f2f82f4c.jpg patch | view | raw | blame | history
doc/PosImages/a/856fcb5e-90f1-4938-aad5-df24b1946a5f.jpg patch | view | raw | blame | history
doc/PosImages/a/85dea783-4959-4cf4-922e-3ba0b9c78742.jpg patch | view | raw | blame | history
doc/PosImages/a/8658bf92-e1ef-4005-8bba-121754e3afcd.jpg patch | view | raw | blame | history
doc/PosImages/a/866ace0a-9a1b-490c-b3bd-7252b137f95e.jpg patch | view | raw | blame | history
doc/PosImages/a/868ecbe3-b3c0-474b-99f6-03b1750509aa.jpg patch | view | raw | blame | history
doc/PosImages/a/88102d83-933e-4277-9b1e-709c0ad3a8a8.jpg patch | view | raw | blame | history
doc/PosImages/a/883a980c-eaa4-43e5-ad5d-c1ea23d75d29.jpg patch | view | raw | blame | history
doc/PosImages/a/88a5a73b-6498-4d55-b202-aa9b8be8b62a.jpg patch | view | raw | blame | history
doc/PosImages/a/894d42cd-89cc-494f-a696-57b17c978ea8.jpg patch | view | raw | blame | history
doc/PosImages/a/8983781d-88d1-47bf-a8d5-fdde75ea13c6.jpg patch | view | raw | blame | history
doc/PosImages/a/89d82b90-3575-4144-9357-6c0f22bb35d3.jpg patch | view | raw | blame | history
doc/PosImages/a/8a26e6aa-315c-441d-b49b-48eecc056a3e.jpg patch | view | raw | blame | history
doc/PosImages/a/8a6894b1-889e-4481-bffd-577e889f812a.jpg patch | view | raw | blame | history
doc/PosImages/a/8bae0891-d97a-480e-90c0-535085207b17.jpg patch | view | raw | blame | history
doc/PosImages/a/8d928453-9023-4b50-8b79-b92bc7c191d5.jpg patch | view | raw | blame | history
doc/PosImages/a/8ff3edcc-850a-447c-b55f-f1aab5c07480.jpg patch | view | raw | blame | history
doc/PosImages/a/90ebf33c-28b0-45b8-b674-6f6ef53f4c17.jpg patch | view | raw | blame | history
doc/PosImages/a/917b2824-f665-42b5-a592-28dbbca5dfb4.jpg patch | view | raw | blame | history
doc/PosImages/a/9275bbf6-4747-40ec-9615-f11baf279d42.jpg patch | view | raw | blame | history
doc/PosImages/a/92ff54a3-156d-4d1a-be94-1e9e1aad9731.jpg patch | view | raw | blame | history
doc/PosImages/a/938f193a-6ba4-4262-a8b8-645f3b90d50a.jpg patch | view | raw | blame | history
doc/PosImages/a/93a93c1a-54d1-44d6-8c98-e0fb716e46af.jpg patch | view | raw | blame | history
doc/PosImages/a/93c33584-8c92-4090-83eb-8194b329b555.jpg patch | view | raw | blame | history
doc/PosImages/a/93f286fe-538d-47ae-ba0d-3e52290528e6.jpg patch | view | raw | blame | history
doc/PosImages/a/95106078-bf06-439e-bf51-a9f4bc92be0e.jpg patch | view | raw | blame | history
doc/PosImages/a/95653ab9-d508-4466-8b9e-448e2a985bf8.jpg patch | view | raw | blame | history
doc/PosImages/a/9646efe4-5b20-4b5f-a596-99c56b43fed4.jpg patch | view | raw | blame | history
doc/PosImages/a/9780c396-947f-40ea-8eec-d03259e1d89e.jpg patch | view | raw | blame | history
doc/PosImages/a/98922f63-f063-4a26-8e1a-5f1a5a53a1bb.jpg patch | view | raw | blame | history
doc/PosImages/a/9a84fe3d-898e-406c-9589-54376f6a9671.jpg patch | view | raw | blame | history
doc/PosImages/a/9abf7163-26bd-4f3f-a1be-0e34eca4660f.jpg patch | view | raw | blame | history
doc/PosImages/a/9ac0575f-a71f-4a01-be17-390460d02198.jpg patch | view | raw | blame | history
doc/PosImages/a/9bd3a781-f24e-4064-bb24-51aa7169b822.jpg patch | view | raw | blame | history
doc/PosImages/a/9c8e0ebe-230b-4ffa-8155-d029fb485c25.jpg patch | view | raw | blame | history
doc/PosImages/a/9cbe05b6-4a05-47e0-a9f0-a2f0e8f6127b.jpg patch | view | raw | blame | history
doc/PosImages/a/9d1d7480-d374-405e-9307-59c91bfd2002.jpg patch | view | raw | blame | history
doc/PosImages/a/9dd7f5a8-ddf9-4d23-8c4c-b390041f8e7c.jpg patch | view | raw | blame | history
doc/PosImages/a/9ee99ce5-a54b-425e-929f-73a662a94fa8.jpg patch | view | raw | blame | history
doc/PosImages/a/9f7175b3-34a3-495d-9c74-4ae3d4ed15b9.jpg patch | view | raw | blame | history
doc/PosImages/a/a0a969a6-22d9-40c1-8056-5d4673a2b4f9.jpg patch | view | raw | blame | history
doc/PosImages/a/a19e5a86-7054-4618-adf4-621f50da1625.jpg patch | view | raw | blame | history
doc/PosImages/a/a1fefa63-83a2-4ff0-b188-28e61aada9e5.jpg patch | view | raw | blame | history
doc/PosImages/a/a276de5e-41e3-470d-969c-7f295c3d77eb.jpg patch | view | raw | blame | history
doc/PosImages/a/a2c149c1-7485-4bd7-98ed-f5fc48f98ae9.jpg patch | view | raw | blame | history
doc/PosImages/a/a2d6b6ac-adf1-4ef0-8fd5-671965b3030e.jpg patch | view | raw | blame | history
doc/PosImages/a/a2fe93c2-b659-4d44-b4a2-46edb6ca6ff4.jpg patch | view | raw | blame | history
doc/PosImages/a/a352afb4-e24f-4086-9bd0-a40699a0ba51.jpg patch | view | raw | blame | history
doc/PosImages/a/a4143d11-d660-4348-b4e9-9b4d815e3b16.jpg patch | view | raw | blame | history
doc/PosImages/a/a505a8d5-6ede-4c21-8813-32ad2bcfe23e.jpg patch | view | raw | blame | history
doc/PosImages/a/a5464509-565d-48b8-80aa-d93b02ee3df7.jpg patch | view | raw | blame | history
doc/PosImages/a/a583bf44-89df-4d64-9429-0c937062a47b.jpg patch | view | raw | blame | history
doc/PosImages/a/a63a6d7f-6da7-4509-a17d-377c1f5fe290.jpg patch | view | raw | blame | history
doc/PosImages/a/a786cb53-b3ef-4972-92bf-c867ae908958.jpg patch | view | raw | blame | history
doc/PosImages/a/a8740796-2872-4f19-a464-95434ca20b2f.jpg patch | view | raw | blame | history
doc/PosImages/a/a8967c2e-1e6a-4230-9609-9cb2baf739a0.jpg patch | view | raw | blame | history
doc/PosImages/a/a8cd9898-da0b-44d2-8a42-7373bc13375e.jpg patch | view | raw | blame | history
doc/PosImages/a/a8dd2352-34fe-42d0-8fa1-fe56fbb3f970.jpg patch | view | raw | blame | history
doc/PosImages/a/a9f52240-1dd2-4a08-8cc3-b11aa5d3ff81.jpg patch | view | raw | blame | history
doc/PosImages/a/aa91d8ac-e594-4d00-9506-30bb8e5e5e5d.jpg patch | view | raw | blame | history
doc/PosImages/a/ac2497b7-30c3-48fc-8232-3959f6a74af5.jpg patch | view | raw | blame | history
doc/PosImages/a/ad29e0aa-3263-486d-ae7c-3d2a57cfa58c.jpg patch | view | raw | blame | history
doc/PosImages/a/ae5c5071-0722-4cec-b7d8-453c7f5358ed.jpg patch | view | raw | blame | history
doc/PosImages/a/ae8a15e7-7700-46b1-83bf-a0cad901eaf2.jpg patch | view | raw | blame | history
doc/PosImages/a/b009162d-dd83-4835-88e4-f43616c2dbf5.jpg patch | view | raw | blame | history
doc/PosImages/a/b0b96e2a-5d64-4ef2-b6a6-33b032282998.jpg patch | view | raw | blame | history
doc/PosImages/a/b1b89945-afe1-42a9-88c5-b27e274aa4cf.jpg patch | view | raw | blame | history
doc/PosImages/a/b1dbd231-0892-460f-82bd-9dc6e92708c5.jpg patch | view | raw | blame | history
doc/PosImages/a/b245a829-2637-4494-b329-776ac016e752.jpg patch | view | raw | blame | history
doc/PosImages/a/b28e09d4-3843-468a-b883-a354f6666623.jpg patch | view | raw | blame | history
doc/PosImages/a/b328ca26-1fbb-441b-81d2-f7d47992959d.jpg patch | view | raw | blame | history
doc/PosImages/a/b3abdceb-a2eb-49ef-9633-7387fca66189.jpg patch | view | raw | blame | history
doc/PosImages/a/b59fb665-5127-4290-b080-1d982feca4e3.jpg patch | view | raw | blame | history
doc/PosImages/a/b601eed4-88d3-42c7-aa40-e4df89a463f3.jpg patch | view | raw | blame | history
doc/PosImages/a/b6333fae-2c42-4b26-a66f-70b615624a81.jpg patch | view | raw | blame | history
doc/PosImages/a/b740b3db-3ea4-409c-affb-481aff2ead42.jpg patch | view | raw | blame | history
doc/PosImages/a/b909b786-4b26-4892-ba04-932900adfbbb.jpg patch | view | raw | blame | history
doc/PosImages/a/b99ad5d8-6696-4894-acf4-37678a35e267.jpg patch | view | raw | blame | history
doc/PosImages/a/b9eadea1-2ac0-4781-9c90-128a701a82c3.jpg patch | view | raw | blame | history
doc/PosImages/a/badc728d-13c1-4601-ae02-b6e9455a4aa3.jpg patch | view | raw | blame | history
doc/PosImages/a/bbe1f24a-a3a5-4eea-9d76-fdaed989491f.jpg patch | view | raw | blame | history
doc/PosImages/a/bc2b133b-e106-4f9d-ae82-ee4afafc9cb2.jpg patch | view | raw | blame | history
doc/PosImages/a/bc348543-46a8-4f50-bc41-b0bf9ea1d3e8.jpg patch | view | raw | blame | history
doc/PosImages/a/bca5f926-21ce-4660-aa79-166372c10faf.jpg patch | view | raw | blame | history
doc/PosImages/a/bcd07f96-8f3e-42fc-bda3-2018c9674af9.jpg patch | view | raw | blame | history
doc/PosImages/a/bd736a34-dec7-4424-a8ab-d89f90611ea8.jpg patch | view | raw | blame | history
doc/PosImages/a/bf0d2e3f-e32f-4625-8ffa-8eeadc79dd26.jpg patch | view | raw | blame | history
doc/PosImages/a/c08becd1-44e0-4495-9611-bcc146223989.jpg patch | view | raw | blame | history
doc/PosImages/a/c152debe-d3f9-4783-8bc1-01a3d456a230.jpg patch | view | raw | blame | history
doc/PosImages/a/c1f9347f-58c7-439e-92e4-6280c3ce67b7.jpg patch | view | raw | blame | history
doc/PosImages/a/c2c7a459-d4aa-4cad-89d8-7be7b52b31a4.jpg patch | view | raw | blame | history
doc/PosImages/a/c3452896-96af-4ef3-b11e-c91392402adb.jpg patch | view | raw | blame | history
doc/PosImages/a/c34c6508-f0d0-474a-998f-7449a0d9cd1d.jpg patch | view | raw | blame | history
doc/PosImages/a/c3f0db93-dc9e-4560-a9e1-c030e93bbb34.jpg patch | view | raw | blame | history
doc/PosImages/a/c50b278e-2f21-4a7c-b8af-6ea254fb302a.jpg patch | view | raw | blame | history
doc/PosImages/a/c5a29e1e-1311-4481-b0d0-80124ad655bf.jpg patch | view | raw | blame | history
doc/PosImages/a/c605af33-b8ee-4b82-9abb-4e832da76c6c.jpg patch | view | raw | blame | history
doc/PosImages/a/c7347cbb-0279-419a-83d7-d62382c11386.jpg patch | view | raw | blame | history
doc/PosImages/a/c7c91305-30f5-4011-b23c-5c713b8491a8.jpg patch | view | raw | blame | history
doc/PosImages/a/c7dcb6f4-9613-4e80-8793-2358285aecff.jpg patch | view | raw | blame | history
doc/PosImages/a/c8456444-f2a2-41a1-9aa0-3beaef8caeeb.jpg patch | view | raw | blame | history
doc/PosImages/a/c86ed233-7919-47fe-b810-524f6bf72f41.jpg patch | view | raw | blame | history
doc/PosImages/a/c8882c75-27d2-4d88-b40c-b244ac758243.jpg patch | view | raw | blame | history
doc/PosImages/a/c8dd2d2e-43ea-4844-ba9d-ff1d4e651003.jpg patch | view | raw | blame | history
doc/PosImages/a/c95b2dc2-30a9-4507-a954-9b79d48dec26.jpg patch | view | raw | blame | history
doc/PosImages/a/cc399c1e-79cb-4994-aa59-195598aeaca7.jpg patch | view | raw | blame | history
doc/PosImages/a/cc7963a8-c92f-41be-b45f-8c70c002e647.jpg patch | view | raw | blame | history
doc/PosImages/a/cc8977f5-0db9-49e9-b405-111472439b3b.jpg patch | view | raw | blame | history
doc/PosImages/a/ccdf1eae-f5d0-44d6-b325-d086306d441a.jpg patch | view | raw | blame | history
doc/PosImages/a/cce90363-d669-4580-be98-02493c6aa3f4.jpg patch | view | raw | blame | history
doc/PosImages/a/cd04b55b-fac2-4a19-81bd-5a5b44d04346.jpg patch | view | raw | blame | history
doc/PosImages/a/cd56967b-edb0-49b8-98db-2d0534a2d26b.jpg patch | view | raw | blame | history
doc/PosImages/a/cdc682fb-9ab3-4f40-870c-01286ad392fd.jpg patch | view | raw | blame | history
doc/PosImages/a/ceac7c00-4f07-43bb-a4ad-768acfc96058.jpg patch | view | raw | blame | history
doc/PosImages/a/cf65ce2a-99f4-4a9a-94f6-974cb01a7c36.jpg patch | view | raw | blame | history
doc/PosImages/a/cfb335c9-03b5-427e-8f2b-7acbb06a2cd2.jpg patch | view | raw | blame | history
doc/PosImages/a/cfb81691-8d99-4474-8b4e-e8c805f5528d.jpg patch | view | raw | blame | history
doc/PosImages/a/d025cddc-614a-4cad-abe8-773a4b464819.jpg patch | view | raw | blame | history
doc/PosImages/a/d154f065-5907-4cc7-a67c-67ca1a63ea6f.jpg patch | view | raw | blame | history
doc/PosImages/a/d1a07d2c-7781-4690-ba12-e36c9162fa57.jpg patch | view | raw | blame | history
doc/PosImages/a/d2942235-930c-409f-b803-389dabe3a2c7.jpg patch | view | raw | blame | history
doc/PosImages/a/d2fd9b78-2a33-4a76-b6bb-dd17c745404e.jpg patch | view | raw | blame | history
doc/PosImages/a/d3848395-9dd5-442b-b261-4722925f9d66.jpg patch | view | raw | blame | history
doc/PosImages/a/d3d54df4-fe9b-4103-bdf6-95bde38c9658.jpg patch | view | raw | blame | history
doc/PosImages/a/d4116663-285d-44c8-b339-393d41bf62eb.jpg patch | view | raw | blame | history
doc/PosImages/a/d4c54dc2-5316-45b4-9512-4bdb9c8d8435.jpg patch | view | raw | blame | history
doc/PosImages/a/d50bdd66-55dd-4834-a028-892f50761869.jpg patch | view | raw | blame | history
doc/PosImages/a/d66783d6-f04f-4a62-bb8c-5298c9de1025.jpg patch | view | raw | blame | history
doc/PosImages/a/d67ce5b4-8b1f-4ac8-8a4b-9df92426e663.jpg patch | view | raw | blame | history
doc/PosImages/a/d68b7d90-7569-47a4-bc53-4cf16122f512.jpg patch | view | raw | blame | history
doc/PosImages/a/d6db469f-aa81-490d-8de9-1112ee9ed8d9.jpg patch | view | raw | blame | history
doc/PosImages/a/d7e23839-6d4f-4b86-ab27-8b9177d08e93.jpg patch | view | raw | blame | history
doc/PosImages/a/d8dee04d-7c34-45a4-abbb-7c75b56f41f3.jpg patch | view | raw | blame | history
doc/PosImages/a/da879f52-f822-4875-bc38-aafa88d00dbd.jpg patch | view | raw | blame | history
doc/PosImages/a/db20258d-4f3e-4710-a38b-129fc41a9e97.jpg patch | view | raw | blame | history
doc/PosImages/a/db46087a-9fa9-47ad-bbef-fa6132ed8c0d.jpg patch | view | raw | blame | history
doc/PosImages/a/db55deec-5146-45f2-87e1-2dee0f473a7d.jpg patch | view | raw | blame | history
doc/PosImages/a/dd05f34a-fc74-4f72-9b9c-83e3226f1d3e.jpg patch | view | raw | blame | history
doc/PosImages/a/dd7d8f99-d5e5-4fd2-a61d-e1364bb2f5d2.jpg patch | view | raw | blame | history
doc/PosImages/a/ddab658d-3044-422c-9543-4da1e8935a87.jpg patch | view | raw | blame | history
doc/PosImages/a/df9f47d6-2664-456c-8d60-365110b6f7dc.jpg patch | view | raw | blame | history
doc/PosImages/a/e1734667-98f5-4deb-b4ac-ce83eac97228.jpg patch | view | raw | blame | history
doc/PosImages/a/e18e26ec-d77c-47fd-8e9d-b2c1a320fd8d.jpg patch | view | raw | blame | history
doc/PosImages/a/e1d53b96-616b-49a0-8133-4e6715e36354.jpg patch | view | raw | blame | history
doc/PosImages/a/e21eb40e-6a08-4d98-be08-707d6ca78d96.jpg patch | view | raw | blame | history
doc/PosImages/a/e239eb70-63aa-4b4b-91ca-274c4a7711ed.jpg patch | view | raw | blame | history
doc/PosImages/a/e3276a92-18b0-4f0f-bbad-9ce03084712a.jpg patch | view | raw | blame | history
doc/PosImages/a/e3ef6833-ff2f-4107-a7f0-1694707b09b2.jpg patch | view | raw | blame | history
doc/PosImages/a/e3fea3f4-c67f-43b3-8c7f-b6d4ca89606d.jpg patch | view | raw | blame | history
doc/PosImages/a/e4534395-2262-46ad-a444-33d5abb320b3.jpg patch | view | raw | blame | history
doc/PosImages/a/e4c35d28-5b9e-4925-83cb-73e9f7f16764.jpg patch | view | raw | blame | history
doc/PosImages/a/e58cb01b-31df-44ca-8d2f-8778e6ad81a5.jpg patch | view | raw | blame | history
doc/PosImages/a/e59117a2-7aff-4a74-b663-18c306c859ab.jpg patch | view | raw | blame | history
doc/PosImages/a/e5b23280-e84d-425e-8528-c7489f3afb87.jpg patch | view | raw | blame | history
doc/PosImages/a/e647eb82-7ee0-488f-a086-2aa6df58c0a6.jpg patch | view | raw | blame | history
doc/PosImages/a/e68dc167-08b6-4472-82b5-a5d57db55bd2.jpg patch | view | raw | blame | history
doc/PosImages/a/e6bf529d-d438-4744-90f7-9f35c67baaa3.jpg patch | view | raw | blame | history
doc/PosImages/a/e6ed7217-47bb-4ea9-885c-c03b73b87052.jpg patch | view | raw | blame | history
doc/PosImages/a/e71f9ad3-00d3-44a8-90d2-b9de5d0c0827.jpg patch | view | raw | blame | history
doc/PosImages/a/e7b6ff73-075b-4999-885d-44f28ea4cf20.jpg patch | view | raw | blame | history
doc/PosImages/a/e8071253-af72-4278-8e1f-e4f662277a5c.jpg patch | view | raw | blame | history
doc/PosImages/a/e86c3bbd-79ff-47bb-975a-85c427c72bd5.jpg patch | view | raw | blame | history
doc/PosImages/a/e913a3fd-6b15-4e7e-a23c-3bf544a60c78.jpg patch | view | raw | blame | history
doc/PosImages/a/ecaa489d-48cf-4d43-8192-2a3c3513921c.jpg patch | view | raw | blame | history
doc/PosImages/a/ee0bea8b-edae-4d08-b4d6-ff49341f1c57.jpg patch | view | raw | blame | history
doc/PosImages/a/eead758e-7ed8-44ad-9afa-631006280667.jpg patch | view | raw | blame | history
doc/PosImages/a/f1865d3e-b0db-4406-916e-6901029fad58.jpg patch | view | raw | blame | history
doc/PosImages/a/f229a110-dbd1-4be8-b375-b1e5d4d6d58d.jpg patch | view | raw | blame | history
doc/PosImages/a/f26e32fe-4353-4236-826d-977f92bfac39.jpg patch | view | raw | blame | history
doc/PosImages/a/f2e03235-932d-4c39-94a6-f24ad5b4b916.jpg patch | view | raw | blame | history
doc/PosImages/a/f359d99b-f090-46e6-8b9e-e0a349925a50.jpg patch | view | raw | blame | history
doc/PosImages/a/f35bc5b7-c93d-4cd1-b726-84d55485bee3.jpg patch | view | raw | blame | history
doc/PosImages/a/f40a9c1b-3346-414b-aeb3-7c650763e110.jpg patch | view | raw | blame | history
doc/PosImages/a/f5bff063-aaa7-4e46-a567-1b293de37f5c.jpg patch | view | raw | blame | history
doc/PosImages/a/f5e6bb51-96c9-41b0-b93f-4a8fb2dcb4ce.jpg patch | view | raw | blame | history
doc/PosImages/a/f67eb93a-21b1-497a-a012-c96b1b931dcd.jpg patch | view | raw | blame | history
doc/PosImages/a/f77e56b7-c214-43f8-af3f-ca713afb71c5.jpg patch | view | raw | blame | history
doc/PosImages/a/f8f36556-f13c-4608-a2d8-e80a72f71e3f.jpg patch | view | raw | blame | history
doc/PosImages/a/f93b0c27-f41d-4db2-8772-078ed6aa1873.jpg patch | view | raw | blame | history
doc/PosImages/a/f943b090-d0f7-49fb-a637-7d3e177ab68b.jpg patch | view | raw | blame | history
doc/PosImages/a/fa02d87c-e5d2-4ad5-b00d-d906ec7a9ae0.jpg patch | view | raw | blame | history
doc/PosImages/a/fa3bc0c9-47a7-4928-8abb-caefc95f5d15.jpg patch | view | raw | blame | history
doc/PosImages/a/faa4a0b2-cf57-4f91-9222-c2442378e085.jpg patch | view | raw | blame | history
doc/PosImages/a/fb29f4a5-9d60-48a9-89d2-123d3d0feb3d.jpg patch | view | raw | blame | history
doc/PosImages/a/fb4f3d6e-ff42-418a-af44-84d0a7eae528.jpg patch | view | raw | blame | history
doc/PosImages/a/fb588b03-5793-446d-a990-5ec6ec1f6186.jpg patch | view | raw | blame | history
doc/PosImages/a/fbbc0acd-3a6e-44db-93da-9d722b112732.jpg patch | view | raw | blame | history
doc/PosImages/a/fc6f2452-ff2f-4506-b58d-dd391ce51259.jpg patch | view | raw | blame | history
doc/PosImages/a/fc8a536b-2009-4501-a23c-cae843795bdb.jpg patch | view | raw | blame | history
doc/PosImages/a/ffb99a09-8ad1-4a8a-8086-73109f54838b.jpg patch | view | raw | blame | history
doc/PosImages/a/fff8a500-7140-4df0-acf6-d2d86ccb3eed.jpg patch | view | raw | blame | history
doc/地图/卡勒特_1024x768/0/0.png patch | view | raw | blame | history
doc/地图/卡勒特_1024x768/0/0.psd patch | view | raw | blame | history
doc/地图/卡勒特_1024x768/0/右上.png patch | view | raw | blame | history
doc/地图/卡勒特_1024x768/0/右下.png patch | view | raw | blame | history
doc/地图/卡勒特_1024x768/0/左上.png patch | view | raw | blame | history
doc/地图/卡勒特_1024x768/0/左下.png patch | view | raw | blame | history
doc/地图/卡勒特_1024x768/1/1.png patch | view | raw | blame | history
doc/地图/卡勒特_1024x768/1/1.psd patch | view | raw | blame | history
doc/地图/卡勒特_1024x768/1/右上.png patch | view | raw | blame | history
doc/地图/卡勒特_1024x768/1/右下.png patch | view | raw | blame | history
doc/地图/卡勒特_1024x768/1/左上.png patch | view | raw | blame | history
doc/地图/卡勒特_1024x768/1/左下.png patch | view | raw | blame | history
doc/地图/卡勒特_1024x768/11/11.png patch | view | raw | blame | history
doc/地图/卡勒特_1024x768/11/11.psd patch | view | raw | blame | history
doc/地图/卡勒特_1024x768/11/右上.png patch | view | raw | blame | history
doc/地图/卡勒特_1024x768/11/左上.png patch | view | raw | blame | history
doc/地图/卡勒特_1024x768/12/12.png patch | view | raw | blame | history
doc/地图/卡勒特_1024x768/12/12.psd patch | view | raw | blame | history
doc/地图/卡勒特_1024x768/12/右上.png patch | view | raw | blame | history
doc/地图/卡勒特_1024x768/12/左上.png patch | view | raw | blame | history
doc/地图/卡勒特_1024x768/13/13.png patch | view | raw | blame | history
doc/地图/卡勒特_1024x768/13/13.psd patch | view | raw | blame | history
doc/地图/卡勒特_1024x768/13/右上.png patch | view | raw | blame | history
doc/地图/卡勒特_1024x768/13/右下.png patch | view | raw | blame | history
doc/地图/卡勒特_1024x768/13/左上.png patch | view | raw | blame | history
doc/地图/卡勒特_1024x768/13/左下.png patch | view | raw | blame | history
doc/地图/卡勒特_1024x768/14/14.png patch | view | raw | blame | history
doc/地图/卡勒特_1024x768/14/14.psd patch | view | raw | blame | history
doc/地图/卡勒特_1024x768/14/右上.png patch | view | raw | blame | history
doc/地图/卡勒特_1024x768/14/右下.png patch | view | raw | blame | history
doc/地图/卡勒特_1024x768/14/左上.png patch | view | raw | blame | history
doc/地图/卡勒特_1024x768/14/左下.png patch | view | raw | blame | history
doc/地图/卡勒特_1024x768/16终关/16.png patch | view | raw | blame | history
doc/地图/卡勒特_1024x768/16终关/16.psd patch | view | raw | blame | history
doc/地图/卡勒特_1024x768/16终关/右上.png patch | view | raw | blame | history
doc/地图/卡勒特_1024x768/16终关/右下.png patch | view | raw | blame | history
doc/地图/卡勒特_1024x768/16终关/左上.png patch | view | raw | blame | history
doc/地图/卡勒特_1024x768/16终关/左下.png patch | view | raw | blame | history
doc/地图/卡勒特_1024x768/17/17.png patch | view | raw | blame | history
doc/地图/卡勒特_1024x768/17/17.psd patch | view | raw | blame | history
doc/地图/卡勒特_1024x768/17/右上.png patch | view | raw | blame | history
doc/地图/卡勒特_1024x768/17/左上.png patch | view | raw | blame | history
doc/地图/卡勒特_1024x768/19/19.png patch | view | raw | blame | history
doc/地图/卡勒特_1024x768/19/19.psd patch | view | raw | blame | history
doc/地图/卡勒特_1024x768/19/右上.png patch | view | raw | blame | history
doc/地图/卡勒特_1024x768/19/左上.png patch | view | raw | blame | history
doc/地图/卡勒特_1024x768/3/3.png patch | view | raw | blame | history
doc/地图/卡勒特_1024x768/3/3.psd patch | view | raw | blame | history
doc/地图/卡勒特_1024x768/3/右上.png patch | view | raw | blame | history
doc/地图/卡勒特_1024x768/3/右下.png patch | view | raw | blame | history
doc/地图/卡勒特_1024x768/3/左上.png patch | view | raw | blame | history
doc/地图/卡勒特_1024x768/3/左下.png patch | view | raw | blame | history
doc/地图/卡勒特_1024x768/6/6.png patch | view | raw | blame | history
doc/地图/卡勒特_1024x768/6/6.psd patch | view | raw | blame | history
doc/地图/卡勒特_1024x768/6/右上.png patch | view | raw | blame | history
doc/地图/卡勒特_1024x768/6/右下.png patch | view | raw | blame | history
doc/地图/卡勒特_1024x768/6/左上.png patch | view | raw | blame | history
doc/地图/卡勒特_1024x768/6/左下.png patch | view | raw | blame | history
doc/地图/卡勒特_1024x768/7/7.png patch | view | raw | blame | history
doc/地图/卡勒特_1024x768/7/7.psd patch | view | raw | blame | history
doc/地图/卡勒特_1024x768/7/右上.png patch | view | raw | blame | history
doc/地图/卡勒特_1024x768/7/右下.png patch | view | raw | blame | history
doc/地图/卡勒特_1024x768/7/左上.png patch | view | raw | blame | history
doc/地图/卡勒特_1024x768/7/左下.png patch | view | raw | blame | history
doc/地图/卡勒特_1024x768/8/8.png patch | view | raw | blame | history
doc/地图/卡勒特_1024x768/8/8.psd patch | view | raw | blame | history
doc/地图/卡勒特_1024x768/8/右上.png patch | view | raw | blame | history
doc/地图/卡勒特_1024x768/8/左上.png patch | view | raw | blame | history
doc/地图/卡勒特_1024x768/9/9.png patch | view | raw | blame | history
doc/地图/卡勒特_1024x768/9/9.psd patch | view | raw | blame | history
doc/地图/卡勒特_1024x768/9/右上.png patch | view | raw | blame | history
doc/地图/卡勒特_1024x768/9/左上.png patch | view | raw | blame | history
doc/地图/卡勒特_1024x768/map.txt 27 ●●●●● patch | view | raw | blame | history
doc/地图/卡勒特_800x600/0/0.png patch | view | raw | blame | history
doc/地图/卡勒特_800x600/0/0.psd patch | view | raw | blame | history
doc/地图/卡勒特_800x600/0/右上.png patch | view | raw | blame | history
doc/地图/卡勒特_800x600/0/右下.png patch | view | raw | blame | history
doc/地图/卡勒特_800x600/0/左上.png patch | view | raw | blame | history
doc/地图/卡勒特_800x600/0/左下.png patch | view | raw | blame | history
doc/地图/卡勒特_800x600/map.txt 2 ●●●●● patch | view | raw | blame | history
doc/流程图/杀怪KillMonster.vsd patch | view | raw | blame | history
doc/补丁/(A Lingdong)sprite_map_breakableobject(蛋).NPK patch | view | raw | blame | history
doc/补丁/(A Lingdong)sprite_map_cataclysm_skytower_draconiantower_object.NPK patch | view | raw | blame | history
doc/补丁/(A Lingdong)sprite_map_minimap.NPK patch | view | raw | blame | history
doc/补丁/(A Lingdong)sprite_map_pathgate_timegate(门).NPK patch | view | raw | blame | history
doc/补丁/(A Lingdong)sprite_monster_common.NPK patch | view | raw | blame | history
doc/补丁/(A Lingdong)sprite_monster_dragondungeon_babydragon.NPK patch | view | raw | blame | history
doc/补丁/(A Lingdong)sprite_monster_dragonknight.NPK patch | view | raw | blame | history
doc/补丁/(A Lingdong)sprite_monster_flydragon.NPK patch | view | raw | blame | history
doc/补丁/(A Lingdong)sprite_monster_impossible_bakal.NPK patch | view | raw | blame | history
doc/补丁/(A Lingdong)sprite_monster_lizardman.NPK patch | view | raw | blame | history
doc/补丁/(A Lingdong)sprite_monster_timegate_beginning.NPK patch | view | raw | blame | history
doc/补丁/(A Lingdong)sprite_monster_young_scasa.NPK patch | view | raw | blame | history
doc/补丁/(A kalete)sprite_map_arden.NPK patch | view | raw | blame | history
doc/补丁/(A kalete)sprite_map_haze.NPK patch | view | raw | blame | history
doc/补丁/(A kalete)sprite_monster_ghoul.NPK patch | view | raw | blame | history
doc/补丁/(A kalete)sprite_monster_haze.NPK patch | view | raw | blame | history
doc/补丁/(A kalete)sprite_monster_heaven_mechanicgiselle.NPK patch | view | raw | blame | history
doc/补丁/(A kalete)sprite_monster_snowman.NPK patch | view | raw | blame | history
doc/补丁/(A kalete)sprite_monster_timegate.NPK patch | view | raw | blame | history
doc/补丁/(A)sprite_interface.NPK patch | view | raw | blame | history
doc/补丁/(A)sprite_interface2_minimap_dungeon.NPK patch | view | raw | blame | history
doc/补丁/凛冬/(A)sprite_interface2_ui_comboeffect(地下城右边评分数字).NPK patch | view | raw | blame | history
doc/补丁/凛冬/(A)sprite_map_minimap.NPK patch | view | raw | blame | history
doc/补丁/凛冬/(A)sprite_map_pathgate_timegate(门).NPK patch | view | raw | blame | history
doc/补丁/凛冬/(A)影子杀手称号.NPK patch | view | raw | blame | history
doc/补丁/卡勒特之初/sprite_interface2_minimap_dungeon.NPK patch | view | raw | blame | history
doc/补丁原图/color说明.txt 8 ●●●●● patch | view | raw | blame | history
doc/补丁原图/numbers/0.png patch | view | raw | blame | history
doc/补丁原图/numbers/1.png patch | view | raw | blame | history
doc/补丁原图/numbers/10.png patch | view | raw | blame | history
doc/补丁原图/numbers/100.png patch | view | raw | blame | history
doc/补丁原图/numbers/101.png patch | view | raw | blame | history
doc/补丁原图/numbers/102.png patch | view | raw | blame | history
doc/补丁原图/numbers/103.png patch | view | raw | blame | history
doc/补丁原图/numbers/104.png patch | view | raw | blame | history
doc/补丁原图/numbers/105.png patch | view | raw | blame | history
doc/补丁原图/numbers/106.png patch | view | raw | blame | history
doc/补丁原图/numbers/107.png patch | view | raw | blame | history
doc/补丁原图/numbers/108.png patch | view | raw | blame | history
doc/补丁原图/numbers/109.png patch | view | raw | blame | history
doc/补丁原图/numbers/11.png patch | view | raw | blame | history
doc/补丁原图/numbers/110.png patch | view | raw | blame | history
doc/补丁原图/numbers/111.png patch | view | raw | blame | history
doc/补丁原图/numbers/112.png patch | view | raw | blame | history
doc/补丁原图/numbers/113.png patch | view | raw | blame | history
doc/补丁原图/numbers/114.png patch | view | raw | blame | history
doc/补丁原图/numbers/115.png patch | view | raw | blame | history
doc/补丁原图/numbers/116.png patch | view | raw | blame | history
doc/补丁原图/numbers/117.png patch | view | raw | blame | history
doc/补丁原图/numbers/118.png patch | view | raw | blame | history
doc/补丁原图/numbers/119.png patch | view | raw | blame | history
doc/补丁原图/numbers/12.png patch | view | raw | blame | history
doc/补丁原图/numbers/120.png patch | view | raw | blame | history
doc/补丁原图/numbers/121.png patch | view | raw | blame | history
doc/补丁原图/numbers/122.png patch | view | raw | blame | history
doc/补丁原图/numbers/123.png patch | view | raw | blame | history
doc/补丁原图/numbers/124.png patch | view | raw | blame | history
doc/补丁原图/numbers/125.png patch | view | raw | blame | history
doc/补丁原图/numbers/126.png patch | view | raw | blame | history
doc/补丁原图/numbers/127.png patch | view | raw | blame | history
doc/补丁原图/numbers/128.png patch | view | raw | blame | history
doc/补丁原图/numbers/129.png patch | view | raw | blame | history
doc/补丁原图/numbers/13.png patch | view | raw | blame | history
doc/补丁原图/numbers/130.png patch | view | raw | blame | history
doc/补丁原图/numbers/131.png patch | view | raw | blame | history
doc/补丁原图/numbers/132.png patch | view | raw | blame | history
doc/补丁原图/numbers/133.png patch | view | raw | blame | history
doc/补丁原图/numbers/134.png patch | view | raw | blame | history
doc/补丁原图/numbers/135.png patch | view | raw | blame | history
doc/补丁原图/numbers/136.png patch | view | raw | blame | history
doc/补丁原图/numbers/137.png patch | view | raw | blame | history
doc/补丁原图/numbers/138.png patch | view | raw | blame | history
doc/补丁原图/numbers/139.png patch | view | raw | blame | history
doc/补丁原图/numbers/14.png patch | view | raw | blame | history
doc/补丁原图/numbers/140.png patch | view | raw | blame | history
doc/补丁原图/numbers/141.png patch | view | raw | blame | history
doc/补丁原图/numbers/142.png patch | view | raw | blame | history
doc/补丁原图/numbers/143.png patch | view | raw | blame | history
doc/补丁原图/numbers/144.png patch | view | raw | blame | history
doc/补丁原图/numbers/145.png patch | view | raw | blame | history
doc/补丁原图/numbers/146.png patch | view | raw | blame | history
doc/补丁原图/numbers/147.png patch | view | raw | blame | history
doc/补丁原图/numbers/148.png patch | view | raw | blame | history
doc/补丁原图/numbers/149.png patch | view | raw | blame | history
doc/补丁原图/numbers/15.png patch | view | raw | blame | history
doc/补丁原图/numbers/150.png patch | view | raw | blame | history
doc/补丁原图/numbers/151.png patch | view | raw | blame | history
doc/补丁原图/numbers/152.png patch | view | raw | blame | history
doc/补丁原图/numbers/153.png patch | view | raw | blame | history
doc/补丁原图/numbers/154.png patch | view | raw | blame | history
doc/补丁原图/numbers/155.png patch | view | raw | blame | history
doc/补丁原图/numbers/156.png patch | view | raw | blame | history
doc/补丁原图/numbers/157.png patch | view | raw | blame | history
doc/补丁原图/numbers/158.png patch | view | raw | blame | history
doc/补丁原图/numbers/159.png patch | view | raw | blame | history
doc/补丁原图/numbers/16.png patch | view | raw | blame | history
doc/补丁原图/numbers/160.png patch | view | raw | blame | history
doc/补丁原图/numbers/161.png patch | view | raw | blame | history
doc/补丁原图/numbers/162.png patch | view | raw | blame | history
doc/补丁原图/numbers/163.png patch | view | raw | blame | history
doc/补丁原图/numbers/164.png patch | view | raw | blame | history
doc/补丁原图/numbers/165.png patch | view | raw | blame | history
doc/补丁原图/numbers/166.png patch | view | raw | blame | history
doc/补丁原图/numbers/167.png patch | view | raw | blame | history
doc/补丁原图/numbers/168.png patch | view | raw | blame | history
doc/补丁原图/numbers/169.png patch | view | raw | blame | history
doc/补丁原图/numbers/17.png patch | view | raw | blame | history
doc/补丁原图/numbers/170.png patch | view | raw | blame | history
doc/补丁原图/numbers/171.png patch | view | raw | blame | history
doc/补丁原图/numbers/172.png patch | view | raw | blame | history
doc/补丁原图/numbers/173.png patch | view | raw | blame | history
doc/补丁原图/numbers/174.png patch | view | raw | blame | history
doc/补丁原图/numbers/175.png patch | view | raw | blame | history
doc/补丁原图/numbers/176.png patch | view | raw | blame | history
doc/补丁原图/numbers/177.png patch | view | raw | blame | history
doc/补丁原图/numbers/178.png patch | view | raw | blame | history
doc/补丁原图/numbers/179.png patch | view | raw | blame | history
doc/补丁原图/numbers/18.png patch | view | raw | blame | history
doc/补丁原图/numbers/180.png patch | view | raw | blame | history
doc/补丁原图/numbers/181.png patch | view | raw | blame | history
doc/补丁原图/numbers/182.png patch | view | raw | blame | history
doc/补丁原图/numbers/183.png patch | view | raw | blame | history
doc/补丁原图/numbers/184.png patch | view | raw | blame | history
doc/补丁原图/numbers/185.png patch | view | raw | blame | history
doc/补丁原图/numbers/186.png patch | view | raw | blame | history
doc/补丁原图/numbers/187.png patch | view | raw | blame | history
doc/补丁原图/numbers/188.png patch | view | raw | blame | history
doc/补丁原图/numbers/189.png patch | view | raw | blame | history
doc/补丁原图/numbers/19.png patch | view | raw | blame | history
doc/补丁原图/numbers/190.png patch | view | raw | blame | history
doc/补丁原图/numbers/191.png patch | view | raw | blame | history
doc/补丁原图/numbers/192.png patch | view | raw | blame | history
doc/补丁原图/numbers/193.png patch | view | raw | blame | history
doc/补丁原图/numbers/194.png patch | view | raw | blame | history
doc/补丁原图/numbers/195.png patch | view | raw | blame | history
doc/补丁原图/numbers/196.png patch | view | raw | blame | history
doc/补丁原图/numbers/197.png patch | view | raw | blame | history
doc/补丁原图/numbers/198.png patch | view | raw | blame | history
doc/补丁原图/numbers/199.png patch | view | raw | blame | history
doc/补丁原图/numbers/2.png patch | view | raw | blame | history
doc/补丁原图/numbers/20.png patch | view | raw | blame | history
doc/补丁原图/numbers/200.png patch | view | raw | blame | history
doc/补丁原图/numbers/201.png patch | view | raw | blame | history
doc/补丁原图/numbers/202.png patch | view | raw | blame | history
doc/补丁原图/numbers/203.png patch | view | raw | blame | history
doc/补丁原图/numbers/204.png patch | view | raw | blame | history
doc/补丁原图/numbers/205.png patch | view | raw | blame | history
doc/补丁原图/numbers/206.png patch | view | raw | blame | history
doc/补丁原图/numbers/207.png patch | view | raw | blame | history
doc/补丁原图/numbers/208.png patch | view | raw | blame | history
doc/补丁原图/numbers/209.png patch | view | raw | blame | history
doc/补丁原图/numbers/21.png patch | view | raw | blame | history
doc/补丁原图/numbers/210.png patch | view | raw | blame | history
doc/补丁原图/numbers/211.png patch | view | raw | blame | history
doc/补丁原图/numbers/212.png patch | view | raw | blame | history
doc/补丁原图/numbers/213.png patch | view | raw | blame | history
doc/补丁原图/numbers/214.png patch | view | raw | blame | history
doc/补丁原图/numbers/215.png patch | view | raw | blame | history
doc/补丁原图/numbers/216.png patch | view | raw | blame | history
doc/补丁原图/numbers/217.png patch | view | raw | blame | history
doc/补丁原图/numbers/218.png patch | view | raw | blame | history
doc/补丁原图/numbers/219.png patch | view | raw | blame | history
doc/补丁原图/numbers/22.png patch | view | raw | blame | history
doc/补丁原图/numbers/220.png patch | view | raw | blame | history
doc/补丁原图/numbers/221.png patch | view | raw | blame | history
doc/补丁原图/numbers/222.png patch | view | raw | blame | history
doc/补丁原图/numbers/223.png patch | view | raw | blame | history
doc/补丁原图/numbers/224.png patch | view | raw | blame | history
doc/补丁原图/numbers/225.png patch | view | raw | blame | history
doc/补丁原图/numbers/226.png patch | view | raw | blame | history
doc/补丁原图/numbers/227.png patch | view | raw | blame | history
doc/补丁原图/numbers/228.png patch | view | raw | blame | history
doc/补丁原图/numbers/229.png patch | view | raw | blame | history
doc/补丁原图/numbers/23.png patch | view | raw | blame | history
doc/补丁原图/numbers/230.png patch | view | raw | blame | history
doc/补丁原图/numbers/231.png patch | view | raw | blame | history
doc/补丁原图/numbers/232.png patch | view | raw | blame | history
doc/补丁原图/numbers/233.png patch | view | raw | blame | history
doc/补丁原图/numbers/234.png patch | view | raw | blame | history
doc/补丁原图/numbers/235.png patch | view | raw | blame | history
doc/补丁原图/numbers/236.png patch | view | raw | blame | history
doc/补丁原图/numbers/237.png patch | view | raw | blame | history
doc/补丁原图/numbers/238.png patch | view | raw | blame | history
doc/补丁原图/numbers/239.png patch | view | raw | blame | history
doc/补丁原图/numbers/24.png patch | view | raw | blame | history
doc/补丁原图/numbers/240.png patch | view | raw | blame | history
doc/补丁原图/numbers/241.png patch | view | raw | blame | history
doc/补丁原图/numbers/242.png patch | view | raw | blame | history
doc/补丁原图/numbers/243.png patch | view | raw | blame | history
doc/补丁原图/numbers/244.png patch | view | raw | blame | history
doc/补丁原图/numbers/245.png patch | view | raw | blame | history
doc/补丁原图/numbers/246.png patch | view | raw | blame | history
doc/补丁原图/numbers/247.png patch | view | raw | blame | history
doc/补丁原图/numbers/248.png patch | view | raw | blame | history
doc/补丁原图/numbers/249.png patch | view | raw | blame | history
doc/补丁原图/numbers/25.png patch | view | raw | blame | history
doc/补丁原图/numbers/250.png patch | view | raw | blame | history
doc/补丁原图/numbers/251.png patch | view | raw | blame | history
doc/补丁原图/numbers/252.png patch | view | raw | blame | history
doc/补丁原图/numbers/253.png patch | view | raw | blame | history
doc/补丁原图/numbers/254.png patch | view | raw | blame | history
doc/补丁原图/numbers/255.png patch | view | raw | blame | history
doc/补丁原图/numbers/26.png patch | view | raw | blame | history
doc/补丁原图/numbers/27.png patch | view | raw | blame | history
doc/补丁原图/numbers/28.png patch | view | raw | blame | history
doc/补丁原图/numbers/29.png patch | view | raw | blame | history
doc/补丁原图/numbers/3.png patch | view | raw | blame | history
doc/补丁原图/numbers/30.png patch | view | raw | blame | history
doc/补丁原图/numbers/31.png patch | view | raw | blame | history
doc/补丁原图/numbers/32.png patch | view | raw | blame | history
doc/补丁原图/numbers/33.png patch | view | raw | blame | history
doc/补丁原图/numbers/34.png patch | view | raw | blame | history
doc/补丁原图/numbers/35.png patch | view | raw | blame | history
doc/补丁原图/numbers/36.png patch | view | raw | blame | history
doc/补丁原图/numbers/37.png patch | view | raw | blame | history
doc/补丁原图/numbers/38.png patch | view | raw | blame | history
doc/补丁原图/numbers/39.png patch | view | raw | blame | history
doc/补丁原图/numbers/4.png patch | view | raw | blame | history
doc/补丁原图/numbers/40.png patch | view | raw | blame | history
doc/补丁原图/numbers/41.png patch | view | raw | blame | history
doc/补丁原图/numbers/42.png patch | view | raw | blame | history
doc/补丁原图/numbers/43.png patch | view | raw | blame | history
doc/补丁原图/numbers/44.png patch | view | raw | blame | history
doc/补丁原图/numbers/45.png patch | view | raw | blame | history
doc/补丁原图/numbers/46.png patch | view | raw | blame | history
doc/补丁原图/numbers/47.png patch | view | raw | blame | history
doc/补丁原图/numbers/48.png patch | view | raw | blame | history
doc/补丁原图/numbers/49.png patch | view | raw | blame | history
doc/补丁原图/numbers/5.png patch | view | raw | blame | history
doc/补丁原图/numbers/50.png patch | view | raw | blame | history
doc/补丁原图/numbers/51.png patch | view | raw | blame | history
doc/补丁原图/numbers/52.png patch | view | raw | blame | history
doc/补丁原图/numbers/53.png patch | view | raw | blame | history
doc/补丁原图/numbers/54.png patch | view | raw | blame | history
doc/补丁原图/numbers/55.png patch | view | raw | blame | history
doc/补丁原图/numbers/56.png patch | view | raw | blame | history
doc/补丁原图/numbers/57.png patch | view | raw | blame | history
doc/补丁原图/numbers/58.png patch | view | raw | blame | history
doc/补丁原图/numbers/59.png patch | view | raw | blame | history
doc/补丁原图/numbers/6.png patch | view | raw | blame | history
doc/补丁原图/numbers/60.png patch | view | raw | blame | history
doc/补丁原图/numbers/61.png patch | view | raw | blame | history
doc/补丁原图/numbers/62.png patch | view | raw | blame | history
doc/补丁原图/numbers/63.png patch | view | raw | blame | history
doc/补丁原图/numbers/64.png patch | view | raw | blame | history
doc/补丁原图/numbers/65.png patch | view | raw | blame | history
doc/补丁原图/numbers/66.png patch | view | raw | blame | history
doc/补丁原图/numbers/67.png patch | view | raw | blame | history
doc/补丁原图/numbers/68.png patch | view | raw | blame | history
doc/补丁原图/numbers/69.png patch | view | raw | blame | history
doc/补丁原图/numbers/7.png patch | view | raw | blame | history
doc/补丁原图/numbers/70.png patch | view | raw | blame | history
doc/补丁原图/numbers/71.png patch | view | raw | blame | history
doc/补丁原图/numbers/72.png patch | view | raw | blame | history
doc/补丁原图/numbers/73.png patch | view | raw | blame | history
doc/补丁原图/numbers/74.png patch | view | raw | blame | history
doc/补丁原图/numbers/75.png patch | view | raw | blame | history
doc/补丁原图/numbers/76.png patch | view | raw | blame | history
doc/补丁原图/numbers/77.png patch | view | raw | blame | history
doc/补丁原图/numbers/78.png patch | view | raw | blame | history
doc/补丁原图/numbers/79.png patch | view | raw | blame | history
doc/补丁原图/numbers/8.png patch | view | raw | blame | history
doc/补丁原图/numbers/80.png patch | view | raw | blame | history
doc/补丁原图/numbers/81.png patch | view | raw | blame | history
doc/补丁原图/numbers/82.png patch | view | raw | blame | history
doc/补丁原图/numbers/83.png patch | view | raw | blame | history
doc/补丁原图/numbers/84.png patch | view | raw | blame | history
doc/补丁原图/numbers/85.png patch | view | raw | blame | history
doc/补丁原图/numbers/86.png patch | view | raw | blame | history
doc/补丁原图/numbers/87.png patch | view | raw | blame | history
doc/补丁原图/numbers/88.png patch | view | raw | blame | history
doc/补丁原图/numbers/89.png patch | view | raw | blame | history
doc/补丁原图/numbers/9.png patch | view | raw | blame | history
doc/补丁原图/numbers/90.png patch | view | raw | blame | history
doc/补丁原图/numbers/91.png patch | view | raw | blame | history
doc/补丁原图/numbers/92.png patch | view | raw | blame | history
doc/补丁原图/numbers/93.png patch | view | raw | blame | history
doc/补丁原图/numbers/94.png patch | view | raw | blame | history
doc/补丁原图/numbers/95.png patch | view | raw | blame | history
doc/补丁原图/numbers/96.png patch | view | raw | blame | history
doc/补丁原图/numbers/97.png patch | view | raw | blame | history
doc/补丁原图/numbers/98.png patch | view | raw | blame | history
doc/补丁原图/numbers/99.png patch | view | raw | blame | history
doc/补丁原图/小地图/crow.png patch | view | raw | blame | history
doc/补丁原图/小地图/person.png patch | view | raw | blame | history
doc/补丁原图/怪/凛冬/(tn)dragonknight00.png patch | view | raw | blame | history
doc/补丁原图/怪/凛冬/(tn)dragonknight00.psd patch | view | raw | blame | history
doc/补丁原图/怪/凛冬/(tn)dragonknight01.png patch | view | raw | blame | history
doc/补丁原图/怪/凛冬/(tn)dragonknight01.psd patch | view | raw | blame | history
doc/补丁原图/怪/凛冬/angry_dragon.png patch | view | raw | blame | history
doc/补丁原图/怪/凛冬/angry_dragon.psd patch | view | raw | blame | history
doc/补丁原图/怪/凛冬/babydragon.png patch | view | raw | blame | history
doc/补丁原图/怪/凛冬/babydragon.psd patch | view | raw | blame | history
doc/补丁原图/怪/凛冬/babydragon_dead.png patch | view | raw | blame | history
doc/补丁原图/怪/凛冬/babydragon_dead.psd patch | view | raw | blame | history
doc/补丁原图/怪/凛冬/babydragonmodify.png patch | view | raw | blame | history
doc/补丁原图/怪/凛冬/babydragonmodify.psd patch | view | raw | blame | history
doc/补丁原图/怪/凛冬/babydragonmodify_dead.png patch | view | raw | blame | history
doc/补丁原图/怪/凛冬/babydragonmodify_dead.psd patch | view | raw | blame | history
doc/补丁原图/怪/凛冬/black_dragon.png patch | view | raw | blame | history
doc/补丁原图/怪/凛冬/black_dragon.psd patch | view | raw | blame | history
doc/补丁原图/怪/凛冬/brown_ser.png patch | view | raw | blame | history
doc/补丁原图/怪/凛冬/brown_ser.psd patch | view | raw | blame | history
doc/补丁原图/怪/凛冬/dragon_blue_side.png patch | view | raw | blame | history
doc/补丁原图/怪/凛冬/dragon_blue_side.psd patch | view | raw | blame | history
doc/补丁原图/怪/凛冬/dragon_knight.png patch | view | raw | blame | history
doc/补丁原图/怪/凛冬/dragon_knight.psd patch | view | raw | blame | history
doc/补丁原图/怪/凛冬/dragon_normal_front.png patch | view | raw | blame | history
doc/补丁原图/怪/凛冬/dragon_normal_front.psd patch | view | raw | blame | history
doc/补丁原图/怪/凛冬/dragon_normal_side.png patch | view | raw | blame | history
doc/补丁原图/怪/凛冬/dragon_normal_side.psd patch | view | raw | blame | history
doc/补丁原图/怪/凛冬/dragon_red_front.png patch | view | raw | blame | history
doc/补丁原图/怪/凛冬/dragon_red_front.psd patch | view | raw | blame | history
doc/补丁原图/怪/凛冬/dragonknight00.png patch | view | raw | blame | history
doc/补丁原图/怪/凛冬/dragonknight00.psd patch | view | raw | blame | history
doc/补丁原图/怪/凛冬/dragonknight01.png patch | view | raw | blame | history
doc/补丁原图/怪/凛冬/dragonknight01.psd patch | view | raw | blame | history
doc/补丁原图/怪/凛冬/dragonknight02.png patch | view | raw | blame | history
doc/补丁原图/怪/凛冬/dragonknight02.psd patch | view | raw | blame | history
doc/补丁原图/怪/凛冬/dragonwizard.png patch | view | raw | blame | history
doc/补丁原图/怪/凛冬/dragonwizard.psd patch | view | raw | blame | history
doc/补丁原图/怪/凛冬/fire_dragon.png patch | view | raw | blame | history
doc/补丁原图/怪/凛冬/fire_dragon.psd patch | view | raw | blame | history
doc/补丁原图/怪/凛冬/harseseri.png patch | view | raw | blame | history
doc/补丁原图/怪/凛冬/harseseri.psd patch | view | raw | blame | history
doc/补丁原图/怪/凛冬/hisma_baby.png patch | view | raw | blame | history
doc/补丁原图/怪/凛冬/hisma_baby.psd patch | view | raw | blame | history
doc/补丁原图/怪/凛冬/loose_ser.png patch | view | raw | blame | history
doc/补丁原图/怪/凛冬/loose_ser.psd patch | view | raw | blame | history
doc/补丁原图/怪/凛冬/looseseri.png patch | view | raw | blame | history
doc/补丁原图/怪/凛冬/looseseri.psd patch | view | raw | blame | history
doc/补丁原图/怪/凛冬/scasa_baay.png patch | view | raw | blame | history
doc/补丁原图/怪/凛冬/scasa_baay.psd patch | view | raw | blame | history
doc/补丁原图/怪/凛冬/scasababy.png patch | view | raw | blame | history
doc/补丁原图/怪/凛冬/scasababy.psd patch | view | raw | blame | history
doc/补丁原图/怪/凛冬/scasaegg_stay.png patch | view | raw | blame | history
doc/补丁原图/怪/凛冬/scasaegg_stay.psd patch | view | raw | blame | history
doc/补丁原图/怪/凛冬/selion.png patch | view | raw | blame | history
doc/补丁原图/怪/凛冬/selion.psd patch | view | raw | blame | history
doc/补丁原图/怪/凛冬/serimalion.png patch | view | raw | blame | history
doc/补丁原图/怪/凛冬/serimalion.psd patch | view | raw | blame | history
doc/补丁原图/怪/凛冬/shelder.png patch | view | raw | blame | history
doc/补丁原图/怪/凛冬/shelder.psd patch | view | raw | blame | history
doc/补丁原图/怪/凛冬/spirazzi_baby.png patch | view | raw | blame | history
doc/补丁原图/怪/凛冬/spirazzi_baby.psd patch | view | raw | blame | history
doc/补丁原图/怪/凛冬/spirazzi_baby_dead.png patch | view | raw | blame | history
doc/补丁原图/怪/凛冬/spirazzi_baby_dead.psd patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/(tn)ghoulheadless.png patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/(tn)ghoulheadless.psd patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/(tn)ghoulheadless_dead.png patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/(tn)ghoulheadless_dead.psd patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/(tn)zzjo.png patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/(tn)zzjo.psd patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/(tn)zzjo_dead.png patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/(tn)zzjo_dead.psd patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/7shards_giselle.png patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/7shards_giselle.psd patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/7shards_giselle_dead.png patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/7shards_giselle_dead.psd patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/axeoutlaw.png patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/axeoutlaw.psd patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/axeoutlaw_dead.png patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/axeoutlaw_dead.psd patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/biker.png patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/biker.psd patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/biker_dead.png patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/biker_dead.psd patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/cartelvolunteer.png patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/cartelvolunteer.psd patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/cartelvolunteer_dead.png patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/cartelvolunteer_dead.psd patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/death_squad.png patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/death_squad.psd patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/death_squad_dead.png patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/death_squad_dead.psd patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/enjo.png patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/enjo.psd patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/enjo_dead.png patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/enjo_dead.psd patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/enjo_robot.png patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/enjo_robot.psd patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/enjo_robot_dead.png patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/enjo_robot_dead.psd patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/fatoutlaw.png patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/fatoutlaw.psd patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/fatoutlaw_dead.png patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/fatoutlaw_dead.psd patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/gunman.png patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/gunman.psd patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/gunman_dead.png patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/gunman_dead.psd patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/hass.png patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/hass.psd patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/hass_dead.png patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/hass_dead.psd patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/humanhunter.png patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/humanhunter.psd patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/humanhunter_dead.png patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/humanhunter_dead.psd patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/irigare.png patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/irigare.psd patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/irigare_dead.png patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/irigare_dead.psd patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/mechanicgiselle.png patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/mechanicgiselle.psd patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/mechanicgiselle_dead.png patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/mechanicgiselle_dead.psd patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/outlaw.png patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/outlaw.psd patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/outlaw_dead.png patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/outlaw_dead.psd patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/peyo.png patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/peyo.psd patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/peyo_dead.png patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/peyo_dead.psd patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/poena.png patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/poena.psd patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/poena_dead.png patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/poena_dead.psd patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/stick.png patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/stick.psd patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/stick_dead.png patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/stick_dead.psd patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/tretri.png patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/tretri.psd patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/tretri_dead.png patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/tretri_dead.psd patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/verrict.png patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/verrict.psd patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/verrict_dead.png patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/verrict_dead.psd patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/zzjo.png patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/zzjo.psd patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/zzjo_dead.png patch | view | raw | blame | history
doc/补丁原图/怪/卡勒特之初/zzjo_dead.psd patch | view | raw | blame | history
doc/补丁原图/数/0.png patch | view | raw | blame | history
doc/补丁原图/数/Number1.psd patch | view | raw | blame | history
doc/补丁原图/门/timegate_left01.png patch | view | raw | blame | history
doc/补丁原图/门/timegate_left01.psd patch | view | raw | blame | history
doc/补丁原图/门/timegate_right01.png patch | view | raw | blame | history
doc/补丁原图/门/timegate_right01.psd patch | view | raw | blame | history
doc/补丁原图/门/门上的定位点说明.txt 5 ●●●●● patch | view | raw | blame | history
src/RichCreator.Editor/MainWindow.xaml 6 ●●●● patch | view | raw | blame | history
src/RichCreator.Editor/MainWindow.xaml.cs 26 ●●●● patch | view | raw | blame | history
src/RichCreator.Editor/Tools/MapEditor.xaml 18 ●●●●● patch | view | raw | blame | history
src/RichCreator.Editor/Tools/MapEditor.xaml.cs 670 ●●●● patch | view | raw | blame | history
src/RichCreator.Utility/CV/DnfCVHelper.cs 349 ●●●●● patch | view | raw | blame | history
src/RichCreator.Utility/CV/KaleteCVHelper.cs 68 ●●●●● patch | view | raw | blame | history
src/RichCreator.Utility/CV/LindongCVHelper.cs 123 ●●●●● patch | view | raw | blame | history
src/RichCreator.Utility/Dnf/MoveIntent.cs 21 ●●●●● patch | view | raw | blame | history
src/RichCreator.Utility/Dnf/MoveMethod.cs 20 ●●●●● patch | view | raw | blame | history
src/RichCreator.Utility/Dnf/SpeedProvider.cs 118 ●●●●● patch | view | raw | blame | history
src/RichCreator.Utility/Maps/FindPathInfo.cs 222 ●●●●● patch | view | raw | blame | history
src/RichCreator.Utility/Maps/HouseInfo.cs 393 ●●●●● patch | view | raw | blame | history
src/RichCreator.Utility/Maps/HousePathInfo.cs 550 ●●●●● patch | view | raw | blame | history
src/RichCreator.Utility/Maps/MapType.cs 20 ●●●●● patch | view | raw | blame | history
src/RichCreator.Utility/Maps/MovePriority.cs 19 ●●●●● patch | view | raw | blame | history
src/RichCreator.Utility/PathFinding/DNFPathFinding.cs 200 ●●●● patch | view | raw | blame | history
src/RichCreator.Utility/PathFinding/Dijkstra.cs 46 ●●●● patch | view | raw | blame | history
src/RichCreator.Utility/RichCreator.Utility.csproj 17 ●●●● patch | view | raw | blame | history
src/RichCreator.Utility/Skills/SkillInfo.cs 110 ●●●●● patch | view | raw | blame | history
src/RichCreator.Utility/Skills/SkillQueue.cs 157 ●●●●● patch | view | raw | blame | history
src/RichCreator.Utility/Structs/FindPathInfo.cs 222 ●●●●● patch | view | raw | blame | history
src/RichCreator.Utility/Structs/HousePathInfo.cs 381 ●●●●● patch | view | raw | blame | history
src/RichCreator.Utility/Structs/HousePathInfoObj.cs 63 ●●●● patch | view | raw | blame | history
src/RichCreator.Utility/Structs/ParametersPoint.cs 12 ●●●●● patch | view | raw | blame | history
src/RichCreator.Utility/Structs/ZTPoint.cs 5 ●●●●● patch | view | raw | blame | history
src/RichCreator.Utility/Structs/ZTTargetPolygon.cs 40 ●●●●● patch | view | raw | blame | history
src/RichCreator.Utility/Structs/ZTTargetPolygonObj.cs 49 ●●●●● patch | view | raw | blame | history
src/RichCreator.Utility/Utilitys/RandomUtils.cs 2 ●●●●● patch | view | raw | blame | history
src/RichCreator.Utility/Utilitys/SystemHotKey.cs 78 ●●●●● patch | view | raw | blame | history
src/RichCreator.Utility/ZTResult.cs 18 ●●●●● patch | view | raw | blame | history
src/RichCreator/Dnf/DnfRole.cs 638 ●●●●● patch | view | raw | blame | history
src/RichCreator/Dnf/IMiniMap.cs 90 ●●●●● patch | view | raw | blame | history
src/RichCreator/Dnf/MapInfo.cs 72 ●●●●● patch | view | raw | blame | history
src/RichCreator/Jobs/DNFJob.cs 75 ●●●● patch | view | raw | blame | history
src/RichCreator/Jobs/JobBase.cs 3 ●●●● patch | view | raw | blame | history
src/RichCreator/Jobs/JobMonitor.cs 27 ●●●● patch | view | raw | blame | history
src/RichCreator/Jobs/WeGameJob.cs 2 ●●● patch | view | raw | blame | history
src/RichCreator/MainWindow.xaml 11 ●●●● patch | view | raw | blame | history
src/RichCreator/MainWindow.xaml.cs 240 ●●●●● patch | view | raw | blame | history
src/RichCreator/Maps/HouseInfo.cs 54 ●●●●● patch | view | raw | blame | history
src/RichCreator/Maps/Kalete/KaleteMap.cs 616 ●●●●● patch | view | raw | blame | history
src/RichCreator/Maps/Kalete/KaleteMiniMap.cs 67 ●●●●● patch | view | raw | blame | history
src/RichCreator/Maps/Kalete/OutOfBounds.cs 87 ●●●●● patch | view | raw | blame | history
src/RichCreator/Maps/Lindong/LindongMap.cs 392 ●●●● patch | view | raw | blame | history
src/RichCreator/Maps/Lindong/LindongMiniMap.cs 64 ●●●●● patch | view | raw | blame | history
src/RichCreator/Maps/Lindong/OutOfBounds.cs 5 ●●●●● patch | view | raw | blame | history
src/RichCreator/Maps/Lindong/SingleEntryHouseSkill.cs 117 ●●●●● patch | view | raw | blame | history
src/RichCreator/Maps/MapInfo.cs 37 ●●●●● patch | view | raw | blame | history
src/RichCreator/Maps/SkillSetting/SkillSettingMap.cs 672 ●●●●● patch | view | raw | blame | history
src/RichCreator/Maps/Skills/SkillMap.cs 675 ●●●●● patch | view | raw | blame | history
src/RichCreator/Maps/Test/TestMap.cs 42 ●●●● patch | view | raw | blame | history
src/RichCreator/PathFinding/Dijkstra.cs 173 ●●●●● patch | view | raw | blame | history
src/RichCreator/PathFinding/Edge.cs 28 ●●●●● patch | view | raw | blame | history
src/RichCreator/PathFinding/Node.cs 47 ●●●●● patch | view | raw | blame | history
src/RichCreator/RichCreator.csproj 24 ●●●●● patch | view | raw | blame | history
src/RichCreator/StateMachines/ChannelStateMachine.cs 1 ●●●● patch | view | raw | blame | history
src/RichCreator/StateMachines/KillMonsterStateMachine.cs 229 ●●●● patch | view | raw | blame | history
src/RichCreator/StateMachines/MoveState.cs 768 ●●●●● patch | view | raw | blame | history
src/RichCreator/StateMachines/SkillInfo.cs 108 ●●●●● patch | view | raw | blame | history
src/RichCreator/StateMachines/SkillQueue.cs 157 ●●●●● patch | view | raw | blame | history
src/RichCreator/Utilitys/AttackRectangle.cs 11 ●●●● patch | view | raw | blame | history
src/RichCreator/ZTResult.cs 18 ●●●●● patch | view | raw | blame | history
src/test/Program.cs 57 ●●●● patch | view | raw | blame | history
src/test/packages.config 1 ●●●● patch | view | raw | blame | history
src/test/test.csproj 11 ●●●●● patch | view | raw | blame | history
doc/PosImages/a/001838a9-44d4-429c-87b0-acbbdb50a9f1.jpg
Binary files differ
doc/PosImages/a/00810715-1616-42bf-a895-397c310f5048.jpg
Binary files differ
doc/PosImages/a/008867b8-08f7-4c34-b4e1-770ed1010d21.jpg
Binary files differ
doc/PosImages/a/012cdaa0-e70c-44cf-b6bf-457e2a955403.jpg
Binary files differ
doc/PosImages/a/029008b3-bf99-4a2e-bd74-d13de9936959.jpg
Binary files differ
doc/PosImages/a/038d4596-f8d9-4492-8dee-f4cafad712bc.jpg
Binary files differ
doc/PosImages/a/04746e02-feb6-4771-96eb-479d7eb4c817.jpg
Binary files differ
doc/PosImages/a/049f6918-b0a1-45e6-a024-455fd83190a9.jpg
Binary files differ
doc/PosImages/a/04d00170-b8e6-407d-ab96-a99422bac926.jpg
Binary files differ
doc/PosImages/a/04e2a451-9f79-40bc-bc44-104821f8980a.jpg
Binary files differ
doc/PosImages/a/0502fa4a-1f14-4cdd-9742-db1618354123.jpg
Binary files differ
doc/PosImages/a/05430a99-25ab-4fdc-af2c-cc4a8795022e.jpg
Binary files differ
doc/PosImages/a/05cf8263-5406-4785-9e12-f5d6c2504624.jpg
Binary files differ
doc/PosImages/a/0789cccc-73ea-4520-8eb5-3ca4928a4df9.jpg
Binary files differ
doc/PosImages/a/07d112eb-6139-48bf-b59e-fdcba3b7152f.jpg
Binary files differ
doc/PosImages/a/07dd31cf-15ab-452c-9962-bec66e2749b0.jpg
Binary files differ
doc/PosImages/a/087b71c2-ba35-4f55-844b-55ac61fd5f2c.jpg
Binary files differ
doc/PosImages/a/09224e49-81bf-4d04-9e4a-4bb6a6a1c00c.jpg
Binary files differ
doc/PosImages/a/092d9991-de17-43c8-99b5-c0c346e31394.jpg
Binary files differ
doc/PosImages/a/094f8ab7-413e-4697-883e-e64915d21b50.jpg
Binary files differ
doc/PosImages/a/097221a6-8cf1-44bb-a6a2-542d2a40ab65.jpg
Binary files differ
doc/PosImages/a/0a344a91-5edc-4d86-83e8-056adc888c50.jpg
Binary files differ
doc/PosImages/a/0a5a5580-dc1c-4e64-b795-ed5e88a5584d.jpg
Binary files differ
doc/PosImages/a/0a74b5e9-6636-4553-b12e-99feaa72405e.jpg
Binary files differ
doc/PosImages/a/0a867efe-63b3-4c6c-8400-633fcb20deed.jpg
Binary files differ
doc/PosImages/a/0bcd88b4-a39a-43a3-baa8-c01c0fc1e111.jpg
Binary files differ
doc/PosImages/a/0d023a73-1ab5-45e7-8542-3afe97e738c7.jpg
Binary files differ
doc/PosImages/a/0d8ba12e-57a9-44de-b2b4-1f2991ebac0e.jpg
Binary files differ
doc/PosImages/a/0dc87f91-b0f5-4ea0-9885-24c06ee7ceaf.jpg
Binary files differ
doc/PosImages/a/0de56ec8-2737-4d6e-bbc3-42cb18d71203.jpg
Binary files differ
doc/PosImages/a/0e7f30a1-bfd3-4d1c-aeca-241c1c96488f.jpg
Binary files differ
doc/PosImages/a/101a17f4-ad9e-4dad-bbcc-ead0075abd52.jpg
Binary files differ
doc/PosImages/a/117ab5f2-3ce0-4177-8770-ebda4c03afd8.jpg
Binary files differ
doc/PosImages/a/1181f28f-b458-42e2-bd1f-0d8790e070b9.jpg
Binary files differ
doc/PosImages/a/135de44c-512b-404e-96af-30d9fa34d3dd.jpg
Binary files differ
doc/PosImages/a/1393f222-93eb-49a1-b642-1b1edddcc282.jpg
Binary files differ
doc/PosImages/a/14493755-df26-4c2e-b636-6e862e5e6664.jpg
Binary files differ
doc/PosImages/a/15513395-3ff8-486c-a0db-8c675d8f24d0.jpg
Binary files differ
doc/PosImages/a/156dcfa4-47e7-4512-82a2-d53069a2b4fd.jpg
Binary files differ
doc/PosImages/a/158750da-f6e8-435c-8fef-0aff7cd97901.jpg
Binary files differ
doc/PosImages/a/15993aef-e0cc-4856-91f7-63a8f180b0da.jpg
Binary files differ
doc/PosImages/a/16237c2d-0122-4b0c-8e58-453fe94ca38f.jpg
Binary files differ
doc/PosImages/a/16912443-7267-4e0f-ac52-f75b86656b46.jpg
Binary files differ
doc/PosImages/a/169169aa-2716-4a27-b605-0579975fd010.jpg
Binary files differ
doc/PosImages/a/16cfcb4e-c71a-4eef-9198-825412711125.jpg
Binary files differ
doc/PosImages/a/16f5bee0-2b53-4607-88d1-129c879e94fd.jpg
Binary files differ
doc/PosImages/a/16fbea96-94c0-4080-95ee-61ad8305df52.jpg
Binary files differ
doc/PosImages/a/180647f4-5283-480b-b500-e988fb98254b.jpg
Binary files differ
doc/PosImages/a/1865de8c-04f9-4c3d-a73c-e10e674d5f0a.jpg
Binary files differ
doc/PosImages/a/18785531-fc73-4aee-a10f-ed4f8c434209.jpg
Binary files differ
doc/PosImages/a/18a0d81d-ad68-4a90-8f11-cc5a83c10925.jpg
Binary files differ
doc/PosImages/a/1a3ca9eb-9c9d-487c-be8d-9019f65102c9.jpg
Binary files differ
doc/PosImages/a/1a753464-877a-4b10-a772-500f128b9b7a.jpg
Binary files differ
doc/PosImages/a/1b0c5cc0-b541-4f7f-a478-bf33f1dea59e.jpg
Binary files differ
doc/PosImages/a/1b543d00-38c0-43f8-b6b0-a569692d7b18.jpg
Binary files differ
doc/PosImages/a/1caeda2d-b1b5-4862-a4e0-b4a99f4c0a66.jpg
Binary files differ
doc/PosImages/a/1dc482c9-2f78-480d-b8ab-0d03079d8c09.jpg
Binary files differ
doc/PosImages/a/1e80c40f-a686-4981-95c5-5089dad62cd3.jpg
Binary files differ
doc/PosImages/a/1e924d02-7891-4064-aed9-de4d448276bc.jpg
Binary files differ
doc/PosImages/a/2124ef77-a65f-4123-8828-ec69376bd023.jpg
Binary files differ
doc/PosImages/a/216dc6ce-c33f-4c83-a5dd-59fe9e669403.jpg
Binary files differ
doc/PosImages/a/2175bb93-39e6-4544-a2ec-ea40bd8eb20b.jpg
Binary files differ
doc/PosImages/a/22ae001c-f179-4bdb-afd4-2040dfb85851.jpg
Binary files differ
doc/PosImages/a/2358792c-0603-4e27-a4e5-6f062270650c.jpg
Binary files differ
doc/PosImages/a/23cacb1e-cd6d-4520-979a-90555d80029e.jpg
Binary files differ
doc/PosImages/a/25bb7754-bf08-4349-a2a0-dbf0dd15f3f4.jpg
Binary files differ
doc/PosImages/a/262e8bb6-af0f-4f35-b16a-7b521ab5578d.jpg
Binary files differ
doc/PosImages/a/2668f54e-e3ce-46db-94e8-cd98bd3006c2.jpg
Binary files differ
doc/PosImages/a/26eba38b-80ec-47ae-b73e-9bbffb4a0280.jpg
Binary files differ
doc/PosImages/a/28518ac1-fda3-461f-a962-522ed1159233.jpg
Binary files differ
doc/PosImages/a/2861b156-44ed-452c-8213-5af890f2e3bb.jpg
Binary files differ
doc/PosImages/a/2995ead0-ff8f-4f86-bd60-69f8eeeb9656.jpg
Binary files differ
doc/PosImages/a/2c43a52f-2786-4c4f-9ba1-417940015c24.jpg
Binary files differ
doc/PosImages/a/2d569395-d3d1-46fb-ae35-960b9b5a1690.jpg
Binary files differ
doc/PosImages/a/2e1dde50-81ca-4a1c-8741-35b94c957d19.jpg
Binary files differ
doc/PosImages/a/2e7c2e99-9a83-44bc-b193-e344d8a01d3f.jpg
Binary files differ
doc/PosImages/a/2f58d94e-c684-4eea-9a45-2092e094e31e.jpg
Binary files differ
doc/PosImages/a/2fefd9fb-1794-43c2-9450-c160b7f0bd54.jpg
Binary files differ
doc/PosImages/a/314722f2-8cc7-4daa-bc8c-91b92f4f788d.jpg
Binary files differ
doc/PosImages/a/3234795c-15d4-459d-baaf-530b36e629f5.jpg
Binary files differ
doc/PosImages/a/32b15889-5fa2-42e2-bb7d-f042065ac11a.jpg
Binary files differ
doc/PosImages/a/32c56a41-74b5-4ed6-88e3-7f2c89fccfa6.jpg
Binary files differ
doc/PosImages/a/32c66cd9-2759-452c-bee2-57ebce1092c7.jpg
Binary files differ
doc/PosImages/a/33e0aa4b-a766-497a-b83d-97a582df46e5.jpg
Binary files differ
doc/PosImages/a/379f0346-93cf-4e9f-b4cc-b0e0f1747940.jpg
Binary files differ
doc/PosImages/a/38d7c8e3-8d3f-4a47-a08f-ad725c2ae22a.jpg
Binary files differ
doc/PosImages/a/39de151e-247e-49c9-b130-e46a55596218.jpg
Binary files differ
doc/PosImages/a/39e68825-2377-4fd3-b79d-0b4d9a38a126.jpg
Binary files differ
doc/PosImages/a/3adebe80-0d84-4f77-94db-682b7dad3237.jpg
Binary files differ
doc/PosImages/a/3bb49b0d-838e-4155-8645-9e04ffbd2d53.jpg
Binary files differ
doc/PosImages/a/3bdf0cdc-662c-4250-a348-36bbe46ef922.jpg
Binary files differ
doc/PosImages/a/3c4f88db-6eae-4df5-8435-e183ed707122.jpg
Binary files differ
doc/PosImages/a/3cedff15-bd2b-44db-a94b-f7de4badc1d3.jpg
Binary files differ
doc/PosImages/a/3d41d91d-10a9-4687-85ea-0fc11e1a4cfd.jpg
Binary files differ
doc/PosImages/a/3d81a7be-7089-4d99-8733-16fdc22b4c11.jpg
Binary files differ
doc/PosImages/a/3e0a0f57-5189-48ee-9246-bb237ba4da82.jpg
Binary files differ
doc/PosImages/a/3eb922e4-ef11-4df3-9eb5-edd9c2be26d6.jpg
Binary files differ
doc/PosImages/a/3f1aaff9-7033-4e95-8034-1f11b1f83085.jpg
Binary files differ
doc/PosImages/a/3f7a14f0-a89c-4997-af65-9b688d3ec520.jpg
Binary files differ
doc/PosImages/a/3ff24f64-816d-4ca1-b614-c5e9781ed8ef.jpg
Binary files differ
doc/PosImages/a/4003cc69-4c42-4cad-a8a3-0d04884eb96c.jpg
Binary files differ
doc/PosImages/a/4025024e-bc16-4ae4-8b00-78df02db0da7.jpg
Binary files differ
doc/PosImages/a/4057df3e-f9c7-499d-8e97-6b2026428b53.jpg
Binary files differ
doc/PosImages/a/40f42840-8e22-4e4a-80b3-49d9b067e6e2.jpg
Binary files differ
doc/PosImages/a/41097ef6-6f0e-4ac5-a68d-f732f614caa7.jpg
Binary files differ
doc/PosImages/a/41241068-24bd-4f3b-a795-13fe336c6e78.jpg
Binary files differ
doc/PosImages/a/422f2780-660c-4c7a-a35a-95aa6d37b5d1.jpg
Binary files differ
doc/PosImages/a/42a6437b-db66-40b2-92e9-0cc998d35609.jpg
Binary files differ
doc/PosImages/a/438e5b35-526e-40f9-ac6f-86c81e0815e8.jpg
Binary files differ
doc/PosImages/a/43e82cd0-c709-4783-bb36-4ca04082af0f.jpg
Binary files differ
doc/PosImages/a/44f681a2-482d-4e80-a94a-61fea5bd90a8.jpg
Binary files differ
doc/PosImages/a/45b9c106-fa92-4631-8775-266c9c2a522c.jpg
Binary files differ
doc/PosImages/a/47b6cb38-12dd-49d0-b0a5-d5f623b753fc.jpg
Binary files differ
doc/PosImages/a/47ff06c0-5cc0-46a6-851a-462e3cb7d8bb.jpg
Binary files differ
doc/PosImages/a/48e70dc1-3494-4a9d-ab01-08455cbd116d.jpg
Binary files differ
doc/PosImages/a/495580d1-6a45-4d94-b660-f76cc143bffa.jpg
Binary files differ
doc/PosImages/a/49bc74ee-6568-4286-8f65-8138b21149ba.jpg
Binary files differ
doc/PosImages/a/49d87149-db3e-4f92-9ae9-582b5d1d0af0.jpg
Binary files differ
doc/PosImages/a/49e717d9-fc0f-4e4a-9311-f8e24271163a.jpg
Binary files differ
doc/PosImages/a/4abcf160-b8b2-4ea9-80a1-2f02f33d3276.jpg
Binary files differ
doc/PosImages/a/4b25a672-69f5-4082-aca2-298c29f37eaa.jpg
Binary files differ
doc/PosImages/a/4c8bcd46-f896-4086-acd5-24c896fb3a6f.jpg
Binary files differ
doc/PosImages/a/4d87fe76-8708-45f3-916d-c32896849a5b.jpg
Binary files differ
doc/PosImages/a/4f5a7440-d98c-4c9b-aecb-2ba38b6b1aec.jpg
Binary files differ
doc/PosImages/a/4fd3f17f-a86c-4669-9d38-c6b7da5973ef.jpg
Binary files differ
doc/PosImages/a/4ff401d3-8bdb-4bb5-baa1-d7f44697274c.jpg
Binary files differ
doc/PosImages/a/5017d24d-823f-43bb-8faa-5c673585f0f4.jpg
Binary files differ
doc/PosImages/a/507c56ee-8e3d-400f-bde0-7f032077fda5.jpg
Binary files differ
doc/PosImages/a/51336d81-7f05-4f11-ab85-52bb6a511ec6.jpg
Binary files differ
doc/PosImages/a/51a0f874-9995-40c6-bed7-86c735930c22.jpg
Binary files differ
doc/PosImages/a/5236c0cb-d71d-445a-9edd-5f7e01dc6f09.jpg
Binary files differ
doc/PosImages/a/53217955-5a7f-4f96-a9fc-4174ae596151.jpg
Binary files differ
doc/PosImages/a/53b99b17-8376-44cf-be68-6e1d951f1f27.jpg
Binary files differ
doc/PosImages/a/53dc6d9e-51b0-452f-8933-0ae4dd45efcc.jpg
Binary files differ
doc/PosImages/a/546867f0-0bbe-44ec-a66e-ce8bcaf98ae5.jpg
Binary files differ
doc/PosImages/a/54f080de-a97f-4581-be1e-6fc0f2bc2f94.jpg
Binary files differ
doc/PosImages/a/55b000dc-1b55-4eb8-97c6-9b8fa17815ec.jpg
Binary files differ
doc/PosImages/a/57b7020a-b49f-4549-b9cb-ad1a94f276eb.jpg
Binary files differ
doc/PosImages/a/57bd6de8-c83f-455d-a48c-dfe7056ac13d.jpg
Binary files differ
doc/PosImages/a/58e3385c-8f5b-4717-871d-9a961957900f.jpg
Binary files differ
doc/PosImages/a/58f7137e-6754-45f2-8181-83a7d38c1879.jpg
Binary files differ
doc/PosImages/a/59dd3a27-ee5b-4f87-91e7-6b91db15cb27.jpg
Binary files differ
doc/PosImages/a/5bb48ab0-86c4-44fb-a75b-67ef2062ddc4.jpg
Binary files differ
doc/PosImages/a/5c3fc71a-1e3c-49d4-888b-4994b41abb3e.jpg
Binary files differ
doc/PosImages/a/5c7d0352-62a8-4bec-9c40-b9159a348ba2.jpg
Binary files differ
doc/PosImages/a/5caf1745-076b-49ff-865b-fc810f377fff.jpg
Binary files differ
doc/PosImages/a/5d55c856-dd7b-489e-a4cf-44b7ce224463.jpg
Binary files differ
doc/PosImages/a/5e5ce7c5-6ba0-4c2d-9540-9fbc502df819.jpg
Binary files differ
doc/PosImages/a/5f1b011a-2430-41bc-bce5-fed0bee02fa3.jpg
Binary files differ
doc/PosImages/a/5f3af8b4-fa9a-49c5-900f-3d5bcc769dc9.jpg
Binary files differ
doc/PosImages/a/5f75c543-f2f5-4edc-954e-0b6f0b959dbc.jpg
Binary files differ
doc/PosImages/a/5f92f47b-4b91-4182-8ffc-046429ae2240.jpg
Binary files differ
doc/PosImages/a/5fcf35e5-8c8d-40eb-96ed-2633a086f109.jpg
Binary files differ
doc/PosImages/a/5fdd9bb5-4ced-43a9-9641-37185575fd26.jpg
Binary files differ
doc/PosImages/a/608786f2-f43c-4eb4-8a52-b1f5466d4b80.jpg
Binary files differ
doc/PosImages/a/60927d4f-265f-4d51-9c12-493f36f39231.jpg
Binary files differ
doc/PosImages/a/61b62861-55d4-47dd-b0eb-023f4765b0c0.jpg
Binary files differ
doc/PosImages/a/62be6cff-617c-45d1-b192-b3c9c047cbbd.jpg
Binary files differ
doc/PosImages/a/63c9066f-15fd-482b-8ef8-bb9305d2355a.jpg
Binary files differ
doc/PosImages/a/63cb628a-6dd5-4bb6-b6e1-f8978733a4fc.jpg
Binary files differ
doc/PosImages/a/64d42d35-9612-4d98-975b-8be767172502.jpg
Binary files differ
doc/PosImages/a/64ed2d26-e859-4be7-93c9-caafe28b14ef.jpg
Binary files differ
doc/PosImages/a/6645d7f2-629e-4695-90ae-3e6d15f565d5.jpg
Binary files differ
doc/PosImages/a/66c3388f-0714-4237-a6c9-2a8d0fa7cd27.jpg
Binary files differ
doc/PosImages/a/69a18a76-7242-4c19-a49e-7277f6155247.jpg
Binary files differ
doc/PosImages/a/6a087e15-11d4-4c53-8668-fce04e157b57.jpg
Binary files differ
doc/PosImages/a/6ac43a08-40ed-49bb-9345-d40752696f01.jpg
Binary files differ
doc/PosImages/a/6c32cc83-6e84-42c4-852f-9adab612451c.jpg
Binary files differ
doc/PosImages/a/6c67d8f5-84e9-4210-a16d-e9788e908f08.jpg
Binary files differ
doc/PosImages/a/6e2fc0db-4b2a-4a91-9584-79eea6e1ea89.jpg
Binary files differ
doc/PosImages/a/6fddc7e2-6161-4eeb-8a7b-6f75e2c5e12b.jpg
Binary files differ
doc/PosImages/a/72efc11a-4dcf-414c-8a13-7dc9af35e271.jpg
Binary files differ
doc/PosImages/a/735b031f-4faa-48db-9ec2-090bf6db8fbd.jpg
Binary files differ
doc/PosImages/a/73a8c671-77fb-41ba-a405-f3c2c973a7f1.jpg
Binary files differ
doc/PosImages/a/73d2476b-e741-4888-8560-8a09cd6d0f75.jpg
Binary files differ
doc/PosImages/a/73e7d831-6952-40a4-a18a-dbac03ff55fc.jpg
Binary files differ
doc/PosImages/a/77085a85-8e45-47ab-bb5a-46c6045f1dad.jpg
Binary files differ
doc/PosImages/a/771266f4-e941-446d-8db4-d73abaa2ff00.jpg
Binary files differ
doc/PosImages/a/773c34f3-aae6-4e57-afe7-d9545d607094.jpg
Binary files differ
doc/PosImages/a/77b1f3e5-e501-4f28-b19f-d6eed2f7871e.jpg
Binary files differ
doc/PosImages/a/77c5db4d-3899-42c4-8a8c-8fa4f3446653.jpg
Binary files differ
doc/PosImages/a/782d67a0-1195-4f98-838e-2a31ca9152d6.jpg
Binary files differ
doc/PosImages/a/786bb4bd-6c46-4249-a9d0-40b191a62647.jpg
Binary files differ
doc/PosImages/a/790973a9-5438-4c12-be09-a6cebe807575.jpg
Binary files differ
doc/PosImages/a/797f30dc-c6e4-4f82-ab71-da03f200d70b.jpg
Binary files differ
doc/PosImages/a/7a01f43d-7941-4c00-8731-4b24a06fb0d1.jpg
Binary files differ
doc/PosImages/a/7a102d17-5413-4448-bf9b-41c6a7180027.jpg
Binary files differ
doc/PosImages/a/7a61964e-d86c-4623-98ec-e4e0ab14889b.jpg
Binary files differ
doc/PosImages/a/7ae7a0b7-1b74-465c-a16a-80a39080816d.jpg
Binary files differ
doc/PosImages/a/7b7ff76f-4f82-4bf8-a9bf-ae2e7df4dde0.jpg
Binary files differ
doc/PosImages/a/7bdd1b88-c859-4142-869c-8b05a17d6efc.jpg
Binary files differ
doc/PosImages/a/7be5749c-adc4-48bf-b9c3-c19ca065e6ed.jpg
Binary files differ
doc/PosImages/a/7c2ec387-476c-4dfb-bf15-80c0839787de.jpg
Binary files differ
doc/PosImages/a/7d2ced29-c141-4490-8a56-b85627674886.jpg
Binary files differ
doc/PosImages/a/7d32ad0d-a76a-4220-8fff-758b630b2b44.jpg
Binary files differ
doc/PosImages/a/7e2fe464-895f-48a2-95f4-4e12e1b3e106.jpg
Binary files differ
doc/PosImages/a/7e432802-7c2a-4e8f-9222-38b46ce16ce9.jpg
Binary files differ
doc/PosImages/a/7ed3903f-e371-4fb5-b595-897299c598d5.jpg
Binary files differ
doc/PosImages/a/7f68b63e-f8cd-4648-9a00-7d5db1f46aba.jpg
Binary files differ
doc/PosImages/a/7fdcf76e-f67e-482f-9326-1da08a70205f.jpg
Binary files differ
doc/PosImages/a/8044b0bf-d6eb-4af7-bc03-83594d091726.jpg
Binary files differ
doc/PosImages/a/80726a58-39ad-4d2f-8134-8abd368345dc.jpg
Binary files differ
doc/PosImages/a/80de72a0-4eea-4e50-837a-fed209e4d55e.jpg
Binary files differ
doc/PosImages/a/812c30d8-a3a4-4886-bb54-b8d3e147fed7.jpg
Binary files differ
doc/PosImages/a/81df7fd7-a8a1-4ca2-94b0-47e2ee25b1cd.jpg
Binary files differ
doc/PosImages/a/82b31439-47eb-41ee-a167-74773e097aca.jpg
Binary files differ
doc/PosImages/a/84ad2d05-bdc9-4376-9ada-a6e81af74c10.jpg
Binary files differ
doc/PosImages/a/8501df93-24b3-4996-ad3d-c38a023c10ce.jpg
Binary files differ
doc/PosImages/a/85086a60-2493-4e4c-8e58-057bbd8ceb6b.jpg
Binary files differ
doc/PosImages/a/855e9a1d-8ab6-458f-9eda-5ef4f2f82f4c.jpg
Binary files differ
doc/PosImages/a/856fcb5e-90f1-4938-aad5-df24b1946a5f.jpg
Binary files differ
doc/PosImages/a/85dea783-4959-4cf4-922e-3ba0b9c78742.jpg
Binary files differ
doc/PosImages/a/8658bf92-e1ef-4005-8bba-121754e3afcd.jpg
Binary files differ
doc/PosImages/a/866ace0a-9a1b-490c-b3bd-7252b137f95e.jpg
Binary files differ
doc/PosImages/a/868ecbe3-b3c0-474b-99f6-03b1750509aa.jpg
Binary files differ
doc/PosImages/a/88102d83-933e-4277-9b1e-709c0ad3a8a8.jpg
Binary files differ
doc/PosImages/a/883a980c-eaa4-43e5-ad5d-c1ea23d75d29.jpg
Binary files differ
doc/PosImages/a/88a5a73b-6498-4d55-b202-aa9b8be8b62a.jpg
Binary files differ
doc/PosImages/a/894d42cd-89cc-494f-a696-57b17c978ea8.jpg
Binary files differ
doc/PosImages/a/8983781d-88d1-47bf-a8d5-fdde75ea13c6.jpg
Binary files differ
doc/PosImages/a/89d82b90-3575-4144-9357-6c0f22bb35d3.jpg
Binary files differ
doc/PosImages/a/8a26e6aa-315c-441d-b49b-48eecc056a3e.jpg
Binary files differ
doc/PosImages/a/8a6894b1-889e-4481-bffd-577e889f812a.jpg
Binary files differ
doc/PosImages/a/8bae0891-d97a-480e-90c0-535085207b17.jpg
Binary files differ
doc/PosImages/a/8d928453-9023-4b50-8b79-b92bc7c191d5.jpg
Binary files differ
doc/PosImages/a/8ff3edcc-850a-447c-b55f-f1aab5c07480.jpg
Binary files differ
doc/PosImages/a/90ebf33c-28b0-45b8-b674-6f6ef53f4c17.jpg
Binary files differ
doc/PosImages/a/917b2824-f665-42b5-a592-28dbbca5dfb4.jpg
Binary files differ
doc/PosImages/a/9275bbf6-4747-40ec-9615-f11baf279d42.jpg
Binary files differ
doc/PosImages/a/92ff54a3-156d-4d1a-be94-1e9e1aad9731.jpg
Binary files differ
doc/PosImages/a/938f193a-6ba4-4262-a8b8-645f3b90d50a.jpg
Binary files differ
doc/PosImages/a/93a93c1a-54d1-44d6-8c98-e0fb716e46af.jpg
Binary files differ
doc/PosImages/a/93c33584-8c92-4090-83eb-8194b329b555.jpg
Binary files differ
doc/PosImages/a/93f286fe-538d-47ae-ba0d-3e52290528e6.jpg
Binary files differ
doc/PosImages/a/95106078-bf06-439e-bf51-a9f4bc92be0e.jpg
Binary files differ
doc/PosImages/a/95653ab9-d508-4466-8b9e-448e2a985bf8.jpg
Binary files differ
doc/PosImages/a/9646efe4-5b20-4b5f-a596-99c56b43fed4.jpg
Binary files differ
doc/PosImages/a/9780c396-947f-40ea-8eec-d03259e1d89e.jpg
Binary files differ
doc/PosImages/a/98922f63-f063-4a26-8e1a-5f1a5a53a1bb.jpg
Binary files differ
doc/PosImages/a/9a84fe3d-898e-406c-9589-54376f6a9671.jpg
Binary files differ
doc/PosImages/a/9abf7163-26bd-4f3f-a1be-0e34eca4660f.jpg
Binary files differ
doc/PosImages/a/9ac0575f-a71f-4a01-be17-390460d02198.jpg
Binary files differ
doc/PosImages/a/9bd3a781-f24e-4064-bb24-51aa7169b822.jpg
Binary files differ
doc/PosImages/a/9c8e0ebe-230b-4ffa-8155-d029fb485c25.jpg
Binary files differ
doc/PosImages/a/9cbe05b6-4a05-47e0-a9f0-a2f0e8f6127b.jpg
Binary files differ
doc/PosImages/a/9d1d7480-d374-405e-9307-59c91bfd2002.jpg
Binary files differ
doc/PosImages/a/9dd7f5a8-ddf9-4d23-8c4c-b390041f8e7c.jpg
Binary files differ
doc/PosImages/a/9ee99ce5-a54b-425e-929f-73a662a94fa8.jpg
Binary files differ
doc/PosImages/a/9f7175b3-34a3-495d-9c74-4ae3d4ed15b9.jpg
Binary files differ
doc/PosImages/a/a0a969a6-22d9-40c1-8056-5d4673a2b4f9.jpg
Binary files differ
doc/PosImages/a/a19e5a86-7054-4618-adf4-621f50da1625.jpg
Binary files differ
doc/PosImages/a/a1fefa63-83a2-4ff0-b188-28e61aada9e5.jpg
Binary files differ
doc/PosImages/a/a276de5e-41e3-470d-969c-7f295c3d77eb.jpg
Binary files differ
doc/PosImages/a/a2c149c1-7485-4bd7-98ed-f5fc48f98ae9.jpg
Binary files differ
doc/PosImages/a/a2d6b6ac-adf1-4ef0-8fd5-671965b3030e.jpg
Binary files differ
doc/PosImages/a/a2fe93c2-b659-4d44-b4a2-46edb6ca6ff4.jpg
Binary files differ
doc/PosImages/a/a352afb4-e24f-4086-9bd0-a40699a0ba51.jpg
Binary files differ
doc/PosImages/a/a4143d11-d660-4348-b4e9-9b4d815e3b16.jpg
Binary files differ
doc/PosImages/a/a505a8d5-6ede-4c21-8813-32ad2bcfe23e.jpg
Binary files differ
doc/PosImages/a/a5464509-565d-48b8-80aa-d93b02ee3df7.jpg
Binary files differ
doc/PosImages/a/a583bf44-89df-4d64-9429-0c937062a47b.jpg
Binary files differ
doc/PosImages/a/a63a6d7f-6da7-4509-a17d-377c1f5fe290.jpg
Binary files differ
doc/PosImages/a/a786cb53-b3ef-4972-92bf-c867ae908958.jpg
Binary files differ
doc/PosImages/a/a8740796-2872-4f19-a464-95434ca20b2f.jpg
Binary files differ
doc/PosImages/a/a8967c2e-1e6a-4230-9609-9cb2baf739a0.jpg
Binary files differ
doc/PosImages/a/a8cd9898-da0b-44d2-8a42-7373bc13375e.jpg
Binary files differ
doc/PosImages/a/a8dd2352-34fe-42d0-8fa1-fe56fbb3f970.jpg
Binary files differ
doc/PosImages/a/a9f52240-1dd2-4a08-8cc3-b11aa5d3ff81.jpg
Binary files differ
doc/PosImages/a/aa91d8ac-e594-4d00-9506-30bb8e5e5e5d.jpg
Binary files differ
doc/PosImages/a/ac2497b7-30c3-48fc-8232-3959f6a74af5.jpg
Binary files differ
doc/PosImages/a/ad29e0aa-3263-486d-ae7c-3d2a57cfa58c.jpg
Binary files differ
doc/PosImages/a/ae5c5071-0722-4cec-b7d8-453c7f5358ed.jpg
Binary files differ
doc/PosImages/a/ae8a15e7-7700-46b1-83bf-a0cad901eaf2.jpg
Binary files differ
doc/PosImages/a/b009162d-dd83-4835-88e4-f43616c2dbf5.jpg
Binary files differ
doc/PosImages/a/b0b96e2a-5d64-4ef2-b6a6-33b032282998.jpg
Binary files differ
doc/PosImages/a/b1b89945-afe1-42a9-88c5-b27e274aa4cf.jpg
Binary files differ
doc/PosImages/a/b1dbd231-0892-460f-82bd-9dc6e92708c5.jpg
Binary files differ
doc/PosImages/a/b245a829-2637-4494-b329-776ac016e752.jpg
Binary files differ
doc/PosImages/a/b28e09d4-3843-468a-b883-a354f6666623.jpg
Binary files differ
doc/PosImages/a/b328ca26-1fbb-441b-81d2-f7d47992959d.jpg
Binary files differ
doc/PosImages/a/b3abdceb-a2eb-49ef-9633-7387fca66189.jpg
Binary files differ
doc/PosImages/a/b59fb665-5127-4290-b080-1d982feca4e3.jpg
Binary files differ
doc/PosImages/a/b601eed4-88d3-42c7-aa40-e4df89a463f3.jpg
Binary files differ
doc/PosImages/a/b6333fae-2c42-4b26-a66f-70b615624a81.jpg
Binary files differ
doc/PosImages/a/b740b3db-3ea4-409c-affb-481aff2ead42.jpg
Binary files differ
doc/PosImages/a/b909b786-4b26-4892-ba04-932900adfbbb.jpg
Binary files differ
doc/PosImages/a/b99ad5d8-6696-4894-acf4-37678a35e267.jpg
Binary files differ
doc/PosImages/a/b9eadea1-2ac0-4781-9c90-128a701a82c3.jpg
Binary files differ
doc/PosImages/a/badc728d-13c1-4601-ae02-b6e9455a4aa3.jpg
Binary files differ
doc/PosImages/a/bbe1f24a-a3a5-4eea-9d76-fdaed989491f.jpg
Binary files differ
doc/PosImages/a/bc2b133b-e106-4f9d-ae82-ee4afafc9cb2.jpg
Binary files differ
doc/PosImages/a/bc348543-46a8-4f50-bc41-b0bf9ea1d3e8.jpg
Binary files differ
doc/PosImages/a/bca5f926-21ce-4660-aa79-166372c10faf.jpg
Binary files differ
doc/PosImages/a/bcd07f96-8f3e-42fc-bda3-2018c9674af9.jpg
Binary files differ
doc/PosImages/a/bd736a34-dec7-4424-a8ab-d89f90611ea8.jpg
Binary files differ
doc/PosImages/a/bf0d2e3f-e32f-4625-8ffa-8eeadc79dd26.jpg
Binary files differ
doc/PosImages/a/c08becd1-44e0-4495-9611-bcc146223989.jpg
Binary files differ
doc/PosImages/a/c152debe-d3f9-4783-8bc1-01a3d456a230.jpg
Binary files differ
doc/PosImages/a/c1f9347f-58c7-439e-92e4-6280c3ce67b7.jpg
Binary files differ
doc/PosImages/a/c2c7a459-d4aa-4cad-89d8-7be7b52b31a4.jpg
Binary files differ
doc/PosImages/a/c3452896-96af-4ef3-b11e-c91392402adb.jpg
Binary files differ
doc/PosImages/a/c34c6508-f0d0-474a-998f-7449a0d9cd1d.jpg
Binary files differ
doc/PosImages/a/c3f0db93-dc9e-4560-a9e1-c030e93bbb34.jpg
Binary files differ
doc/PosImages/a/c50b278e-2f21-4a7c-b8af-6ea254fb302a.jpg
Binary files differ
doc/PosImages/a/c5a29e1e-1311-4481-b0d0-80124ad655bf.jpg
Binary files differ
doc/PosImages/a/c605af33-b8ee-4b82-9abb-4e832da76c6c.jpg
Binary files differ
doc/PosImages/a/c7347cbb-0279-419a-83d7-d62382c11386.jpg
Binary files differ
doc/PosImages/a/c7c91305-30f5-4011-b23c-5c713b8491a8.jpg
Binary files differ
doc/PosImages/a/c7dcb6f4-9613-4e80-8793-2358285aecff.jpg
Binary files differ
doc/PosImages/a/c8456444-f2a2-41a1-9aa0-3beaef8caeeb.jpg
Binary files differ
doc/PosImages/a/c86ed233-7919-47fe-b810-524f6bf72f41.jpg
Binary files differ
doc/PosImages/a/c8882c75-27d2-4d88-b40c-b244ac758243.jpg
Binary files differ
doc/PosImages/a/c8dd2d2e-43ea-4844-ba9d-ff1d4e651003.jpg
Binary files differ
doc/PosImages/a/c95b2dc2-30a9-4507-a954-9b79d48dec26.jpg
Binary files differ
doc/PosImages/a/cc399c1e-79cb-4994-aa59-195598aeaca7.jpg
Binary files differ
doc/PosImages/a/cc7963a8-c92f-41be-b45f-8c70c002e647.jpg
Binary files differ
doc/PosImages/a/cc8977f5-0db9-49e9-b405-111472439b3b.jpg
Binary files differ
doc/PosImages/a/ccdf1eae-f5d0-44d6-b325-d086306d441a.jpg
Binary files differ
doc/PosImages/a/cce90363-d669-4580-be98-02493c6aa3f4.jpg
Binary files differ
doc/PosImages/a/cd04b55b-fac2-4a19-81bd-5a5b44d04346.jpg
Binary files differ
doc/PosImages/a/cd56967b-edb0-49b8-98db-2d0534a2d26b.jpg
Binary files differ
doc/PosImages/a/cdc682fb-9ab3-4f40-870c-01286ad392fd.jpg
Binary files differ
doc/PosImages/a/ceac7c00-4f07-43bb-a4ad-768acfc96058.jpg
Binary files differ
doc/PosImages/a/cf65ce2a-99f4-4a9a-94f6-974cb01a7c36.jpg
Binary files differ
doc/PosImages/a/cfb335c9-03b5-427e-8f2b-7acbb06a2cd2.jpg
Binary files differ
doc/PosImages/a/cfb81691-8d99-4474-8b4e-e8c805f5528d.jpg
Binary files differ
doc/PosImages/a/d025cddc-614a-4cad-abe8-773a4b464819.jpg
Binary files differ
doc/PosImages/a/d154f065-5907-4cc7-a67c-67ca1a63ea6f.jpg
Binary files differ
doc/PosImages/a/d1a07d2c-7781-4690-ba12-e36c9162fa57.jpg
Binary files differ
doc/PosImages/a/d2942235-930c-409f-b803-389dabe3a2c7.jpg
Binary files differ
doc/PosImages/a/d2fd9b78-2a33-4a76-b6bb-dd17c745404e.jpg
Binary files differ
doc/PosImages/a/d3848395-9dd5-442b-b261-4722925f9d66.jpg
Binary files differ
doc/PosImages/a/d3d54df4-fe9b-4103-bdf6-95bde38c9658.jpg
Binary files differ
doc/PosImages/a/d4116663-285d-44c8-b339-393d41bf62eb.jpg
Binary files differ
doc/PosImages/a/d4c54dc2-5316-45b4-9512-4bdb9c8d8435.jpg
Binary files differ
doc/PosImages/a/d50bdd66-55dd-4834-a028-892f50761869.jpg
Binary files differ
doc/PosImages/a/d66783d6-f04f-4a62-bb8c-5298c9de1025.jpg
Binary files differ
doc/PosImages/a/d67ce5b4-8b1f-4ac8-8a4b-9df92426e663.jpg
Binary files differ
doc/PosImages/a/d68b7d90-7569-47a4-bc53-4cf16122f512.jpg
Binary files differ
doc/PosImages/a/d6db469f-aa81-490d-8de9-1112ee9ed8d9.jpg
Binary files differ
doc/PosImages/a/d7e23839-6d4f-4b86-ab27-8b9177d08e93.jpg
Binary files differ
doc/PosImages/a/d8dee04d-7c34-45a4-abbb-7c75b56f41f3.jpg
Binary files differ
doc/PosImages/a/da879f52-f822-4875-bc38-aafa88d00dbd.jpg
Binary files differ
doc/PosImages/a/db20258d-4f3e-4710-a38b-129fc41a9e97.jpg
Binary files differ
doc/PosImages/a/db46087a-9fa9-47ad-bbef-fa6132ed8c0d.jpg
Binary files differ
doc/PosImages/a/db55deec-5146-45f2-87e1-2dee0f473a7d.jpg
Binary files differ
doc/PosImages/a/dd05f34a-fc74-4f72-9b9c-83e3226f1d3e.jpg
Binary files differ
doc/PosImages/a/dd7d8f99-d5e5-4fd2-a61d-e1364bb2f5d2.jpg
Binary files differ
doc/PosImages/a/ddab658d-3044-422c-9543-4da1e8935a87.jpg
Binary files differ
doc/PosImages/a/df9f47d6-2664-456c-8d60-365110b6f7dc.jpg
Binary files differ
doc/PosImages/a/e1734667-98f5-4deb-b4ac-ce83eac97228.jpg
Binary files differ
doc/PosImages/a/e18e26ec-d77c-47fd-8e9d-b2c1a320fd8d.jpg
Binary files differ
doc/PosImages/a/e1d53b96-616b-49a0-8133-4e6715e36354.jpg
Binary files differ
doc/PosImages/a/e21eb40e-6a08-4d98-be08-707d6ca78d96.jpg
Binary files differ
doc/PosImages/a/e239eb70-63aa-4b4b-91ca-274c4a7711ed.jpg
Binary files differ
doc/PosImages/a/e3276a92-18b0-4f0f-bbad-9ce03084712a.jpg
Binary files differ
doc/PosImages/a/e3ef6833-ff2f-4107-a7f0-1694707b09b2.jpg
Binary files differ
doc/PosImages/a/e3fea3f4-c67f-43b3-8c7f-b6d4ca89606d.jpg
Binary files differ
doc/PosImages/a/e4534395-2262-46ad-a444-33d5abb320b3.jpg
Binary files differ
doc/PosImages/a/e4c35d28-5b9e-4925-83cb-73e9f7f16764.jpg
Binary files differ
doc/PosImages/a/e58cb01b-31df-44ca-8d2f-8778e6ad81a5.jpg
Binary files differ
doc/PosImages/a/e59117a2-7aff-4a74-b663-18c306c859ab.jpg
Binary files differ
doc/PosImages/a/e5b23280-e84d-425e-8528-c7489f3afb87.jpg
Binary files differ
doc/PosImages/a/e647eb82-7ee0-488f-a086-2aa6df58c0a6.jpg
Binary files differ
doc/PosImages/a/e68dc167-08b6-4472-82b5-a5d57db55bd2.jpg
Binary files differ
doc/PosImages/a/e6bf529d-d438-4744-90f7-9f35c67baaa3.jpg
Binary files differ
doc/PosImages/a/e6ed7217-47bb-4ea9-885c-c03b73b87052.jpg
Binary files differ
doc/PosImages/a/e71f9ad3-00d3-44a8-90d2-b9de5d0c0827.jpg
Binary files differ
doc/PosImages/a/e7b6ff73-075b-4999-885d-44f28ea4cf20.jpg
Binary files differ
doc/PosImages/a/e8071253-af72-4278-8e1f-e4f662277a5c.jpg
Binary files differ
doc/PosImages/a/e86c3bbd-79ff-47bb-975a-85c427c72bd5.jpg
Binary files differ
doc/PosImages/a/e913a3fd-6b15-4e7e-a23c-3bf544a60c78.jpg
Binary files differ
doc/PosImages/a/ecaa489d-48cf-4d43-8192-2a3c3513921c.jpg
Binary files differ
doc/PosImages/a/ee0bea8b-edae-4d08-b4d6-ff49341f1c57.jpg
Binary files differ
doc/PosImages/a/eead758e-7ed8-44ad-9afa-631006280667.jpg
Binary files differ
doc/PosImages/a/f1865d3e-b0db-4406-916e-6901029fad58.jpg
Binary files differ
doc/PosImages/a/f229a110-dbd1-4be8-b375-b1e5d4d6d58d.jpg
Binary files differ
doc/PosImages/a/f26e32fe-4353-4236-826d-977f92bfac39.jpg
Binary files differ
doc/PosImages/a/f2e03235-932d-4c39-94a6-f24ad5b4b916.jpg
Binary files differ
doc/PosImages/a/f359d99b-f090-46e6-8b9e-e0a349925a50.jpg
Binary files differ
doc/PosImages/a/f35bc5b7-c93d-4cd1-b726-84d55485bee3.jpg
Binary files differ
doc/PosImages/a/f40a9c1b-3346-414b-aeb3-7c650763e110.jpg
Binary files differ
doc/PosImages/a/f5bff063-aaa7-4e46-a567-1b293de37f5c.jpg
Binary files differ
doc/PosImages/a/f5e6bb51-96c9-41b0-b93f-4a8fb2dcb4ce.jpg
Binary files differ
doc/PosImages/a/f67eb93a-21b1-497a-a012-c96b1b931dcd.jpg
Binary files differ
doc/PosImages/a/f77e56b7-c214-43f8-af3f-ca713afb71c5.jpg
Binary files differ
doc/PosImages/a/f8f36556-f13c-4608-a2d8-e80a72f71e3f.jpg
Binary files differ
doc/PosImages/a/f93b0c27-f41d-4db2-8772-078ed6aa1873.jpg
Binary files differ
doc/PosImages/a/f943b090-d0f7-49fb-a637-7d3e177ab68b.jpg
Binary files differ
doc/PosImages/a/fa02d87c-e5d2-4ad5-b00d-d906ec7a9ae0.jpg
Binary files differ
doc/PosImages/a/fa3bc0c9-47a7-4928-8abb-caefc95f5d15.jpg
Binary files differ
doc/PosImages/a/faa4a0b2-cf57-4f91-9222-c2442378e085.jpg
Binary files differ
doc/PosImages/a/fb29f4a5-9d60-48a9-89d2-123d3d0feb3d.jpg
Binary files differ
doc/PosImages/a/fb4f3d6e-ff42-418a-af44-84d0a7eae528.jpg
Binary files differ
doc/PosImages/a/fb588b03-5793-446d-a990-5ec6ec1f6186.jpg
Binary files differ
doc/PosImages/a/fbbc0acd-3a6e-44db-93da-9d722b112732.jpg
Binary files differ
doc/PosImages/a/fc6f2452-ff2f-4506-b58d-dd391ce51259.jpg
Binary files differ
doc/PosImages/a/fc8a536b-2009-4501-a23c-cae843795bdb.jpg
Binary files differ
doc/PosImages/a/ffb99a09-8ad1-4a8a-8086-73109f54838b.jpg
Binary files differ
doc/PosImages/a/fff8a500-7140-4df0-acf6-d2d86ccb3eed.jpg
Binary files differ
doc/地图/卡勒特_1024x768/0/0.png
doc/地图/卡勒特_1024x768/0/0.psd
Binary files differ
doc/地图/卡勒特_1024x768/0/右上.png
doc/地图/卡勒特_1024x768/0/右下.png
doc/地图/卡勒特_1024x768/0/左上.png
doc/地图/卡勒特_1024x768/0/左下.png
doc/地图/卡勒特_1024x768/1/1.png
doc/地图/卡勒特_1024x768/1/1.psd
Binary files differ
doc/地图/卡勒特_1024x768/1/右上.png
doc/地图/卡勒特_1024x768/1/右下.png
doc/地图/卡勒特_1024x768/1/左上.png
doc/地图/卡勒特_1024x768/1/左下.png
doc/地图/卡勒特_1024x768/11/11.png
doc/地图/卡勒特_1024x768/11/11.psd
Binary files differ
doc/地图/卡勒特_1024x768/11/右上.png
doc/地图/卡勒特_1024x768/11/左上.png
doc/地图/卡勒特_1024x768/12/12.png
doc/地图/卡勒特_1024x768/12/12.psd
Binary files differ
doc/地图/卡勒特_1024x768/12/右上.png
doc/地图/卡勒特_1024x768/12/左上.png
doc/地图/卡勒特_1024x768/13/13.png
doc/地图/卡勒特_1024x768/13/13.psd
Binary files differ
doc/地图/卡勒特_1024x768/13/右上.png
doc/地图/卡勒特_1024x768/13/右下.png
doc/地图/卡勒特_1024x768/13/左上.png
doc/地图/卡勒特_1024x768/13/左下.png
doc/地图/卡勒特_1024x768/14/14.png
doc/地图/卡勒特_1024x768/14/14.psd
Binary files differ
doc/地图/卡勒特_1024x768/14/右上.png
doc/地图/卡勒特_1024x768/14/右下.png
doc/地图/卡勒特_1024x768/14/左上.png
doc/地图/卡勒特_1024x768/14/左下.png
doc/地图/卡勒特_1024x768/16终关/16.png
doc/地图/卡勒特_1024x768/16终关/16.psd
Binary files differ
doc/地图/卡勒特_1024x768/16终关/右上.png
doc/地图/卡勒特_1024x768/16终关/右下.png
doc/地图/卡勒特_1024x768/16终关/左上.png
doc/地图/卡勒特_1024x768/16终关/左下.png
doc/地图/卡勒特_1024x768/17/17.png
doc/地图/卡勒特_1024x768/17/17.psd
Binary files differ
doc/地图/卡勒特_1024x768/17/右上.png
doc/地图/卡勒特_1024x768/17/左上.png
doc/地图/卡勒特_1024x768/19/19.png
doc/地图/卡勒特_1024x768/19/19.psd
Binary files differ
doc/地图/卡勒特_1024x768/19/右上.png
doc/地图/卡勒特_1024x768/19/左上.png
doc/地图/卡勒特_1024x768/3/3.png
doc/地图/卡勒特_1024x768/3/3.psd
Binary files differ
doc/地图/卡勒特_1024x768/3/右上.png
doc/地图/卡勒特_1024x768/3/右下.png
doc/地图/卡勒特_1024x768/3/左上.png
doc/地图/卡勒特_1024x768/3/左下.png
doc/地图/卡勒特_1024x768/6/6.png
doc/地图/卡勒特_1024x768/6/6.psd
Binary files differ
doc/地图/卡勒特_1024x768/6/右上.png
doc/地图/卡勒特_1024x768/6/右下.png
doc/地图/卡勒特_1024x768/6/左上.png
doc/地图/卡勒特_1024x768/6/左下.png
doc/地图/卡勒特_1024x768/7/7.png
doc/地图/卡勒特_1024x768/7/7.psd
Binary files differ
doc/地图/卡勒特_1024x768/7/右上.png
doc/地图/卡勒特_1024x768/7/右下.png
doc/地图/卡勒特_1024x768/7/左上.png
doc/地图/卡勒特_1024x768/7/左下.png
doc/地图/卡勒特_1024x768/8/8.png
doc/地图/卡勒特_1024x768/8/8.psd
Binary files differ
doc/地图/卡勒特_1024x768/8/右上.png
doc/地图/卡勒特_1024x768/8/左上.png
doc/地图/卡勒特_1024x768/9/9.png
doc/地图/卡勒特_1024x768/9/9.psd
Binary files differ
doc/地图/卡勒特_1024x768/9/右上.png
doc/地图/卡勒特_1024x768/9/左上.png
doc/地图/卡勒特_1024x768/map.txt
New file
@@ -0,0 +1,27 @@
0:
{"Width":1350,"Height":901,"Obstacles":[{"Points":[{"X":1,"Y":357},{"X":803,"Y":359},{"X":1029,"Y":406},{"X":1229,"Y":361},{"X":1346,"Y":357},{"X":1346,"Y":1},{"X":0,"Y":3}],"Length":7},{"Points":[{"X":1348,"Y":739},{"X":1254,"Y":735},{"X":1250,"Y":696},{"X":1042,"Y":701},{"X":1042,"Y":726},{"X":252,"Y":735},{"X":243,"Y":680},{"X":1,"Y":700},{"X":1,"Y":900},{"X":1347,"Y":901}],"Length":10}],"LocationPoints":[{"Point":{"X":100,"Y":411},"Parameter":6},{"Point":{"X":591,"Y":410},"Parameter":5},{"Point":{"X":1077,"Y":408},"Parameter":4}],"FindPathPoints":[{"X":1213,"Y":401},{"X":122,"Y":404}],"LoopLines":[{"P1":{"X":122,"Y":404},"P2":{"X":1213,"Y":401}}],"FindPathLines":[],"NextGates":[{"Point":{"X":1197,"Y":402},"Parameter":1}],"PathGuides":[]}
1:
{"Width":1349,"Height":900,"Obstacles":[{"Points":[{"X":124,"Y":324},{"X":760,"Y":310},{"X":956,"Y":414},{"X":1124,"Y":372},{"X":1113,"Y":301},{"X":1346,"Y":297},{"X":1345,"Y":3},{"X":0,"Y":2},{"X":0,"Y":375}],"Length":9},{"Points":[{"X":1342,"Y":675},{"X":1189,"Y":675},{"X":1191,"Y":713},{"X":949,"Y":712},{"X":867,"Y":772},{"X":840,"Y":897},{"X":1345,"Y":899}],"Length":7},{"Points":[{"X":651,"Y":668},{"X":459,"Y":671},{"X":446,"Y":641},{"X":247,"Y":641},{"X":236,"Y":608},{"X":155,"Y":612},{"X":150,"Y":549},{"X":295,"Y":541},{"X":376,"Y":557},{"X":472,"Y":592},{"X":473,"Y":609},{"X":627,"Y":606}],"Length":12},{"Points":[{"X":565,"Y":815},{"X":464,"Y":737},{"X":0,"Y":721},{"X":1,"Y":896},{"X":839,"Y":894},{"X":851,"Y":815}],"Length":6}],"LocationPoints":[{"Point":{"X":270,"Y":462},"Parameter":0},{"Point":{"X":732,"Y":461},"Parameter":1},{"Point":{"X":1192,"Y":461},"Parameter":2},{"Point":{"X":708,"Y":344},"Parameter":8},{"Point":{"X":706,"Y":197},"Parameter":9},{"Point":{"X":706,"Y":53},"Parameter":10}],"FindPathPoints":[{"X":1211,"Y":323},{"X":193,"Y":419},{"X":1251,"Y":446},{"X":746,"Y":498},{"X":769,"Y":657},{"X":111,"Y":660}],"LoopLines":[{"P1":{"X":193,"Y":419},"P2":{"X":1251,"Y":446}}],"FindPathLines":[{"P1":{"X":193,"Y":419},"P2":{"X":746,"Y":498}},{"P1":{"X":746,"Y":498},"P2":{"X":1251,"Y":446}},{"P1":{"X":746,"Y":498},"P2":{"X":769,"Y":657}},{"P1":{"X":769,"Y":657},"P2":{"X":1251,"Y":446}},{"P1":{"X":769,"Y":657},"P2":{"X":193,"Y":419}},{"P1":{"X":1251,"Y":446},"P2":{"X":1211,"Y":323}},{"P1":{"X":769,"Y":657},"P2":{"X":1211,"Y":323}},{"P1":{"X":111,"Y":660},"P2":{"X":193,"Y":419}},{"P1":{"X":111,"Y":660},"P2":{"X":769,"Y":657}}]}
3:
{"Width":1348,"Height":900,"Obstacles":[{"Points":[{"X":0,"Y":313},{"X":927,"Y":295},{"X":963,"Y":334},{"X":1275,"Y":314},{"X":1343,"Y":300},{"X":1343,"Y":2},{"X":1,"Y":1}],"Length":7},{"Points":[{"X":878,"Y":366},{"X":750,"Y":369},{"X":733,"Y":354},{"X":740,"Y":325},{"X":876,"Y":324}],"Length":5},{"Points":[{"X":1345,"Y":551},{"X":1170,"Y":587},{"X":1173,"Y":643},{"X":1275,"Y":713},{"X":1346,"Y":706}],"Length":5},{"Points":[{"X":285,"Y":307},{"X":312,"Y":576},{"X":195,"Y":626},{"X":208,"Y":691},{"X":153,"Y":723},{"X":150,"Y":897},{"X":2,"Y":896},{"X":0,"Y":319}],"Length":8},{"Points":[{"X":156,"Y":752},{"X":369,"Y":714},{"X":793,"Y":734},{"X":932,"Y":822},{"X":1032,"Y":814},{"X":1058,"Y":896},{"X":159,"Y":894}],"Length":7},{"Points":[{"X":1037,"Y":824},{"X":1243,"Y":820},{"X":1229,"Y":748},{"X":1269,"Y":718},{"X":1344,"Y":709},{"X":1345,"Y":896},{"X":1064,"Y":897}],"Length":7}],"LocationPoints":[{"Point":{"X":1108,"Y":329},"Parameter":8},{"Point":{"X":1107,"Y":182},"Parameter":9},{"Point":{"X":1107,"Y":37},"Parameter":10}],"FindPathPoints":[{"X":358,"Y":342},{"X":378,"Y":505},{"X":1270,"Y":415},{"X":1038,"Y":650}],"LoopLines":[{"P1":{"X":358,"Y":342},"P2":{"X":1038,"Y":650}}],"FindPathLines":[{"P1":{"X":358,"Y":342},"P2":{"X":1270,"Y":415}},{"P1":{"X":1270,"Y":415},"P2":{"X":1038,"Y":650}},{"P1":{"X":1270,"Y":415},"P2":{"X":378,"Y":505}},{"P1":{"X":378,"Y":505},"P2":{"X":358,"Y":342}},{"P1":{"X":378,"Y":505},"P2":{"X":1038,"Y":650}}]}
6:
{"Width":1350,"Height":900,"Obstacles":[{"Points":[{"X":325,"Y":425},{"X":437,"Y":447},{"X":567,"Y":437},{"X":565,"Y":395},{"X":631,"Y":398},{"X":675,"Y":410},{"X":809,"Y":405},{"X":810,"Y":375},{"X":933,"Y":329},{"X":1279,"Y":303},{"X":1345,"Y":367},{"X":1345,"Y":5},{"X":1,"Y":6}],"Length":13},{"Points":[{"X":1347,"Y":481},{"X":1246,"Y":501},{"X":1235,"Y":551},{"X":1188,"Y":617},{"X":1192,"Y":669},{"X":1348,"Y":673}],"Length":6},{"Points":[{"X":1349,"Y":701},{"X":791,"Y":719},{"X":803,"Y":659},{"X":396,"Y":665},{"X":361,"Y":723},{"X":2,"Y":711},{"X":0,"Y":896},{"X":1345,"Y":898}],"Length":8}],"LocationPoints":[{"Point":{"X":1080,"Y":425},"Parameter":4},{"Point":{"X":592,"Y":427},"Parameter":5},{"Point":{"X":103,"Y":427},"Parameter":6}],"FindPathPoints":[{"X":174,"Y":537},{"X":1197,"Y":430},{"X":602,"Y":502}],"LoopLines":[{"P1":{"X":174,"Y":537},"P2":{"X":1197,"Y":430}}],"FindPathLines":[{"P1":{"X":174,"Y":537},"P2":{"X":602,"Y":502}},{"P1":{"X":602,"Y":502},"P2":{"X":1197,"Y":430}}]}
7:
{"Width":1350,"Height":900,"Obstacles":[{"Points":[{"X":31,"Y":409},{"X":127,"Y":312},{"X":505,"Y":351},{"X":570,"Y":394},{"X":733,"Y":418},{"X":888,"Y":410},{"X":896,"Y":334},{"X":1066,"Y":328},{"X":1100,"Y":401},{"X":1315,"Y":425},{"X":1349,"Y":427},{"X":1343,"Y":1},{"X":4,"Y":4},{"X":1,"Y":341}],"Length":14},{"Points":[{"X":467,"Y":896},{"X":472,"Y":733},{"X":325,"Y":676},{"X":178,"Y":636},{"X":0,"Y":625},{"X":2,"Y":900}],"Length":6}],"LocationPoints":[{"Point":{"X":270,"Y":462},"Parameter":0},{"Point":{"X":730,"Y":463},"Parameter":1},{"Point":{"X":1191,"Y":463},"Parameter":2},{"Point":{"X":1078,"Y":499},"Parameter":4},{"Point":{"X":589,"Y":497},"Parameter":5},{"Point":{"X":100,"Y":498},"Parameter":6}],"FindPathPoints":[{"X":146,"Y":440},{"X":1226,"Y":720}],"LoopLines":[{"P1":{"X":146,"Y":440},"P2":{"X":1226,"Y":720}}],"FindPathLines":[]}
8:
{"Width":1686,"Height":720,"Obstacles":[{"Points":[{"X":2,"Y":420},{"X":130,"Y":439},{"X":311,"Y":462},{"X":313,"Y":400},{"X":221,"Y":319},{"X":453,"Y":288},{"X":632,"Y":5},{"X":4,"Y":2}],"Length":8},{"Points":[{"X":574,"Y":104},{"X":743,"Y":319},{"X":961,"Y":306},{"X":1014,"Y":343},{"X":1099,"Y":326},{"X":1165,"Y":369},{"X":1534,"Y":365},{"X":1684,"Y":309},{"X":1680,"Y":4},{"X":633,"Y":5}],"Length":10},{"Points":[{"X":1682,"Y":470},{"X":1540,"Y":514},{"X":1442,"Y":590},{"X":1173,"Y":641},{"X":858,"Y":670},{"X":814,"Y":708},{"X":1681,"Y":715}],"Length":7}],"LocationPoints":[{"Point":{"X":277,"Y":501},"Parameter":0},{"Point":{"X":735,"Y":502},"Parameter":1},{"Point":{"X":1196,"Y":502},"Parameter":2},{"Point":{"X":1418,"Y":390},"Parameter":4},{"Point":{"X":930,"Y":387},"Parameter":5},{"Point":{"X":441,"Y":388},"Parameter":6}],"FindPathPoints":[{"X":186,"Y":483},{"X":1565,"Y":393},{"X":549,"Y":448}],"LoopLines":[{"P1":{"X":186,"Y":483},"P2":{"X":1565,"Y":393}}],"FindPathLines":[{"P1":{"X":186,"Y":483},"P2":{"X":549,"Y":448}},{"P1":{"X":549,"Y":448},"P2":{"X":1565,"Y":393}}]}
9:
{"Width":1688,"Height":720,"Obstacles":[{"Points":[{"X":3,"Y":333},{"X":390,"Y":305},{"X":600,"Y":389},{"X":746,"Y":389},{"X":766,"Y":327},{"X":890,"Y":334},{"X":914,"Y":247},{"X":1092,"Y":225},{"X":1305,"Y":396},{"X":1489,"Y":346},{"X":1684,"Y":411},{"X":1683,"Y":3},{"X":3,"Y":3}],"Length":13},{"Points":[{"X":389,"Y":671},{"X":398,"Y":614},{"X":868,"Y":605},{"X":1037,"Y":631},{"X":1125,"Y":589},{"X":1536,"Y":632},{"X":1678,"Y":682},{"X":1682,"Y":715},{"X":378,"Y":715}],"Length":9}],"LocationPoints":[{"Point":{"X":274,"Y":500},"Parameter":0},{"Point":{"X":738,"Y":502},"Parameter":1},{"Point":{"X":1200,"Y":501},"Parameter":2},{"Point":{"X":1658,"Y":503},"Parameter":3}],"FindPathPoints":[{"X":216,"Y":456},{"X":1545,"Y":466},{"X":985,"Y":515}],"LoopLines":[{"P1":{"X":216,"Y":456},"P2":{"X":1545,"Y":466}}],"FindPathLines":[{"P1":{"X":216,"Y":456},"P2":{"X":985,"Y":515}},{"P1":{"X":985,"Y":515},"P2":{"X":1545,"Y":466}}]}
11:
{"Width":1686,"Height":720,"Obstacles":[{"Points":[{"X":1678,"Y":410},{"X":1576,"Y":341},{"X":1258,"Y":344},{"X":1241,"Y":379},{"X":1153,"Y":380},{"X":849,"Y":377},{"X":765,"Y":353},{"X":598,"Y":352},{"X":498,"Y":387},{"X":0,"Y":360},{"X":1,"Y":1},{"X":1681,"Y":2}],"Length":12},{"Points":[{"X":1566,"Y":714},{"X":1502,"Y":662},{"X":875,"Y":654},{"X":780,"Y":660},{"X":550,"Y":636},{"X":365,"Y":614},{"X":183,"Y":626},{"X":72,"Y":636},{"X":10,"Y":655},{"X":0,"Y":715}],"Length":10}],"LocationPoints":[{"Point":{"X":929,"Y":450},"Parameter":5},{"Point":{"X":440,"Y":452},"Parameter":6},{"Point":{"X":1416,"Y":451},"Parameter":4}],"FindPathPoints":[{"X":71,"Y":469},{"X":1529,"Y":462},{"X":826,"Y":576}],"LoopLines":[{"P1":{"X":71,"Y":469},"P2":{"X":1529,"Y":462}}],"FindPathLines":[{"P1":{"X":71,"Y":469},"P2":{"X":826,"Y":576}},{"P1":{"X":826,"Y":576},"P2":{"X":1529,"Y":462}}]}
12:
{"Width":2024,"Height":720,"Obstacles":[{"Points":[{"X":795,"Y":351},{"X":1897,"Y":323},{"X":2019,"Y":271},{"X":2019,"Y":4},{"X":1,"Y":2},{"X":3,"Y":347},{"X":111,"Y":400},{"X":200,"Y":377},{"X":294,"Y":344},{"X":560,"Y":351},{"X":623,"Y":381}],"Length":11},{"Points":[{"X":2020,"Y":614},{"X":1464,"Y":615},{"X":1137,"Y":589},{"X":895,"Y":606},{"X":855,"Y":715},{"X":2020,"Y":716}],"Length":6},{"Points":[{"X":525,"Y":715},{"X":451,"Y":589},{"X":156,"Y":603},{"X":2,"Y":495},{"X":2,"Y":716}],"Length":5}],"LocationPoints":[{"Point":{"X":270,"Y":461},"Parameter":0},{"Point":{"X":731,"Y":461},"Parameter":1},{"Point":{"X":1192,"Y":462},"Parameter":2},{"Point":{"X":1650,"Y":463},"Parameter":3},{"Point":{"X":1278,"Y":347},"Parameter":5},{"Point":{"X":788,"Y":347},"Parameter":6},{"Point":{"X":301,"Y":346},"Parameter":7},{"Point":{"X":628,"Y":175},"Parameter":8},{"Point":{"X":627,"Y":28},"Parameter":9}],"FindPathPoints":[{"X":201,"Y":457},{"X":1894,"Y":423},{"X":699,"Y":513}],"LoopLines":[{"P1":{"X":201,"Y":457},"P2":{"X":1894,"Y":423}}],"FindPathLines":[{"P1":{"X":201,"Y":457},"P2":{"X":699,"Y":513}},{"P1":{"X":699,"Y":513},"P2":{"X":1894,"Y":423}}]}
13:
{"Width":2024,"Height":900,"Obstacles":[{"Points":[{"X":1607,"Y":189},{"X":1761,"Y":360},{"X":2022,"Y":405},{"X":2022,"Y":1},{"X":1565,"Y":1}],"Length":5},{"Points":[{"X":1350,"Y":400},{"X":1605,"Y":186},{"X":1562,"Y":1},{"X":121,"Y":1},{"X":335,"Y":410},{"X":385,"Y":402}],"Length":6},{"Points":[{"X":2017,"Y":719},{"X":1228,"Y":729},{"X":1137,"Y":666},{"X":667,"Y":689},{"X":417,"Y":671},{"X":123,"Y":649},{"X":121,"Y":891},{"X":2020,"Y":896}],"Length":8},{"Points":[{"X":294,"Y":564},{"X":121,"Y":566},{"X":122,"Y":19},{"X":322,"Y":394},{"X":233,"Y":457}],"Length":5},{"Points":[{"X":1,"Y":2},{"X":127,"Y":3},{"X":128,"Y":896},{"X":0,"Y":894}],"Length":4}],"LocationPoints":[{"Point":{"X":537,"Y":496},"Parameter":0},{"Point":{"X":997,"Y":497},"Parameter":1},{"Point":{"X":1458,"Y":497},"Parameter":2},{"Point":{"X":1918,"Y":496},"Parameter":3},{"Point":{"X":777,"Y":484},"Parameter":6},{"Point":{"X":1266,"Y":484},"Parameter":5},{"Point":{"X":1753,"Y":485},"Parameter":4}],"FindPathPoints":[{"X":425,"Y":495},{"X":1885,"Y":496},{"X":1294,"Y":541}],"LoopLines":[{"P1":{"X":425,"Y":495},"P2":{"X":1885,"Y":496}}],"FindPathLines":[{"P1":{"X":425,"Y":495},"P2":{"X":1294,"Y":541}},{"P1":{"X":1294,"Y":541},"P2":{"X":1885,"Y":496}}]}
14:
{"Width":1687,"Height":901,"Obstacles":[{"Points":[{"X":98,"Y":310},{"X":408,"Y":314},{"X":418,"Y":425},{"X":530,"Y":416},{"X":593,"Y":451},{"X":721,"Y":452},{"X":762,"Y":449},{"X":783,"Y":337},{"X":840,"Y":302},{"X":1207,"Y":300},{"X":1239,"Y":321},{"X":1418,"Y":320},{"X":1584,"Y":378},{"X":1679,"Y":377},{"X":1681,"Y":4},{"X":4,"Y":4},{"X":0,"Y":436}],"Length":17},{"Points":[{"X":1681,"Y":717},{"X":1319,"Y":706},{"X":1165,"Y":653},{"X":1053,"Y":654},{"X":835,"Y":609},{"X":732,"Y":624},{"X":680,"Y":667},{"X":0,"Y":650},{"X":0,"Y":898},{"X":1682,"Y":898}],"Length":10}],"LocationPoints":[{"Point":{"X":278,"Y":481},"Parameter":0},{"Point":{"X":739,"Y":481},"Parameter":1},{"Point":{"X":1200,"Y":479},"Parameter":2},{"Point":{"X":1656,"Y":480},"Parameter":3}],"FindPathPoints":[{"X":140,"Y":474},{"X":1453,"Y":466},{"X":763,"Y":520},{"X":373,"Y":565}],"LoopLines":[{"P1":{"X":140,"Y":474},"P2":{"X":1453,"Y":466}}],"FindPathLines":[{"P1":{"X":140,"Y":474},"P2":{"X":373,"Y":565}},{"P1":{"X":140,"Y":474},"P2":{"X":763,"Y":520}},{"P1":{"X":373,"Y":565},"P2":{"X":763,"Y":520}},{"P1":{"X":763,"Y":520},"P2":{"X":1453,"Y":466}},{"P1":{"X":373,"Y":565},"P2":{"X":1453,"Y":466}}]}
16:
{"Width":1687,"Height":901,"Obstacles":[{"Points":[{"X":3,"Y":385},{"X":257,"Y":388},{"X":655,"Y":320},{"X":711,"Y":264},{"X":1682,"Y":279},{"X":1682,"Y":1},{"X":0,"Y":4}],"Length":7},{"Points":[{"X":5,"Y":713},{"X":265,"Y":754},{"X":432,"Y":862},{"X":405,"Y":900},{"X":1,"Y":896}],"Length":5},{"Points":[{"X":720,"Y":883},{"X":825,"Y":776},{"X":1034,"Y":851},{"X":985,"Y":900},{"X":712,"Y":900}],"Length":5},{"Points":[{"X":1173,"Y":871},{"X":1569,"Y":644},{"X":1674,"Y":661},{"X":1684,"Y":772},{"X":1679,"Y":887},{"X":1187,"Y":893},{"X":1200,"Y":852}],"Length":7}],"LocationPoints":[{"Point":{"X":1391,"Y":410},"Parameter":4},{"Point":{"X":905,"Y":409},"Parameter":5},{"Point":{"X":416,"Y":410},"Parameter":6}],"FindPathPoints":[{"X":633,"Y":693},{"X":1494,"Y":434},{"X":139,"Y":505},{"X":834,"Y":367}],"LoopLines":[{"P1":{"X":139,"Y":505},"P2":{"X":1494,"Y":434}}],"FindPathLines":[{"P1":{"X":139,"Y":505},"P2":{"X":834,"Y":367}},{"P1":{"X":834,"Y":367},"P2":{"X":1494,"Y":434}},{"P1":{"X":633,"Y":693},"P2":{"X":1494,"Y":434}},{"P1":{"X":633,"Y":693},"P2":{"X":834,"Y":367}},{"P1":{"X":633,"Y":693},"P2":{"X":139,"Y":505}}]}
17:
{"Width":1687,"Height":720,"Obstacles":[{"Points":[{"X":1681,"Y":368},{"X":1591,"Y":363},{"X":1487,"Y":252},{"X":1475,"Y":4},{"X":1683,"Y":3}],"Length":5},{"Points":[{"X":1348,"Y":358},{"X":544,"Y":345},{"X":534,"Y":453},{"X":115,"Y":450},{"X":0,"Y":390},{"X":0,"Y":3},{"X":1480,"Y":3},{"X":1487,"Y":245}],"Length":8},{"Points":[{"X":108,"Y":685},{"X":76,"Y":720},{"X":1682,"Y":718},{"X":1684,"Y":683}],"Length":4}],"LocationPoints":[{"Point":{"X":276,"Y":499},"Parameter":0},{"Point":{"X":736,"Y":502},"Parameter":1},{"Point":{"X":1198,"Y":500},"Parameter":2},{"Point":{"X":1655,"Y":502},"Parameter":3}],"FindPathPoints":[{"X":196,"Y":514},{"X":1622,"Y":491},{"X":605,"Y":518}],"LoopLines":[{"P1":{"X":196,"Y":514},"P2":{"X":1622,"Y":491}}],"FindPathLines":[{"P1":{"X":196,"Y":514},"P2":{"X":605,"Y":518}},{"P1":{"X":605,"Y":518},"P2":{"X":1622,"Y":491}}]}
doc/地图/卡勒特_800x600/0/0.png
doc/地图/卡勒特_800x600/0/0.psd
Binary files differ
doc/地图/卡勒特_800x600/0/右上.png
doc/地图/卡勒特_800x600/0/右下.png
doc/地图/卡勒特_800x600/0/左上.png
doc/地图/卡勒特_800x600/0/左下.png
doc/地图/卡勒特_800x600/map.txt
New file
@@ -0,0 +1,2 @@
0:
{"Width":896,"Height":686,"Obstacles":[{"Points":[{"X":2,"Y":320},{"X":460,"Y":310},{"X":493,"Y":319},{"X":556,"Y":334},{"X":668,"Y":344},{"X":759,"Y":330},{"X":873,"Y":308},{"X":893,"Y":300},{"X":891,"Y":1},{"X":2,"Y":3}],"Length":10},{"Points":[{"X":2,"Y":552},{"X":71,"Y":545},{"X":76,"Y":427},{"X":165,"Y":439},{"X":166,"Y":521},{"X":253,"Y":559},{"X":703,"Y":550},{"X":703,"Y":521},{"X":823,"Y":513},{"X":834,"Y":568},{"X":893,"Y":559},{"X":893,"Y":684},{"X":4,"Y":683}],"Length":13}],"LocationPoints":[{"Point":{"X":797,"Y":348},"Parameter":0},{"Point":{"X":671,"Y":348},"Parameter":1},{"Point":{"X":547,"Y":348},"Parameter":2},{"Point":{"X":423,"Y":348},"Parameter":3},{"Point":{"X":298,"Y":347},"Parameter":4},{"Point":{"X":172,"Y":348},"Parameter":5},{"Point":{"X":47,"Y":348},"Parameter":6}],"FindPathPoints":[{"X":51,"Y":392},{"X":438,"Y":418},{"X":775,"Y":400}],"LoopPoint":{"X":0,"Y":0},"FindPathLines":[{"P1":{"X":51,"Y":392},"P2":{"X":775,"Y":400}},{"P1":{"X":438,"Y":418},"P2":{"X":775,"Y":400}},{"P1":{"X":438,"Y":418},"P2":{"X":51,"Y":392}}],"NextGates":[{"Point":{"X":778,"Y":346},"Parameter":1}],"PathGuides":[{"Polygon":{"Points":[{"X":47,"Y":509},{"X":121,"Y":508},{"X":118,"Y":541},{"X":42,"Y":547}],"Length":4},"Target":{"X":20,"Y":508}}]}
doc/流程图/杀怪KillMonster.vsd
Binary files differ
doc/补丁/(A Lingdong)sprite_map_breakableobject(蛋).NPK
Binary files differ
doc/补丁/(A Lingdong)sprite_map_cataclysm_skytower_draconiantower_object.NPK
Binary files differ
doc/补丁/(A Lingdong)sprite_map_minimap.NPK
Binary files differ
doc/补丁/(A Lingdong)sprite_map_pathgate_timegate(门).NPK
Binary files differ
doc/补丁/(A Lingdong)sprite_monster_common.NPK
Binary files differ
doc/补丁/(A Lingdong)sprite_monster_dragondungeon_babydragon.NPK
Binary files differ
doc/补丁/(A Lingdong)sprite_monster_dragonknight.NPK
Binary files differ
doc/补丁/(A Lingdong)sprite_monster_flydragon.NPK
Binary files differ
doc/补丁/(A Lingdong)sprite_monster_impossible_bakal.NPK
Binary files differ
doc/补丁/(A Lingdong)sprite_monster_lizardman.NPK
Binary files differ
doc/补丁/(A Lingdong)sprite_monster_timegate_beginning.NPK
Binary files differ
doc/补丁/(A Lingdong)sprite_monster_young_scasa.NPK
Binary files differ
doc/补丁/(A kalete)sprite_map_arden.NPK
Binary files differ
doc/补丁/(A kalete)sprite_map_haze.NPK
Binary files differ
doc/补丁/(A kalete)sprite_monster_ghoul.NPK
Binary files differ
doc/补丁/(A kalete)sprite_monster_haze.NPK
Binary files differ
doc/补丁/(A kalete)sprite_monster_heaven_mechanicgiselle.NPK
Binary files differ
doc/补丁/(A kalete)sprite_monster_snowman.NPK
Binary files differ
doc/补丁/(A kalete)sprite_monster_timegate.NPK
Binary files differ
doc/补丁/(A)sprite_interface.NPK
Binary files differ
doc/补丁/(A)sprite_interface2_minimap_dungeon.NPK
Binary files differ
doc/补丁/凛冬/(A)sprite_interface2_ui_comboeffect(地下城右边评分数字).NPK
Binary files differ
doc/补丁/凛冬/(A)sprite_map_minimap.NPK
Binary files differ
doc/补丁/凛冬/(A)sprite_map_pathgate_timegate(门).NPK
Binary files differ
doc/补丁/凛冬/(A)影子杀手称号.NPK
Binary files differ
doc/补丁/卡勒特之初/sprite_interface2_minimap_dungeon.NPK
Binary files differ
doc/补丁原图/color说明.txt
@@ -11,6 +11,14 @@
        rgb 0  ff    ff
        hsv 0.5   1   1
牛      rgb 255 0   0
        rgb ff 00  00
        hsv 0 1  1
人      rgb  0    0   255
        rgb  0   0   ff
        hsv   0.6667 1.00 1.00
gate_up rgb 255 153 0
        rgb ff  99      00
        hsv 0.1   1    1
doc/补丁原图/numbers/0.png
doc/补丁原图/numbers/1.png
doc/补丁原图/numbers/10.png
doc/补丁原图/numbers/100.png
doc/补丁原图/numbers/101.png
doc/补丁原图/numbers/102.png
doc/补丁原图/numbers/103.png
doc/补丁原图/numbers/104.png
doc/补丁原图/numbers/105.png
doc/补丁原图/numbers/106.png
doc/补丁原图/numbers/107.png
doc/补丁原图/numbers/108.png
doc/补丁原图/numbers/109.png
doc/补丁原图/numbers/11.png
doc/补丁原图/numbers/110.png
doc/补丁原图/numbers/111.png
doc/补丁原图/numbers/112.png
doc/补丁原图/numbers/113.png
doc/补丁原图/numbers/114.png
doc/补丁原图/numbers/115.png
doc/补丁原图/numbers/116.png
doc/补丁原图/numbers/117.png
doc/补丁原图/numbers/118.png
doc/补丁原图/numbers/119.png
doc/补丁原图/numbers/12.png
doc/补丁原图/numbers/120.png
doc/补丁原图/numbers/121.png
doc/补丁原图/numbers/122.png
doc/补丁原图/numbers/123.png
doc/补丁原图/numbers/124.png
doc/补丁原图/numbers/125.png
doc/补丁原图/numbers/126.png
doc/补丁原图/numbers/127.png
doc/补丁原图/numbers/128.png
doc/补丁原图/numbers/129.png
doc/补丁原图/numbers/13.png
doc/补丁原图/numbers/130.png
doc/补丁原图/numbers/131.png
doc/补丁原图/numbers/132.png
doc/补丁原图/numbers/133.png
doc/补丁原图/numbers/134.png
doc/补丁原图/numbers/135.png
doc/补丁原图/numbers/136.png
doc/补丁原图/numbers/137.png
doc/补丁原图/numbers/138.png
doc/补丁原图/numbers/139.png
doc/补丁原图/numbers/14.png
doc/补丁原图/numbers/140.png
doc/补丁原图/numbers/141.png
doc/补丁原图/numbers/142.png
doc/补丁原图/numbers/143.png
doc/补丁原图/numbers/144.png
doc/补丁原图/numbers/145.png
doc/补丁原图/numbers/146.png
doc/补丁原图/numbers/147.png
doc/补丁原图/numbers/148.png
doc/补丁原图/numbers/149.png
doc/补丁原图/numbers/15.png
doc/补丁原图/numbers/150.png
doc/补丁原图/numbers/151.png
doc/补丁原图/numbers/152.png
doc/补丁原图/numbers/153.png
doc/补丁原图/numbers/154.png
doc/补丁原图/numbers/155.png
doc/补丁原图/numbers/156.png
doc/补丁原图/numbers/157.png
doc/补丁原图/numbers/158.png
doc/补丁原图/numbers/159.png
doc/补丁原图/numbers/16.png
doc/补丁原图/numbers/160.png
doc/补丁原图/numbers/161.png
doc/补丁原图/numbers/162.png
doc/补丁原图/numbers/163.png
doc/补丁原图/numbers/164.png
doc/补丁原图/numbers/165.png
doc/补丁原图/numbers/166.png
doc/补丁原图/numbers/167.png
doc/补丁原图/numbers/168.png
doc/补丁原图/numbers/169.png
doc/补丁原图/numbers/17.png
doc/补丁原图/numbers/170.png
doc/补丁原图/numbers/171.png
doc/补丁原图/numbers/172.png
doc/补丁原图/numbers/173.png
doc/补丁原图/numbers/174.png
doc/补丁原图/numbers/175.png
doc/补丁原图/numbers/176.png
doc/补丁原图/numbers/177.png
doc/补丁原图/numbers/178.png
doc/补丁原图/numbers/179.png
doc/补丁原图/numbers/18.png
doc/补丁原图/numbers/180.png
doc/补丁原图/numbers/181.png
doc/补丁原图/numbers/182.png
doc/补丁原图/numbers/183.png
doc/补丁原图/numbers/184.png
doc/补丁原图/numbers/185.png
doc/补丁原图/numbers/186.png
doc/补丁原图/numbers/187.png
doc/补丁原图/numbers/188.png
doc/补丁原图/numbers/189.png
doc/补丁原图/numbers/19.png
doc/补丁原图/numbers/190.png
doc/补丁原图/numbers/191.png
doc/补丁原图/numbers/192.png
doc/补丁原图/numbers/193.png
doc/补丁原图/numbers/194.png
doc/补丁原图/numbers/195.png
doc/补丁原图/numbers/196.png
doc/补丁原图/numbers/197.png
doc/补丁原图/numbers/198.png
doc/补丁原图/numbers/199.png
doc/补丁原图/numbers/2.png
doc/补丁原图/numbers/20.png
doc/补丁原图/numbers/200.png
doc/补丁原图/numbers/201.png
doc/补丁原图/numbers/202.png
doc/补丁原图/numbers/203.png
doc/补丁原图/numbers/204.png
doc/补丁原图/numbers/205.png
doc/补丁原图/numbers/206.png
doc/补丁原图/numbers/207.png
doc/补丁原图/numbers/208.png
doc/补丁原图/numbers/209.png
doc/补丁原图/numbers/21.png
doc/补丁原图/numbers/210.png
doc/补丁原图/numbers/211.png
doc/补丁原图/numbers/212.png
doc/补丁原图/numbers/213.png
doc/补丁原图/numbers/214.png
doc/补丁原图/numbers/215.png
doc/补丁原图/numbers/216.png
doc/补丁原图/numbers/217.png
doc/补丁原图/numbers/218.png
doc/补丁原图/numbers/219.png
doc/补丁原图/numbers/22.png
doc/补丁原图/numbers/220.png
doc/补丁原图/numbers/221.png
doc/补丁原图/numbers/222.png
doc/补丁原图/numbers/223.png
doc/补丁原图/numbers/224.png
doc/补丁原图/numbers/225.png
doc/补丁原图/numbers/226.png
doc/补丁原图/numbers/227.png
doc/补丁原图/numbers/228.png
doc/补丁原图/numbers/229.png
doc/补丁原图/numbers/23.png
doc/补丁原图/numbers/230.png
doc/补丁原图/numbers/231.png
doc/补丁原图/numbers/232.png
doc/补丁原图/numbers/233.png
doc/补丁原图/numbers/234.png
doc/补丁原图/numbers/235.png
doc/补丁原图/numbers/236.png
doc/补丁原图/numbers/237.png
doc/补丁原图/numbers/238.png
doc/补丁原图/numbers/239.png
doc/补丁原图/numbers/24.png
doc/补丁原图/numbers/240.png
doc/补丁原图/numbers/241.png
doc/补丁原图/numbers/242.png
doc/补丁原图/numbers/243.png
doc/补丁原图/numbers/244.png
doc/补丁原图/numbers/245.png
doc/补丁原图/numbers/246.png
doc/补丁原图/numbers/247.png
doc/补丁原图/numbers/248.png
doc/补丁原图/numbers/249.png
doc/补丁原图/numbers/25.png
doc/补丁原图/numbers/250.png
doc/补丁原图/numbers/251.png
doc/补丁原图/numbers/252.png
doc/补丁原图/numbers/253.png
doc/补丁原图/numbers/254.png
doc/补丁原图/numbers/255.png
doc/补丁原图/numbers/26.png
doc/补丁原图/numbers/27.png
doc/补丁原图/numbers/28.png
doc/补丁原图/numbers/29.png
doc/补丁原图/numbers/3.png
doc/补丁原图/numbers/30.png
doc/补丁原图/numbers/31.png
doc/补丁原图/numbers/32.png
doc/补丁原图/numbers/33.png
doc/补丁原图/numbers/34.png
doc/补丁原图/numbers/35.png
doc/补丁原图/numbers/36.png
doc/补丁原图/numbers/37.png
doc/补丁原图/numbers/38.png
doc/补丁原图/numbers/39.png
doc/补丁原图/numbers/4.png
doc/补丁原图/numbers/40.png
doc/补丁原图/numbers/41.png
doc/补丁原图/numbers/42.png
doc/补丁原图/numbers/43.png
doc/补丁原图/numbers/44.png
doc/补丁原图/numbers/45.png
doc/补丁原图/numbers/46.png
doc/补丁原图/numbers/47.png
doc/补丁原图/numbers/48.png
doc/补丁原图/numbers/49.png
doc/补丁原图/numbers/5.png
doc/补丁原图/numbers/50.png
doc/补丁原图/numbers/51.png
doc/补丁原图/numbers/52.png
doc/补丁原图/numbers/53.png
doc/补丁原图/numbers/54.png
doc/补丁原图/numbers/55.png
doc/补丁原图/numbers/56.png
doc/补丁原图/numbers/57.png
doc/补丁原图/numbers/58.png
doc/补丁原图/numbers/59.png
doc/补丁原图/numbers/6.png
doc/补丁原图/numbers/60.png
doc/补丁原图/numbers/61.png
doc/补丁原图/numbers/62.png
doc/补丁原图/numbers/63.png
doc/补丁原图/numbers/64.png
doc/补丁原图/numbers/65.png
doc/补丁原图/numbers/66.png
doc/补丁原图/numbers/67.png
doc/补丁原图/numbers/68.png
doc/补丁原图/numbers/69.png
doc/补丁原图/numbers/7.png
doc/补丁原图/numbers/70.png
doc/补丁原图/numbers/71.png
doc/补丁原图/numbers/72.png
doc/补丁原图/numbers/73.png
doc/补丁原图/numbers/74.png
doc/补丁原图/numbers/75.png
doc/补丁原图/numbers/76.png
doc/补丁原图/numbers/77.png
doc/补丁原图/numbers/78.png
doc/补丁原图/numbers/79.png
doc/补丁原图/numbers/8.png
doc/补丁原图/numbers/80.png
doc/补丁原图/numbers/81.png
doc/补丁原图/numbers/82.png
doc/补丁原图/numbers/83.png
doc/补丁原图/numbers/84.png
doc/补丁原图/numbers/85.png
doc/补丁原图/numbers/86.png
doc/补丁原图/numbers/87.png
doc/补丁原图/numbers/88.png
doc/补丁原图/numbers/89.png
doc/补丁原图/numbers/9.png
doc/补丁原图/numbers/90.png
doc/补丁原图/numbers/91.png
doc/补丁原图/numbers/92.png
doc/补丁原图/numbers/93.png
doc/补丁原图/numbers/94.png
doc/补丁原图/numbers/95.png
doc/补丁原图/numbers/96.png
doc/补丁原图/numbers/97.png
doc/补丁原图/numbers/98.png
doc/补丁原图/numbers/99.png
doc/补丁原图/小地图/crow.png
doc/补丁原图/小地图/person.png
doc/补丁原图/怪/凛冬/(tn)dragonknight00.png

doc/补丁原图/怪/凛冬/(tn)dragonknight00.psd
Binary files differ
doc/补丁原图/怪/凛冬/(tn)dragonknight01.png

doc/补丁原图/怪/凛冬/(tn)dragonknight01.psd
Binary files differ
doc/补丁原图/怪/凛冬/angry_dragon.png

doc/补丁原图/怪/凛冬/angry_dragon.psd
Binary files differ
doc/补丁原图/怪/凛冬/babydragon.png

doc/补丁原图/怪/凛冬/babydragon.psd
Binary files differ
doc/补丁原图/怪/凛冬/babydragon_dead.png

doc/补丁原图/怪/凛冬/babydragon_dead.psd
Binary files differ
doc/补丁原图/怪/凛冬/babydragonmodify.png

doc/补丁原图/怪/凛冬/babydragonmodify.psd
Binary files differ
doc/补丁原图/怪/凛冬/babydragonmodify_dead.png

doc/补丁原图/怪/凛冬/babydragonmodify_dead.psd
Binary files differ
doc/补丁原图/怪/凛冬/black_dragon.png

doc/补丁原图/怪/凛冬/black_dragon.psd
Binary files differ
doc/补丁原图/怪/凛冬/brown_ser.png

doc/补丁原图/怪/凛冬/brown_ser.psd
Binary files differ
doc/补丁原图/怪/凛冬/dragon_blue_side.png

doc/补丁原图/怪/凛冬/dragon_blue_side.psd
Binary files differ
doc/补丁原图/怪/凛冬/dragon_knight.png

doc/补丁原图/怪/凛冬/dragon_knight.psd
Binary files differ
doc/补丁原图/怪/凛冬/dragon_normal_front.png

doc/补丁原图/怪/凛冬/dragon_normal_front.psd
Binary files differ
doc/补丁原图/怪/凛冬/dragon_normal_side.png

doc/补丁原图/怪/凛冬/dragon_normal_side.psd
Binary files differ
doc/补丁原图/怪/凛冬/dragon_red_front.png

doc/补丁原图/怪/凛冬/dragon_red_front.psd
Binary files differ
doc/补丁原图/怪/凛冬/dragonknight00.png

doc/补丁原图/怪/凛冬/dragonknight00.psd
Binary files differ
doc/补丁原图/怪/凛冬/dragonknight01.png

doc/补丁原图/怪/凛冬/dragonknight01.psd
Binary files differ
doc/补丁原图/怪/凛冬/dragonknight02.png

doc/补丁原图/怪/凛冬/dragonknight02.psd
Binary files differ
doc/补丁原图/怪/凛冬/dragonwizard.png

doc/补丁原图/怪/凛冬/dragonwizard.psd
Binary files differ
doc/补丁原图/怪/凛冬/fire_dragon.png

doc/补丁原图/怪/凛冬/fire_dragon.psd
Binary files differ
doc/补丁原图/怪/凛冬/harseseri.png

doc/补丁原图/怪/凛冬/harseseri.psd
Binary files differ
doc/补丁原图/怪/凛冬/hisma_baby.png

doc/补丁原图/怪/凛冬/hisma_baby.psd
Binary files differ
doc/补丁原图/怪/凛冬/loose_ser.png

doc/补丁原图/怪/凛冬/loose_ser.psd
Binary files differ
doc/补丁原图/怪/凛冬/looseseri.png

doc/补丁原图/怪/凛冬/looseseri.psd
Binary files differ
doc/补丁原图/怪/凛冬/scasa_baay.png

doc/补丁原图/怪/凛冬/scasa_baay.psd
Binary files differ
doc/补丁原图/怪/凛冬/scasababy.png

doc/补丁原图/怪/凛冬/scasababy.psd
Binary files differ
doc/补丁原图/怪/凛冬/scasaegg_stay.png

doc/补丁原图/怪/凛冬/scasaegg_stay.psd
Binary files differ
doc/补丁原图/怪/凛冬/selion.png

doc/补丁原图/怪/凛冬/selion.psd
Binary files differ
doc/补丁原图/怪/凛冬/serimalion.png

doc/补丁原图/怪/凛冬/serimalion.psd
Binary files differ
doc/补丁原图/怪/凛冬/shelder.png

doc/补丁原图/怪/凛冬/shelder.psd
Binary files differ
doc/补丁原图/怪/凛冬/spirazzi_baby.png

doc/补丁原图/怪/凛冬/spirazzi_baby.psd
Binary files differ
doc/补丁原图/怪/凛冬/spirazzi_baby_dead.png

doc/补丁原图/怪/凛冬/spirazzi_baby_dead.psd
Binary files differ
doc/补丁原图/怪/卡勒特之初/(tn)ghoulheadless.png
doc/补丁原图/怪/卡勒特之初/(tn)ghoulheadless.psd
Binary files differ
doc/补丁原图/怪/卡勒特之初/(tn)ghoulheadless_dead.png
doc/补丁原图/怪/卡勒特之初/(tn)ghoulheadless_dead.psd
Binary files differ
doc/补丁原图/怪/卡勒特之初/(tn)zzjo.png
doc/补丁原图/怪/卡勒特之初/(tn)zzjo.psd
Binary files differ
doc/补丁原图/怪/卡勒特之初/(tn)zzjo_dead.png
doc/补丁原图/怪/卡勒特之初/(tn)zzjo_dead.psd
Binary files differ
doc/补丁原图/怪/卡勒特之初/7shards_giselle.png
doc/补丁原图/怪/卡勒特之初/7shards_giselle.psd
Binary files differ
doc/补丁原图/怪/卡勒特之初/7shards_giselle_dead.png
doc/补丁原图/怪/卡勒特之初/7shards_giselle_dead.psd
Binary files differ
doc/补丁原图/怪/卡勒特之初/axeoutlaw.png
doc/补丁原图/怪/卡勒特之初/axeoutlaw.psd
Binary files differ
doc/补丁原图/怪/卡勒特之初/axeoutlaw_dead.png
doc/补丁原图/怪/卡勒特之初/axeoutlaw_dead.psd
Binary files differ
doc/补丁原图/怪/卡勒特之初/biker.png
doc/补丁原图/怪/卡勒特之初/biker.psd
Binary files differ
doc/补丁原图/怪/卡勒特之初/biker_dead.png
doc/补丁原图/怪/卡勒特之初/biker_dead.psd
Binary files differ
doc/补丁原图/怪/卡勒特之初/cartelvolunteer.png
doc/补丁原图/怪/卡勒特之初/cartelvolunteer.psd
Binary files differ
doc/补丁原图/怪/卡勒特之初/cartelvolunteer_dead.png
doc/补丁原图/怪/卡勒特之初/cartelvolunteer_dead.psd
Binary files differ
doc/补丁原图/怪/卡勒特之初/death_squad.png
doc/补丁原图/怪/卡勒特之初/death_squad.psd
Binary files differ
doc/补丁原图/怪/卡勒特之初/death_squad_dead.png
doc/补丁原图/怪/卡勒特之初/death_squad_dead.psd
Binary files differ
doc/补丁原图/怪/卡勒特之初/enjo.png
doc/补丁原图/怪/卡勒特之初/enjo.psd
Binary files differ
doc/补丁原图/怪/卡勒特之初/enjo_dead.png
doc/补丁原图/怪/卡勒特之初/enjo_dead.psd
Binary files differ
doc/补丁原图/怪/卡勒特之初/enjo_robot.png
doc/补丁原图/怪/卡勒特之初/enjo_robot.psd
Binary files differ
doc/补丁原图/怪/卡勒特之初/enjo_robot_dead.png
doc/补丁原图/怪/卡勒特之初/enjo_robot_dead.psd
Binary files differ
doc/补丁原图/怪/卡勒特之初/fatoutlaw.png
doc/补丁原图/怪/卡勒特之初/fatoutlaw.psd
Binary files differ
doc/补丁原图/怪/卡勒特之初/fatoutlaw_dead.png
doc/补丁原图/怪/卡勒特之初/fatoutlaw_dead.psd
Binary files differ
doc/补丁原图/怪/卡勒特之初/gunman.png
doc/补丁原图/怪/卡勒特之初/gunman.psd
Binary files differ
doc/补丁原图/怪/卡勒特之初/gunman_dead.png
doc/补丁原图/怪/卡勒特之初/gunman_dead.psd
Binary files differ
doc/补丁原图/怪/卡勒特之初/hass.png
doc/补丁原图/怪/卡勒特之初/hass.psd
Binary files differ
doc/补丁原图/怪/卡勒特之初/hass_dead.png
doc/补丁原图/怪/卡勒特之初/hass_dead.psd
Binary files differ
doc/补丁原图/怪/卡勒特之初/humanhunter.png
doc/补丁原图/怪/卡勒特之初/humanhunter.psd
Binary files differ
doc/补丁原图/怪/卡勒特之初/humanhunter_dead.png
doc/补丁原图/怪/卡勒特之初/humanhunter_dead.psd
Binary files differ
doc/补丁原图/怪/卡勒特之初/irigare.png
doc/补丁原图/怪/卡勒特之初/irigare.psd
Binary files differ
doc/补丁原图/怪/卡勒特之初/irigare_dead.png
doc/补丁原图/怪/卡勒特之初/irigare_dead.psd
Binary files differ
doc/补丁原图/怪/卡勒特之初/mechanicgiselle.png
doc/补丁原图/怪/卡勒特之初/mechanicgiselle.psd
Binary files differ
doc/补丁原图/怪/卡勒特之初/mechanicgiselle_dead.png
doc/补丁原图/怪/卡勒特之初/mechanicgiselle_dead.psd
Binary files differ
doc/补丁原图/怪/卡勒特之初/outlaw.png
doc/补丁原图/怪/卡勒特之初/outlaw.psd
Binary files differ
doc/补丁原图/怪/卡勒特之初/outlaw_dead.png
doc/补丁原图/怪/卡勒特之初/outlaw_dead.psd
Binary files differ
doc/补丁原图/怪/卡勒特之初/peyo.png
doc/补丁原图/怪/卡勒特之初/peyo.psd
Binary files differ
doc/补丁原图/怪/卡勒特之初/peyo_dead.png
doc/补丁原图/怪/卡勒特之初/peyo_dead.psd
Binary files differ
doc/补丁原图/怪/卡勒特之初/poena.png
doc/补丁原图/怪/卡勒特之初/poena.psd
Binary files differ
doc/补丁原图/怪/卡勒特之初/poena_dead.png
doc/补丁原图/怪/卡勒特之初/poena_dead.psd
Binary files differ
doc/补丁原图/怪/卡勒特之初/stick.png
doc/补丁原图/怪/卡勒特之初/stick.psd
Binary files differ
doc/补丁原图/怪/卡勒特之初/stick_dead.png
doc/补丁原图/怪/卡勒特之初/stick_dead.psd
Binary files differ
doc/补丁原图/怪/卡勒特之初/tretri.png
doc/补丁原图/怪/卡勒特之初/tretri.psd
Binary files differ
doc/补丁原图/怪/卡勒特之初/tretri_dead.png
doc/补丁原图/怪/卡勒特之初/tretri_dead.psd
Binary files differ
doc/补丁原图/怪/卡勒特之初/verrict.png
doc/补丁原图/怪/卡勒特之初/verrict.psd
Binary files differ
doc/补丁原图/怪/卡勒特之初/verrict_dead.png
doc/补丁原图/怪/卡勒特之初/verrict_dead.psd
Binary files differ
doc/补丁原图/怪/卡勒特之初/zzjo.png
doc/补丁原图/怪/卡勒特之初/zzjo.psd
Binary files differ
doc/补丁原图/怪/卡勒特之初/zzjo_dead.png
doc/补丁原图/怪/卡勒特之初/zzjo_dead.psd
Binary files differ
doc/补丁原图/数/0.png

doc/补丁原图/数/Number1.psd
Binary files differ
doc/补丁原图/门/timegate_left01.png

doc/补丁原图/门/timegate_left01.psd
Binary files differ
doc/补丁原图/门/timegate_right01.png

doc/补丁原图/门/timegate_right01.psd
Binary files differ
doc/补丁原图/门/门上的定位点说明.txt
New file
@@ -0,0 +1,5 @@
使用的数字
左0-9
右10-19
上20-29
下30-39
src/RichCreator.Editor/MainWindow.xaml
@@ -40,10 +40,14 @@
                <MenuItem Header="查找方框" Click="FindRectangle" />
                <MenuItem Header="查找加百利" Click="FindJiaBaili" />
                <MenuItem Header="查找定位点" Click="FindLocationPoint_Click" />
                <Separator/>
                <MenuItem Header="测试找线" Click="FindLines" />
                <Separator/>
                <MenuItem Header="查找定位点" Click="FindLocationPoint_Click" />
                
            </MenuItem>
            <MenuItem Header="工具(T)">
src/RichCreator.Editor/MainWindow.xaml.cs
@@ -29,6 +29,7 @@
using Orientation = RichCreator.Utility.Structs.Orientation;
using ZTImage.Collections;
namespace RichCreator.Editor
{
    /// <summary>
@@ -83,7 +84,7 @@
            string imagePath = string.Empty;
            Microsoft.Win32.OpenFileDialog ofd = new Microsoft.Win32.OpenFileDialog();
            ofd.DefaultExt = ".jpg";
            ofd.Filter = "jpg file|*.jpg";
            ofd.Filter = "jpg file|*.jpg;*.png";
            ofd.Multiselect = false;
            if (ofd.ShowDialog() == true)
            {
@@ -499,22 +500,17 @@
        /// <param name="e"></param>
        private void FindLocationPoint_Click(object sender, RoutedEventArgs e)
        {
            Image<Hsv, byte> hsvImage = new Image<Hsv, byte>(this.targetImage.Width, this.targetImage.Height);
            CvInvoke.CvtColor(this.targetImage, hsvImage, Emgu.CV.CvEnum.ColorConversion.Rgb2Hsv);
            MultiList<ZTRectangle, Int32> list = new MultiList<ZTRectangle, int>();
            ZTRectangle limit = new ZTRectangle(0, 0, this.targetImage.Width, this.targetImage.Height);
            if (DnfCVHelper.GetLocationPoint(out list,hsvImage,limit))
            ParametersPoint location = DnfCVHelper.GetLocationPoint(this.targetImage, limit);
            if (!location.Equals(ParametersPoint.Empty))
            {
                //找到位置显示出来
                for (int i = 0; i < list.Count; i++)
                {
                    ZTRectangle rect = list[i].Item1;
                    Int32 number = list[i].Item2;
                    DrawRectangle(rect.Start.X, rect.Start.Y, rect.End.X - rect.Start.X, rect.End.Y - rect.Start.Y, Colors.Green,number);
                }
                DrawRectangle(location.Point.X, location.Point.Y, 12, 10, Colors.Green, location.Parameter);
            }
            else
            {
                MessageBox.Show("未找到定位点");
            }
        }
@@ -1122,6 +1118,8 @@
            window.ShowDialog();
        }
src/RichCreator.Editor/Tools/MapEditor.xaml
@@ -18,15 +18,18 @@
                <StackPanel Orientation="Horizontal" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="0,4,0,0">
                    
                    <TextBlock Text="参数:" Margin="22 0 0 0" VerticalAlignment="Center" />
                    <TextBox Width="45" x:Name="tagNumber" Text="0" VerticalContentAlignment="Center"/>
                    <TextBox Width="100" x:Name="tagParameter" Text="0" VerticalContentAlignment="Center"/>
                    <ComboBox SelectedIndex="0" x:Name="slOperate">
                        <ComboBoxItem>障碍</ComboBoxItem>
                        <ComboBoxItem>定位点</ComboBoxItem>
                        <ComboBoxItem>寻路点</ComboBoxItem>
                        <ComboBoxItem>巡逻线</ComboBoxItem>
                        <ComboBoxItem>寻路线</ComboBoxItem>
                        <ComboBoxItem>测试起终点 </ComboBoxItem>
                        <ComboBoxItem>巡逻点</ComboBoxItem>
                        <ComboBoxItem>入门点</ComboBoxItem>
                        <ComboBoxItem>路径引导</ComboBoxItem>
                        <ComboBoxItem>读坐标</ComboBoxItem>
                        <ComboBoxItem>测试起终点</ComboBoxItem>
                    </ComboBox>
                    <Button Content="清空定位点" Margin="5 0" Click="ClearPosition_Click" />
                    <TextBlock VerticalAlignment="Center">除定位点外,其它物体右键删除。</TextBlock>
@@ -39,6 +42,9 @@
                    <Button Content="加载图片" Margin="5 0" Click="OpenFromFile_Click" />
                    <Button Content="复制为JSON" Margin="5 0" Click="CopyJSON_Click" />
                    <Button Content="加载JSON" Margin="5 0" Click="CreateFromJSON_Click" />
                    <Button Content="生成定位图片" Margin="5 0" Click="CreateLocationPicture" />
                </StackPanel>
            </Grid>
@@ -51,10 +57,8 @@
                <Canvas x:Name="HouseInfoLayer" />
                <Canvas x:Name="LocationPointLayer" IsHitTestVisible="False"/>
                <Canvas x:Name="StartEndPointLayer" IsHitTestVisible="False"/>
                <!--<Polyline StrokeThickness="1" Stroke="Black"    Opacity="0.5">
                    <Polyline.Points>10,50 180,50 180,150 </Polyline.Points>
                </Polyline>-->
                <Canvas x:Name="PathGuideLayer" IsHitTestVisible="False"/>
                <Canvas x:Name="PathGuideShapeLayer" />
            </Canvas>
        </ScrollViewer>
    </Grid>
src/RichCreator.Editor/Tools/MapEditor.xaml.cs
@@ -1,5 +1,6 @@
using Emgu.CV;
using RichCreator.Utility;
using RichCreator.Utility.Maps;
using RichCreator.Utility.PathFinding;
using RichCreator.Utility.PathFindings;
using RichCreator.Utility.Structs;
@@ -116,7 +117,7 @@
            //加载障碍物
            for (int i = 0; i < info.Obstacles.Count; i++)
            {
                Polygon polygon=CreateObstacleUI(info.Obstacles[i]);
                Polygon polygon = CreateObstacleUI(info.Obstacles[i]);
                this.HouseInfoLayer.Children.Add(polygon);
            }
@@ -135,23 +136,210 @@
                this.HouseInfoLayer.Children.Add(fp);
            }
            //加载巡逻线
            for (int i = 0; i < info.LoopLines.Count; i++)
            {
                Line llline = CreateLoopLineUI(info.LoopLines[i]);
                this.HouseInfoLayer.Children.Add(llline);
            }
            //加载寻路线
            for (int i = 0; i < info.FindPathLines.Count; i++)
            {
                Line fpline = CreateFindPathLineUI(info.FindPathLines[i]);
                this.HouseInfoLayer.Children.Add(fpline);
            }
            //加载巡逻点
            if (!info.LoopPoint.Equals(ZTPoint.Empty))
            {
                Canvas llline = CreateLoopPointUI(info.LoopPoint);
                this.HouseInfoLayer.Children.Add(llline);
            }
            //进门点
            for (int i = 0; i < info.NextGates.Count; i++)
            {
                Canvas ng = CreateNextGateUI(info.NextGates[i]);
                this.HouseInfoLayer.Children.Add(ng);
            }
            //加载导引区域
            for (int i = 0; i < info.PathGuides.Count; i++)
            {
                Polygon pg = CreatePathGuideUI(info.PathGuides[i]);
                this.PathGuideShapeLayer.Children.Add(pg);
            }
            this.housePathInfo = info;
        }
        /// <summary>
        /// 生成定位图片
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void CreateLocationPicture(object sender, RoutedEventArgs e)
        {
            string dir = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "numbers");
            if (!System.IO.Directory.Exists(dir))
            {
                System.IO.Directory.CreateDirectory(dir);
            }
            for (Int32 i = 0; i <= 255; i++)
            {
                byte number = (byte)i;
                System.Drawing.Bitmap image = new System.Drawing.Bitmap(12, 10);
                //1
                SetImagePixel(0, 0, 2, 2, image, System.Drawing.Color.White);
                SetImagePixel(2, 0, 3, 2, image, System.Drawing.Color.Black);
                SetImagePixel(5, 0, 2, 2, image, System.Drawing.Color.White);
                SetImagePixel(7, 0, 3, 2, image, System.Drawing.Color.Black);
                SetImagePixel(10, 0, 2, 2, image, System.Drawing.Color.White);
                //2
                SetImagePixel(0, 2, 2, 2, image, System.Drawing.Color.Black);
                SetImagePixel(10, 2, 2, 2, image, System.Drawing.Color.Black);
                //3
                SetImagePixel(0, 4, 2, 2, image, System.Drawing.Color.White);
                SetImagePixel(2, 4, 3, 2, image, System.Drawing.Color.Black);
                SetImagePixel(5, 4, 2, 2, image, System.Drawing.Color.White);
                SetImagePixel(7, 4, 3, 2, image, System.Drawing.Color.Black);
                SetImagePixel(10, 4, 2, 2, image, System.Drawing.Color.White);
                //4
                SetImagePixel(0, 6, 2, 2, image, System.Drawing.Color.Black);
                SetImagePixel(10, 6, 2, 2, image, System.Drawing.Color.Black);
                //5
                SetImagePixel(0, 8, 2, 2, image, System.Drawing.Color.White);
                SetImagePixel(2, 8, 3, 2, image, System.Drawing.Color.Black);
                SetImagePixel(5, 8, 2, 2, image, System.Drawing.Color.White);
                SetImagePixel(7, 8, 3, 2, image, System.Drawing.Color.Black);
                SetImagePixel(10, 8, 2, 2, image, System.Drawing.Color.White);
                Int32 x = 0, y = 0;
                for (int bit = 0; bit <= 7; bit++)
                {
                    GetBitCoordinate(out x, out y, bit);
                    if (HasValueInBit(number, bit))
                    {
                        SetImagePixel(x, y, 2, 2, image, System.Drawing.Color.White);
                    }
                    else
                    {
                        SetImagePixel(x, y, 2, 2, image, System.Drawing.Color.Black);
                    }
                }
                string saveDir = System.IO.Path.Combine(dir, number.ToString() + ".png");
                image.Save(saveDir, System.Drawing.Imaging.ImageFormat.Png);
            }
            MessageBox.Show("数字文件生成成功,生成至程序目录:numbers目录下");
        }
        /// <summary>
        /// 设置像素
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <param name="width"></param>
        /// <param name="height"></param>
        /// <param name="image"></param>
        /// <param name="color"></param>
        private void SetImagePixel(Int32 x, Int32 y, Int32 width, Int32 height, System.Drawing.Bitmap image, System.Drawing.Color color)
        {
            for (int w = 0; w < width; w++)
            {
                for (Int32 h = 0; h < height; h++)
                {
                    image.SetPixel(x + w, y + h, color);
                }
            }
        }
        /// <summary>
        /// 得到指定位坐标
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <param name="bitIndex"></param>
        private void GetBitCoordinate(out Int32 x, out Int32 y, Int32 bitIndex)
        {
            x = 0;
            y = 0;
            switch (bitIndex)
            {
                case 0:
                    x = 8;
                    y = 6;
                    break;
                case 1:
                    x = 6;
                    y = 6;
                    break;
                case 2:
                    x = 4;
                    y = 6;
                    break;
                case 3:
                    x = 2;
                    y = 6;
                    break;
                case 4:
                    x = 8;
                    y = 2;
                    break;
                case 5:
                    x = 6;
                    y = 2;
                    break;
                case 6:
                    x = 4;
                    y = 2;
                    break;
                case 7:
                    x = 2;
                    y = 2;
                    break;
            }
        }
        /// <summary>
        /// 得到数字指定位是否有值
        /// </summary>
        /// <param name="number"></param>
        /// <param name="bit"></param>
        /// <returns></returns>
        private bool HasValueInBit(byte number, Int32 bit)
        {
            switch (bit)
            {
                case 0:
                    return (number & 0b00000001) != 0;
                case 1:
                    return (number & 0b00000010) != 0;
                case 2:
                    return (number & 0b00000100) != 0;
                case 3:
                    return (number & 0b00001000) != 0;
                case 4:
                    return (number & 0b00010000) != 0;
                case 5:
                    return (number & 0b00100000) != 0;
                case 6:
                    return (number & 0b01000000) != 0;
                case 7:
                    return (number & 0b10000000) != 0;
            }
            return true;
        }
        /// <summary>
        /// 清理定位点
@@ -200,12 +388,10 @@
            ZTPoint start = this.startEndFindPathPoint[0];
            ZTPoint end = this.startEndFindPathPoint[1];
            DNFPathFinding finder = new DNFPathFinding(this.housePathInfo);
            HouseInfo house = new HouseInfo(this.housePathInfo);
            List<ZTPoint> path = house.FindPath(ref start, ref end);
            List<ZTPoint> path=finder.FindPath(ref start, ref end);
            if (path==null||path.Count <= 0)
            if (path == null || path.Count <= 0)
            {
                MessageBox.Show("不用寻路");
                return;
@@ -217,7 +403,7 @@
                for (int i = 0; i < path.Count; i++)
                {
                    Line line=GetPathLineUI(lastPoint, path[i]);
                    Line line = GetPathLineUI(lastPoint, path[i]);
                    this.StartEndPointLayer.Children.Add(line);
                    lastPoint = path[i];
                }
@@ -238,7 +424,8 @@
            }
            //是否添加障碍物
            OperateActionD op = (OperateActionD)(slOperate.SelectedIndex);
            Int32 number = TypeConverter.StringToInt(this.tagNumber.Text, 0);
            Int32 numParameter = TypeConverter.StringToInt(this.tagParameter.Text, 0);
            string strParameter = this.tagParameter.Text;
            if (e.LeftButton == MouseButtonState.Released)
            {
@@ -247,15 +434,10 @@
            Point point = GetPosition(e);
            if (op == OperateActionD.Obstacle)
            {
                //障碍物
            }
            else if (op == OperateActionD.LocationPoint)
            if (op == OperateActionD.LocationPoint)
            {
                //定位点
                ParametersPoint lp = new ParametersPoint(new ZTPoint((Int32)point.X, (Int32)point.Y), number);
                ParametersPoint lp = new ParametersPoint(new ZTPoint((Int32)point.X, (Int32)point.Y), numParameter);
                if (this.housePathInfo.AddLocationPosition(lp))
                {
                    Canvas lpControl = CreateLocationPointUI(lp);
@@ -272,17 +454,6 @@
                    this.HouseInfoLayer.Children.Add(fpControl);
                }
            }
            else if (op == OperateActionD.LoopLine)
            {
                //循环线
                ZTPoint llPoint = GetFindPathPoint(new ZTPoint((Int32)point.X, (Int32)point.Y));
                if (!llPoint.Equals(ZTPoint.Empty))
                {
                    tempLine = CreateTempLoopLineUI(llPoint);
                    this.HouseInfoLayer.Children.Add(tempLine);
                    moveable = true;
                }
            }
            else if (op == OperateActionD.FindPathLine)
            {
                //寻路线
@@ -294,6 +465,19 @@
                    moveable = true;
                }
            }
            else if (op == OperateActionD.LoopPoint)
            {
                //循环点
                if (!this.housePathInfo.LoopPoint.Equals(ZTPoint.Empty))
                {
                    //删除原来的巡逻点
                }
                ZTPoint sepoint = new ZTPoint((Int32)point.X, (Int32)point.Y);
                this.housePathInfo.LoopPoint = sepoint;
                Canvas lp = CreateLoopPointUI(sepoint);
                this.HouseInfoLayer.Children.Add(lp);
            }
            else if (op == OperateActionD.StartEndPoint)
            {
                //画寻路起始和终点
@@ -302,6 +486,28 @@
                this.StartEndPointLayer.Children.Add(lseControl);
                this.startEndFindPathPoint.Add(sepoint);
            }
            else if (op == OperateActionD.ReadCoordinate)
            {
                //读取坐标
                ZTPoint sepoint = new ZTPoint((Int32)point.X, (Int32)point.Y);
                this.tagParameter.Text = sepoint.X.ToString() + "," + sepoint.Y.ToString();
            }
            else if (op == OperateActionD.NextGate)
            {
                //下一关的门
                if (numParameter < 0 || numParameter > 3)
                {
                    MessageBox.Show("参数必须是:0:上1:右2:下3:左");
                    return;
                }
                ParametersPoint ng = new ParametersPoint(new ZTPoint((Int32)point.X, (Int32)point.Y), numParameter);
                if (this.housePathInfo.AddNextGate(ng))
                {
                    Canvas ngControl = CreateNextGateUI(ng);
                    this.HouseInfoLayer.Children.Add(ngControl);
                }
            }
        }
        /// <summary>
@@ -317,17 +523,7 @@
            }
            OperateActionD op = (OperateActionD)(slOperate.SelectedIndex);
            Point point = GetPosition(e);
            if (op == OperateActionD.LoopLine)
            {
                //巡逻线
                if (!moveable)
                {
                    return;
                }
                tempLine.X2 = point.X;
                tempLine.Y2 = point.Y;
            }
            else if (op == OperateActionD.FindPathLine)
            if (op == OperateActionD.FindPathLine)
            {
                //寻路线
                if (!moveable)
@@ -337,7 +533,7 @@
                tempLine.X2 = point.X;
                tempLine.Y2 = point.Y;
            }
            else if (op == OperateActionD.Obstacle)
            else if (op == OperateActionD.Obstacle||op==OperateActionD.PathGuide)
            {
                //障碍物线
                if (!moveable)
@@ -363,34 +559,7 @@
            OperateActionD op = (OperateActionD)(slOperate.SelectedIndex);
            Point point = GetPosition(e);
            if (op == OperateActionD.LoopLine)
            {
                //巡逻线
                if (!moveable)
                {
                    return;
                }
                moveable = false;
                if (tempLine == null)
                {
                    return;
                }
                ZTPoint startPoint = (ZTPoint)tempLine.Tag;
                ZTPoint centerPoint = GetFindPathPoint(new ZTPoint((Int32)point.X, (Int32)point.Y));
                if (!centerPoint.Equals(ZTPoint.Empty))
                {
                    ZTLinePoint ll = new ZTLinePoint(startPoint, centerPoint);
                    if (this.housePathInfo.AddLoopLine(ll))
                    {
                        Line llline = CreateLoopLineUI(ll);
                        this.HouseInfoLayer.Children.Add(llline);
                    }
                }
                this.HouseInfoLayer.Children.Remove(tempLine);
                tempLine = null;
            }
            else if (op == OperateActionD.FindPathLine)
            if (op == OperateActionD.FindPathLine)
            {
                //寻路线
                if (!moveable)
@@ -417,9 +586,9 @@
                this.HouseInfoLayer.Children.Remove(tempLine);
                tempLine = null;
            }
            else if (op == OperateActionD.Obstacle)
            else if (op == OperateActionD.Obstacle|| op == OperateActionD.PathGuide)
            {
                //绘制障碍物
                //绘制障碍物或路径指导
                //判断是否起点
                if (tempPolyline == null)
                {
@@ -441,21 +610,39 @@
                        return;
                    }
                    if (IsFirstPoint(point) && this.points.Count > 2)
                    if (IsComplete(point) && this.points.Count > 2)
                    {
                        //到起点,完成,向houseinfo里添加障碍物 ,画折线,
                        ZTPoint[] obstaclePoints = new ZTPoint[this.points.Count];
                        ZTPoint[] points = new ZTPoint[this.points.Count];
                        for (int i = 0; i < this.points.Count; i++)
                        {
                            obstaclePoints[i] = new ZTPoint((Int32)this.points[i].X, (Int32)this.points[i].Y);
                            points[i] = new ZTPoint((Int32)this.points[i].X, (Int32)this.points[i].Y);
                        }
                        ZTPolygon ztpolygon = new ZTPolygon(obstaclePoints);
                        this.housePathInfo.AddObstacle(ztpolygon);
                        ZTPolygon ztpolygon = new ZTPolygon(points);
                        if (op == OperateActionD.Obstacle)
                        {
                            //障碍物
                            this.housePathInfo.AddObstacle(ztpolygon);
                            Polygon obstacle = CreateObstacleUI(ztpolygon);
                            this.HouseInfoLayer.Children.Add(obstacle);
                        }
                        else if (op == OperateActionD.PathGuide)
                        {
                            //路径导引
                            string strParameter = this.tagParameter.Text;
                            string[] sp = strParameter.Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
                            if (sp.Length == 2)
                            {
                                ZTPoint targetPoint = new ZTPoint(TypeConverter.StringToInt(sp[0],0), TypeConverter.StringToInt(sp[1], 0));
                                ZTTargetPolygon targetPolygon = new ZTTargetPolygon(ztpolygon, targetPoint);
                        Polygon polygon = CreateObstacleUI(ztpolygon);
                        this.HouseInfoLayer.Children.Add(polygon);
                                this.housePathInfo.AddPathGuide(targetPolygon);
                                var pathGuide = CreatePathGuideUI(targetPolygon);
                                this.PathGuideShapeLayer.Children.Add(pathGuide);
                            }
                        }
                        this.HouseInfoLayer.Children.Remove(tempPolyline);
                        tempPolyline = null;
                        this.HouseInfoLayer.Children.Remove(tempLine);
@@ -620,60 +807,8 @@
            }
        }
        /// <summary>
        /// 创建巡逻线UI
        /// </summary>
        private Line CreateLoopLineUI(ZTLinePoint linePoint)
        {
            Line edgeLine = new Line();
            edgeLine.Tag = linePoint;
            edgeLine.MouseRightButtonUp += LoopLine_MouseRightButtonUp;
            edgeLine.Stroke = new SolidColorBrush(Colors.Red);
            edgeLine.StrokeThickness = 6;
            edgeLine.X1 = linePoint.X1;
            edgeLine.Y1 = linePoint.Y1;
            edgeLine.X2 = linePoint.X2;
            edgeLine.Y2 = linePoint.Y2;
            edgeLine.StrokeDashArray = new DoubleCollection() { 2, 3 };
            edgeLine.StrokeDashCap = PenLineCap.Triangle;
            edgeLine.StrokeEndLineCap = PenLineCap.Square;
            edgeLine.StrokeStartLineCap = PenLineCap.Round;
            return edgeLine;
        }
        /// <summary>
        /// 巡逻线右击
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void LoopLine_MouseRightButtonUp(object sender, MouseButtonEventArgs e)
        {
            Line c = sender as Line;
            if (c == null)
            {
                return;
            }
            ZTLinePoint fp = default(ZTLinePoint);
            try
            {
                fp = (ZTLinePoint)c.Tag;
            }
            catch
            {
                return;
            }
            if (this.housePathInfo.RemoveLoopLine(fp))
            {
                this.HouseInfoLayer.Children.Remove(c);
            }
        }
        /// <summary>
        /// 创建临时巡逻线UI
@@ -807,7 +942,7 @@
            polygon.Opacity = 0.7f;
            for (int i = 0; i < ztpolygon.Points.Length; i++)
            {
                polygon.Points.Add(new Point(ztpolygon.Points[i].X,ztpolygon.Points[i].Y));
                polygon.Points.Add(new Point(ztpolygon.Points[i].X, ztpolygon.Points[i].Y));
            }
            return polygon;
@@ -841,6 +976,127 @@
            }
        }
        /// <summary>
        /// 创建障碍物UI
        /// </summary>
        /// <returns></returns>
        private Polygon CreatePathGuideUI(ZTTargetPolygon ztpolygon)
        {
            Polygon polygon = new Polygon();
            polygon.Tag = ztpolygon;
            polygon.MouseRightButtonUp += PathGuide_MouseRightButtonUp;
            polygon.MouseEnter += PathGuide_MouseEnter;
            polygon.MouseLeave += PathGuide_MouseLeave;
            polygon.StrokeThickness = 1;
            polygon.Stroke = new SolidColorBrush(Colors.Yellow);
            polygon.Fill = new SolidColorBrush(Colors.Yellow);
            polygon.Opacity = 0.7f;
            for (int i = 0; i < ztpolygon.Polygon.Points.Length; i++)
            {
                polygon.Points.Add(new Point(ztpolygon.Polygon.Points[i].X, ztpolygon.Polygon.Points[i].Y));
            }
            return polygon;
        }
        /// <summary>
        /// 移出路径指导区域
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void PathGuide_MouseLeave(object sender, MouseEventArgs e)
        {
            this.PathGuideLayer.Children.Clear();
        }
        /// <summary>
        /// 移入路径指导区域
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void PathGuide_MouseEnter(object sender, MouseEventArgs e)
        {
            Polygon c = sender as Polygon;
            if (c == null)
            {
                return;
            }
            ZTTargetPolygon ztp = default(ZTTargetPolygon);
            try
            {
                ztp = (ZTTargetPolygon)c.Tag;
            }
            catch
            {
                return;
            }
            this.PathGuideLayer.Children.Clear();
            Canvas main = new Canvas();
            main.MouseRightButtonUp += NextGate_MouseRightButtonUp;
            Canvas.SetLeft(main, ztp.Target.X);
            Canvas.SetTop(main, ztp.Target.Y);
            Rectangle rect = new Rectangle();
            Canvas.SetLeft(rect, -10);
            Canvas.SetTop(rect, -10);
            rect.Width = 20;
            rect.Height = 20;
            rect.Stroke = new SolidColorBrush(Colors.Blue);
            rect.StrokeThickness = 1;
            rect.Fill = new SolidColorBrush(Colors.Blue);
            rect.Opacity = 0.5f;
            main.Children.Add(rect);
            Ellipse elli = new Ellipse();
            Canvas.SetLeft(elli, -2);
            Canvas.SetTop(elli, -2);
            elli.Width = 4;
            elli.Height = 4;
            elli.Stroke = new SolidColorBrush(Colors.Black);
            elli.StrokeThickness = 1;
            elli.Fill = new SolidColorBrush(Colors.Black);
            main.Children.Add(elli);
            TextBlock tb = new TextBlock();
            tb.Text = ztp.Target.ToString();
            tb.FontSize = 9;
            main.Children.Add(tb);
            this.PathGuideLayer.Children.Add(main);
        }
        /// <summary>
        /// 障碍物右键删除
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void PathGuide_MouseRightButtonUp(object sender, MouseButtonEventArgs e)
        {
            Polygon c = sender as Polygon;
            if (c == null)
            {
                return;
            }
            ZTTargetPolygon ztp = default(ZTTargetPolygon);
            try
            {
                ztp = (ZTTargetPolygon)c.Tag;
            }
            catch
            {
                return;
            }
            if (this.housePathInfo.RemovePathGuide(ztp))
            {
                this.PathGuideShapeLayer.Children.Remove(c);
            }
        }
        /// <summary>
        /// 创建临时障碍物线UI
@@ -915,7 +1171,7 @@
            elli.StrokeThickness = 1;
            elli.Fill = new SolidColorBrush(Colors.Black);
            main.Children.Add(elli);
            return main;
        }
@@ -939,6 +1195,132 @@
            return edgeLine;
        }
        /// <summary>
        /// 创建进入下一关的门UI
        /// 外方内圆
        /// </summary>
        private Canvas CreateNextGateUI(ParametersPoint point)
        {
            Canvas main = new Canvas();
            main.Tag = point;
            main.MouseRightButtonUp += NextGate_MouseRightButtonUp;
            Canvas.SetLeft(main, point.Point.X);
            Canvas.SetTop(main, point.Point.Y);
            Rectangle rect = new Rectangle();
            Canvas.SetLeft(rect, -10);
            Canvas.SetTop(rect, -10);
            rect.Width = 20;
            rect.Height = 20;
            rect.Stroke = new SolidColorBrush(Colors.GreenYellow);
            rect.StrokeThickness = 1;
            rect.Fill = new SolidColorBrush(Colors.GreenYellow);
            rect.Opacity = 0.5f;
            main.Children.Add(rect);
            Ellipse elli = new Ellipse();
            Canvas.SetLeft(elli, -2);
            Canvas.SetTop(elli, -2);
            elli.Width = 4;
            elli.Height = 4;
            elli.Stroke = new SolidColorBrush(Colors.Black);
            elli.StrokeThickness = 1;
            elli.Fill = new SolidColorBrush(Colors.Black);
            main.Children.Add(elli);
            TextBlock tb = new TextBlock();
            tb.Text = point.Parameter.ToString();
            tb.FontSize = 9;
            main.Children.Add(tb);
            return main;
        }
        private void NextGate_MouseRightButtonUp(object sender, MouseButtonEventArgs e)
        {
            Canvas c = sender as Canvas;
            if (c == null)
            {
                return;
            }
            ParametersPoint fp = default(ParametersPoint);
            try
            {
                fp = (ParametersPoint)c.Tag;
            }
            catch
            {
                return;
            }
            if (this.housePathInfo.RemoveNextGate(fp))
            {
                this.HouseInfoLayer.Children.Remove(c);
            }
        }
        /// <summary>
        /// 创建循环点界面
        /// </summary>
        /// <param name="point"></param>
        /// <returns></returns>
        private Canvas CreateLoopPointUI(ZTPoint point)
        {
            Canvas main = new Canvas();
            main.Tag = point;
            main.MouseRightButtonUp += LoopPoint_MouseRightButtonUp;
            Canvas.SetLeft(main, point.X);
            Canvas.SetTop(main, point.Y);
            Rectangle rect = new Rectangle();
            Canvas.SetLeft(rect, -10);
            Canvas.SetTop(rect, -10);
            rect.Width = 20;
            rect.Height = 20;
            rect.Stroke = new SolidColorBrush(Colors.OrangeRed);
            rect.StrokeThickness = 1;
            rect.Fill = new SolidColorBrush(Colors.OrangeRed);
            rect.Opacity = 0.5f;
            main.Children.Add(rect);
            Ellipse elli = new Ellipse();
            Canvas.SetLeft(elli, -2);
            Canvas.SetTop(elli, -2);
            elli.Width = 4;
            elli.Height = 4;
            elli.Stroke = new SolidColorBrush(Colors.Black);
            elli.StrokeThickness = 1;
            elli.Fill = new SolidColorBrush(Colors.Black);
            main.Children.Add(elli);
            return main;
        }
        private void LoopPoint_MouseRightButtonUp(object sender, MouseButtonEventArgs e)
        {
            Canvas c = sender as Canvas;
            if (c == null)
            {
                return;
            }
            ZTPoint fp = default(ZTPoint);
            try
            {
                fp = (ZTPoint)c.Tag;
            }
            catch
            {
                return;
            }
            this.housePathInfo.LoopPoint = ZTPoint.Empty;
            this.HouseInfoLayer.Children.Remove(c);
        }
        #endregion
@@ -968,7 +1350,7 @@
        /// </summary>
        /// <param name="point"></param>
        /// <returns></returns>
        private bool IsFirstPoint(Point point)
        private bool IsComplete(Point point)
        {
            Point temp = this.points[0];
            if (Math.Abs(temp.X - point.X) <= 10 && Math.Abs(temp.Y - point.Y) <= 10)
@@ -1004,10 +1386,14 @@
            Obstacle = 0,//障碍物
            LocationPoint,//定位点
            FindPathPoint,//寻路点
            LoopLine,//循环线
            FindPathLine,//寻路线
            LoopPoint,//循环点
            NextGate,//入门点
            PathGuide,//路径引导
            ReadCoordinate,//读取坐标
            StartEndPoint,//测试起终点
        }
    }
}
src/RichCreator.Utility/CV/DnfCVHelper.cs
@@ -441,11 +441,11 @@
            if (rects.Count <= 0)
            {
                return Structs.ZTPoint.Empty;
                return ZTPoint.Empty;
            }
            //主角位置
            Structs.ZTPoint rolePosition = gameRect.Start + new Structs.ZTPoint(rects[0].Start.X + rolePositionOffset.Width, rects[0].Start.Y + rolePositionOffset.Height);
            ZTPoint rolePosition = gameRect.Start.Add(rects[0].Start.X + rolePositionOffset.Width, rects[0].Start.Y + rolePositionOffset.Height);
            return rolePosition;
        }
@@ -536,7 +536,7 @@
        }
        #region Location Point 1
        private static readonly Hsv LocationPointMinHsv = new Hsv(0, 0, 0);
        private static readonly Hsv LocationPointMaxHsv = new Hsv(0, 0, 5);
        private static readonly ZTSize LocationPointMinLimitSize = new ZTSize(33, 33);
@@ -690,5 +690,348 @@
            return true;
        }
        #endregion
        #region Location Point 2
        private static ColorArray LocationPoint = ColorArray.FromColorString(0, 0, "800,352,0,0,0$791,343,255,255,255$793,343,0,0,0$796,343,255,255,255$798,343,0,0,0$801,343,255,255,255$802,345,0,0,0$802,347,255,255,255$802,349,0,0,0$802,352,255,255,255$797,352,255,255,255$795,352,0,0,0$791,352,255,255,255$791,350,0,0,0$791,348,255,255,255$791,346,0,0,0$796,347,255,255,255$797,348,255,255,255");
        /// <summary>
        /// 获取定位点
        /// </summary>
        /// <param name="image"></param>
        /// <param name="gameRect"></param>
        /// <returns></returns>
        public static ParametersPoint GetLocationPoint(Image<Rgb,byte> image,ZTRectangle gameRect)
        {
            ZTRectangle rect = ZTRectangle.Empty;
            if (CVHelper.FindColorArray(out rect, image, LocationPoint, gameRect))
            {
                //获取定位标记,解析参数
                byte number = 0;
                bool bitValue = true;
                Int32 x = 0, y = 0;
                for (int bitIndex = 0; bitIndex <= 7; bitIndex++)
                {
                    //获取图像中存值的坐标
                    GetBitCoordinate(out x, out y, bitIndex);
                    //解析并设置值
                    if (!ParseBit(out bitValue, image, rect.Start.Add(x, y)))
                    {
                        return ParametersPoint.Empty;
                    }
                    else
                    {
                        number=SetBit(number, bitIndex, bitValue);
                    }
                }
                return new ParametersPoint(rect.GetCenterPoint(), number);
            }
            return ParametersPoint.Empty;
        }
        /// <summary>
        /// 设置指定位
        /// </summary>
        /// <param name="number"></param>
        /// <param name="bitIndex"></param>
        /// <param name="bitValue"></param>
        /// <returns></returns>
        private static byte SetBit(byte number, Int32 bitIndex,bool bitValue)
        {
            byte twonumber = 0;
            switch (bitIndex)
            {
                case 0:
                    if (bitValue)
                    {
                        twonumber = 0b00000001;
                    }
                    else
                    {
                        twonumber = 0b11111110;
                    }
                    break;
                case 1:
                    if (bitValue)
                    {
                        twonumber = 0b00000010;
                    }
                    else
                    {
                        twonumber = 0b11111101;
                    }
                    break;
                case 2:
                    if (bitValue)
                    {
                        twonumber = 0b00000100;
                    }
                    else
                    {
                        twonumber = 0b11111011;
                    }
                    break;
                case 3:
                    if (bitValue)
                    {
                        twonumber = 0b00001000;
                    }
                    else
                    {
                        twonumber = 0b11110111;
                    }
                    break;
                case 4:
                    if (bitValue)
                    {
                        twonumber = 0b00010000;
                    }
                    else
                    {
                        twonumber = 0b11101111;
                    }
                    break;
                case 5:
                    if (bitValue)
                    {
                        twonumber = 0b00100000;
                    }
                    else
                    {
                        twonumber = 0b11011111;
                    }
                    break;
                case 6:
                    if (bitValue)
                    {
                        twonumber = 0b01000000;
                    }
                    else
                    {
                        twonumber = 0b10111111;
                    }
                    break;
                case 7:
                    if (bitValue)
                    {
                        twonumber = 0b10000000;
                    }
                    else
                    {
                        twonumber = 0b01111111;
                    }
                    break;
            }
            if (bitValue)
            {
                return (byte)(number | twonumber);
            }
            else
            {
                return (byte)(number & twonumber);
            }
        }
        /// <summary>
        /// 得到指定位坐标
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <param name="bitIndex"></param>
        private static void GetBitCoordinate(out Int32 x, out Int32 y, Int32 bitIndex)
        {
            x = 0;
            y = 0;
            switch (bitIndex)
            {
                case 0:
                    x = 8;
                    y = 6;
                    break;
                case 1:
                    x = 6;
                    y = 6;
                    break;
                case 2:
                    x = 4;
                    y = 6;
                    break;
                case 3:
                    x = 2;
                    y = 6;
                    break;
                case 4:
                    x = 8;
                    y = 2;
                    break;
                case 5:
                    x = 6;
                    y = 2;
                    break;
                case 6:
                    x = 4;
                    y = 2;
                    break;
                case 7:
                    x = 2;
                    y = 2;
                    break;
            }
        }
        /// <summary>
        /// 解析位状态
        /// true:1
        /// false:0
        /// </summary>
        /// <param name="bit"></param>
        /// <param name="image"></param>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <returns>true:解析成功,false:解析失败</returns>
        private static bool ParseBit(out bool bit,Image<Rgb, byte> image, ZTPoint point)
        {
            bit = true;
            if (image.Data[point.Y, point.X, 0] == 0xff && image.Data[point.Y, point.X, 1] == 0xff && image.Data[point.Y, point.X, 2] == 0xff&&
                image.Data[point.Y, point.X+1, 0] == 0xff && image.Data[point.Y, point.X+1, 1] == 0xff && image.Data[point.Y, point.X+1, 2] == 0xff&&
                image.Data[point.Y+1, point.X, 0] == 0xff && image.Data[point.Y+1, point.X, 1] == 0xff && image.Data[point.Y+1, point.X, 2] == 0xff&&
                image.Data[point.Y+1, point.X+1, 0] == 0xff && image.Data[point.Y+1, point.X+1, 1] == 0xff && image.Data[point.Y+1, point.X+1, 2] == 0xff)
            {
                //白
                bit = true;
                return true;
            }
            if (image.Data[point.Y, point.X, 0] == 0x00 && image.Data[point.Y, point.X, 1] == 0x00 && image.Data[point.Y, point.X, 2] == 0x00 &&
                image.Data[point.Y, point.X + 1, 0] == 0x00 && image.Data[point.Y, point.X + 1, 1] == 0x00 && image.Data[point.Y, point.X + 1, 2] == 0x00 &&
                image.Data[point.Y + 1, point.X, 0] == 0x00 && image.Data[point.Y + 1, point.X, 1] == 0x00 && image.Data[point.Y + 1, point.X, 2] == 0x00 &&
                image.Data[point.Y + 1, point.X + 1, 0] == 0x00 && image.Data[point.Y + 1, point.X + 1, 1] == 0x00 && image.Data[point.Y + 1, point.X + 1, 2] == 0x00)
            {
                //黑
                bit = false;
                return true;
            }
            return false;
        }
        #endregion
        #region minimap
        /// <summary>
        /// 小方格色块偏移
        /// </summary>
        private static ZTPoint[] colorOffset = new ZTPoint[] {
            new ZTPoint(2,14),
            new ZTPoint(2,15),
            new ZTPoint(15,14),
            new ZTPoint(15,15),
        };
        /// <summary>
        /// 已经走过的房间颜色(青色)
        /// </summary>
        private static ZTHsvFloatColor crossedColorMin = new ZTHsvFloatColor(0.498, 0.998, 0.998);
        private static ZTHsvFloatColor crossedColorMax = new ZTHsvFloatColor(0.502, 1, 1);
        /// <summary>
        /// 是否穿越过的房间(青色)
        /// </summary>
        /// <param name="image"></param>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <returns></returns>
        public static bool IsCrossedHouseColor(Image<Rgb, byte> image, Int32 x, Int32 y)
        {
            if (CVHelper.InRange(image.Data, x, y, crossedColorMin, crossedColorMax, colorOffset))
            {
                return true;
            }
            return false;
        }
        /// <summary>
        /// 当前房间颜色(蓝色)
        /// </summary>
        private static ZTHsvFloatColor currentHouseColorMin = new ZTHsvFloatColor(0.665f, 0.998, 0.998);
        private static ZTHsvFloatColor currentHouseColorMax = new ZTHsvFloatColor(0.669f, 1, 1);
        /// <summary>
        /// 是否当前房间(蓝色)
        /// </summary>
        /// <param name="image"></param>
        /// <param name="minMapStart"></param>
        /// <param name="houseIndex"></param>
        /// <returns></returns>
        public static bool IsCurrentHouseColor(Image<Rgb, byte> image, Int32 x, Int32 y)
        {
            if (CVHelper.InRange(image.Data, x, y, currentHouseColorMin, currentHouseColorMax, colorOffset))
            {
                return true;
            }
            return false;
        }
        /// <summary>
        /// 下一房间颜色(绿色)
        /// </summary>
        private static ZTHsvFloatColor nextHouseColorMin = new ZTHsvFloatColor(0.298f, 0.998, 0.998);
        private static ZTHsvFloatColor nextHouseColorMax = new ZTHsvFloatColor(0.302, 1, 1);
        /// <summary>
        /// 是否下一房间,绿色
        /// </summary>
        /// <param name="image"></param>
        /// <param name="minMapStart"></param>
        /// <param name="houseIndex"></param>
        /// <returns></returns>
        public static bool IsNextHouseColor(Image<Rgb, byte> image, Int32 x, Int32 y)
        {
            if (CVHelper.InRange(image.Data, x, y, nextHouseColorMin, nextHouseColorMax, colorOffset))
            {
                return true;
            }
            return false;
        }
        /// <summary>
        /// 最终房间颜色(红色1)
        /// </summary>
        private static ZTHsvFloatColor overHouse1ColorMin = new ZTHsvFloatColor(0, 0.998, 0.998);
        private static ZTHsvFloatColor overHouse1ColorMax = new ZTHsvFloatColor(0.002, 1, 1);
        /// <summary>
        /// 最终房间颜色(红色2)
        /// </summary>
        private static ZTHsvFloatColor overHouse2ColorMin = new ZTHsvFloatColor(0.998, 0.998, 0.998);
        private static ZTHsvFloatColor overHouse2ColorMax = new ZTHsvFloatColor(1.0f, 1, 1);
        /// <summary>
        /// 是否最终房间
        /// </summary>
        /// <param name="image"></param>
        /// <param name="minMapStart"></param>
        /// <param name="houseIndex"></param>
        /// <returns></returns>
        public static bool IsOverHouseColor(Image<Rgb, byte> image, Int32 x, Int32 y)
        {
            if (CVHelper.InRange(image.Data, x, y, overHouse1ColorMin, overHouse1ColorMax, colorOffset)
                || CVHelper.InRange(image.Data, x, y, overHouse2ColorMin, overHouse2ColorMax, colorOffset))
            {
                return true;
            }
            return false;
        }
        #endregion
    }
}
src/RichCreator.Utility/CV/KaleteCVHelper.cs
New file
@@ -0,0 +1,68 @@
using Emgu.CV;
using Emgu.CV.Structure;
using RichCreator.Utility.Structs;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace RichCreator.Utility.CV
{
    public class KaleteCVHelper
    {
        /// <summary>
        /// 卡勒特难度,1¬5级
        /// </summary>
        private static ColorArray[] KaleteNandu = new ColorArray[] {
            ColorArray.FromHsvFloatString(0.002f, 0.002f, 0.002f, "835,221,0,88,149$821,221,255,255,255$822,221,255,255,255$834,221,0,88,149$861,221,143,0,119$862,221,143,0,119$874,221,149,0,17$875,221,149,0,17"),
            ColorArray.FromHsvFloatString(0.002f, 0.002f, 0.002f, "848,221,88,0,149$821,221,88,149,0$822,221,88,149,0$834,221,255,255,255$835,221,255,255,255$849,221,88,0,149$861,221,143,0,119$862,221,143,0,119$874,221,149,0,17$875,221,149,0,17"),
            ColorArray.FromHsvFloatString(0.002f,0.002f,0.002f,"848,221,255,255,255$822,221,88,149,0$835,221,0,88,149$862,221,143,0,119$875,221,149,0,17"),
            ColorArray.FromHsvFloatString(0.002f, 0.002f, 0.002f, "848,221,88,0,149$822,221,88,149,0$835,221,0,88,149$862,221,255,255,255$875,221,149,0,17"),
            ColorArray.FromHsvFloatString(0.002f, 0.002f, 0.002f, "848,221,88,0,149$822,221,88,149,0$835,221,0,88,149$862,221,143,0,119$874,221,255,255,255")
        };
        /// <summary>
        /// 查找凛冬难度
        /// </summary>
        /// <param name="choiceNandu"></param>
        /// <param name="image"></param>
        /// <param name="gameRect"></param>
        /// <returns></returns>
        public static bool GetChoiceKaleteNandu(out Int32 choiceNandu, Image<Rgb, byte> image, ZTRectangle gameRect)
        {
            ZTRectangle limit = new ZTRectangle(gameRect.Start.X + 780, gameRect.Start.Y + 191, gameRect.Start.X + 911, gameRect.Start.Y + 234);
            ZTRectangle position = ZTRectangle.Empty;
            for (int i = 0; i < KaleteNandu.Length; i++)
            {
                if (CVHelper.FindColorArray(out position, image, KaleteNandu[i], limit))
                {
                    choiceNandu = i + 1;
                    return true;
                }
            }
            choiceNandu = 0;
            return false;
        }
        public static ColorArray KaleteTopText = ColorArray.FromHsvFloatString(0.002f, 0.002f, 0.3f, "1119,8,204,193,167$1102,8,0,0,0$1103,8,204,193,167$1104,8,0,0,0$1112,8,0,0,0$1113,8,204,193,167$1114,8,0,0,0$1115,8,204,193,167$1116,8,0,0,0$1118,8,0,0,0$1120,8,0,0,0$1124,8,0,0,0$1125,8,204,193,167$1126,8,0,0,0$1129,8,0,0,0$1130,8,204,193,167$1131,8,0,0,0$1137,8,0,0,0$1138,8,204,193,167$1139,8,0,0,0$1146,8,0,0,0$1147,8,204,193,167$1148,8,0,0,0$1156,19,0,0,0$1155,19,204,193,167$1154,19,204,193,167$1153,19,0,0,0$1151,19,0,0,0$1150,19,204,193,167$1149,19,0,0,0$1148,19,204,193,167$1147,19,0,0,0$1145,19,0,0,0$1144,19,204,193,167$1141,19,204,193,167$1140,19,204,193,167$1139,19,204,193,167$1138,19,0,0,0$1136,19,0,0,0$1135,19,204,193,167$1134,19,0,0,0$1132,19,0,0,0$1131,19,204,193,167$1129,19,204,193,167$1128,19,0,0,0$1126,19,0,0,0$1125,19,204,193,167$1124,19,0,0,0$1121,19,0,0,0$1120,19,204,193,167$1119,19,204,193,167$1118,19,0,0,0$1117,19,204,193,167$1116,19,0,0,0$1114,19,204,193,167$1113,19,0,0,0$1104,19,0,0,0$1103,19,204,193,167$1102,19,0,0,0$1114,9,204,193,167$1114,10,0,0,0$1114,12,204,193,167$1114,13,204,193,167$1114,14,204,193,167$1114,15,204,193,167$1114,16,204,193,167$1114,17,204,193,167$1114,18,204,193,167$1114,19,204,193,167$1130,20,0,0,0$1130,18,0,0,0$1129,18,0,0,0$1129,17,204,193,167$1129,16,0,0,0$1129,14,204,193,167$1129,13,0,0,0$1129,12,204,193,167$1129,11,0,0,0$1129,10,204,193,167$1129,9,0,0,0");
        /// <summary>
        /// 房间上是否存在卡勒特之初的文字
        /// </summary>
        /// <param name="image"></param>
        /// <param name="gameRect"></param>
        /// <returns></returns>
        public static bool ExistKaleteText(Image<Rgb, byte> image, ZTRectangle gameRect)
        {
            ZTRectangle limit = new ZTRectangle(gameRect.End.X - 200, gameRect.Start.Y, gameRect.End.X, gameRect.Start.Y + 40);
            ZTRectangle position = ZTRectangle.Empty;
            return CVHelper.FindColorArray(out position, image, KaleteTopText, limit);
        }
    }
}
src/RichCreator.Utility/CV/LindongCVHelper.cs
@@ -20,130 +20,7 @@
    public class LindongCVHelper
    {
        /// <summary>
        /// 小地图怪物颜色
        /// </summary>
        private static ZTHsvFloatColor minMinimapMainMonsterColor = new ZTHsvFloatColor(0.054f, 0.098f, 0.896f);
        private static ZTHsvFloatColor maxMinimapMainMonsterColor = new ZTHsvFloatColor(0.068f,   1.0f,   1.0f);
        /// <summary>
        /// 小地图主角颜色
        /// </summary>
        private static ZTHsvFloatColor minMinimapRoleColor = new ZTHsvFloatColor(0.508f, 0.860f, 0.731f);
        private static ZTHsvFloatColor maxMinimapRoleColor = new ZTHsvFloatColor(0.609f, 1f    ,     1f);
        /// <summary>
        /// 小方格主角偏移
        /// </summary>
        private static Structs.ZTPoint[] houseRoleBlockOffset = new Structs.ZTPoint[] {
            new Structs.ZTPoint(0,0),
            new Structs.ZTPoint(1,0),
            new Structs.ZTPoint(0,1),
            new Structs.ZTPoint(1,1)
        };
        
        /// <summary>
        /// 得到当前角色所在房间
        /// </summary>
        /// <param name="image"></param>
        /// <param name="minMapStart"></param>
        /// <param name="offset"></param>
        /// <returns></returns>
        public static bool GetCurrentHouseIndex(out Int32 houseIndex, Image<Rgb, byte> image, Structs.ZTPoint minMapStart)
        {
            houseIndex = -1;
            Int32 mainMonsterHouseIndex = -1;
            for (int i = 0; i < 20; i++)
            {
                Int32 row = i / 4;
                Int32 col = i % 4;
                //目标块第一块坐标
                Int32 x = minMapStart.X + col * 18;
                Int32 y = minMapStart.Y + row * 18;
                Structs.ZTPoint position = Structs.ZTPoint.Empty;
                ZTRectangle limit = new ZTRectangle(x, y, x + 17, y + 17);
                if (CVHelper.FindColorBlock(out position, image, limit, minMinimapRoleColor, maxMinimapRoleColor, houseRoleBlockOffset))
                {
                    houseIndex = i;
                    return true;
                }
                if (i == 15 )
                {
                    //查看,14格是否青色
                    if (CVHelper.InRange(image.Data, x-18, y, minMinimapCurrentColor, maxMinimapCurrentColor, houseColorBlockOffset))
                    {
                        //是否怪物图像
                        if (CVHelper.FindColorBlock(out position, image, limit, minMinimapMainMonsterColor, maxMinimapMainMonsterColor, houseRoleBlockOffset))
                        {
                            mainMonsterHouseIndex = 15;
                            break;
                        }
                        return true;
                    }
                }
            }
            if (mainMonsterHouseIndex > -1)
            {
                houseIndex = mainMonsterHouseIndex;
                return true;
            }
            return false;
        }
        /// <summary>
        /// 小地图已经走过的房间颜色(青色)
        /// </summary>
        private static ZTHsvFloatColor minMinimapCurrentColor = new ZTHsvFloatColor(0.498, 0.998, 0.998);
        private static ZTHsvFloatColor maxMinimapCurrentColor = new ZTHsvFloatColor(0.502, 1, 1);
        /// <summary>
        /// 小地图下一个房间的颜色(绿色)
        /// </summary>
        private static ZTHsvFloatColor minMinimapNextColor = new ZTHsvFloatColor(0.298, 0.998, 0.998);
        private static ZTHsvFloatColor maxMinimapNextColor = new ZTHsvFloatColor(0.302, 1, 1);
        /// <summary>
        /// 小方格色块偏移
        /// </summary>
        private static Structs.ZTPoint[] houseColorBlockOffset = new Structs.ZTPoint[] {
            new Structs.ZTPoint(2,2),
            new Structs.ZTPoint(2,3),
            new Structs.ZTPoint(15,14),
            new Structs.ZTPoint(15,15),
        };
        /// <summary>
        /// 房间是否开放
        /// </summary>
        /// <param name="houseIndex"></param>
        /// <returns></returns>
        public static bool HouseIsOpen(Image<Rgb, byte> image, Structs.ZTPoint minMapStart, Int32 houseIndex)
        {
            //第一块距上边15px,距左边1px
            Int32 row = houseIndex / 4;
            Int32 col = houseIndex % 4;
            //目标块第一块坐标
            Int32 x = minMapStart.X + col * 18;
            Int32 y = minMapStart.Y + row * 18;
            byte[,,] data = image.Data;
            if (CVHelper.InRange(data, x, y, minMinimapNextColor, maxMinimapNextColor, houseColorBlockOffset))
            {
                return true;
            }
            if (CVHelper.InRange(data, x, y, minMinimapCurrentColor, maxMinimapCurrentColor, houseColorBlockOffset))
            {
                return true;
            }
            return false;
        }
        private static Hsv minMonsterHsv = new Hsv(165, 247, 175);
src/RichCreator.Utility/Dnf/MoveIntent.cs
New file
@@ -0,0 +1,21 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace RichCreator.Utility.Dnf
{
    /// <summary>
    /// 移动意图
    /// </summary>
    public enum MoveIntent
    {
        None,//没移动
        AttackMove,//去攻击
        FindDoorMove,//去找门
        FindRoleMove,//找主角
        PickupMove//去拾取
    }
}
src/RichCreator.Utility/Dnf/MoveMethod.cs
New file
@@ -0,0 +1,20 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace RichCreator.Utility.Dnf
{
    /// <summary>
    /// 移动方式
    /// </summary>
    public enum MoveMethod
    {
        Vertical,//默认垂直移动
        ToLeft,//左移动
        ToRight,//右移动
        Fixed//固定离动距离
    }
}
src/RichCreator.Utility/Dnf/SpeedProvider.cs
New file
@@ -0,0 +1,118 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace RichCreator.Utility.Dnf
{
    /// <summary>
    /// 速度计算
    /// </summary>
    public class SpeedProvider
    {
        public static SpeedProvider Define = new SpeedProvider(1400);
        public SpeedProvider(Int32 speed)
        {
            double stepPixelPerSpeedX = 0;//步行 X每个速度一秒移动的像素数
            double stepPixelPerSpeedY = 0;//步行 Y每个速度半秒移动的像素数
            double runPixelPerSpeedX = 0;//跑 X每个速度一秒移动的像素数
            if (speed <= 1109)
            {
                stepPixelPerSpeedX = 160d/1109d;
                stepPixelPerSpeedY = 127d/1109d;
                runPixelPerSpeedX =  260d/1109d;
            }
            else if (speed > 1109 && speed <= 1151)
            {
                stepPixelPerSpeedX = 166.5d/1151d;
                stepPixelPerSpeedY = 131d/1151d;
                runPixelPerSpeedX = 267.7d/1151d;
            }
            else if (speed > 1151 && speed <= 1256)
            {
                stepPixelPerSpeedX = 180d/1256d;
                stepPixelPerSpeedY = 142.5d/1256d;
                runPixelPerSpeedX = 284.5d/1256d;
            }
            else if (speed > 1256 && speed <= 1400)
            {
                stepPixelPerSpeedX = 194.5d/1400d;
                stepPixelPerSpeedY = 156.5d/1400d;
                runPixelPerSpeedX = 320d/1400d;
            }
            else
            {
                stepPixelPerSpeedX = 194.5d / 1400d;
                stepPixelPerSpeedY = 156.5d / 1400d;
                runPixelPerSpeedX = 320d/ 1400d;
            }
            stepX = (stepPixelPerSpeedX * speed) / 1000;
            stepY = (stepPixelPerSpeedY * speed) / 1000;
            runX = (runPixelPerSpeedX * speed) / 800;
            RunThresold = stepX * RandomUtils.KeyPressDurationMax +runX * RandomUtils.KeyPressDurationMax;
            RandomMoveMillSecond = (Int32)(300 / stepX);
        }
        /// <summary>
        /// 开始跑的阀值
        /// </summary>
        public double RunThresold { get; private set; }
        //随机移动时间
        public Int32 RandomMoveMillSecond { get; private set; }
        private double stepX;
        /// <summary>
        /// 步行X轴速度
        /// </summary>
        public double StepX
        {
            get
            {
                return stepX;
            }
        }
        private double stepY;
        /// <summary>
        /// 步行Y轴速度
        /// </summary>
        public double StepY
        {
            get
            {
                return stepY;
            }
        }
        private double runX;
        /// <summary>
        /// 跑 X轴速度
        /// </summary>
        public double RunX
        {
            get
            {
                return runX;
            }
        }
        /// <summary>
        /// 跑 Y轴速度
        /// </summary>
        public double RunY
        {
            get
            {
                return StepY;
            }
        }
    }
}
src/RichCreator.Utility/Maps/FindPathInfo.cs
New file
@@ -0,0 +1,222 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace RichCreator.Utility.Maps
{
    /// <summary>
    /// 路径信息
    /// </summary>
    public class FindPathInfo
    {
        public FindPathInfo()
        {
            Vertexs = new List<VertexInfo>();
            Edges = new List<EdgeInfo>();
            Positions = new List<PointSerialize>();
        }
        public FindPathInfo(Int32 width,Int32 height,Int32 rowcount,Int32 colcount):this()
        {
            this.Width = width;
            this.Height = height;
            this.RowCount = rowcount;
            this.ColCount = colcount;
        }
        /// <summary>
        /// 宽
        /// </summary>
        public int Width { get; set; }
        /// <summary>
        /// 高
        /// </summary>
        public int Height { get; set; }
        /// <summary>
        /// 行数量
        /// </summary>
        public int RowCount { get; set; }
        /// <summary>
        /// 列数量
        /// </summary>
        public int ColCount { get; set; }
        /// <summary>
        /// 顶点列表,顶点x_index,y_index
        /// </summary>
        public List<VertexInfo> Vertexs { get; set; }
        /// <summary>
        /// 顶点连接信息,线信息ZTPoint是index ->index
        /// </summary>
        public List<EdgeInfo> Edges { get; set; }
        /// <summary>
        /// 定位信息
        /// </summary>
        public List<PointSerialize> Positions { get; set; }
        /// <summary>
        /// 添加靠近点
        /// </summary>
        /// <param name="vertex"></param>
        public void AddVertex(Int32 index,Int32 vertexType,Int32 nearVetexIndex)
        {
            VertexInfo vertex = new VertexInfo() { Index = index, VertexType = vertexType, NearVertexIndex = nearVetexIndex };
            AddVertex(vertex);
        }
        /// <summary>
        /// 添加靠近点
        /// </summary>
        /// <param name="vertex"></param>
        public void AddVertex(VertexInfo vertex)
        {
            for (int i = 0; i < Vertexs.Count; i++)
            {
                if (Vertexs[i].Index ==vertex.Index)
                {
                    this.Vertexs[i] = vertex;
                    return;
                }
            }
            this.Vertexs.Add(vertex);
        }
        /// <summary>
        /// 是否存在顶点
        /// </summary>
        /// <param name="index"></param>
        /// <returns></returns>
        public bool VertexCanAddEdge(Int32 index)
        {
            for (int i = 0; i < this.Vertexs.Count; i++)
            {
                if (this.Vertexs[i].Index==index)
                {
                    if (this.Vertexs[i].VertexType != 1)
                    {
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                }
            }
            return false;
        }
        /// <summary>
        /// 得到顶点的行列
        /// </summary>
        /// <param name="index"></param>
        /// <returns></returns>
        public void GetVertexRowColumn(out Int32 row,out Int32 col,int index)
        {
            row = index / this.ColCount;
            col = index % this.ColCount;
        }
        /// <summary>
        /// 获取json
        /// </summary>
        /// <returns></returns>
        public string ToJsonString()
        {
            string json = ZTImage.Json.JsonBuilder.ToJsonString(this);
            return json;
        }
        /// <summary>
        /// 从json字符串生成对象
        /// </summary>
        /// <param name="json"></param>
        /// <returns></returns>
        public static FindPathInfo FromJsonString(string json)
        {
            return ZTImage.Json.JsonParser.ToObject<FindPathInfo>(json);
        }
        /// <summary>
        /// 顶点信息
        /// </summary>
        public class VertexInfo
        {
            /// <summary>
            /// 顶点索引
            /// </summary>
            public Int32 Index { get; set; }
            /// <summary>
            /// 顶点类型,0:普通顶点,1:依附顶点,2:起点,3:终点
            /// </summary>
            public Int32 VertexType { get; set; }
            /// <summary>
            /// 依附顶点所依附顶点的索引
            /// </summary>
            public Int32 NearVertexIndex { get; set; }
        }
        /// <summary>
        /// 边信息
        /// </summary>
        public class EdgeInfo
        {
            /// <summary>
            /// 起点索引
            /// </summary>
            public Int32 StartIndex { get; set; }
            /// <summary>
            /// 终点索引
            /// </summary>
            public Int32 EndIndex { get; set; }
        }
        /// <summary>
        /// 可序列化点
        /// </summary>
        public class PointSerialize
        {
            public PointSerialize()
            {}
            public PointSerialize(Int32 x, Int32 y,Int32 number)
            {
                this.X = x;
                this.Y = y;
                this.Parameter = number;
            }
            public int X { get; set; }
            public int Y { get; set; }
            /// <summary>
            /// 参数
            /// </summary>
            public Int32 Parameter { get; set; }
        }
    }
}
src/RichCreator.Utility/Maps/HouseInfo.cs
New file
@@ -0,0 +1,393 @@
using RichCreator.Utility.Structs;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using RichCreator.Utility.Skills;
using RichCreator.Utility.InputControl;
using RichCreator.Utility.PathFinding;
using RichCreator.Utility.Utilitys;
namespace RichCreator.Utility.Maps
{
    /// <summary>
    /// 房间信息
    /// </summary>
    public class HouseInfo
    {
        public HouseInfo(HousePathInfo houseInfo)
        {
            this.HousePathInfo = houseInfo;
            InitPathInfo();
        }
        public HouseInfo(Int32 index,MapType mapType,bool isEnd, HIDCode[] skills)
        {
            this.Index = index;
            this.MapType = mapType;
            this.IsEnd = isEnd;
            Skills = new SkillQueue();
            for (int i = 0; skills!=null&&i < skills.Length; i++)
            {
                Skills.EnQueue(false,skills[i]);
            }
            if (index < 0)
            {
                throw new ArgumentOutOfRangeException("houseIndex");
            }
            try
            {
                this.HousePathInfo = HousePathInfo.From(this.MapType, index);
            }
            catch (Exception e)
            {
                throw e;
            }
            InitPathInfo();
        }
        /// <summary>
        /// 房间编号
        /// </summary>
        public Int32 Index { get; set; }
        ///// <summary>
        ///// 下一房间编号
        ///// </summary>
        //public Int32 NextIndex { get; set; }
        ///// <summary>
        ///// 判断下一房间是否打开索引
        ///// </summary>
        //public Int32 OpenStatusDetectIndex { get; set; }
        /// <summary>
        /// 门的位置
        /// </summary>
        public Direction[] DoorDirection { get; set; }
        /// <summary>
        /// 技能队列
        /// </summary>
        public SkillQueue Skills { get; set; }
        /// <summary>
        /// 房间的Y轴中间线,为负值,代表从游戏框向上移的像素值
        /// </summary>
        public Int32 HouseCenterMoveLine { get; set; }
        /// <summary>
        /// 是否为结束房间
        /// </summary>
        public bool IsEnd { get; set; }
        /// <summary>
        /// 地图类型
        /// </summary>
        public MapType MapType { get; set; }
        /// <summary>
        /// 房间信息
        /// </summary>
        public HousePathInfo HousePathInfo { get; private set; }
        /// <summary>
        /// 路径查找器
        /// </summary>
        private Dijkstra<ZTPoint> PathFinder { get; set; }
        /// <summary>
        /// 定位字典
        /// </summary>
        private Dictionary<Int32, ZTPoint> LocationDic = new Dictionary<int, ZTPoint>();
        /// <summary>
        /// 屏幕坐标转地图坐标
        /// </summary>
        /// <param name="screenCoordinate"></param>
        /// <param name="locationParameter"></param>
        /// <param name="locationCoordinate"></param>
        /// <returns></returns>
        public ZTPoint ScreenToMapCoordinate(ZTPoint screenCoordinate,ParametersPoint locationCoor)
        {
            if (!LocationDic.ContainsKey(locationCoor.Parameter))
            {
                throw new ArgumentOutOfRangeException("不存在的定位点,parameter:" + locationCoor.Parameter.ToString());
            }
            //目标屏幕坐标+(定位点地图坐标-定位点屏幕坐标)
            return screenCoordinate.Add(LocationDic[locationCoor.Parameter].Sub(locationCoor.Point));
        }
        /// <summary>
        /// 地图坐标转屏幕坐标
        /// </summary>
        /// <param name="mapCoordinate"></param>
        /// <param name="locationParameter"></param>
        /// <param name="locationCoordinate"></param>
        /// <returns></returns>
        public ZTPoint MapToScreenCoordinate(ZTPoint mapCoordinate, ParametersPoint locationCoor)
        {
            if (!LocationDic.ContainsKey(locationCoor.Parameter))
            {
                throw new ArgumentOutOfRangeException("不存在的定位点,parameter:" + locationCoor.Parameter.ToString());
            }
            //目标地图坐标-(定位点地图坐标-定位点屏幕坐标)
            return mapCoordinate.Sub(LocationDic[locationCoor.Parameter].Sub(locationCoor.Point));
        }
        /// <summary>
        /// 两点之间寻路
        /// </summary>
        /// <param name="start"></param>
        /// <param name="end"></param>
        public List<ZTPoint> FindPath(ref ZTPoint start, ref ZTPoint end)
        {
            if (start.Equals(end))
            {
                return new List<ZTPoint>();
            }
            //查询两点间是否连通
            if (Iscross(start, end))
            {
                //两点直接连通
                return new List<ZTPoint>() { end };
            }
            //确保两点不在障碍物里
            bool inObstacle = EnsureNotInObstacle(ref start);
            inObstacle = EnsureNotInObstacle(ref end) || inObstacle;
            //查询两点间是否连通
            if (inObstacle && Iscross(start, end))
            {
                //两点直接连通
                return new List<ZTPoint>() { end };
            }
            //把两点添加到寻路网中
            AddConnectivityEdgeToFinder(start, end);
            //寻路,组合路径
            List<ZTPoint> paths = this.PathFinder.ShortestPath(start, end);
            //去除寻路网中
            RemoveStartAndEndVerticeFromFinder(start, end);
            return paths;
        }
        /// <summary>
        /// 查找到下一关进门点
        /// </summary>
        /// <param name="rolePosition"></param>
        /// <returns></returns>
        public List<ZTPoint> FindDoorPath(out Int32 doorIndex,ZTPoint rolePosition)
        {
            doorIndex = 0;
            ZTPoint end = this.HousePathInfo.NextGates[0].Point;
            return FindPath(ref rolePosition, ref end);
        }
        /// <summary>
        /// 判断两点间是否连通
        /// </summary>
        /// <param name="start"></param>
        /// <param name="end"></param>
        /// <returns></returns>
        private bool Iscross(ZTPoint start, ZTPoint end)
        {
            for (int i = 0; i < this.HousePathInfo.Obstacles.Count; i++)
            {
                Intersection interSection = GeometryHelper.IntersectionOf(new ZTLinePoint(start, end), this.HousePathInfo.Obstacles[i]);
                if (interSection != Intersection.None)
                {
                    return false;
                }
            }
            return true;
        }
        /// <summary>
        /// 是否在障碍物里,如果在障碍物里则返回最近的不在障碍物点
        /// </summary>
        /// <param name="point"></param>
        /// <returns>true:在障碍物,false:不在障碍物里</returns>
        private bool EnsureNotInObstacle(ref ZTPoint point)
        {
            ZTPoint source = new ZTPoint(point.X, point.Y);
            ZTPolygon obstacle = ZTPolygon.Empty;
            for (int i = 0; i < this.HousePathInfo.Obstacles.Count; i++)
            {
                ZTPolygon temp = this.HousePathInfo.Obstacles[i];
                if (GeometryHelper.IntersectionOf(point, temp) != Intersection.None)
                {
                    obstacle = this.HousePathInfo.Obstacles[i];
                    break;
                }
            }
            if (obstacle.Equals(ZTPolygon.Empty))
            {
                //不在障碍物内
                return false;
            }
            //计算距离障碍物外最近的距离
            double distance = 0;
            ZTPoint lastPoint = ZTPoint.Empty;
            for (int i = 0; i < obstacle.Points.Length; i++)
            {
                if (i == 0)
                {
                    lastPoint = obstacle.Points[i];
                    distance = GeometryHelper.GetPointDistance(lastPoint, point);
                }
                double lastDistance = GeometryHelper.GetNearestDistance(new ZTLinePoint(lastPoint, obstacle[i]), point);
                if (lastDistance < distance)
                {
                    distance = lastDistance;
                }
                if (distance <= 0)
                {
                    distance = 0;
                    break;
                }
            }
            //查找最近离开障碍物的点
            ZTPoint testPoint = new ZTPoint(point.X, point.Y);
            Int32 maxDistance = Math.Max(Math.Max(point.X, this.HousePathInfo.Width - point.X), Math.Max(point.Y, this.HousePathInfo.Height - point.Y));
            for (int i = (Int32)distance; i < maxDistance; i++)
            {
                //下
                if (point.Y + i <= this.HousePathInfo.Height)
                {
                    testPoint = new ZTPoint(point.X, point.Y + i);
                    if (GeometryHelper.IntersectionOf(testPoint, obstacle) == Intersection.None)
                    {
                        testPoint.Y += 10;
                        point = testPoint;
                        break;
                    }
                }
                //右
                if (point.X <= this.HousePathInfo.Width)
                {
                    testPoint = new ZTPoint(point.X + i, point.Y);
                    if (GeometryHelper.IntersectionOf(testPoint, obstacle) == Intersection.None)
                    {
                        testPoint.X += 10;
                        point = testPoint;
                        break;
                    }
                }
                //左
                if (point.X - i >= 0)
                {
                    testPoint = new ZTPoint(point.X - i, point.Y);
                    if (GeometryHelper.IntersectionOf(testPoint, obstacle) == Intersection.None)
                    {
                        testPoint.X -= 10;
                        point = testPoint;
                        break;
                    }
                }
                //上
                if (point.Y - i >= 0)
                {
                    testPoint = new ZTPoint(point.X, point.Y - i);
                    if (GeometryHelper.IntersectionOf(testPoint, obstacle) == Intersection.None)
                    {
                        testPoint.Y -= 10;
                        point = testPoint;
                        break;
                    }
                }
            }
            return true;
        }
        /// <summary>
        /// 初始化寻路器
        /// </summary>
        private void InitPathInfo()
        {
            this.PathFinder = new Dijkstra<ZTPoint>();
            //添加寻路路径
            ZTLinePoint line;
            for (int i = 0; i < this.HousePathInfo.FindPathLines.Count; i++)
            {
                line = this.HousePathInfo.FindPathLines[i];
                this.PathFinder.AddEdge(line.P1, line.P2, line.GetDistance());
            }
            //定位点添加到字典
            for (int i = 0; i < this.HousePathInfo.LocationPoints.Count; i++)
            {
                ParametersPoint pp = this.HousePathInfo.LocationPoints[i];
                if (!this.LocationDic.ContainsKey(pp.Parameter))
                {
                    this.LocationDic.Add(pp.Parameter, pp.Point);
                }
            }
        }
        /// <summary>
        /// 向查找器中添加起点和终点可连通的边
        /// </summary>
        /// <param name="start"></param>
        /// <param name="end"></param>
        private void AddConnectivityEdgeToFinder(ZTPoint start, ZTPoint end)
        {
            Int32 distance = 0;
            ZTPoint point;
            for (int i = 0; i < this.HousePathInfo.FindPathPoints.Count; i++)
            {
                point = this.HousePathInfo.FindPathPoints[i];
                if (Iscross(start, point))
                {
                    distance = (Int32)GeometryHelper.GetPointDistance(start, point);
                    this.PathFinder.AddEdge(start, point, distance);
                }
                if (Iscross(end, point))
                {
                    distance = (Int32)GeometryHelper.GetPointDistance(end, point);
                    this.PathFinder.AddEdge(end, point, distance);
                }
            }
        }
        /// <summary>
        /// 从查找器中移除起点和终点
        /// </summary>
        /// <param name="start"></param>
        /// <param name="end"></param>
        private void RemoveStartAndEndVerticeFromFinder(ZTPoint start, ZTPoint end)
        {
            this.PathFinder.RemoveEdge(start);
            this.PathFinder.RemoveEdge(end);
        }
    }
}
src/RichCreator.Utility/Maps/HousePathInfo.cs
New file
@@ -0,0 +1,550 @@
using RichCreator.Utility.Structs;
using RichCreator.Utility.Utilitys;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace RichCreator.Utility.Maps
{
    /// <summary>
    /// 路径信息
    /// </summary>
    public class HousePathInfo
    {
        public HousePathInfo()
        {
            Obstacles = new List<ZTPolygon>();
            LocationPoints = new List<ParametersPoint>();
            FindPathPoints = new List<ZTPoint>();
            FindPathLines = new List<ZTLinePoint>();
            NextGates = new List<ParametersPoint>();
            PathGuides = new List<ZTTargetPolygon>();
            LoopPoint = new ZTPoint();
        }
        public HousePathInfo(Int32 width, Int32 height) : this()
        {
            this.Width = width;
            this.Height = height;
        }
        #region Propertys
        /// <summary>
        /// 宽
        /// </summary>
        public int Width { get; set; }
        /// <summary>
        /// 高
        /// </summary>
        public int Height { get; set; }
        /// <summary>
        /// 障碍物
        /// </summary>
        public List<ZTPolygon> Obstacles { get; set; }
        /// <summary>
        /// 定位点
        /// </summary>
        public List<ParametersPoint> LocationPoints { get; set; }
        /// <summary>
        /// 寻路点
        /// </summary>
        public List<ZTPoint> FindPathPoints { get; set; }
        /// <summary>
        /// 寻路线
        /// </summary>
        public List<ZTLinePoint> FindPathLines { get; set; }
        /// <summary>
        /// 巡逻点
        /// </summary>
        public ZTPoint LoopPoint { get; set; }
        /// <summary>
        /// 下一关进门点
        /// 参数意义 0:上 1:右  2:下  3:左
        /// </summary>
        public List<ParametersPoint> NextGates { get; set; }
        /// <summary>
        /// 路径向导,把某一区域的点导向某一点
        /// </summary>
        public List<ZTTargetPolygon> PathGuides { get; set; }
        #endregion
        #region Editor
        /// <summary>
        /// 添加障碍物
        /// </summary>
        /// <returns></returns>
        public bool AddObstacle(ZTPolygon obstacle)
        {
            Int32 index = 0;
            if (ExistsObstacle(out index, obstacle))
            {
                return false;
            }
            this.Obstacles.Add(obstacle);
            return true;
        }
        /// <summary>
        /// 删除障碍物
        /// </summary>
        /// <param name="obstacle"></param>
        /// <returns></returns>
        public bool RemoveObstacle(ZTPolygon obstacle)
        {
            Int32 index = 0;
            if (!ExistsObstacle(out index, obstacle))
            {
                return true;
            }
            this.Obstacles.RemoveAt(index);
            return true;
        }
        /// <summary>
        /// 是否存在障碍物
        /// </summary>
        /// <param name="obstacle"></param>
        /// <returns></returns>
        private bool ExistsObstacle(out Int32 index, ZTPolygon obstacle)
        {
            index = 0;
            for (int i = 0; i < Obstacles.Count; i++)
            {
                if (Obstacles[i] .Equals( obstacle))
                {
                    index = i;
                    return true;
                }
            }
            return false;
        }
        /// <summary>
        /// 添加定位点
        /// </summary>
        /// <param name="point"></param>
        /// <param name="parameters"></param>
        /// <returns></returns>
        public bool AddLocationPosition(ParametersPoint point)
        {
            if (this.LocationPoints.Exists((p) => { return point.Point.Equals(p.Point); }))
            {
                return false;
            }
            this.LocationPoints.Add(point);
            return true;
        }
        /// <summary>
        /// 清空定位点
        /// </summary>
        /// <returns></returns>
        public void ClearLocationPosiltion()
        {
            this.LocationPoints.Clear();
        }
        /// <summary>
        /// 添加寻路点
        /// </summary>
        /// <param name="point"></param>
        /// <returns></returns>
        public bool AddFindPathPoint(ZTPoint point)
        {
            Int32 index = 0;
            if (ExistsFindPathPoint(out index, point))
            {
                return false;
            }
            this.FindPathPoints.Add(point);
            return true;
        }
        /// <summary>
        /// 删除寻路点
        /// </summary>
        /// <param name="point"></param>
        /// <returns></returns>
        public bool RemoveFindPathPoint(ZTPoint point)
        {
            Int32 index = 0;
            if (!ExistsFindPathPoint(out index, point))
            {
                return true;
            }
            //查询巡逻线和寻路线是否有用到此点
            if (ExistsPointInAllLine(point))
            {
                return false;
            }
            this.FindPathPoints.RemoveAt(index);
            return true;
        }
        /// <summary>
        /// 是否存在指定寻路点
        /// </summary>
        /// <param name="index"></param>
        /// <param name="point"></param>
        /// <returns></returns>
        private bool ExistsFindPathPoint(out Int32 index, ZTPoint point)
        {
            index = 0;
            for (int i = 0; i < this.FindPathPoints.Count; i++)
            {
                if (this.FindPathPoints[i].Equals(point))
                {
                    index = i;
                    return true;
                }
            }
            return false;
        }
        /// <summary>
        /// 添加寻路线
        /// </summary>
        /// <param name="line"></param>
        /// <returns></returns>
        public bool AddFindPathLine(ZTLinePoint line)
        {
            Int32 index = 0;
            if (ExistsFindPathLine(out index, line))
            {
                return false;
            }
            this.FindPathLines.Add(line);
            return true;
        }
        /// <summary>
        /// 删除寻路线
        /// </summary>
        /// <param name="line"></param>
        /// <returns></returns>
        public bool RemoveFindPathLine(ZTLinePoint line)
        {
            Int32 index = 0;
            if (!ExistsFindPathLine(out index, line))
            {
                return true;
            }
            this.FindPathLines.RemoveAt(index);
            return true;
        }
        /// <summary>
        /// 是否存在寻路线
        /// </summary>
        /// <param name="index"></param>
        /// <param name="line"></param>
        /// <returns></returns>
        private bool ExistsFindPathLine(out Int32 index, ZTLinePoint line)
        {
            index = 0;
            for (int i = 0; i < this.FindPathLines.Count; i++)
            {
                if (this.FindPathLines[i] .Equals( line))
                {
                    index = i;
                    return true;
                }
            }
            return false;
        }
        /// <summary>
        /// 巡逻线或寻路线中是否存在某点
        /// </summary>
        /// <param name="point"></param>
        /// <returns></returns>
        private bool ExistsPointInAllLine(ZTPoint point)
        {
            for (int i = 0; i < this.FindPathLines.Count; i++)
            {
                if (this.FindPathLines[i].P1.Equals(point) || this.FindPathLines[i].P2.Equals(point))
                {
                    return true;
                }
            }
            return false;
        }
        /// <summary>
        /// 添加下一关的门
        /// </summary>
        /// <param name="point"></param>
        /// <returns></returns>
        public bool AddNextGate(ParametersPoint point)
        {
            Int32 index = 0;
            if (ExistsNextGate(out index, point))
            {
                return false;
            }
            this.NextGates.Add(point);
            return true;
        }
        /// <summary>
        /// 移除下一关的门
        /// </summary>
        /// <param name="point"></param>
        /// <returns></returns>
        public bool RemoveNextGate(ParametersPoint point)
        {
            Int32 index = 0;
            if (!ExistsNextGate(out index, point))
            {
                return true;
            }
            this.NextGates.RemoveAt(index);
            return true;
        }
        /// <summary>
        /// 是否存在到达下一关的点
        /// </summary>
        /// <param name="point"></param>
        /// <returns></returns>
        public bool ExistsNextGate(out Int32 index,ParametersPoint point)
        {
            index = -1;
            for (int i = 0; i < this.NextGates.Count; i++)
            {
                if (this.NextGates.Equals(point))
                {
                    index = i;
                    return true;
                }
            }
            return false;
        }
        /// <summary>
        /// 添加路径导引多边形
        /// </summary>
        /// <param name="polygon"></param>
        /// <returns></returns>
        public bool AddPathGuide(ZTTargetPolygon polygon)
        {
            Int32 index = 0;
            if (ExistsPathGuide(out index, polygon))
            {
                return false;
            }
            this.PathGuides.Add(polygon);
            return true;
        }
        /// <summary>
        /// 移除路径导引多边形
        /// </summary>
        /// <param name="polygon"></param>
        /// <returns></returns>
        public bool RemovePathGuide(ZTTargetPolygon polygon)
        {
            Int32 index = 0;
            if (!ExistsPathGuide(out index, polygon))
            {
                return true;
            }
            this.PathGuides.RemoveAt(index);
            return true;
        }
        /// <summary>
        /// 是否存在路径导引
        /// </summary>
        /// <param name="index"></param>
        /// <param name="polygon"></param>
        /// <returns></returns>
        public bool ExistsPathGuide(out Int32 index, ZTTargetPolygon polygon)
        {
            index = -1;
            for (int i = 0; i < this.PathGuides.Count; i++)
            {
                if (this.PathGuides.Equals(polygon))
                {
                    index = i;
                    return true;
                }
            }
            return false;
        }
        #endregion
        #region json info
        //凛冬
        private static readonly string[] Lingdong = new string[] {
            //0
            "{\"Width\":1350,\"Height\":901,\"Obstacles\":[],\"LocationPoints\":[],\"FindPathPoints\":[],\"LoopLines\":[],\"FindPathLines\":[]}",
            //1
            "{\"Width\":1350,\"Height\":901,\"Obstacles\":[],\"LocationPoints\":[],\"FindPathPoints\":[],\"LoopLines\":[],\"FindPathLines\":[]}",
            //2
            "{\"Width\":1350,\"Height\":901,\"Obstacles\":[],\"LocationPoints\":[],\"FindPathPoints\":[],\"LoopLines\":[],\"FindPathLines\":[]}",
            //3
            "{\"Width\":1350,\"Height\":901,\"Obstacles\":[],\"LocationPoints\":[],\"FindPathPoints\":[],\"LoopLines\":[],\"FindPathLines\":[]}",
            //4
            "{\"Width\":1350,\"Height\":901,\"Obstacles\":[],\"LocationPoints\":[],\"FindPathPoints\":[],\"LoopLines\":[],\"FindPathLines\":[]}",
            //5
            "{\"Width\":1350,\"Height\":901,\"Obstacles\":[],\"LocationPoints\":[],\"FindPathPoints\":[],\"LoopLines\":[],\"FindPathLines\":[]}",
            //6
            "{\"Width\":1350,\"Height\":901,\"Obstacles\":[],\"LocationPoints\":[],\"FindPathPoints\":[],\"LoopLines\":[],\"FindPathLines\":[]}",
            //7
            "{\"Width\":1350,\"Height\":901,\"Obstacles\":[],\"LocationPoints\":[],\"FindPathPoints\":[],\"LoopLines\":[],\"FindPathLines\":[]}",
            //8
            "{\"Width\":1350,\"Height\":901,\"Obstacles\":[],\"LocationPoints\":[],\"FindPathPoints\":[],\"LoopLines\":[],\"FindPathLines\":[]}",
            //9
            "{\"Width\":1350,\"Height\":901,\"Obstacles\":[],\"LocationPoints\":[],\"FindPathPoints\":[],\"LoopLines\":[],\"FindPathLines\":[]}",
            //10
            "{\"Width\":1350,\"Height\":901,\"Obstacles\":[],\"LocationPoints\":[],\"FindPathPoints\":[],\"LoopLines\":[],\"FindPathLines\":[]}",
            //11
            "{\"Width\":1350,\"Height\":901,\"Obstacles\":[],\"LocationPoints\":[],\"FindPathPoints\":[],\"LoopLines\":[],\"FindPathLines\":[]}",
            //12
            "{\"Width\":1350,\"Height\":901,\"Obstacles\":[],\"LocationPoints\":[],\"FindPathPoints\":[],\"LoopLines\":[],\"FindPathLines\":[]}",
            //13
            "{\"Width\":1350,\"Height\":901,\"Obstacles\":[],\"LocationPoints\":[],\"FindPathPoints\":[],\"LoopLines\":[],\"FindPathLines\":[]}",
            //14
            "{\"Width\":1350,\"Height\":901,\"Obstacles\":[],\"LocationPoints\":[],\"FindPathPoints\":[],\"LoopLines\":[],\"FindPathLines\":[]}",
            //15
            "{\"Width\":1350,\"Height\":901,\"Obstacles\":[],\"LocationPoints\":[],\"FindPathPoints\":[],\"LoopLines\":[],\"FindPathLines\":[]}",
            //16
            "{\"Width\":1350,\"Height\":901,\"Obstacles\":[],\"LocationPoints\":[],\"FindPathPoints\":[],\"LoopLines\":[],\"FindPathLines\":[]}",
            //17
            "{\"Width\":1350,\"Height\":901,\"Obstacles\":[],\"LocationPoints\":[],\"FindPathPoints\":[],\"LoopLines\":[],\"FindPathLines\":[]}",
            //18
            "{\"Width\":1350,\"Height\":901,\"Obstacles\":[],\"LocationPoints\":[],\"FindPathPoints\":[],\"LoopLines\":[],\"FindPathLines\":[]}",
            //19
            "{\"Width\":1350,\"Height\":901,\"Obstacles\":[],\"LocationPoints\":[],\"FindPathPoints\":[],\"LoopLines\":[],\"FindPathLines\":[]}"
        };
        //卡勒特
        private static readonly string[] Kalete = new string[] {
            //0:
            "{\"Width\":896,\"Height\":686,\"Obstacles\":[{\"Points\":[{\"X\":2,\"Y\":320},{\"X\":460,\"Y\":310},{\"X\":493,\"Y\":319},{\"X\":556,\"Y\":334},{\"X\":668,\"Y\":344},{\"X\":759,\"Y\":330},{\"X\":873,\"Y\":308},{\"X\":893,\"Y\":300},{\"X\":891,\"Y\":1},{\"X\":2,\"Y\":3}],\"Length\":10},{\"Points\":[{\"X\":2,\"Y\":552},{\"X\":71,\"Y\":545},{\"X\":76,\"Y\":427},{\"X\":165,\"Y\":439},{\"X\":166,\"Y\":521},{\"X\":253,\"Y\":559},{\"X\":703,\"Y\":550},{\"X\":703,\"Y\":521},{\"X\":823,\"Y\":513},{\"X\":834,\"Y\":568},{\"X\":893,\"Y\":559},{\"X\":893,\"Y\":684},{\"X\":4,\"Y\":683}],\"Length\":13}],\"LocationPoints\":[{\"Point\":{\"X\":797,\"Y\":348},\"Parameter\":0},{\"Point\":{\"X\":671,\"Y\":348},\"Parameter\":1},{\"Point\":{\"X\":547,\"Y\":348},\"Parameter\":2},{\"Point\":{\"X\":423,\"Y\":348},\"Parameter\":3},{\"Point\":{\"X\":298,\"Y\":347},\"Parameter\":4},{\"Point\":{\"X\":172,\"Y\":348},\"Parameter\":5},{\"Point\":{\"X\":47,\"Y\":348},\"Parameter\":6}],\"FindPathPoints\":[{\"X\":51,\"Y\":392},{\"X\":438,\"Y\":418},{\"X\":775,\"Y\":400}],\"LoopLines\":[],\"FindPathLines\":[{\"P1\":{\"X\":51,\"Y\":392},\"P2\":{\"X\":775,\"Y\":400}},{\"P1\":{\"X\":438,\"Y\":418},\"P2\":{\"X\":775,\"Y\":400}},{\"P1\":{\"X\":438,\"Y\":418},\"P2\":{\"X\":51,\"Y\":392}}],\"NextGates\":[{\"Point\":{\"X\":778,\"Y\":346},\"Parameter\":1}],\"PathGuides\":[]}",
            //1:
            "{\"Width\":1349,\"Height\":900,\"Obstacles\":[{\"Points\":[{\"X\":124,\"Y\":324},{\"X\":760,\"Y\":310},{\"X\":956,\"Y\":414},{\"X\":1124,\"Y\":372},{\"X\":1113,\"Y\":301},{\"X\":1346,\"Y\":297},{\"X\":1345,\"Y\":3},{\"X\":0,\"Y\":2},{\"X\":0,\"Y\":375}],\"Length\":9},{\"Points\":[{\"X\":1342,\"Y\":675},{\"X\":1189,\"Y\":675},{\"X\":1191,\"Y\":713},{\"X\":949,\"Y\":712},{\"X\":867,\"Y\":772},{\"X\":840,\"Y\":897},{\"X\":1345,\"Y\":899}],\"Length\":7},{\"Points\":[{\"X\":651,\"Y\":668},{\"X\":459,\"Y\":671},{\"X\":446,\"Y\":641},{\"X\":247,\"Y\":641},{\"X\":236,\"Y\":608},{\"X\":155,\"Y\":612},{\"X\":150,\"Y\":549},{\"X\":295,\"Y\":541},{\"X\":376,\"Y\":557},{\"X\":472,\"Y\":592},{\"X\":473,\"Y\":609},{\"X\":627,\"Y\":606}],\"Length\":12},{\"Points\":[{\"X\":565,\"Y\":815},{\"X\":464,\"Y\":737},{\"X\":0,\"Y\":721},{\"X\":1,\"Y\":896},{\"X\":839,\"Y\":894},{\"X\":851,\"Y\":815}],\"Length\":6}],\"LocationPoints\":[{\"Point\":{\"X\":270,\"Y\":462},\"Parameter\":0},{\"Point\":{\"X\":732,\"Y\":461},\"Parameter\":1},{\"Point\":{\"X\":1192,\"Y\":461},\"Parameter\":2},{\"Point\":{\"X\":708,\"Y\":344},\"Parameter\":8},{\"Point\":{\"X\":706,\"Y\":197},\"Parameter\":9},{\"Point\":{\"X\":706,\"Y\":53},\"Parameter\":10}],\"FindPathPoints\":[{\"X\":1211,\"Y\":323},{\"X\":193,\"Y\":419},{\"X\":1251,\"Y\":446},{\"X\":746,\"Y\":498},{\"X\":769,\"Y\":657},{\"X\":111,\"Y\":660}],\"LoopLines\":[{\"P1\":{\"X\":193,\"Y\":419},\"P2\":{\"X\":1251,\"Y\":446}}],\"FindPathLines\":[{\"P1\":{\"X\":193,\"Y\":419},\"P2\":{\"X\":746,\"Y\":498}},{\"P1\":{\"X\":746,\"Y\":498},\"P2\":{\"X\":1251,\"Y\":446}},{\"P1\":{\"X\":746,\"Y\":498},\"P2\":{\"X\":769,\"Y\":657}},{\"P1\":{\"X\":769,\"Y\":657},\"P2\":{\"X\":1251,\"Y\":446}},{\"P1\":{\"X\":769,\"Y\":657},\"P2\":{\"X\":193,\"Y\":419}},{\"P1\":{\"X\":1251,\"Y\":446},\"P2\":{\"X\":1211,\"Y\":323}},{\"P1\":{\"X\":769,\"Y\":657},\"P2\":{\"X\":1211,\"Y\":323}},{\"P1\":{\"X\":111,\"Y\":660},\"P2\":{\"X\":193,\"Y\":419}},{\"P1\":{\"X\":111,\"Y\":660},\"P2\":{\"X\":769,\"Y\":657}}]}",
            string.Empty,//2
            //3:
            "{\"Width\":1348,\"Height\":900,\"Obstacles\":[{\"Points\":[{\"X\":0,\"Y\":313},{\"X\":927,\"Y\":295},{\"X\":963,\"Y\":334},{\"X\":1275,\"Y\":314},{\"X\":1343,\"Y\":300},{\"X\":1343,\"Y\":2},{\"X\":1,\"Y\":1}],\"Length\":7},{\"Points\":[{\"X\":878,\"Y\":366},{\"X\":750,\"Y\":369},{\"X\":733,\"Y\":354},{\"X\":740,\"Y\":325},{\"X\":876,\"Y\":324}],\"Length\":5},{\"Points\":[{\"X\":1345,\"Y\":551},{\"X\":1170,\"Y\":587},{\"X\":1173,\"Y\":643},{\"X\":1275,\"Y\":713},{\"X\":1346,\"Y\":706}],\"Length\":5},{\"Points\":[{\"X\":285,\"Y\":307},{\"X\":312,\"Y\":576},{\"X\":195,\"Y\":626},{\"X\":208,\"Y\":691},{\"X\":153,\"Y\":723},{\"X\":150,\"Y\":897},{\"X\":2,\"Y\":896},{\"X\":0,\"Y\":319}],\"Length\":8},{\"Points\":[{\"X\":156,\"Y\":752},{\"X\":369,\"Y\":714},{\"X\":793,\"Y\":734},{\"X\":932,\"Y\":822},{\"X\":1032,\"Y\":814},{\"X\":1058,\"Y\":896},{\"X\":159,\"Y\":894}],\"Length\":7},{\"Points\":[{\"X\":1037,\"Y\":824},{\"X\":1243,\"Y\":820},{\"X\":1229,\"Y\":748},{\"X\":1269,\"Y\":718},{\"X\":1344,\"Y\":709},{\"X\":1345,\"Y\":896},{\"X\":1064,\"Y\":897}],\"Length\":7}],\"LocationPoints\":[{\"Point\":{\"X\":1108,\"Y\":329},\"Parameter\":8},{\"Point\":{\"X\":1107,\"Y\":182},\"Parameter\":9},{\"Point\":{\"X\":1107,\"Y\":37},\"Parameter\":10}],\"FindPathPoints\":[{\"X\":358,\"Y\":342},{\"X\":378,\"Y\":505},{\"X\":1270,\"Y\":415},{\"X\":1038,\"Y\":650}],\"LoopLines\":[{\"P1\":{\"X\":358,\"Y\":342},\"P2\":{\"X\":1038,\"Y\":650}}],\"FindPathLines\":[{\"P1\":{\"X\":358,\"Y\":342},\"P2\":{\"X\":1270,\"Y\":415}},{\"P1\":{\"X\":1270,\"Y\":415},\"P2\":{\"X\":1038,\"Y\":650}},{\"P1\":{\"X\":1270,\"Y\":415},\"P2\":{\"X\":378,\"Y\":505}},{\"P1\":{\"X\":378,\"Y\":505},\"P2\":{\"X\":358,\"Y\":342}},{\"P1\":{\"X\":378,\"Y\":505},\"P2\":{\"X\":1038,\"Y\":650}}]}",
            string.Empty,//4
            string.Empty,//5
            //6:
            "{\"Width\":1350,\"Height\":900,\"Obstacles\":[{\"Points\":[{\"X\":325,\"Y\":425},{\"X\":437,\"Y\":447},{\"X\":567,\"Y\":437},{\"X\":565,\"Y\":395},{\"X\":631,\"Y\":398},{\"X\":675,\"Y\":410},{\"X\":809,\"Y\":405},{\"X\":810,\"Y\":375},{\"X\":933,\"Y\":329},{\"X\":1279,\"Y\":303},{\"X\":1345,\"Y\":367},{\"X\":1345,\"Y\":5},{\"X\":1,\"Y\":6}],\"Length\":13},{\"Points\":[{\"X\":1347,\"Y\":481},{\"X\":1246,\"Y\":501},{\"X\":1235,\"Y\":551},{\"X\":1188,\"Y\":617},{\"X\":1192,\"Y\":669},{\"X\":1348,\"Y\":673}],\"Length\":6},{\"Points\":[{\"X\":1349,\"Y\":701},{\"X\":791,\"Y\":719},{\"X\":803,\"Y\":659},{\"X\":396,\"Y\":665},{\"X\":361,\"Y\":723},{\"X\":2,\"Y\":711},{\"X\":0,\"Y\":896},{\"X\":1345,\"Y\":898}],\"Length\":8}],\"LocationPoints\":[{\"Point\":{\"X\":1080,\"Y\":425},\"Parameter\":4},{\"Point\":{\"X\":592,\"Y\":427},\"Parameter\":5},{\"Point\":{\"X\":103,\"Y\":427},\"Parameter\":6}],\"FindPathPoints\":[{\"X\":174,\"Y\":537},{\"X\":1197,\"Y\":430},{\"X\":602,\"Y\":502}],\"LoopLines\":[{\"P1\":{\"X\":174,\"Y\":537},\"P2\":{\"X\":1197,\"Y\":430}}],\"FindPathLines\":[{\"P1\":{\"X\":174,\"Y\":537},\"P2\":{\"X\":602,\"Y\":502}},{\"P1\":{\"X\":602,\"Y\":502},\"P2\":{\"X\":1197,\"Y\":430}}]}",
            //7:
            "{\"Width\":1350,\"Height\":900,\"Obstacles\":[{\"Points\":[{\"X\":31,\"Y\":409},{\"X\":127,\"Y\":312},{\"X\":505,\"Y\":351},{\"X\":570,\"Y\":394},{\"X\":733,\"Y\":418},{\"X\":888,\"Y\":410},{\"X\":896,\"Y\":334},{\"X\":1066,\"Y\":328},{\"X\":1100,\"Y\":401},{\"X\":1315,\"Y\":425},{\"X\":1349,\"Y\":427},{\"X\":1343,\"Y\":1},{\"X\":4,\"Y\":4},{\"X\":1,\"Y\":341}],\"Length\":14},{\"Points\":[{\"X\":467,\"Y\":896},{\"X\":472,\"Y\":733},{\"X\":325,\"Y\":676},{\"X\":178,\"Y\":636},{\"X\":0,\"Y\":625},{\"X\":2,\"Y\":900}],\"Length\":6}],\"LocationPoints\":[{\"Point\":{\"X\":270,\"Y\":462},\"Parameter\":0},{\"Point\":{\"X\":730,\"Y\":463},\"Parameter\":1},{\"Point\":{\"X\":1191,\"Y\":463},\"Parameter\":2},{\"Point\":{\"X\":1078,\"Y\":499},\"Parameter\":4},{\"Point\":{\"X\":589,\"Y\":497},\"Parameter\":5},{\"Point\":{\"X\":100,\"Y\":498},\"Parameter\":6}],\"FindPathPoints\":[{\"X\":146,\"Y\":440},{\"X\":1226,\"Y\":720}],\"LoopLines\":[{\"P1\":{\"X\":146,\"Y\":440},\"P2\":{\"X\":1226,\"Y\":720}}],\"FindPathLines\":[]}",
            //8:
            "{\"Width\":1686,\"Height\":720,\"Obstacles\":[{\"Points\":[{\"X\":2,\"Y\":420},{\"X\":130,\"Y\":439},{\"X\":311,\"Y\":462},{\"X\":313,\"Y\":400},{\"X\":221,\"Y\":319},{\"X\":453,\"Y\":288},{\"X\":632,\"Y\":5},{\"X\":4,\"Y\":2}],\"Length\":8},{\"Points\":[{\"X\":574,\"Y\":104},{\"X\":743,\"Y\":319},{\"X\":961,\"Y\":306},{\"X\":1014,\"Y\":343},{\"X\":1099,\"Y\":326},{\"X\":1165,\"Y\":369},{\"X\":1534,\"Y\":365},{\"X\":1684,\"Y\":309},{\"X\":1680,\"Y\":4},{\"X\":633,\"Y\":5}],\"Length\":10},{\"Points\":[{\"X\":1682,\"Y\":470},{\"X\":1540,\"Y\":514},{\"X\":1442,\"Y\":590},{\"X\":1173,\"Y\":641},{\"X\":858,\"Y\":670},{\"X\":814,\"Y\":708},{\"X\":1681,\"Y\":715}],\"Length\":7}],\"LocationPoints\":[{\"Point\":{\"X\":277,\"Y\":501},\"Parameter\":0},{\"Point\":{\"X\":735,\"Y\":502},\"Parameter\":1},{\"Point\":{\"X\":1196,\"Y\":502},\"Parameter\":2},{\"Point\":{\"X\":1418,\"Y\":390},\"Parameter\":4},{\"Point\":{\"X\":930,\"Y\":387},\"Parameter\":5},{\"Point\":{\"X\":441,\"Y\":388},\"Parameter\":6}],\"FindPathPoints\":[{\"X\":186,\"Y\":483},{\"X\":1565,\"Y\":393},{\"X\":549,\"Y\":448}],\"LoopLines\":[{\"P1\":{\"X\":186,\"Y\":483},\"P2\":{\"X\":1565,\"Y\":393}}],\"FindPathLines\":[{\"P1\":{\"X\":186,\"Y\":483},\"P2\":{\"X\":549,\"Y\":448}},{\"P1\":{\"X\":549,\"Y\":448},\"P2\":{\"X\":1565,\"Y\":393}}]}",
            //9:
            "{\"Width\":1688,\"Height\":720,\"Obstacles\":[{\"Points\":[{\"X\":3,\"Y\":333},{\"X\":390,\"Y\":305},{\"X\":600,\"Y\":389},{\"X\":746,\"Y\":389},{\"X\":766,\"Y\":327},{\"X\":890,\"Y\":334},{\"X\":914,\"Y\":247},{\"X\":1092,\"Y\":225},{\"X\":1305,\"Y\":396},{\"X\":1489,\"Y\":346},{\"X\":1684,\"Y\":411},{\"X\":1683,\"Y\":3},{\"X\":3,\"Y\":3}],\"Length\":13},{\"Points\":[{\"X\":389,\"Y\":671},{\"X\":398,\"Y\":614},{\"X\":868,\"Y\":605},{\"X\":1037,\"Y\":631},{\"X\":1125,\"Y\":589},{\"X\":1536,\"Y\":632},{\"X\":1678,\"Y\":682},{\"X\":1682,\"Y\":715},{\"X\":378,\"Y\":715}],\"Length\":9}],\"LocationPoints\":[{\"Point\":{\"X\":274,\"Y\":500},\"Parameter\":0},{\"Point\":{\"X\":738,\"Y\":502},\"Parameter\":1},{\"Point\":{\"X\":1200,\"Y\":501},\"Parameter\":2},{\"Point\":{\"X\":1658,\"Y\":503},\"Parameter\":3}],\"FindPathPoints\":[{\"X\":216,\"Y\":456},{\"X\":1545,\"Y\":466},{\"X\":985,\"Y\":515}],\"LoopLines\":[{\"P1\":{\"X\":216,\"Y\":456},\"P2\":{\"X\":1545,\"Y\":466}}],\"FindPathLines\":[{\"P1\":{\"X\":216,\"Y\":456},\"P2\":{\"X\":985,\"Y\":515}},{\"P1\":{\"X\":985,\"Y\":515},\"P2\":{\"X\":1545,\"Y\":466}}]}",
            string.Empty,//10
            //11:
            "{\"Width\":1686,\"Height\":720,\"Obstacles\":[{\"Points\":[{\"X\":1678,\"Y\":410},{\"X\":1576,\"Y\":341},{\"X\":1258,\"Y\":344},{\"X\":1241,\"Y\":379},{\"X\":1153,\"Y\":380},{\"X\":849,\"Y\":377},{\"X\":765,\"Y\":353},{\"X\":598,\"Y\":352},{\"X\":498,\"Y\":387},{\"X\":0,\"Y\":360},{\"X\":1,\"Y\":1},{\"X\":1681,\"Y\":2}],\"Length\":12},{\"Points\":[{\"X\":1566,\"Y\":714},{\"X\":1502,\"Y\":662},{\"X\":875,\"Y\":654},{\"X\":780,\"Y\":660},{\"X\":550,\"Y\":636},{\"X\":365,\"Y\":614},{\"X\":183,\"Y\":626},{\"X\":72,\"Y\":636},{\"X\":10,\"Y\":655},{\"X\":0,\"Y\":715}],\"Length\":10}],\"LocationPoints\":[{\"Point\":{\"X\":929,\"Y\":450},\"Parameter\":5},{\"Point\":{\"X\":440,\"Y\":452},\"Parameter\":6},{\"Point\":{\"X\":1416,\"Y\":451},\"Parameter\":4}],\"FindPathPoints\":[{\"X\":71,\"Y\":469},{\"X\":1529,\"Y\":462},{\"X\":826,\"Y\":576}],\"LoopLines\":[{\"P1\":{\"X\":71,\"Y\":469},\"P2\":{\"X\":1529,\"Y\":462}}],\"FindPathLines\":[{\"P1\":{\"X\":71,\"Y\":469},\"P2\":{\"X\":826,\"Y\":576}},{\"P1\":{\"X\":826,\"Y\":576},\"P2\":{\"X\":1529,\"Y\":462}}]}",
            //12:
            "{\"Width\":2024,\"Height\":720,\"Obstacles\":[{\"Points\":[{\"X\":795,\"Y\":351},{\"X\":1897,\"Y\":323},{\"X\":2019,\"Y\":271},{\"X\":2019,\"Y\":4},{\"X\":1,\"Y\":2},{\"X\":3,\"Y\":347},{\"X\":111,\"Y\":400},{\"X\":200,\"Y\":377},{\"X\":294,\"Y\":344},{\"X\":560,\"Y\":351},{\"X\":623,\"Y\":381}],\"Length\":11},{\"Points\":[{\"X\":2020,\"Y\":614},{\"X\":1464,\"Y\":615},{\"X\":1137,\"Y\":589},{\"X\":895,\"Y\":606},{\"X\":855,\"Y\":715},{\"X\":2020,\"Y\":716}],\"Length\":6},{\"Points\":[{\"X\":525,\"Y\":715},{\"X\":451,\"Y\":589},{\"X\":156,\"Y\":603},{\"X\":2,\"Y\":495},{\"X\":2,\"Y\":716}],\"Length\":5}],\"LocationPoints\":[{\"Point\":{\"X\":270,\"Y\":461},\"Parameter\":0},{\"Point\":{\"X\":731,\"Y\":461},\"Parameter\":1},{\"Point\":{\"X\":1192,\"Y\":462},\"Parameter\":2},{\"Point\":{\"X\":1650,\"Y\":463},\"Parameter\":3},{\"Point\":{\"X\":1278,\"Y\":347},\"Parameter\":5},{\"Point\":{\"X\":788,\"Y\":347},\"Parameter\":6},{\"Point\":{\"X\":301,\"Y\":346},\"Parameter\":7},{\"Point\":{\"X\":628,\"Y\":175},\"Parameter\":8},{\"Point\":{\"X\":627,\"Y\":28},\"Parameter\":9}],\"FindPathPoints\":[{\"X\":201,\"Y\":457},{\"X\":1894,\"Y\":423},{\"X\":699,\"Y\":513}],\"LoopLines\":[{\"P1\":{\"X\":201,\"Y\":457},\"P2\":{\"X\":1894,\"Y\":423}}],\"FindPathLines\":[{\"P1\":{\"X\":201,\"Y\":457},\"P2\":{\"X\":699,\"Y\":513}},{\"P1\":{\"X\":699,\"Y\":513},\"P2\":{\"X\":1894,\"Y\":423}}]}",
            //13:
            "{\"Width\":2024,\"Height\":900,\"Obstacles\":[{\"Points\":[{\"X\":1607,\"Y\":189},{\"X\":1761,\"Y\":360},{\"X\":2022,\"Y\":405},{\"X\":2022,\"Y\":1},{\"X\":1565,\"Y\":1}],\"Length\":5},{\"Points\":[{\"X\":1350,\"Y\":400},{\"X\":1605,\"Y\":186},{\"X\":1562,\"Y\":1},{\"X\":121,\"Y\":1},{\"X\":335,\"Y\":410},{\"X\":385,\"Y\":402}],\"Length\":6},{\"Points\":[{\"X\":2017,\"Y\":719},{\"X\":1228,\"Y\":729},{\"X\":1137,\"Y\":666},{\"X\":667,\"Y\":689},{\"X\":417,\"Y\":671},{\"X\":123,\"Y\":649},{\"X\":121,\"Y\":891},{\"X\":2020,\"Y\":896}],\"Length\":8},{\"Points\":[{\"X\":294,\"Y\":564},{\"X\":121,\"Y\":566},{\"X\":122,\"Y\":19},{\"X\":322,\"Y\":394},{\"X\":233,\"Y\":457}],\"Length\":5},{\"Points\":[{\"X\":1,\"Y\":2},{\"X\":127,\"Y\":3},{\"X\":128,\"Y\":896},{\"X\":0,\"Y\":894}],\"Length\":4}],\"LocationPoints\":[{\"Point\":{\"X\":537,\"Y\":496},\"Parameter\":0},{\"Point\":{\"X\":997,\"Y\":497},\"Parameter\":1},{\"Point\":{\"X\":1458,\"Y\":497},\"Parameter\":2},{\"Point\":{\"X\":1918,\"Y\":496},\"Parameter\":3},{\"Point\":{\"X\":777,\"Y\":484},\"Parameter\":6},{\"Point\":{\"X\":1266,\"Y\":484},\"Parameter\":5},{\"Point\":{\"X\":1753,\"Y\":485},\"Parameter\":4}],\"FindPathPoints\":[{\"X\":425,\"Y\":495},{\"X\":1885,\"Y\":496},{\"X\":1294,\"Y\":541}],\"LoopLines\":[{\"P1\":{\"X\":425,\"Y\":495},\"P2\":{\"X\":1885,\"Y\":496}}],\"FindPathLines\":[{\"P1\":{\"X\":425,\"Y\":495},\"P2\":{\"X\":1294,\"Y\":541}},{\"P1\":{\"X\":1294,\"Y\":541},\"P2\":{\"X\":1885,\"Y\":496}}]}",
            //14:
            "{\"Width\":1687,\"Height\":901,\"Obstacles\":[{\"Points\":[{\"X\":98,\"Y\":310},{\"X\":408,\"Y\":314},{\"X\":418,\"Y\":425},{\"X\":530,\"Y\":416},{\"X\":593,\"Y\":451},{\"X\":721,\"Y\":452},{\"X\":762,\"Y\":449},{\"X\":783,\"Y\":337},{\"X\":840,\"Y\":302},{\"X\":1207,\"Y\":300},{\"X\":1239,\"Y\":321},{\"X\":1418,\"Y\":320},{\"X\":1584,\"Y\":378},{\"X\":1679,\"Y\":377},{\"X\":1681,\"Y\":4},{\"X\":4,\"Y\":4},{\"X\":0,\"Y\":436}],\"Length\":17},{\"Points\":[{\"X\":1681,\"Y\":717},{\"X\":1319,\"Y\":706},{\"X\":1165,\"Y\":653},{\"X\":1053,\"Y\":654},{\"X\":835,\"Y\":609},{\"X\":732,\"Y\":624},{\"X\":680,\"Y\":667},{\"X\":0,\"Y\":650},{\"X\":0,\"Y\":898},{\"X\":1682,\"Y\":898}],\"Length\":10}],\"LocationPoints\":[{\"Point\":{\"X\":278,\"Y\":481},\"Parameter\":0},{\"Point\":{\"X\":739,\"Y\":481},\"Parameter\":1},{\"Point\":{\"X\":1200,\"Y\":479},\"Parameter\":2},{\"Point\":{\"X\":1656,\"Y\":480},\"Parameter\":3}],\"FindPathPoints\":[{\"X\":140,\"Y\":474},{\"X\":1453,\"Y\":466},{\"X\":763,\"Y\":520},{\"X\":373,\"Y\":565}],\"LoopLines\":[{\"P1\":{\"X\":140,\"Y\":474},\"P2\":{\"X\":1453,\"Y\":466}}],\"FindPathLines\":[{\"P1\":{\"X\":140,\"Y\":474},\"P2\":{\"X\":373,\"Y\":565}},{\"P1\":{\"X\":140,\"Y\":474},\"P2\":{\"X\":763,\"Y\":520}},{\"P1\":{\"X\":373,\"Y\":565},\"P2\":{\"X\":763,\"Y\":520}},{\"P1\":{\"X\":763,\"Y\":520},\"P2\":{\"X\":1453,\"Y\":466}},{\"P1\":{\"X\":373,\"Y\":565},\"P2\":{\"X\":1453,\"Y\":466}}]}",
            string.Empty,//15
            //16:
            "{\"Width\":1687,\"Height\":901,\"Obstacles\":[{\"Points\":[{\"X\":3,\"Y\":385},{\"X\":257,\"Y\":388},{\"X\":655,\"Y\":320},{\"X\":711,\"Y\":264},{\"X\":1682,\"Y\":279},{\"X\":1682,\"Y\":1},{\"X\":0,\"Y\":4}],\"Length\":7},{\"Points\":[{\"X\":5,\"Y\":713},{\"X\":265,\"Y\":754},{\"X\":432,\"Y\":862},{\"X\":405,\"Y\":900},{\"X\":1,\"Y\":896}],\"Length\":5},{\"Points\":[{\"X\":720,\"Y\":883},{\"X\":825,\"Y\":776},{\"X\":1034,\"Y\":851},{\"X\":985,\"Y\":900},{\"X\":712,\"Y\":900}],\"Length\":5},{\"Points\":[{\"X\":1173,\"Y\":871},{\"X\":1569,\"Y\":644},{\"X\":1674,\"Y\":661},{\"X\":1684,\"Y\":772},{\"X\":1679,\"Y\":887},{\"X\":1187,\"Y\":893},{\"X\":1200,\"Y\":852}],\"Length\":7}],\"LocationPoints\":[{\"Point\":{\"X\":1391,\"Y\":410},\"Parameter\":4},{\"Point\":{\"X\":905,\"Y\":409},\"Parameter\":5},{\"Point\":{\"X\":416,\"Y\":410},\"Parameter\":6}],\"FindPathPoints\":[{\"X\":633,\"Y\":693},{\"X\":1494,\"Y\":434},{\"X\":139,\"Y\":505},{\"X\":834,\"Y\":367}],\"LoopLines\":[{\"P1\":{\"X\":139,\"Y\":505},\"P2\":{\"X\":1494,\"Y\":434}}],\"FindPathLines\":[{\"P1\":{\"X\":139,\"Y\":505},\"P2\":{\"X\":834,\"Y\":367}},{\"P1\":{\"X\":834,\"Y\":367},\"P2\":{\"X\":1494,\"Y\":434}},{\"P1\":{\"X\":633,\"Y\":693},\"P2\":{\"X\":1494,\"Y\":434}},{\"P1\":{\"X\":633,\"Y\":693},\"P2\":{\"X\":834,\"Y\":367}},{\"P1\":{\"X\":633,\"Y\":693},\"P2\":{\"X\":139,\"Y\":505}}]}",
            //17:
            "{\"Width\":1687,\"Height\":720,\"Obstacles\":[{\"Points\":[{\"X\":1681,\"Y\":368},{\"X\":1591,\"Y\":363},{\"X\":1487,\"Y\":252},{\"X\":1475,\"Y\":4},{\"X\":1683,\"Y\":3}],\"Length\":5},{\"Points\":[{\"X\":1348,\"Y\":358},{\"X\":544,\"Y\":345},{\"X\":534,\"Y\":453},{\"X\":115,\"Y\":450},{\"X\":0,\"Y\":390},{\"X\":0,\"Y\":3},{\"X\":1480,\"Y\":3},{\"X\":1487,\"Y\":245}],\"Length\":8},{\"Points\":[{\"X\":108,\"Y\":685},{\"X\":76,\"Y\":720},{\"X\":1682,\"Y\":718},{\"X\":1684,\"Y\":683}],\"Length\":4}],\"LocationPoints\":[{\"Point\":{\"X\":276,\"Y\":499},\"Parameter\":0},{\"Point\":{\"X\":736,\"Y\":502},\"Parameter\":1},{\"Point\":{\"X\":1198,\"Y\":500},\"Parameter\":2},{\"Point\":{\"X\":1655,\"Y\":502},\"Parameter\":3}],\"FindPathPoints\":[{\"X\":196,\"Y\":514},{\"X\":1622,\"Y\":491},{\"X\":605,\"Y\":518}],\"LoopLines\":[{\"P1\":{\"X\":196,\"Y\":514},\"P2\":{\"X\":1622,\"Y\":491}}],\"FindPathLines\":[{\"P1\":{\"X\":196,\"Y\":514},\"P2\":{\"X\":605,\"Y\":518}},{\"P1\":{\"X\":605,\"Y\":518},\"P2\":{\"X\":1622,\"Y\":491}}]}",
        };
        /// <summary>
        /// 获取json
        /// </summary>
        /// <returns></returns>
        public string ToJsonString()
        {
            HousePathInfoObj obj=HousePathInfoObj.From(this);
            string json = ZTImage.Json.JsonBuilder.ToJsonString(obj);
            return json;
        }
        /// <summary>
        /// 从json字符串生成对象
        /// </summary>
        /// <param name="json"></param>
        /// <returns></returns>
        public static HousePathInfo FromJsonString(string json)
        {
            HousePathInfoObj obj= ZTImage.Json.JsonParser.ToObject<HousePathInfoObj>(json);
            return obj.To();
        }
        public static HousePathInfo From(MapType mapType, Int32 houseIndex)
        {
            string info = null;
            if (mapType == MapType.Lingdong)
            {
                if (houseIndex > Lingdong.Length - 1)
                {
                    throw new ArgumentOutOfRangeException("houseIndex");
                }
                info = Lingdong[houseIndex];
            }
            else if (mapType == MapType.Kalete)
            {
                if (houseIndex > Kalete.Length - 1)
                {
                    throw new ArgumentOutOfRangeException("houseIndex");
                }
                info = Kalete[houseIndex];
            }
            try
            {
                return HousePathInfo.FromJsonString(info);
            }
            catch (Exception e)
            {
                throw e;
            }
        }
        #endregion
    }
}
src/RichCreator.Utility/Maps/MapType.cs
New file
@@ -0,0 +1,20 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace RichCreator.Utility.Maps
{
    public enum MapType:Int32
    {
        Lingdong =0,//凛冬
        Kalete,//卡勒特
        SkillSetting,//技能设置
        Test,//测试
        TestSpeed,//测速
        TestSkill,//测技能
        ReadRolePosition,//读取角色位置
        TestToNextDoor,//测试进入下一关的门
    }
}
src/RichCreator.Utility/Maps/MovePriority.cs
New file
@@ -0,0 +1,19 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace RichCreator.Utility.Maps
{
    /// <summary>
    /// 移动优化级
    /// </summary>
    public enum MovePriority
    {
        Quantity,//数量集中为高优先级
        Nearly//近为高优先级
    }
}
src/RichCreator.Utility/PathFinding/DNFPathFinding.cs
@@ -1,4 +1,5 @@
using RichCreator.Utility.Structs;
using RichCreator.Utility.Maps;
using RichCreator.Utility.Structs;
using RichCreator.Utility.Utilitys;
using System;
using System.Collections.Generic;
@@ -13,39 +14,182 @@
    /// </summary>
    public class DNFPathFinding
    {
        public DNFPathFinding(HousePathInfo houseInfo)
        {
            this.HouseInfo = houseInfo;
            this.HousePathInfo = houseInfo;
            InitPathFinder();
        }
        public DNFPathFinding(MapType mapType, Int32 houseIndex)
        {
            if (houseIndex < 0)
            {
                throw new ArgumentOutOfRangeException("houseIndex");
            }
            string info = null;
            if (mapType == MapType.Lingdong)
            {
                if (houseIndex > Lingdong.Length - 1)
                {
                    throw new ArgumentOutOfRangeException("houseIndex");
                }
                info = Lingdong[houseIndex];
            }
            else if (mapType == MapType.Kalete)
            {
                if (houseIndex > Kalete.Length - 1)
                {
                    throw new ArgumentOutOfRangeException("houseIndex");
                }
                info = Kalete[houseIndex];
            }
            try
            {
                this.HousePathInfo = HousePathInfo.FromJsonString(info);
            }
            catch (Exception e)
            {
                throw e;
            }
            InitPathFinder();
        }
        //凛冬
        private static readonly string[] Lingdong = new string[] {
            string.Empty,//0
            //0
            "{\"Width\":1350,\"Height\":901,\"Obstacles\":[],\"LocationPoints\":[],\"FindPathPoints\":[],\"LoopLines\":[],\"FindPathLines\":[]}",
            //1
            "{\"Width\":30,\"Height\":30,\"RowCount\":24,\"ColCount\":45,\"Vertexs\":[],\"Edges\":[],\"Positions\":[{\"X\":1095,\"Y\":324,\"Parameter\":4},{\"X\":607,\"Y\":321,\"Parameter\":5},{\"X\":118,\"Y\":322,\"Parameter\":6},{\"X\":662,\"Y\":168,\"Parameter\":8},{\"X\":659,\"Y\":20,\"Parameter\":9}]}",//1
            "{\"Width\":1350,\"Height\":901,\"Obstacles\":[],\"LocationPoints\":[],\"FindPathPoints\":[],\"LoopLines\":[],\"FindPathLines\":[]}",
            //2
            ""
            "{\"Width\":1350,\"Height\":901,\"Obstacles\":[],\"LocationPoints\":[],\"FindPathPoints\":[],\"LoopLines\":[],\"FindPathLines\":[]}",
            //3
            "{\"Width\":1350,\"Height\":901,\"Obstacles\":[],\"LocationPoints\":[],\"FindPathPoints\":[],\"LoopLines\":[],\"FindPathLines\":[]}",
            //4
            "{\"Width\":1350,\"Height\":901,\"Obstacles\":[],\"LocationPoints\":[],\"FindPathPoints\":[],\"LoopLines\":[],\"FindPathLines\":[]}",
            //5
            "{\"Width\":1350,\"Height\":901,\"Obstacles\":[],\"LocationPoints\":[],\"FindPathPoints\":[],\"LoopLines\":[],\"FindPathLines\":[]}",
            //6
            "{\"Width\":1350,\"Height\":901,\"Obstacles\":[],\"LocationPoints\":[],\"FindPathPoints\":[],\"LoopLines\":[],\"FindPathLines\":[]}",
            //7
            "{\"Width\":1350,\"Height\":901,\"Obstacles\":[],\"LocationPoints\":[],\"FindPathPoints\":[],\"LoopLines\":[],\"FindPathLines\":[]}",
            //8
            "{\"Width\":1350,\"Height\":901,\"Obstacles\":[],\"LocationPoints\":[],\"FindPathPoints\":[],\"LoopLines\":[],\"FindPathLines\":[]}",
            //9
            "{\"Width\":1350,\"Height\":901,\"Obstacles\":[],\"LocationPoints\":[],\"FindPathPoints\":[],\"LoopLines\":[],\"FindPathLines\":[]}",
            //10
            "{\"Width\":1350,\"Height\":901,\"Obstacles\":[],\"LocationPoints\":[],\"FindPathPoints\":[],\"LoopLines\":[],\"FindPathLines\":[]}",
            //11
            "{\"Width\":1350,\"Height\":901,\"Obstacles\":[],\"LocationPoints\":[],\"FindPathPoints\":[],\"LoopLines\":[],\"FindPathLines\":[]}",
            //12
            "{\"Width\":1350,\"Height\":901,\"Obstacles\":[],\"LocationPoints\":[],\"FindPathPoints\":[],\"LoopLines\":[],\"FindPathLines\":[]}",
            //13
            "{\"Width\":1350,\"Height\":901,\"Obstacles\":[],\"LocationPoints\":[],\"FindPathPoints\":[],\"LoopLines\":[],\"FindPathLines\":[]}",
            //14
            "{\"Width\":1350,\"Height\":901,\"Obstacles\":[],\"LocationPoints\":[],\"FindPathPoints\":[],\"LoopLines\":[],\"FindPathLines\":[]}",
            //15
            "{\"Width\":1350,\"Height\":901,\"Obstacles\":[],\"LocationPoints\":[],\"FindPathPoints\":[],\"LoopLines\":[],\"FindPathLines\":[]}",
            //16
            "{\"Width\":1350,\"Height\":901,\"Obstacles\":[],\"LocationPoints\":[],\"FindPathPoints\":[],\"LoopLines\":[],\"FindPathLines\":[]}",
            //17
            "{\"Width\":1350,\"Height\":901,\"Obstacles\":[],\"LocationPoints\":[],\"FindPathPoints\":[],\"LoopLines\":[],\"FindPathLines\":[]}",
            //18
            "{\"Width\":1350,\"Height\":901,\"Obstacles\":[],\"LocationPoints\":[],\"FindPathPoints\":[],\"LoopLines\":[],\"FindPathLines\":[]}",
            //19
            "{\"Width\":1350,\"Height\":901,\"Obstacles\":[],\"LocationPoints\":[],\"FindPathPoints\":[],\"LoopLines\":[],\"FindPathLines\":[]}"
        };
        //卡勒特
        private static readonly string[] Kalete = new string[] {
            string.Empty ,//0
            //0:
            "{\"Width\":1350,\"Height\":901,\"Obstacles\":[{\"Points\":[{\"X\":1,\"Y\":357},{\"X\":803,\"Y\":359},{\"X\":1029,\"Y\":406},{\"X\":1229,\"Y\":361},{\"X\":1346,\"Y\":357},{\"X\":1346,\"Y\":1},{\"X\":0,\"Y\":3}],\"Length\":7},{\"Points\":[{\"X\":1348,\"Y\":739},{\"X\":1254,\"Y\":735},{\"X\":1250,\"Y\":696},{\"X\":1042,\"Y\":701},{\"X\":1042,\"Y\":726},{\"X\":252,\"Y\":735},{\"X\":243,\"Y\":680},{\"X\":1,\"Y\":700},{\"X\":1,\"Y\":900},{\"X\":1347,\"Y\":901}],\"Length\":10}],\"LocationPoints\":[{\"Point\":{\"X\":100,\"Y\":411},\"Parameter\":6},{\"Point\":{\"X\":591,\"Y\":410},\"Parameter\":5},{\"Point\":{\"X\":1077,\"Y\":408},\"Parameter\":4}],\"FindPathPoints\":[{\"X\":1213,\"Y\":401},{\"X\":122,\"Y\":404}],\"LoopLines\":[{\"P1\":{\"X\":122,\"Y\":404},\"P2\":{\"X\":1213,\"Y\":401}}],\"FindPathLines\":[]}",
            //1:
            "{\"Width\":1349,\"Height\":900,\"Obstacles\":[{\"Points\":[{\"X\":124,\"Y\":324},{\"X\":760,\"Y\":310},{\"X\":956,\"Y\":414},{\"X\":1124,\"Y\":372},{\"X\":1113,\"Y\":301},{\"X\":1346,\"Y\":297},{\"X\":1345,\"Y\":3},{\"X\":0,\"Y\":2},{\"X\":0,\"Y\":375}],\"Length\":9},{\"Points\":[{\"X\":1342,\"Y\":675},{\"X\":1189,\"Y\":675},{\"X\":1191,\"Y\":713},{\"X\":949,\"Y\":712},{\"X\":867,\"Y\":772},{\"X\":840,\"Y\":897},{\"X\":1345,\"Y\":899}],\"Length\":7},{\"Points\":[{\"X\":651,\"Y\":668},{\"X\":459,\"Y\":671},{\"X\":446,\"Y\":641},{\"X\":247,\"Y\":641},{\"X\":236,\"Y\":608},{\"X\":155,\"Y\":612},{\"X\":150,\"Y\":549},{\"X\":295,\"Y\":541},{\"X\":376,\"Y\":557},{\"X\":472,\"Y\":592},{\"X\":473,\"Y\":609},{\"X\":627,\"Y\":606}],\"Length\":12},{\"Points\":[{\"X\":565,\"Y\":815},{\"X\":464,\"Y\":737},{\"X\":0,\"Y\":721},{\"X\":1,\"Y\":896},{\"X\":839,\"Y\":894},{\"X\":851,\"Y\":815}],\"Length\":6}],\"LocationPoints\":[{\"Point\":{\"X\":270,\"Y\":462},\"Parameter\":0},{\"Point\":{\"X\":732,\"Y\":461},\"Parameter\":1},{\"Point\":{\"X\":1192,\"Y\":461},\"Parameter\":2},{\"Point\":{\"X\":708,\"Y\":344},\"Parameter\":8},{\"Point\":{\"X\":706,\"Y\":197},\"Parameter\":9},{\"Point\":{\"X\":706,\"Y\":53},\"Parameter\":10}],\"FindPathPoints\":[{\"X\":1211,\"Y\":323},{\"X\":193,\"Y\":419},{\"X\":1251,\"Y\":446},{\"X\":746,\"Y\":498},{\"X\":769,\"Y\":657},{\"X\":111,\"Y\":660}],\"LoopLines\":[{\"P1\":{\"X\":193,\"Y\":419},\"P2\":{\"X\":1251,\"Y\":446}}],\"FindPathLines\":[{\"P1\":{\"X\":193,\"Y\":419},\"P2\":{\"X\":746,\"Y\":498}},{\"P1\":{\"X\":746,\"Y\":498},\"P2\":{\"X\":1251,\"Y\":446}},{\"P1\":{\"X\":746,\"Y\":498},\"P2\":{\"X\":769,\"Y\":657}},{\"P1\":{\"X\":769,\"Y\":657},\"P2\":{\"X\":1251,\"Y\":446}},{\"P1\":{\"X\":769,\"Y\":657},\"P2\":{\"X\":193,\"Y\":419}},{\"P1\":{\"X\":1251,\"Y\":446},\"P2\":{\"X\":1211,\"Y\":323}},{\"P1\":{\"X\":769,\"Y\":657},\"P2\":{\"X\":1211,\"Y\":323}},{\"P1\":{\"X\":111,\"Y\":660},\"P2\":{\"X\":193,\"Y\":419}},{\"P1\":{\"X\":111,\"Y\":660},\"P2\":{\"X\":769,\"Y\":657}}]}",
            string.Empty,//2
            //3:
            "{\"Width\":1348,\"Height\":900,\"Obstacles\":[{\"Points\":[{\"X\":0,\"Y\":313},{\"X\":927,\"Y\":295},{\"X\":963,\"Y\":334},{\"X\":1275,\"Y\":314},{\"X\":1343,\"Y\":300},{\"X\":1343,\"Y\":2},{\"X\":1,\"Y\":1}],\"Length\":7},{\"Points\":[{\"X\":878,\"Y\":366},{\"X\":750,\"Y\":369},{\"X\":733,\"Y\":354},{\"X\":740,\"Y\":325},{\"X\":876,\"Y\":324}],\"Length\":5},{\"Points\":[{\"X\":1345,\"Y\":551},{\"X\":1170,\"Y\":587},{\"X\":1173,\"Y\":643},{\"X\":1275,\"Y\":713},{\"X\":1346,\"Y\":706}],\"Length\":5},{\"Points\":[{\"X\":285,\"Y\":307},{\"X\":312,\"Y\":576},{\"X\":195,\"Y\":626},{\"X\":208,\"Y\":691},{\"X\":153,\"Y\":723},{\"X\":150,\"Y\":897},{\"X\":2,\"Y\":896},{\"X\":0,\"Y\":319}],\"Length\":8},{\"Points\":[{\"X\":156,\"Y\":752},{\"X\":369,\"Y\":714},{\"X\":793,\"Y\":734},{\"X\":932,\"Y\":822},{\"X\":1032,\"Y\":814},{\"X\":1058,\"Y\":896},{\"X\":159,\"Y\":894}],\"Length\":7},{\"Points\":[{\"X\":1037,\"Y\":824},{\"X\":1243,\"Y\":820},{\"X\":1229,\"Y\":748},{\"X\":1269,\"Y\":718},{\"X\":1344,\"Y\":709},{\"X\":1345,\"Y\":896},{\"X\":1064,\"Y\":897}],\"Length\":7}],\"LocationPoints\":[{\"Point\":{\"X\":1108,\"Y\":329},\"Parameter\":8},{\"Point\":{\"X\":1107,\"Y\":182},\"Parameter\":9},{\"Point\":{\"X\":1107,\"Y\":37},\"Parameter\":10}],\"FindPathPoints\":[{\"X\":358,\"Y\":342},{\"X\":378,\"Y\":505},{\"X\":1270,\"Y\":415},{\"X\":1038,\"Y\":650}],\"LoopLines\":[{\"P1\":{\"X\":358,\"Y\":342},\"P2\":{\"X\":1038,\"Y\":650}}],\"FindPathLines\":[{\"P1\":{\"X\":358,\"Y\":342},\"P2\":{\"X\":1270,\"Y\":415}},{\"P1\":{\"X\":1270,\"Y\":415},\"P2\":{\"X\":1038,\"Y\":650}},{\"P1\":{\"X\":1270,\"Y\":415},\"P2\":{\"X\":378,\"Y\":505}},{\"P1\":{\"X\":378,\"Y\":505},\"P2\":{\"X\":358,\"Y\":342}},{\"P1\":{\"X\":378,\"Y\":505},\"P2\":{\"X\":1038,\"Y\":650}}]}",
            string.Empty,//4
            string.Empty,//5
            //6:
            "{\"Width\":1350,\"Height\":900,\"Obstacles\":[{\"Points\":[{\"X\":325,\"Y\":425},{\"X\":437,\"Y\":447},{\"X\":567,\"Y\":437},{\"X\":565,\"Y\":395},{\"X\":631,\"Y\":398},{\"X\":675,\"Y\":410},{\"X\":809,\"Y\":405},{\"X\":810,\"Y\":375},{\"X\":933,\"Y\":329},{\"X\":1279,\"Y\":303},{\"X\":1345,\"Y\":367},{\"X\":1345,\"Y\":5},{\"X\":1,\"Y\":6}],\"Length\":13},{\"Points\":[{\"X\":1347,\"Y\":481},{\"X\":1246,\"Y\":501},{\"X\":1235,\"Y\":551},{\"X\":1188,\"Y\":617},{\"X\":1192,\"Y\":669},{\"X\":1348,\"Y\":673}],\"Length\":6},{\"Points\":[{\"X\":1349,\"Y\":701},{\"X\":791,\"Y\":719},{\"X\":803,\"Y\":659},{\"X\":396,\"Y\":665},{\"X\":361,\"Y\":723},{\"X\":2,\"Y\":711},{\"X\":0,\"Y\":896},{\"X\":1345,\"Y\":898}],\"Length\":8}],\"LocationPoints\":[{\"Point\":{\"X\":1080,\"Y\":425},\"Parameter\":4},{\"Point\":{\"X\":592,\"Y\":427},\"Parameter\":5},{\"Point\":{\"X\":103,\"Y\":427},\"Parameter\":6}],\"FindPathPoints\":[{\"X\":174,\"Y\":537},{\"X\":1197,\"Y\":430},{\"X\":602,\"Y\":502}],\"LoopLines\":[{\"P1\":{\"X\":174,\"Y\":537},\"P2\":{\"X\":1197,\"Y\":430}}],\"FindPathLines\":[{\"P1\":{\"X\":174,\"Y\":537},\"P2\":{\"X\":602,\"Y\":502}},{\"P1\":{\"X\":602,\"Y\":502},\"P2\":{\"X\":1197,\"Y\":430}}]}",
            //7:
            "{\"Width\":1350,\"Height\":900,\"Obstacles\":[{\"Points\":[{\"X\":31,\"Y\":409},{\"X\":127,\"Y\":312},{\"X\":505,\"Y\":351},{\"X\":570,\"Y\":394},{\"X\":733,\"Y\":418},{\"X\":888,\"Y\":410},{\"X\":896,\"Y\":334},{\"X\":1066,\"Y\":328},{\"X\":1100,\"Y\":401},{\"X\":1315,\"Y\":425},{\"X\":1349,\"Y\":427},{\"X\":1343,\"Y\":1},{\"X\":4,\"Y\":4},{\"X\":1,\"Y\":341}],\"Length\":14},{\"Points\":[{\"X\":467,\"Y\":896},{\"X\":472,\"Y\":733},{\"X\":325,\"Y\":676},{\"X\":178,\"Y\":636},{\"X\":0,\"Y\":625},{\"X\":2,\"Y\":900}],\"Length\":6}],\"LocationPoints\":[{\"Point\":{\"X\":270,\"Y\":462},\"Parameter\":0},{\"Point\":{\"X\":730,\"Y\":463},\"Parameter\":1},{\"Point\":{\"X\":1191,\"Y\":463},\"Parameter\":2},{\"Point\":{\"X\":1078,\"Y\":499},\"Parameter\":4},{\"Point\":{\"X\":589,\"Y\":497},\"Parameter\":5},{\"Point\":{\"X\":100,\"Y\":498},\"Parameter\":6}],\"FindPathPoints\":[{\"X\":146,\"Y\":440},{\"X\":1226,\"Y\":720}],\"LoopLines\":[{\"P1\":{\"X\":146,\"Y\":440},\"P2\":{\"X\":1226,\"Y\":720}}],\"FindPathLines\":[]}",
            //8:
            "{\"Width\":1686,\"Height\":720,\"Obstacles\":[{\"Points\":[{\"X\":2,\"Y\":420},{\"X\":130,\"Y\":439},{\"X\":311,\"Y\":462},{\"X\":313,\"Y\":400},{\"X\":221,\"Y\":319},{\"X\":453,\"Y\":288},{\"X\":632,\"Y\":5},{\"X\":4,\"Y\":2}],\"Length\":8},{\"Points\":[{\"X\":574,\"Y\":104},{\"X\":743,\"Y\":319},{\"X\":961,\"Y\":306},{\"X\":1014,\"Y\":343},{\"X\":1099,\"Y\":326},{\"X\":1165,\"Y\":369},{\"X\":1534,\"Y\":365},{\"X\":1684,\"Y\":309},{\"X\":1680,\"Y\":4},{\"X\":633,\"Y\":5}],\"Length\":10},{\"Points\":[{\"X\":1682,\"Y\":470},{\"X\":1540,\"Y\":514},{\"X\":1442,\"Y\":590},{\"X\":1173,\"Y\":641},{\"X\":858,\"Y\":670},{\"X\":814,\"Y\":708},{\"X\":1681,\"Y\":715}],\"Length\":7}],\"LocationPoints\":[{\"Point\":{\"X\":277,\"Y\":501},\"Parameter\":0},{\"Point\":{\"X\":735,\"Y\":502},\"Parameter\":1},{\"Point\":{\"X\":1196,\"Y\":502},\"Parameter\":2},{\"Point\":{\"X\":1418,\"Y\":390},\"Parameter\":4},{\"Point\":{\"X\":930,\"Y\":387},\"Parameter\":5},{\"Point\":{\"X\":441,\"Y\":388},\"Parameter\":6}],\"FindPathPoints\":[{\"X\":186,\"Y\":483},{\"X\":1565,\"Y\":393},{\"X\":549,\"Y\":448}],\"LoopLines\":[{\"P1\":{\"X\":186,\"Y\":483},\"P2\":{\"X\":1565,\"Y\":393}}],\"FindPathLines\":[{\"P1\":{\"X\":186,\"Y\":483},\"P2\":{\"X\":549,\"Y\":448}},{\"P1\":{\"X\":549,\"Y\":448},\"P2\":{\"X\":1565,\"Y\":393}}]}",
            //9:
            "{\"Width\":1688,\"Height\":720,\"Obstacles\":[{\"Points\":[{\"X\":3,\"Y\":333},{\"X\":390,\"Y\":305},{\"X\":600,\"Y\":389},{\"X\":746,\"Y\":389},{\"X\":766,\"Y\":327},{\"X\":890,\"Y\":334},{\"X\":914,\"Y\":247},{\"X\":1092,\"Y\":225},{\"X\":1305,\"Y\":396},{\"X\":1489,\"Y\":346},{\"X\":1684,\"Y\":411},{\"X\":1683,\"Y\":3},{\"X\":3,\"Y\":3}],\"Length\":13},{\"Points\":[{\"X\":389,\"Y\":671},{\"X\":398,\"Y\":614},{\"X\":868,\"Y\":605},{\"X\":1037,\"Y\":631},{\"X\":1125,\"Y\":589},{\"X\":1536,\"Y\":632},{\"X\":1678,\"Y\":682},{\"X\":1682,\"Y\":715},{\"X\":378,\"Y\":715}],\"Length\":9}],\"LocationPoints\":[{\"Point\":{\"X\":274,\"Y\":500},\"Parameter\":0},{\"Point\":{\"X\":738,\"Y\":502},\"Parameter\":1},{\"Point\":{\"X\":1200,\"Y\":501},\"Parameter\":2},{\"Point\":{\"X\":1658,\"Y\":503},\"Parameter\":3}],\"FindPathPoints\":[{\"X\":216,\"Y\":456},{\"X\":1545,\"Y\":466},{\"X\":985,\"Y\":515}],\"LoopLines\":[{\"P1\":{\"X\":216,\"Y\":456},\"P2\":{\"X\":1545,\"Y\":466}}],\"FindPathLines\":[{\"P1\":{\"X\":216,\"Y\":456},\"P2\":{\"X\":985,\"Y\":515}},{\"P1\":{\"X\":985,\"Y\":515},\"P2\":{\"X\":1545,\"Y\":466}}]}",
            string.Empty,//10
            //11:
            "{\"Width\":1686,\"Height\":720,\"Obstacles\":[{\"Points\":[{\"X\":1678,\"Y\":410},{\"X\":1576,\"Y\":341},{\"X\":1258,\"Y\":344},{\"X\":1241,\"Y\":379},{\"X\":1153,\"Y\":380},{\"X\":849,\"Y\":377},{\"X\":765,\"Y\":353},{\"X\":598,\"Y\":352},{\"X\":498,\"Y\":387},{\"X\":0,\"Y\":360},{\"X\":1,\"Y\":1},{\"X\":1681,\"Y\":2}],\"Length\":12},{\"Points\":[{\"X\":1566,\"Y\":714},{\"X\":1502,\"Y\":662},{\"X\":875,\"Y\":654},{\"X\":780,\"Y\":660},{\"X\":550,\"Y\":636},{\"X\":365,\"Y\":614},{\"X\":183,\"Y\":626},{\"X\":72,\"Y\":636},{\"X\":10,\"Y\":655},{\"X\":0,\"Y\":715}],\"Length\":10}],\"LocationPoints\":[{\"Point\":{\"X\":929,\"Y\":450},\"Parameter\":5},{\"Point\":{\"X\":440,\"Y\":452},\"Parameter\":6},{\"Point\":{\"X\":1416,\"Y\":451},\"Parameter\":4}],\"FindPathPoints\":[{\"X\":71,\"Y\":469},{\"X\":1529,\"Y\":462},{\"X\":826,\"Y\":576}],\"LoopLines\":[{\"P1\":{\"X\":71,\"Y\":469},\"P2\":{\"X\":1529,\"Y\":462}}],\"FindPathLines\":[{\"P1\":{\"X\":71,\"Y\":469},\"P2\":{\"X\":826,\"Y\":576}},{\"P1\":{\"X\":826,\"Y\":576},\"P2\":{\"X\":1529,\"Y\":462}}]}",
            //12:
            "{\"Width\":2024,\"Height\":720,\"Obstacles\":[{\"Points\":[{\"X\":795,\"Y\":351},{\"X\":1897,\"Y\":323},{\"X\":2019,\"Y\":271},{\"X\":2019,\"Y\":4},{\"X\":1,\"Y\":2},{\"X\":3,\"Y\":347},{\"X\":111,\"Y\":400},{\"X\":200,\"Y\":377},{\"X\":294,\"Y\":344},{\"X\":560,\"Y\":351},{\"X\":623,\"Y\":381}],\"Length\":11},{\"Points\":[{\"X\":2020,\"Y\":614},{\"X\":1464,\"Y\":615},{\"X\":1137,\"Y\":589},{\"X\":895,\"Y\":606},{\"X\":855,\"Y\":715},{\"X\":2020,\"Y\":716}],\"Length\":6},{\"Points\":[{\"X\":525,\"Y\":715},{\"X\":451,\"Y\":589},{\"X\":156,\"Y\":603},{\"X\":2,\"Y\":495},{\"X\":2,\"Y\":716}],\"Length\":5}],\"LocationPoints\":[{\"Point\":{\"X\":270,\"Y\":461},\"Parameter\":0},{\"Point\":{\"X\":731,\"Y\":461},\"Parameter\":1},{\"Point\":{\"X\":1192,\"Y\":462},\"Parameter\":2},{\"Point\":{\"X\":1650,\"Y\":463},\"Parameter\":3},{\"Point\":{\"X\":1278,\"Y\":347},\"Parameter\":5},{\"Point\":{\"X\":788,\"Y\":347},\"Parameter\":6},{\"Point\":{\"X\":301,\"Y\":346},\"Parameter\":7},{\"Point\":{\"X\":628,\"Y\":175},\"Parameter\":8},{\"Point\":{\"X\":627,\"Y\":28},\"Parameter\":9}],\"FindPathPoints\":[{\"X\":201,\"Y\":457},{\"X\":1894,\"Y\":423},{\"X\":699,\"Y\":513}],\"LoopLines\":[{\"P1\":{\"X\":201,\"Y\":457},\"P2\":{\"X\":1894,\"Y\":423}}],\"FindPathLines\":[{\"P1\":{\"X\":201,\"Y\":457},\"P2\":{\"X\":699,\"Y\":513}},{\"P1\":{\"X\":699,\"Y\":513},\"P2\":{\"X\":1894,\"Y\":423}}]}",
            //13:
            "{\"Width\":2024,\"Height\":900,\"Obstacles\":[{\"Points\":[{\"X\":1607,\"Y\":189},{\"X\":1761,\"Y\":360},{\"X\":2022,\"Y\":405},{\"X\":2022,\"Y\":1},{\"X\":1565,\"Y\":1}],\"Length\":5},{\"Points\":[{\"X\":1350,\"Y\":400},{\"X\":1605,\"Y\":186},{\"X\":1562,\"Y\":1},{\"X\":121,\"Y\":1},{\"X\":335,\"Y\":410},{\"X\":385,\"Y\":402}],\"Length\":6},{\"Points\":[{\"X\":2017,\"Y\":719},{\"X\":1228,\"Y\":729},{\"X\":1137,\"Y\":666},{\"X\":667,\"Y\":689},{\"X\":417,\"Y\":671},{\"X\":123,\"Y\":649},{\"X\":121,\"Y\":891},{\"X\":2020,\"Y\":896}],\"Length\":8},{\"Points\":[{\"X\":294,\"Y\":564},{\"X\":121,\"Y\":566},{\"X\":122,\"Y\":19},{\"X\":322,\"Y\":394},{\"X\":233,\"Y\":457}],\"Length\":5},{\"Points\":[{\"X\":1,\"Y\":2},{\"X\":127,\"Y\":3},{\"X\":128,\"Y\":896},{\"X\":0,\"Y\":894}],\"Length\":4}],\"LocationPoints\":[{\"Point\":{\"X\":537,\"Y\":496},\"Parameter\":0},{\"Point\":{\"X\":997,\"Y\":497},\"Parameter\":1},{\"Point\":{\"X\":1458,\"Y\":497},\"Parameter\":2},{\"Point\":{\"X\":1918,\"Y\":496},\"Parameter\":3},{\"Point\":{\"X\":777,\"Y\":484},\"Parameter\":6},{\"Point\":{\"X\":1266,\"Y\":484},\"Parameter\":5},{\"Point\":{\"X\":1753,\"Y\":485},\"Parameter\":4}],\"FindPathPoints\":[{\"X\":425,\"Y\":495},{\"X\":1885,\"Y\":496},{\"X\":1294,\"Y\":541}],\"LoopLines\":[{\"P1\":{\"X\":425,\"Y\":495},\"P2\":{\"X\":1885,\"Y\":496}}],\"FindPathLines\":[{\"P1\":{\"X\":425,\"Y\":495},\"P2\":{\"X\":1294,\"Y\":541}},{\"P1\":{\"X\":1294,\"Y\":541},\"P2\":{\"X\":1885,\"Y\":496}}]}",
            //14:
            "{\"Width\":1687,\"Height\":901,\"Obstacles\":[{\"Points\":[{\"X\":98,\"Y\":310},{\"X\":408,\"Y\":314},{\"X\":418,\"Y\":425},{\"X\":530,\"Y\":416},{\"X\":593,\"Y\":451},{\"X\":721,\"Y\":452},{\"X\":762,\"Y\":449},{\"X\":783,\"Y\":337},{\"X\":840,\"Y\":302},{\"X\":1207,\"Y\":300},{\"X\":1239,\"Y\":321},{\"X\":1418,\"Y\":320},{\"X\":1584,\"Y\":378},{\"X\":1679,\"Y\":377},{\"X\":1681,\"Y\":4},{\"X\":4,\"Y\":4},{\"X\":0,\"Y\":436}],\"Length\":17},{\"Points\":[{\"X\":1681,\"Y\":717},{\"X\":1319,\"Y\":706},{\"X\":1165,\"Y\":653},{\"X\":1053,\"Y\":654},{\"X\":835,\"Y\":609},{\"X\":732,\"Y\":624},{\"X\":680,\"Y\":667},{\"X\":0,\"Y\":650},{\"X\":0,\"Y\":898},{\"X\":1682,\"Y\":898}],\"Length\":10}],\"LocationPoints\":[{\"Point\":{\"X\":278,\"Y\":481},\"Parameter\":0},{\"Point\":{\"X\":739,\"Y\":481},\"Parameter\":1},{\"Point\":{\"X\":1200,\"Y\":479},\"Parameter\":2},{\"Point\":{\"X\":1656,\"Y\":480},\"Parameter\":3}],\"FindPathPoints\":[{\"X\":140,\"Y\":474},{\"X\":1453,\"Y\":466},{\"X\":763,\"Y\":520},{\"X\":373,\"Y\":565}],\"LoopLines\":[{\"P1\":{\"X\":140,\"Y\":474},\"P2\":{\"X\":1453,\"Y\":466}}],\"FindPathLines\":[{\"P1\":{\"X\":140,\"Y\":474},\"P2\":{\"X\":373,\"Y\":565}},{\"P1\":{\"X\":140,\"Y\":474},\"P2\":{\"X\":763,\"Y\":520}},{\"P1\":{\"X\":373,\"Y\":565},\"P2\":{\"X\":763,\"Y\":520}},{\"P1\":{\"X\":763,\"Y\":520},\"P2\":{\"X\":1453,\"Y\":466}},{\"P1\":{\"X\":373,\"Y\":565},\"P2\":{\"X\":1453,\"Y\":466}}]}",
            string.Empty,//15
            //16:
            "{\"Width\":1687,\"Height\":901,\"Obstacles\":[{\"Points\":[{\"X\":3,\"Y\":385},{\"X\":257,\"Y\":388},{\"X\":655,\"Y\":320},{\"X\":711,\"Y\":264},{\"X\":1682,\"Y\":279},{\"X\":1682,\"Y\":1},{\"X\":0,\"Y\":4}],\"Length\":7},{\"Points\":[{\"X\":5,\"Y\":713},{\"X\":265,\"Y\":754},{\"X\":432,\"Y\":862},{\"X\":405,\"Y\":900},{\"X\":1,\"Y\":896}],\"Length\":5},{\"Points\":[{\"X\":720,\"Y\":883},{\"X\":825,\"Y\":776},{\"X\":1034,\"Y\":851},{\"X\":985,\"Y\":900},{\"X\":712,\"Y\":900}],\"Length\":5},{\"Points\":[{\"X\":1173,\"Y\":871},{\"X\":1569,\"Y\":644},{\"X\":1674,\"Y\":661},{\"X\":1684,\"Y\":772},{\"X\":1679,\"Y\":887},{\"X\":1187,\"Y\":893},{\"X\":1200,\"Y\":852}],\"Length\":7}],\"LocationPoints\":[{\"Point\":{\"X\":1391,\"Y\":410},\"Parameter\":4},{\"Point\":{\"X\":905,\"Y\":409},\"Parameter\":5},{\"Point\":{\"X\":416,\"Y\":410},\"Parameter\":6}],\"FindPathPoints\":[{\"X\":633,\"Y\":693},{\"X\":1494,\"Y\":434},{\"X\":139,\"Y\":505},{\"X\":834,\"Y\":367}],\"LoopLines\":[{\"P1\":{\"X\":139,\"Y\":505},\"P2\":{\"X\":1494,\"Y\":434}}],\"FindPathLines\":[{\"P1\":{\"X\":139,\"Y\":505},\"P2\":{\"X\":834,\"Y\":367}},{\"P1\":{\"X\":834,\"Y\":367},\"P2\":{\"X\":1494,\"Y\":434}},{\"P1\":{\"X\":633,\"Y\":693},\"P2\":{\"X\":1494,\"Y\":434}},{\"P1\":{\"X\":633,\"Y\":693},\"P2\":{\"X\":834,\"Y\":367}},{\"P1\":{\"X\":633,\"Y\":693},\"P2\":{\"X\":139,\"Y\":505}}]}",
            //17:
            "{\"Width\":1687,\"Height\":720,\"Obstacles\":[{\"Points\":[{\"X\":1681,\"Y\":368},{\"X\":1591,\"Y\":363},{\"X\":1487,\"Y\":252},{\"X\":1475,\"Y\":4},{\"X\":1683,\"Y\":3}],\"Length\":5},{\"Points\":[{\"X\":1348,\"Y\":358},{\"X\":544,\"Y\":345},{\"X\":534,\"Y\":453},{\"X\":115,\"Y\":450},{\"X\":0,\"Y\":390},{\"X\":0,\"Y\":3},{\"X\":1480,\"Y\":3},{\"X\":1487,\"Y\":245}],\"Length\":8},{\"Points\":[{\"X\":108,\"Y\":685},{\"X\":76,\"Y\":720},{\"X\":1682,\"Y\":718},{\"X\":1684,\"Y\":683}],\"Length\":4}],\"LocationPoints\":[{\"Point\":{\"X\":276,\"Y\":499},\"Parameter\":0},{\"Point\":{\"X\":736,\"Y\":502},\"Parameter\":1},{\"Point\":{\"X\":1198,\"Y\":500},\"Parameter\":2},{\"Point\":{\"X\":1655,\"Y\":502},\"Parameter\":3}],\"FindPathPoints\":[{\"X\":196,\"Y\":514},{\"X\":1622,\"Y\":491},{\"X\":605,\"Y\":518}],\"LoopLines\":[{\"P1\":{\"X\":196,\"Y\":514},\"P2\":{\"X\":1622,\"Y\":491}}],\"FindPathLines\":[{\"P1\":{\"X\":196,\"Y\":514},\"P2\":{\"X\":605,\"Y\":518}},{\"P1\":{\"X\":605,\"Y\":518},\"P2\":{\"X\":1622,\"Y\":491}}]}",
        };
        /// <summary>
        /// 房间信息
        /// </summary>
        public HousePathInfo HouseInfo { get; private set; }
        public HousePathInfo HousePathInfo { get; private set; }
        /// <summary>
        /// 路径查找器
        /// </summary>
        public Dijkstra<ZTPoint> PathFinder { get; private set; }
        /// <summary>
        /// 定位字典
        /// </summary>
        private Dictionary<Int32, ZTPoint> LocationDic = new Dictionary<int, ZTPoint>();
        /// <summary>
        /// 屏幕坐标转地图坐标
        /// </summary>
        /// <param name="screenCoordinate"></param>
        /// <param name="locationParameter"></param>
        /// <param name="locationCoordinate"></param>
        /// <returns></returns>
        public ZTPoint ScreenToMapCoordinate(ZTPoint screenCoordinate,Int32 locationParameter,ZTPoint locationScreenCoordinate)
        {
            if (!LocationDic.ContainsKey(locationParameter))
            {
                throw new ArgumentOutOfRangeException("不存在的定位点,parameter:"+locationParameter.ToString());
            }
            //目标屏幕坐标+(定位点地图坐标-定位点屏幕坐标)
            return screenCoordinate.Add(LocationDic[locationParameter].Sub(locationScreenCoordinate));
        }
        /// <summary>
        /// 地图坐标转屏幕坐标
        /// </summary>
        /// <param name="mapCoordinate"></param>
        /// <param name="locationParameter"></param>
        /// <param name="locationCoordinate"></param>
        /// <returns></returns>
        public ZTPoint MapToScreenCoordinate(ZTPoint mapCoordinate, Int32 locationParameter, ZTPoint locationScreenCoordinate)
        {
            if (!LocationDic.ContainsKey(locationParameter))
            {
                throw new ArgumentOutOfRangeException("不存在的定位点,parameter:" + locationParameter.ToString());
            }
            //目标地图坐标-(定位点地图坐标-定位点屏幕坐标)
            return mapCoordinate.Sub(LocationDic[locationParameter].Sub(locationScreenCoordinate));
        }
        /// <summary>
        /// 寻找巡逻路线
        /// </summary>
@@ -107,9 +251,9 @@
        private bool Iscross(ZTPoint start, ZTPoint end)
        {
            for (int i = 0; i < this.HouseInfo.Obstacles.Count; i++)
            for (int i = 0; i < this.HousePathInfo.Obstacles.Count; i++)
            {
                Intersection interSection = GeometryHelper.IntersectionOf(new ZTLinePoint(start, end), this.HouseInfo.Obstacles[i]);
                Intersection interSection = GeometryHelper.IntersectionOf(new ZTLinePoint(start, end), this.HousePathInfo.Obstacles[i]);
                if (interSection != Intersection.None)
                {
                    return false;
@@ -127,12 +271,12 @@
        {
            ZTPoint source = new ZTPoint(point.X, point.Y);
            ZTPolygon obstacle = ZTPolygon.Empty;
            for (int i = 0; i < this.HouseInfo.Obstacles.Count; i++)
            for (int i = 0; i < this.HousePathInfo.Obstacles.Count; i++)
            {
                ZTPolygon temp = this.HouseInfo.Obstacles[i];
                ZTPolygon temp = this.HousePathInfo.Obstacles[i];
                if (GeometryHelper.IntersectionOf(point, temp) != Intersection.None)
                {
                    obstacle = this.HouseInfo.Obstacles[i];
                    obstacle = this.HousePathInfo.Obstacles[i];
                    break;
                }
            }
@@ -166,11 +310,11 @@
            //查找最近离开障碍物的点
            ZTPoint testPoint = new ZTPoint(point.X, point.Y);
            Int32 maxDistance = Math.Max(Math.Max(point.X, this.HouseInfo.Width - point.X), Math.Max(point.Y, this.HouseInfo.Height - point.Y));
            Int32 maxDistance = Math.Max(Math.Max(point.X, this.HousePathInfo.Width - point.X), Math.Max(point.Y, this.HousePathInfo.Height - point.Y));
            for (int i = (Int32)distance; i < maxDistance; i++)
            {
                //下
                if (point.Y + i <= this.HouseInfo.Height)
                if (point.Y + i <= this.HousePathInfo.Height)
                {
                    testPoint = new ZTPoint(point.X, point.Y + i);
                    if (GeometryHelper.IntersectionOf(testPoint, obstacle) == Intersection.None)
@@ -183,7 +327,7 @@
                //右
                if (point.X <= this.HouseInfo.Width)
                if (point.X <= this.HousePathInfo.Width)
                {
                    testPoint = new ZTPoint(point.X + i, point.Y);
                    if (GeometryHelper.IntersectionOf(testPoint, obstacle) == Intersection.None)
@@ -231,17 +375,27 @@
            //添加寻路路径
            ZTLinePoint line;
            for (int i = 0; i < this.HouseInfo.FindPathLines.Count; i++)
            for (int i = 0; i < this.HousePathInfo.FindPathLines.Count; i++)
            {
                line = this.HouseInfo.FindPathLines[i];
                line = this.HousePathInfo.FindPathLines[i];
                this.PathFinder.AddVertex(line.P1, line.P2, line.GetDistance());
            }
            //添加巡逻路径
            for (int i = 0; i < this.HouseInfo.LoopLines.Count; i++)
            for (int i = 0; i < this.HousePathInfo.LoopLines.Count; i++)
            {
                line = this.HouseInfo.LoopLines[i];
                line = this.HousePathInfo.LoopLines[i];
                this.PathFinder.AddVertex(line.P1, line.P2, line.GetDistance());
            }
            //定位点添加到字典
            for (int i = 0; i < this.HousePathInfo.LocationPoints.Count; i++)
            {
                ParametersPoint pp = this.HousePathInfo.LocationPoints[i];
                if (!this.LocationDic.ContainsKey(pp.Parameter))
                {
                    this.LocationDic.Add(pp.Parameter, pp.Point);
                }
            }
        }
@@ -254,9 +408,9 @@
        {
            Int32 distance = 0;
            ZTPoint point;
            for (int i = 0; i < this.HouseInfo.FindPathPoints.Count; i++)
            for (int i = 0; i < this.HousePathInfo.FindPathPoints.Count; i++)
            {
                point = this.HouseInfo.FindPathPoints[i];
                point = this.HousePathInfo.FindPathPoints[i];
                if (Iscross(start, point))
                {
                    distance = (Int32)GeometryHelper.GetPointDistance(start, point);
src/RichCreator.Utility/PathFinding/Dijkstra.cs
@@ -8,49 +8,49 @@
{
    public class Dijkstra<T> where T : IEquatable<T>
    {
        private Dictionary<T, Dictionary<T, Int32>> vertices = new Dictionary<T, Dictionary<T, Int32>>();
        private Dictionary<T, Dictionary<T, Int32>> edges = new Dictionary<T, Dictionary<T, Int32>>();
        /// <summary>
        /// 添加顶点
        /// </summary>
        /// <param name="name">顶点名称</param>
        /// <param name="edges">顶点所有的边</param>
        public void AddVertex(T name, Dictionary<T, Int32> edges)
        /// <param name="vertice">顶点名称</param>
        /// <param name="targetVertice">顶点所有的边</param>
        public void AddEdge(T vertice, Dictionary<T, Int32> targetVertice)
        {
            foreach (var item in edges)
            foreach (var item in targetVertice)
            {
                AddVertex(name, item.Key, item.Value);
                AddEdge(vertice, item.Key, item.Value);
            }
        }
        /// <summary>
        /// 添加顶点
        /// </summary>
        /// <param name="name">顶点名称</param>
        /// <param name="target">可连接顶点</param>
        /// <param name="vertice">顶点名称</param>
        /// <param name="targetVertice">可连接顶点</param>
        /// <param name="weight">权重</param>
        public void AddVertex(T name, T target, Int32 weight)
        public void AddEdge(T vertice, T targetVertice, Int32 weight)
        {
            if (!this.vertices.ContainsKey(name))
            if (!this.edges.ContainsKey(vertice))
            {
                this.vertices.Add(name, new Dictionary<T, Int32>());
                this.edges.Add(vertice, new Dictionary<T, Int32>());
            }
            if (!this.vertices[name].ContainsKey(target))
            if (!this.edges[vertice].ContainsKey(targetVertice))
            {
                this.vertices[name].Add(target, weight);
                this.edges[vertice].Add(targetVertice, weight);
            }
            if (!this.vertices.ContainsKey(target))
            if (!this.edges.ContainsKey(targetVertice))
            {
                this.vertices.Add(target, new Dictionary<T, Int32>());
                this.edges.Add(targetVertice, new Dictionary<T, Int32>());
            }
            if (!this.vertices[target].ContainsKey(name))
            if (!this.edges[targetVertice].ContainsKey(vertice))
            {
                this.vertices[target].Add(name, weight);
                this.edges[targetVertice].Add(vertice, weight);
            }
        }
@@ -59,14 +59,14 @@
        /// 移除顶点
        /// </summary>
        /// <param name="name"></param>
        public void RemoveVertex(T name)
        public void RemoveEdge(T name)
        {
            if (this.vertices.ContainsKey(name))
            if (this.edges.ContainsKey(name))
            {
                return;
            }
            this.vertices.Remove(name);
            foreach (var item in this.vertices)
            this.edges.Remove(name);
            foreach (var item in this.edges)
            {
                if (item.Value.ContainsKey(name))
                {
@@ -93,7 +93,7 @@
            List<T> path = null;
            foreach (var vertex in vertices)
            foreach (var vertex in edges)
            {
                if (vertex.Key.Equals(start))
                {
@@ -134,7 +134,7 @@
                    break;
                }
                foreach (var neighbor in vertices[smallest])
                foreach (var neighbor in edges[smallest])
                {
                    var alt = distances[smallest] + neighbor.Value;
                    if (alt < distances[neighbor.Key])
src/RichCreator.Utility/RichCreator.Utility.csproj
@@ -90,34 +90,41 @@
    <Compile Include="CV\CVHelper.cs" />
    <Compile Include="CV\ChannelCVHelper.cs" />
    <Compile Include="CV\GroupCVHelper.cs" />
    <Compile Include="CV\KaleteCVHelper.cs" />
    <Compile Include="CV\SkillCVHelper.cs" />
    <Compile Include="CV\DnfCVHelper.cs" />
    <Compile Include="CV\LindongCVHelper.cs" />
    <Compile Include="CV\WeGameCVHelper.cs" />
    <Compile Include="Dnf\MoveIntent.cs" />
    <Compile Include="Dnf\MoveMethod.cs" />
    <Compile Include="ImageHelper.cs" />
    <Compile Include="InputControl\HardwareInputControl.cs" />
    <Compile Include="InputControl\HIDCode.cs" />
    <Compile Include="InputControl\IInputControl.cs" />
    <Compile Include="InputControl\NativeInputControl.cs" />
    <Compile Include="InputControl\SerialPortConnect.cs" />
    <Compile Include="Maps\HouseInfo.cs" />
    <Compile Include="Maps\MapType.cs" />
    <Compile Include="Maps\MovePriority.cs" />
    <Compile Include="MouseHook.cs" />
    <Compile Include="PathFinding\AStarFinding\PathGrid.cs" />
    <Compile Include="PathFinding\AStarFinding\PathNode.cs" />
    <Compile Include="PathFinding\AStarFinding\Point2.cs" />
    <Compile Include="PathFinding\Dijkstra.cs" />
    <Compile Include="PathFinding\DNFPathFinding.cs" />
    <Compile Include="Properties\AssemblyInfo.cs" />
    <Compile Include="Skills\SkillInfo.cs" />
    <Compile Include="Skills\SkillQueue.cs" />
    <Compile Include="Dnf\SpeedProvider.cs" />
    <Compile Include="Structs\ColorArray.cs" />
    <Compile Include="Structs\ColorArrayItem.cs" />
    <Compile Include="Structs\Direction.cs" />
    <Compile Include="Structs\HousePathInfo.cs" />
    <Compile Include="Maps\HousePathInfo.cs" />
    <Compile Include="Structs\HousePathInfoObj.cs" />
    <Compile Include="Structs\ParametersPoint.cs" />
    <Compile Include="Structs\ParametersPointObj.cs" />
    <Compile Include="Structs\ZTLinePoint.cs" />
    <Compile Include="Structs\MoveQueueItem.cs" />
    <Compile Include="Structs\Orientation.cs" />
    <Compile Include="Structs\FindPathInfo.cs" />
    <Compile Include="Structs\ZTLinePointObj.cs" />
    <Compile Include="Structs\ZTPointObj.cs" />
    <Compile Include="Structs\ZTPolygon.cs" />
@@ -128,16 +135,20 @@
    <Compile Include="Structs\ZTHsvFloatColorArrayItem.cs" />
    <Compile Include="Structs\ZTLine.cs" />
    <Compile Include="Structs\ZTPoint.cs" />
    <Compile Include="Structs\ZTTargetPolygonObj.cs" />
    <Compile Include="Structs\ZTPolygonObj.cs" />
    <Compile Include="Structs\ZTRectangle.cs" />
    <Compile Include="Structs\ZTSize.cs" />
    <Compile Include="Structs\ZTSizeDouble.cs" />
    <Compile Include="Structs\ZTTargetPolygon.cs" />
    <Compile Include="Utilitys\ColorUtils.cs" />
    <Compile Include="Utilitys\GeometryHelper.cs" />
    <Compile Include="Utilitys\ProcessUtils.cs" />
    <Compile Include="Utilitys\RandomUtils.cs" />
    <Compile Include="Utilitys\SystemHotKey.cs" />
    <Compile Include="Utilitys\WindowUtils.cs" />
    <Compile Include="Utils.cs" />
    <Compile Include="ZTResult.cs" />
  </ItemGroup>
  <ItemGroup>
    <Content Include="License-LGPL.txt" />
src/RichCreator.Utility/Skills/SkillInfo.cs
New file
@@ -0,0 +1,110 @@
using RichCreator.Utility.InputControl;
using RichCreator.Utility.Structs;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using RichCreator.Utility.Maps;
namespace RichCreator.Utility.Skills
{
    /// <summary>
    /// 技能信息
    /// </summary>
    public class SkillInfo
    {
        /// <summary>
        /// 技能列表
        /// </summary>
        private static Dictionary<HIDCode, SkillInfo> Skills = new Dictionary<HIDCode, SkillInfo>() {
            { HIDCode.Q,new SkillInfo (){ Key=HIDCode.Q,Range=new ZTSize (700,200),WaitTime=9,              AnchorOffset=new ZTSize(0,-50),MovePriority=MovePriority.Quantity,ReleaseAnchor=SkillAnchor.Side,ReleaseTime=2000,SkillName="朔风牵引"} },
            { HIDCode.W,new SkillInfo (){ Key=HIDCode.W,Range=new ZTSize (620,240),WaitTime=45,             AnchorOffset=new ZTSize(0,-50),MovePriority=MovePriority.Quantity,ReleaseAnchor=SkillAnchor.Center,ReleaseTime=2000,SkillName="风卷残云"} },
            { HIDCode.E,new SkillInfo (){ Key=HIDCode.E,Range=new ZTSize (1280,200),WaitTime=12.6f,         AnchorOffset=new ZTSize(0,-50),MovePriority=MovePriority.Quantity,ReleaseAnchor=SkillAnchor.Side,ReleaseTime=2000,SkillName="双翼风刃"} },
            { HIDCode.R,new SkillInfo (){ Key=HIDCode.R,Range=new ZTSize (400,200),WaitTime=14.4f,          AnchorOffset=new ZTSize(0,-50),MovePriority=MovePriority.Quantity,ReleaseAnchor=SkillAnchor.Side,ReleaseTime=600,SkillName="风暴之眼"} },
            { HIDCode.T,new SkillInfo (){ Key=HIDCode.T,Range=new ZTSize (120,300),WaitTime=40.5f,          AnchorOffset=new ZTSize(0,-50),MovePriority=MovePriority.Quantity,ReleaseAnchor=SkillAnchor.Side,ReleaseTime=2000,SkillName="九霄风雷"} },
            { HIDCode.Y,new SkillInfo (){ Key=HIDCode.Y,Range=new ZTSize (1280,720),WaitTime=145,           AnchorOffset=new ZTSize(0,-50),MovePriority=MovePriority.Quantity,ReleaseAnchor=SkillAnchor.Center,ReleaseTime=2000,SkillName="万象风龙阵"} },
            { HIDCode.A,new SkillInfo (){ Key=HIDCode.A,Range=new ZTSize (240,148),WaitTime=7.7f,           AnchorOffset=new ZTSize(0,-50),MovePriority=MovePriority.Nearly,ReleaseAnchor=SkillAnchor.Side,ReleaseTime=600,SkillName="风鸣冲击"} },
            { HIDCode.S,new SkillInfo (){ Key=HIDCode.S,Range=new ZTSize (180,430),WaitTime=22.5f,          AnchorOffset=new ZTSize(0,-50),MovePriority=MovePriority.Quantity,ReleaseAnchor=SkillAnchor.Side,ReleaseTime=2000,SkillName="真空旋风破"} },
            { HIDCode.D,new SkillInfo (){ Key=HIDCode.D,Range=new ZTSize (1280,240),WaitTime=6.3f,          AnchorOffset=new ZTSize(0,-50),MovePriority=MovePriority.Quantity,ReleaseAnchor=SkillAnchor.Side,ReleaseTime=500,SkillName="游离之风"} },
            { HIDCode.F,new SkillInfo (){ Key=HIDCode.F,Range=new ZTSize (370,224),WaitTime=40.5f,          AnchorOffset=new ZTSize(0,-50),MovePriority=MovePriority.Quantity,ReleaseAnchor=SkillAnchor.Side,ReleaseTime=2000,SkillName="风暴之拳"} },
            { HIDCode.G,new SkillInfo (){ Key=HIDCode.G,Range=new ZTSize (730,218),WaitTime=36,             AnchorOffset=new ZTSize(0,-50),MovePriority=MovePriority.Quantity,ReleaseAnchor=SkillAnchor.Side,ReleaseTime=2000,SkillName="游龙惊风破"} },
            { HIDCode.H,new SkillInfo (){ Key=HIDCode.H,Range=new ZTSize (1280,720),WaitTime=180,           AnchorOffset=new ZTSize(0,-50),MovePriority=MovePriority.Quantity,ReleaseAnchor=SkillAnchor.Center,ReleaseTime=2000,SkillName="无限风域"} },
            { HIDCode.X,new SkillInfo (){ Key=HIDCode.X,Range=new ZTSize (200,170),WaitTime=0.5f,           AnchorOffset=new ZTSize(0,-50),MovePriority=MovePriority.Nearly,ReleaseAnchor=SkillAnchor.Side,ReleaseTime=500,SkillName="普通攻击"} },
            { HIDCode.Space,new SkillInfo (){ Key=HIDCode.Space,Range=new ZTSize (1280,720),WaitTime=300,   AnchorOffset=new ZTSize(0,-50),MovePriority=MovePriority.Nearly,ReleaseAnchor=SkillAnchor.Center,ReleaseTime=2000,SkillName="技能加成"} }
        };
        /// <summary>
        /// 获取技能
        /// </summary>
        /// <param name="code"></param>
        /// <returns></returns>
        public static SkillInfo GetSkillInfo(HIDCode code)
        {
            if (Skills.ContainsKey(code))
            {
                return Skills[code];
            }
            return null;
        }
        /// <summary>
        /// 技能触发键
        /// </summary>
        public HIDCode Key;
        /// <summary>
        /// 攻击范围
        /// </summary>
        public ZTSize Range;
        /// <summary>
        /// 释放后需要等多少秒
        /// </summary>
        public float WaitTime;
        /// <summary>
        /// 技能名称
        /// </summary>
        public string SkillName;
        /// <summary>
        /// 技能释放时长
        /// </summary>
        public float ReleaseTime { get; set; }
        /// <summary>
        /// 技能释放锚点
        /// </summary>
        public SkillAnchor ReleaseAnchor { get; set; }
        /// <summary>
        /// 技能释放锚点编移
        /// 靠近为正,远离为负
        /// 上负,下正
        /// 锚点为中间时无效
        /// </summary>
        public ZTSize AnchorOffset { get; set; }
        /// <summary>
        /// 移动优先级
        /// </summary>
        public MovePriority MovePriority { get; set; }
        /// <summary>
        /// 技能释放锚点枚举
        /// </summary>
        public enum SkillAnchor
        {
            Side,
            Center
        }
    }
}
src/RichCreator.Utility/Skills/SkillQueue.cs
New file
@@ -0,0 +1,157 @@
using RichCreator.Utility.InputControl;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace RichCreator.Utility.Skills
{
    /// <summary>
    /// 技能释放队列
    /// </summary>
    public class SkillQueue
    {
        private List<SKillCallTime> callTimes = new List<SKillCallTime>();//可调用的技能列表
        private SkillInfo lastSkill = null;//最后一个调用的技能
        private DateTime lastSkillCallTime = DateTime.MinValue;//最后一个技能的调用时间
        public SkillQueue()
        {
        }
        public SkillQueue(HIDCode[] skillCodes)
        {
            for (int i = 0; i < skillCodes.Length; i++)
            {
                EnQueue(false, skillCodes[i]);
            }
        }
        /// <summary>
        /// 向可队列添加技能
        /// </summary>
        /// <param name="isOnce"></param>
        /// <param name="skillCode"></param>
        public void EnQueue(bool isOnce, HIDCode skillCode)
        {
            SkillInfo skill = SkillInfo.GetSkillInfo(skillCode);
            SKillCallTime time = new SKillCallTime(skill,isOnce);
            this.callTimes.Add(time);
        }
        private SkillInfo nextSkill;
        /// <summary>
        /// 阻塞查看队列,但不从队列中删除
        /// </summary>
        /// <returns></returns>
        public SkillInfo SyncPeek()
        {
            if (nextSkill == null)
            {
                nextSkill = FindOk();
            }
            return nextSkill;
        }
        /// <summary>
        /// 阻塞出队列
        /// </summary>
        /// <returns></returns>
        public SkillInfo SyncDeQueue()
        {
            SkillInfo result = null;
            if (nextSkill != null)
            {
                result = nextSkill;
                nextSkill = null;
            }
            else
            {
                result = FindOk();
            }
            for (int i = 0; i < this.callTimes.Count; i++)
            {
                if (this.callTimes[i].Skill == result)
                {
                    this.callTimes[i].CallCount++;
                    this.callTimes[i].LastCallTime = DateTime.Now;
                    break;
                }
            }
            return result;
        }
        /// <summary>
        /// 查找可以调用的技能
        /// </summary>
        /// <returns></returns>
        private SkillInfo FindOk()
        {
            SKillCallTime callTime = null;
            while (true)
            {
                for (int i = 0; i < callTimes.Count; i++)
                {
                    callTime = callTimes[i];
                    double dimMS = (DateTime.Now - callTime.LastCallTime).TotalMilliseconds;
                    if (dimMS > (callTime.Skill.WaitTime * 1000))
                    {
                        //已经过了技能等待时间
                        if (!callTime.IsOnce || callTime.CallCount <= 0)
                        {
                            //不是限制只调用一次,或一次也没调用过
                            return callTime.Skill;
                        }
                    }
                }
                //Thread.Sleep(100);
            }
        }
        /// <summary>
        /// 技能调用时间
        /// </summary>
        private class SKillCallTime
        {
            public SKillCallTime( SkillInfo skill,bool isOnce)
            {
                this.Skill = skill;
                this.IsOnce = isOnce;
                this.LastCallTime = DateTime.MinValue;
                this.CallCount = 0;
            }
            /// <summary>
            /// 技能
            /// </summary>
            public SkillInfo Skill;
            /// <summary>
            /// 上次调用时间
            /// </summary>
            public DateTime LastCallTime;
            /// <summary>
            /// 是否只能调用一次
            /// </summary>
            public bool IsOnce;
            /// <summary>
            /// 调用次数
            /// </summary>
            public Int32 CallCount;
        }
    }
}
src/RichCreator.Utility/Structs/FindPathInfo.cs
File was deleted
src/RichCreator.Utility/Structs/HousePathInfo.cs
File was deleted
src/RichCreator.Utility/Structs/HousePathInfoObj.cs
@@ -1,4 +1,5 @@
using System;
using RichCreator.Utility.Maps;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
@@ -10,7 +11,8 @@
    {
        public HousePathInfoObj()
        {
            this.NextGates = new List<ParametersPointObj>();
            this.PathGuides = new List<ZTTargetPolygonObj>();
        }
        public HousePathInfoObj(Int32 width, Int32 height)
        {
@@ -49,14 +51,25 @@
        /// <summary>
        /// 循逻线
        /// 巡逻点
        /// </summary>
        public List<ZTLinePointObj> LoopLines { get; set; }
        public ZTPointObj LoopPoint { get; set; }
        /// <summary>
        /// 寻路线
        /// </summary>
        public List<ZTLinePointObj> FindPathLines { get; set; }
        /// <summary>
        /// 下一关进门点
        /// 参数意义 0:上 1:右  2:下  3:左
        /// </summary>
        public List<ParametersPointObj> NextGates { get; set; }
        /// <summary>
        /// 路径向导,把某一区域的点导向某一点
        /// </summary>
        public List<ZTTargetPolygonObj> PathGuides { get; set; }
        public HousePathInfo To()
        {
@@ -80,17 +93,34 @@
                info.FindPathPoints.Add(item.To());
            }
            info.LoopLines = new List<ZTLinePoint>();
            foreach (var item in this.LoopLines)
            if (this.LoopPoint == null)
            {
                info.LoopLines.Add(item.To());
                info.LoopPoint = ZTPoint.Empty;
            }
            else
            {
                info.LoopPoint = this.LoopPoint.To();
            }
            info.FindPathLines = new List<ZTLinePoint>();
            foreach (var item in this.FindPathLines)
            {
                info.FindPathLines.Add(item.To());
            }
            info.NextGates = new List<ParametersPoint>();
            foreach (var item in this.NextGates)
            {
                info.NextGates.Add(item.To());
            }
            info.PathGuides = new List<ZTTargetPolygon>();
            foreach (var item in this.PathGuides)
            {
                info.PathGuides.Add(item.To());
            }
            return info;
        }
@@ -117,11 +147,7 @@
                infoObj.FindPathPoints.Add(ZTPointObj.From(item));
            }
            infoObj.LoopLines = new List<ZTLinePointObj>();
            foreach (var item in info.LoopLines)
            {
                infoObj.LoopLines.Add(ZTLinePointObj.From(item));
            }
            infoObj.LoopPoint = ZTPointObj.From(info.LoopPoint);
            infoObj.FindPathLines = new List<ZTLinePointObj>();
            foreach (var item in info.FindPathLines)
@@ -129,6 +155,19 @@
                infoObj.FindPathLines.Add(ZTLinePointObj.From(item));
            }
            infoObj.NextGates = new List<ParametersPointObj>();
            foreach (var item in info.NextGates)
            {
                infoObj.NextGates.Add(ParametersPointObj.From(item));
            }
            infoObj.PathGuides = new List<ZTTargetPolygonObj>();
            foreach (var item in info.PathGuides)
            {
                infoObj.PathGuides.Add(ZTTargetPolygonObj.From(item));
            }
            return infoObj;
src/RichCreator.Utility/Structs/ParametersPoint.cs
@@ -9,8 +9,10 @@
    /// <summary>
    /// 带参数的点
    /// </summary>
    public struct ParametersPoint
    public struct ParametersPoint:IEquatable<ParametersPoint>
    {
        public readonly static  ParametersPoint Empty = new ParametersPoint(ZTPoint.Empty, -1);
        public ParametersPoint(ZTPoint point, Int32 number)
        {
            this.Point = point;
@@ -26,5 +28,13 @@
        /// </summary>
        public Int32 Parameter { get; set; }
        public bool Equals(ParametersPoint other)
        {
            if (other.Point.Equals(this.Point) && other.Parameter == this.Parameter)
            {
                return true;
            }
            return false;
        }
    }
}
src/RichCreator.Utility/Structs/ZTPoint.cs
@@ -58,6 +58,11 @@
            return new ZTPoint(this.X + val.X, this.Y + val.Y);
        }
        public ZTPoint Add(Int32 x, Int32 y)
        {
            return new ZTPoint(this.X + x, this.Y + y);
        }
        /// <summary>
        /// 两个坐标相减
        /// </summary>
src/RichCreator.Utility/Structs/ZTTargetPolygon.cs
New file
@@ -0,0 +1,40 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace RichCreator.Utility.Structs
{
    /// <summary>
    /// 有目标的多边形
    /// </summary>
    public struct ZTTargetPolygon : IEquatable<ZTTargetPolygon>
    {
        public ZTTargetPolygon(ZTPolygon polygon,ZTPoint target)
        {
            this.Polygon = polygon;
            this.Target = target;
        }
        /// <summary>
        /// 多边形
        /// </summary>
        public ZTPolygon Polygon;
        /// <summary>
        /// 目标点
        /// </summary>
        public ZTPoint Target;
        public bool Equals(ZTTargetPolygon other)
        {
            if (this.Polygon.Equals(other.Polygon) && this.Target.Equals(other.Target))
            {
                return true;
            }
            return false;
        }
    }
}
src/RichCreator.Utility/Structs/ZTTargetPolygonObj.cs
New file
@@ -0,0 +1,49 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace RichCreator.Utility.Structs
{
    public class ZTTargetPolygonObj
    {
        public ZTTargetPolygonObj()
        {
        }
        public ZTTargetPolygonObj(ZTPolygonObj polygon,ZTPointObj target)
        {
            this.Polygon = polygon;
            this.Target = target;
        }
        /// <summary>
        /// 多边形
        /// </summary>
        public ZTPolygonObj Polygon { get; set; }
        /// <summary>
        /// 目标点
        /// </summary>
        public ZTPointObj Target { get; set; }
        public ZTTargetPolygon To()
        {
            ZTPolygon polygon=this.Polygon.To();
            ZTPoint target = this.Target.To();
            return new ZTTargetPolygon(polygon, target);
        }
        public static ZTTargetPolygonObj From(ZTTargetPolygon obj)
        {
            ZTPolygonObj polygon = ZTPolygonObj.From(obj.Polygon);
            ZTPointObj target = ZTPointObj.From(obj.Target);
            return new ZTTargetPolygonObj(polygon, target);
        }
    }
}
src/RichCreator.Utility/Utilitys/RandomUtils.cs
@@ -85,11 +85,13 @@
        /// 按键时,键盘按下和弹起的时间间隔最小值
        /// </summary>
        public const Int32 KeyPressDurationMin = 80;
        //public const Int32 KeyPressDurationMin = 30;
        /// <summary>
        /// 按键时,键盘按下和弹起的时间间隔最大值
        /// </summary>
        public const Int32 KeyPressDurationMax = 176;
        //public const Int32 KeyPressDurationMax = 35;
        /// <summary>
        /// 让点在范围内随机
src/RichCreator.Utility/Utilitys/SystemHotKey.cs
New file
@@ -0,0 +1,78 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace RichCreator.Utility.Utilitys
{
    public class SystemHotKey
    {
        /// <summary>
        /// 如果函数执行成功,返回值不为0。
        /// 如果函数执行失败,返回值为0。要得到扩展错误信息,调用GetLastError。
        /// </summary>
        /// <param name="hWnd">要定义热键的窗口的句柄</param>
        /// <param name="id">定义热键ID(不能与其它ID重复)</param>
        /// <param name="fsModifiers">标识热键是否在按Alt、Ctrl、Shift、Windows等键时才会生效</param>
        /// <param name="vk">定义热键的内容</param>
        /// <returns></returns>
        [DllImport("user32.dll", SetLastError = true)]
        public static extern bool RegisterHotKey(IntPtr hWnd, int id, KeyModifiers fsModifiers, Keys vk);
        /// <summary>
        /// 注销热键
        /// </summary>
        /// <param name="hWnd">要取消热键的窗口的句柄</param>
        /// <param name="id">要取消热键的ID</param>
        /// <returns></returns>
        [DllImport("user32.dll", SetLastError = true)]
        public static extern bool UnregisterHotKey(IntPtr hWnd, int id);
        /// <summary>
        /// 辅助键名称。
        /// Alt, Ctrl, Shift, WindowsKey
        /// </summary>
        [Flags()]
        public enum KeyModifiers { None = 0, Alt = 1, Ctrl = 2, Shift = 4, WindowsKey = 8 }
        /// <summary>
        /// 注册热键
        /// </summary>
        /// <param name="hwnd">窗口句柄</param>
        /// <param name="hotKey_id">热键ID</param>
        /// <param name="keyModifiers">组合键</param>
        /// <param name="key">热键</param>
        public static bool RegHotKey(IntPtr hwnd, int hotKeyId, KeyModifiers keyModifiers, Keys key)
        {
            if (!RegisterHotKey(hwnd, hotKeyId, keyModifiers, key))
            {
                int errorCode = Marshal.GetLastWin32Error();
                //if (errorCode == 1409)
                //{
                //    MessageBox.Show("热键被占用 !");
                //}
                //else
                //{
                //    MessageBox.Show("注册热键失败!错误代码:" + errorCode);
                //}
                return false;
            }
            return true;
        }
        /// <summary>
        /// 注销热键
        /// </summary>
        /// <param name="hwnd">窗口句柄</param>
        /// <param name="hotKey_id">热键ID</param>
        public static void UnRegHotKey(IntPtr hwnd, int hotKeyId)
        {
            //注销指定的热键
            UnregisterHotKey(hwnd, hotKeyId);
        }
    }
}
src/RichCreator.Utility/ZTResult.cs
New file
@@ -0,0 +1,18 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace RichCreator.Utility
{
    //结果
    public enum ZTResult:Int32
    {
        Failed=0,//失败
        Success=1,//成功
        Timeout=2,//超时
        Cancel=3//取消
    }
}
src/RichCreator/Dnf/DnfRole.cs
New file
@@ -0,0 +1,638 @@
using RichCreator.Utility;
using RichCreator.Utility.Dnf;
using RichCreator.Utility.InputControl;
using RichCreator.Utility.Maps;
using RichCreator.Utility.Structs;
using System;
using System.Threading;
namespace RichCreator.Dnf
{
    /// <summary>
    /// DNF角色
    /// </summary>
    public class DnfRole
    {
        private SpeedProvider speed;//速度
        private const Int32 PaddingLeft = 140;//左边框内边距
        private const Int32 PaddingRight = 140;//右边框内边距
        public DnfRole(ZTRectangle gameRect)
        {
            this.gameRect = gameRect;
            speed = SpeedProvider.Define;
        }
        private Int32 minCenterLineY;
        private Int32 maxCenterLineY;
        private Int32 centerLineErrorRange = 35;//中间性可允许的误差
        private HouseInfo house;
        private ZTRectangle gameRect = ZTRectangle.Empty;
        private MoveIntent movingIntent = MoveIntent.AttackMove;//移动意图
        private MoveMethod movingMethod = MoveMethod.Vertical;//移动方式,默认垂直移动
        private ZTSize movingDistance;//移动距离
        public ZTPoint Position { get; private set; }//角色位置
        /// <summary>
        /// 按下的键,0:横向,1:纵向
        /// </summary>
        private HIDCode[] pressKeys = new HIDCode[] { HIDCode.NoEvent, HIDCode.NoEvent };//当前按键
        private bool isRun = false;//是否奔跑
        /// <summary>
        /// 设置当前房间信息
        /// </summary>
        /// <param name="house"></param>
        public void SetHouse(HouseInfo house)
        {
            this.house = house;
            minCenterLineY = this.gameRect.End.Y + this.house.HouseCenterMoveLine - centerLineErrorRange;
            maxCenterLineY = this.gameRect.End.Y + this.house.HouseCenterMoveLine + centerLineErrorRange;
        }
        /// <summary>
        /// 设置当前角色速度
        /// </summary>
        /// <param name="speed"></param>
        public void SetSpeed(Int32 speed)
        {
            this.speed = new SpeedProvider(speed);
        }
        /// <summary>
        /// 更新位置
        /// </summary>
        /// <param name="position"></param>
        public void UpdatePosition(ZTPoint position)
        {
            this.Position = position;
        }
        /// <summary>
        /// 是否移动中
        /// </summary>
        public bool IsMoving
        {
            get
            {
                return pressKeys[0] != HIDCode.NoEvent || pressKeys[1] != HIDCode.NoEvent;
            }
        }
        /// <summary>
        /// 是否指定移动行为
        /// </summary>
        /// <param name="intent"></param>
        /// <returns></returns>
        public bool IsMoveIntent(MoveIntent intent)
        {
            if (IsMoving && movingIntent == intent)
            {
                return true;
            }
            return false;
        }
        /// <summary>
        /// 攻击移动
        /// </summary>
        /// <param name="moveDistance"></param>
        public void AttackMove(ZTSize moveDistance)
        {
            PutKey(moveDistance);
            movingIntent = MoveIntent.AttackMove;
        }
        private Int32 findRoleDir = 0;//寻找角色行走的方向
        private DateTime findRoleMoveTimeout = DateTime.MinValue;//方向移动过期时间
        private static HIDCode[][] dir = new HIDCode[][] { new HIDCode[] { HIDCode.LeftArrow ,HIDCode.NoEvent}, new HIDCode[] { HIDCode.NoEvent, HIDCode.UpArrow }, new HIDCode[] { HIDCode.RightArrow, HIDCode.NoEvent }, new HIDCode[] { HIDCode.NoEvent, HIDCode.DownArrow } };
        /// <summary>
        /// 查找主角移动
        /// </summary>
        /// <param name="moveDistance"></param>
        public void FindRoleMove()
        {
            if (IsMoving &&  !IsMoveIntent(MoveIntent.FindRoleMove))
            {
                StopMove();
            }
            if (DateTime.Now >= findRoleMoveTimeout)
            {
                //转换方向
                findRoleDir++;
                HIDCode[]  tempKeys = dir[findRoleDir % 4];
                Int32 stepms = 0, runms = 0;
                PutKey(out stepms, out runms, tempKeys[0], tempKeys[1], true);
                findRoleMoveTimeout = DateTime.Now.AddMilliseconds(speed.RandomMoveMillSecond);
            }
            //if (!IsMoving || (IsMoving && KeyIsChange(tempKeys)))
            //{
            //    //Int32 stepms = 0, runms = 0;
            //    //PutKey(out stepms, out runms, tempKeys[0], tempKeys[1], true);
            //}
            movingIntent = MoveIntent.FindRoleMove;
        }
        /// <summary>
        /// 拾起物品移动
        /// </summary>
        public void PickupMove(ZTPoint rolePosition, ZTPoint thingItemPosition)
        {
            ZTSize moveDistance = new ZTSize(thingItemPosition.X - rolePosition.X, thingItemPosition.Y - rolePosition.Y - 97);
            if (Math.Abs(moveDistance.Width) < 100 && Math.Abs(moveDistance.Height) < 100)
            {
                //距离允许,就近距离移动并X
                G.Instance.DebugWriter("distance ok");
                SyncMove(new ZTPoint(moveDistance.Width,moveDistance.Height));
                G.Instance.InputControl.PressKey(RandomUtils.G(400, 500), HIDCode.X);
                return;
            }
            //G.Instance.DebugWriter("pickup distance:" + moveDistance.ToString());
            PutKey(moveDistance);
            movingIntent = MoveIntent.PickupMove;
        }
        /// <summary>
        /// 找门移动
        /// </summary>
        /// <param name="rolePosition"></param>
        public void FindDoorMove(ZTPoint rolePosition)
        {
            ComputeMoveInfo(rolePosition);
            HIDCode dirKey = HIDCode.NoEvent;
            switch (movingMethod)
            {
                case MoveMethod.ToLeft:
                    dirKey = HIDCode.LeftArrow;
                    break;
                case MoveMethod.ToRight:
                    dirKey = HIDCode.RightArrow;
                    break;
                case MoveMethod.Vertical:
                    dirKey = movingDistance.Height > 0 ? HIDCode.DownArrow : HIDCode.UpArrow;
                    break;
                case MoveMethod.Fixed:
                    SyncMove(new ZTPoint(movingDistance.Width,movingDistance.Height));
                    StopMove();
                    return;
            }
            PutKey(movingDistance);
            movingIntent = MoveIntent.FindDoorMove;
        }
        /// <summary>
        /// 同步移动指定距离
        /// </summary>
        /// <param name="distance"></param>
        public void SyncMove(ZTPoint size)
        {
            ZTSize distance = new ZTSize(size.X, size.Y);
            HIDCode horizontal = HIDCode.NoEvent;
            HIDCode vertical = HIDCode.NoEvent;
            bool isRun = false;
            int runms, stepms;
            Int32 xsig = Math.Sign(distance.Width);
            Int32 ysig = Math.Sign(distance.Height);
            if (Math.Abs(distance.Width) >= speed.RunThresold)
            {
                isRun = true;
            }
            if (distance.Height > 0)
            {
                vertical = HIDCode.DownArrow;
            }
            if (distance.Height < 0)
            {
                vertical = HIDCode.UpArrow;
            }
            if (distance.Width > 0)
            {
                horizontal = HIDCode.RightArrow;
            }
            if (distance.Width < 0)
            {
                horizontal = HIDCode.LeftArrow;
            }
            PutKey(out stepms, out runms, horizontal, vertical, isRun);
            if (stepms > 0)
            {
                Int32 mdistance = (Int32)(stepms * speed.StepX);
                if (runms > 0)
                {
                    mdistance += (Int32)(runms * speed.RunX);
                }
                distance = new ZTSize(distance.Width - xsig * mdistance, distance.Height);
            }
            int ytime = (Int32)(Math.Abs(distance.Height) / speed.StepY);
            Int32 xtime = (Int32)(Math.Abs(distance.Width) / speed.StepX);
            if (isRun)
            {
                xtime = (Int32)(Math.Abs(distance.Width) / speed.RunX);
            }
            Int32 mintime = Math.Min(xtime, ytime);
            if (xtime <= 0)
            {
                mintime = ytime;
            }
            if (ytime <= 0)
            {
                mintime = xtime;
            }
            Thread.Sleep(mintime);
            xtime -= mintime;
            ytime -= mintime;
            if (xtime > 0)
            {
                PutKey(out stepms, out runms, horizontal, HIDCode.NoEvent, isRun);
                Thread.Sleep(xtime);
            }
            if (ytime > 0)
            {
                PutKey(out stepms, out runms, HIDCode.NoEvent, vertical, false);
                Thread.Sleep(ytime);
            }
            StopMove();
        }
        /// <summary>
        /// 停止移动
        /// </summary>
        public void StopMove()
        {
            if (IsMoving)
            {
                //停止
                G.Instance.InputControl.PutDown(false, false, false, false, false, false, false, false);
                pressKeys[0] = HIDCode.NoEvent;
                pressKeys[1] = HIDCode.NoEvent;
                isRun = false;
            }
        }
        /// <summary>
        /// 休眠
        /// </summary>
        /// <param name="millSecond"></param>
        public void Sleep(Int32 millSecond)
        {
            Thread.Sleep(millSecond);
        }
        /// <summary>
        /// 释放技能
        /// </summary>
        public void ReleaseSkill(HIDCode key)
        {
            ReleaseSkill(key, 0);
        }
        public void ReleaseSkill(HIDCode key, Int32 skillTimeout)
        {
            Int32 dur = RandomUtils.KeyPressDuration;
            G.Instance.InputControl.PressKey(dur,key);
            Int32 subTime = skillTimeout - dur;
            if (subTime > 0)
            {
                Thread.Sleep(subTime);
            }
        }
        private ZTPoint roleLastPosition = ZTPoint.Empty;
        private bool StaticTimerIsStart = false;//静止计时是否开始
        private Int32 StaticTimerCounter = 0;//静止计时计数器
        private DateTime DetectLastNoMoveTime = DateTime.MaxValue;//最后没移动时间
        private const Int32 NoMoveMaxMillSecond = 2000;//最大未移动容忍毫秒数
        /// <summary>
        /// 得到循环移动的距离
        /// </summary>
        /// <returns></returns>
        private void ComputeMoveInfo(ZTPoint rolePosition)
        {
            ZTRectangle limitRect = ZTRectangle.Empty;
            //达到未移动阀值,可能有障碍物,先攻击,如果攻击后还是无效则上下左右移
            if (rolePosition.Equals(this.roleLastPosition))
            {
                if (StaticTimerIsStart)
                {
                    if ((DateTime.Now - DetectLastNoMoveTime).TotalMilliseconds > NoMoveMaxMillSecond)
                    {
                        G.Instance.DebugWriter($"find door not move,role position:{rolePosition.ToString()}");
                        this.StopMove();
                        if (StaticTimerCounter == 0)
                        {
                            //清除障碍物
                            G.Instance.InputControl.PressKey(RandomUtils.KeyPressDuration, HIDCode.X);
                        }
                        else
                        {
                            //无法清除障碍物,随机移动一下
                            switch (StaticTimerCounter % 4)
                            {
                                case 0:
                                    G.Instance.DebugWriter("random up");
                                    //上
                                    movingDistance = new ZTSize(0, -300);
                                    break;
                                case 1:
                                    //右
                                    movingDistance = new ZTSize(600, 0);
                                    break;
                                case 2:
                                    //下
                                    movingDistance = new ZTSize(0, 300);
                                    break;
                                case 3:
                                    //左
                                    movingDistance = new ZTSize(-600, 0);
                                    break;
                            }
                            movingMethod = MoveMethod.Fixed;
                        }
                        StaticTimerCounter++;
                        DetectLastNoMoveTime = DateTime.Now;
                        if (StaticTimerCounter > 1)
                        {
                            return;
                        }
                    }
                }
                else if (!StaticTimerIsStart)
                {
                    //没开始计时 则 开始计时
                    StaticTimerIsStart = true;
                    DetectLastNoMoveTime = DateTime.Now;
                }
            }
            else
            {
                //移动了 取消计时
                this.roleLastPosition = rolePosition;
                StaticTimerIsStart = false;
                StaticTimerCounter = 0;
            }
            if (!IsMoving)
            {
                //刚开始移动
                movingMethod = MoveMethod.Vertical;
            }
            if (movingMethod == MoveMethod.Vertical && rolePosition.Y >= minCenterLineY && rolePosition.Y <= maxCenterLineY)
            {
                //不需要上下移动,计算左右
                if (this.house.DoorDirection[0] == Direction.Left)
                {
                    movingMethod = MoveMethod.ToLeft;
                }
                else if (this.house.DoorDirection[0] == Direction.Right)
                {
                    movingMethod = MoveMethod.ToRight;
                }
                else
                {
                    //计算是向左还是右,哪边大往哪边
                    if (rolePosition.X > (this.gameRect.Start.X + (this.gameRect.End.X - this.gameRect.Start.X) / 2))
                    {
                        //左边空间大
                        movingMethod = MoveMethod.ToLeft;
                    }
                    else
                    {
                        movingMethod = MoveMethod.ToRight;
                    }
                }
            }
            if (movingMethod == MoveMethod.ToLeft)
            {
                //计算左边界范围
                limitRect = new ZTRectangle(gameRect.Start.X, gameRect.Start.Y, gameRect.Start.X + PaddingLeft, gameRect.End.Y);
                //判断是否到左边界
                if (RichCreator.Utilitys.Utils.IsInRect(rolePosition, limitRect))
                {
                    //到左边界就向右走
                    movingMethod = MoveMethod.ToRight;
                    movingDistance = new ZTSize(gameRect.End.X - rolePosition.X, 0);
                }
                else
                {
                    //没到继续向左走
                    movingMethod = MoveMethod.ToLeft;
                    movingDistance = new ZTSize(limitRect.Start.X - rolePosition.X, 0);
                }
            }
            else if (movingMethod == MoveMethod.ToRight)
            {
                //计算右边界范围
                limitRect = new ZTRectangle(gameRect.End.X - PaddingRight, gameRect.Start.Y, gameRect.End.X, gameRect.End.Y);
                //判断是否到右边界
                if (Utilitys.Utils.IsInRect(rolePosition, limitRect))
                {
                    //到右边界就向左走
                    G.Instance.InfoWriter($"in limit rect,role position:{rolePosition.ToString()},limit:{limitRect.ToString()}");
                    movingMethod = MoveMethod.ToLeft;
                    movingDistance = new ZTSize(gameRect.Start.X - rolePosition.X, 0);
                }
                else
                {
                    //没到继续向右走
                    movingMethod = MoveMethod.ToRight;
                    movingDistance = new ZTSize(gameRect.End.X - rolePosition.X, 0);
                }
            }
            else
            {
                //向点移动
                Int32 targetY = gameRect.End.Y + this.house.HouseCenterMoveLine;
                movingDistance = new ZTSize(0, targetY - rolePosition.Y);
            }
        }
        #region 八方向移动
        /// <summary>
        /// 按下按键
        /// </summary>
        /// <param name="distance"></param>
        private void PutKey(ZTSize distance)
        {
            HIDCode horizontal = HIDCode.NoEvent;
            HIDCode vertical = HIDCode.NoEvent;
            bool isRun = false;
            if (distance.Width < 0)
            {
                horizontal = HIDCode.LeftArrow;
            }
            if (distance.Width > 0)
            {
                horizontal = HIDCode.RightArrow;
            }
            if (Math.Abs(distance.Width) >= speed.RunThresold)
            {
                isRun = true;
            }
            if (distance.Height < 0)
            {
                vertical = HIDCode.UpArrow;
            }
            if (distance.Height > 0)
            {
                vertical = HIDCode.DownArrow;
            }
            Int32 stepms, runms;
            PutKey(out stepms, out runms, horizontal, vertical, isRun);
        }
        /// <summary>
        /// 行走按键
        /// </summary>
        /// <param name="stepMS">已经步行ms</param>
        /// <param name="runMS">已经奔跑ms</param>
        /// <param name="horizontal">横向按键</param>
        /// <param name="vertical">纵向按键</param>
        /// <param name="isRun">是否奔跑</param>
        private void PutKey(out Int32 stepMS, out Int32 runMS, HIDCode horizontal, HIDCode vertical, bool isRun)
        {
            stepMS = 0;
            runMS = 0;
            if (horizontal == vertical)
            {
                return;
            }
            if (horizontal == pressKeys[0] && vertical == pressKeys[1])
            {
                return;
            }
            int keyCount = horizontal != HIDCode.NoEvent && vertical != HIDCode.NoEvent ? 2 : 1;
            Int32 tempwait = 0;
            if (isRun)
            {
                //跑
                if (!this.isRun || horizontal != pressKeys[0])
                {
                    //如果之前没有跑,或跑的方向不一样,则开始跑
                    G.Instance.InputControl.PutDown(false, false, false, false, false, false, false, false, horizontal);
                    tempwait = RandomUtils.KeyPressDuration;
                    stepMS += tempwait;
                    Thread.Sleep(tempwait);
                    G.Instance.InputControl.PutDown(false, false, false, false, false, false, false, false);
                    Thread.Sleep(RandomUtils.KeyPressDuration);
                    G.Instance.InputControl.PutDown(false, false, false, false, false, false, false, false, horizontal);
                    this.isRun = true;
                    if (keyCount == 2)
                    {
                        tempwait = RandomUtils.KeyPressDuration;
                        runMS += tempwait;
                        Thread.Sleep(tempwait);
                        G.Instance.InputControl.PutDown(false, false, false, false, false, false, false, false, horizontal, vertical);
                    }
                }
                else
                {
                    //奔跑方向不变
                    int afterKeyCount = pressKeys[0] != HIDCode.NoEvent && pressKeys[1] != HIDCode.NoEvent ? 2 : 1;
                    if (afterKeyCount != keyCount)
                    {
                        //如果跟原来按键数量不一样
                        if (keyCount == 1)
                        {
                            G.Instance.InputControl.PutDown(false, false, false, false, false, false, false, false, horizontal);
                        }
                        else
                        {
                            G.Instance.InputControl.PutDown(false, false, false, false, false, false, false, false, horizontal, vertical);
                        }
                    }
                }
            }
            else
            {
                //走
                if (keyCount == 1)
                {
                    G.Instance.InputControl.PutDown(false, false, false, false, false, false, false, false, horizontal != HIDCode.NoEvent ? horizontal : vertical);
                }
                else
                {
                    G.Instance.InputControl.PutDown(false, false, false, false, false, false, false, false, horizontal, vertical);
                }
            }
            pressKeys[0] = horizontal;
            pressKeys[1] = vertical;
        }
        /// <summary>
        /// 按钮是否变化
        /// </summary>
        /// <param name="pressKey"></param>
        /// <returns></returns>
        private bool KeyIsChange(HIDCode[] pressKey)
        {
            if (pressKey == null || pressKey.Length != 2)
            {
                return true;
            }
            if (pressKeys[0] == pressKey[0] && pressKeys[1] == pressKey[1])
            {
                return false;
            }
            return true;
        }
        #endregion
    }
}
src/RichCreator/Dnf/IMiniMap.cs
New file
@@ -0,0 +1,90 @@
using Emgu.CV;
using Emgu.CV.Structure;
using RichCreator.Utility.Captures;
using RichCreator.Utility.Structs;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace RichCreator.Dnf
{
    /// <summary>
    /// 小地图
    /// </summary>
    public abstract class IMiniMap
    {
        public ZTRectangle GameRect { get; private set; }
        public ZTPoint MinimapOffset { get; private set; }
        public IMiniMap(ZTRectangle gameRect,ZTPoint miniMapOffset)
        {
            this.GameRect = gameRect;
            this.MinimapOffset = miniMapOffset.Add(gameRect.Start);
        }
        /// <summary>
        /// 获取房间号
        /// </summary>
        /// <param name="houseIndex">房间号,以0开始</param>
        /// <param name="image">图像,可以传空,传空则自获取</param>
        /// <returns>true:获取成功,false:获取失败</returns>
        public bool GetCurrentHouseIndex(out int houseIndex, Image<Rgb, byte> image)
        {
            if (image == null)
            {
                image = ScreenCapture.Instance.CaptureScreenReturnImage();
                image = image.GetSubRect(new System.Drawing.Rectangle(this.GameRect.Start.X, this.GameRect.Start.Y, this.GameRect.End.X - this.GameRect.Start.X + 1, this.GameRect.End.Y - this.GameRect.Start.Y + 1));
            }
            return GetCurrentHouse(out houseIndex, image);
        }
        /// <summary>
        /// 在超时之前获取房间号
        /// </summary>
        /// <param name="houseIndex">房间号,以0开始</param>
        /// <param name="image">图像,可以传空,传空则自获取</param>
        /// <param name="timeoutMillSecond">超时毫秒数</param>
        /// <returns>true:获取成功,false:获取失败</returns>
        public bool GetCurrentHouseIndexWaitTimeout(out int houseIndex, Image<Rgb, byte> image, CancellationToken cancelToken, Int32 timeoutMillSecond)
        {
            houseIndex = 0;
            Int32 houseid = -1;
            if (image != null)
            {
                if (GetCurrentHouse(out houseid, image))
                {
                    houseIndex = houseid;
                    return true;
                }
            }
            if (!FuncUtils.TimeoutCancelableWrap(timeoutMillSecond, cancelToken, () =>
            {
                using (System.Drawing.Bitmap bitmap = ScreenCapture.Instance.CaptureScreen())
                {
                    image = new Image<Rgb, byte>(bitmap);
                    image = image.GetSubRect(new System.Drawing.Rectangle(this.GameRect.Start.X, this.GameRect.Start.Y, this.GameRect.End.X - this.GameRect.Start.X + 1, this.GameRect.End.Y - this.GameRect.Start.Y + 1));
                    return GetCurrentHouse(out houseid, image);
                }
            }, 50))
            {
                return false;
            }
            houseIndex = houseid;
            return true;
        }
        /// <summary>
        /// 计算当前房间号
        /// </summary>
        /// <param name="houseIndex"></param>
        /// <param name="image"></param>
        /// <returns></returns>
        protected abstract bool GetCurrentHouse(out Int32 houseIndex, Image<Rgb, byte> image);
    }
}
src/RichCreator/Dnf/MapInfo.cs
New file
@@ -0,0 +1,72 @@
using RichCreator.Utility;
using RichCreator.Utility.Maps;
using RichCreator.Utility.Structs;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace RichCreator.Dnf
{
    /// <summary>
    /// 地图信息
    /// </summary>
    public abstract class MapInfo
    {
        public MapInfo(MapType mapType, ZTRectangle gameRect, CancellationToken cancellationToken)
        {
            this.MapType = mapType;
            this.GameRect = gameRect;
            this.CancelToken = cancellationToken;
        }
        /// <summary>
        /// 游戏区域
        /// </summary>
        public ZTRectangle GameRect { get; set; }
        /// <summary>
        /// 小地图
        /// </summary>
        public IMiniMap MiniMap { get; set; }
        /// <summary>
        /// 取消令牌
        /// </summary>
        public CancellationToken CancelToken { get; set; }
        /// <summary>
        /// 地图类型
        /// </summary>
        public MapType MapType { get; set; }
        /// <summary>
        /// 开始刷图
        /// </summary>
        /// <returns></returns>
        public abstract ZTResult Start(Int32 runningStep);
        /// <summary>
        /// 是否已进入地图
        /// </summary>
        /// <returns></returns>
        public virtual bool IsEntryMap()
        {
            return true;
        }
        /// <summary>
        /// 进入每个房间后的前置工作
        /// </summary>
        /// <param name="houseIndex"></param>
        /// <param name="preHouseIndex"></param>
        public virtual void EntryHousePrework(Int32 houseIndex, Int32 preHouseIndex)
        { }
    }
}
src/RichCreator/Jobs/DNFJob.cs
@@ -17,38 +17,51 @@
using System.Threading.Tasks;
using ZTImage.Configuration;
using RichCreator.StateMachines;
using RichCreator.Utility.Maps;
using RichCreator.Maps.Kalete;
using RichCreator.Maps.Lindong;
using RichCreator.Maps.SkillSetting;
using RichCreator.Maps.Test;
using RichCreator.Dnf;
namespace RichCreator.Jobs
{
    public class DNFJob<T> : JobBase where T:MapInfo,new()
    public class DNFJob : JobBase
    {
        public DNFJob(RichCreatorConfig config) : base(config)
        { }
        public DNFJob(MapType mapType,RichCreatorConfig config) : base(config)
        {
            this.MapType = mapType;
        }
        /// <summary>
        /// 选角色时的角色选择偏移
        /// </summary>
        private static Utility.Structs.ZTPoint[] RoleOffset = new Utility.Structs.ZTPoint[] {
            new Utility.Structs.ZTPoint (154,225),
            new Utility.Structs.ZTPoint (300,225),
            new Utility.Structs.ZTPoint (443,225),
            new Utility.Structs.ZTPoint (593,225),
            new Utility.Structs.ZTPoint (726,225),
            new Utility.Structs.ZTPoint (883,225),
        private static ZTPoint[] RoleOffset = new Utility.Structs.ZTPoint[] {
            new ZTPoint (154,225),
            new ZTPoint (300,225),
            new ZTPoint (443,225),
            new ZTPoint (593,225),
            new ZTPoint (726,225),
            new ZTPoint (883,225),
            new Utility.Structs.ZTPoint (154,455),
            new Utility.Structs.ZTPoint (300,455),
            new Utility.Structs.ZTPoint (443,455),
            new Utility.Structs.ZTPoint (593,455),
            new Utility.Structs.ZTPoint (726,455),
            new Utility.Structs.ZTPoint (883,455)
            new ZTPoint (154,455),
            new ZTPoint (300,455),
            new ZTPoint (443,455),
            new ZTPoint (593,455),
            new ZTPoint (726,455),
            new ZTPoint (883,455)
        };
        /// <summary>
        /// 游戏窗口
        /// </summary>
        private ZTRectangle GameRect;
        public ZTRectangle GameRect;
        /// <summary>
        /// 地图类型
        /// </summary>
        public MapType MapType { get; private set; }
        private Int32 runningStep = 0;
@@ -161,8 +174,8 @@
            if (pilaozhi > 0)
            {
                //刷图,并保持在可按esc退出的状态
                MapInfo map = new T();
                mapResult = map.Start(this.GameRect, cancellationToken,this.runningStep);
                MapInfo map = CreateMap( cancellationToken);
                mapResult = map.Start(this.runningStep);
            }
            runningStep = RunningStep.None;
@@ -285,5 +298,29 @@
            G.Instance.InfoWriter("退回选择角色界面失败");
            return false;
        }
        /// <summary>
        /// 根据当前选择的地图实例化DNF地图
        /// </summary>
        /// <param name="config"></param>
        /// <returns></returns>
        private MapInfo CreateMap(CancellationToken cancelToken)
        {
            switch (this.MapType)
            {
                case MapType.Lingdong:
                    return new LindongMap(this.GameRect,cancelToken);
                case MapType.Kalete:
                    return new KaleteMap(this.GameRect, cancelToken);
                case MapType.SkillSetting:
                    return new SkillSettingMap(this.GameRect, cancelToken);
                case MapType.Test:
                    return new TestMap(this.GameRect, cancelToken);
            }
            throw new Exception("this task index is error");
        }
    }
}
src/RichCreator/Jobs/JobBase.cs
@@ -1,4 +1,5 @@
using RichCreator.Utility.InputControl;
using RichCreator.Utility;
using RichCreator.Utility.InputControl;
using System;
using System.Collections.Generic;
using System.Linq;
src/RichCreator/Jobs/JobMonitor.cs
@@ -18,6 +18,7 @@
using System.Threading.Tasks;
using ZTImage.Configuration;
using RichCreator.Maps;
using RichCreator.Utility.Maps;
namespace RichCreator
{
@@ -30,15 +31,15 @@
        private WeGameJob wegameJob;
        private JobBase dnfJob;
        private Int32 taskIndex;
        private MapType mapType;
        Int32 runningStep = RunningStep.None;
        public JobMonitor(Int32 taskIndex)
        public JobMonitor(MapType maptype)
        {
            this.config = ConfigHelper.GetInstance<RichCreatorConfig>();
            this.cancelTokenSource = new CancellationTokenSource();
            this.taskIndex = taskIndex;
            this.mapType = maptype;
        }
        /// <summary>
@@ -109,7 +110,7 @@
                //设为顶层
                WindowUtils.SetDnfToTop();
                this.dnfJob = GetDNFJob();
                this.dnfJob = new DNFJob(this.mapType, this.config);
                jobResult = this.dnfJob.Do(this.cancelTokenSource.Token, runningStep);
                if (jobResult != ZTResult.Success)
                {
@@ -158,23 +159,5 @@
            ProcessUtils.CloseWeGame();
        }
        /// <summary>
        /// 根据当前选择的地图实例化DNF地图
        /// </summary>
        /// <param name="config"></param>
        /// <returns></returns>
        private JobBase GetDNFJob()
        {
            switch (this.taskIndex)
            {
                case 0:
                    return new DNFJob<LindongMap>(this.config);
                case 1:
                    return new DNFJob<SkillMap>(this.config);
                case 2:
                    return new DNFJob<TestMap>(this.config);
            }
            throw new Exception("this task index is error");
        }
    }
}
src/RichCreator/Jobs/WeGameJob.cs
@@ -13,7 +13,7 @@
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using RichCreator.Utility;
namespace RichCreator.Jobs
{
src/RichCreator/MainWindow.xaml
@@ -7,6 +7,8 @@
        mc:Ignorable="d"
        WindowStyle="SingleBorderWindow"
        ResizeMode="NoResize"
        Loaded="Window_Loaded"
        Unloaded="Window_Unloaded"
        Title="富豪自动创造机" Height="250" Width="800" WindowStartupLocation="CenterScreen">
    <Window.Resources>
        <Style TargetType="Border" x:Key="RowBorderStyle">
@@ -79,11 +81,16 @@
                            <Button Content="移动"  Padding="15 0 15 0" Margin="5" Click="TestMoveClick" />-->
                                <ComboBox SelectedIndex="0" x:Name="taskName" VerticalAlignment="Center">
                                    <ComboBoxItem >凛冬</ComboBoxItem>
                                    <ComboBoxItem >技能</ComboBoxItem>
                                    <ComboBoxItem >卡勒特</ComboBoxItem>
                                    <ComboBoxItem >技能设置</ComboBoxItem>
                                    <ComboBoxItem >测试</ComboBoxItem>
                                    <ComboBoxItem >测速</ComboBoxItem>
                                    <ComboBoxItem >测技能</ComboBoxItem>
                                    <ComboBoxItem>读角色位置</ComboBoxItem>
                                    <ComboBoxItem>移动进门</ComboBoxItem>
                                </ComboBox>
                                <Button Content="清空"  Padding="15 0 15 0" Margin="5" Click="ClearLog_Click" />
                                <Button Content="运行"  Padding="15 0 15 0" Margin="5" Click="Run_Click" x:Name="RunningButton" />
                                <Button Content="运行(Home)"  Padding="15 0 15 0" Margin="5" Click="Run_Click" x:Name="RunningButton" />
                            </StackPanel>
                        </Grid>
                        
src/RichCreator/MainWindow.xaml.cs
@@ -16,6 +16,12 @@
using System.Windows.Controls;
using ZTImage.Configuration;
using ZTImage.Log;
using RichCreator.Utility.Maps;
using RichCreator.Dnf;
using System.Windows.Interop;
using RichCreator.Maps.Kalete;
using ZTImage.Collections;
using System.Collections.Generic;
namespace RichCreator
{
@@ -45,7 +51,36 @@
        /// <param name="e"></param>
        private void Run_Click(object sender, RoutedEventArgs e)
        {
            Int32 taskIndex = this.taskName.SelectedIndex;
            MapType mapType = (MapType)this.taskName.SelectedIndex;
            if (mapType == MapType.TestSpeed)
            {
                //测速
                G.Instance.InfoWriter("开始测速");
                TestSpeed();
                return;
            }
            else if (mapType == MapType.TestSkill)
            {
                //测技能
                G.Instance.InfoWriter("开始测技能");
                TestSkill();
                return;
            }
            else if (mapType == MapType.ReadRolePosition)
            {
                //读取角色位置
                G.Instance.InfoWriter("开始测角色位置");
                ReadRolePosition();
                return;
            }
            else if (mapType == MapType.TestToNextDoor)
            {
                //测试进入下一关的门
                G.Instance.InfoWriter("开始测进门");
                TestToNextDoor();
                return;
            }
            if (isRunning)
            {
                monitor.Stop();
@@ -68,7 +103,7 @@
                }
                G.Instance.DebugWriter("硬件检测通过");
                
                this.monitor = new JobMonitor(taskIndex);
                this.monitor = new JobMonitor(mapType);
                monitor.Start();
                startTaskUI();
@@ -172,6 +207,161 @@
            hsvImage = hsvImage.GetSubRect(new System.Drawing.Rectangle(0, 0, 1280, 720));
            return DnfCVHelper.FindRole(hsvImage, new ZTRectangle(0, 0, 1280, 720));
        }
        /// <summary>
        /// 测速
        /// </summary>
        private void TestSpeed()
        {
            ZTRectangle gameRect = ZTRectangle.Empty;
            WindowUtils.GetDnfRect(out gameRect);
            Image<Hsv, byte> hsvImage = new Image<Hsv, byte>(gameRect.End.X - gameRect.Start.X + 1, gameRect.End.Y - gameRect.Start.Y + 1);
            Task.Run(() =>
            {
                WindowUtils.SetDnfToTop();
                Thread.Sleep(1000);
                Image<Rgb, byte> image = ScreenCapture.Instance.CaptureScreenReturnImage();
                CvInvoke.CvtColor(image, hsvImage, Emgu.CV.CvEnum.ColorConversion.Rgb2Hsv);
                ZTPoint start = DnfCVHelper.FindRole(hsvImage, gameRect);
                G.Instance.InputControl.PutDown(false, false, false, false, false, false, false, false, HIDCode.LeftArrow);
                Thread.Sleep(30);
                G.Instance.InputControl.PutDown(false, false, false, false, false, false, false, false);
                Thread.Sleep(30);
                G.Instance.InputControl.PutDown(false, false, false, false, false, false, false, false, HIDCode.LeftArrow);
                Thread.Sleep(800);
                G.Instance.InputControl.PutDown(false, false, false, false, false, false, false, false);
                //G.Instance.InputControl.PutDown(false, false, false, false, false, false, false, false, HIDCode.DownArrow);
                //Thread.Sleep(1000);
                //G.Instance.InputControl.PutDown(false, false, false, false, false, false, false, false);
                //G.Instance.InputControl.PutDown(false, false, false, false, false, false, false, false, HIDCode.LeftArrow);
                //Thread.Sleep(1000);
                //G.Instance.InputControl.PutDown(false, false, false, false, false, false, false, false);
                image = ScreenCapture.Instance.CaptureScreenReturnImage();
                CvInvoke.CvtColor(image, hsvImage, Emgu.CV.CvEnum.ColorConversion.Rgb2Hsv);
                ZTPoint end = DnfCVHelper.FindRole(hsvImage, gameRect);
                G.Instance.InfoWriter($"from:{start},to:{end},distanceX:{end.X - start.X},distanceY:{end.Y - start.Y}");
            });
        }
        /// <summary>
        /// 测技能
        /// </summary>
        private void TestSkill()
        {
            ZTRectangle gameRect = ZTRectangle.Empty;
            WindowUtils.GetDnfRect(out gameRect);
            Image<Hsv, byte> hsvImage = new Image<Hsv, byte>(gameRect.End.X - gameRect.Start.X + 1, gameRect.End.Y - gameRect.Start.Y + 1);
            Task.Run(() => {
                WindowUtils.SetDnfToTop();
                Thread.Sleep(10);
                KaleteMap map = new KaleteMap(gameRect, CancellationToken.None);
                Int32 lastHouseIndex = -1;
                Int32 houseIndex = -1;
                while (true)
                {
                    Image<Rgb, byte> image = ScreenCapture.Instance.CaptureScreenReturnImage();
                    if (map.MiniMap.GetCurrentHouseIndex(out houseIndex, image))
                    {
                        if (houseIndex != lastHouseIndex)
                        {
                            G.Instance.InfoWriter($"entry house:{houseIndex}");
                            lastHouseIndex = houseIndex;
                            //发技能
                            map.EntryHousePrework(houseIndex, lastHouseIndex);
                        }
                    }
                    Thread.Sleep(500);
                }
                G.Instance.InfoWriter($"测试技能发放完成");
            });
        }
        private ZTPoint rolePosition = ZTPoint.Empty;
        /// <summary>
        /// 读取角色位置
        /// </summary>
        private void ReadRolePosition()
        {
            ZTRectangle gameRect = ZTRectangle.Empty;
            WindowUtils.GetDnfRect(out gameRect);
            Image<Hsv, byte> hsvImage = new Image<Hsv, byte>(gameRect.End.X - gameRect.Start.X + 1, gameRect.End.Y - gameRect.Start.Y + 1);
            Task.Run(() => {
                WindowUtils.SetDnfToTop();
                Thread.Sleep(1000);
                Image<Rgb, byte> image = ScreenCapture.Instance.CaptureScreenReturnImage();
                CvInvoke.CvtColor(image, hsvImage, Emgu.CV.CvEnum.ColorConversion.Rgb2Hsv);
                rolePosition = DnfCVHelper.FindRole(hsvImage, gameRect);
                G.Instance.InfoWriter($"角色位置读取成功:{rolePosition}");
            });
        }
        /// <summary>
        /// 测试进入下一关的门
        /// </summary>
        private void TestToNextDoor()
        {
            HouseInfo house = new HouseInfo(0, MapType.Kalete, false, null);
            ZTRectangle gameRect = ZTRectangle.Empty;
            WindowUtils.GetDnfRect(out gameRect);
            Image<Hsv, byte> hsvImage = new Image<Hsv, byte>(gameRect.End.X - gameRect.Start.X, gameRect.End.Y - gameRect.Start.Y );
            Task.Run(() => {
                WindowUtils.SetDnfToTop();
                Thread.Sleep(10);
                Image<Rgb, byte> image = ScreenCapture.Instance.CaptureScreenReturnImage();
                image.ROI = new System.Drawing.Rectangle(gameRect.Start.X, gameRect.Start.Y, gameRect.End.X - gameRect.Start.X, gameRect.End.Y - gameRect.Start.Y);
                CvInvoke.CvtColor(image, hsvImage, Emgu.CV.CvEnum.ColorConversion.Rgb2Hsv);
                image.ROI = System.Drawing.Rectangle.Empty;
                //定位点
                ParametersPoint locationCoor = DnfCVHelper.GetLocationPoint(image, gameRect);
                if (locationCoor.Equals(ParametersPoint.Empty))
                {
                    //找不到定位点
                    G.Instance.InfoWriter("找不到定位点");
                    return;
                }
                ZTPoint rolePosition = DnfCVHelper.FindRole(hsvImage, gameRect);
                ZTPoint start=house.ScreenToMapCoordinate(rolePosition, locationCoor);
                DnfRole role = new DnfRole(gameRect);
                Int32 doorIndex = 0;
                List<ZTPoint> paths=house.FindDoorPath(out doorIndex,start);
                ZTPoint last = start;
                for (int i = 0; i < paths.Count; i++)
                {
                    //移动
                    ZTPoint distance = paths[i].Sub(last);
                    last = paths[i];
                    role.SyncMove(distance);
                }
                G.Instance.InfoWriter($"测试进入下一关的门完成");
            });
        }
@@ -380,8 +570,54 @@
                isRunning = false;
            }));
        }
        #endregion
        private int hotKeyID = 2839;
        /// <summary>
        ///     热键消息
        /// </summary>
        const int WindowsMessageHotkey = 786;
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            //注册热键
            IntPtr intPtr = (new WindowInteropHelper(this)).Handle;
            if (!SystemHotKey.RegHotKey(intPtr, hotKeyID, SystemHotKey.KeyModifiers.None, System.Windows.Forms.Keys.Home))
            {
                MessageBox.Show("热键不可用,其它应用已经占用热键");
            }
            else
            {
                ComponentDispatcher.ThreadPreprocessMessage += (ref MSG Message, ref bool Handled) =>
                {
                    //  判断是否热键消息
                    if (Message.message == WindowsMessageHotkey)
                    {
                        //  获取热键id
                        var id = Message.wParam.ToInt32();
                        //  执行热键回调方法(执行时需要判断是否与注册的热键匹配)
                        if (id == hotKeyID)
                        {
                            Run_Click(this, new RoutedEventArgs());
                        }
                    }
                };
            }
        }
        
        private void Window_Unloaded(object sender, RoutedEventArgs e)
        {
            //注销热键
            IntPtr intPtr = (new WindowInteropHelper(this)).Handle;
            SystemHotKey.UnRegHotKey(intPtr, hotKeyID);
        }
    }
}
src/RichCreator/Maps/HouseInfo.cs
File was deleted
src/RichCreator/Maps/Kalete/KaleteMap.cs
New file
@@ -0,0 +1,616 @@
using Emgu.CV;
using Emgu.CV.Structure;
using RichCreator.Dnf;
using RichCreator.Jobs.StateMachines;
using RichCreator.Utility;
using RichCreator.Utility.Captures;
using RichCreator.Utility.CV;
using RichCreator.Utility.InputControl;
using RichCreator.Utility.Maps;
using RichCreator.Utility.Structs;
using RichCreator.Utility.Utilitys;
using System;
using System.Collections.Generic;
using System.Threading;
namespace RichCreator.Maps.Kalete
{
    /// <summary>
    /// 卡勒特地图
    /// </summary>
    public class KaleteMap : MapInfo
    {
        public KaleteMap(ZTRectangle gameRect, CancellationToken cancelToken) : base(MapType.Lingdong, gameRect, cancelToken)
        {
            this.MiniMap = new KaleteMiniMap(gameRect);
            this.Role = new DnfRole(gameRect);
        }
        /// <summary>
        /// 地图的所有房间
        /// NextIndex=-1,完成
        /// NextIndex=-2,出错
        /// </summary>
        private static readonly HouseInfo[] Houses = new HouseInfo[] {
            new HouseInfo (0 ,MapType.Lingdong,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X}){ HouseCenterMoveLine=-250,DoorDirection=new[]{Direction.Right } },
            new HouseInfo (1 ,MapType.Lingdong,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X}){ HouseCenterMoveLine=-250,DoorDirection=new[]{Direction.Bottom } },
            new HouseInfo (2 ,MapType.Lingdong,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X}){ HouseCenterMoveLine=-250,DoorDirection=new[]{Direction.Left } },
            new HouseInfo (3 ,MapType.Lingdong,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X}){ HouseCenterMoveLine=-250,DoorDirection=new[]{Direction.Bottom } },
            new HouseInfo (4 ,MapType.Lingdong,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X}){ HouseCenterMoveLine=-250,DoorDirection=new[]{Direction.Bottom } },
            new HouseInfo (5 ,MapType.Lingdong,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X}){ HouseCenterMoveLine=-250,DoorDirection=new[]{Direction.Left } },
            new HouseInfo (6 ,MapType.Lingdong,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X}){ HouseCenterMoveLine=-250,DoorDirection=new[]{Direction.Right } },
            new HouseInfo (7 ,MapType.Lingdong,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X}){ HouseCenterMoveLine=-250,DoorDirection=new[]{Direction.Right } },
            new HouseInfo (8 ,MapType.Lingdong,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X}){ HouseCenterMoveLine=-148,DoorDirection=new[]{Direction.Bottom } },
            new HouseInfo (9 ,MapType.Lingdong,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X}){ HouseCenterMoveLine=-300,DoorDirection=new[]{Direction.Left} },
            new HouseInfo (10,MapType.Lingdong,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X}){ HouseCenterMoveLine=-250,DoorDirection=new[]{Direction.Bottom } },
            new HouseInfo (11,MapType.Lingdong,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X}){ HouseCenterMoveLine=-250,DoorDirection=new[]{Direction.Right } },
            new HouseInfo (12,MapType.Lingdong,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X}){ HouseCenterMoveLine=-220,DoorDirection=new[]{Direction.Bottom } },
            new HouseInfo (13,MapType.Lingdong,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X}){ HouseCenterMoveLine=-320,DoorDirection=new[]{Direction.Left } },
            new HouseInfo (14,MapType.Lingdong,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X}){ HouseCenterMoveLine=-320,DoorDirection=new[]{Direction.Right } },
            new HouseInfo (15,MapType.Lingdong,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X}){ HouseCenterMoveLine=-250,DoorDirection=new[]{Direction.Right } },
            new HouseInfo (16,MapType.Lingdong,true ,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X}){ HouseCenterMoveLine=-250,DoorDirection=new[]{Direction.Up } },
            new HouseInfo (17,MapType.Lingdong,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X}){ HouseCenterMoveLine=-250,DoorDirection=new[]{Direction.Left } },
            new HouseInfo (18,MapType.Lingdong,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X}){ HouseCenterMoveLine=-250,DoorDirection=new[]{Direction.Up } },
            new HouseInfo (19,MapType.Lingdong,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X}){ HouseCenterMoveLine=-250,DoorDirection=new[]{Direction.Up } }
        };
        /// <summary>
        /// 角色
        /// </summary>
        public DnfRole Role { get; set; }
        private Int32 runningStep = RunningStep.None;
        /// <summary>
        /// 开始
        /// </summary>
        /// <param name="gameRect"></param>
        /// <param name="cancelToken"></param>
        /// <param name="runningStep"></param>
        /// <returns></returns>
        public override ZTResult Start(Int32 runningStep)
        {
            this.runningStep = runningStep;
            WindowUtils.SetDnfToTop();
            if (runningStep < RunningStep.War)
            {
                if (!MoveToSunan())
                {
                    return ZTResult.Failed;
                }
                if (!MoveToShikongzhimen())
                {
                    return ZTResult.Failed;
                }
                if (!MoveToChoiceTaskPage())
                {
                    return ZTResult.Failed;
                }
                if (!IntoHouse())
                {
                    return ZTResult.Failed;
                }
                G.Instance.InfoWriter("成功进入副本");
            }
            while (true)
            {
                //重复刷,直到疲劳值不够了
                if (this.CancelToken.IsCancellationRequested)
                {
                    return ZTResult.Cancel;
                }
                DateTime startHouse = DateTime.Now;
                ZTResult killResult = KillMonster();
                if (killResult == ZTResult.Success)
                {
                    //捡东西
                    G.Instance.InputControl.PressKey(RandomUtils.KeyPressDuration, HIDCode.V);
                    Thread.Sleep(1000);
                    for (int i = 0; i < 5; i++)
                    {
                        G.Instance.InputControl.PressKey(RandomUtils.KeyPressDuration, HIDCode.X);
                        Thread.Sleep(RandomUtils.KeyPressDuration * 3);
                    }
                    //卖装备并关闭商店
                    SaleEquipment();
                    Int32 houseTotalSecond = (Int32)(DateTime.Now - startHouse).TotalSeconds;
                    G.Instance.InfoWriter("单次刷图成功,用时:" + (houseTotalSecond / 60) + "分" + (houseTotalSecond % 60) + "秒");
                    //查询疲劳值
                    Int32 pilaozhi = DnfCVHelper.GetPiLaoZhi(this.GameRect);
                    G.Instance.InfoWriter("疲劳值:" + pilaozhi);
                    if (pilaozhi <= 0)
                    {
                        ExitToTown();
                        return ZTResult.Success;
                    }
                    ReplayGame();
                    continue;
                }
                else
                {
                    return killResult;
                }
            }
        }
        /// <summary>
        /// 是否进入打怪地图
        /// </summary>
        /// <returns></returns>
        public override bool IsEntryMap()
        {
            //查找顶端卡勒特之初文字
            bool findResult = FuncUtils.TimeoutCancelableWrap(2 * 60 * 1000, CancelToken, () =>
            {
                using (Image<Rgb, byte> image = ScreenCapture.Instance.CaptureScreenReturnImage())
                {
                    return  KaleteCVHelper.ExistKaleteText(image, this.GameRect);
                }
            }, 10);
            return findResult;
        }
        /// <summary>
        /// 进入房间后的预先工作
        /// </summary>
        /// <param name="houseIndex"></param>
        /// <param name="preHouseIndex"></param>
        public override void EntryHousePrework(int houseIndex, int preHouseIndex)
        {
            //移动和发招
            switch (houseIndex)
            {
                case 0:
                    this.Role.SyncMove(new ZTPoint(550, 0));
                    this.Role.ReleaseSkill(HIDCode.R, 1000);
                    this.Role.ReleaseSkill(HIDCode.E, 1000);
                    break;
                case 1:
                    this.Role.SyncMove(new ZTPoint(300, 0));
                    this.Role.ReleaseSkill(HIDCode.Q, 1300);
                    this.Role.ReleaseSkill(HIDCode.W, 1000);
                    break;
                case 6:
                    this.Role.SyncMove(new ZTPoint(448, 94));
                    this.Role.ReleaseSkill(HIDCode.G, 0);
                    break;
                case 7:
                    this.Role.SyncMove(new ZTPoint(530, 0));
                    this.Role.ReleaseSkill(HIDCode.R, 0);
                    break;
                case 8:
                    this.Role.SyncMove(new ZTPoint(453, 0));
                    this.Role.ReleaseSkill(HIDCode.H, 0);
                    break;
                case 13:
                    this.Role.SyncMove(new ZTPoint(-100, 203));
                    this.Role.ReleaseSkill(HIDCode.Q, 1300);
                    this.Role.ReleaseSkill(HIDCode.E, 0);
                    break;
                case 12:
                    this.Role.SyncMove(new ZTPoint(-851, 120));
                    this.Role.ReleaseSkill(HIDCode.T, 0);
                    break;
                case 17:
                    this.Role.SyncMove(new ZTPoint(-306, 130));
                    this.Role.ReleaseSkill(HIDCode.Q, 1300);
                    this.Role.ReleaseSkill(HIDCode.F, 0);//用w代替
                    break;
                case 16:
                    this.Role.SyncMove(new ZTPoint(-385, 0));
                    this.Role.ReleaseSkill(HIDCode.Y, 0);
                    break;
            }
        }
        /// <summary>
        /// esc退到城镇
        /// </summary>
        private void ExitToTown()
        {
            G.Instance.DebugWriter("返回城镇");
            Utility.Structs.ZTPoint point = new Utility.Structs.ZTPoint(this.GameRect.End.X - 124, this.GameRect.Start.Y + 146);
            G.Instance.InputControl.MoveToAndClick(point);
            Thread.Sleep(5000);
        }
        /// <summary>
        /// 点击再次挑战
        /// </summary>
        private void ReplayGame()
        {
            G.Instance.DebugWriter("重新挑战");
            Utility.Structs.ZTPoint point = new Utility.Structs.ZTPoint(this.GameRect.End.X - 132, this.GameRect.Start.Y + 90);
            G.Instance.InputControl.MoveToAndClick(point);
        }
        /// <summary>
        /// 刷房间
        /// </summary>
        /// <returns></returns>
        private ZTResult KillMonster()
        {
            bool ret = false;
            if (!IsEntryMap())
            {
                G.Instance.InfoWriter("未找到进入凛冬");
                return ZTResult.Failed;
            }
            G.Instance.InfoWriter("进入凛冬");
            Int32 preHouseIndex = -1;
            Int32 houseIndex = -1;
            //技能加成
            G.Instance.InputControl.PressKey(RandomUtils.KeyPressDuration, HIDCode.Space);
            //循环刷房间
            while (true)
            {
                preHouseIndex = houseIndex;
                //看房间号
                ret = this.MiniMap.GetCurrentHouseIndexWaitTimeout(out houseIndex, null, this.CancelToken, 3 * 1000);
                if (!ret)
                {
                    G.Instance.InfoWriter("未找到人物所在房间");
                    return ZTResult.Failed;
                }
                G.Instance.InfoWriter("进入房间->" + houseIndex.ToString());
                HouseInfo houseInfo = Houses[houseIndex];
                this.Role.SetHouse(houseInfo);
                DateTime startTime = DateTime.Now;
                KillMonsterStateMachine kmsm = new KillMonsterStateMachine(this, houseInfo,this.Role, preHouseIndex, this.runningStep);
                ZTResult smresult = kmsm.Work(5 * 60 * 1000);
                Int32 roomTotalSecond = (Int32)(DateTime.Now - startTime).TotalSeconds;
                G.Instance.InfoWriter("房间刷完,用时:" + (roomTotalSecond / 60) + "分" + (roomTotalSecond % 60) + "秒");
                runningStep = RunningStep.None;
                if (smresult == ZTResult.Success)
                {
                    if (houseInfo.IsEnd)
                    {
                        //所有房间刷完
                        return ZTResult.Success;
                    }
                    //刷其它房间
                    continue;
                }
                else
                {
                    return smresult;
                }
            }
        }
        /// <summary>
        /// 步行到素喃
        /// </summary>
        /// <returns></returns>
        private bool MoveToSunan()
        {
            bool result = FuncUtils.NoChangeRetryCallWrap(
               () =>
               {
                   WindowUtils.SetDnfToTop();
                   CloseAllAlertWindow(this.CancelToken, this.GameRect);
                   //向下走出赛丽亚的房间  ,走向素喃
                   G.Instance.InputControl.PressKey(2000, HIDCode.DownArrow);
               },
               () =>
               {
                   G.Instance.InfoWriter("检测是否进入素喃");
                   result = FuncUtils.TimeoutCancelableWrap(10000, this.CancelToken, () =>
                   {
                       return LindongCVHelper.IsInSunan(this.GameRect);
                   });
                   if (!result)
                   {
                       G.Instance.InfoWriter("进入素喃失败");
                       return false;
                   }
                   G.Instance.InfoWriter("进入素喃成功");
                   return true;
               },
               () =>
               {
                   return DnfCVHelper.IsInSaiLiYaHouse(this.GameRect);
               });
            return result;
        }
        /// <summary>
        /// 步行至时空之门
        /// </summary>
        /// <returns></returns>
        private bool MoveToShikongzhimen()
        {
            bool result = FuncUtils.NoChangeRetryCallWrap(() =>
             {
                //打开地图
                ZTPoint mapButtonPosition = new ZTPoint(this.GameRect.End.X - 14, this.GameRect.Start.Y + 16);
                 G.Instance.InputControl.MoveToAndClick(mapButtonPosition);
                 Thread.Sleep(1000);
                //点到副本之前的地图
                ZTPoint mapPrePosition = new ZTPoint(this.GameRect.Start.X + 382, this.GameRect.Start.Y + 252);
                 G.Instance.InputControl.MoveToAndClick(mapPrePosition);
                //关闭地图框
                CloseAllAlertWindow(this.CancelToken, this.GameRect);
             },
            () =>
            {
                //检测是否进入时空之门
                return FuncUtils.TimeoutCancelableWrap(15000, this.CancelToken, () =>
                  {
                      CloseAllAlertWindow(this.CancelToken, this.GameRect);
                      return LindongCVHelper.IsInShikongzhimen(this.GameRect);
                  });
            },
            () =>
            {
                //检测是否还在素喃
                return FuncUtils.TimeoutCancelableWrap(3000, this.CancelToken, () =>
                {
                    CloseAllAlertWindow(this.CancelToken, this.GameRect);
                    return LindongCVHelper.IsInSunan(this.GameRect);
                });
            });
            Thread.Sleep(5000);
            return result;
        }
        /// <summary>
        /// 步行到任务选择和正式开打页面
        /// </summary>
        /// <returns></returns>
        private bool MoveToChoiceTaskPage()
        {
            bool result = false;
            //右走进选择副本界面
            G.Instance.InputControl.PressKey(1500, HIDCode.LeftArrow);
            G.Instance.InfoWriter("检测是否打开选择副本界面");
            result = FuncUtils.TimeoutCancelableWrap(10000, this.CancelToken, () =>
            {
                Image<Rgb, byte> image = ScreenCapture.Instance.CaptureScreenReturnImage();
                return LindongCVHelper.IsInChoiceTaskPage(image, this.GameRect);
            });
            if (!result)
            {
                G.Instance.InfoWriter("进入打开选择副本界面失败");
                return false;
            }
            G.Instance.InfoWriter("打开选择副本界面成功");
            return true;
        }
        /// <summary>
        /// 进入指定房间
        /// </summary>
        /// <returns></returns>
        private bool IntoHouse()
        {
            bool result = false;
            //选择凛冬
            G.Instance.InfoWriter("开始选择卡勒特之初");
            Int32 nandu = 0;
            if (!SelectKalete(out nandu))
            {
                G.Instance.InfoWriter("选择卡勒特之初失败");
                return false;
            }
            G.Instance.InfoWriter("选择卡勒特之初成功,难度:" + nandu);
            if (nandu != 4)
            {
                G.Instance.InfoWriter("开始选择难度");
                result = SelectNandu(nandu);
                if (!result)
                {
                    G.Instance.InfoWriter("选择难度失败");
                    return false;
                }
                G.Instance.InfoWriter("选择难度成功");
            }
            //开始
            G.Instance.InputControl.PressKey(80, HIDCode.Space);
            return true;
        }
        /// <summary>
        /// 关闭所有弹出窗
        /// </summary>
        /// <param name="cancelToken"></param>
        /// <param name="gameRect"></param>
        /// <returns></returns>
        private void CloseAllAlertWindow(CancellationToken cancelToken, ZTRectangle gameRect)
        {
            while (!cancelToken.IsCancellationRequested)
            {
                //G.Instance.InputControl.MoveTo(gameRect.Start.X,gameRect.Start.Y, false, false, false);
                //Thread.Sleep(10);
                //截图
                Image<Rgb, byte> image = ScreenCapture.Instance.CaptureScreenReturnImage();
                ZTRectangle closeButtonRect = ZTRectangle.Empty;
                if (!DnfCVHelper.GetAlertWindow(out closeButtonRect, image, gameRect))
                {
                    return;
                }
                G.Instance.InputControl.MoveToAndClick(closeButtonRect.GetCenterPoint());
                Thread.Sleep(500);
            }
        }
        /// <summary>
        /// 选择凛冬
        /// </summary>
        /// <returns></returns>
        private bool SelectKalete(out Int32 nandu)
        {
            Image<Rgb, byte> image = ScreenCapture.Instance.CaptureScreenReturnImage();
            if (KaleteCVHelper.GetChoiceKaleteNandu(out nandu, image, this.GameRect))
            {
                return true;
            }
            G.Instance.InputControl.MoveToAndClick(new ZTPoint(this.GameRect.Start.X + 819, this.GameRect.Start.Y + 181));
            Thread.Sleep(5000);
            image = ScreenCapture.Instance.CaptureScreenReturnImage();
            if (KaleteCVHelper.GetChoiceKaleteNandu(out nandu, image, this.GameRect))
            {
                return true;
            }
            return false;
        }
        /// <summary>
        /// 选择难度
        /// </summary>
        /// <param name="rightCan"></param>
        /// <param name="leftCan"></param>
        /// <returns></returns>
        private bool SelectNandu(Int32 nandu)
        {
            Int32 count = 4 - nandu;
            for (int i = 0; i < Math.Abs(count); i++)
            {
                if (count < 0)
                {
                    G.Instance.InputControl.PressKey(RandomUtils.KeyPressDuration, HIDCode.LeftArrow);
                }
                else
                {
                    G.Instance.InputControl.PressKey(RandomUtils.KeyPressDuration, HIDCode.RightArrow);
                }
                Thread.Sleep(400);
            }
            Image<Rgb, byte> image = ScreenCapture.Instance.CaptureScreenReturnImage();
            if (!KaleteCVHelper.GetChoiceKaleteNandu(out nandu, image, this.GameRect))
            {
                return false;
            }
            if (nandu == 4)
            {
                return true;
            }
            return false;
        }
        /// <summary>
        /// 出售装备
        /// </summary>
        /// <param name="saleButtonRect"></param>
        private bool SaleEquipment()
        {
            //卖装备并关闭商店
            ZTRectangle closeButtonRect = ZTRectangle.Empty;
            ZTRectangle saleButtonRect = ZTRectangle.Empty;
            if (!DnfCVHelper.HasSaleButton(out saleButtonRect, out closeButtonRect, this.GameRect))
            {
                return false;
            }
            //卖装备
            G.Instance.InfoWriter("出售装备");
            G.Instance.InputControl.MoveToAndClick(saleButtonRect.GetCenterPoint());
            //得到装备文字位置
            ZTRectangle equipmentTextRect = ZTRectangle.Empty;
            bool result = FuncUtils.TimeoutCancelableWrap(5000, this.CancelToken, () =>
            {
                Int32 status = 0;
                if (DnfCVHelper.GetEquipmentSelectStatus(out equipmentTextRect, out status, this.GameRect))
                {
                    if (status == 1)
                    {
                        return true;
                    }
                    G.Instance.InputControl.MoveToAndClick(equipmentTextRect.GetCenterPoint());
                }
                return false;
            });
            if (!result)
            {
                G.Instance.InfoWriter("装备文字未取到");
                return false;
            }
            //开始点,每格步进30
            ZTPoint startPoint = new Utility.Structs.ZTPoint(equipmentTextRect.End.X - 30, equipmentTextRect.End.Y + 9);
            List<Int32> points = DnfCVHelper.GetEquipmentIndexs(startPoint);
            for (int i = 0; i < points.Count; i++)
            {
                Int32 index = points[i];
                int row = index / 8;
                int col = index % 8;
                int x = col * 30 + 15;
                int y = row * 30 + 15;
                //点窗格
                G.Instance.InputControl.MoveToAndClick(new Utility.Structs.ZTPoint(startPoint.X + x, startPoint.Y + y));
                Thread.Sleep(500);
                //点确定
                G.Instance.InputControl.Move(0, 0, true, false, false);
                Thread.Sleep(RandomUtils.MouseClickDuration);
                G.Instance.InputControl.Move(0, 0, false, false, false);
                Thread.Sleep(RandomUtils.MouseClickDuration);
            }
            G.Instance.DebugWriter("equipment:" + ZTImage.Utils.ConcatString(points.ToArray(), ","));
            Thread.Sleep(RandomUtils.KeyPressDuration);
            G.Instance.InputControl.PressKey(RandomUtils.KeyPressDuration, HIDCode.Escape);
            return true;
        }
    }
}
src/RichCreator/Maps/Kalete/KaleteMiniMap.cs
New file
@@ -0,0 +1,67 @@
using Emgu.CV;
using Emgu.CV.Structure;
using RichCreator.Dnf;
using RichCreator.Utility.Captures;
using RichCreator.Utility.CV;
using RichCreator.Utility.Maps;
using RichCreator.Utility.Structs;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace RichCreator.Maps.Kalete
{
    public class KaleteMiniMap : IMiniMap
    {
        public KaleteMiniMap(ZTRectangle gameRect):base(gameRect, new ZTPoint(1183, 47))
        {}
        protected override  bool GetCurrentHouse(out Int32 houseIndex, Image<Rgb, byte> image)
        {
            houseIndex = -1;
            Int32 overHouseDected = -1;
            for (int i = 0; i < 20; i++)
            {
                Int32 row = i / 5;
                Int32 col = i % 5;
                //目标块第一块坐标
                Int32 x = this.MinimapOffset.X + col * 18;
                Int32 y = this.MinimapOffset.Y + row * 18;
                if (DnfCVHelper.IsCurrentHouseColor(image,x,y))
                {
                    //当前房间
                    houseIndex = i;
                    return true;
                }
                if (i == 16)
                {
                    //17格是否青色并且16格是红色,则认为角色在16房间
                    if (DnfCVHelper.IsCrossedHouseColor(image, x+18, y))
                    {
                        if (DnfCVHelper.IsOverHouseColor(image,x,y))
                        {
                            overHouseDected = 16;
                        }
                    }
                }
            }
            if (overHouseDected > -1)
            {
                //其它房间没有,并且已经检测到了最后一个房间
                houseIndex = overHouseDected;
                return true;
            }
            return false;
        }
    }
}
src/RichCreator/Maps/Kalete/OutOfBounds.cs
New file
@@ -0,0 +1,87 @@
using RichCreator.Utility;
using RichCreator.Utility.Structs;
using RichCreator.StateMachines;
using RichCreator.Utilitys;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using RichCreator.Dnf;
namespace RichCreator.Maps.Kalete
{
    /// <summary>
    /// 禁区类
    /// </summary>
    public class OutOfBounds
    {
        public OutOfBounds(ZTRectangle gameRect,DnfRole moveState)
        {
            this.moveState = moveState;
            this.gameRect = gameRect;
            bounds = new ZTRectangle[] {
                new ZTRectangle (1089+gameRect.Start.X,0+gameRect.Start.Y,1280+gameRect.End.X,394+gameRect.End.Y)
            };
        }
        /// <summary>
        /// 五号房间的右上角区域
        /// </summary>
        public const Int32 AREA_5Bound = 0;
        /// <summary>
        /// 14号房间那个不动的怪
        /// </summary>
        public const Int32 AREA_14Bound = 1;
        private ZTRectangle gameRect;
        private DnfRole moveState;
        private ZTRectangle[] bounds = null;
        /// <summary>
        /// 判断是否在禁区内
        /// </summary>
        /// <param name="houseIndex"></param>
        /// <param name="rolePosition"></param>
        /// <param name="areaID"></param>
        /// <returns></returns>
        public bool InOutOfBound(Int32 houseIndex, ZTPoint rolePosition,out int areaID)
        {
            areaID = 0;
            switch (houseIndex)
            {
                case 5:
                    if (Utilitys.Utils.IsInRect(rolePosition, bounds[AREA_5Bound]))
                    {
                        areaID = AREA_5Bound;
                        return true;
                    }
                    return false;
                case 14:
                    areaID = AREA_14Bound;
                    break;
            }
            return false;
        }
        /// <summary>
        /// 移动到正常区域
        /// </summary>
        /// <param name="areaID"></param>
        /// <returns></returns>
        public void MoveToCommonBound(Int32 areaID)
        {
            switch (areaID)
            {
                case AREA_5Bound:
                    this.moveState.SyncMove(new ZTPoint(-600, 0));
                    break;
            }
        }
    }
}
src/RichCreator/Maps/Lindong/LindongMap.cs
@@ -11,182 +11,72 @@
using System;
using System.Collections.Generic;
using System.Threading;
using RichCreator.Utility.Maps;
using RichCreator.Utility.Skills;
using RichCreator.Dnf;
namespace RichCreator.Maps
namespace RichCreator.Maps.Lindong
{
    /// <summary>
    /// 凛冬地图
    /// </summary>
    public class LindongMap : MapInfo
    {
        public LindongMap(ZTRectangle gameRect, CancellationToken cancelToken) :base(MapType.Lingdong,gameRect,cancelToken)
        {
            this.MiniMap = new LindongMiniMap(gameRect);
            this.Role = new DnfRole(gameRect);
        }
        /// <summary>
        /// 角色
        /// </summary>
        public DnfRole Role { get; set; }
        /// <summary>
        /// 地图的所有房间
        /// NextIndex=-1,完成
        /// NextIndex=-2,出错
        /// </summary>
        internal static HouseInfo[] Houses = new HouseInfo[] {
            new HouseInfo (){ Index=0 ,NextIndex=1 , OpenStatusDetectIndex=1 , HouseCenterMoveLine=-250,IsEnd=false,DoorDirection=new[]{Direction.Right } },
            new HouseInfo (){ Index=1 ,NextIndex=5 , OpenStatusDetectIndex=5 , HouseCenterMoveLine=-250,IsEnd=false,DoorDirection=new[]{Direction.Bottom } },
            new HouseInfo (){ Index=2 ,NextIndex=1 , OpenStatusDetectIndex=1 , HouseCenterMoveLine=-250,IsEnd=false,DoorDirection=new[]{Direction.Left } },
            new HouseInfo (){ Index=3 ,NextIndex=2 , OpenStatusDetectIndex=2 , HouseCenterMoveLine=-250,IsEnd=false,DoorDirection=new[]{Direction.Left } },
            new HouseInfo (){ Index=4 ,NextIndex=8 , OpenStatusDetectIndex=8 , HouseCenterMoveLine=-250,IsEnd=false,DoorDirection=new[]{Direction.Bottom } },
            new HouseInfo (){ Index=5 ,NextIndex=4 , OpenStatusDetectIndex=4 , HouseCenterMoveLine=-250,IsEnd=false,DoorDirection=new[]{Direction.Left } },
            new HouseInfo (){ Index=6 ,NextIndex=5 , OpenStatusDetectIndex=5 , HouseCenterMoveLine=-250,IsEnd=false,DoorDirection=new[]{Direction.Left } },
            new HouseInfo (){ Index=7 ,NextIndex=6 , OpenStatusDetectIndex=6 , HouseCenterMoveLine=-250,IsEnd=false,DoorDirection=new[]{Direction.Left } },
            new HouseInfo (){ Index=8 ,NextIndex=12 ,OpenStatusDetectIndex=12, HouseCenterMoveLine=-148,IsEnd=false,DoorDirection=new[]{Direction.Right,Direction.Bottom } },
            new HouseInfo (){ Index=9 ,NextIndex=10, OpenStatusDetectIndex=10, HouseCenterMoveLine=-300,IsEnd=false,DoorDirection=new[]{Direction.Right,Direction.Bottom } },
            new HouseInfo (){ Index=10,NextIndex=14, OpenStatusDetectIndex=14, HouseCenterMoveLine=-250,IsEnd=false,DoorDirection=new[]{Direction.Bottom } },
            new HouseInfo (){ Index=11,NextIndex=10, OpenStatusDetectIndex=10, HouseCenterMoveLine=-250,IsEnd=false,DoorDirection=new[]{Direction.Left } },
            new HouseInfo (){ Index=12,NextIndex=13, OpenStatusDetectIndex=12, HouseCenterMoveLine=-220,IsEnd=false,DoorDirection=new[]{Direction.Right } },
            new HouseInfo (){ Index=13,NextIndex=14, OpenStatusDetectIndex=14, HouseCenterMoveLine=-320,IsEnd=false,DoorDirection=new[]{Direction.Right } },
            new HouseInfo (){ Index=14,NextIndex=15, OpenStatusDetectIndex=-1, HouseCenterMoveLine=-320,IsEnd=false,DoorDirection=new[]{Direction.Right } },
            new HouseInfo (){ Index=15,NextIndex=-1, OpenStatusDetectIndex=-1, HouseCenterMoveLine=-250,IsEnd=true, DoorDirection=new[]{Direction.Right } },
            new HouseInfo (){ Index=16,NextIndex=12, OpenStatusDetectIndex=12, HouseCenterMoveLine=-250,IsEnd=false,DoorDirection=new[]{Direction.Up } },
            new HouseInfo (){ Index=17,NextIndex=13, OpenStatusDetectIndex=13, HouseCenterMoveLine=-250,IsEnd=false,DoorDirection=new[]{Direction.Up } },
            new HouseInfo (){ Index=18,NextIndex=14, OpenStatusDetectIndex=14, HouseCenterMoveLine=-250,IsEnd=false,DoorDirection=new[]{Direction.Up } },
            new HouseInfo (){ Index=19,NextIndex=15, OpenStatusDetectIndex=15, HouseCenterMoveLine=-250,IsEnd=false,DoorDirection=new[]{Direction.Up } }
        private static readonly HouseInfo[] Houses = new HouseInfo[] {
            new HouseInfo (0 ,MapType.Lingdong,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X}){HouseCenterMoveLine=-250,DoorDirection=new[]{Direction.Right } },
            new HouseInfo (1 ,MapType.Lingdong,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X}){HouseCenterMoveLine=-250,DoorDirection=new[]{Direction.Bottom } },
            new HouseInfo (2 ,MapType.Lingdong,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X}){HouseCenterMoveLine=-250,DoorDirection=new[]{Direction.Left } },
            new HouseInfo (3 ,MapType.Lingdong,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X}){HouseCenterMoveLine=-250,DoorDirection=new[]{Direction.Left } },
            new HouseInfo (4 ,MapType.Lingdong,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X}){HouseCenterMoveLine=-250,DoorDirection=new[]{Direction.Bottom } },
            new HouseInfo (5 ,MapType.Lingdong,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X}){HouseCenterMoveLine=-250,DoorDirection=new[]{Direction.Left } },
            new HouseInfo (6 ,MapType.Lingdong,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X}){HouseCenterMoveLine=-250,DoorDirection=new[]{Direction.Left } },
            new HouseInfo (7 ,MapType.Lingdong,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X}){HouseCenterMoveLine=-250,DoorDirection=new[]{Direction.Left } },
            new HouseInfo (8 ,MapType.Lingdong,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X}){HouseCenterMoveLine=-148,DoorDirection=new[]{Direction.Right,Direction.Bottom } },
            new HouseInfo (9 ,MapType.Lingdong,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X}){HouseCenterMoveLine=-300,DoorDirection=new[]{Direction.Right,Direction.Bottom } },
            new HouseInfo (10,MapType.Lingdong,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X}){HouseCenterMoveLine=-250,DoorDirection=new[]{Direction.Bottom } },
            new HouseInfo (11,MapType.Lingdong,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X}){HouseCenterMoveLine=-250,DoorDirection=new[]{Direction.Left } },
            new HouseInfo (12,MapType.Lingdong,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X}){HouseCenterMoveLine=-220,DoorDirection=new[]{Direction.Right } },
            new HouseInfo (13,MapType.Lingdong,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X}){HouseCenterMoveLine=-320,DoorDirection=new[]{Direction.Right } },
            new HouseInfo (14,MapType.Lingdong,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X}){HouseCenterMoveLine=-320,DoorDirection=new[]{Direction.Right } },
            new HouseInfo (15,MapType.Lingdong,true ,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X}){HouseCenterMoveLine=-250,DoorDirection=new[]{Direction.Right } },
            new HouseInfo (16,MapType.Lingdong,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X}){HouseCenterMoveLine=-250,DoorDirection=new[]{Direction.Up } },
            new HouseInfo (17,MapType.Lingdong,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X}){HouseCenterMoveLine=-250,DoorDirection=new[]{Direction.Up } },
            new HouseInfo (18,MapType.Lingdong,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X}){HouseCenterMoveLine=-250,DoorDirection=new[]{Direction.Up } },
            new HouseInfo (19,MapType.Lingdong,false,new HIDCode[] { HIDCode.A,HIDCode.D,HIDCode.X}){HouseCenterMoveLine=-250,DoorDirection=new[]{Direction.Up } }
        };
        static LindongMap()
        {
            //1
            SkillQueue queue = new SkillQueue();
            //queue.EnQueue(false, HIDCode.G);
            //queue.EnQueue(false, HIDCode.E);
            queue.EnQueue(false, HIDCode.A);
            queue.EnQueue(false, HIDCode.D);
            queue.EnQueue(false, HIDCode.X);
            Houses[2].Skills = queue;
            //2
            queue = new SkillQueue();
            //queue.EnQueue(false, HIDCode.W);
            //queue.EnQueue(false, HIDCode.E);
            queue.EnQueue(false, HIDCode.A);
            queue.EnQueue(false, HIDCode.D);
            queue.EnQueue(false, HIDCode.X);
            Houses[1].Skills = queue;
            //3
            queue = new SkillQueue();
            //queue.EnQueue(false, HIDCode.Q);
            //queue.EnQueue(false, HIDCode.T);
            //queue.EnQueue(false, HIDCode.E);
            queue.EnQueue(false, HIDCode.A);
            queue.EnQueue(false, HIDCode.D);
            queue.EnQueue(false, HIDCode.X);
            Houses[5].Skills = queue;
            //4
            queue = new SkillQueue();
            //queue.EnQueue(false, HIDCode.E);
            queue.EnQueue(false, HIDCode.A);
            queue.EnQueue(false, HIDCode.D);
            queue.EnQueue(false, HIDCode.X);
            Houses[4].Skills = queue;
            //5
            queue = new SkillQueue();
            //queue.EnQueue(false, HIDCode.W);
            //queue.EnQueue(false, HIDCode.E);
            queue.EnQueue(false, HIDCode.A);
            queue.EnQueue(false, HIDCode.D);
            queue.EnQueue(false, HIDCode.X);
            Houses[8].Skills = queue;
            //6
            queue = new SkillQueue();
            //queue.EnQueue(false, HIDCode.R);
            //queue.EnQueue(false, HIDCode.T);
            //queue.EnQueue(false, HIDCode.E);
            queue.EnQueue(false, HIDCode.A);
            queue.EnQueue(false, HIDCode.D);
            queue.EnQueue(false, HIDCode.X);
            Houses[9].Skills = queue;
            //7
            queue = new SkillQueue();
            //queue.EnQueue(false, HIDCode.Q);
            //queue.EnQueue(false, HIDCode.E);
            queue.EnQueue(false, HIDCode.A);
            queue.EnQueue(false, HIDCode.D);
            queue.EnQueue(false, HIDCode.X);
            Houses[10].Skills = queue;
            queue = new SkillQueue();
            //queue.EnQueue(false, HIDCode.R);
            //queue.EnQueue(false, HIDCode.T);
            //queue.EnQueue(false, HIDCode.E);
            queue.EnQueue(false, HIDCode.A);
            queue.EnQueue(false, HIDCode.D);
            queue.EnQueue(false, HIDCode.X);
            Houses[12].Skills = queue;
            queue = new SkillQueue();
            //queue.EnQueue(false, HIDCode.Q);
            //queue.EnQueue(false, HIDCode.E);
            queue.EnQueue(false, HIDCode.A);
            queue.EnQueue(false, HIDCode.D);
            queue.EnQueue(false, HIDCode.X);
            Houses[13].Skills = queue;
            //8
            queue = new SkillQueue();
            //queue.EnQueue(false, HIDCode.W);
            //queue.EnQueue(false, HIDCode.E);
            queue.EnQueue(false, HIDCode.A);
            queue.EnQueue(false, HIDCode.D);
            queue.EnQueue(false, HIDCode.X);
            Houses[14].Skills = queue;
            //9
            queue = new SkillQueue();
            //queue.EnQueue(false, HIDCode.H);
            //queue.EnQueue(false, HIDCode.Y);
            //queue.EnQueue(false, HIDCode.T);
            //queue.EnQueue(false, HIDCode.R);
            //queue.EnQueue(false, HIDCode.F);
            //queue.EnQueue(false, HIDCode.E);
            queue.EnQueue(false, HIDCode.A);
            queue.EnQueue(false, HIDCode.D);
            queue.EnQueue(false, HIDCode.X);
            Houses[15].Skills = queue;
            //10
            queue = new SkillQueue();
            //queue.EnQueue(false, HIDCode.W);
            //queue.EnQueue(false, HIDCode.E);
            queue.EnQueue(false, HIDCode.A);
            queue.EnQueue(false, HIDCode.D);
            queue.EnQueue(false, HIDCode.X);
            Houses[18].Skills = queue;
        }
        /// <summary>
        /// 游戏区域
        /// </summary>
        public ZTRectangle GameRect { get; set; }
        /// <summary>
        /// 小地图区域
        /// </summary>
        public Utility.Structs.ZTPoint MinimapPoint = Utility.Structs.ZTPoint.Empty;
        //小地图距游戏区域的偏移
        private Utility.Structs.ZTPoint minimapPointOffset = new Utility.Structs.ZTPoint(1201, 47);
        public CancellationToken cancellationToken { get; set; }
        private Int32 runningStep = RunningStep.None;
        
        public override ZTResult Start(ZTRectangle gameRect, CancellationToken cancelToken,Int32 runningStep)
        /// <summary>
        /// 开始
        /// </summary>
        /// <param name="gameRect"></param>
        /// <param name="cancelToken"></param>
        /// <param name="runningStep"></param>
        /// <returns></returns>
        public override ZTResult Start(Int32 runningStep)
        {
            this.runningStep = runningStep;
            this.GameRect = gameRect;
            this.cancellationToken = cancelToken;
            this.MinimapPoint = gameRect.Start.Add(minimapPointOffset);
            WindowUtils.SetDnfToTop();
@@ -218,7 +108,7 @@
            while (true)
            {
                //重复刷,直到疲劳值不够了
                if (this.cancellationToken.IsCancellationRequested)
                if (this.CancelToken.IsCancellationRequested)
                {
                    return ZTResult.Cancel;
                }
@@ -239,11 +129,12 @@
                    
                    //卖装备并关闭商店
                    SaleEquipment( this.cancellationToken);
                    SaleEquipment();
                    Int32 houseTotalSecond = (Int32)(DateTime.Now - startHouse).TotalSeconds;
                    //查询疲劳值
                    G.Instance.InfoWriter("单次刷图成功,用时:"+(houseTotalSecond/60)+"分"+(houseTotalSecond%60)+"秒");
                    //查询疲劳值
                    Int32 pilaozhi =DnfCVHelper.GetPiLaoZhi(this.GameRect);
                    G.Instance.InfoWriter("疲劳值:" + pilaozhi);
@@ -261,6 +152,32 @@
                    return killResult;
                }
            }
        }
        /// <summary>
        /// 是否进入打怪地图
        /// </summary>
        /// <returns></returns>
        public override bool IsEntryMap()
        {
            //查找顶端凛冬文字
            bool findResult = FuncUtils.TimeoutCancelableWrap(2 * 60 * 1000, CancelToken, () => {
                using (Image<Rgb, byte> image = ScreenCapture.Instance.CaptureScreenReturnImage())
                {
                    return LindongCVHelper.ExistLingdongText(image, this.GameRect);
                }
            }, 10);
            //if (!findResult)
            //{
            //    G.Instance.InfoWriter("未找到进入凛冬的文字");
            //}
            //else
            //{
            //    G.Instance.InfoWriter("进入凛冬");
            //}
            return findResult;
        }
        /// <summary>
@@ -284,6 +201,7 @@
            G.Instance.InputControl.MoveToAndClick(point);
        }
        /// <summary>
        /// 刷房间
        /// </summary>
@@ -291,23 +209,13 @@
        private ZTResult KillMonster()
        {
            bool ret = false;
            //查找顶端凛冬文字
            bool findResult = FuncUtils.TimeoutCancelableWrap(2 * 60 * 1000, cancellationToken, () => {
                using (Image<Rgb, byte> image = ScreenCapture.Instance.CaptureScreenReturnImage())
                {
                    return LindongCVHelper.ExistLingdongText(image, this.GameRect);
                }
            }, 10);
            if (!findResult)
            if (!IsEntryMap())
            {
                G.Instance.InfoWriter("未找到进入凛冬的文字");
                G.Instance.InfoWriter("未找到进入凛冬");
                return ZTResult.Failed;
            }
            G.Instance.InfoWriter("进入凛冬");
            
            Int32 preHouseIndex = -1;
            Int32 houseIndex = -1;
@@ -321,10 +229,7 @@
            {
                preHouseIndex = houseIndex;
                //看房间号
                ret=FuncUtils.TimeoutCancelableWrap(3 * 1000, this.cancellationToken, () => {
                    Image<Rgb, byte> image = ScreenCapture.Instance.CaptureScreenReturnImage();
                    return LindongCVHelper.GetCurrentHouseIndex(out houseIndex, image, this.MinimapPoint);
                }, 1);
                ret = this.MiniMap.GetCurrentHouseIndexWaitTimeout(out houseIndex, null, this.CancelToken, 3 * 1000);
                if (!ret)
                {
                    G.Instance.InfoWriter("未找到人物所在房间");
@@ -332,17 +237,19 @@
                }
                G.Instance.InfoWriter("进入房间->" + houseIndex.ToString());
                DateTime roomStartTime = DateTime.Now;
                KillMonsterStateMachine kmsm = new KillMonsterStateMachine(Houses[houseIndex], this.MinimapPoint, this.GameRect, preHouseIndex,this.runningStep, cancellationToken);
                HouseInfo houseInfo = Houses[houseIndex];
                this.Role.SetHouse(houseInfo);
                DateTime startTime = DateTime.Now;
                KillMonsterStateMachine kmsm = new KillMonsterStateMachine(this, houseInfo,this.Role, preHouseIndex,this.runningStep);
                ZTResult smresult = kmsm.Work( 5 * 60 * 1000);
                Int32 roomTotalSecond = (Int32)(DateTime.Now - roomStartTime).TotalSeconds;
                Int32 roomTotalSecond = (Int32)(DateTime.Now - startTime).TotalSeconds;
                G.Instance.InfoWriter("房间刷完,用时:" + (roomTotalSecond / 60) + "分" + (roomTotalSecond % 60) + "秒");
                runningStep = RunningStep.None;
                if (smresult == ZTResult.Success)
                {
                    if (houseIndex == 15)
                    if (houseInfo.IsEnd)
                    {
                        //所有房间刷完
                        return ZTResult.Success;
@@ -368,14 +275,14 @@
               () =>
               {
                   WindowUtils.SetDnfToTop();
                   CloseAllAlertWindow(this.cancellationToken, this.GameRect);
                   CloseAllAlertWindow(this.CancelToken, this.GameRect);
                   //向下走出赛丽亚的房间  ,走向素喃
                   G.Instance.InputControl.PressKey(2000, HIDCode.DownArrow);
               },
               () =>
               {
                   G.Instance.InfoWriter("检测是否进入素喃");
                   result = FuncUtils.TimeoutCancelableWrap(10000, this.cancellationToken, () => {
                   result = FuncUtils.TimeoutCancelableWrap(10000, this.CancelToken, () => {
                       return LindongCVHelper.IsInSunan(this.GameRect);
                   });
                   if (!result)
@@ -412,22 +319,22 @@
                G.Instance.InputControl.MoveToAndClick(mapPrePosition);
                //关闭地图框
                CloseAllAlertWindow(this.cancellationToken, this.GameRect);
                CloseAllAlertWindow(this.CancelToken, this.GameRect);
            },
            () =>
            {
                //检测是否进入时空之门
                return FuncUtils.TimeoutCancelableWrap(15000, this.cancellationToken, () =>
                return FuncUtils.TimeoutCancelableWrap(15000, this.CancelToken, () =>
                  {
                      CloseAllAlertWindow(this.cancellationToken, this.GameRect);
                      CloseAllAlertWindow(this.CancelToken, this.GameRect);
                      return LindongCVHelper.IsInShikongzhimen(this.GameRect);
                  });
            },
            () =>
            {
                //检测是否还在素喃
                return FuncUtils.TimeoutCancelableWrap(3000, this.cancellationToken, () => {
                    CloseAllAlertWindow(this.cancellationToken, this.GameRect);
                return FuncUtils.TimeoutCancelableWrap(3000, this.CancelToken, () => {
                    CloseAllAlertWindow(this.CancelToken, this.GameRect);
                    return LindongCVHelper.IsInSunan(this.GameRect);
                });
            });
@@ -448,7 +355,7 @@
            G.Instance.InfoWriter("检测是否打开选择副本界面");
            result = FuncUtils.TimeoutCancelableWrap(10000, this.cancellationToken, () => {
            result = FuncUtils.TimeoutCancelableWrap(10000, this.CancelToken, () => {
                Image<Rgb, byte> image = ScreenCapture.Instance.CaptureScreenReturnImage();
                return LindongCVHelper.IsInChoiceTaskPage(image, this.GameRect);
            });
@@ -549,8 +456,7 @@
            return false;
        }
        /// <summary>
        /// 选择难度
        /// </summary>
@@ -592,7 +498,7 @@
        /// 出售装备
        /// </summary>
        /// <param name="saleButtonRect"></param>
        private bool SaleEquipment(CancellationToken cancelToken)
        private bool SaleEquipment()
        {
            //卖装备并关闭商店
            ZTRectangle closeButtonRect = ZTRectangle.Empty;
@@ -608,7 +514,7 @@
            //得到装备文字位置
            ZTRectangle equipmentTextRect = ZTRectangle.Empty;
            bool result = FuncUtils.TimeoutCancelableWrap(5000, cancelToken, () => {
            bool result = FuncUtils.TimeoutCancelableWrap(5000, this.CancelToken, () => {
                Int32 status = 0;
                if (DnfCVHelper.GetEquipmentSelectStatus(out equipmentTextRect, out status, this.GameRect))
                {
@@ -631,7 +537,7 @@
            //开始点,每格步进30
            Utility.Structs.ZTPoint startPoint = new Utility.Structs.ZTPoint( equipmentTextRect.End.X-30, equipmentTextRect.End.Y+9);
            ZTPoint startPoint = new Utility.Structs.ZTPoint( equipmentTextRect.End.X-30, equipmentTextRect.End.Y+9);
            List<Int32> points = DnfCVHelper.GetEquipmentIndexs(startPoint);
            for (int i = 0; i < points.Count; i++)
@@ -657,5 +563,97 @@
            G.Instance.InputControl.PressKey(RandomUtils.KeyPressDuration, HIDCode.Escape);
            return true;
        }
        public override void EntryHousePrework(int houseIndex, int preHouseIndex)
        {
            //移动和发招
            switch (houseIndex)
            {
                case 2:
                    G.Instance.InputControl.PressKey(RandomUtils.KeyPressDuration, HIDCode.LeftArrow);
                    this.Role.SyncMove(new ZTPoint(-110, 0));
                    G.Instance.InputControl.PressKeys(HIDCode.LeftArrow, HIDCode.G);
                    break;
                case 1:
                    this.Role.SyncMove(new ZTPoint(-480, 80));
                    G.Instance.InputControl.PressKey(RandomUtils.KeyPressDuration, HIDCode.W);
                    break;
                case 5:
                    //G.Instance.InputControl.PressKey(RandomUtils.KeyPressDuration, HIDCode.RightArrow);
                    G.Instance.InputControl.PressKey(RandomUtils.KeyPressDuration, HIDCode.R);
                    Thread.Sleep(1000);
                    G.Instance.InputControl.PressKey(RandomUtils.KeyPressDuration, HIDCode.T);
                    break;
                case 4:
                    this.Role.SyncMove(new ZTPoint(-1150, -50));
                    G.Instance.InputControl.PressKey(RandomUtils.KeyPressDuration, HIDCode.RightArrow);
                    G.Instance.InputControl.PressKey(RandomUtils.KeyPressDuration, HIDCode.E);
                    //Thread.Sleep(1000);
                    //G.Instance.InputControl.PressKey(RandomUtils.KeyPressDuration, HIDCode.E);
                    break;
                case 8:
                    this.Role.SyncMove(new ZTPoint(-100, 110));
                    G.Instance.InputControl.PressKey(RandomUtils.KeyPressDuration, HIDCode.RightArrow);
                    G.Instance.InputControl.PressKey(RandomUtils.KeyPressDuration, HIDCode.G);
                    //Thread.Sleep(300);
                    //G.Instance.InputControl.PressKey(RandomUtils.KeyPressDuration, HIDCode.Z);
                    break;
                case 9:
                    this.Role.SyncMove(new ZTPoint(325, 65));
                    G.Instance.InputControl.PressKey(RandomUtils.KeyPressDuration, HIDCode.R);
                    Thread.Sleep(1000);
                    this.Role.SyncMove(new ZTPoint(300, 0));
                    G.Instance.InputControl.PressKey(RandomUtils.KeyPressDuration, HIDCode.T);
                    break;
                case 10:
                    G.Instance.InputControl.PressKey(RandomUtils.KeyPressDuration, HIDCode.Q);
                    break;
                case 12:
                    G.Instance.InputControl.PressKey(RandomUtils.KeyPressDuration, HIDCode.RightArrow);
                    G.Instance.InputControl.PressKey(RandomUtils.KeyPressDuration, HIDCode.R);
                    Thread.Sleep(1000);
                    this.Role.SyncMove(new ZTPoint(-110, 0));
                    G.Instance.InputControl.PressKey(RandomUtils.KeyPressDuration, HIDCode.T);
                    break;
                case 13:
                    if (preHouseIndex == 12)
                    {
                        this.Role.SyncMove(new ZTPoint(600, 150));
                    }
                    else
                    {
                        this.Role.SyncMove(new ZTPoint(-300, 200));
                        G.Instance.InputControl.PressKey(RandomUtils.KeyPressDuration, HIDCode.RightArrow);
                    }
                    G.Instance.InputControl.PressKey(RandomUtils.KeyPressDuration, HIDCode.Q);
                    Thread.Sleep(1000);
                    G.Instance.InputControl.PressKey(RandomUtils.KeyPressDuration, HIDCode.E);
                    break;
                case 14:
                    if (preHouseIndex == 13)
                    {
                        this.Role.SyncMove(new ZTPoint(400, 0));
                    }
                    else
                    {
                        this.Role.SyncMove(new ZTPoint(0, 100));
                    }
                    G.Instance.InputControl.PressKey(RandomUtils.KeyPressDuration, HIDCode.W);
                    break;
                case 15:
                    this.Role.SyncMove(new ZTPoint(600, 0));
                    G.Instance.InputControl.PressKey(RandomUtils.KeyPressDuration, HIDCode.H);
                    Thread.Sleep(5000);
                    G.Instance.InputControl.PressKey(RandomUtils.KeyPressDuration, HIDCode.Y);
                    break;
                case 18:
                    G.Instance.InputControl.PressKey(RandomUtils.KeyPressDuration, HIDCode.W);
                    break;
            }
        }
    }
}
src/RichCreator/Maps/Lindong/LindongMiniMap.cs
New file
@@ -0,0 +1,64 @@
using Emgu.CV;
using Emgu.CV.Structure;
using RichCreator.Dnf;
using RichCreator.Utility.Captures;
using RichCreator.Utility.CV;
using RichCreator.Utility.Maps;
using RichCreator.Utility.Structs;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace RichCreator.Maps.Lindong
{
    public class LindongMiniMap : IMiniMap
    {
        public LindongMiniMap(ZTRectangle gameRect):base(gameRect, new ZTPoint(1201, 47))
        {}
        protected override bool GetCurrentHouse(out Int32 houseIndex, Image<Rgb, byte> image)
        {
            houseIndex = -1;
            Int32 overHouseDected = -1;
            for (int i = 0; i < 20; i++)
            {
                Int32 row = i / 4;
                Int32 col = i % 4;
                //目标块第一块坐标
                Int32 x = this.MinimapOffset.X + col * 18;
                Int32 y = this.MinimapOffset.Y + row * 18;
                if (DnfCVHelper.IsCurrentHouseColor(image, x, y))
                {
                    houseIndex = i;
                    return true;
                }
                if (i == 15)
                {
                    //查看,14格是否青色
                    if (DnfCVHelper.IsCrossedHouseColor(image, x - 18, y))
                    {
                        //是否怪物图像
                        if ( DnfCVHelper.IsOverHouseColor(image,x,y))
                        {
                            overHouseDected = 15;
                        }
                    }
                }
            }
            if (overHouseDected > -1)
            {
                houseIndex = overHouseDected;
                return true;
            }
            return false;
        }
    }
}
src/RichCreator/Maps/Lindong/OutOfBounds.cs
@@ -7,6 +7,7 @@
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using RichCreator.Dnf;
namespace RichCreator.Maps.Lindong
{
@@ -15,7 +16,7 @@
    /// </summary>
    public class OutOfBounds
    {
        public OutOfBounds(ZTRectangle gameRect,MoveState moveState)
        public OutOfBounds(ZTRectangle gameRect,DnfRole moveState)
        {
            this.moveState = moveState;
            this.gameRect = gameRect;
@@ -37,7 +38,7 @@
        private ZTRectangle gameRect;
        private MoveState moveState;
        private DnfRole moveState;
        private ZTRectangle[] bounds = null;
src/RichCreator/Maps/Lindong/SingleEntryHouseSkill.cs
File was deleted
src/RichCreator/Maps/MapInfo.cs
File was deleted
src/RichCreator/Maps/SkillSetting/SkillSettingMap.cs
New file
@@ -0,0 +1,672 @@
using RichCreator.Utility;
using RichCreator.Utility.Captures;
using RichCreator.Utility.CV;
using RichCreator.Utility.InputControl;
using RichCreator.Utility.Structs;
using RichCreator.Utility.Utilitys;
using Emgu.CV;
using Emgu.CV.Structure;
using RichCreator.Jobs;
using RichCreator.Jobs.StateMachines;
using System;
using System.Collections.Generic;
using System.Threading;
using RichCreator.Utility.Maps;
using RichCreator.Dnf;
namespace RichCreator.Maps.SkillSetting
{
    /// <summary>
    /// 技能设置地图
    /// </summary>
    public class SkillSettingMap : MapInfo
    {
        public SkillSettingMap(ZTRectangle gameRect, CancellationToken cancelToken) : base(MapType.SkillSetting, gameRect, cancelToken)
        {
        }
        /// <summary>
        /// 标题文字
        /// </summary>
        private ZTRectangle titleRect = ZTRectangle.Empty;
        /// <summary>
        /// lv字样
        /// </summary>
        private ZTRectangle lvRect = ZTRectangle.Empty;
        /// <summary>
        /// 向上滚动按钮
        /// </summary>
        private ZTRectangle upKeyRect = ZTRectangle.Empty;
        /// <summary>
        /// 向下滚动按钮
        /// </summary>
        private ZTRectangle downKeyRect = ZTRectangle.Empty;
        public override ZTResult Start(Int32 runningStep)
        {
            WindowUtils.SetDnfToTop();
            if (!OpenSkillWindow())
            {
                G.Instance.InfoWriter("打开技能窗口失败");
                return ZTResult.Failed;
            }
            G.Instance.InfoWriter("技能窗口已打开");
            //初始化
            if (!InitSkills())
            {
                G.Instance.InfoWriter("初始化技能失败");
                return ZTResult.Failed;
            }
            G.Instance.InfoWriter("技能已初始化");
            //点顶端的技能
            if (!SettingTopSkills())
            {
                G.Instance.InfoWriter("通用技能设置失败");
                return ZTResult.Failed;
            }
            G.Instance.InfoWriter("通用技能已设置");
            //点sp技能
            if (!SettingSPSkills())
            {
                G.Instance.InfoWriter("SP技能设置失败");
                return ZTResult.Failed;
            }
            G.Instance.InfoWriter("SP技能已设置");
            //点tp技能
            if (!SettingTPSkills())
            {
                G.Instance.InfoWriter("TP技能设置失败");
                return ZTResult.Failed;
            }
            G.Instance.InfoWriter("TP技能已设置");
            //点学习
            if (!Studay())
            {
                G.Instance.InfoWriter("技能学习失败");
                return ZTResult.Failed;
            }
            G.Instance.InfoWriter("技能已学习");
            //技能摆放
            if (!FormatSkillColumn())
            {
                G.Instance.InfoWriter("技能摆放失败");
                return ZTResult.Failed;
            }
            G.Instance.InfoWriter("技能摆放成功");
            CloseAllAlertWindow(this.CancelToken, this.GameRect);
            return ZTResult.Success;
        }
        /// <summary>
        /// 打开技能窗
        /// </summary>
        /// <param name="titleRect"></param>
        /// <param name="lvRect"></param>
        /// <param name="upKeyRect"></param>
        /// <param name="downKeyRect"></param>
        /// <returns></returns>
        private bool OpenSkillWindow()
        {
            bool isGray = false;
            ZTRectangle innertitleRect=ZTRectangle.Empty, innerlvRect = ZTRectangle.Empty, innerupKeyRect = ZTRectangle.Empty, innerdownKeyRect = ZTRectangle.Empty;
            for (int i = 0; i < 2; i++)
            {
                CloseAllAlertWindow(this.CancelToken, this.GameRect);
                G.Instance.InputControl.PressKey(RandomUtils.KeyPressDuration,HIDCode.K);
                bool result=FuncUtils.TimeoutCancelableWrap(5000, this.CancelToken, () => {
                    //识别技能窗
                    return SkillCVHelper.FindSkillWindow(out innertitleRect, out innerlvRect, out innerupKeyRect, out innerdownKeyRect,out isGray, this.GameRect);
                });
                if (result)
                {
                    titleRect = innertitleRect;
                    lvRect = innerlvRect;
                    upKeyRect = innerupKeyRect;
                    downKeyRect = innerdownKeyRect;
                    if (isGray)
                    {
                        //如果当前选的是tp技能学习(tp技能学习的右侧滚动条跟sp右侧的不一样),则:
                        //选中sp技能学习
                        Utility.Structs.ZTPoint spPoint = new Utility.Structs.ZTPoint(lvRect.End.X + 55, lvRect.Start.Y - 80);
                        G.Instance.InputControl.MoveToAndClick(spPoint);
                        result = FuncUtils.TimeoutCancelableWrap(3000, this.CancelToken, () => {
                            //识别技能窗
                            return SkillCVHelper.FindCommonUpDownKey(out innerupKeyRect, out innerdownKeyRect, this.titleRect,this.GameRect);
                        },300);
                        if (!result)
                        {
                            continue;
                        }
                        upKeyRect = innerupKeyRect;
                        downKeyRect = innerdownKeyRect;
                    }
                    return true;
                }
            }
            G.Instance.InfoWriter("打开技能对话框失败");
            return false;
        }
        private bool InitSkills()
        {
            //点击初始化
            Utility.Structs.ZTPoint initButton = new Utility.Structs.ZTPoint(this.upKeyRect.Start.X - 37, this.upKeyRect.Start.Y - 86);
            G.Instance.InputControl.MoveToAndClick(initButton);
            //是否已打开确认对话框
            ZTRectangle notificationRect = ZTRectangle.Empty;
            bool result = FuncUtils.TimeoutCancelableWrap(3000, this.CancelToken, () => {
                return SkillCVHelper.ExistsNotificationText(out notificationRect,this.GameRect);
            });
            if (!result)
            {
                G.Instance.DebugWriter("公告未找到");
                return false;
            }
            //点击确认
            G.Instance.InputControl.Move(0, 0, true, false, false);
            Thread.Sleep(RandomUtils.MouseClickDuration);
            G.Instance.InputControl.Move(0, 0, false, false, false);
            Thread.Sleep(1000);
            //是否已打开完毕对话框
            result = FuncUtils.TimeoutCancelableWrap(3000, this.CancelToken, () => {
                return SkillCVHelper.ExistsNotificationText(out notificationRect, this.GameRect);
            });
            if (!result)
            {
                G.Instance.DebugWriter("完毕公告未找到");
                return false;
            }
            //点击确认
            Utility.Structs.ZTPoint okPosition = new Utility.Structs.ZTPoint(notificationRect.GetCenterPoint().X, notificationRect.End.Y + 60);
            G.Instance.InputControl.MoveToAndClick(okPosition);
            Thread.Sleep(RandomUtils.G(500,800));
            return true;
        }
        /// <summary>
        /// 关闭所有弹出窗
        /// </summary>
        /// <param name="cancelToken"></param>
        /// <param name="gameRect"></param>
        /// <returns></returns>
        private void CloseAllAlertWindow(CancellationToken cancelToken, ZTRectangle gameRect)
        {
            while (!cancelToken.IsCancellationRequested)
            {
                //G.Instance.InputControl.MoveTo(gameRect.Start.X,gameRect.Start.Y, false, false, false);
                //Thread.Sleep(10);
                //截图
                Image<Rgb, byte> image = ScreenCapture.Instance.CaptureScreenReturnImage();
                ZTRectangle closeButtonRect = ZTRectangle.Empty;
                if (!DnfCVHelper.GetAlertWindow(out closeButtonRect, image, gameRect))
                {
                    return;
                }
                G.Instance.InputControl.MoveToAndClick(closeButtonRect.GetCenterPoint());
                Thread.Sleep(500);
            }
        }
        /// <summary>
        /// 设置顶端技能
        /// </summary>
        /// <returns></returns>
        private bool SettingTopSkills()
        {
            //物理暴击
            Utility.Structs.ZTPoint skillPoint = new Utility.Structs.ZTPoint(lvRect.End.X + 200, lvRect.Start.Y - 42);
            SettingSkill(skillPoint);
            //物理背击
            skillPoint = new Utility.Structs.ZTPoint(lvRect.End.X + 280, lvRect.Start.Y - 42);
            SettingSkill(skillPoint);
            return true;
        }
        /// <summary>
        /// 要点的技能列表
        /// 内部为每个节所相对于节的相对位置
        /// </summary>
        private List<Utility.Structs.ZTPoint>[] toAddLevelSkills = new List<Utility.Structs.ZTPoint>[] {
            new List<Utility.Structs.ZTPoint> (){
                new Utility.Structs.ZTPoint(762-346,450-237),//疾风之棍棒精通
            },
            new List<Utility.Structs.ZTPoint> (){
                new Utility.Structs.ZTPoint(182,17),//朔风牵引
                new Utility.Structs.ZTPoint(274,17),//流风决
                new Utility.Structs.ZTPoint(481-251,342-262),//风鸣冲击
                new Utility.Structs.ZTPoint(323,82),//游离之风
                new Utility.Structs.ZTPoint(574-251,409-262),//双翼风刃
                new Utility.Structs.ZTPoint(574-251,477-262),//风暴之眼
                new Utility.Structs.ZTPoint(529-251,544-262),//真空旋风破
            },
            new List<Utility.Structs.ZTPoint> (){
                new Utility.Structs.ZTPoint(432-251,275-329),//风暴之拳
                new Utility.Structs.ZTPoint(479-251,342-329),//万象风龙阵
                new Utility.Structs.ZTPoint(572-251,340-329),//御风之力
                new Utility.Structs.ZTPoint(433-251,478-329),//风神决
                new Utility.Structs.ZTPoint(526-251,475-329),//风卷残云
                new Utility.Structs.ZTPoint(574-251,476-329),//游龙惊风破
                new Utility.Structs.ZTPoint(431-251,542-329),//九霄风雷
                new Utility.Structs.ZTPoint(663-295,545-331),//无限风域
            }
        };
        /// <summary>
        /// 设置SP技能
        /// </summary>
        /// <returns></returns>
        private bool SettingSPSkills()
        {
            //选中sp技能学习
            Utility.Structs.ZTPoint spPoint = new Utility.Structs.ZTPoint(lvRect.End.X + 55, lvRect.Start.Y - 80);
            G.Instance.InputControl.MoveToAndClick(spPoint);
            ZTRectangle numberLimitArea = new ZTRectangle(lvRect.Start.X-5,lvRect.End.Y,lvRect.End.X+21,lvRect.End.Y+340);
            bool[] addedFlag = new bool[] {false,false,false };
            bool isdown = true;
            for (int i = 0; i < 4; i++)
            {
                for (int count = 0; count < 10; count++)
                {
                    if (this.CancelToken.IsCancellationRequested)
                    {
                        return false;
                    }
                    //是否有数字
                    bool result = FuncUtils.TimeoutCancelableWrap(1000, this.CancelToken, () => {
                        return SkillCVHelper.HasNumberText(numberLimitArea);
                    }, 100);
                    if (!result)
                    {
                        continue;
                    }
                    //查找是否是某节,
                    Int32 numberSection = 0;
                    ZTRectangle sectionRect = ZTRectangle.Empty;
                    if (SkillCVHelper.IsNumberSections(out numberSection, out sectionRect, numberLimitArea))
                    {
                        if (!addedFlag[numberSection])
                        {
                            //没有添加,则循环把此节下的所有技能都加上
                            foreach (var item in toAddLevelSkills[numberSection])
                            {
                                SettingSkill(sectionRect.Start.Add(item));
                            }
                            addedFlag[numberSection] = true;
                        }
                        if (count == 0)
                        {
                            if (numberSection == 0)
                            {
                                //一开始是1区则向下
                                isdown = true;
                            }
                            if (numberSection == 2)
                            {
                                //一开始是3区则向上
                                isdown = false;
                            }
                        }
                    }
                    if (isdown)
                    {
                        G.Instance.InputControl.MoveToAndClick(downKeyRect.GetCenterPoint());
                    }
                    else
                    {
                        G.Instance.InputControl.MoveToAndClick(upKeyRect.GetCenterPoint());
                    }
                }
                if (addedFlag[0] == true && addedFlag[1] == true && addedFlag[2] == true)
                {
                    return true;
                }
                isdown = !isdown;
            }
            return false;
        }
        /// <summary>
        /// 设置TP技能
        /// </summary>
        /// <returns></returns>
        private bool SettingTPSkills()
        {
            //选中tp技能学习
            Utility.Structs.ZTPoint spPoint = new Utility.Structs.ZTPoint(lvRect.End.X + 253, lvRect.Start.Y - 80);
            G.Instance.InputControl.MoveToAndClick(spPoint);
            Utility.Structs.ZTPoint[] skills = new Utility.Structs.ZTPoint[] {
                new Utility.Structs.ZTPoint(334-296,277-251),//1.第一行第一个
                new Utility.Structs.ZTPoint(381-296,545-251),//2.第三行第二个
                new Utility.Structs.ZTPoint(664-296,413-251),//3.第二行倒数第三个
                new Utility.Structs.ZTPoint(567-296,410-251),//4.第二行倒数第五个
                new Utility.Structs.ZTPoint(758-296,411-251),//5.第二行倒数第一个
            };
            for (int i = 0; i < skills.Length; i++)
            {
                SettingSkill(lvRect.Start.Add(skills[i]));
            }
            return true;
        }
        /// <summary>
        /// 学习
        /// </summary>
        /// <returns></returns>
        private bool Studay()
        {
            Utility.Structs.ZTPoint studayPoint = new Utility.Structs.ZTPoint(this.downKeyRect.Start.X-331,this.downKeyRect.End.Y+27);
            G.Instance.InputControl.MoveToAndClick(studayPoint);
            Thread.Sleep(1000);
            //点击确认
            G.Instance.InputControl.Move(0, 0, true, false, false);
            Thread.Sleep(RandomUtils.MouseClickDuration);
            G.Instance.InputControl.Move(0, 0, false, false, false);
            Thread.Sleep(RandomUtils.MouseClickDuration*3);
            return true;
        }
        /// <summary>
        /// 设置技能
        /// </summary>
        /// <param name="skillPoint"></param>
        /// <returns></returns>
        private bool SettingSkill(Utility.Structs.ZTPoint skillPoint)
        {
            //84,71
            ZTRectangle limitRect = new ZTRectangle(skillPoint.X-84,skillPoint.Y-71,skillPoint.X+84,skillPoint.Y+71);
            bool result = false;
            ZTRectangle addSkillLevelButton = ZTRectangle.Empty;
            //选中技能,试两次
            int addTry = 0;
            for (; addTry < 2; addTry++)
            {
                bool skillIsFull = false;
                G.Instance.InputControl.MoveToAndClick(skillPoint);
                Thread.Sleep(500);
                result = FuncUtils.TimeoutCancelableWrap(3000, this.CancelToken, () => {
                    return SkillCVHelper.IsSelectSkill(out addSkillLevelButton, out skillIsFull, limitRect);
                });
                if (result)
                {
                    if (skillIsFull)
                    {
                        return true;
                    }
                    break;
                }
            }
            if (addTry >= 2)
            {
                return false;
            }
            //加技能点,试两次
            for (addTry = 0; addTry < 2; addTry++)
            {
                G.Instance.InputControl.MoveToAndClick(addSkillLevelButton.GetCenterPoint());
                result = FuncUtils.TimeoutCancelableWrap(3000, this.CancelToken, () => {
                    return SkillCVHelper.SkillIsFullLevel(limitRect);
                });
                if (result)
                {
                    return true;
                }
            }
            return false;
        }
        /// <summary>
        /// 格式化摆放技能栏
        /// </summary>
        /// <returns></returns>
        private bool FormatSkillColumn()
        {
            //打开已学技能窗
            ZTRectangle studayTextRect = ZTRectangle.Empty;
            if (!OpenStudaySkillWindow(out studayTextRect))
            {
                G.Instance.DebugWriter("未指开已学技能窗口");
                return false;
            }
            //技能栏全部技能移动已学技能窗
            if (!MoveSkillToStudayWindow(studayTextRect))
            {
                G.Instance.DebugWriter("移动至已学技能窗口失败");
                return false;
            }
            //技能窗内容分步移
            if (!MoveSkillToExpress(studayTextRect))
            {
                G.Instance.DebugWriter("移动至快捷栏失败");
                return false;
            }
            return true;
        }
        /// <summary>
        /// 打开已学技能窗口
        /// </summary>
        /// <returns></returns>
        private bool OpenStudaySkillWindow(out ZTRectangle studayTextRect)
        {
            studayTextRect = ZTRectangle.Empty;
            ZTRectangle innerstudyTextRect = ZTRectangle.Empty;
            Utility.Structs.ZTPoint openwindowButton = new Utility.Structs.ZTPoint(this.titleRect.Start.X + 194, this.titleRect.Start.Y + 517);
            for (int i = 0; i < 2; i++)
            {
                if (this.CancelToken.IsCancellationRequested)
                {
                    return false;
                }
                G.Instance.InputControl.MoveToAndClick(openwindowButton);
                bool result = FuncUtils.TimeoutCancelableWrap(3000, this.CancelToken, () => {
                    return SkillCVHelper.StudaySkillWindowIsOpen(out innerstudyTextRect,this.GameRect);
                }, 200);
                if (result)
                {
                    studayTextRect = innerstudyTextRect;
                    return true;
                }
            }
            return false;
        }
        /// <summary>
        /// 从快捷栏向已学技能栏移动技能
        /// </summary>
        /// <returns></returns>
        private bool MoveSkillToStudayWindow(ZTRectangle studayTextRect)
        {
            ZTRectangle targetRect = GetStudaySkillRect(studayTextRect, 27);
            for (int i = 0; i < 12; i++)
            {
                ZTRectangle expressRect = GetExpressSkillRect(i);
                MoveSkill(expressRect.GetCenterPoint(), targetRect.GetCenterPoint());
            }
            return true;
        }
        /// <summary>
        /// 识别出来的技能索引和在技能快捷栏中的对应关系
        /// 对应关系是-1的不放在快捷栏里
        /// </summary>
        Dictionary<Int32, Int32> skillToExpressMap = new Dictionary<int, int>() {
            { 4 ,0},
            { 13,1},
            { 8 ,2},
            { 9 ,3},
            { 15,4},
            { 12,5},
            { 6 ,6},
            { 10,7},
            { 7 ,8},
            { 11,9},
            { 14,10},
            { 16,11}
        };
        /// <summary>
        /// 从已学技能栏向快捷栏移动技能
        /// </summary>
        /// <param name="studayTextRect"></param>
        /// <returns></returns>
        private bool MoveSkillToExpress(ZTRectangle studayTextRect)
        {
            int i = 0;
            int count = 17;
            while (i < count)
            {
                if (this.CancelToken.IsCancellationRequested)
                {
                    return false;
                }
                //获取位置,并将鼠标移到位置,显示出技能名
                Utility.Structs.ZTPoint studayPoint = GetStudaySkillRect(studayTextRect, i).GetCenterPoint();
                G.Instance.InputControl.MoveTo(studayPoint.X, studayPoint.Y, false, false, false);
                Thread.Sleep(1000);
                //识别
                Int32 skillIndex = 0;//技能索引
                ZTRectangle discenrnRect = new ZTRectangle(studayPoint.X - 150, this.GameRect.Start.Y, studayPoint.X, studayPoint.Y);
                bool result = FuncUtils.TimeoutCancelableWrap(2000, this.CancelToken, () => {
                    return SkillCVHelper.GetSkillName(out skillIndex, discenrnRect);
                }, 200);
                if (result)
                {
                    if (skillToExpressMap.ContainsKey(skillIndex))
                    {
                        //要放到技能栏的位置
                        Utility.Structs.ZTPoint to = GetExpressSkillRect(skillToExpressMap[skillIndex]).GetCenterPoint();
                        MoveSkill(studayPoint, to);
                        count--;
                        continue;
                    }
                }
                else
                {
                    G.Instance.DebugWriter("识别技能错误,index=" + i.ToString());
                }
                i++;
            }
            return true;
        }
        /// <summary>
        /// 移动技能
        /// </summary>
        /// <param name="from"></param>
        /// <param name="to"></param>
        /// <returns></returns>
        private bool MoveSkill(Utility.Structs.ZTPoint from, Utility.Structs.ZTPoint to)
        {
            //移动指定位置
            G.Instance.InputControl.MoveTo(from.X, from.Y, false, false, false);
            Thread.Sleep(RandomUtils.MouseClickDuration*2);
            //按下
            G.Instance.InputControl.Move(0, 0, true, false, false);
            Thread.Sleep(RandomUtils.MouseClickDuration * 3);
            //移到目标位置
            G.Instance.InputControl.MoveTo(to.X, to.Y, true, false, false);
            Thread.Sleep(RandomUtils.MouseClickDuration*2);
            //松开
            G.Instance.InputControl.Move(0, 0, false, false, false);
            Thread.Sleep(RandomUtils.MouseClickDuration * 2);
            return true;
        }
        /// <summary>
        /// 得到快捷栏技能定位
        /// </summary>
        /// <param name="index"></param>
        /// <returns></returns>
        private ZTRectangle GetExpressSkillRect(int index)
        {
            //x209,y488
            Int32 row = index / 6;
            Int32 col = index % 6;
            int x = this.titleRect.Start.X + 209 + col * 33;
            int y = this.titleRect.Start.Y + 488 + row * 33;
            return new ZTRectangle(x, y, x + 33, y + 33);
        }
        /// <summary>
        /// 得到已学技能栏定位
        /// </summary>
        /// <param name="studayTextRect"></param>
        /// <param name="index"></param>
        /// <returns></returns>
        private ZTRectangle GetStudaySkillRect(ZTRectangle studayTextRect, Int32 index)
        {
            //x:-122,y:44
            Int32 row = index / 7;
            Int32 col = index % 7;
            int x = studayTextRect.Start.X + (-122) + col * 31;
            int y = studayTextRect.Start.Y + 44 + row * 31;
            return new ZTRectangle(x, y, x + 31, y + 31);
        }
    }
}
src/RichCreator/Maps/Skills/SkillMap.cs
File was deleted
src/RichCreator/Maps/Test/TestMap.cs
@@ -13,29 +13,25 @@
using System.Threading;
using static RichCreator.Utility.CV.GroupCVHelper;
using RichCreator.StateMachines;
using RichCreator.Utility.Maps;
using RichCreator.Dnf;
namespace RichCreator.Maps
namespace RichCreator.Maps.Test
{
    /// <summary>
    /// 测试地图
    /// </summary>
    public class TestMap : MapInfo
    {
        /// <summary>
        /// 游戏区域
        /// </summary>
        public ZTRectangle GameRect { get; set; }
        public TestMap(ZTRectangle gameRect, CancellationToken cancelToken) :base(MapType.Test, gameRect, cancelToken)
        {
        public CancellationToken cancellationToken { get; set; }
        }
        private const bool isCreateGroup = true;
        
        public override ZTResult Start(ZTRectangle gameRect, CancellationToken cancelToken, Int32 runningStep)
        {
            this.GameRect = gameRect;
            this.cancellationToken = cancelToken;
            WindowUtils.SetDnfToTop();
        public override ZTResult Start(Int32 runningStep)
        {WindowUtils.SetDnfToTop();
            
           
@@ -61,7 +57,7 @@
            }
            //沉默一段时间
            Thread.Sleep(50000000);
            CloseAllAlertWindow(this.cancellationToken, this.GameRect);
            CloseAllAlertWindow(this.CancelToken, this.GameRect);
            return ZTResult.Success;
        }
        
@@ -111,7 +107,7 @@
            //点击创建
            G.Instance.InputControl.MoveToAndClick(okButtonRect.GetCenterPoint());
            
            bool result = FuncUtils.TimeoutCancelableWrap(5000, this.cancellationToken, () => {
            bool result = FuncUtils.TimeoutCancelableWrap(5000, this.CancelToken, () => {
                //识别是否有我的队伍按钮
                return GroupCVHelper.ExistsMyGroupButton(out mygroupButtonRect, this.GameRect);
            });
@@ -119,7 +115,7 @@
            {
                G.Instance.InfoWriter("create group ok");
                //点击组队“确定”按钮
                result = FuncUtils.TimeoutCancelableWrap(15 * 60 * 1000,this.cancellationToken, () => {
                result = FuncUtils.TimeoutCancelableWrap(15 * 60 * 1000,this.CancelToken, () => {
                    Utility.Structs.ZTPoint yes = Utility.Structs.ZTPoint.Empty;
                    Utility.Structs.ZTPoint no = Utility.Structs.ZTPoint.Empty;
                    bool retFind = GroupCVHelper.FindYaoqingZuduiWindow(out yes, out no, this.GameRect);
@@ -161,7 +157,7 @@
                return true;
            }
            Utility.Structs.ZTPoint searchButtonCenerPoint = searchButtonRect.GetCenterPoint();
            ZTPoint searchButtonCenerPoint = searchButtonRect.GetCenterPoint();
            //输入组名
            G.Instance.InputControl.MoveToAndClick(new Utility.Structs.ZTPoint (searchButtonCenerPoint.X-80, searchButtonCenerPoint.Y));
            DeleteAllChar(groupName.Length + 3);
@@ -173,7 +169,7 @@
            //查找组项
            ZTRectangle groupItemRect = ZTRectangle.Empty;
            bool result = FuncUtils.TimeoutCancelableWrap(5000, this.cancellationToken, () => {
            bool result = FuncUtils.TimeoutCancelableWrap(5000, this.CancelToken, () => {
                //识别组项
                return GroupCVHelper.FindGroupItem(out groupItemRect, this.GameRect);
            });
@@ -189,7 +185,7 @@
            //查找是否打开成员列表窗
            ZTRectangle joinButtonRect = ZTRectangle.Empty;
            result = FuncUtils.TimeoutCancelableWrap(5000, this.cancellationToken, () => {
            result = FuncUtils.TimeoutCancelableWrap(5000, this.CancelToken, () => {
                //识别是否打开成员列表窗
                return GroupCVHelper.FindGroupMemberWindow(out joinButtonRect, this.GameRect);
            });
@@ -203,7 +199,7 @@
            G.Instance.InputControl.MoveToAndClick(joinButtonRect.GetCenterPoint());
            //查找是否已经组队成功,30秒
            result = FuncUtils.TimeoutCancelableWrap(30000, this.cancellationToken, () => {
            result = FuncUtils.TimeoutCancelableWrap(30000, this.CancelToken, () => {
                //识别是否有我的队伍按钮
                return GroupCVHelper.ExistsMyGroupButton(out mygroupButtonRect, this.GameRect);
            });
@@ -237,10 +233,10 @@
            ZTRectangle innerGroupWindowTextRect = ZTRectangle.Empty, innerSearchButtonRect = ZTRectangle.Empty, innerCreateGroupButton = ZTRectangle.Empty;
            for (int i = 0; i < 2; i++)
            {
                CloseAllAlertWindow(this.cancellationToken, this.GameRect);
                CloseAllAlertWindow(this.CancelToken, this.GameRect);
                G.Instance.InputControl.PressKey(RandomUtils.KeyPressDuration, HIDCode.RightSquarebrackets);
                bool result = FuncUtils.TimeoutCancelableWrap(5000, this.cancellationToken, () => {
                bool result = FuncUtils.TimeoutCancelableWrap(5000, this.CancelToken, () => {
                    //识别队伍窗
                    return GroupCVHelper.FindGroupWindow(out innerGroupWindowTextRect, out innerSearchButtonRect, out innerCreateGroupButton,out innerHasGroup, this.GameRect);
                });
@@ -285,7 +281,7 @@
            {
                //点击创建队伍
                G.Instance.InputControl.MoveToAndClick(createGroupButtonRect.GetCenterPoint());
                bool result = FuncUtils.TimeoutCancelableWrap(5000, this.cancellationToken, () => {
                bool result = FuncUtils.TimeoutCancelableWrap(5000, this.CancelToken, () => {
                    //识别创建队伍窗
                    return GroupCVHelper.FindCreateGroupWindow(out innerCreateGroupWindowTextRect, out innerOkButtonRect, this.GameRect);
                });
src/RichCreator/PathFinding/Dijkstra.cs
File was deleted
src/RichCreator/PathFinding/Edge.cs
File was deleted
src/RichCreator/PathFinding/Node.cs
File was deleted
src/RichCreator/RichCreator.csproj
@@ -67,6 +67,7 @@
    <Reference Include="System.ServiceModel" />
    <Reference Include="System.Transactions" />
    <Reference Include="System.Web" />
    <Reference Include="System.Windows.Forms" />
    <Reference Include="System.Xml" />
    <Reference Include="Microsoft.CSharp" />
    <Reference Include="System.Core" />
@@ -103,11 +104,15 @@
    <Compile Include="..\Protocols\Richcreator.cs">
      <Link>Services\Richcreator.cs</Link>
    </Compile>
    <Compile Include="Dnf\DnfRole.cs" />
    <Compile Include="Dnf\IMiniMap.cs" />
    <Compile Include="Dnf\MapInfo.cs" />
    <Compile Include="Maps\Kalete\KaleteMap.cs" />
    <Compile Include="Maps\Kalete\KaleteMiniMap.cs" />
    <Compile Include="Maps\Kalete\OutOfBounds.cs" />
    <Compile Include="Maps\Lindong\LindongMiniMap.cs" />
    <Compile Include="Maps\Test\TestMap.cs" />
    <Compile Include="Maps\Skills\SkillMap.cs" />
    <Compile Include="PathFinding\Dijkstra.cs" />
    <Compile Include="PathFinding\Edge.cs" />
    <Compile Include="PathFinding\Node.cs" />
    <Compile Include="Maps\SkillSetting\SkillSettingMap.cs" />
    <Compile Include="Services\ServiceProvider.cs" />
    <Compile Include="StateMachines\ChannelStateMachine.cs" />
    <Compile Include="StateMachines\StateMachineBase.cs" />
@@ -117,23 +122,16 @@
    <Compile Include="Jobs\JobBase.cs" />
    <Compile Include="Jobs\JobMonitor.cs" />
    <Compile Include="Maps\Lindong\OutOfBounds.cs" />
    <Compile Include="Maps\Lindong\SingleEntryHouseSkill.cs" />
    <Compile Include="Models\RunningModel.cs" />
    <Compile Include="Models\RunningStep.cs" />
    <Compile Include="StateMachines\KillMonsterStateMachine.cs" />
    <Compile Include="StateMachines\MoveState.cs" />
    <Compile Include="StateMachines\SkillInfo.cs" />
    <Compile Include="StateMachines\SkillQueue.cs" />
    <Compile Include="Maps\HouseInfo.cs" />
    <Compile Include="Maps\Lindong\LindongMap.cs" />
    <Compile Include="Maps\MapInfo.cs" />
    <Compile Include="Models\RichCreatorConfig.cs" />
    <Compile Include="Jobs\WeGameJob.cs" />
    <Compile Include="Utilitys\AttackRectangle.cs" />
    <Compile Include="Utilitys\Utils.cs" />
    <Compile Include="ViewModels\ConfigViewModel.cs" />
    <Compile Include="ViewModels\NotificationObject.cs" />
    <Compile Include="ZTResult.cs" />
    <Page Include="MainWindow.xaml">
      <Generator>MSBuild:Compile</Generator>
      <SubType>Designer</SubType>
@@ -190,9 +188,7 @@
      <Name>RichCreator.Utility</Name>
    </ProjectReference>
  </ItemGroup>
  <ItemGroup>
    <Folder Include="Maps\Kalete\" />
  </ItemGroup>
  <ItemGroup />
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
  <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
    <PropertyGroup>
src/RichCreator/StateMachines/ChannelStateMachine.cs
@@ -1,5 +1,6 @@
using Emgu.CV;
using Emgu.CV.Structure;
using RichCreator.Utility;
using RichCreator.Utility.Captures;
using RichCreator.Utility.CV;
using RichCreator.Utility.Structs;
src/RichCreator/StateMachines/KillMonsterStateMachine.cs
@@ -1,22 +1,19 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Emgu.CV;
using Emgu.CV.Structure;
using RichCreator.Dnf;
using RichCreator.Maps.Kalete;
using RichCreator.StateMachines;
using RichCreator.Utility;
using RichCreator.Utility.Captures;
using RichCreator.Utility.CV;
using RichCreator.Utility.InputControl;
using RichCreator.Utility.Maps;
using RichCreator.Utility.Skills;
using RichCreator.Utility.Structs;
using Emgu.CV;
using Emgu.CV.Structure;
using RichCreator.Maps;
using RichCreator.Maps.Lindong;
using RichCreator.StateMachines;
using RichCreator.Utilitys;
using static RichCreator.Utilitys.AttackRectangle;
using Utils = RichCreator.Utilitys.Utils;
using System;
using System.Collections.Generic;
using System.Threading;
using ZTImage.Collections;
namespace RichCreator.Jobs.StateMachines
@@ -27,12 +24,11 @@
    public class KillMonsterStateMachine : StateMachineBase
    {
        private const Int32 NoMoveMaxMillSecond = 2000;//最大未移动容忍毫秒数
        private MapInfo map;//地图
        private HouseInfo house;//当前房间
        private ZTPoint miniMapStart;//小地图区域
        private ZTRectangle GameRect;//游戏区域
        private DnfRole role;//当前角色控制
        private Int32 preHouseIndex = 0;//上一房间编号
        private MoveState moveState;//移动状态
        private OutOfBounds outOfBounds;//禁区
        private bool isSuccess;//退出结果
@@ -43,7 +39,7 @@
        //当前状态
        private KillMonsterStates currentState = KillMonsterStates.Start;
        //是否截图屏幕
        private bool captureScreen = false;
        private bool needCaptureScreen = false;
        //怪
        private ZTPoint[] stateMonsters;
@@ -57,35 +53,31 @@
        //色彩hsv
        private Image<Hsv, byte> hsvImage = null;
        //取消令牌
        private CancellationToken cancellationToken = CancellationToken.None;
        #region Find Door Info
        //门坐标
        private ZTPoint stateDoorPosition;
        //角色位置
        private ZTPoint stateRolePosition;
        //离开的门朝向
        private Direction stateDoorLevelDirect = Direction.None;
        //定位点方框
        private MultiList<ZTRectangle, Int32> stateLocationRectangle = new MultiList<ZTRectangle, int>();
        //屏幕定位点
        private ParametersPoint stateScreenLocation = new ParametersPoint();
        
       
        #endregion
        public KillMonsterStateMachine(HouseInfo house, ZTPoint miniMapStart, ZTRectangle gameRect, Int32 preHouseIndex, Int32 runningStep, CancellationToken cancellationToken)
        public KillMonsterStateMachine(MapInfo map,HouseInfo house, DnfRole role,Int32 preHouseIndex, Int32 runningStep)
        {
            this.runningStep = runningStep;
            this.map = map;
            this.house = house;
            this.miniMapStart = miniMapStart;
            this.GameRect = gameRect;
            this.role = role;
            this.runningStep = runningStep;
            this.preHouseIndex = preHouseIndex;
            this.cancellationToken = cancellationToken;
            moveState = new MoveState(this.GameRect, this.house);
            outOfBounds = new OutOfBounds(this.GameRect, moveState);
            hsvImage = new Image<Hsv, byte>(gameRect.End.X - gameRect.Start.X + 1, gameRect.End.Y - gameRect.Start.Y + 1);
            outOfBounds = new OutOfBounds(map.GameRect, role);
            hsvImage = new Image<Hsv, byte>(map.GameRect.End.X - map.GameRect.Start.X + 1, map.GameRect.End.Y - map.GameRect.Start.Y + 1);
        }
@@ -93,7 +85,7 @@
        private void SetState(KillMonsterStates current, bool capture)
        {
            currentState = current;
            captureScreen = capture;
            needCaptureScreen = capture;
        }
        /// <summary>
@@ -111,24 +103,26 @@
                SetState(KillMonsterStates.FindMonster, true);
            }
            //定位方框列表
            MultiList<ZTRectangle, Int32> locationRectangles = new MultiList<ZTRectangle, int>();
            while (true)
            {
                if (cancellationToken.IsCancellationRequested)
                if (map.CancelToken.IsCancellationRequested)
                {
                    G.Instance.DebugWriter("取消刷图");
                    this.moveState.StopMove();
                    this.role.StopMove();
                    return ZTResult.Cancel;
                }
                if (DateTime.Now > expireTime)
                {
                    G.Instance.DebugWriter("刷图超时");
                    this.moveState.StopMove();
                    this.role.StopMove();
                    return ZTResult.Timeout;
                }
                if (captureScreen)
                if (needCaptureScreen)
                {
                    using (bitmap = ScreenCapture.Instance.CaptureScreen())
                    {
@@ -137,7 +131,7 @@
                            image.Dispose();
                        }
                        image = new Image<Rgb, byte>(bitmap);
                        image = image.GetSubRect(new System.Drawing.Rectangle(GameRect.Start.X, GameRect.Start.Y, GameRect.End.X - GameRect.Start.X + 1, GameRect.End.Y - GameRect.Start.Y + 1));
                        image = image.GetSubRect(new System.Drawing.Rectangle(map.GameRect.Start.X, map.GameRect.Start.Y, map.GameRect.End.X - map.GameRect.Start.X + 1, map.GameRect.End.Y - map.GameRect.Start.Y + 1));
                        imageIsChange = true;
                    }
                }
@@ -146,7 +140,7 @@
                {
                    case KillMonsterStates.Start:
                        //开始
                        SingleEntryHouseSkill.ReleaseSkill(this.house.Index, this.preHouseIndex, this.moveState);
                        this.map.EntryHousePrework(this.house.Index, this.preHouseIndex);
                        SetState(KillMonsterStates.IsLastHouse, true);
                        break;
                    case KillMonsterStates.IsLastHouse:
@@ -168,7 +162,7 @@
                        break;
                    case KillMonsterStates.HasRewardWindow:
                        //是否有奖励界面
                        if (DnfCVHelper.IsJiangli(image, this.GameRect))
                        if (DnfCVHelper.IsJiangli(image, map.GameRect))
                        {
                            SetState(KillMonsterStates.TurnAroundCard, false);
                        }
@@ -186,7 +180,7 @@
                        break;
                    case KillMonsterStates.IsCompletePage:
                        //是否刷完界面
                        if (DnfCVHelper.IsCompleteRoom(image, this.GameRect))
                        if (DnfCVHelper.IsCompleteRoom(image, map.GameRect))
                        {
                            this.isSuccess = true;
                            SetState(KillMonsterStates.Exit, false);
@@ -213,8 +207,9 @@
                        //主角
                        CvInvoke.CvtColor(image, hsvImage, Emgu.CV.CvEnum.ColorConversion.Rgb2Hsv);
                        //定位点
                        if (!DnfCVHelper.GetLocationPoint(out stateLocationRectangle, hsvImage, this.GameRect))
                        if (!DnfCVHelper.GetLocationPoint(out locationRectangles, hsvImage, map.GameRect))
                        {
                            //找不到定位点
                            G.Instance.InfoWriter("找不到定位点");
@@ -222,20 +217,20 @@
                            break;
                        }
                        this.stateRolePosition = DnfCVHelper.FindRole(hsvImage, this.GameRect);
                        if (this.stateRolePosition .Equals( ZTPoint.Empty))
                        this.stateScreenLocation = new ParametersPoint(locationRectangles[0].Item1.GetCenterPoint(), locationRectangles[0].Item2);
                        ZTPoint rolePosition = DnfCVHelper.FindRole(hsvImage, map.GameRect);
                        if (rolePosition .Equals( ZTPoint.Empty))
                        {
                            SetState(KillMonsterStates.FindRoleMove, false);
                        }
                        else
                        {
                            if (this.moveState.IsFindRoleMoving)
                            if (this.role.IsMoveIntent(Utility.Dnf.MoveIntent.FindRoleMove))
                            {
                                this.moveState.StopMove();
                                this.role.StopMove();
                            }
                            role.UpdatePosition(rolePosition);
                            SetState(KillMonsterStates.FindMonster, false);
                        }
                        break;
@@ -245,7 +240,7 @@
                        break;
                    case KillMonsterStates.FindMonster:
                        //找怪                        
                        this.stateMonsters = LindongCVHelper.FindMonster(hsvImage, this.GameRect);
                        this.stateMonsters = LindongCVHelper.FindMonster(hsvImage, map.GameRect);
                        
                        if (this.stateMonsters.Length > 0)
                        {
@@ -259,8 +254,13 @@
                        break;
                    case KillMonsterStates.PickupThing:
                        //拾取物品
                        SetState(KillMonsterStates.FindDoor, false);
                        SetState(KillMonsterStates.ToNextGatePoint, false);
                        //todo: PickupThing();
                        break;
                    case KillMonsterStates.ToNextGatePoint:
                        //移到进门点
                        SetState(KillMonsterStates.FindDoor, false);
                        //todo:ToNextGatePoint
                        break;
                    case KillMonsterStates.FindDoor:
                        //查找门, 是否找到门
@@ -289,7 +289,7 @@
                    case KillMonsterStates.Exit:
                        //结束
                        G.Instance.DebugWriter("退出状态");
                        this.moveState.StopMove();
                        this.role.StopMove();
                        if (this.isSuccess)
                        {
                            return ZTResult.Success;
@@ -309,22 +309,17 @@
        /// </summary>
        private void FindRoleMove()
        {
            this.moveState.FindRoleMove();
            SetState(KillMonsterStates.FindRole, true);
            //if (this.stateMonsters.Length > 0)
            //if (this.stateMonsters != null && this.stateMonsters.Length > 0)
            //{
            //    this.moveState.StopMove();
            //    this.role.StopMove();
            //    G.Instance.DebugWriter("找不到角色,Send X");
            //    G.Instance.InputControl.PressKey(1000, HIDCode.X);
            //    SetState(KillMonsterStates.FindMonster, true);
            //    SetState(KillMonsterStates.FindRole, true);
            //    return;
            //}
            //else
            //{
            //    this.moveState.FindRoleMove();
            //    SetState(KillMonsterStates.IsLastHouse, true);
            //}
            this.role.FindRoleMove();
            SetState(KillMonsterStates.FindRole, true);
        }
        /// <summary>
@@ -333,21 +328,21 @@
        private void PickupThing()
        {
            //拾取物品,获取最近一个物品位置并步行过去
            ZTPoint thingItemPosition = GetNearlyThingItem(image, stateRolePosition);
            ZTPoint thingItemPosition = GetNearlyThingItem(image, role.Position);
            if (!thingItemPosition .Equals( ZTPoint.Empty))
            {
                if (this.moveState.IsMoving && !this.moveState.IsPickupMoving)
                if (this.role.IsMoving && !this.role.IsMoveIntent(Utility.Dnf.MoveIntent.PickupMove))
                {
                    this.moveState.StopMove();
                    this.role.StopMove();
                }
                this.moveState.PickupMove(this.stateRolePosition, thingItemPosition);
                this.role.PickupMove(this.role.Position, thingItemPosition);
                //return new KillMonsterStateResult(STATE_FindMonster, true);
            }
            if (this.moveState.IsPickupMoving)
            if (this.role.IsMoveIntent(Utility.Dnf.MoveIntent.PickupMove))
            {
                this.moveState.StopMove();
                this.role.StopMove();
            }
        }
@@ -357,13 +352,13 @@
        private void FindDoor()
        {
            //查找真实的门
            this.stateDoorPosition = LindongCVHelper.FindDoor(out stateDoorLevelDirect, hsvImage, this.house.DoorDirection, this.GameRect);
            this.stateDoorPosition = LindongCVHelper.FindDoor(out stateDoorLevelDirect, hsvImage, this.house.DoorDirection, map.GameRect);
            if (!this.stateDoorPosition .Equals(ZTPoint.Empty))
            {
                //找到门,向门移动  
                if (this.moveState.IsFindDoorMoving)
                if (this.role.IsMoveIntent(Utility.Dnf.MoveIntent.FindDoorMove))
                {
                    this.moveState.StopMove();
                    this.role.StopMove();
                }
                G.Instance.InfoWriter("已找到门,位置:" + stateDoorPosition.ToString());
                SetState(KillMonsterStates.EntryDoor, false);
@@ -390,69 +385,69 @@
                case Direction.Up:
                    //门在上方
                    limitLine = stateDoorPosition.Y + YLevelOffset;
                    if (stateRolePosition.Y < limitLine)
                    if (role.Position.Y < limitLine)
                    {
                        //下移
                        this.moveState.SyncMove(new ZTPoint(0, limitLine - stateRolePosition.Y));
                        this.role.SyncMove(new ZTPoint(0, limitLine - role.Position.Y));
                    }
                    //垂直对齐
                    diff = stateDoorPosition.X - stateRolePosition.X;
                    this.moveState.SyncMove(new ZTPoint(diff, 0));
                    diff = stateDoorPosition.X - role.Position.X;
                    this.role.SyncMove(new ZTPoint(diff, 0));
                    //移动y,进入
                    this.moveState.SyncMove(new ZTPoint(0, this.GameRect.Start.Y - stateRolePosition.Y));
                    this.role.SyncMove(new ZTPoint(0, map.GameRect.Start.Y - role.Position.Y));
                    break;
                case Direction.Right:
                    //门在右侧
                    limitLine = stateDoorPosition.X - XLevelOffset;
                    if (stateRolePosition.X > limitLine)
                    if (role.Position.X > limitLine)
                    {
                        //如果角色位于门右侧,先向左移
                        this.moveState.SyncMove(new ZTPoint(limitLine - stateRolePosition.X, 0));
                        this.role.SyncMove(new ZTPoint(limitLine - role.Position.X, 0));
                    }
                    //水平对齐
                    diff = stateDoorPosition.Y - stateRolePosition.Y;
                    this.moveState.SyncMove(new ZTPoint(0, diff));
                    diff = stateDoorPosition.Y - role.Position.Y;
                    this.role.SyncMove(new ZTPoint(0, diff));
                    //移动x,进入
                    this.moveState.SyncMove(new ZTPoint(this.GameRect.End.X - stateRolePosition.X, 0));
                    this.role.SyncMove(new ZTPoint(map.GameRect.End.X - role.Position.X, 0));
                    break;
                case Direction.Bottom:
                    //门在下方
                    limitLine = stateDoorPosition.Y - YLevelOffset;
                    if (stateRolePosition.Y > limitLine)
                    if (role.Position.Y > limitLine)
                    {
                        //如果角色在门下方,先向上移
                        this.moveState.SyncMove(new ZTPoint(0, limitLine - stateRolePosition.Y));
                        this.role.SyncMove(new ZTPoint(0, limitLine - role.Position.Y));
                    }
                    //垂直对齐
                    diff = stateDoorPosition.X - stateRolePosition.X;
                    this.moveState.SyncMove(new ZTPoint(diff, 0));
                    diff = stateDoorPosition.X - role.Position.X;
                    this.role.SyncMove(new ZTPoint(diff, 0));
                    //移动y,进入
                    this.moveState.SyncMove(new ZTPoint(0, this.GameRect.End.Y - stateRolePosition.Y));
                    this.role.SyncMove(new ZTPoint(0, map.GameRect.End.Y - role.Position.Y));
                    break;
                case Direction.Left:
                    //门在左侧
                    limitLine = stateDoorPosition.X + XLevelOffset;
                    if (stateRolePosition.X < limitLine)
                    if (role.Position.X < limitLine)
                    {
                        //如果角色位于门左侧,先向右移
                        this.moveState.SyncMove(new ZTPoint(limitLine - stateRolePosition.X, 0));
                        this.role.SyncMove(new ZTPoint(limitLine - role.Position.X, 0));
                    }
                    //水平对齐
                    diff = stateDoorPosition.Y - stateRolePosition.Y;
                    this.moveState.SyncMove(new ZTPoint(0, diff));
                    diff = stateDoorPosition.Y - role.Position.Y;
                    this.role.SyncMove(new ZTPoint(0, diff));
                    //移动x,进入
                    this.moveState.SyncMove(new ZTPoint(this.GameRect.Start.X - stateRolePosition.X, 0));
                    this.role.SyncMove(new ZTPoint(map.GameRect.Start.X - role.Position.X, 0));
                    break;
            }
            SetState(KillMonsterStates.IsLastHouse, true);
@@ -465,13 +460,13 @@
        private void FindDoorMove()
        {
            Int32 areaID = 0;
            if (this.outOfBounds.InOutOfBound(this.house.Index, stateRolePosition, out areaID))
            if (this.outOfBounds.InOutOfBound(this.house.Index, role.Position, out areaID))
            {
                this.outOfBounds.MoveToCommonBound(areaID);
            }
            else
            {
                this.moveState.FindDoorMove(stateRolePosition);
                this.role.FindDoorMove(role.Position);
            }
            SetState(KillMonsterStates.IsLastHouse, true);
        }
@@ -492,7 +487,7 @@
            
            //计算攻击移动距离
            bool needMove = false;
            attackMoveDistance = AttackRectangle.GetMoveDistance(this.GameRect, stateRolePosition, stateMonsters, attackSkill, out roleDirection, out needMove);
            attackMoveDistance = AttackRectangle.GetMoveDistance(map.GameRect, role.Position, stateMonsters, attackSkill, out roleDirection, out needMove);
            if (!needMove)
            {
                G.Instance.DebugWriter(string.Format("不需移动直接发技能,距离:{0}", attackMoveDistance.ToString()));
@@ -517,7 +512,7 @@
            {
                G.Instance.InputControl.PressKey(100, roleDirection);
            }
            this.moveState.StopMove();
            this.role.StopMove();
            
@@ -547,13 +542,13 @@
        {
            SkillInfo attackSkill = this.house.Skills.SyncPeek();
            //没有移动,可能有障碍物
            if (stateRolePosition .Equals( this.roleLastPosition))
            if (role.Position .Equals( this.roleLastPosition))
            {
                if (FindRoleLastNoMoveStart && (DateTime.Now - FindRoleLastNoMoveTime).TotalMilliseconds > NoMoveMaxMillSecond)
                {
                    //开始计时 并且 超过最大未移动容忍时间
                    G.Instance.DebugWriter("find role no mvoe:" + stateRolePosition.ToString());
                    this.moveState.StopMove();
                    G.Instance.DebugWriter("find role no mvoe:" + role.Position.ToString());
                    this.role.StopMove();
                    G.Instance.InputControl.PressKey(RandomUtils.KeyPressDuration, HIDCode.X);
                    FindRoleLastNoMoveTime = DateTime.Now;
                }
@@ -567,12 +562,12 @@
            else
            {
                //移动了 取消计时
                this.roleLastPosition = stateRolePosition;
                this.roleLastPosition = role.Position;
                FindRoleLastNoMoveStart = false;
            }
            G.Instance.DebugWriter("attack move :" + attackMoveDistance.ToString() + ",role:" + stateRolePosition.ToString() + ",monster1:" + stateMonsters[0].ToString() + ",skill:" + attackSkill.Key.ToString());
            this.moveState.AttackMove(attackMoveDistance);
            G.Instance.DebugWriter("attack move :" + attackMoveDistance.ToString() + ",role:" + role.Position.ToString() + ",monster1:" + stateMonsters[0].ToString() + ",skill:" + attackSkill.Key.ToString());
            this.role.AttackMove(attackMoveDistance);
            SetState(KillMonsterStates.FindRole, true);
        }
        #endregion
@@ -584,7 +579,7 @@
        /// <returns></returns>
        public ZTPoint GetNearlyThingItem(Image<Rgb, byte> image, ZTPoint rolePosition)
        {
            List<ZTPoint> points = DnfCVHelper.GetThingItemPoints(image, this.GameRect);
            List<ZTPoint> points = DnfCVHelper.GetThingItemPoints(image, map.GameRect);
            if (points.Count <= 0)
            {
                return ZTPoint.Empty;
@@ -644,14 +639,14 @@
        {
            Thread.Sleep(2000);
            Int32 number = RandomUtils.G(1, 4);
            ZTPoint willPosition = this.GameRect.Start.Add(CardList[number - 1]);
            ZTPoint willPosition = map.GameRect.Start.Add(CardList[number - 1]);
            G.Instance.InputControl.MoveToAndClick(RandomUtils.PointRange(willPosition, 10));
            //判断黄金版是否可以翻
            if (DnfCVHelper.HasMowangqiyueCard(this.GameRect))
            if (DnfCVHelper.HasMowangqiyueCard(map.GameRect))
            {
                number = RandomUtils.G(5, 8);
                willPosition = this.GameRect.Start.Add(CardList[number - 1]);
                willPosition = map.GameRect.Start.Add(CardList[number - 1]);
                G.Instance.InputControl.MoveToAndClick(RandomUtils.PointRange(willPosition, 10));
            }
@@ -665,26 +660,13 @@
        /// <returns></returns>
        private bool HouseIsChange()
        {
            Int32 houseIndex;
            if (!LindongCVHelper.GetCurrentHouseIndex(out houseIndex, image, this.miniMapStart))
            Int32 houseIndex = 0;
            if (!map.MiniMap.GetCurrentHouseIndexWaitTimeout(out houseIndex, image, map.CancelToken, 30 * 1000))
            {
                //得不到房间
                if (!FuncUtils.TimeoutCancelableWrap(30 * 1000, cancellationToken, () =>
                {
                    using (bitmap = ScreenCapture.Instance.CaptureScreen())
                    {
                        image = new Image<Rgb, byte>(bitmap);
                        image = image.GetSubRect(new System.Drawing.Rectangle(GameRect.Start.X, GameRect.Start.Y, GameRect.End.X - GameRect.Start.X + 1, GameRect.End.Y - GameRect.Start.Y + 1));
                        return LindongCVHelper.GetCurrentHouseIndex(out houseIndex, image, this.miniMapStart);
                    }
                }, 50))
                {
                    throw new Exception("找不到默认房间");
                }
                throw new Exception("找不到默认房间");
            }
            if (houseIndex != this.house.Index)
            {
                this.moveState.StopMove();
                return true;
            }
            return false;
@@ -707,6 +689,7 @@
            FindRoleMove,//让主角移动(原:有怪攻击一下,无怪移动一下)
            FindMonster,//找怪
            PickupThing,//拾取物品
            ToNextGatePoint,//移到进门点
            FindDoor,//查找门, 是否找到门
            EntryDoor,//向门移动, 进门
            FindDoorMove,//找门移动
src/RichCreator/StateMachines/MoveState.cs
File was deleted
src/RichCreator/StateMachines/SkillInfo.cs
File was deleted
src/RichCreator/StateMachines/SkillQueue.cs
File was deleted
src/RichCreator/Utilitys/AttackRectangle.cs
@@ -6,6 +6,8 @@
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using RichCreator.Utility.Skills;
using RichCreator.Utility.Maps;
namespace RichCreator.Utilitys
{
@@ -340,15 +342,6 @@
            }
        }
        /// <summary>
        /// 移动优化级
        /// </summary>
        public enum MovePriority
        {
            Quantity,//数量集中为高优先级
            Nearly//近为高优先级
        }
        
src/RichCreator/ZTResult.cs
File was deleted
src/test/Program.cs
@@ -7,6 +7,9 @@
using System.Drawing;
using System.Reflection.Emit;
using System.Reflection;
using Tesseract;
using Emgu.CV;
using Emgu.CV.Structure;
namespace test
{
@@ -177,34 +180,56 @@
    }
    class Program
    {
       
        static void Main(string[] args)
        {
            person a = new person(235, "a0");
            person b = new person(12, "b1");
            person c = new person(34, "c2");
            person d = new person(45, "d3");
            person e = new person(56, "e4");
            Dijkstra<person> dij = new Dijkstra<person>();
            dij.AddVertex(a, new Dictionary<person, int>() { { b, 7 }, { d, 8 } });
            dij.AddVertex(b, new Dictionary<person, int>() { { a, 7 }, { c, 2 },{ d,2} ,{ e,3} });
            dij.AddVertex(c, new Dictionary<person, int>() { { b, 8 }, { e, 6 } });
            dij.AddVertex(d, new Dictionary<person, int>() { { a, 8 },{ b,2} });
            dij.AddVertex(e, new Dictionary<person, int>() { { b, 1 },{ c,2} });
            dij.ShortestPath(d, e).ForEach(x => Console.WriteLine(x));
            ZTImage.Diagnostics.CodeTimer.Timer("dij", 10000, () =>
            {
                //g.ShortestPath('A', 'H').ForEach(x => Console.WriteLine(x));
                dij.ShortestPath(a, b);
            Image<Rgb, byte> image = RichCreator.Utility.Captures.ScreenCapture.Instance.CaptureScreenReturnImage();
            int i = 0;
            ZTImage.Diagnostics.CodeTimer.Timer("test", 100000, () => {
                byte b1 = image.Data[i % 53, i % 37,0];
                byte b2 = image.Data[i % 53, i % 37, 1];
                Int32 total = b1 + b2;
                if (total > 300000)
                {
                    Console.WriteLine("oik");
                }
            });
            //person a = new person(235, "a0");
            //person b = new person(12, "b1");
            //person c = new person(34, "c2");
            //person d = new person(45, "d3");
            //person e = new person(56, "e4");
            //Dijkstra<person> dij = new Dijkstra<person>();
            //dij.AddVertex(a, new Dictionary<person, int>() { { b, 7 }, { d, 8 } });
            //dij.AddVertex(b, new Dictionary<person, int>() { { a, 7 }, { c, 2 },{ d,2} ,{ e,3} });
            //dij.AddVertex(c, new Dictionary<person, int>() { { b, 8 }, { e, 6 } });
            //dij.AddVertex(d, new Dictionary<person, int>() { { a, 8 },{ b,2} });
            //dij.AddVertex(e, new Dictionary<person, int>() { { b, 1 },{ c,2} });
            //dij.ShortestPath(d, e).ForEach(x => Console.WriteLine(x));
            //ZTImage.Diagnostics.CodeTimer.Timer("dij", 10000, () =>
            //{
            //    //g.ShortestPath('A', 'H').ForEach(x => Console.WriteLine(x));
            //    dij.ShortestPath(a, b);
            //});
            //Bitmap bm = new Bitmap("d:\\t2.png");
            //var ocr = new TesseractEngine("./tessdata", "eng", EngineMode.TesseractAndCube);
            //Page page=ocr.Process(bm);
            //string text=page.GetText();
            //Console.WriteLine("识别出文字:" + text);
            Console.ReadKey();
src/test/packages.config
@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="EMGU.CV" version="4.1.0.3420" targetFramework="net45" />
  <package id="Tesseract" version="3.3.0" targetFramework="net45" />
  <package id="ZedGraph" version="5.1.7" targetFramework="net45" />
  <package id="ZTImage" version="2.1.16" targetFramework="net45" />
</packages>
src/test/test.csproj
@@ -51,6 +51,9 @@
    <Reference Include="System.Data" />
    <Reference Include="System.Net.Http" />
    <Reference Include="System.Xml" />
    <Reference Include="Tesseract, Version=3.3.0.0, Culture=neutral, processorArchitecture=MSIL">
      <HintPath>..\packages\Tesseract.3.3.0\lib\net45\Tesseract.dll</HintPath>
    </Reference>
    <Reference Include="ZedGraph, Version=5.1.7.430, Culture=neutral, PublicKeyToken=02a83cbd123fcd60, processorArchitecture=MSIL">
      <HintPath>..\packages\ZedGraph.5.1.7\lib\net35-Client\ZedGraph.dll</HintPath>
    </Reference>
@@ -66,6 +69,12 @@
    <None Include="App.config" />
    <None Include="packages.config" />
  </ItemGroup>
  <ItemGroup>
    <ProjectReference Include="..\RichCreator.Utility\RichCreator.Utility.csproj">
      <Project>{ceeff4d3-cc6f-4afe-85fe-e590c87a9972}</Project>
      <Name>RichCreator.Utility</Name>
    </ProjectReference>
  </ItemGroup>
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
  <Import Project="..\packages\EMGU.CV.4.1.0.3420\build\EMGU.CV.targets" Condition="Exists('..\packages\EMGU.CV.4.1.0.3420\build\EMGU.CV.targets')" />
  <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
@@ -73,5 +82,7 @@
      <ErrorText>这台计算机上缺少此项目引用的 NuGet 程序包。使用“NuGet 程序包还原”可下载这些程序包。有关更多信息,请参见 http://go.microsoft.com/fwlink/?LinkID=322105。缺少的文件是 {0}。</ErrorText>
    </PropertyGroup>
    <Error Condition="!Exists('..\packages\EMGU.CV.4.1.0.3420\build\EMGU.CV.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\EMGU.CV.4.1.0.3420\build\EMGU.CV.targets'))" />
    <Error Condition="!Exists('..\packages\Tesseract.3.3.0\build\Tesseract.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Tesseract.3.3.0\build\Tesseract.targets'))" />
  </Target>
  <Import Project="..\packages\Tesseract.3.3.0\build\Tesseract.targets" Condition="Exists('..\packages\Tesseract.3.3.0\build\Tesseract.targets')" />
</Project>