From 594820d393e0eec518c0eacc80bc3c2090f901d5 Mon Sep 17 00:00:00 2001 From: Joywayer Date: Wed, 1 Jul 2026 18:13:26 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E4=BB=93=E5=BA=93?= =?UTF-8?q?=EF=BC=9A=E5=8F=8B=E4=B9=90/gameabc=20=E6=88=BF=E5=8D=A1?= =?UTF-8?q?=E6=B8=B8=E6=88=8F=E5=B9=B3=E5=8F=B0=E8=84=9A=E6=89=8B=E6=9E=B6?= =?UTF-8?q?=EF=BC=88client=20+=20server=20+=20docs=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5 --- .gitignore | 24 + CLAUDE.md | 96 + client/FilesOrd.txt | 23 + client/Project.txt | 6 + client/app_battery.js | 1 + client/app_data.js | 1 + client/app_gamesname.js | 1 + client/app_network.js | 1 + client/assets/bmp/00001.png | Bin 0 -> 228457 bytes client/assets/bmp/00002.png | Bin 0 -> 3978 bytes client/assets/bmp/00003.png | Bin 0 -> 809 bytes client/assets/bmp/00004.png | Bin 0 -> 1699 bytes client/assets/bmp/00005.png | Bin 0 -> 104 bytes client/assets/bmp/00006.png | Bin 0 -> 15890 bytes client/assets/bmp/00007.png | Bin 0 -> 11621 bytes client/assets/bmp/00008.png | Bin 0 -> 3304 bytes client/assets/bmp/00009.png | Bin 0 -> 17092 bytes client/assets/bmp/00010.png | Bin 0 -> 104 bytes client/assets/bmp/00011.png | Bin 0 -> 1025 bytes client/assets/bmp/00012.png | Bin 0 -> 26126 bytes client/assets/bmp/00013.png | Bin 0 -> 184201 bytes client/assets/bmp/00014.png | Bin 0 -> 31361 bytes client/assets/bmp/00015.png | Bin 0 -> 4198 bytes client/assets/bmp/00016.png | Bin 0 -> 3849 bytes client/assets/bmp/00017.png | Bin 0 -> 358 bytes client/assets/bmp/00018.png | Bin 0 -> 598 bytes client/assets/bmp/00019.png | Bin 0 -> 1752 bytes client/assets/bmp/00020.png | Bin 0 -> 175767 bytes client/assets/bmp/00021.png | Bin 0 -> 266873 bytes client/assets/bmp/00022.png | Bin 0 -> 8406 bytes client/assets/bmp/00023.png | Bin 0 -> 14099 bytes client/assets/bmp/00024.png | Bin 0 -> 160 bytes client/assets/bmp/00025.png | Bin 0 -> 18963 bytes client/assets/bmp/00026.png | Bin 0 -> 5369 bytes client/assets/bmp/00027.png | Bin 0 -> 2786 bytes client/assets/bmp/00028.png | Bin 0 -> 10499 bytes client/assets/bmp/00029.png | Bin 0 -> 3621 bytes client/assets/bmp/00030.png | Bin 0 -> 5921 bytes client/assets/bmp/00031.png | Bin 0 -> 1132 bytes client/assets/bmp/00032.png | Bin 0 -> 2023 bytes client/assets/bmp/00033.png | Bin 0 -> 4490 bytes client/assets/bmp/00034.png | Bin 0 -> 22036 bytes client/assets/bmp/00035.png | Bin 0 -> 3831 bytes client/assets/bmp/00036.png | Bin 0 -> 11462 bytes client/assets/bmp/00037.png | Bin 0 -> 689 bytes client/assets/bmp/00038.png | Bin 0 -> 5238 bytes client/assets/bmp/00039.png | Bin 0 -> 6831 bytes client/assets/bmp/00040.png | Bin 0 -> 116 bytes client/assets/bmp/00041.png | Bin 0 -> 4022 bytes client/assets/bmp/00042.png | Bin 0 -> 413 bytes client/assets/bmp/00043.png | Bin 0 -> 92803 bytes client/assets/bmp/00044.png | Bin 0 -> 3257 bytes client/assets/bmp/00045.png | Bin 0 -> 8532 bytes client/assets/bmp/00046.png | Bin 0 -> 1474 bytes client/assets/bmp/00047.png | Bin 0 -> 2818 bytes client/assets/bmp/00048.png | Bin 0 -> 3094 bytes client/assets/bmp/00049.png | Bin 0 -> 921 bytes client/assets/bmp/00050.png | Bin 0 -> 1542 bytes client/assets/bmp/00051.png | Bin 0 -> 10176 bytes client/assets/bmp/00052.png | Bin 0 -> 8285 bytes client/assets/bmp/00053.png | Bin 0 -> 309423 bytes client/assets/bmp/00054.png | Bin 0 -> 2492 bytes client/assets/bmp/00055.png | Bin 0 -> 5395 bytes client/assets/bmp/00056.png | Bin 0 -> 317 bytes client/assets/bmp/00057.png | Bin 0 -> 717 bytes client/assets/bmp/00058.png | Bin 0 -> 1055 bytes client/assets/bmp/00059.png | Bin 0 -> 45883 bytes client/assets/bmp/00060.png | Bin 0 -> 18963 bytes client/assets/bmp/00061.png | Bin 0 -> 18963 bytes client/assets/bmp/00062.png | Bin 0 -> 18963 bytes client/assets/bmp/00063.png | Bin 0 -> 18963 bytes client/assets/bmp/00064.png | Bin 0 -> 18963 bytes client/assets/bmp/00065.png | Bin 0 -> 1633 bytes client/assets/bmp/00066.png | Bin 0 -> 150390 bytes client/assets/bmp/00067.png | Bin 0 -> 10061 bytes client/assets/bmp/00068.png | Bin 0 -> 5474 bytes client/assets/bmp/00069.png | Bin 0 -> 2300 bytes client/assets/bmp/00070.png | Bin 0 -> 1009 bytes client/assets/bmp/00071.png | Bin 0 -> 18963 bytes client/assets/bmp/00072.png | Bin 0 -> 18963 bytes client/assets/bmp/00073.png | Bin 0 -> 18963 bytes client/assets/bmp/00074.png | Bin 0 -> 18963 bytes client/assets/bmp/00075.png | Bin 0 -> 18963 bytes client/assets/bmp/00076.png | Bin 0 -> 420 bytes client/assets/bmp/00077.png | Bin 0 -> 12989 bytes client/assets/bmp/00078.png | Bin 0 -> 929 bytes client/assets/bmp/00079.png | Bin 0 -> 85933 bytes client/assets/bmp/00080.png | Bin 0 -> 3750 bytes client/assets/bmp/00081.png | Bin 0 -> 21049 bytes client/assets/bmp/00082.png | Bin 0 -> 9472 bytes client/assets/bmp/00083.png | Bin 0 -> 342 bytes client/assets/bmp/00084.png | Bin 0 -> 384 bytes client/assets/bmp/00085.png | Bin 0 -> 2277 bytes client/assets/bmp/00086.png | Bin 0 -> 348 bytes client/assets/bmp/00087.png | Bin 0 -> 1496 bytes client/assets/bmp/00088.png | Bin 0 -> 2946 bytes client/assets/bmp/00089.png | Bin 0 -> 1482 bytes client/assets/bmp/00090.png | Bin 0 -> 2556 bytes client/assets/bmp/00091.png | Bin 0 -> 2760 bytes client/assets/bmp/00092.png | Bin 0 -> 5077 bytes client/assets/bmp/00093.png | Bin 0 -> 410 bytes client/assets/bmp/00094.png | Bin 0 -> 1284 bytes client/assets/bmp/00095.png | Bin 0 -> 81206 bytes client/assets/bmp/00096.png | Bin 0 -> 2007 bytes client/assets/bmp/00097.png | Bin 0 -> 1939 bytes client/assets/bmp/00098.png | Bin 0 -> 1082 bytes client/assets/bmp/00099.png | Bin 0 -> 29202 bytes client/assets/bmp/00100.png | Bin 0 -> 403 bytes client/assets/bmp/00101.png | Bin 0 -> 95733 bytes client/assets/bmp/00102.png | Bin 0 -> 203974 bytes client/assets/bmp/00103.png | Bin 0 -> 314358 bytes client/assets/bmp/00104.png | Bin 0 -> 112548 bytes client/assets/bmp/00105.png | Bin 0 -> 310 bytes client/assets/bmp/00106.png | Bin 0 -> 3300 bytes client/assets/bmp/00107.png | Bin 0 -> 1129 bytes client/assets/bmp/00108.png | Bin 0 -> 10377 bytes client/assets/bmp/00109.png | Bin 0 -> 102 bytes client/assets/bmp/00110.png | Bin 0 -> 595 bytes client/assets/bmp/00111.png | Bin 0 -> 684 bytes client/assets/bmp/00112.png | Bin 0 -> 254 bytes client/assets/bmp/00113.png | Bin 0 -> 854 bytes client/assets/bmp/00114.png | Bin 0 -> 3669 bytes client/assets/bmp/00115.png | Bin 0 -> 11165 bytes client/assets/bmp/00116.png | Bin 0 -> 18963 bytes client/assets/bmp/00117.png | Bin 0 -> 18963 bytes client/assets/bmp/00118.png | Bin 0 -> 18963 bytes client/assets/bmp/00119.png | Bin 0 -> 18963 bytes client/assets/bmp/00120.png | Bin 0 -> 18963 bytes client/assets/bmp/00121.png | Bin 0 -> 18963 bytes client/assets/bmp/00122.png | Bin 0 -> 18963 bytes client/assets/bmp/00123.png | Bin 0 -> 18963 bytes client/assets/bmp/00124.png | Bin 0 -> 18963 bytes client/assets/bmp/00125.png | Bin 0 -> 18963 bytes client/assets/bmp/00126.png | Bin 0 -> 18963 bytes client/assets/bmp/00127.png | Bin 0 -> 18963 bytes client/assets/bmp/00128.png | Bin 0 -> 18963 bytes client/assets/bmp/00129.png | Bin 0 -> 18963 bytes client/assets/bmp/00130.png | Bin 0 -> 18963 bytes client/assets/bmp/00131.png | Bin 0 -> 18963 bytes client/assets/bmp/00132.png | Bin 0 -> 18963 bytes client/assets/bmp/00133.png | Bin 0 -> 18963 bytes client/assets/bmp/00134.png | Bin 0 -> 18963 bytes client/assets/bmp/00135.png | Bin 0 -> 18963 bytes client/assets/bmp/00136.png | Bin 0 -> 18963 bytes client/assets/bmp/00137.png | Bin 0 -> 18963 bytes client/assets/bmp/00138.png | Bin 0 -> 18963 bytes client/assets/bmp/00139.png | Bin 0 -> 18963 bytes client/assets/bmp/00140.png | Bin 0 -> 18963 bytes client/assets/bmp/00141.png | Bin 0 -> 18963 bytes client/assets/bmp/00142.png | Bin 0 -> 18963 bytes client/assets/bmp/00143.png | Bin 0 -> 18963 bytes client/assets/bmp/00144.png | Bin 0 -> 18963 bytes client/assets/bmp/00145.png | Bin 0 -> 18963 bytes client/assets/bmp/00146.png | Bin 0 -> 17375 bytes client/assets/bmp/00147.png | Bin 0 -> 14113 bytes client/assets/bmp/00148.png | Bin 0 -> 28590 bytes client/assets/bmp/00149.png | Bin 0 -> 31648 bytes client/assets/bmp/00150.png | Bin 0 -> 30597 bytes client/assets/bmp/00151.png | Bin 0 -> 24154 bytes client/assets/bmp/00152.png | Bin 0 -> 17513 bytes client/assets/bmp/00153.png | Bin 0 -> 16986 bytes client/assets/bmp/00154.png | Bin 0 -> 32192 bytes client/assets/bmp/00155.png | Bin 0 -> 7613 bytes client/assets/bmp/00156.png | Bin 0 -> 22672 bytes client/assets/bmp/00157.png | Bin 0 -> 30314 bytes client/assets/bmp/00158.png | Bin 0 -> 21355 bytes client/assets/bmp/00159.png | Bin 0 -> 39690 bytes client/assets/bmp/00160.png | Bin 0 -> 50328 bytes client/assets/bmp/00161.png | Bin 0 -> 40715 bytes client/assets/bmp/00162.png | Bin 0 -> 26177 bytes client/assets/bmp/00163.png | Bin 0 -> 14787 bytes client/assets/bmp/00164.png | Bin 0 -> 19612 bytes client/assets/bmp/00165.png | Bin 0 -> 23460 bytes client/assets/bmp/00166.png | Bin 0 -> 9576 bytes client/assets/bmp/00167.png | Bin 0 -> 9756 bytes client/assets/bmp/00168.png | Bin 0 -> 8580 bytes client/assets/bmp/00169.png | Bin 0 -> 4032 bytes client/assets/bmp/00170.png | Bin 0 -> 18963 bytes client/assets/bmp/00171.png | Bin 0 -> 2953 bytes client/assets/bmp/00172.png | Bin 0 -> 3160 bytes client/assets/bmp/00173.png | Bin 0 -> 1009 bytes client/assets/bmp/00174.png | Bin 0 -> 2300 bytes client/assets/bmp/00175.png | Bin 0 -> 18963 bytes client/assets/bmp/00176.png | Bin 0 -> 10871 bytes client/assets/bmp/00177.png | Bin 0 -> 7774 bytes client/assets/bmp/00178.png | Bin 0 -> 62647 bytes client/assets/bmp/00179.png | Bin 0 -> 16454 bytes client/assets/bmp/00180.png | Bin 0 -> 15757 bytes client/assets/bmp/00181.png | Bin 0 -> 9565 bytes client/assets/bmp/00182.png | Bin 0 -> 13028 bytes client/assets/bmp/00183.png | Bin 0 -> 8589 bytes client/assets/bmp/00184.png | Bin 0 -> 1661 bytes client/assets/bmp/00185.png | Bin 0 -> 6052 bytes client/assets/bmp/00186.png | Bin 0 -> 8338 bytes client/assets/bmp/00187.png | Bin 0 -> 8639 bytes client/assets/bmp/00188.png | Bin 0 -> 15514 bytes client/assets/bmp/00189.png | Bin 0 -> 29429 bytes client/assets/bmp/00190.png | Bin 0 -> 13821 bytes client/assets/bmp/00191.png | Bin 0 -> 3852 bytes client/assets/bmp/00192.png | Bin 0 -> 3256 bytes client/assets/bmp/00193.png | Bin 0 -> 29680 bytes client/assets/bmp/00194.png | Bin 0 -> 1173 bytes client/assets/bmp/00195.png | Bin 0 -> 767 bytes client/assets/bmp/00196.png | Bin 0 -> 1961 bytes client/assets/bmp/00197.png | Bin 0 -> 21182 bytes client/assets/bmp/00198.png | Bin 0 -> 2481 bytes client/assets/bmp/00199.png | Bin 0 -> 20727 bytes client/assets/bmp/00200.png | Bin 0 -> 11106 bytes client/assets/bmp/00201.png | Bin 0 -> 1351 bytes client/assets/bmp/00202.png | Bin 0 -> 11689 bytes client/assets/bmp/00203.png | Bin 0 -> 2316 bytes client/assets/bmp/00204.png | Bin 0 -> 8631 bytes client/assets/bmp/00205.png | Bin 0 -> 2913 bytes client/assets/bmp/00206.png | Bin 0 -> 6071 bytes client/assets/bmp/00207.png | Bin 0 -> 37217 bytes client/assets/bmp/00208.png | Bin 0 -> 20368 bytes client/assets/bmp/00209.png | Bin 0 -> 2328 bytes client/assets/bmp/00210.png | Bin 0 -> 336 bytes client/assets/bmp/00211.png | Bin 0 -> 4796 bytes client/assets/bmp/00212.png | Bin 0 -> 68047 bytes client/assets/bmp/00213.png | Bin 0 -> 2590 bytes client/assets/bmp/00214.png | Bin 0 -> 19411 bytes client/assets/bmp/00215.png | Bin 0 -> 7291 bytes client/assets/bmp/00216.png | Bin 0 -> 2375 bytes client/assets/bmp/00217.png | Bin 0 -> 7506 bytes client/assets/bmp/00218.png | Bin 0 -> 1369 bytes client/assets/bmp/00219.png | Bin 0 -> 5358 bytes client/assets/bmp/00220.png | Bin 0 -> 663 bytes client/assets/bmp/00221.png | Bin 0 -> 2380 bytes client/assets/bmp/00222.png | Bin 0 -> 9771 bytes client/assets/bmp/00223.png | Bin 0 -> 2980 bytes client/assets/bmp/00224.png | Bin 0 -> 11030 bytes client/assets/bmp/00225.png | Bin 0 -> 7653 bytes client/assets/bmp/00226.png | Bin 0 -> 322 bytes client/assets/bmp/00227.png | Bin 0 -> 1018 bytes client/assets/bmp/00228.png | Bin 0 -> 3534 bytes client/assets/bmp/00229.png | Bin 0 -> 9577 bytes client/assets/bmp/00230.png | Bin 0 -> 14647 bytes client/assets/bmp/00231.png | Bin 0 -> 15049 bytes client/assets/bmp/00232.png | Bin 0 -> 4155 bytes client/assets/bmp/00233.png | Bin 0 -> 13297 bytes client/assets/bmp/00234.png | Bin 0 -> 1066 bytes client/assets/bmp/00235.png | Bin 0 -> 649 bytes client/assets/bmp/00236.png | Bin 0 -> 11692 bytes client/assets/bmp/00237.png | Bin 0 -> 22249 bytes client/assets/bmp/00238.png | Bin 0 -> 86974 bytes client/assets/bmp/00239.png | Bin 0 -> 340 bytes client/assets/bmp/00240.png | Bin 0 -> 93 bytes client/assets/bmp/00241.png | Bin 0 -> 28491 bytes client/assets/bmp/00242.png | Bin 0 -> 7475 bytes client/assets/bmp/00243.png | Bin 0 -> 67702 bytes client/assets/bmp/00244.png | Bin 0 -> 12517 bytes client/assets/bmp/00245.png | Bin 0 -> 4636 bytes client/assets/bmp/00246.png | Bin 0 -> 3028 bytes client/assets/bmp/00247.png | Bin 0 -> 282 bytes client/assets/bmp/00248.png | Bin 0 -> 3587 bytes client/assets/bmp/00249.png | Bin 0 -> 313 bytes client/assets/bmp/00250.png | Bin 0 -> 4183 bytes client/assets/bmp/00251.png | Bin 0 -> 19411 bytes client/assets/bmp/00252.png | Bin 0 -> 5641 bytes client/assets/bmp/00253.png | Bin 0 -> 5527 bytes client/assets/bmp/00254.png | Bin 0 -> 196823 bytes client/assets/bmp/00255.png | Bin 0 -> 13490 bytes client/assets/bmp/00256.png | Bin 0 -> 5343 bytes client/assets/bmp/00257.png | Bin 0 -> 21162 bytes client/assets/bmp/00258.png | Bin 0 -> 916 bytes client/assets/bmp/00259.png | Bin 0 -> 3953 bytes client/assets/bmp/00260.png | Bin 0 -> 450 bytes client/assets/bmp/00261.png | Bin 0 -> 644 bytes client/assets/bmp/00262.png | Bin 0 -> 18963 bytes client/assets/bmp/00263.png | Bin 0 -> 18963 bytes client/assets/bmp/00264.png | Bin 0 -> 18963 bytes client/assets/bmp/00265.png | Bin 0 -> 18963 bytes client/assets/bmp/00266.png | Bin 0 -> 18963 bytes client/assets/bmp/00267.png | Bin 0 -> 18963 bytes client/assets/bmp/00268.png | Bin 0 -> 18963 bytes client/assets/bmp/00269.png | Bin 0 -> 18963 bytes client/assets/bmp/00270.png | Bin 0 -> 18963 bytes client/assets/bmp/00271.png | Bin 0 -> 18963 bytes client/assets/bmp/00272.png | Bin 0 -> 18963 bytes client/assets/bmp/00273.png | Bin 0 -> 18963 bytes client/assets/bmp/00274.png | Bin 0 -> 18963 bytes client/assets/bmp/00275.png | Bin 0 -> 18963 bytes client/assets/bmp/00276.png | Bin 0 -> 18963 bytes client/assets/bmp/00277.png | Bin 0 -> 18963 bytes client/assets/bmp/00278.png | Bin 0 -> 18963 bytes client/assets/bmp/00279.png | Bin 0 -> 18963 bytes client/assets/bmp/00280.png | Bin 0 -> 18963 bytes client/assets/bmp/00281.png | Bin 0 -> 18963 bytes client/assets/bmp/00282.png | Bin 0 -> 18963 bytes client/assets/bmp/00283.png | Bin 0 -> 18963 bytes client/assets/bmp/00284.png | Bin 0 -> 18963 bytes client/assets/bmp/00285.png | Bin 0 -> 18963 bytes client/assets/bmp/00286.png | Bin 0 -> 18963 bytes client/assets/bmp/00287.png | Bin 0 -> 18963 bytes client/assets/bmp/00288.png | Bin 0 -> 18963 bytes client/assets/bmp/00289.png | Bin 0 -> 18963 bytes client/assets/bmp/00290.png | Bin 0 -> 18963 bytes client/assets/bmp/00291.png | Bin 0 -> 18963 bytes client/assets/bmp/00292.png | Bin 0 -> 18963 bytes client/assets/bmp/00293.png | Bin 0 -> 18963 bytes client/assets/bmp/00294.png | Bin 0 -> 18963 bytes client/assets/bmp/00295.png | Bin 0 -> 18963 bytes client/assets/bmp/00296.png | Bin 0 -> 18963 bytes client/assets/bmp/00297.png | Bin 0 -> 18963 bytes client/assets/bmp/00298.png | Bin 0 -> 18963 bytes client/assets/bmp/00299.png | Bin 0 -> 18963 bytes client/assets/bmp/00300.png | Bin 0 -> 18963 bytes client/assets/bmp/00301.png | Bin 0 -> 18963 bytes client/assets/bmp/00302.png | Bin 0 -> 18963 bytes client/assets/bmp/00303.png | Bin 0 -> 18963 bytes client/assets/bmp/00304.png | Bin 0 -> 18963 bytes client/assets/bmp/00305.png | Bin 0 -> 18963 bytes client/assets/bmp/00306.png | Bin 0 -> 18963 bytes client/assets/bmp/00307.png | Bin 0 -> 18963 bytes client/assets/bmp/00308.png | Bin 0 -> 18963 bytes client/assets/bmp/00309.png | Bin 0 -> 18963 bytes client/assets/bmp/00310.png | Bin 0 -> 18963 bytes client/assets/bmp/00311.png | Bin 0 -> 18963 bytes client/assets/bmp/00312.png | Bin 0 -> 18963 bytes client/assets/bmp/00313.png | Bin 0 -> 18963 bytes client/assets/bmp/00314.png | Bin 0 -> 18963 bytes client/assets/bmp/00315.png | Bin 0 -> 18963 bytes client/assets/bmp/00316.png | Bin 0 -> 18963 bytes client/assets/bmp/00317.png | Bin 0 -> 18963 bytes client/assets/bmp/00318.png | Bin 0 -> 18963 bytes client/assets/bmp/00319.png | Bin 0 -> 18963 bytes client/assets/bmp/00320.png | Bin 0 -> 18963 bytes client/assets/bmp/00321.png | Bin 0 -> 18963 bytes client/assets/bmp/00322.png | Bin 0 -> 967 bytes client/assets/bmp/00323.png | Bin 0 -> 1918 bytes client/assets/bmp/00324.png | Bin 0 -> 7382 bytes client/assets/bmp/00325.png | Bin 0 -> 7102 bytes client/assets/bmp/00326.png | Bin 0 -> 903 bytes client/assets/bmp/00327.png | Bin 0 -> 8720 bytes client/assets/bmp/00328.png | Bin 0 -> 9751 bytes client/assets/bmp/00329.png | Bin 0 -> 1577 bytes client/assets/bmp/00330.png | Bin 0 -> 6721 bytes client/assets/bmp/00331.png | Bin 0 -> 1596 bytes client/assets/bmp/00332.png | Bin 0 -> 2375 bytes client/assets/bmp/00333.png | Bin 0 -> 6136 bytes client/assets/bmp/00334.png | Bin 0 -> 4339 bytes client/assets/bmp/00335.png | Bin 0 -> 3244 bytes client/assets/bmp/00336.png | Bin 0 -> 18963 bytes client/assets/bmp/00337.png | Bin 0 -> 1790 bytes client/assets/bmp/00338.png | Bin 0 -> 2698 bytes client/assets/bmp/00339.png | Bin 0 -> 2698 bytes client/assets/bmp/00340.png | Bin 0 -> 2698 bytes client/assets/bmp/00341.png | Bin 0 -> 2934 bytes client/assets/bmp/00342.png | Bin 0 -> 272 bytes client/assets/bmp/00343.png | Bin 0 -> 454 bytes client/assets/bmp/00344.png | Bin 0 -> 475 bytes client/assets/bmp/00345.png | Bin 0 -> 79369 bytes client/assets/bmp/00346.png | Bin 0 -> 11092 bytes client/assets/bmp/00347.png | Bin 0 -> 1810 bytes client/assets/bmp/00348.png | Bin 0 -> 2191 bytes client/assets/bmp/00349.png | Bin 0 -> 2594 bytes client/assets/bmp/00350.png | Bin 0 -> 1900 bytes client/assets/bmp/00351.png | Bin 0 -> 8795 bytes client/assets/bmp/00352.png | Bin 0 -> 9175 bytes client/assets/bmp/00353.png | Bin 0 -> 22582 bytes client/assets/bmp/00354.png | Bin 0 -> 2913 bytes client/assets/bmp/00355.png | Bin 0 -> 9652 bytes client/assets/bmp/00356.png | Bin 0 -> 1141 bytes client/assets/bmp/00357.png | Bin 0 -> 21199 bytes client/assets/bmp/00358.png | Bin 0 -> 7027 bytes client/assets/bmp/00359.png | Bin 0 -> 2129 bytes client/assets/bmp/00360.png | Bin 0 -> 6149 bytes client/assets/bmp/00361.png | Bin 0 -> 6708 bytes client/assets/bmp/00362.png | Bin 0 -> 7496 bytes client/assets/bmp/00363.png | Bin 0 -> 6529 bytes client/assets/bmp/00364.png | Bin 0 -> 6319 bytes client/assets/bmp/00365.png | Bin 0 -> 6725 bytes client/assets/bmp/00366.png | Bin 0 -> 7496 bytes client/assets/bmp/00367.png | Bin 0 -> 6529 bytes client/assets/bmp/00368.png | Bin 0 -> 6319 bytes client/assets/bmp/00369.png | Bin 0 -> 6725 bytes client/assets/bmp/00370.png | Bin 0 -> 7496 bytes client/assets/bmp/00371.png | Bin 0 -> 6529 bytes client/assets/bmp/00372.png | Bin 0 -> 6319 bytes client/assets/bmp/00373.png | Bin 0 -> 11328 bytes client/assets/bmp/00374.png | Bin 0 -> 11092 bytes client/assets/bmp/00375.png | Bin 0 -> 2375 bytes client/assets/bmp/00376.png | Bin 0 -> 5351 bytes client/assets/bmp/00377.png | Bin 0 -> 1879 bytes client/assets/bmp/00378.png | Bin 0 -> 1917 bytes client/assets/bmp/00379.png | Bin 0 -> 3098 bytes client/assets/bmp/00380.png | Bin 0 -> 2277 bytes client/assets/bmp/00381.png | Bin 0 -> 8319 bytes client/assets/bmp/00382.png | Bin 0 -> 226885 bytes client/assets/bmp/00383.png | Bin 0 -> 2724 bytes client/assets/bmp/00384.png | Bin 0 -> 1899 bytes client/assets/bmp/00385.png | Bin 0 -> 5429 bytes client/assets/bmp/00386.png | Bin 0 -> 866 bytes client/assets/bmp/00387.png | Bin 0 -> 205 bytes client/assets/bmp/00388.png | Bin 0 -> 2314 bytes client/assets/bmp/00389.png | Bin 0 -> 1489 bytes client/assets/bmp/00390.png | Bin 0 -> 1782 bytes client/assets/bmp/00391.png | Bin 0 -> 1523 bytes client/assets/bmp/00392.png | Bin 0 -> 15910 bytes client/assets/bmp/00393.png | Bin 0 -> 3616 bytes client/assets/bmp/00394.png | Bin 0 -> 1018 bytes client/assets/bmp/00395.png | Bin 0 -> 426 bytes client/assets/bmp/00396.png | Bin 0 -> 7540 bytes client/assets/bmp/00397.png | Bin 0 -> 4033 bytes client/assets/bmp/00398.png | Bin 0 -> 2890 bytes client/assets/bmp/00399.png | Bin 0 -> 1532 bytes client/assets/bmp/00400.png | Bin 0 -> 3972 bytes client/assets/bmp/00401.png | Bin 0 -> 5281 bytes client/assets/bmp/00402.png | Bin 0 -> 2247 bytes client/assets/bmp/00403.png | Bin 0 -> 2043 bytes client/assets/bmp/00404.png | Bin 0 -> 12351 bytes client/assets/bmp/00405.png | Bin 0 -> 91 bytes client/assets/bmp/00406.png | Bin 0 -> 6403 bytes client/assets/bmp/00407.png | Bin 0 -> 1242 bytes client/assets/bmp/00408.png | Bin 0 -> 4768 bytes client/assets/bmp/00409.png | Bin 0 -> 6206 bytes client/assets/bmp/00410.png | Bin 0 -> 1977 bytes client/assets/bmp/00411.png | Bin 0 -> 544 bytes client/assets/bmp/00412.png | Bin 0 -> 253 bytes client/assets/bmp/00413.png | Bin 0 -> 897 bytes client/assets/bmp/00414.png | Bin 0 -> 1077 bytes client/assets/bmp/00415.png | Bin 0 -> 556 bytes client/assets/bmp/00416.png | Bin 0 -> 1971 bytes client/assets/bmp/00417.png | Bin 0 -> 6762 bytes client/assets/bmp/00418.png | Bin 0 -> 6122 bytes client/assets/bmp/00419.png | Bin 0 -> 269 bytes client/assets/bmp/00420.png | Bin 0 -> 254 bytes client/assets/bmp/00421.png | Bin 0 -> 6992 bytes client/assets/bmp/00422.png | Bin 0 -> 5948 bytes client/assets/bmp/00423.png | Bin 0 -> 162957 bytes client/assets/bmp/00424.png | Bin 0 -> 5332 bytes client/assets/bmp/00425.png | Bin 0 -> 12260 bytes client/assets/bmp/00426.png | Bin 0 -> 4402 bytes client/assets/bmp/00427.png | Bin 0 -> 9878 bytes client/assets/bmp/00428.png | Bin 0 -> 405 bytes client/assets/bmp/00429.png | Bin 0 -> 1244 bytes client/assets/bmp/00430.png | Bin 0 -> 12279 bytes client/assets/bmp/00431.png | Bin 0 -> 4774 bytes client/assets/bmp/00432.png | Bin 0 -> 2446 bytes client/assets/bmp/00433.png | Bin 0 -> 1525 bytes client/assets/bmp/00434.png | Bin 0 -> 8835 bytes client/assets/bmp/00435.png | Bin 0 -> 825 bytes client/assets/bmp/00436.png | Bin 0 -> 1631 bytes client/assets/bmp/00437.png | Bin 0 -> 7007 bytes client/assets/bmp/00438.png | Bin 0 -> 3547 bytes client/assets/bmp/00439.png | Bin 0 -> 11724 bytes client/assets/bmp/gameabc_data.js | 54921 ++++++++++++++++ client/assets/bmp/gameabc_data.min.js | 1 + client/assets/wav/00001.mp3 | Bin 0 -> 5712 bytes client/assets/wav/00002.mp3 | Bin 0 -> 21485 bytes client/assets/wav/00003.mp3 | Bin 0 -> 12833 bytes client/assets/wav/00004.mp3 | Bin 0 -> 30556 bytes client/assets/wav/00005.mp3 | Bin 0 -> 40902 bytes client/docs/Spine动画集成手册.md | 843 + client/generated/spine_assets.js | 4 + client/generated/spine_data.js | 3 + client/index.html | 145 + client/index2.html | 108 + client/js/00_Surface/00_minhttp.js | 656 + client/js/00_Surface/02_Const.js | 822 + client/js/00_Surface/03_Banwords.js | 3 + client/js/00_Surface/04_Data.js | 582 + client/js/00_Surface/05_Func.js | 4197 ++ client/js/00_Surface/06_Player.js | 558 + client/js/00_Surface/07_Desk.js | 1425 + client/js/00_Surface/08_Utl_Output.js | 1027 + client/js/00_Surface/09_Net.js | 897 + client/js/00_Surface/10_Game.js | 610 + client/js/00_Surface/11_GameUI.js | 9862 +++ client/js/00_Surface/12_Logic.js | 2443 + client/js/01_SubGame/00_SubGame_Config.js | 149 + client/js/01_SubGame/01_SubGame_modify.js | 129 + client/js/01_SubGame/02_SubGame_Input.js | 300 + .../js/gameabc-framework/core/GameABCUtils.js | 1006 + .../gameabc-framework/core/SpriteManager.js | 1190 + .../js/gameabc-framework/network/RpcHelper.js | 225 + client/js/gameabc-framework/spine/SpineMgr.js | 467 + .../system/AnimationManager.js | 1168 + .../gameabc-framework/system/AudioManager.js | 351 + .../js/gameabc-framework/system/EventBus.js | 234 + .../system/SpriteEventController.js | 370 + .../system/SpriteGestureRecognizer.js | 174 + .../templates/GameView_Sprites.template.js | 205 + .../templates/ImageResources.template.js | 68 + .../templates/LayoutConstants.template.js | 500 + .../templates/SoundResources.template.js | 108 + .../templates/UIBootstrap.template.js | 196 + .../00_SubGame_Config.template.js | 130 + .../01_SubGame_modify.template.js | 129 + .../02_SubGame_Input.template.js | 300 + .../subgame-entry/SubGameHooks.template.js | 206 + .../js/gameabc-framework/ui/AlignmentUtils.js | 849 + .../js/gameabc-framework/ui/BaseComponent.js | 640 + .../gameabc-framework/ui/DynamicSpriteList.js | 830 + client/js/gameabc-framework/ui/RecordView.js | 395 + .../ui/RecordViewDefaultConfig.js | 93 + .../gameabc-framework/ui/SpriteCopyUtils.js | 650 + client/js/gameabc-framework/ui/UIManager.js | 607 + client/js/gamemain.js | 336 + client/js/jweixin-1.2.0.js | 1 + client/js/vendor/gameabc.min.js | 5544 ++ client/js/vendor/gameabc.min2.js | 5703 ++ client/js/vendor/jquery-2.1.1.min.js | 4 + client/js/vendor/spine-canvas.js | 11710 ++++ client/output/gameabc_GameTxt.json | 1120 + client/output/gameabc_GroupList.json | 324 + client/output/gameabc_Image.json | 4394 ++ client/output/gameabc_Layer.json | 389 + client/output/gameabc_Object.json | 48617 ++++++++++++++ client/output/gameabc_Project.json | 44 + client/output/gameabc_Voice.json | 19 + client/output/gameabc_data.js | 54921 ++++++++++++++++ client/output/gameabc_data.min.js | 1 + client/save/Layer00001.xml | 266 + client/save/Layer00002.xml | 908 + client/save/Layer00004.xml | 1699 + client/save/Layer00006.xml | 2731 + client/save/Layer00007.xml | 1577 + client/save/Layer00008.xml | 467 + client/save/Layer00009.xml | 1703 + client/save/Layer00010.xml | 208 + client/save/Layer00011.xml | 228 + client/save/Layer00012.xml | 1396 + client/save/Layer00013.xml | 305 + client/save/Layer00014.xml | 2232 + client/save/Layer00015.xml | 1285 + client/save/Layer00016.xml | 379 + client/save/Layer00017.xml | 837 + client/save/Layer00018.xml | 499 + client/save/Layer00019.xml | 1820 + client/save/Layer00021.xml | 1071 + client/save/Layer00022.xml | 307 + client/save/Layer00024.xml | 356 + client/save/Layer00025.xml | 3390 + client/save/Layer00026.xml | 2388 + client/save/Layer00027.xml | 980 + client/save/Layer00028.xml | 2897 + client/save/Layer00029.xml | 2007 + client/save/Layer00050.xml | 563 + client/save/Layer00202.xml | 3182 + client/save/Layer00402.xml | 124 + client/save/Layer00403.xml | 61 + client/save/Layer00404.xml | 316 + client/save/Layer00405.xml | 331 + client/save/Layer00408.xml | 1040 + client/save/Layer00409.xml | 1022 + client/save/Layer00410.xml | 1132 + client/save/Layer00411.xml | 306 + client/save/Layer00413.xml | 942 + client/save/Layer00416.xml | 876 + client/save/Layer00418.xml | 2730 + client/save/Layer00420.xml | 370 + client/save/Layer00601.xml | 282 + client/save/Layer00602.xml | 958 + client/save/Layer00603.xml | 158 + client/save/Layer00606.xml | 1777 + client/save/Layer00607.xml | 995 + client/save/Layer00608.xml | 365 + client/save/Layer00609.xml | 748 + client/save/Layer00612.xml | 280 + client/save/Layer00613.xml | 168 + client/save/Layer00614.xml | 109 + client/save/Layer00615.xml | 205 + client/save/Layer00616.xml | 168 + client/save/Layer00617.xml | 216 + client/save/Layer00618.xml | 108 + client/save/Layer00619.xml | 61 + client/save/Layer00620.xml | 158 + client/save/Project.xml | 771 + client/save/ResImage.xml | 442 + client/save/ResText.xml | 530 + client/save/ResVoice.xml | 8 + client/scripts/build_spine_data.cmd | 17 + client/scripts/build_spine_data.ps1 | 99 + client/server.html | 141 + client/version.js | 32 + client/version.xml | 7 + .../01-前端架构与运行环境.md | 114 + .../development-guide/02-渲染与UI组件体系.md | 302 + .../03-事件·动画·音频·Spine.md | 184 + .../04-网络对接与启动编排.md | 171 + .../development-guide/05-开发规范与红线.md | 130 + .../06-子游戏接入模式与Hooks外置.md | 301 + docs/client/development-guide/README.md | 75 + docs/games/engineering/01-架构总则与分层.md | 144 + docs/games/engineering/02-可扩展性与配置化.md | 147 + .../engineering/03-数据权威·错误处理·演进.md | 147 + docs/games/engineering/README.md | 66 + .../01-服务端环境与框架基础.md | 205 + .../02-子游戏接入与开发流程.md | 309 + .../03-数据收发与通信协议.md | 264 + .../development-guide/04-开发规范与红线.md | 181 + docs/server/development-guide/README.md | 98 + server/YouLeGamesServer.html | 549 + server/applist.js | 13 + server/class/class.app.js | 77 + server/class/class.aset2.js | 502 + server/class/class.card2.js | 742 + server/class/class.desk.js | 225 + server/class/class.desk2.js | 287 + server/class/class.flow2.js | 135 + server/class/class.mod.js | 70 + server/class/class.mysql.js | 93 + server/class/class.pai.js | 70 + server/config/update中属性说明.txt | 312 + server/debug.php | 31 + .../01-服务端环境与框架基础.md | 201 + .../02-子游戏接入与开发流程.md | 247 + .../03-数据收发与通信协议.md | 170 + .../development-guide/04-开发规范与红线.md | 168 + server/docs/development-guide/README.md | 79 + server/indexDb.js | 199 + server/lz-string.js | 506 + server/md5.js | 399 + server/minhttp.js | 822 + server/packet.js | 178 + server/server/app.js | 25 + server/server/channel/mod.js | 230 + server/server/channel/mod_ctl1.js | 39 + server/server/channel/mod_ctl2.js | 375 + server/server/channel/通道接口.xlsx | Bin 0 -> 12356 bytes server/server/heartbeat/mod.js | 37 + server/server/loadjs/mod.js | 16 + server/update/app.js | 1 + server/youle/app.js | 29 + server/youle/server_agent/class.agent.js | 376 + server/youle/server_agent/class.export.js | 49 + server/youle/server_agent/class.game.js | 270 + server/youle/server_agent/class.import.js | 127 + server/youle/server_agent/class.match.js | 588 + server/youle/server_agent/class.player.js | 426 + server/youle/server_agent/class.tcplist.js | 120 + server/youle/server_agent/mod.js | 854 + server/youle/server_agent/rpc.js | 8133 +++ server/youle/server_platform/class.agent.js | 190 + server/youle/server_platform/class.config.js | 304 + server/youle/server_platform/mod.js | 210 + server/youle/server_room/class.agent.js | 163 + server/youle/server_room/class.backup.js | 732 + server/youle/server_room/class.export.js | 2085 + server/youle/server_room/class.game.js | 193 + server/youle/server_room/class.import.js | 383 + server/youle/server_room/class.player.js | 158 + server/youle/server_room/class.rebate.js | 1018 + server/youle/server_room/class.return.js | 181 + server/youle/server_room/class.room.js | 443 + server/youle/server_room/class.tcplist.js | 81 + server/youle/server_room/mod.js | 54 + server/youle/server_room/rpc.js | 4019 ++ server/youle/server_synch/mod.js | 733 + server/youle/third.php | 193 + server/youle/web_agent/mod.js | 136 + server/youle/web_sales/class.import.js | 30 + server/youle/web_sales/mod.js | 1157 + 655 files changed, 310861 insertions(+) create mode 100644 .gitignore create mode 100644 CLAUDE.md create mode 100644 client/FilesOrd.txt create mode 100644 client/Project.txt create mode 100644 client/app_battery.js create mode 100644 client/app_data.js create mode 100644 client/app_gamesname.js create mode 100644 client/app_network.js create mode 100644 client/assets/bmp/00001.png create mode 100644 client/assets/bmp/00002.png create mode 100644 client/assets/bmp/00003.png create mode 100644 client/assets/bmp/00004.png create mode 100644 client/assets/bmp/00005.png create mode 100644 client/assets/bmp/00006.png create mode 100644 client/assets/bmp/00007.png create mode 100644 client/assets/bmp/00008.png create mode 100644 client/assets/bmp/00009.png create mode 100644 client/assets/bmp/00010.png create mode 100644 client/assets/bmp/00011.png create mode 100644 client/assets/bmp/00012.png create mode 100644 client/assets/bmp/00013.png create mode 100644 client/assets/bmp/00014.png create mode 100644 client/assets/bmp/00015.png create mode 100644 client/assets/bmp/00016.png create mode 100644 client/assets/bmp/00017.png create mode 100644 client/assets/bmp/00018.png create mode 100644 client/assets/bmp/00019.png create mode 100644 client/assets/bmp/00020.png create mode 100644 client/assets/bmp/00021.png create mode 100644 client/assets/bmp/00022.png create mode 100644 client/assets/bmp/00023.png create mode 100644 client/assets/bmp/00024.png create mode 100644 client/assets/bmp/00025.png create mode 100644 client/assets/bmp/00026.png create mode 100644 client/assets/bmp/00027.png create mode 100644 client/assets/bmp/00028.png create mode 100644 client/assets/bmp/00029.png create mode 100644 client/assets/bmp/00030.png create mode 100644 client/assets/bmp/00031.png create mode 100644 client/assets/bmp/00032.png create mode 100644 client/assets/bmp/00033.png create mode 100644 client/assets/bmp/00034.png create mode 100644 client/assets/bmp/00035.png create mode 100644 client/assets/bmp/00036.png create mode 100644 client/assets/bmp/00037.png create mode 100644 client/assets/bmp/00038.png create mode 100644 client/assets/bmp/00039.png create mode 100644 client/assets/bmp/00040.png create mode 100644 client/assets/bmp/00041.png create mode 100644 client/assets/bmp/00042.png create mode 100644 client/assets/bmp/00043.png create mode 100644 client/assets/bmp/00044.png create mode 100644 client/assets/bmp/00045.png create mode 100644 client/assets/bmp/00046.png create mode 100644 client/assets/bmp/00047.png create mode 100644 client/assets/bmp/00048.png create mode 100644 client/assets/bmp/00049.png create mode 100644 client/assets/bmp/00050.png create mode 100644 client/assets/bmp/00051.png create mode 100644 client/assets/bmp/00052.png create mode 100644 client/assets/bmp/00053.png create mode 100644 client/assets/bmp/00054.png create mode 100644 client/assets/bmp/00055.png create mode 100644 client/assets/bmp/00056.png create mode 100644 client/assets/bmp/00057.png create mode 100644 client/assets/bmp/00058.png create mode 100644 client/assets/bmp/00059.png create mode 100644 client/assets/bmp/00060.png create mode 100644 client/assets/bmp/00061.png create mode 100644 client/assets/bmp/00062.png create mode 100644 client/assets/bmp/00063.png create mode 100644 client/assets/bmp/00064.png create mode 100644 client/assets/bmp/00065.png create mode 100644 client/assets/bmp/00066.png create mode 100644 client/assets/bmp/00067.png create mode 100644 client/assets/bmp/00068.png create mode 100644 client/assets/bmp/00069.png create mode 100644 client/assets/bmp/00070.png create mode 100644 client/assets/bmp/00071.png create mode 100644 client/assets/bmp/00072.png create mode 100644 client/assets/bmp/00073.png create mode 100644 client/assets/bmp/00074.png create mode 100644 client/assets/bmp/00075.png create mode 100644 client/assets/bmp/00076.png create mode 100644 client/assets/bmp/00077.png create mode 100644 client/assets/bmp/00078.png create mode 100644 client/assets/bmp/00079.png create mode 100644 client/assets/bmp/00080.png create mode 100644 client/assets/bmp/00081.png create mode 100644 client/assets/bmp/00082.png create mode 100644 client/assets/bmp/00083.png create mode 100644 client/assets/bmp/00084.png create mode 100644 client/assets/bmp/00085.png create mode 100644 client/assets/bmp/00086.png create mode 100644 client/assets/bmp/00087.png create mode 100644 client/assets/bmp/00088.png create mode 100644 client/assets/bmp/00089.png create mode 100644 client/assets/bmp/00090.png create mode 100644 client/assets/bmp/00091.png create mode 100644 client/assets/bmp/00092.png create mode 100644 client/assets/bmp/00093.png create mode 100644 client/assets/bmp/00094.png create mode 100644 client/assets/bmp/00095.png create mode 100644 client/assets/bmp/00096.png create mode 100644 client/assets/bmp/00097.png create mode 100644 client/assets/bmp/00098.png create mode 100644 client/assets/bmp/00099.png create mode 100644 client/assets/bmp/00100.png create mode 100644 client/assets/bmp/00101.png create mode 100644 client/assets/bmp/00102.png create mode 100644 client/assets/bmp/00103.png create mode 100644 client/assets/bmp/00104.png create mode 100644 client/assets/bmp/00105.png create mode 100644 client/assets/bmp/00106.png create mode 100644 client/assets/bmp/00107.png create mode 100644 client/assets/bmp/00108.png create mode 100644 client/assets/bmp/00109.png create mode 100644 client/assets/bmp/00110.png create mode 100644 client/assets/bmp/00111.png create mode 100644 client/assets/bmp/00112.png create mode 100644 client/assets/bmp/00113.png create mode 100644 client/assets/bmp/00114.png create mode 100644 client/assets/bmp/00115.png create mode 100644 client/assets/bmp/00116.png create mode 100644 client/assets/bmp/00117.png create mode 100644 client/assets/bmp/00118.png create mode 100644 client/assets/bmp/00119.png create mode 100644 client/assets/bmp/00120.png create mode 100644 client/assets/bmp/00121.png create mode 100644 client/assets/bmp/00122.png create mode 100644 client/assets/bmp/00123.png create mode 100644 client/assets/bmp/00124.png create mode 100644 client/assets/bmp/00125.png create mode 100644 client/assets/bmp/00126.png create mode 100644 client/assets/bmp/00127.png create mode 100644 client/assets/bmp/00128.png create mode 100644 client/assets/bmp/00129.png create mode 100644 client/assets/bmp/00130.png create mode 100644 client/assets/bmp/00131.png create mode 100644 client/assets/bmp/00132.png create mode 100644 client/assets/bmp/00133.png create mode 100644 client/assets/bmp/00134.png create mode 100644 client/assets/bmp/00135.png create mode 100644 client/assets/bmp/00136.png create mode 100644 client/assets/bmp/00137.png create mode 100644 client/assets/bmp/00138.png create mode 100644 client/assets/bmp/00139.png create mode 100644 client/assets/bmp/00140.png create mode 100644 client/assets/bmp/00141.png create mode 100644 client/assets/bmp/00142.png create mode 100644 client/assets/bmp/00143.png create mode 100644 client/assets/bmp/00144.png create mode 100644 client/assets/bmp/00145.png create mode 100644 client/assets/bmp/00146.png create mode 100644 client/assets/bmp/00147.png create mode 100644 client/assets/bmp/00148.png create mode 100644 client/assets/bmp/00149.png create mode 100644 client/assets/bmp/00150.png create mode 100644 client/assets/bmp/00151.png create mode 100644 client/assets/bmp/00152.png create mode 100644 client/assets/bmp/00153.png create mode 100644 client/assets/bmp/00154.png create mode 100644 client/assets/bmp/00155.png create mode 100644 client/assets/bmp/00156.png create mode 100644 client/assets/bmp/00157.png create mode 100644 client/assets/bmp/00158.png create mode 100644 client/assets/bmp/00159.png create mode 100644 client/assets/bmp/00160.png create mode 100644 client/assets/bmp/00161.png create mode 100644 client/assets/bmp/00162.png create mode 100644 client/assets/bmp/00163.png create mode 100644 client/assets/bmp/00164.png create mode 100644 client/assets/bmp/00165.png create mode 100644 client/assets/bmp/00166.png create mode 100644 client/assets/bmp/00167.png create mode 100644 client/assets/bmp/00168.png create mode 100644 client/assets/bmp/00169.png create mode 100644 client/assets/bmp/00170.png create mode 100644 client/assets/bmp/00171.png create mode 100644 client/assets/bmp/00172.png create mode 100644 client/assets/bmp/00173.png create mode 100644 client/assets/bmp/00174.png create mode 100644 client/assets/bmp/00175.png create mode 100644 client/assets/bmp/00176.png create mode 100644 client/assets/bmp/00177.png create mode 100644 client/assets/bmp/00178.png create mode 100644 client/assets/bmp/00179.png create mode 100644 client/assets/bmp/00180.png create mode 100644 client/assets/bmp/00181.png create mode 100644 client/assets/bmp/00182.png create mode 100644 client/assets/bmp/00183.png create mode 100644 client/assets/bmp/00184.png create mode 100644 client/assets/bmp/00185.png create mode 100644 client/assets/bmp/00186.png create mode 100644 client/assets/bmp/00187.png create mode 100644 client/assets/bmp/00188.png create mode 100644 client/assets/bmp/00189.png create mode 100644 client/assets/bmp/00190.png create mode 100644 client/assets/bmp/00191.png create mode 100644 client/assets/bmp/00192.png create mode 100644 client/assets/bmp/00193.png create mode 100644 client/assets/bmp/00194.png create mode 100644 client/assets/bmp/00195.png create mode 100644 client/assets/bmp/00196.png create mode 100644 client/assets/bmp/00197.png create mode 100644 client/assets/bmp/00198.png create mode 100644 client/assets/bmp/00199.png create mode 100644 client/assets/bmp/00200.png create mode 100644 client/assets/bmp/00201.png create mode 100644 client/assets/bmp/00202.png create mode 100644 client/assets/bmp/00203.png create mode 100644 client/assets/bmp/00204.png create mode 100644 client/assets/bmp/00205.png create mode 100644 client/assets/bmp/00206.png create mode 100644 client/assets/bmp/00207.png create mode 100644 client/assets/bmp/00208.png create mode 100644 client/assets/bmp/00209.png create mode 100644 client/assets/bmp/00210.png create mode 100644 client/assets/bmp/00211.png create mode 100644 client/assets/bmp/00212.png create mode 100644 client/assets/bmp/00213.png create mode 100644 client/assets/bmp/00214.png create mode 100644 client/assets/bmp/00215.png create mode 100644 client/assets/bmp/00216.png create mode 100644 client/assets/bmp/00217.png create mode 100644 client/assets/bmp/00218.png create mode 100644 client/assets/bmp/00219.png create mode 100644 client/assets/bmp/00220.png create mode 100644 client/assets/bmp/00221.png create mode 100644 client/assets/bmp/00222.png create mode 100644 client/assets/bmp/00223.png create mode 100644 client/assets/bmp/00224.png create mode 100644 client/assets/bmp/00225.png create mode 100644 client/assets/bmp/00226.png create mode 100644 client/assets/bmp/00227.png create mode 100644 client/assets/bmp/00228.png create mode 100644 client/assets/bmp/00229.png create mode 100644 client/assets/bmp/00230.png create mode 100644 client/assets/bmp/00231.png create mode 100644 client/assets/bmp/00232.png create mode 100644 client/assets/bmp/00233.png create mode 100644 client/assets/bmp/00234.png create mode 100644 client/assets/bmp/00235.png create mode 100644 client/assets/bmp/00236.png create mode 100644 client/assets/bmp/00237.png create mode 100644 client/assets/bmp/00238.png create mode 100644 client/assets/bmp/00239.png create mode 100644 client/assets/bmp/00240.png create mode 100644 client/assets/bmp/00241.png create mode 100644 client/assets/bmp/00242.png create mode 100644 client/assets/bmp/00243.png create mode 100644 client/assets/bmp/00244.png create mode 100644 client/assets/bmp/00245.png create mode 100644 client/assets/bmp/00246.png create mode 100644 client/assets/bmp/00247.png create mode 100644 client/assets/bmp/00248.png create mode 100644 client/assets/bmp/00249.png create mode 100644 client/assets/bmp/00250.png create mode 100644 client/assets/bmp/00251.png create mode 100644 client/assets/bmp/00252.png create mode 100644 client/assets/bmp/00253.png create mode 100644 client/assets/bmp/00254.png create mode 100644 client/assets/bmp/00255.png create mode 100644 client/assets/bmp/00256.png create mode 100644 client/assets/bmp/00257.png create mode 100644 client/assets/bmp/00258.png create mode 100644 client/assets/bmp/00259.png create mode 100644 client/assets/bmp/00260.png create mode 100644 client/assets/bmp/00261.png create mode 100644 client/assets/bmp/00262.png create mode 100644 client/assets/bmp/00263.png create mode 100644 client/assets/bmp/00264.png create mode 100644 client/assets/bmp/00265.png create mode 100644 client/assets/bmp/00266.png create mode 100644 client/assets/bmp/00267.png create mode 100644 client/assets/bmp/00268.png create mode 100644 client/assets/bmp/00269.png create mode 100644 client/assets/bmp/00270.png create mode 100644 client/assets/bmp/00271.png create mode 100644 client/assets/bmp/00272.png create mode 100644 client/assets/bmp/00273.png create mode 100644 client/assets/bmp/00274.png create mode 100644 client/assets/bmp/00275.png create mode 100644 client/assets/bmp/00276.png create mode 100644 client/assets/bmp/00277.png create mode 100644 client/assets/bmp/00278.png create mode 100644 client/assets/bmp/00279.png create mode 100644 client/assets/bmp/00280.png create mode 100644 client/assets/bmp/00281.png create mode 100644 client/assets/bmp/00282.png create mode 100644 client/assets/bmp/00283.png create mode 100644 client/assets/bmp/00284.png create mode 100644 client/assets/bmp/00285.png create mode 100644 client/assets/bmp/00286.png create mode 100644 client/assets/bmp/00287.png create mode 100644 client/assets/bmp/00288.png create mode 100644 client/assets/bmp/00289.png create mode 100644 client/assets/bmp/00290.png create mode 100644 client/assets/bmp/00291.png create mode 100644 client/assets/bmp/00292.png create mode 100644 client/assets/bmp/00293.png create mode 100644 client/assets/bmp/00294.png create mode 100644 client/assets/bmp/00295.png create mode 100644 client/assets/bmp/00296.png create mode 100644 client/assets/bmp/00297.png create mode 100644 client/assets/bmp/00298.png create mode 100644 client/assets/bmp/00299.png create mode 100644 client/assets/bmp/00300.png create mode 100644 client/assets/bmp/00301.png create mode 100644 client/assets/bmp/00302.png create mode 100644 client/assets/bmp/00303.png create mode 100644 client/assets/bmp/00304.png create mode 100644 client/assets/bmp/00305.png create mode 100644 client/assets/bmp/00306.png create mode 100644 client/assets/bmp/00307.png create mode 100644 client/assets/bmp/00308.png create mode 100644 client/assets/bmp/00309.png create mode 100644 client/assets/bmp/00310.png create mode 100644 client/assets/bmp/00311.png create mode 100644 client/assets/bmp/00312.png create mode 100644 client/assets/bmp/00313.png create mode 100644 client/assets/bmp/00314.png create mode 100644 client/assets/bmp/00315.png create mode 100644 client/assets/bmp/00316.png create mode 100644 client/assets/bmp/00317.png create mode 100644 client/assets/bmp/00318.png create mode 100644 client/assets/bmp/00319.png create mode 100644 client/assets/bmp/00320.png create mode 100644 client/assets/bmp/00321.png create mode 100644 client/assets/bmp/00322.png create mode 100644 client/assets/bmp/00323.png create mode 100644 client/assets/bmp/00324.png create mode 100644 client/assets/bmp/00325.png create mode 100644 client/assets/bmp/00326.png create mode 100644 client/assets/bmp/00327.png create mode 100644 client/assets/bmp/00328.png create mode 100644 client/assets/bmp/00329.png create mode 100644 client/assets/bmp/00330.png create mode 100644 client/assets/bmp/00331.png create mode 100644 client/assets/bmp/00332.png create mode 100644 client/assets/bmp/00333.png create mode 100644 client/assets/bmp/00334.png create mode 100644 client/assets/bmp/00335.png create mode 100644 client/assets/bmp/00336.png create mode 100644 client/assets/bmp/00337.png create mode 100644 client/assets/bmp/00338.png create mode 100644 client/assets/bmp/00339.png create mode 100644 client/assets/bmp/00340.png create mode 100644 client/assets/bmp/00341.png create mode 100644 client/assets/bmp/00342.png create mode 100644 client/assets/bmp/00343.png create mode 100644 client/assets/bmp/00344.png create mode 100644 client/assets/bmp/00345.png create mode 100644 client/assets/bmp/00346.png create mode 100644 client/assets/bmp/00347.png create mode 100644 client/assets/bmp/00348.png create mode 100644 client/assets/bmp/00349.png create mode 100644 client/assets/bmp/00350.png create mode 100644 client/assets/bmp/00351.png create mode 100644 client/assets/bmp/00352.png create mode 100644 client/assets/bmp/00353.png create mode 100644 client/assets/bmp/00354.png create mode 100644 client/assets/bmp/00355.png create mode 100644 client/assets/bmp/00356.png create mode 100644 client/assets/bmp/00357.png create mode 100644 client/assets/bmp/00358.png create mode 100644 client/assets/bmp/00359.png create mode 100644 client/assets/bmp/00360.png create mode 100644 client/assets/bmp/00361.png create mode 100644 client/assets/bmp/00362.png create mode 100644 client/assets/bmp/00363.png create mode 100644 client/assets/bmp/00364.png create mode 100644 client/assets/bmp/00365.png create mode 100644 client/assets/bmp/00366.png create mode 100644 client/assets/bmp/00367.png create mode 100644 client/assets/bmp/00368.png create mode 100644 client/assets/bmp/00369.png create mode 100644 client/assets/bmp/00370.png create mode 100644 client/assets/bmp/00371.png create mode 100644 client/assets/bmp/00372.png create mode 100644 client/assets/bmp/00373.png create mode 100644 client/assets/bmp/00374.png create mode 100644 client/assets/bmp/00375.png create mode 100644 client/assets/bmp/00376.png create mode 100644 client/assets/bmp/00377.png create mode 100644 client/assets/bmp/00378.png create mode 100644 client/assets/bmp/00379.png create mode 100644 client/assets/bmp/00380.png create mode 100644 client/assets/bmp/00381.png create mode 100644 client/assets/bmp/00382.png create mode 100644 client/assets/bmp/00383.png create mode 100644 client/assets/bmp/00384.png create mode 100644 client/assets/bmp/00385.png create mode 100644 client/assets/bmp/00386.png create mode 100644 client/assets/bmp/00387.png create mode 100644 client/assets/bmp/00388.png create mode 100644 client/assets/bmp/00389.png create mode 100644 client/assets/bmp/00390.png create mode 100644 client/assets/bmp/00391.png create mode 100644 client/assets/bmp/00392.png create mode 100644 client/assets/bmp/00393.png create mode 100644 client/assets/bmp/00394.png create mode 100644 client/assets/bmp/00395.png create mode 100644 client/assets/bmp/00396.png create mode 100644 client/assets/bmp/00397.png create mode 100644 client/assets/bmp/00398.png create mode 100644 client/assets/bmp/00399.png create mode 100644 client/assets/bmp/00400.png create mode 100644 client/assets/bmp/00401.png create mode 100644 client/assets/bmp/00402.png create mode 100644 client/assets/bmp/00403.png create mode 100644 client/assets/bmp/00404.png create mode 100644 client/assets/bmp/00405.png create mode 100644 client/assets/bmp/00406.png create mode 100644 client/assets/bmp/00407.png create mode 100644 client/assets/bmp/00408.png create mode 100644 client/assets/bmp/00409.png create mode 100644 client/assets/bmp/00410.png create mode 100644 client/assets/bmp/00411.png create mode 100644 client/assets/bmp/00412.png create mode 100644 client/assets/bmp/00413.png create mode 100644 client/assets/bmp/00414.png create mode 100644 client/assets/bmp/00415.png create mode 100644 client/assets/bmp/00416.png create mode 100644 client/assets/bmp/00417.png create mode 100644 client/assets/bmp/00418.png create mode 100644 client/assets/bmp/00419.png create mode 100644 client/assets/bmp/00420.png create mode 100644 client/assets/bmp/00421.png create mode 100644 client/assets/bmp/00422.png create mode 100644 client/assets/bmp/00423.png create mode 100644 client/assets/bmp/00424.png create mode 100644 client/assets/bmp/00425.png create mode 100644 client/assets/bmp/00426.png create mode 100644 client/assets/bmp/00427.png create mode 100644 client/assets/bmp/00428.png create mode 100644 client/assets/bmp/00429.png create mode 100644 client/assets/bmp/00430.png create mode 100644 client/assets/bmp/00431.png create mode 100644 client/assets/bmp/00432.png create mode 100644 client/assets/bmp/00433.png create mode 100644 client/assets/bmp/00434.png create mode 100644 client/assets/bmp/00435.png create mode 100644 client/assets/bmp/00436.png create mode 100644 client/assets/bmp/00437.png create mode 100644 client/assets/bmp/00438.png create mode 100644 client/assets/bmp/00439.png create mode 100644 client/assets/bmp/gameabc_data.js create mode 100644 client/assets/bmp/gameabc_data.min.js create mode 100644 client/assets/wav/00001.mp3 create mode 100644 client/assets/wav/00002.mp3 create mode 100644 client/assets/wav/00003.mp3 create mode 100644 client/assets/wav/00004.mp3 create mode 100644 client/assets/wav/00005.mp3 create mode 100644 client/docs/Spine动画集成手册.md create mode 100644 client/generated/spine_assets.js create mode 100644 client/generated/spine_data.js create mode 100644 client/index.html create mode 100644 client/index2.html create mode 100644 client/js/00_Surface/00_minhttp.js create mode 100644 client/js/00_Surface/02_Const.js create mode 100644 client/js/00_Surface/03_Banwords.js create mode 100644 client/js/00_Surface/04_Data.js create mode 100644 client/js/00_Surface/05_Func.js create mode 100644 client/js/00_Surface/06_Player.js create mode 100644 client/js/00_Surface/07_Desk.js create mode 100644 client/js/00_Surface/08_Utl_Output.js create mode 100644 client/js/00_Surface/09_Net.js create mode 100644 client/js/00_Surface/10_Game.js create mode 100644 client/js/00_Surface/11_GameUI.js create mode 100644 client/js/00_Surface/12_Logic.js create mode 100644 client/js/01_SubGame/00_SubGame_Config.js create mode 100644 client/js/01_SubGame/01_SubGame_modify.js create mode 100644 client/js/01_SubGame/02_SubGame_Input.js create mode 100644 client/js/gameabc-framework/core/GameABCUtils.js create mode 100644 client/js/gameabc-framework/core/SpriteManager.js create mode 100644 client/js/gameabc-framework/network/RpcHelper.js create mode 100644 client/js/gameabc-framework/spine/SpineMgr.js create mode 100644 client/js/gameabc-framework/system/AnimationManager.js create mode 100644 client/js/gameabc-framework/system/AudioManager.js create mode 100644 client/js/gameabc-framework/system/EventBus.js create mode 100644 client/js/gameabc-framework/system/SpriteEventController.js create mode 100644 client/js/gameabc-framework/system/SpriteGestureRecognizer.js create mode 100644 client/js/gameabc-framework/templates/GameView_Sprites.template.js create mode 100644 client/js/gameabc-framework/templates/ImageResources.template.js create mode 100644 client/js/gameabc-framework/templates/LayoutConstants.template.js create mode 100644 client/js/gameabc-framework/templates/SoundResources.template.js create mode 100644 client/js/gameabc-framework/templates/UIBootstrap.template.js create mode 100644 client/js/gameabc-framework/templates/subgame-entry/00_SubGame_Config.template.js create mode 100644 client/js/gameabc-framework/templates/subgame-entry/01_SubGame_modify.template.js create mode 100644 client/js/gameabc-framework/templates/subgame-entry/02_SubGame_Input.template.js create mode 100644 client/js/gameabc-framework/templates/subgame-entry/SubGameHooks.template.js create mode 100644 client/js/gameabc-framework/ui/AlignmentUtils.js create mode 100644 client/js/gameabc-framework/ui/BaseComponent.js create mode 100644 client/js/gameabc-framework/ui/DynamicSpriteList.js create mode 100644 client/js/gameabc-framework/ui/RecordView.js create mode 100644 client/js/gameabc-framework/ui/RecordViewDefaultConfig.js create mode 100644 client/js/gameabc-framework/ui/SpriteCopyUtils.js create mode 100644 client/js/gameabc-framework/ui/UIManager.js create mode 100644 client/js/gamemain.js create mode 100644 client/js/jweixin-1.2.0.js create mode 100644 client/js/vendor/gameabc.min.js create mode 100644 client/js/vendor/gameabc.min2.js create mode 100644 client/js/vendor/jquery-2.1.1.min.js create mode 100644 client/js/vendor/spine-canvas.js create mode 100644 client/output/gameabc_GameTxt.json create mode 100644 client/output/gameabc_GroupList.json create mode 100644 client/output/gameabc_Image.json create mode 100644 client/output/gameabc_Layer.json create mode 100644 client/output/gameabc_Object.json create mode 100644 client/output/gameabc_Project.json create mode 100644 client/output/gameabc_Voice.json create mode 100644 client/output/gameabc_data.js create mode 100644 client/output/gameabc_data.min.js create mode 100644 client/save/Layer00001.xml create mode 100644 client/save/Layer00002.xml create mode 100644 client/save/Layer00004.xml create mode 100644 client/save/Layer00006.xml create mode 100644 client/save/Layer00007.xml create mode 100644 client/save/Layer00008.xml create mode 100644 client/save/Layer00009.xml create mode 100644 client/save/Layer00010.xml create mode 100644 client/save/Layer00011.xml create mode 100644 client/save/Layer00012.xml create mode 100644 client/save/Layer00013.xml create mode 100644 client/save/Layer00014.xml create mode 100644 client/save/Layer00015.xml create mode 100644 client/save/Layer00016.xml create mode 100644 client/save/Layer00017.xml create mode 100644 client/save/Layer00018.xml create mode 100644 client/save/Layer00019.xml create mode 100644 client/save/Layer00021.xml create mode 100644 client/save/Layer00022.xml create mode 100644 client/save/Layer00024.xml create mode 100644 client/save/Layer00025.xml create mode 100644 client/save/Layer00026.xml create mode 100644 client/save/Layer00027.xml create mode 100644 client/save/Layer00028.xml create mode 100644 client/save/Layer00029.xml create mode 100644 client/save/Layer00050.xml create mode 100644 client/save/Layer00202.xml create mode 100644 client/save/Layer00402.xml create mode 100644 client/save/Layer00403.xml create mode 100644 client/save/Layer00404.xml create mode 100644 client/save/Layer00405.xml create mode 100644 client/save/Layer00408.xml create mode 100644 client/save/Layer00409.xml create mode 100644 client/save/Layer00410.xml create mode 100644 client/save/Layer00411.xml create mode 100644 client/save/Layer00413.xml create mode 100644 client/save/Layer00416.xml create mode 100644 client/save/Layer00418.xml create mode 100644 client/save/Layer00420.xml create mode 100644 client/save/Layer00601.xml create mode 100644 client/save/Layer00602.xml create mode 100644 client/save/Layer00603.xml create mode 100644 client/save/Layer00606.xml create mode 100644 client/save/Layer00607.xml create mode 100644 client/save/Layer00608.xml create mode 100644 client/save/Layer00609.xml create mode 100644 client/save/Layer00612.xml create mode 100644 client/save/Layer00613.xml create mode 100644 client/save/Layer00614.xml create mode 100644 client/save/Layer00615.xml create mode 100644 client/save/Layer00616.xml create mode 100644 client/save/Layer00617.xml create mode 100644 client/save/Layer00618.xml create mode 100644 client/save/Layer00619.xml create mode 100644 client/save/Layer00620.xml create mode 100644 client/save/Project.xml create mode 100644 client/save/ResImage.xml create mode 100644 client/save/ResText.xml create mode 100644 client/save/ResVoice.xml create mode 100644 client/scripts/build_spine_data.cmd create mode 100644 client/scripts/build_spine_data.ps1 create mode 100644 client/server.html create mode 100644 client/version.js create mode 100644 client/version.xml create mode 100644 docs/client/development-guide/01-前端架构与运行环境.md create mode 100644 docs/client/development-guide/02-渲染与UI组件体系.md create mode 100644 docs/client/development-guide/03-事件·动画·音频·Spine.md create mode 100644 docs/client/development-guide/04-网络对接与启动编排.md create mode 100644 docs/client/development-guide/05-开发规范与红线.md create mode 100644 docs/client/development-guide/06-子游戏接入模式与Hooks外置.md create mode 100644 docs/client/development-guide/README.md create mode 100644 docs/games/engineering/01-架构总则与分层.md create mode 100644 docs/games/engineering/02-可扩展性与配置化.md create mode 100644 docs/games/engineering/03-数据权威·错误处理·演进.md create mode 100644 docs/games/engineering/README.md create mode 100644 docs/server/development-guide/01-服务端环境与框架基础.md create mode 100644 docs/server/development-guide/02-子游戏接入与开发流程.md create mode 100644 docs/server/development-guide/03-数据收发与通信协议.md create mode 100644 docs/server/development-guide/04-开发规范与红线.md create mode 100644 docs/server/development-guide/README.md create mode 100644 server/YouLeGamesServer.html create mode 100644 server/applist.js create mode 100644 server/class/class.app.js create mode 100644 server/class/class.aset2.js create mode 100644 server/class/class.card2.js create mode 100644 server/class/class.desk.js create mode 100644 server/class/class.desk2.js create mode 100644 server/class/class.flow2.js create mode 100644 server/class/class.mod.js create mode 100644 server/class/class.mysql.js create mode 100644 server/class/class.pai.js create mode 100644 server/config/update中属性说明.txt create mode 100644 server/debug.php create mode 100644 server/docs/development-guide/01-服务端环境与框架基础.md create mode 100644 server/docs/development-guide/02-子游戏接入与开发流程.md create mode 100644 server/docs/development-guide/03-数据收发与通信协议.md create mode 100644 server/docs/development-guide/04-开发规范与红线.md create mode 100644 server/docs/development-guide/README.md create mode 100644 server/indexDb.js create mode 100644 server/lz-string.js create mode 100644 server/md5.js create mode 100644 server/minhttp.js create mode 100644 server/packet.js create mode 100644 server/server/app.js create mode 100644 server/server/channel/mod.js create mode 100644 server/server/channel/mod_ctl1.js create mode 100644 server/server/channel/mod_ctl2.js create mode 100644 server/server/channel/通道接口.xlsx create mode 100644 server/server/heartbeat/mod.js create mode 100644 server/server/loadjs/mod.js create mode 100644 server/update/app.js create mode 100644 server/youle/app.js create mode 100644 server/youle/server_agent/class.agent.js create mode 100644 server/youle/server_agent/class.export.js create mode 100644 server/youle/server_agent/class.game.js create mode 100644 server/youle/server_agent/class.import.js create mode 100644 server/youle/server_agent/class.match.js create mode 100644 server/youle/server_agent/class.player.js create mode 100644 server/youle/server_agent/class.tcplist.js create mode 100644 server/youle/server_agent/mod.js create mode 100644 server/youle/server_agent/rpc.js create mode 100644 server/youle/server_platform/class.agent.js create mode 100644 server/youle/server_platform/class.config.js create mode 100644 server/youle/server_platform/mod.js create mode 100644 server/youle/server_room/class.agent.js create mode 100644 server/youle/server_room/class.backup.js create mode 100644 server/youle/server_room/class.export.js create mode 100644 server/youle/server_room/class.game.js create mode 100644 server/youle/server_room/class.import.js create mode 100644 server/youle/server_room/class.player.js create mode 100644 server/youle/server_room/class.rebate.js create mode 100644 server/youle/server_room/class.return.js create mode 100644 server/youle/server_room/class.room.js create mode 100644 server/youle/server_room/class.tcplist.js create mode 100644 server/youle/server_room/mod.js create mode 100644 server/youle/server_room/rpc.js create mode 100644 server/youle/server_synch/mod.js create mode 100644 server/youle/third.php create mode 100644 server/youle/web_agent/mod.js create mode 100644 server/youle/web_sales/class.import.js create mode 100644 server/youle/web_sales/mod.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..55ec011 --- /dev/null +++ b/.gitignore @@ -0,0 +1,24 @@ +# OS 垃圾文件 +.DS_Store +Thumbs.db +Desktop.ini + +# 编辑器/IDE +.vscode/ +.idea/ +*.swp +*.swo +*~ + +# Node(本仓库当前无 npm 构建,但 shared/ 的 Node 单测可能产生这些) +node_modules/ +npm-debug.log* +yarn-error.log* + +# 日志与临时文件 +*.log +*.tmp +*.bak + +# Claude Code 本地个人配置(含本机专属的权限豁免,不应共享) +.claude/settings.local.json diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..d5967be --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,96 @@ +# CLAUDE.md + +本文件为 Claude Code(claude.ai/code)在本仓库中工作时提供指导。 + +## 这是一个什么仓库 + +一个友乐/gameabc 房卡类小游戏平台:浏览器端由私有的 `gameabc.min.js` 2D Canvas 引擎驱动,服务端是一个 Node.js 游戏服务器平台(`youle` 应用),双方通过 WebSocket/HTTP 收发 JSON 包通信。项目根目录**没有 `package.json`、没有 npm 构建/lint/测试流水线、也没有 git 仓库**——这是纯静态 JS:客户端靠 ` + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/client/index2.html b/client/index2.html new file mode 100644 index 0000000..5a63752 --- /dev/null +++ b/client/index2.html @@ -0,0 +1,108 @@ + + + + + + + + + +gameabc + + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/js/00_Surface/00_minhttp.js b/client/js/00_Surface/00_minhttp.js new file mode 100644 index 0000000..6fa8ae0 --- /dev/null +++ b/client/js/00_Surface/00_minhttp.js @@ -0,0 +1,656 @@ +(function(wnd, undef){ + + //复制json对象 + function min_copyjson(json) + { + return JSON.parse(JSON.stringify(json)); + } + + //json对象转字符串 + function min_jsontostr(json) { + return JSON.stringify(json); + } + + //字符串转json对象 + function min_strtojson(str) { + return JSON.parse(str); + } + + //字符串转整型 def:转换失败时返回的默认值 + function min_strtoint(str, def) { + var i = parseInt(str); + if (i == 0) { + return 0; + }; + if (!i) { //=0也会进来 + if (!def) { + def = 0; + }; + i = def; + } + return i; + }; + + //整型转字符串 + function min_inttostr(i) { + return i.toString(); + }; + + //整除 + function min_div(i, b) + { + if (!b) { + return parseInt(i); + } + return parseInt(i / b); + }; + + //取余数 + function min_mod(a, b){ + return a % b; + }; + + //取绝对值 + function min_abs(b) { + return Math.abs(b); + }; + + //取随机数 + function min_random(min, max) { + var Range = max - min; + var Rand = Math.random(); + return (min + Math.round(Rand * Range)); + }; + //取随机数1 + function min_random1(num) { + return parseInt(Math.random()*num); + }; + + //随机字符串 + function min_randomChar(length){ + var x = "0123456789"; + var y = "qwertyuioplkjhgfdsazxcvbnm"; + var z = "QWERTYUIOPLKJHGFDSAZXCVBNM"; + var tmp = ""; + for (var i = 0; i < length; i++) { + switch(min_random(0, 2)) { + case 0: + tmp += x.charAt(Math.ceil(Math.random()*100000000)%x.length); + break; + case 1: + tmp += y.charAt(Math.ceil(Math.random()*100000000)%y.length); + break; + case 2: + tmp += z.charAt(Math.ceil(Math.random()*100000000)%z.length); + break; + default: + break; + } + } + // var timestamp = new Date().getTime(); + // return timestamp + tmp; + return tmp; + } + + //取长度 + function min_length(key) { + if (typeof(key) != "string") { + var key = key + ""; + } + return key.length; + } + + //字符全替换 + function min_replaceAll(str, str_old, str_new, ignoreCase) + { + if (!RegExp.prototype.isPrototypeOf(str_old)) { + return str.replace(new RegExp(str_old, (ignoreCase ? "gi": "g")), str_new); + } else { + return str.replace(str_old, str_new); + } + } + + //取本地当前时间,格式yyyy-MM-dd HH:MM:SS + function min_now() + { + var date = new Date(); + var seperator1 = "-"; + var seperator2 = ":"; + var month = date.getMonth() + 1; + var strDate = date.getDate(); + if (month >= 1 && month <= 9) { + month = "0" + month; + } + if (strDate >= 0 && strDate <= 9) { + strDate = "0" + strDate; + } + var currentdate = date.getFullYear() + seperator1 + month + seperator1 + strDate + + " " + date.getHours() + seperator2 + date.getMinutes() + + seperator2 + date.getSeconds(); + return currentdate; + } + + //本地存储数据 + function min_writefile_gameid(msg, gameid, fileid) { + localStorage.setItem("file_" + gameid + "_" + fileid, msg); + } + + //读取本地数据 + function min_readfile_gameid(gameid, fileid) { + return localStorage.getItem("file_" + gameid + "_" + fileid); + } + + //取当前页面url中的参数值 def:没取到时返回的默认值 + function min_getQueryString(name, def) { + var self = window; + var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)"); + var r = self.location.search.substr(1).match(reg); + if (r != null) { + return unescape(r[2]) + } else { + if (def) { + return def; + } else { + return null; + } + } + } + + //获取当前页面的路径 + function min_getUrlRootPath() { + var curWwwPath = window.location.host; + var pathName = window.location.pathname; + return curWwwPath + pathName.substr(0,pathName.lastIndexOf('/')); + } + + //设置cookie + function min_setCookie(name, value, exp_minute) { + if (!exp_minute) { + exp_minute = 20; //默认时效20分钟 + } + var exp = new Date(); + exp.setTime(exp.getTime() + exp_minute*60*1000); + document.cookie = name + "=" + value + ";expires=" + exp.toGMTString()+';path=/'; + } + + //读取cookie + function min_getCookie(name) { + var arr = document.cookie.match(new RegExp("(^| )"+name+"=([^;]*)(;|$)")); + if(arr != null) + return arr[2]; + return null; + } + + //删除cookie + function min_delCookie(name) { + var value = min_getCookie(name); + if (value) { + min_setCookie(name, value, 0); + } + } + + //获取一个dom + function min_getdom(id) + { + return document.getElementById(id); + }; + + //设置一个dom属性值 id:dom、或dom的id、或实列,key:属性,val:值 + function min_setdom(id, key, val) { + var obj; + if (typeof(id) == 'string') { + obj = min_getdom(id); + } + else { + obj = id; + } + obj.setAttribute(key, val); + } + + //添加一段innerHTML + function min_uphtml(id, str, isadd) { + /* + setAttribute是设置网页元素的属性,就是在标签里内如标签的src属性。 + innerHTML不是属性,只是JS里内代表一个双标记中间的文本,如: 中间的字符。 + */ + var obj = window.document.getElementById(id); + if (isadd) { + obj.innerHTML = obj.innerHTML + str; + } + else { + obj.innerHTML = str; + } + } + + //新建一个定时器每隔time毫秒执行一次func函数,函数返回定时器id + function min_ontime(func, time) + { + return setInterval(func, time); + } + + //新建一个定时器time毫秒后执行一次func函数(只执行一次),函数返回定时器id + function min_ontimeout(func, time) + { + return setTimeout(func, time); + } + + //关闭定时器id为timerid的定时器 + function min_closetime(timerid) + { + return clearTimeout(timerid); + } + + //encode转码 + function min_encode(s) + { + return encodeURIComponent(s); + } + + //decode解码 + function min_decode(s) + { + return decodeURIComponent(s); + } + + //新建一个tcp连接 + function min_tcp(config) + { + var ws = new WebSocket("ws://" + config.ipport); //"127.0.0.1:5414" + + //连接上服务器后触发的事件 + if (config.onopen) { + ws.onopen = config.onopen; + }; + + //收到服务器发来的数据包后触发的事件,onmessage函数会有一个底层的msg参数,其中msg.data才是服务器发过来的业务数据 + if (config.onmessage) { + ws.onmessage = config.onmessage; + }; + + //断开与服务器的连接后触发的事件 + if (config.onclose) { + ws.onclose = config.onclose; //断开连接的事件 + }; + + return ws; + } + + //http请求 + function min_http(config) { + /* + config = + { + url: "http://127.0.0.1:5414/index.html", + type: "POST", //GET or POST 方法 + data: "", //请求的数据 + success: func_callback_succ, //请求成功后的回调函数function(data,status,callbackdata) + error: func_callback_err, //请求失败后的回调函数function(data,status) + callbackdata: "", //作为回调函数第三个参数带入回调函数的数据 + //enurl: 0, //是否encodeURIComponent转码, 默认0不转码 + //deurl: 0, //是否decodeURIComponent解码,默认0不解码 + debugLog: false, //是否输出debug日志,默认false + method: "(OPTIONAL) True for async and False for Non-async | By default its Async" + } + */ + if (!config.debugLog) { + config.debugLog = false; + } + if (!config.enurl) { + config.enurl = 0; + } + if (!config.deurl) { + config.deurl = 0; + } + if (!config.method) { + config.method = true; + } + + if (!config.url) { + if (config.debugLog == true) { + console.log("No Url!"); + } + return; + }; + + if (!config.type) { + if (config.debugLog == true) { + console.log("No Default type (GET/POST) given!"); + } + return; + } + + var xmlhttp = initXMLhttp(); + + xmlhttp.onreadystatechange = function() { + if (xmlhttp.readyState == 4 && xmlhttp.status == 200 && config.success) + { + var responseText = mydecodeURIComponent(xmlhttp.responseText, config.deurl); + if (!config.callbackdata) { + config.success(responseText, xmlhttp.readyState); + } + else { + config.success(responseText, xmlhttp.readyState, config.callbackdata); + } + if (config.debugLog == true) { + console.log("SuccessResponse"); + } + if (config.debugLog == true) { + console.log("Response Data:" + xmlhttp.responseText); + } + } + else + { + if (xmlhttp.readyState == 4 && config.error) + { + if (!config.callbackdata) { + config.error(xmlhttp.readyState, xmlhttp.status); + } + else { + config.error(xmlhttp.readyState, xmlhttp.status, config.callbackdata); + } + } + if (config.debugLog == true) { + console.log("FailureResponse --> readyState:" + xmlhttp.readyState + ", Status:" + xmlhttp.status); + } + } + } + + var sendString = [], + sendData = config.data; + if (typeof sendData === "string") { + var tmpArr = String.prototype.split.call(sendData, '&'); + for (var i = 0, j = tmpArr.length; i < j; i++) { + var datum = tmpArr[i].split('='); + if (datum[1]) { + sendString.push(myencodeURIComponent(datum[0], config.enurl) + "=" + myencodeURIComponent(datum[1], config.enurl)); + } + else { + sendString.push(myencodeURIComponent(datum[0], config.enurl)); + } + } + } + else if (typeof sendData === 'object' && !(sendData instanceof String || (FormData && sendData instanceof FormData))) { + for (var k in sendData) { + var datum = sendData[k]; + if (Object.prototype.toString.call(datum) == "[object Array]") { + for (var i = 0, j = datum.length; i < j; i++) { + sendString.push(myencodeURIComponent(k, config.enurl) + "[]=" + myencodeURIComponent(datum[i], config.enurl)); + } + } + else { + sendString.push(myencodeURIComponent(k, config.enurl) + "=" + myencodeURIComponent(datum, config.enurl)); + } + } + } + sendString = sendString.join('&'); + + if (config.type == "GET") { + var g; + var i = config.url.lastIndexOf("?"); + if (i > 8) { + g = "&"; + } else { + g = "?"; + } + var ddata = new Date().getMilliseconds(); + if (sendString == "") { + sendString = '#dfw1977=' + (ddata + min_random(1, 99999) * 1000); + } else { + sendString = sendString + '#dfw1977=' + (ddata + min_random(1, 99999) * 1000); + } + xmlhttp.open("GET", config.url + g + sendString, config.method); + xmlhttp.send(); + + if (config.debugLog == true) { + console.log("GET fired at:" + config.url + "?" + sendString); + } + } + if (config.type == "POST") { + xmlhttp.open("POST", config.url, config.method); + xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); + xmlhttp.send(sendString); + + if (config.debugLog == true) { + console.log("POST fired at:" + config.url + " || Data:" + sendString); + } + } + } + + function initXMLhttp() { + var xmlhttp; + if (window.XMLHttpRequest) { + //code for IE7,firefox chrome and above + xmlhttp = new XMLHttpRequest(); + } else { + //code for Internet Explorer + xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); + } + return xmlhttp; + } + + //转码 + function myencodeURIComponent(s, ifif) + { + if (ifif == 1) { + return min_encode(s); + } else { + return s; + } + } + + //解码 + function mydecodeURIComponent(s, ifif) + { + if (ifif == 1) { + return min_decode(s); + } else { + return s; + } + + } + + //在数组中根据元素值查找下标 + function min_ary_indexof(array1, val, name) + { + for (var i = 0; i < array1.length; i++) + { + if (!name) + { + if (array1[i] == val) + return i; + } + else + { + if (array1[i][name] == val) + return i; + } + } + return -1; + }; + + //在数组中根据值删除元素 + function min_ary_delval(array1, val, name) + { + var index = min_ary_indexof(array1, val, name); + if (index > -1) + { + array1.splice(index, 1); + } + }; + + //在数组中根据下标删除诺干个元素 + function min_ary_delfromto(array1, from, to) + { + var rest = array1.slice((to || from) + 1 || array1.length); + array1.length = from < 0 ? array1.length + from : from; + array1.push.apply(array1, rest); + }; + + //在数组中删除某一对象元素 + function min_ary_delobj(array1, object) + { + for (var i = 0; i < array1.length; ++i) + { + if (array1[i] === object) + { + array1.splice(i, 1); + break; + } + } + }; + + //数组包含 + function min_ary_include(aryparent, arychild){ + for (var i = 0; i < arychild.length; i++) { + var found = false; + for (var j = 0; j < aryparent.length; j++) { + if (aryparent[j] == arychild[i]){ + found = true; + break; + } + } + if (!found){ + return false; + } + } + return true; + }; + + //数组相减 + function min_ary_deduct(aryparent, arychild){ + var re = []; + for (var i = 0; i < aryparent.length; i++){ + var found = false; + for (var j = 0; j < arychild.length; j++){ + if (aryparent[i] == arychild[j]){ + found = true; + break; + } + } + if (!found){ + re.push(aryparent[i]) + } + } + return re; + }; + + //是否存在指定函数 + function min_ExitsFunction(funcName) + { + try + { + if (typeof(funcName) == "function") + { + return true; + } + } + catch(e) + {} + return false; + } + + //(按顺序)加载js文件 + function min_loadJsFile(str_jsfile, func_succ, NoRandomFlag) + { + var domScript = document.createElement('script'); + if (!NoRandomFlag) + { + // str_jsfile = str_jsfile + '?' + Math.random() * 10000; + // str_jsfile = str_jsfile + '?' + min_random(1, 10000000); + str_jsfile = str_jsfile + '?' + min_timestamp(); + } + domScript.src = str_jsfile; + func_succ = func_succ || function(){}; + domScript.onload = domScript.onreadystatechange = function() { + if (!this.readyState || 'loaded' === this.readyState || 'complete' === this.readyState) { + func_succ(); + this.onload = this.onreadystatechange = null; + this.parentNode.removeChild(this); + } + } + document.getElementsByTagName('head')[0].appendChild(domScript); + } + + //生成一个GUID + function min_guid() + { + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { + var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8); + return v.toString(16);}); + } + + //获取时间戳 + function min_timestamp() + { + return new Date().getTime(); + } + + + wnd.min_copyjson = min_copyjson; //复制json对象 + wnd.min_jsontostr = min_jsontostr; //json转字符串 + wnd.min_strtojson = min_strtojson; //字符串转json + wnd.min_inttostr = min_inttostr; //整型转字符型 + wnd.min_strtoint = min_strtoint; //字符型转整型 + + wnd.min_div = min_div; //整除 + wnd.min_mod = min_mod; //取余数 + wnd.min_abs = min_abs; //取绝对值 + wnd.min_random = min_random; //取随机数 + wnd.min_random1 = min_random1; //取随机数1 + wnd.min_randomChar = min_randomChar; //随机字符串 + wnd.min_length = min_length; //取长度 + wnd.min_replaceAll = min_replaceAll; //字符全替换 + + wnd.min_now = min_now; //取本地当前时间 + wnd.min_guid = min_guid; //生成一个GUID + + wnd.min_getQueryString = min_getQueryString; //取当前页面url中的参数值 + wnd.min_getUrlRootPath = min_getUrlRootPath; //获取当前页面的路径 + + wnd.min_setCookie = min_setCookie; //设置cookie + wnd.min_getCookie = min_getCookie; //读取cookie + wnd.min_delCookie = min_delCookie; //删除cookie + + wnd.min_getdom = min_getdom; //获取一个dom + wnd.min_setdom = min_setdom; //设置一个dom属性值 + wnd.min_uphtml = min_uphtml; //添加一段innerHTML + + wnd.min_ontime = min_ontime; //新建一个周期性的定时器 + wnd.min_ontimeout = min_ontimeout; //新建一个一次性的定时器 + wnd.min_closetime = min_closetime; //关闭定时器 + + wnd.min_writefile_gameid = min_writefile_gameid; //本地存储数据 + wnd.min_readfile_gameid = min_readfile_gameid; //读取本地数据 + + wnd.min_encode = min_encode; //encodeURIComponent转码 + wnd.min_decode = min_decode; //decodeURIComponent解码 + + wnd.min_tcp = min_tcp; //新建一个tcp连接 + wnd.min_http = min_http; //http请求 + + wnd.min_ary_indexof = min_ary_indexof; //在数组中根据元素值查找下标 + wnd.min_ary_delval = min_ary_delval; //在数组中根据值删除元素 + wnd.min_ary_delfromto = min_ary_delfromto; //在数组中根据下标删除诺干个元素 + wnd.min_ary_delobj = min_ary_delobj; //在数组中删除某一对象元素 + wnd.min_ary_include = min_ary_include; //数组包含 + wnd.min_ary_deduct = min_ary_deduct; //数组相减 + + wnd.min_ExitsFunction = min_ExitsFunction; //是否存在函数 + wnd.min_loadJsFile = min_loadJsFile; //加载js文件 + + wnd.min_guid = min_guid; //生成一个GUID + wnd.min_timestamp = min_timestamp; //获取时间戳 +})(window); + + + + + + + + + + + + + diff --git a/client/js/00_Surface/02_Const.js b/client/js/00_Surface/02_Const.js new file mode 100644 index 0000000..b1d436a --- /dev/null +++ b/client/js/00_Surface/02_Const.js @@ -0,0 +1,822 @@ +var AppList = AppList||{}; +var RouteList = RouteList||{}; +var RpcList = RpcList||{}; +//--------------AppList--------------- +AppList.app = "youle"; + +//-----------RouteList------------- +RouteList.platform = "platform"; +RouteList.agent="agent"; +RouteList.room="room"; + + +//----------------RpcList-------------- +RpcList.player_login = "player_login"; +RpcList.self_join_room = "self_join_room"; +RpcList.create_room = "create_room"; +RpcList.self_break_room = "self_break_room"; +RpcList.other_break_room = "other_break_room"; +RpcList.other_join_room = "other_join_room"; +RpcList.self_exit_room = "self_exit_room"; +RpcList.other_exit_room = "other_exit_room"; +RpcList.self_apply_free_room = "self_apply_free_room"; +RpcList.other_apply_free_room = "other_apply_free_room"; +RpcList.self_agree_free_room = "self_agree_free_room"; +RpcList.other_agree_free_room = "other_agree_free_room"; +RpcList.self_refuse_free_room = "self_refuse_free_room"; +RpcList.other_refuse_free_room = "other_refuse_free_room"; +RpcList.free_room = "free_room"; +RpcList.over_game = "over_game"; +RpcList.get_player_grade1 = "get_player_grade1"; +RpcList.get_player_grade2 = "get_player_grade2"; +RpcList.update_roomcard = "update_roomcard"; +RpcList.other_offline = "other_offline"; +RpcList.other_online = "other_online"; +RpcList.send_voice = "send_voice"; +RpcList.play_voice = "play_voice"; +RpcList.send_text = "send_text"; +RpcList.receive_chat = "receive_chat"; +RpcList.get_player_task = "get_player_task"; +RpcList.player_finish_task = "player_finish_task"; +RpcList.get_task_award = "get_task_award"; +RpcList.can_award = "can_award"; +RpcList.kick_offline = "kick_offline"; +RpcList.call_phone = "call_phone"; +RpcList.other_callphone = "other_callphone"; +RpcList.hangup_phone = "hangup_phone"; +RpcList.other_hangup = "other_hangup"; +RpcList.self_makewar = "self_makewar"; +RpcList.other_makewar = "other_makewar"; +RpcList.agentserver_game="agentserver_game"; +RpcList.send_gift="send_gift"; +RpcList.other_send_gift="other_send_gift"; +RpcList.send_voice="send_voice"; +RpcList.play_voice="play_voice"; +RpcList.connect_roomserver="connect_roomserver"; +RpcList.connect_agentserver="connect_agentserver"; +RpcList.broadcast="broadcast"; +RpcList.send_phiz="send_phiz"; +RpcList.submit_opinion = "submit_opinion"; +RpcList.kick_server = "kick_server"; +RpcList.get_paylist = "get_paylist"; +RpcList.pay_succ = "pay_succ"; +RpcList.submit_location = "submit_location"; +RpcList.binding_invitecode = "binding_invitecode"; +RpcList.update_bean = "update_bean"; +RpcList.get_player_invitecode = "get_player_invitecode"; +RpcList.beanroom_surrender = "beanroom_surrender"; +RpcList.player_prepare = "player_prepare"; +RpcList.share_room = "share_room"; +RpcList.get_share_room = "get_share_room"; +RpcList.quick_enter_share_room = "quick_enter_share_room"; +RpcList.advanced_roomlist = "advanced_roomlist"; +RpcList.advanced_createroom = "advanced_createroom"; +RpcList.change_room = "change_room"; +RpcList.change_seat = "change_seat"; +RpcList.set_bankpwd = "set_bankpwd"; + +RpcList.binding_phone = "binding_phone"; + +RpcList.send_phone_checkcode = "send_phone_checkcode"; +RpcList.send_phone_code_wechat = "send_phone_code_wechat"; + +RpcList.get_treasurelist = "get_treasurelist"; +RpcList.change_star = "change_star"; + +RpcList.submit_phoneinfo = "submit_phoneinfo"; + +RpcList.update_charm = "update_charm"; + +RpcList.setSign = "setSign"; + +RpcList.switchRoomList = "switchRoomList"; + +RpcList.getInfoByShortCode = "getInfoByShortCode"; + +RpcList.optBanList = "optBanList"; +RpcList.getShortCodeRankList = "getShortCodeRankList"; + +RpcList.setAllCharm = "setAllCharm"; +RpcList.getVipRankList = "getVipRankList"; +RpcList.playerBehavior = "playerBehavior"; +RpcList.setVipForbidSelect = "setVipForbidSelect"; + +RpcList.topup_card = "topup_card"; +RpcList.query_player2 = "query_player2"; +RpcList.giveCoin = "giveCoin"; + +RpcList.getPlayerWhiteList = "getPlayerWhiteList"; +RpcList.optWhiteList = "optWhiteList"; + +var h5RpcList={} +h5RpcList.joinRoom = "joinRoom"; +//----------------------------end------------------------------ + +var ClickBtn = [3,5,7,13,14,15,10,11,12,25,17,9,47,51,53,55,58,59,76,60,61,74,75,80,115,183,150,151,153,181,201,202,183,184,185,205,206,207,208,209,210,211,212,166,167,168,169,170,124,127,130, + 133,233,245,246,247,253,248,249,253,256,257,258,259,260,261,262,263,550,177,283,375,391,392,393,394,395,396,397, + 398,399,400,401,402,403,366,367,386,464,234,345,483,484,493,509,512,513,514,515,519,520,521,568,569,570,571,572,579, + 602,626,604,656,661,662,663,664,665,666,667,668,669,670,671,3000,3004,3007,3008,3009,3010,3011,3014,3016,3017,3018,3019, + 3034,3035,3044,3045,3046,3047,3048,3049,3050,3051,3052,3053,3054,3055,3057,3043,3038,3039,3067,3068,3087,3088,3089,3096,3075,3076,3097,3111,3120,92,93,97, + 99,104,105,106,107,3133,3139,3140,3144,3145,3149,3155,3159,679,3182,3184,3175,3194,3195,3199,3214,3215,3205,3206,3210, + 3203,3216,3217,3222,3231,3232,3233,3235,3240,3251,3253,3243,3244,3245,3255,3256,3258,3260,3264,3265,3266,3268,3269,3289,3281,3276,3274]; +var C_PageOne = { + Tag:1, + X:1100, + Y:160, + H:80 +}; +var C_PageTwo = { + Tag:1, + X:1100, + Y:160, + H:80 +}; +var UnClickBtn = [8,50,225,227,228,229,699,161,162,164,165,370,426,427,428,429,430,431,432,433,434,435,446,447,448,449,450,451,452,453,454,455,468,469,470,471,472,473,474,475,476,477,498,499,500,501, +502,503,504,505,506,507,81,573,574,575,629,630,631,632,633,3056,3040,3058,3041,3061,3062,3071,3072,3069,3070,3090,3091,3092,3093,3094,3095,3098,3104,3108,3115,3116,3118,3119, +102,336,337,338,155,154,156,110,111,3127,3128,3141,3142,3146,3147,3151,3157,3099,3197,3212,3237,3246,3247,3248,3249,3250,3291,3280,3288,3283,3279,3292 +]; +var exceptSrc = [115,5,253,338,339,340,21,361,362,363,364,365,366,367,368,369,370,371,372,396]; +var ConstVal=ConstVal||{}; +ConstVal.Max = { + ShowChat:2000, + textlength:20, + headImgTimer:200, + heartbeat:30000 +}; + +ConstVal.Tips={ + width:30, + time:3000, + +}; +ConstVal.Kick={ + text:"网络出现异常!", + tip:"(请重启游戏)" +}; +ConstVal.screenShotParam = 0.7; +ConstVal.ShareTaskId="TJnueK1103Xgwj2o79xM2nvSe0WN6rzp"; + +ConstVal.iMessage={ + text_y1:-60, + text_y2:25, + icon_x:20, + icon_y1:-65, + icon_y2:20, + close_x:1205, + close_y1:-60, + close_y2:25, + bg_y1:-85, + bg_y2:0, + time:500, + x1:85, + x2:1205, + y:0, + h:85, + speed:0.05, + max_length:60 +}; +ConstVal.Emotion = { + //动画帧间隔200 + mode:1,//表情播放时间模式1->按帧数确定时间2->按照show_time_list确定 + count:20, + f_spid:467, + tag:1, + rate:100, + col_num:4,//一行上的个数 + spid_list:[528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547],//表情精灵列表序号对应 + src_list:[147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166],//表情对应资源号 + frame_list:[5,25,31,30,14,7,8,17,3,8,30,14,35,24,23,15,6,24,31,9],//表情对应帧数 + show_time_list:[147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166],//表情播放时间 + x:20, + y:20, + dis_x:20, + dis_y:20, + w:100, + h:100, + clip_x:0, + clip_y:0, + clip_h:0, + clip_w:0 + +} +ConstVal.Com_History = { + //动画帧间隔200 + f_spid:696, + head_tag:1, + page_count:5, + text_width:12.5, + bubble_tag:10000, + content_tag:20000, + time_tag:30000, + time_length:[10,30,60,90,120,300], + bubble_width:[100,140,180,220,260,300,340],//气泡长度 + head_res_id:116, + head_x:20, + head_y:30, + head_h:60, + head_dis_y:35, + time_bubble_dis_x:10, + head_bubble_dis_x:78, + bubble_content_dis_x:25, + head_bubble_dis_y:0, + head_content_1_dis_y:13, + head_content_2_dis_y:13, + time_bubble_dis_y:13, + clip_x:0, + clip_y:0, + clip_h:0, + clip_w:0 + +} +ConstVal.Task = { + f_spid:176,//父精灵 + bg_spid:120,//背景精灵 + task_des_spid:135,//任务描述精灵 + reward_des_spid:307,//任务奖励描述 + proc_bg_spid:311,//任务进度背景 + proc_spid:315,//任务进度前景 + proc_des_spid:319,//任务进度文字描述 + get_reward_btn_spid:124,//领取任务按钮 + isreward_spid:328,//已领取 + tofinish_btn_spid:125,//去完成任务 + //tag值 + bg_tag:1, + task_des_tag:1000, + reward_des_tag:2000, + proc_bg_tag:3000, + proc_tag:4000, + proc_des_tag:5000, + get_reward_btn_tag:6000, + isreward_tag:7000, + tofinish_btn_tag:8000, + //位置 + bg_x:0, + bg_y:0, + bg_w:0,//动态获取 + bg_dis_x:0, + + task_des_x:30, + task_des_y:30, + + reward_des_y:265, + proc_bg_y:380, + proc_y:380, + proc_des_y:380, + get_reward_btn_y:368, + isreward_y:365, + tofinish_btn_y:330, + + clip_x:110, + clip_y:170, + clip_w:0, + clip_h:0 +} +ConstVal.Launch_mode={ + name:"Launchtype", + from_hall:1, + from_self:0 +}; +ConstVal.OS = {//操作系统类型 + apple:1,//苹果 + android:2,//安卓 + winphone:3,//windowsphone + other:4//其他 +}; +ConstVal.InterEffSoundsList = ["00001.mp3","00002.mp3","00003.mp3","00004.mp3"]; +ConstVal.soudsSpidList = [235,13,5,6,7,9,339,11,12,14,15,249,10,376,377,378,379,380,381,382,383,384,385,150,153,151,283,181,513,233,185]; +ConstVal.Broadcast = { + textwidth:18, + speed:0.1, + clip_x:0, + clip_y:0, + clip_w:0, + clip_h:0 +}; +ConstVal.Notice = { + replaceOldWord:"#", + replaceNewWord:"\n", + lineHeight:60, + textHeight:30, + textWidth:14, + clip_x:0, + clip_y:0, + clip_w:725, + clip_h:450, + img_clip_x:366, + img_clip_y:156, + img_clip_w:765, + img_clip_h:483, +}; +ConstVal.payConfig = { + enablePay:false +}; + +ConstVal.loginButton = { + key:"loginimage", + type1:[1,22],//0->类型值 1->图片资源ID + type2:[2,203] +} + +ConstVal.userAgent = { + paraName:"", + uAgent_1:1, + uAgent_2:2, + uAgent_3:3 +}; +ConstVal.worldRoom = { + f_sp_1:522, + f_sp_2:523, + bg_sp_1:524, + bg_sp_2:525, + top_sp_1:526, + top_sp_2:563, + des_sp_1:527, + des_sp_2:564, + starbg_sp_1:566, + starbg_sp_2:567, + star_sp_1:562, + star_sp_2:565, + mult_sp_1:3020, + mult_sp_2:3021, + join_sp_1:3022, + join_sp_2:3023, + pCount_sp_1:3024, + leave_sp_2:3025, + topImg_sp:96, + title_sp:3165, + + multIcon_sp:94, + multImg_sp:95, + imgList:[361,362,363,364,365,366,367,368,369,370,371,372], + multIcon_y:100, + multImg_y:119, + topImg_y:25, + multImgWidth:25, + multIconImgSpace:20, + + pCountIcon_sp_2:3026, + pCount_sp_2:3027, + roomCode_sp_2:3028, + + + bg_sp_tag_1:1, + top_sp_tag_1:2000, + des_sp_tag_1:4000, + starbg_sp_tag_1:6000, + star_sp_tag_1:8000, + mult_sp_tag_1:10000, + pCount_sp_tag_1:12000, + join_sp_tag_1:14000, + multIcon_tag:16000, + multImg_tag:18000, + topImg_tag:20000, + + + bg_sp_tag_2:1, + top_sp_tag_2:2000, + des_sp_tag_2:4000, + starbg_sp_tag_2:6000, + star_sp_tag_2:8000, + mult_sp_tag_2:10000, + leave_sp_tag_2:12000, + roomCode_sp_tag_2:14000, + pCountIcon_sp_tag_2:16000, + join_sp_tag_2:18000, + pCount_sp_tag_2:20000, + title_tag:40000, + + clip_x_1:0, + clip_x_2:0, + clip_y_1:0, + clip_y_2:0, + clip_w_1:1050, + clip_w_2:1150, + clip_h_1:512, + clip_h_2:465, + + bg_sp_x_1:0, + bg_sp_x_2:0, + bg_sp_y_1:0, + bg_sp_y_2:0, + //bg_sp_y_2:43, + bg_sp_space_1:6, + bg_sp_space_2:15, + top_sp_x_1:25, + top_sp_x_2:25, + top_sp_y_1:35, + top_sp_y_2:20, + top_sp_width_1:20, + top_sp_width_2:13, + top_sp_space_1:6, + top_sp_space_2:6, + des_sp_x_1:25, + des_sp_x_2:30, + title_sp_x:20, + title_sp_y:3, + des_sp_y_1:80, + des_sp_y_2:45, + des_sp_width_1:11, + des_sp_width_2:11, + des_sp_space_1:6, + des_sp_space_2:6, + + //mult_sp_x_1:10000, + pCount_sp_x_1:80, + join_sp_x_1:302,//靠右显示 + mult_sp_y_1:74, + pCount_sp_y_1:193, + join_sp_y_1:193, + + mult_sp_x_2:30, + roomCode_sp_x_2:775, + pCountIcon_sp_x_2:170, + join_sp_x_2:700,//靠右显示 + leave_sp_x_2:700,//靠右显示 + + pCountIcon_pCount_space_2:10, + pCount_space_2:8, + + //mult_sp_y_2:72, + //roomCode_sp_y_2:25, + //pCountIcon_sp_y_2:76, + //join_sp_y_2:72, + //leave_sp_y_2:23, + //pCount_sp_y_2:81, + + mult_sp_y_2:92, + roomCode_sp_y_2:45, + pCountIcon_sp_y_2:96, + join_sp_y_2:92, + leave_sp_y_2:45, + pCount_sp_y_2:101, + + + starbg_sp_x_1:35, + starbg_sp_x_2:35, + starbg_sp_y_1:182, + starbg_sp_y_2:182, + starbg_sp_space_1:6, + starbg_sp_space_2:6, + + star_sp_x_1:35, + star_sp_x_2:35, + star_sp_y_1:189, + star_sp_y_2:189, + star_sp_space_1:6, + star_sp_space_2:6, + + mult_sp_w_1:13, + join_sp_w_1:10, + + join_sp_w_2:12, + leave_sp_w_2:12, + mult_sp_w_2:13, + roomCode_sp_w_2:16, + + bgSpaceX:438, + bgSpaceY:250, +}; +ConstVal.snrRoomList ={ + f_spid:611, + bg_spid:622, + rcode_bg_spid:623, + rcode_spid:624, + close_spid:625, + update_spid:626, + switch_spid:627, + info_spid:600, + profit_spid:601, + video_spid:3138, + + bg_tag:1, + rcode_bg_tag:200, + rcode_tag:400, + close_tag:600, + update_tag:800, + switch_tag:1000, + info_tag:1200, + profit_tag:1400, + video_tag:1600, + + clip_x:0, + clip_y:0, + clip_w:900, + clip_h:0, + + bg_x:15, + rcode_bg_x:33, + rcode_x:35, + close_x:70, + update_x:20, + switch_x:150, + info_x:35, + profit_x:150, + video_x:420, + + bg_y:10, + rcode_bg_y:260, + rcode_y:28, + close_y:260, + update_y:90, + switch_y:90, + info_y:80, + profit_y:25, + video_y:20, + + profit_w:12, + + bg_space:5, + rcode_bg_space:35, + rcode_space:50, + close_space:300, + update_space:400, + switch_space:500, + + bksp:3137, + + +}; +ConstVal.rankList ={ + f_spid:609, + bg_spid:610, + badge_spid:629, + headimg_spid:630, + headfront_spid:631, + name_spid:632, + star_spid:633, + + bg_tag:1, + badge_tag:100, + headimg_tag:200, + headfront_tag:300, + name_tag:400, + star_tag:500, + + clip_x:0, + clip_y:0, + clip_w:0, + clip_h:511, + + bg_x:0, + badge_x:-20, + headimg_x:93, + headfront_x:85, + name_x:190, + star_x:190, + + bg_y:0, + badge_y:-5, + headimg_y:12, + headfront_y:5, + name_y:8, + star_y:42, + + + space:13, + + headsrc:262 + +}; +ConstVal.MenuScene = { + createBtn_1:[780,182],//有星星场 + joinBtn_1:[780,320], + starBtn:[780,458], + createBtn_2:[780,230], + joinBtn_2:[780,405] +}; +//仓库 +ConstVal.wareHouse = { + tableBgX:[41,33], + tableTextX:[57,51], + passWordLength:6, +}; +ConstVal.sysNotice = { + f_spid:3109, + bubble_spid:163, + msg_spid:3110, + + msg_width:11, + msg_tag:50000, + msg_rOld:"#", + msg_rNew:"\n", + lineHeight:25, + limit:10000, + bubble_tag:1, + x:20, + y:20, + spaceX:40, + spaceY:40, + + bm_space_x:20, + bm_space_y:35, + + + lineSpace:30,// 行距 + noteSpace:40,//每条的距离 + clip_x:0, + clip_y:0, + clip_h:0, + clip_w:0 +} +ConstVal.starConfig = { + resList:[214,214], +} +ConstVal.Animation = { + time1:1200, + time2:2000, + fundTime:5230, + deltaTime:1000, +}; +ConstVal.myRoomList ={ + maxLength:5, + fSpid:98, + + bgSp:100, + roomCodeSp:102, + + bgTag:1, + roomCodeTag:100, + placeX:0, + placeY:95, + bgX:8, + bgY:55, + space:5, + + rCodeX:140, + rCodeY:85, + //clip_x:8, + //clip_y:160, + //clip_w:265, + //clip_h:450, + + roomCodeWidth:14, +} +ConstVal.netType = 0; +ConstVal.isGameHall = false; + +ConstVal.vipRoomList1 = { + f_spid:3172, + bg_spid:3176, + title_spid:3177, + code_spid:3178, + owner_spid:3179, + count_spid:3180, + del_spid:3181, + des_spid:3189, + enter_spid:3192, + + bg_tag:1, + title_tag:1000, + code_tag:2000, + owner_tag:3000, + count_tag:4000, + des_tag:5000, + del_tag:6000, + enter_tag:7000, + + clip_x:0, + clip_y:0, + clip_w:0, + clip_h:460, + + space:199, + + title_x:20, + code_x:70, + des_x:25, + owner_x:270, + count_x:525, + del_x:583, + enter_x:514, + + title_y:3, + code_y:148, + des_y:50, + owner_y:146, + count_y:146, + del_y:0, + enter_y:42, + +} +ConstVal.vipRoomList2 = { + f_spid:3185, + bg_spid:3186, + code_spid:3187, + count_spid:3188, + + bg_tag:1, + code_tag:1000, + count_tag:2000, + + clip_x:0, + clip_y:0, + clip_w:0, + clip_h:460, + + spaceX:285, + spaceY:145, + + code_x:56, + count_x:50, + + + code_y:25, + count_y:65, + + countW:12, + +} +ConstVal.blackList = { + f_spid:3204, + bg_spid:3207, + id_spid:3209, + del_spid:3208, + + bg_tag:1, + id_tag:10000, + del_tag:20000, + + clip_x:0, + clip_y:0, + clip_w:0, + clip_h:0, + + id_x:25, + del_x:330, + + id_y:12, + del_y:4, + + space:8, + + + +}; + +ConstVal.vipRank = { + f_spid:3227, + bg_spid:3223, + txt_spid:3229, + rank_spid:3228, + score_spid:3230, + + bg_tag:1, + txt_tag:10000, + rank_tag:20000, + score_tag:30000, + + clip_x:0, + clip_y:0, + clip_w:0, + clip_h:0, + + txt_x:70, + rank_x:0, + score_x:230, + + txt_y:10, + rank_y:4, + score_y:10, + + rank_space:10, + + space:8, + rank_w:25, + + +}; +ConstVal.whiteList = { + f_spid:3272, + bg_spid:3277, + id_spid:3279, + del_spid:3278, + charm_spid:3292, + + bg_tag:1, + id_tag:10000, + del_tag:20000, + charm_tag:30000, + + clip_x:0, + clip_y:0, + clip_w:0, + clip_h:0, + + id_x:25, + del_x:450, + charm_x:200, + + id_y:12, + del_y:4, + charm_y:12, + + + space:8, + + + +}; + + + + diff --git a/client/js/00_Surface/03_Banwords.js b/client/js/00_Surface/03_Banwords.js new file mode 100644 index 0000000..f6deaf7 --- /dev/null +++ b/client/js/00_Surface/03_Banwords.js @@ -0,0 +1,3 @@ +var banwords = "毛泽东、周恩来、刘少奇、朱德、彭德怀、林彪、刘伯承、陈毅、贺龙、聂荣臻、徐向前、罗荣桓、叶剑英、李大钊、陈独秀、孙中山、孙文、孙逸仙、邓小平、陈云、江泽民、李鹏、朱镕基、李瑞环、尉健行、李岚清、胡锦涛、罗干、温家宝、吴邦国、曾庆红、贾庆林、黄菊、吴官正、李长春、吴仪、回良玉、曾培炎、曹刚川、唐家璇、华建敏、陈至立、张德江、俞正声、王乐泉、刘云山、王刚、王兆国、刘淇、贺国强、郭伯雄、胡耀邦、王乐泉、王兆国、习近平、李克强、张高丽、刘延东、彭丽媛、王岐山、华国锋、胡耀邦、习大大、吴帮国、无帮国、无邦国、无帮过、瘟家宝、假庆林、甲庆林、假青林、离长春、习远平、袭近平、李磕墙、贺过墙、和锅枪、胡主席、习主席、毛主席、布什、布莱尔、小泉、纯一郎、萨马兰奇、安南、阿拉法特、普京、默克尔、克林顿、里根、尼克松、林肯、杜鲁门、赫鲁晓夫、列宁、斯大林、马克思、恩格斯、金正日、金日成、萨达姆、胡志明、西哈努克、希拉克、撒切尔、阿罗约、曼德拉、卡斯特罗、富兰克林、华盛顿、艾森豪威尔、拿破仑、亚历山大、路易、拉姆斯菲尔德、劳拉、鲍威尔、奥巴马、梅德韦杰夫、金正恩、安倍晋三、本拉登、奥马尔、柴玲、达赖、达赖喇嘛、江青、张春桥、姚文元、王洪文、东条英机、希特勒、墨索里尼、冈村秀树、法图麦、赫蒂彻、冈村宁次、高丽朴、赵紫阳、王丹、沃尔开西、李洪志、李大师、赖昌星、马加爵、班禅、额尔德尼、山本五十六、阿扁、阿扁万岁、热那亚、薄熙来、周永康、王立军、令计划、默罕默德、徐才厚、粥永康、轴永康、肘永康、周健康、粥健康、周小康、陈良宇、李登辉、连战、宋楚瑜、吕秀莲、郁慕明、蒋介石、蒋中正、蒋经国、马英九、新疆势力、蔡英文、六四、六四运动、东方闪电、茉莉花、美国之音、密宗、民国、民进党、民运、民主、民主潮、摩门教、纳粹、南华早报、南蛮、明慧网、起义、亲民党、瘸腿帮、人民报、法轮功、法轮大法、打倒共产党、台独万岁、圣战、示威、台独、台独分子、台联、台湾民国、台湾岛国、台湾国、台湾独立、太子党、天安门事件、屠杀、小泉、新党、新疆独立、新疆分裂、新疆国、疆独、西藏独立、西藏分裂、西藏国、藏独、藏青会、藏妇会、学潮、学运、一党专政、一中一台、两个中国、一贯道、游行、圆满、造反、真善忍、镇压、政变、政治、政治反对派、政治犯、中共、共产党、反党、反共、政府、民主党、中国之春、转法轮、自焚、共党、共匪、苏家屯、基地组织、塔利班、东亚病夫、支那、高治联、高自联、专政、专制、四人帮、新闻管制、核工业基地、核武器、铀、原子弹、氢弹、导弹、核潜艇、大参考、小参考、国内动态清样、东突、中央电视台、南海仲裁、雪山狮子旗、占领中环、两国论、一边一国、赤匪、道教、多维、佛教、佛祖、释迦牟尼、如来、阿弥陀佛、观世音、普贤、文殊、地藏、河殇、回教、密宗、摩门教、穆罕默德、穆斯林、升天、圣母、圣战、耶和华、耶稣、伊斯兰、真主安拉、白莲教、天主教、基督教、东正教、大法、法轮、法轮功、瘸腿帮、真理教、真善忍、转法轮、自焚、走向圆满、黄大仙、风水、跳大神、神汉、神婆、真理教、大卫教、阎王、黑白无常、牛头马面、藏独、高丽棒子、回回、疆独、蒙古鞑子、台独、台独分子、台联、台湾民国、西藏独立、新疆独立、南蛮、老毛子、回民吃猪肉、蒙古独立、全能神、谋杀、杀人、吸毒、贩毒、赌博、拐卖、走私、卖淫、造反、监狱、强奸、轮奸、抢劫、先奸后杀、枪支弹药、下注、押大、押小、抽头、坐庄、赌马、赌球、筹码、老虎机、轮盘赌、安非他命、大麻、可卡因、海洛因、冰毒、摇头丸、杜冷丁、鸦片、罂粟、迷幻药、白粉、嗑药、卖枪支弹药、K粉、k粉、冰粉、毒品、屄、肏、屌、马的、马白勺、妈的、妈白勺、女马ㄉ、女马的、女马白勺、操你、操妳、操他、操人也、操她、操女也、干你、干妳、干他、干人也、干她、干女也、超你、超妳、超他、超人也、超她、超女也、屌你、屌我、屌妳、屌他、屌人也、屌她、屌女也、凸你、凸我、凸妳、凸他、凸人也、凸她、凸女也、插你、插他、插我、插她、插妳、臭你、臭妳、臭他、臭人也、臭她、臭女也、机八、鸡八、G八、G八、机巴、鸡巴、G巴、G巴、机叭、鸡叭、G叭、G叭、机芭、鸡芭、G芭、G芭、机掰、鸡掰、G掰、G掰、机Y、机Y、鸡Y、鸡Y、机8、鸡8、靠爸、靠母、哭爸、哭母、靠北、老GY、老GY、干GY、干GY、操GY、操GY、超GY、超GY、臭GY、臭GY、干七八、干78、干78、操七八、操78、操78、超七八、超78、超78、臭七八、臭78、臭78、懒叫、懒教、妈B、鸡巴、我日、婊、屌、璩美凤、操你、阴茎、妈的、日你、阴道、干你、干死、强奸、你妈、TNND、幼齿、干死你、作爱、阝月、歇逼、蛤蟆、发骚、招妓、阴唇、操你妈、精子、奸淫、菜逼、奶奶的、日死你、贱人、江八点、你娘、肛交、破鞋、贱逼、娘的、狗卵子、骚货、操蛋、大比、龟公、穷逼、欠日、狗b、牛逼、装逼、妈批、欠操、我操你、烂逼、你爸、屁眼、密穴、鸡奸、群奸、烂比、牛比、喷你、大b、小b、性欲、你大爷、淫荡、轮奸、中国猪、狂操、插你、婊子、我操、淫秽、江猪媳、狗屎、十八摸、操逼、二B、猪毛、狗操、奶子、大花逼、逼样、去你妈的、完蛋操、下贱、淫穴、猪操、妓女、阴水、操比、精液、卖比、16dy-图库、獸交、爱女人、拔出来、操b、插进、插我、插穴、吃精、抽插、大乳、调教、黄色电影、激情电影、轮暴、迷奸、乳房、色猫、色欲、性爱图库、亚情、淫亂、淫女、淫蕩、淫水、淫汁、幼圖、中文搜性网、自慰、鷄巴、學生妹、18歲淫亂、999日本妹、幹炮、摸阴蒂、金鳞岂是池中物、掰穴皮卡丘、白虎少妇、白虎阴穴、包二奶、暴淫、逼痒、蕩妹、肥逼、粉穴、干穴、开苞、口活、狼友、春药、风艳阁、激情小说、兽欲、全裸、秘唇、蜜穴、玉穴、应召、菊花蕾、大力抽送、干的爽、肉蒲团、后庭、淫叫、男女交欢、极品波霸、兽奸、流淫、销魂洞、操烂、成人网站、淫色、一夜欢、姦淫、给你爽、偷窥图片、性奴、大奶头、奸幼、中年美妇、豪乳、喷精、逼奸、脱内裤、发浪、浪叫、肉茎、菊花洞、成人自拍、自拍美穴、抠穴、颜射、肉棍、淫水爱液、阴核、露B、母子奸情、人妻熟女、色界、丁香社区、爱图公园、色色五月天、鹿城娱乐、色色、幼香阁、隐窝窝、乱伦熟女网、插阴、露阴照、美幼、97sese、嫩鲍鱼、日本AV女优、美女走光、33bbb走光、激情贴图、成人论坛、就去诱惑、浴室自拍、BlowJobs、激情裸体、丽春苑、窝窝客、银民吧、亚洲色、碧香亭、爱色cc、妹妹骚图、宾馆女郎、美腿丝足、好色cc、无码长片、淫水涟涟、放荡少妇、成人图片、黄金圣水、脚交、勾魂少妇、女尻、我要性交、SM女王、乳此丝袜、日本灌肠、集体性爱、国产骚货、操B指南、亚洲淫娃、熟女乱伦、SM舔穴、無碼H漫、大胆少女、乳此丰满、屄屄特写、熟女颜射、要色色、耻辱轮奸、巨乳素人、妩媚挑逗、骚姨妈、裸体少妇、美少妇、射奶、杨思敏、野外性交、风骚淫荡、白虎嫩B、明星淫图、淫乱熟女、高清性愛、高潮集锦、淫兽学园、俏臀摄魄、有容奶大、无套内射、毛鲍、3P炮图、性交课、激凸走光、性感妖娆、人妻交换、监禁陵辱、生徒胸触、東洋屄、翘臀嫩穴、春光外泻、淫妇自慰、本土无码、淫妻交换、日屄、近亲相奸、艳乳、白虎小穴、肛门喷水、淫荡贵妇、鬼畜轮奸、浴室乱伦、生奸内射、国产嫖娼、白液四溅、带套肛交、大乱交、精液榨取、性感乳娘、魅惑巨乳、无码炮图、群阴会、人性本色、极品波神、淫乱工作、白浆四溅、街头扒衣、口内爆射、嫩BB、肛门拳交、灌满精液、莲花逼、自慰抠穴、人妻榨乳、拔屄自拍、洗肠射尿、人妻色诱、淫浆、狂乳激揺、騷浪、射爽、蘚鮑、制服狩、無毛穴、骚浪美女、肏屄、舌头穴、人妻做爱、插逼、爆操、插穴止痒、骚乳、食精、爆乳娘、插阴茎、黑毛屄、肉便器、肉逼、淫亂潮吹、母奸、熟妇人妻、発射、幹砲、性佣、爽穴、插比、嫩鲍、骚母、吃鸡巴、金毛穴、体奸、爆草、操妻、a4u、酥穴、屄毛、厕所盗摄、艳妇淫女、掰穴打洞、盗撮、薄码、少修正、巧淫奸戏、成人片、换妻大会、破处、穴爽、g点、欢欢娱乐时空、近親相姦、裤袜、乱伦、买春、妹妹阴毛、免费成人网站、免费偷窥网、免费A片、摩洛客、嫩b、捏弄、女优、肉棒、骚姐姐、色区、色书库、射颜、手淫、兽交、吸精少女、下流地带、性虎、性饥渴、阴部、淫妹、淫图、幼交、欲火、援交妹、嫩屄、嫩女、噴精、情色天崖、情色文学、群交亂舞、日本骚货、肉唇、肉沟、肉棍干骚妇、肉壶、肉淫器吞精、骚妹、骚女、骚水、骚穴、色狐狸网址、色狼论坛、色狼小说、湿穴、爽死我了、舔逼、舔屁眼、好嫩、大波、亂倫、做爱电影、色诱、秘裂、采花堂、含屌、亚洲性虐、夫妻自拍、熟女、操穴、裹本、淫妇、嫩逼、淫贱、欢乐性今宵、巨乳、性愛圖片、学生妹、炮友之家、花花公子、一夜情、乳沟、淫虫、叫床、porn、小姐打飞机、少女被插、X到噴屎尿、口淫、按摩棒、操我、奸情、被干、露逼、美女高潮、日逼、肉洞、阴缔、插暴、人妻、内射、肉具、欲仙欲浪、玉乳、被插、吞精、暴乳、成人午夜场、买春堂、性之站、成人社区、群交、激情聊天、三八淫、做爱自拍、淫妻、夫妻俱乐部、激情交友、诱色uu、就去色色、熟妇、mm美图、走光偷拍、77bbb、虎骑、咪咪图片、成人导航、深爱色色、厕所偷拍、成人A片、夫妻多p、我就色、释欲、你色吗、裙内偷拍、男女蒲典、色97爱、丝诱、人妻自拍、色情工厂、色色婷婷、美体艳姿、颜射自拍、熟母、肉丝裤袜、sm调教、打野炮、赤裸天使、淫欲世家、就去日、爱幼阁、巨屌、花样性交、裸陪、夫妻3p、大奶骚女、性愛插穴、日本熟母、幼逼、淫水四溅、大胆出位、旅馆自拍、无套自拍、快乐AV、国产无码、强制浣肠、援交自拍、凸肉优、撅起大白腚、骚妹妹、插穴手淫、双龙入洞、美女吞精、处女开包、调教虐待、淫肉诱惑、激情潮喷、骚穴怒放、馒头屄、无码丝袜、写真、寂寞自摸、警奴、轮操、淫店、精液浴、淫乱诊所、极品奶妹、惹火身材、暴力虐待、巨乳俏女医、扉之阴、淫の方程式、丁字裤翘臀、轮奸内射、空姐性交、美乳斗艳、舔鸡巴、骚B熟女、淫丝荡袜、奴隷调教、阴阜高耸、翘臀嫩逼、口交放尿、媚药少年、暴奸、无修正、国产AV、淫水横流、插入内射、东热空姐、大波粉B、互舔淫穴、丝袜淫妇、乳此动人、大波骚妇、无码做爱、口爆吞精、放荡熟女、巨炮兵团、叔嫂肉欲、肉感炮友、爱妻淫穴、无码精选、超毛大鲍、熟妇骚器、内射美妇、毒龙舔脚、性爱擂台、圣泉学淫、性奴会、密室淫行、亮屄、操肿、无码淫女、玩逼、淫虐、我就去色、淫痴、风骚欲女、亮穴、操穴喷水、幼男、肉箫、巨骚、骚妻、漏逼、骚屄、大奶美逼、高潮白浆、性战擂台、淫女炮图、小穴、淫水横溢、性交吞精、姦染、淫告白、乳射、操黑、朝天穴、公媳乱、女屄、慰春情、集体淫、淫B、屄屄、肛屄、小嫩鸡、舔B、嫩奶、a4y、品穴、淫水翻騰、一本道、乳尻、羞耻母、艳照、三P、露毛、紧穴、露点、18禁、g片、teen、無碼電影、爱液、插b、赤裸、荡妇、荡女、浪穴、露穴、美穴、猛插、迷药、嫩穴、肉穴、乳交、乳头、无码、吸精、现代情色小说、性交图、性息、艳情小说、阴部特写、阴道图片、淫书、幼女、玉蒲团玉女心经、援助交易、中国成人论坛、中国性爱城、自拍写真、做爱图片、掰穴、万淫堂、穴图、穴淫、艳舞淫业、咬着龟头、要射了、一夜性网、阴茎插小穴、陰穴新玩法、婬乱军团、淫逼、淫姐、淫浪、淫流、淫糜、淫蜜、淫魔、淫母、淫妞、淫奴、淫娃、淫液、钻插、H动漫、交换夫妻、美腿、舔脚、蜜洞、丝袜、淫情、亚洲情色网、强奸处女、鸡巴暴胀、美乳、大众色情成人网、火辣图片、淫声浪语、疯狂抽送、淫河、强暴、多人性愛、操屄、浪女、色情论坛、性虎色网、淫欲日本、操死、色迷城、petgirl、骚女叫春、成人百强、猖妓、天天干贴图、密穴贴图、凌辱、偷欢、小逼、酥痒、品色堂、浪妇、嫖妓指南、肉缝、色窝窝、被操、巨奶、骚洞、阴精、阴阜、阴屄、群魔色舞、扒穴、六月联盟、55sss偷拍区、张筱雨、xiao77、极品黑丝、丝袜写真、黄网、天天情色、成人小说、成人文学、情色艺术天空、222se图片、偷拍、淫色贴图、厕奴、美女成人、酥胸诱惑、五月天、人体摄影、东北xx网、玛雅网、成人bt、周六性吧、爆乳、诱惑视频、裙下风光、嘻游中国、操母狗、御の二代目、丝袜足交、肮脏美学、亚洲有码、欲仙欲死、丝袜高跟、偷拍美穴、原味丝袜、裸露自拍、针孔偷拍、放荡少妇宾馆、性感肉丝、拳交、迫奸、品香堂、北京xx网、虐奴、情色导航、欧美大乳、欧美无套、骚妇露逼、炮友、淫水丝袜、母女双飞、老少乱伦、幼妓、素人娘、前凸后翘、制服誘惑、舔屄、色色成人、迷奸系列、性交无码、惹火自拍、胯下呻吟、淫驴屯、少妇偷情、护士诱惑、群奸乱交、极品白虎、曲线消魂、淫腔、无码淫漫、假阳具插穴、蝴蝶逼、自插小穴、SM援交、西洋美女、爱液横流、无码无套、淫战群P、口爆、酒店援交、乳霸、湿身诱惑、火辣写真、动漫色图、熟女护士、粉红穴、经典炮图、童颜巨乳、性感诱惑、援交薄码、美乳美穴、奇淫宝鉴、美骚妇、跨下呻吟、无毛美少女、流蜜汁、日本素人、爆乳人妻、妖媚熟母、日本有码、激情打炮、制服美妇、无码彩图、放尿、入穴一游、丰唇艳姬、群奸轮射、高级逼、MM屄、美臀嫰穴、淫东方、国产偷拍、清晰内射、嫩穴肉缝、雪腿玉胯、骚妇掰B、白嫩骚妇、梅花屄、猛操狂射、潮喷、无码体验、吞精骚妹、紧缚凌辱、奸淫电车、堕淫、颜骑、互淫、逼毛、胸濤乳浪、夫妻乱交、黑屄、奶大屄肥、拔屄、穴海、换妻杂交、狂插、黑逼、粉屄、口射、多人轮、奶挺臀翘、扒屄、痴乳、鬼輪姦、乳爆、浴尿、淫样、発妻、姫辱、插后庭、操爽、嫩缝、操射、骚妈、激插、暴干、母子交欢、嫐屄、足脚交、露屄、柔阴术、相奸、淫师荡母、欠干、桃园蜜洞、二穴中出、奴畜抄、连続失禁、大鸡巴、玩穴、性交自拍、叫鸡、骚浪人妻、妈B、鸡巴、我日、婊、屌、璩美凤、操你、阴茎、妈的、日你、阴道、干你、干死、强奸、你妈、TNND、幼齿、干死你、作爱、阝月、歇逼、蛤蟆、发骚、招妓、阴唇、操你妈、精子、奸淫、菜逼、奶奶的、日死你、贱人、江八点、你娘、肛交、破鞋、贱逼、娘的、狗卵子、骚货、操蛋、大比、龟公、穷逼、欠日、狗b、牛逼、妈批、欠操、我操你、烂逼、你爸、屁眼、密穴、鸡奸、群奸、烂比、牛比、喷你、大b、小b、性欲、你大爷、淫荡、轮奸、中国猪、狂操、插你、婊子、我操、淫秽、江猪媳、狗屎、十八摸、操逼、二B、猪毛、狗操、奶子、大花逼、逼样、去你妈的、完蛋操、下贱、淫穴、猪操、妓女、阴水、操比、精液、卖比、16dy-图库、獸交、爱女人、拔出来、操b、插进、插我、插穴、吃精、抽插、大乳、调教、黄色电影、激情电影、轮暴、迷奸、乳房、色猫、色欲、性爱图库、亚情、淫亂、淫女、淫蕩、淫水、淫汁、幼圖、中文搜性网、自慰、鷄巴、學生妹、18歲淫亂、999日本妹、幹炮、摸阴蒂、金鳞岂是池中物、掰穴皮卡丘、白虎少妇、白虎阴穴、包二奶、暴淫、逼痒、蕩妹、肥逼、粉穴、干穴、开苞、口活、狼友、春药、风艳阁、激情小说、兽欲、全裸、秘唇、蜜穴、玉穴、应召、菊花蕾、大力抽送、干的爽、肉蒲团、后庭、淫叫、男女交欢、极品波霸、兽奸、流淫、销魂洞、操烂、成人网站、淫色、一夜欢、姦淫、给你爽、偷窥图片、性奴、大奶头、奸幼、中年美妇、豪乳、喷精、逼奸、脱内裤、发浪、浪叫、肉茎、菊花洞、成人自拍、自拍美穴、抠穴、颜射、肉棍、淫水爱液、阴核、露B、母子奸情、人妻熟女、色界、丁香社区、爱图公园、色色五月天、鹿城娱乐、色色、幼香阁、隐窝窝、乱伦熟女网、插阴、露阴照、美幼、97sese、嫩鲍鱼、日本AV女优、美女走光、33bbb走光、激情贴图、成人论坛、就去诱惑、浴室自拍、BlowJobs、激情裸体、丽春苑、窝窝客、银民吧、亚洲色、碧香亭、爱色cc、妹妹骚图、宾馆女郎、美腿丝足、好色cc、无码长片、淫水涟涟、放荡少妇、成人图片、黄金圣水、脚交、勾魂少妇、女尻、我要性交、SM女王、乳此丝袜、日本灌肠、集体性爱、国产骚货、操B指南、亚洲淫娃、熟女乱伦、SM舔穴、無碼H漫、大胆少女、乳此丰满、屄屄特写、熟女颜射、要色色、耻辱轮奸、巨乳素人、妩媚挑逗、骚姨妈、裸体少妇、美少妇、射奶、杨思敏、野外性交、风骚淫荡、白虎嫩B、明星淫图、淫乱熟女、高清性愛、高潮集锦、淫兽学园、俏臀摄魄、有容奶大、无套内射、毛鲍、3P炮图、性交课、激凸走光、性感妖娆、人妻交换、监禁陵辱、生徒胸触、東洋屄、翘臀嫩穴、春光外泻、淫妇自慰、本土无码、淫妻交换、日屄、近亲相奸、艳乳、白虎小穴、肛门喷水、淫荡贵妇、鬼畜轮奸、浴室乱伦、生奸内射、国产嫖娼、白液四溅、带套肛交、大乱交、精液榨取、性感乳娘、魅惑巨乳、无码炮图、群阴会、人性本色、极品波神、淫乱工作、白浆四溅、街头扒衣、口内爆射、嫩BB、肛门拳交、灌满精液、莲花逼、自慰抠穴、人妻榨乳、拔屄自拍、洗肠射尿、人妻色诱、淫浆、狂乳激揺、騷浪、射爽、蘚鮑、制服狩、無毛穴、骚浪美女、肏屄、舌头穴、人妻做爱、插逼、爆操、插穴止痒、骚乳、食精、爆乳娘、插阴茎、黑毛屄、肉便器、肉逼、淫亂潮吹、母奸、熟妇人妻、発射、幹砲、性佣、爽穴、插比、嫩鲍、骚母、吃鸡巴、金毛穴、体奸、爆草、操妻、a4u、酥穴、屄毛、厕所盗摄、艳妇淫女、掰穴打洞、盗撮、薄码、少修正、巧淫奸戏、成人片、换妻大会、破处、穴爽、g点、欢欢娱乐时空、近親相姦、裤袜、乱伦、买春、妹妹阴毛、免费成人网站、免费偷窥网、免费A片、摩洛客、嫩b、捏弄、女优、肉棒、骚姐姐、色区、色书库、射颜、手淫、兽交、吸精少女、下流地带、性虎、性饥渴、阴部、淫妹、淫图、幼交、欲火、援交妹、嫩屄、嫩女、噴精、情色天崖、情色文学、群交亂舞、日本骚货、肉唇、肉沟、肉棍干骚妇、肉壶、肉淫器吞精、骚妹、骚女、骚水、骚穴、色狐狸网址、色狼论坛、色狼小说、湿穴、爽死我了、舔逼、舔屁眼、好嫩、大波、亂倫、做爱电影、色诱、秘裂、采花堂、含屌、亚洲性虐、夫妻自拍、熟女、操穴、裹本、淫妇、嫩逼、淫贱、欢乐性今宵、巨乳、性愛圖片、学生妹、炮友之家、花花公子、一夜情、乳沟、淫虫、叫床、porn、小姐打飞机、少女被插、X到噴屎尿、口淫、按摩棒、操我、奸情、被干、露逼、美女高潮、日逼、肉洞、阴缔、插暴、人妻、内射、肉具、欲仙欲浪、玉乳、被插、吞精、暴乳、成人午夜场、买春堂、性之站、成人社区、群交、激情聊天、三八淫、做爱自拍、淫妻、夫妻俱乐部、激情交友、诱色uu、就去色色、熟妇、mm美图、走光偷拍、77bbb、虎骑、咪咪图片、成人导航、深爱色色、厕所偷拍、成人A片、夫妻多p、我就色、释欲、你色吗、裙内偷拍、男女蒲典、色97爱、丝诱、人妻自拍、色情工厂、色色婷婷、美体艳姿、颜射自拍、熟母、肉丝裤袜、sm调教、打野炮、赤裸天使、淫欲世家、就去日、爱幼阁、巨屌、花样性交、裸陪、夫妻3p、大奶骚女、性愛插穴、日本熟母、幼逼、淫水四溅、大胆出位、旅馆自拍、无套自拍、快乐AV、国产无码、强制浣肠、援交自拍、凸肉优、撅起大白腚、骚妹妹、插穴手淫、双龙入洞、美女吞精、处女开包、调教虐待、淫肉诱惑、激情潮喷、骚穴怒放、馒头屄、无码丝袜、啪啪啪、写真、寂寞自摸、警奴、轮操、淫店、精液浴、淫乱诊所、极品奶妹、惹火身材、暴力虐待、巨乳俏女医、扉之阴、淫の方程式、丁字裤翘臀、轮奸内射、空姐性交、美乳斗艳、舔鸡巴、骚B熟女、淫丝荡袜、奴隷调教、阴阜高耸、翘臀嫩逼、口交放尿、媚药少年、暴奸、无修正、国产AV、淫水横流、插入内射、东热空姐、大波粉B、互舔淫穴、丝袜淫妇、乳此动人、大波骚妇、无码做爱、口爆吞精、放荡熟女、巨炮兵团、叔嫂肉欲、肉感炮友、爱妻淫穴、无码精选、超毛大鲍、熟妇骚器、内射美妇、毒龙舔脚、性爱擂台、圣泉学淫、性奴会、密室淫行、亮屄、操肿、无码淫女、玩逼、淫虐、我就去色、淫痴、风骚欲女、亮穴、操穴喷水、幼男、肉箫、巨骚、骚妻、漏逼、骚屄、大奶美逼、高潮白浆、性战擂台、淫女炮图、小穴、淫水横溢、性交吞精、姦染、淫告白、乳射、操黑、朝天穴、公媳乱、女屄、慰春情、集体淫、淫B、屄屄、肛屄、小嫩鸡、舔B、嫩奶、a4y、品穴、淫水翻騰、一本道、乳尻、羞耻母、艳照、三P、露毛、紧穴、露点、18禁、g片、teen、無碼電影、爱液、插b、赤裸、荡妇、荡女、浪穴、露穴、美穴、猛插、迷药、嫩穴、肉穴、乳交、乳头、无码、吸精、现代情色小说、性交图、性息、艳情小说、阴部特写、阴道图片、淫书、幼女、玉蒲团玉女心经、援助交易、中国成人论坛、中国性爱城、自拍写真、做爱图片、掰穴、万淫堂、穴图、穴淫、艳舞淫业、咬着龟头、要射了、一夜性网、阴茎插小穴、陰穴新玩法、婬乱军团、淫逼、淫姐、淫浪、淫流、淫糜、淫蜜、淫魔、淫母、淫妞、淫奴、淫娃、淫液、钻插、H动漫、交换夫妻、美腿、舔脚、蜜洞、丝袜、淫情、亚洲情色网、强奸处女、鸡巴暴胀、美乳、大众色情成人网、火辣图片、淫声浪语、疯狂抽送、淫河、强暴、多人性愛、操屄、浪女、色情论坛、性虎色网、淫欲日本、操死、色迷城、petgirl、骚女叫春、成人百强、猖妓、天天干贴图、密穴贴图、凌辱、偷欢、小逼、酥痒、品色堂、浪妇、嫖妓指南、肉缝、色窝窝、被操、巨奶、骚洞、阴精、阴阜、阴屄、群魔色舞、扒穴、六月联盟、55sss偷拍区、张筱雨、xiao77、极品黑丝、丝袜写真、天天情色、成人小说、成人文学、情色艺术天空、222se图片、偷拍、淫色贴图、厕奴、美女成人、酥胸诱惑、五月天、人体摄影、东北xx网、玛雅网、成人bt、周六性吧、爆乳、诱惑视频、裙下风光、嘻游中国、操母狗、御の二代目、丝袜足交、肮脏美学、亚洲有码、欲仙欲死、丝袜高跟、偷拍美穴、原味丝袜、裸露自拍、针孔偷拍、放荡少妇宾馆、性感肉丝、拳交、迫奸、品香堂、北京xx网、虐奴、情色导航、欧美大乳、欧美无套、骚妇露逼、炮友、淫水丝袜、母女双飞、老少乱伦、幼妓、素人娘、前凸后翘、制服誘惑、舔屄、色色成人、迷奸系列、性交无码、惹火自拍、胯下呻吟、淫驴屯、少妇偷情、护士诱惑、群奸乱交、极品白虎、曲线消魂、淫腔、无码淫漫、假阳具插穴、蝴蝶逼、自插小穴、SM援交、西洋美女、爱液横流、三级片、东京热、无码无套、淫战群P、口爆、酒店援交、乳霸、湿身诱惑、火辣写真、动漫色图、熟女护士、粉红穴、经典炮图、童颜巨乳、性感诱惑、援交薄码、美乳美穴、奇淫宝鉴、美骚妇、跨下呻吟、无毛美少女、流蜜汁、日本素人、爆乳人妻、妖媚熟母、日本有码、激情打炮、制服美妇、无码彩图、放尿、入穴一游、丰唇艳姬、群奸轮射、高级逼、MM屄、美臀嫰穴、淫东方、国产偷拍、清晰内射、嫩穴肉缝、雪腿玉胯、骚妇掰B、白嫩骚妇、梅花屄、猛操狂射、潮喷、无码体验、吞精骚妹、紧缚凌辱、奸淫电车、堕淫、颜骑、互淫、逼毛、胸濤乳浪、夫妻乱交、黑屄、奶大屄肥、拔屄、穴海、换妻杂交、狂插、黑逼、粉屄、口射、多人轮、奶挺臀翘、扒屄、痴乳、鬼輪姦、乳爆、浴尿、淫样、発妻、姫辱、插后庭、操爽、嫩缝、操射、骚妈、激插、暴干、母子交欢、嫐屄、足脚交、露屄、柔阴术、相奸、淫师荡母、欠干、桃园蜜洞、二穴中出、奴畜抄、连続失禁、大鸡巴、玩穴、性交自拍、叫鸡、骚浪人妻、做爱、操、坐台、自焚、子宫、杂种、淫、阴毛、阴户、阴蒂、爷爷、摇头丸、阳具、性交、性爱、小鸡鸡、小弟弟、小便、武藤、慰安妇、猥亵、猥琐、生殖、煞笔、傻逼、傻B、色情、骚逼、三陪、肉欲、肉体、情色、排泄、女干、灭族、梅毒、卵子、淋病、口交、尻、贱、鸡吧、鸡八、胡瘟、龟头、狗日、狗娘、根正苗红、睾丸、疯狗、腚、大便、打炮、打飞机、娼、肏、瘪三、妈逼、屄、妈、爸、爹、爷、奶、儿子、sm、尼玛、装B、偷窥视频、裸聊、兽兽门、艾滋、艾滋病、二逼、阳物、找小姐、开房、援交、黄色网站、大血逼、大血比、性虐、ADMIN、Admin、xtl、system、admin、Administrator、administrator、管理、管里、管理员、服务管理、服务器、活动管理员、冬季热、官方、维护、系统、系统公告、审查、巡查、监督、监管、game、master、GAMEMASTER、GameMaster、GM、Gm、gm、gm、游戏管理员、Client、Server、CS、Cs、cs、cS、KEFU、kefu、Kefu、KeFu、助理、客户服务、客服、服务天使、TEsT、tESt、test、test、TeSt、tEST、Test、测试、辅助程序、运营、运营者、运营组、运营商、运营长、运营官、运营人、蔡文胜、李兴平、汪东风、骆海坚、曹政、sf、私服、私人服务器、wg、外挂、&、ㄅ、ㄆ、ㄇ、ㄈ、ㄉ、ㄊ、ㄋ、ㄌ、ㄍ、ㄎ、ㄏ、ㄐ、ㄑ、ㄒ、ㄓ、ㄔ、ㄕ、ㄖ、ㄗ、ㄘ、ㄙ、ㄚ、ㄛ、ㄜ、ㄝ、ㄞ、ㄟ、ㄠ、ㄡ、ㄢ、ㄣ、ㄤ、ㄥ、ㄦ、ㄧ、ㄨ、ㄩ、鞴、鐾、瘭、镳、黪、瘥、觇、孱、廛、蒇、冁、羼、螭、傺、瘛、舂、艟、瘳、雠、搋、嘬、辏、殂、汆、爨、榱、毳、皴、蹉、鹾、纛、髑屙民、莪、苊、鲕、鲼、瀵、酆、幞、黻、呒、黼、阝、阝月、彀、觏、毂 、汩、 罟、嘏、鲴、宄、庋、刿、虢、馘、撖、夯、薅、曷、翮、曷、翮、觳、冱、怙、戽、祜、瓠、鹱 、 溷、耠、锪、劐、蠖、丌、乩、赍、殛、蕺、掎、彐、芰、跽、鲚、葭、恝、湔、搛、鲣、鞯、囝、趼、醮、疖、苣、屦、醵、蠲、桊、鄄、谲、爝、麇、贶、悝、喟、仂、泐、鳓、诔、酹、嫠、黧、蠡、醴、鳢、轹、詈、跞、奁、臁、蚍、埤、罴、鼙、庀、仳、圮綦、屺、綮、汔、碛、葜、佥、岍、愆、搴、钤、掮、凵、肷、椠、戕、锖、檠、苘、謦、庆红、跫、銎、邛、筇、蛩鼽、诎、麴、黢、劬、朐、璩、蘧、衢、蠼毵、糁、xijinping、likeqiang、zhangdejiang、yuzhengsheng、liuyunshan、wangqishan、zhanggaoli、dishun 、 Dishun 、hujintao、jiangzemin、 likeqiang、 zhangdejiang 、wangqishan 、liuyunshan 、zhanggaoli、 pengliyuan 、quannengshenjiao、 liruihuan、 wenjiabao、 lipeng、 lichangchun、 wubangguo、 zhurongji、 zhouyongkang、 maozedong、 zhouenlai、 lihongzhi 、boxilai、 liulijun、 xinjiangduli 、xizangduli 、xinwenguanzhi、 lianggezhongguo、 taiwanduli 、dalailama、sex、fuck、 bitch、lilanqing、 jiaqinglin、 falungong 、falundafahao、 xiejiao 、gongchandang、zhonghuaminguo、yidangzhuanzheng、liushaoqi、xucaihou、zhaoziyang、 dengxiaoping、 jiangjieshi、 jiangjingguo、 chenshuibian、 huimin、 yisilan、 zhenzhu、 shijiamouni、 taidu、liusi、 zengqinghong、 tiananmen、 renmindahuitang、 dang、guojia、 lingjihua、 DISHUN 、 DiShun、zhude、pengdehuai、linbiao、liubocheng、chenyi、helong、nierongzhen、xuxiangqian、luoronghuan、yejianying、lidazhao、chenduxiu、sunzhongshan、sunwen、sunyixian、chenyun、liruihuan、weijianxing、lilanqing、luogan、zengqinghong、huangju、wuguanzheng、lichangchun、wuyi、huiliangyu、zengpeiyan、caogangchuan、tangjiaxuan、huajianmin、chenzhili、zhangdejiang、yuzhengsheng、wanglequan、liuyunshan、wanggang、wangzhaoguo、liuqi、heguoqiang、guobaxiong、huyaobang、wanglequan、wangzhaoguo、bushi、bulaier、xiaoquan、chunyilang、samalanqi、annan、Alafate、pujing、mokeer、kelindun、ligen、nikesong、linken、dulumen、heluxiaofu、liening、sidalin、makesi、engesi、jinzhengri、jinricheng、sadamu、huzhiming、xihanuke、xilake、saqieer、Aluoyue、mandela、kasiteluo、fulankelin、huashengdun、aisenhaoweier、napolun、yalishanda、luyi、lamusifeierde、laola、baoweier、aobama、meideweijiefu、jinzhengen、anbeijinsan、benladeng、aomaer、chailing、dalai、jiangqing、zhangchunqiao、yaowenyuan、wanghongwen、dongtiaoyingji、xitele、mosuolini、gangcunxiushu、gangcunningci、gaolipiao、zhaoziyang、wangdan、woerkaixi、lihongzhi、lidashi、laichangxing、majiajue、banchan、eerdeni、shanbenwushiliu、Abian、Abianwansui、renaya、wanglijun、lingjihua、mohanmode、xucaihou、yuyongkang、zhoujiankang、yujiankang、zhouxiaokang、chenliangyu、lidenghui、lianzhan、songchuyu、luxiulian、yumuming、jiangzhongzheng、mayingjiu、wangqishan、WANGQISHAN、 16大 、 18摸 、 21世纪中国基金会 、 6-4tianwang 、 89-64cdjp 、 ADMIN 、 AIDS 、 Aiort墓地 、 ai滋 、 Arqus会议场 、 asshole 、 Atan的移动石 、 A片 、 Baichi 、 Baopi 、 Bao皮 、 bastard 、 Bc 、 biaozi 、 Biao子 、 bignews 、 bitch 、 Bi样 、 BLOWJOB 、 boxun 、 B样 、 caoB 、 caobi 、 cao你 、 cao你妈 、 cao你大爷 、 cha你 、 chinaliberal 、 chinamz 、 chinesenewsnet 、 Clockgemstone 、 cnd 、 creaders 、 Crestbone 、 dafa 、 dajiyuan 、 damn 、 dfdz 、 DICK 、 dpp 、 EVENT 、 falu 、 falun 、 falundafa 、 fa轮 、 Feelmistone 、 Fku 、 FLG 、 flg 、 freechina 、 freedom 、 freenet 、 Fuck 、 fuck 、 GAMEMASTER 、 gan你 、 GCD 、 gcd 、 GM 、 Gruepin 、 HACKING 、 hongzhi 、 hrichina 、 http 、 huanet 、 hypermart.net 、 incest 、 item 、 J8 、 JB 、 jiangdongriji 、 jian你 、 jiaochuang 、 jiaochun 、 jiba 、 jinv 、 Ji女 、 Kao 、 KISSMYASS 、 lihongzhi 、 Mai骚 、 making 、 minghui 、 minghuinews 、 nacb 、 naive 、 Neckromancer 、 nmis 、 paper64 、 peacehall 、 PENIS 、 playboy 、 pussy 、 qiangjian 、 Rape 、 renminbao 、 renmingbao 、 rfa 、 safeweb 、 saobi 、 sb 、 SEX 、 sex 、 sf 、 SHIT 、 shit 、 simple 、 SUCK 、 sucker 、 svdc 、 System 、 taip 、 TEST 、 The9 、 The9City 、 tibetalk 、 TMD 、 TNND 、 triangle 、 triangleboy 、 Tringel 、 UltraSurf 、 unixbox 、 ustibet 、 voa 、 voachinese 、 wangce 、 WEBZEN 、 WG 、 wstaiji 、 xinsheng 、 yuming 、 zhengjian 、 zhengjianwang 、 zhenshanren 、 zhuanfalunADMIN、AIDS、AIORT墓地、AI滋、ARQUS会议场、ASSHOLE、ATAN的移动石、A片、BAICHI、BAOPI、BAO皮、BASTARD、BC、BIAOZI、BIAO子、BIGNEWS、BITCH、BI样、BLOWJOB、BOXUN、B样、CAOB、CAOBI、CAO你、CC小雪、CHA你、CHINALIBERAL、CHINAMZ、CHINESENEWSNET、CLOCKGEMSTONE、CND、CREADERS、CRESTBONE、DAFA、DAJIYUAN、DAMN、DFDZ、DICK、DPP、EVENT、FALU、FALUN、FALUNDAFA、FA轮、FEELMISTONE、FKU、FLG、FREECHINA、FREEDOM、FREENET、FUCK、GAMEMASTER、GAN你、GCD、GM、GRUEPIN、HACKING、HONGZHI、HRICHINA、HTTP、HUANET、HYPERMART.、NET、INCEST、ITEM、J8、JB、JIANGDONGRIJI、JIAN你、JIAOCHUANG、JIAOCHUN、JIBA、JINV、JI女、KAO、KISSMYASS、㎏、LIHONGZHI、MAI骚、MAKING、MINGHUI、MINGHUINEWS、㎎、㎜、NACB、NAIVE、NECKROMANCER、NMIS、PAPER64、PEACEHALL、PENIS、PLAYBOY、PUSSY、QIANGJIAN、RAPE、RENMINBAO、RENMINGBAO、RFA、SAFEWEB、SAOBI、SB、SEX、SF、SHIT、SIMPLE、SUCK、SUCKER、SVDC、SYSTEM、TAIP、TEST、THE9、THE9CITY、TIBETALK、TMD、TNND、TRIANGLE、TRIANGLEBOY、TRINGEL、ULTRASURF、UNIXBOX、USTIBET、VOA、VOACHINESE、WANGCE、WEBZEN、WG、WSTAIJI、WWW、WWW.、XINSHENG、YUMING、ZHENGJIAN、ZHENGJIANWANG、ZHENSHANREN、ZHUANFALUN、ice、ICE、narcotics、碡 、籀、朱駿 、朱狨基、朱容基、朱溶剂、朱熔基、朱镕基、邾、猪操、猪聋畸、猪毛、猪毛1、舳、瘃、躅、翥、專政、颛、丬、隹、窀、卓伯源、倬、斫、诼、髭、鲻、子宫、秭、訾、自焚、自民党、自慰、自已的故事、自由民主论坛、总理、偬、诹、陬、鄹、鲰、躜、缵、作爱、作秀、阼、祚、做爱、阿扁萬歲、阿萊娜、啊無卵、埃裏克蘇特勤、埃斯萬、艾麗絲、愛滋、愛滋病、垵、暗黑法師、嶴、奧克拉、奧拉德、奧利弗、奧魯奇、奧倫、奧特蘭、㈧、巴倫侍從、巴倫坦、白立樸、白夢、白皮書、班禪、寶石商人、保釣、鮑戈、鮑彤、鮑伊、暴風亡靈、暴亂、暴熱的戰士、暴躁的城塔野獸、暴躁的警衛兵靈魂、暴躁的馬杜克、北大三角地論壇、北韓、北京當局、北美自由論壇、貝尤爾、韝、逼樣、比樣、蹕、颮、鑣、婊子養的 、賓周、冰後、博訊、不滅帝王、不爽不要錢、布萊爾、布雷爾、蔡崇國、蔡啓芳、黲、操鶏、操那嗎B、操那嗎逼、操那嗎比、操你媽、操你爺爺、曹長青、曹剛川、草、草你媽、草擬媽、册那娘餓比、插那嗎B、插那嗎逼、插那嗎比、插你媽、插你爺爺、覘、蕆、囅、閶、長官沙塔特、常勁、朝鮮、車侖、車侖女幹、沉睡圖騰、陳炳基、陳博志、陳定南、陳建銘、陳景俊、陳菊、陳軍、陳良宇、陳蒙、陳破空、陳水扁、陳唐山、陳希同、陳小同、陳宣良、陳學聖、陳一諮、陳總統、諶、齔、櫬、讖、程凱、程鐵軍、鴟、痴鳩、痴拈、遲鈍的圖騰、持不同政見 、赤色騎士、赤色戰士、處女膜、傳染性病、吹簫、春夏自由論壇、戳那嗎B、戳那嗎逼、戳那嗎比、輳、鹺、錯B、錯逼、錯比、錯那嗎B、錯那嗎逼、錯那嗎比、達夫警衛兵、達夫侍從、達癩、打飛機、大參考、大東亞、大東亞共榮、大鶏巴、大紀元、大紀元新聞網、大紀園、大家論壇、大奶媽、大史記、大史紀、大衛教、大中國論壇、大中華論壇、大衆真人真事、紿、戴維教、戴相龍、彈劾、氹、蕩婦、導師、盜竊犯、德維爾、登輝、鄧笑貧、糴、迪裏夏提、覿、地下教會、帝國主義、電視流氓、叼你媽、釣魚島、丁關根、東北獨立、東部地下水路、東方紅時空、東方時空、東南西北論談、東社、東升、東條、東條英機、東突暴動、東突獨立、東土耳其斯坦、東西南北論壇、東亞、東院看守、動亂、鬥士哈夫拉蘇、鬥士霍克、獨裁、獨裁政治、獨夫、獨立臺灣會、俄國 、鮞、㈡、發楞、發掄、發掄功、發倫、發倫功、發輪、發論、發論公、發論功、發騷、發正念、法~倫、法~淪、法~綸、法~輪、法~論、法爾卡、法掄、法掄功、法侖、法淪、法綸、法輪大法、法輪功、法十輪十功、法謫、法謫功、反封鎖、反封鎖技術、反腐敗論壇、反人類、反社會、方勵之、防衛指揮官、放蕩、飛揚論壇、廢墟守護者、費鴻泰、費良勇、分隊長施蒂文、粉飾太平、糞便、鱝、豐饒的果實、風雨神州、風雨神州論壇、封從德、封殺、封印的靈魂騎士、馮東海、馮素英、紱、襆、嘸 、傅作義、幹bi、幹逼、幹比、幹的你、幹幹幹、幹她、幹你、幹你老比、幹你老母、幹你娘、幹全家、幹死、幹死你、幹他、幹一家、趕你娘、岡巒、剛比、剛比樣子、崗哨士兵、肛門、高麗棒子、高文謙、高薪養廉、高自聯、膏藥旗、戈瑞爾德、戈揚、鴿派、歌功頌德、格雷(關卡排名管理者)、格魯、格魯(城鎮移動)、鯁、工自聯、弓雖、共産、共産黨、共産主義、共黨、共軍、共榮圈、緱、狗誠、狗狼養的、狗娘養的、狗養、狗雜種、覯、轂、古龍祭壇、骨獅、鯝、鴰、詿、關卓中、貫通兩極法、廣聞、嬀、龜兒子、龜公、龜孫子、龜頭、龜投、劌、緄、滾那嗎、滾那嗎B、滾那嗎錯比、滾那嗎老比、滾那嗎瘟比、鯀、咼、郭俊銘、郭羅基、郭岩華、國家安全、國家機密、國軍、國賊、哈爾羅尼、頇、韓東方、韓聯潮、韓正、漢奸、顥、灝、河殤、賀國强、賀龍、黑社會、黑手黨、紅燈區、紅色恐怖、紅炎猛獸、洪傳、洪興、洪哲勝、黌、鱟、胡緊掏、胡錦滔、胡錦淘、胡景濤、胡喬木、胡總書記、湖岸護衛兵、湖岸警衛兵、湖岸哨兵隊長、護法、鸌、華建敏、華通時事論壇、華夏文摘、華語世界論壇、華岳時事論壇、懷特、鍰、皇軍、黃伯源、黃慈萍、黃禍、黃劍輝、黃金幼龍、黃菊、黃片、黃翔、黃義交、黃仲生、回民暴動、噦、繢、毀滅步兵、毀滅騎士、毀滅射手、昏迷圖騰、混亂的圖騰、鍃、活動 、擊倒圖騰、擊傷的圖騰、鶏8、鶏八、鶏巴、鶏吧、鶏鶏、鶏奸、鶏毛信文匯、鶏女、鶏院、姬勝德、積克館、賫、鱭、賈廷安、賈育台、戔、監視塔、監視塔哨兵、監視塔哨兵隊長、鰹、韉、簡肇棟、建國黨、賤B、賤bi、賤逼、賤比、賤貨、賤人、賤種、江八點、江羅、江綿恒、江戲子、江則民、江澤慧、江賊、江賊民、薑春雲、將則民、僵賊、僵賊民、講法、蔣介石、蔣中正、降低命中的圖騰、醬猪媳、撟、狡猾的達夫、矯健的馬努爾、嶠、教養院、癤、揭批書、訐、她媽、届中央政治局委員、金槍不倒 、金堯如、金澤辰、巹、錦濤、經文、經血、莖候佳陰、荊棘護衛兵 、靖國神社、㈨、舊斗篷哨兵、齟、巨槌騎兵、巨鐵角哈克、鋸齒通道被遺弃的骷髏、鋸齒通道骷髏、屨、棬、絕望之地、譎、軍妓、開苞、開放雜志、凱奧勒尼什、凱爾本、凱爾雷斯、凱特切爾、砍翻一條街、看中國、闞、靠你媽、柯賜海、柯建銘、科萊爾、克萊恩、克萊特、克勞森、客戶服務、緙、空氣精靈、空虛的伊坤、空虛之地、恐怖主義、瞘、嚳、鄺錦文、貺、昆圖、拉姆斯菲爾德、拉皮條、萊特、賴士葆、蘭迪、爛B、爛逼、爛比、爛袋、爛貨、濫B、濫逼、濫比、濫貨、濫交、勞動教養所、勞改、勞教、鰳、雷尼亞、誄、李紅痔、李洪寬、李繼耐、李蘭菊、李老師、李錄、李祿、李慶安、李慶華、李淑嫻、李鐵映、李旺陽、李小鵬、李月月鳥、李志綏、李總理、李總統、裏菲斯、鱧、轢、躒、奩、連方瑀、連惠心、連勝德、連勝文、連戰、聯總、廉政大論壇、煉功、兩岸關係、兩岸三地論壇、兩個中國、兩會、兩會報道、兩會新聞、廖錫龍 、林保華、林長盛、林佳龍、林信義、林正勝、林重謨、躪、淩鋒、劉賓深、劉賓雁、劉剛、劉國凱、劉華清、劉俊國、劉凱中、劉千石、劉青、劉山青、劉士賢、劉文勝、劉文雄、劉曉波、劉曉竹、劉永川、㈥、鷚、龍虎豹、龍火之心、盧卡、盧西德、陸委會、輅、呂京花、呂秀蓮、亂交、亂倫、亂輪、鋝、掄功、倫功、輪大、輪功、輪奸、論壇管理員、羅福助、羅幹、羅禮詩、羅文嘉、羅志明、腡、濼、洛克菲爾特、媽B、媽比、媽的、媽批、馬大維、馬克思、馬良駿、馬三家、馬時敏、馬特斯、馬英九、馬永成、瑪麗亞、瑪雅、嗎的、嗎啡、勱、麥克斯、賣逼、賣比、賣國、賣騷、賣淫、瞞報、毛厠洞、毛賊、毛賊東、美國、美國參考、美國佬、美國之音、蒙獨、蒙古達子、蒙古獨、蒙古獨立、禰、羋、綿恒、黽、民國、民進黨、民聯、民意論壇、民陣、民主墻、緡、湣、鰵、摸你鶏巴、莫偉强、木子論壇、內褲、內衣、那嗎B、那嗎逼、那嗎錯比、那嗎老比、那嗎瘟比、那娘錯比、納粹、奶頭、南大自由論壇、南蠻子、鬧事、能樣、尼奧夫、倪育賢、鯢、你媽、你媽逼、你媽比、你媽的、你媽了妹、你說我說論壇、你爺 、娘餓比、捏你鶏巴、儂著岡巒、儂著卵拋、奴隸魔族士兵、女幹、女主人羅姬馬莉、儺、諾姆、潘國平、蹣 、龐建國、泡沫經濟、轡、噴你、皮條客、羆、諞、潑婦 、齊墨、齊諾、騎你、磧、僉、鈐、錢達、錢國梁、錢其琛、膁、槧、錆、繰、喬石、喬伊、橋侵襲兵、譙、鞽、篋、親美、親民黨、親日、欽本立、禽獸、唚、輕舟快訊、情婦、情獸、檾、慶紅、丘垂貞、詘、去你媽的、闃、全國兩會、全國人大、犬、綣、瘸腿幫、愨、讓你操、熱比婭、熱站政論網、人民報、人民大會堂、人民內情真相、人民真實、人民之聲論壇、人權、日本帝國、日軍、日內瓦金融、日你媽、日你爺爺、日朱駿、顬、乳頭、乳暈、瑞士金融大學、薩達姆、三K黨、三個代表、三級片、三去車侖工力、㈢、毿、糝、騷B、騷棒、騷包、騷逼、騷棍、騷貨、騷鶏、騷卵 、殺你全家、殺你一家、殺人犯、傻鳥、煞筆、山口組、善惡有報、上訪、上海幫、上海孤兒院、厙、社會主義、射了還說要、灄、詵、神經病、諗、生孩子沒屁眼、生命分流的圖騰、澠、聖射手、聖戰、盛華仁、濕了還說不要、濕了還說要、釃、鯴、㈩、石化圖騰、石拳戰鬥兵、時代論壇、時事論壇、鰣、史萊姆、史萊姆王、士兵管理員瓦爾臣、世界經濟導報、事實獨立、侍從貝赫爾特、侍從倫斯韋、貰、攄、數據中國、雙十節、氵去車侖工力、氵去車侖工力?、稅力、司馬晋、司馬璐、司徒華、私?服、私處、思科羅、斯諾、斯皮爾德、四川獨、四川獨立、四人幫、㈣、宋書元、藪、蘇菲爾、蘇拉、蘇南成、蘇紹智、蘇特勒守護兵、蘇特勤、蘇特勤護衛兵、蘇特勤魔法師、蘇曉康、蘇盈貴、蘇貞昌、誶、碎片製造商人馬克、碎片製造商人蘇克、孫大千、孫中山、他媽、他媽的、他嗎的、他母親、塔內、塔烏、鰨、闥、臺盟、臺灣帝國、臺灣獨立、臺灣獨、臺灣共産黨、臺灣狗、臺灣建國運動組織、臺灣民國、臺灣青年獨立聯盟、臺灣政論區、臺灣自由聯盟、鮐、太監、泰奴橋警衛兵、泰奴橋掠奪者、湯光中、唐柏橋、鞀、謄、天安門、天安門錄影帶、天安門事件、天安門屠殺、天安門一代、天閹、田紀雲、齠、鰷、銚、庭院警衛兵、統獨、統獨論壇、統戰、頭領奧馬、頭領墳墓管理員、圖書管理員卡特、屠殺、團長戈登、團員馬爾汀、摶、鼉、籜、膃、外交論壇、外交與方略、晚年周恩來、綰、萬里、萬潤南、萬維讀者論壇、萬曉東、王寶森、王超華、王輔臣、王剛、王涵萬、王滬寧、王軍濤、王樂泉、王潤生、王世堅、王世勛、王秀麗、王兆國、網禪、網特、猥褻、鮪、溫B、溫逼、溫比、溫家寶、溫元凱、閿、無界瀏覽器、吳百益、吳敦義、吳方城、吳弘達、吳宏達、吳仁華、吳淑珍、吳學燦、吳學璨、吳育升、吳志芳、西藏獨、吸收的圖騰、吸血獸、覡、洗腦、系統、系統公告、餼、郤、下賤、下體、薟、躚、鮮族、獫、蜆、峴、現金、現金交易、獻祭的圖騰、鯗、項懷誠、項小吉、嘵、小B樣、小比樣、小參考、小鶏鶏、小靈通、小泉純一郎、謝長廷、謝深山、謝選駿、謝中之、辛灝年、新觀察論壇、新華舉報、新華內情、新華通論壇、新疆獨、新生網、新手訓練營、新聞出版總署、新聞封鎖、新義安、新語絲、信用危機、邢錚、性愛、性無能、修煉、頊、虛弱圖騰、虛無的飽食者、徐國舅、許財利、許家屯、許信良、諼、薛偉、學潮、學聯、學運、學自聯、澩、閹狗、訁、嚴家其、嚴家祺、閻明複、顔清標、顔慶章、顔射、讞、央視內部晚會、陽具、陽痿、陽物、楊懷安、楊建利、楊巍、楊月清、楊周、姚羅、姚月謙、軺、搖頭丸、藥材商人蘇耐得、藥水、耶穌、野鶏、葉菊蘭、夜話紫禁城、一陀糞、㈠、伊莎貝爾、伊斯蘭、伊斯蘭亞格林尼斯、遺精、議長阿茵斯塔、議員斯格文德、异見人士、异型叛軍、异議人士、易丹軒、意志不堅的圖騰、瘞、陰部、陰唇、陰道、陰蒂、陰戶、陰莖、陰精、陰毛、陰門、陰囊、陰水、淫蕩、淫穢、淫貨、淫賤、尹慶民、引導、隱者之路、鷹眼派氏族、硬直圖騰、憂鬱的艾拉、尤比亞、由喜貴、游蕩的僵尸、游蕩的士兵、游蕩爪牙、游錫坤、游戲管理員、友好的魯德、幼齒、幼龍、于幼軍、余英時、漁夫菲斯曼、輿論、輿論反制、傴、宇明網、齬、飫、鵒、元老蘭提(沃德)、圓滿、緣圈圈、遠志明、月經、韞、雜種、鏨、造愛、則民、擇民、澤夫、澤民、賾、賊民、譖、扎卡維是英雄、驏、張伯笠、張博雅、張鋼、張健、張林、張清芳、張偉國、張溫鷹、張昭富、張志清、章孝嚴、帳號、賬號、招鶏、趙海青、趙建銘、趙南、趙品潞、趙曉微、趙紫陽、貞操、鎮壓、爭鳴論壇、正見網、正義黨論壇、㊣、鄭寶清、鄭麗文、鄭義、鄭餘鎮、鄭源、鄭運鵬、政權、政治反對派、縶、躑、指點江山論壇、騭、觶、躓、中毒的圖騰、中毒圖騰、中俄邊界、中國復興論壇、中國共産黨、中國孤兒院、中國和平、中國論壇、中國社會進步黨、中國社會論壇、中國威脅論、中國問題論壇、中國移動通信、中國真實內容、中國之春、中國猪、中華大地、中華大衆、中華講清、中華民國、中華人民實話實說、中華人民正邪、中華時事、中華養生益智功、中華真實報道、中央電視臺、鐘山風雨論壇、周鋒鎖、周守訓 、朱鳳芝、朱立倫、朱溶劑、㈱、猪聾畸、主攻指揮官、主義、助手威爾特、專制、顓、轉化、諑、資本主義、鯔、子宮、自民黨、自由民主論壇、總理、諏、鯫 、躦、纘、作愛、做愛、bcd.s.59764.com、kkk.xaoh.cn、www.xaoh.cn、zzz.xaoh.cn、aa.yazhousetu.hi.9705.net.cn、eee.xaoh.cn、lll.xaoh.cn、jj.pangfangwuyuetian.hi.9705.net.cn、rrr.xaoh.cn、ooo.xaoh.cn、www.zy528.com、aaad.s.59764.com、www.dy6789.cn、aaac.s.51524.com、208.43.198.56、166578.cn、www.wang567.com、www.bin5.cn、www.sanjidianying.com.cn、www.anule.cn、www.976543.com、www.50spcombaidu1828adyou97sace.co.cc、chengrenmanhua.1242.net.cn、qingsewuyuetian.1174.net.cn、lunlidianyingxiazai.1174.net.cn、siwameitui.1274.net.cn、niuniujidi.1174.net.cn、xiao77.1243.net.cn、woyinwose.1243.net.cn、dingxiang.1249.net、cnaicheng.1174.net.cn、1234chengren.1249.net.cn、sewuyuetian.1174.net.cn、huangsexiaoshuo.1242.net.cn、lunlidianying.1274.net.cn、xingqingzhongren.1174.net.cn、chengrenwangzhi.1242.net.cn、xiao77luntan.1249.net.cn、dingxiang.1243.net.cn、11xp.1243.net.cn、baijie.1249.net.cn、sewuyuetian.1274.net.cn、meiguiqingren.1274.net.cn、tb.hi.4024.net.cn、www.91wangyou.com、www.wow366.cn、www.yxnpc.com、www.365jw.com、58.253.67.74、www.978808.com、www.sexwyt.com、7GG、www.567yx.com、131.com、bbs.7gg.cn、www.99game.net、ppt.cc、www.zsyxhd.cn、www.foyeye.com、www.23nice.com.cn、www.maituan.com、www.ylteam.cn、www.yhzt.org、vip886.com、www.neicehao.cn、bbs.butcn.com、www.gamelifeclub.cn、consignment5173、www.70yx.com、www.legu.com、ko180、bbs.pkmmo、whoyo.com、www.2q5q.com、www.zxkaku.cn、www.gw17173.cn、www.315ts.net、qgqm.org、17173dl.net、i9game.com、365gn、158le.com、1100y.com、bulaoge.com、17youle.com、reddidi.com.cn、icpcn.com、ul86.com、showka8.com、szlmgh.cn、bbs.766.com、www.766.com、91bysd.cn、jiayyou.cn、gigabyte.cn、duowan、wgxiaowu.com、youxiji888.cn、yz55.cn、Carrefour、51jiafen.cn、597ft.com、itnongzhuang.com2y7v.cnhwxvote.cn、92klgh.cn、xiaoqinzaixian.cn、661661.com、haosilu.com、dl.com、xl517.com、sjlike.com、tont.cn、xq-wl.cn、feitengdl.com、bz176.com、dadati.com、asgardcn.com、dolbbs.com、okaygood.cn、1t1t.com、jinpaopao.com、blacksee.com.cn、1qmsj.com、202333.com、luoxialu.cn、37447.cn、567567aa.cn、09city.com、71ka.com、fy371.com、365tttyx.com、host800.com、lybbs.info、ys168.com、88mysf.com、5d6d.com、id666.uqc.cn、stlmbbs.cn、pcikchina.com、lxsm888.com、wangyoudl.com、chinavfx.net、zxsj188.com、wg7766.cn、e7sw.cn、jooplay.com、gssmtt.com、likeko.com、lyx-game.cn、wy33.com、zy666.net、newsmth.net、l2jsom.cn、13888wg.com、qtoy.com、1000scarf.com、digitallongking.com、zaixu.net、ncyh.cn、888895.com、ising99.com、cikcatv.2om、parke888.com、01gh.com、gogo.net、uu1001.com、wy724.com、prettyirene.net、yaokong7.com、zzmysf.com、52sxhy.cn、92wydl.com、g365.net、pkmmo.com、52ppsa.cn、bl62.com、canyaa.com、lordren.com、xya3.cn、5m5m5m.com、www.gardcn.com、www.sf766.com.cn、ent365.com、18900.com、7mmo.com、cdream.com、wy3868.com、nbfib.cn、17173yxdl.cn、osisa.cn、haouse.cn、54hero.com、ieboy.cn、geocities.com、xiuau.cn、cvceo.com、fxjsqc.com、thec.cn、c5c8.cn、a33.com、qqsg.org、my3q.com、51juezhan.com、kartt.cn、hexun.com、15wy.com、13ml.net、homexf.cn、xyxgh.com、jdyou.com、langyou.info、duowan.com、8188mu.com、tianlong4f.cn、yeswm.com、wgbobo.cn、haog8.cn、47513.cn、92ey.com、hao1788.co、mgjzybj.com、xdns.eu、shenycs.co、mpceggs.cn、kod920.cn、njgamecollege.org、51hdw.com、025game.cn、bibidu.com、bwowd.com、3kwow.com、zx002.com、bazhuwg.cn、991game.com、zuanshi1000.cn、10mb.cn、Huihuangtx.com、chongxianmu.cn、any2000.com、99sa.com、zhidian8.com、t9wg.cn、bobaoping、qixingnet.com、88kx.com、00sm.cn、moyi520.cn、d666.com、fisonet.com、0571qq.com、173at.com、pk200.com、2feiche.cn、jjdlw.com、xyq2sf.com、69nb.com、txwsWind、jiayyou.com、胡总书记,胡景涛、大纪元、大纪元新闻网、燕玲论坛、fuck、共产党、urban、我操、cao、他妈的、TMD、鸡巴、煞笔、傻B、法轮功、江泽民、胡锦涛、温家宝、urban-rivals、rivals、我日、UR、ur、性交、口交、婊子、妓女、她妈、牛逼、牛B,牛比、煞笔、傻逼、傻B、操你妈、装逼、装B、日你妈、不玩了、删号、卖号 、删 号、妈的、妈逼、草你妈、T.M.D、JB、jb、出售账号、出售此号、卖号、U/R、U-R、j8、吗的、8仙、狗日、出售神符、色情、黄色、藏独、台独、法轮大法、鸡巴、毛泽东、NPC、*法*轮*功*、*李*洪*志*阿扁、阿扁万岁、阿拉、阿拉法特、挨球、安南、安全局、澳洲光明网、八九、八九风波、办理文凭、办理证件、包皮、保钓、保监会、保密局、鸨、鲍岳桥、暴动、暴乱、暴徒、北京之春、贝肉、本?拉登、本?拉登、苯比、笨屄、笨逼、屄、屄毛、逼毛、逼你老母、逼样、比毛、婊、婊子、宾周、冰毒、波霸、博讯、薄一波、布莱尔、布雷尔、布什、布什、财政部、参事室、藏独、藏独、藏独、操、操GM、操Gm、操gM、操gm、操XX、操逼、操比、操蛋、操你、 交媾,CAO, K粉,J8, 小姐兼职,交媾,西藏314事件,新疆7.5事件, 乱伦,毛片,黄片,交配,群交,小姐兼职,茉莉花革命,操你八辈祖宗、操你妈、操你妈屄、操他、曹刚川、草的你妈、草妈、草你妈、草拟妈、肏、测绘局、插GM、插Gm、插gM、插gm、插妳、插你、插你妈、插深些、产权局、朝鲜、车臣、车仑、陈功、陈良宇、陈水扁、陈希同、陈晓宁、陈毅、陈至立、成人电影、成人片、吃大便、吃屎、迟浩田、赤匪、抽插、抽你丫的、臭化西、出售假币、出售枪支、出售手枪、吹喇叭、吹箫、春药、蠢猪、戳你、粗制吗啡、催情药、达赖、达赖喇嘛、打炮、大B、大逼、大便、大波波、大麻、大麻树脂、大麻油、大师、戴维教、大学骚乱、大血B、大血比、呆卵、戴海静、戴红、戴晶、戴维教、党主席、荡妇、档案局、盗窃犯、盗窃犯、道教、邓小平、帝国主义、电监会、叼你、叼你妈、屌、屌7、屌鸠、屌毛、屌妳、屌七、屌西、钓鱼台、丁关根、丁子霖、东北独立、东升、东条英机、东突、东突暴动和独立、东突组织、东亚病夫、董建华、董贱华、董文华、懂文华、独立、独立台湾会、恩格斯、二B、二屄、二逼、二乙基酰胺发抡、发抡功、发伦、发伦功、发轮、发论、发论公、发论功、发骚、法(轮)功、法*轮*功、法功、法愣、法仑、法轮、法轮大法、法轮功、法西斯、法制办、反动、反革命、发票,冰粉,性奴,反共、反华、反恐委员会、反日、反政府、分裂祖国、佛教、佛展千手法、佛祖、斧头镰刀、阝月、傅鹏、傅作义、干GM、干Gm、干gM、干gm、干拎娘、干妳、干妳老母、干妳妈、干妳娘、干你、干你妈、干你妈b、干你妈逼、干你娘、干七八、干死你、肛、肛交、肛门、港澳办、高俊、高丽棒子、高校暴乱、高校群体事件、高校骚乱、睾、睾丸、膏药旗、弓虽女干、公安、公安部、公安局、共产党、共产主义、共匪、共狗、狗b、狗操、狗卵、狗娘、狗屁、狗日、狗日的、狗屎、观世音、官逼民反、官商勾结、龟儿子、龟公、龟孙子、龟头、鬼村、滚、郭伯雄、国安局、国防部、国防科工委、国管局、国际法院、国家民委、国家主席、国家主要部委、国民党、国民党万岁、海洛因、海洋局、何候华、贺国强、贺龙、黑社会、黑手党、黑手党、黑手党、红卫兵、洪兴、洪志、后庭、胡XX、胡紧涛、胡紧掏、胡紧套、胡锦涛、胡锦淘、胡乔木、胡耀邦、胡主席、花柳、华国锋、华建敏、换妻、黄 菊、黄菊、黄色电影、黄色小电影、回教、回良玉、回民暴动、回族人吃猪肉、昏药、火棒、机八、机巴、鸡八、鸡巴、鸡叭、鸡芭、鸡掰、鸡奸、基地组织、基督、基督教、激情电影、激情小电影、鸡、计牌软件、计生委、妓、妓女、妓院、贾庆林、奸、奸夫淫妇、奸你、奸淫、贱、贱逼、贱货、贱人、江Core、江八、江八点、江独裁、江核心、江青、江戏子、江择民、江泽民、江贼民、江折民、江猪、江猪媳、江主席、僵贼民、疆独、蒋介石、蒋经国、蒋中正、酱猪媳、交通部、姣西、叫床、叫鸡、叫小姐、教育部、她妈的金日成、金正日、禁书、经济社会理事会、经社理事会、精液、精子、警匪一家、敬国神社、靖国神社、静坐、纠察员、鸠、鸠屎、军长发威、军国主义、军妓、尻、靠、靠你妈、靠腰、可待因、可卡叶、可卡因、克林顿、恐怖份子、恐怖主义、口交、寇晓伟、狂操、狂操你全家、拉登、拉姆斯菲尔德、懒教、烂B、烂屄、烂逼、烂比、烂屌、烂货、劳+教+所、劳动保障部、老逼、老毛子、老母、黎阳评、李长春、李登辉、李弘旨、李红志、李宏旨、李宏志、李洪志、李岚清、李鹏、李鹏*、李瑞环、李山、李铁映、李先念、连战、联大、联合国、联合国大会、联易、联易互动、粮食局、两腿之间、列宁、林彪、林业局、刘 淇、刘军、刘淇、刘少奇、刘云山、流氓、六.四、六。四、六?四、六合彩、六四、六-四、六四事件、六四真相、龙新民、吕秀莲、旅游局、卵、轮功、轮奸、罗 干、罗干、骡干、妈逼、妈比、妈卖妈屁、妈批、妈祖、妈B、妈的、麻醉钢枪、麻醉枪、麻醉药、麻醉乙醚、马克思、马卖马屁、马英九、吗啡、吗啡碱、吗啡片、买财富、买卖枪支、麦角酸、卖.国、卖B、卖ID、卖QQ、卖逼、卖比、卖财富、卖党求荣、卖国、卖国求荣、卖号、卖卡、卖软件、卖淫、毛XX、毛厕洞、毛一鲜、毛泽东、毛贼东、毛主席、梅花网、美国、美国佬、美国之音、美利坚、蒙尘药、蒙独、蒙古达子、蒙古独立、迷魂药、迷奸药、迷歼药、迷药、密洞、密宗、民航局、民进党、民运、民政部、明慧网、摩门教、莫索里尼、穆罕默德、穆斯林、乳头、奶子、妳老母的、妳妈的、妳马的、妳娘的、南联盟、南蛮子、南蛮子、嫩B、嫩b、伱妈、你爸、你大爷、你二大爷、你老母、你老味、你姥、你姥姥的、你妈、你妈逼、你妈的、你娘、你爷爷的、鸟GM、鸟Gm、鸟gM、鸟gm、鸟你、牛逼、牛比、农业部、虐待、拍肩神药、喷你、彭真、皮条、屁眼、嫖客、苹果日报、破坏、破鞋、仆街、普京、气象局、钱其琛、枪决女犯、枪决现场、枪支弹药、强奸、强奸犯、强卫、强效失意药、强硬发言、抢劫、乔石、侨办、切七、窃听器、窃听器材、亲民党、青天白日、情色、去你妈的、去死、全国人大、瘸腿帮、人大、人大代表、人代会、人弹、人民、人民大会堂、人民广场、人民日报、人民银行、人体炸弹、日GM、日Gm、日gM、日gm、日X妈、日本RING、日本鬼子、日你、日你妈、日你娘、日他娘、肉棒、肉壁、肉洞、肉缝、肉棍、肉棍子、肉穴、乳、乳波臀浪、乳房、乳交、乳头、撒尿、萨达姆、塞白、塞你爸、塞你公、塞你老母、塞你老师、塞你母、塞你娘、三个呆婊、三个代婊、三级片、三民主义、三陪、三陪女、三去车仑、三唑仑、骚、骚B、骚逼、骚货、骚、色情、色情电影、色情服务、色情小电影、杀人犯、傻B、傻屄、傻逼、傻比、傻吊、傻卵、傻子、煞逼、商务部、上妳、上你、社科院、射精、身份生成器、神经病、神通加持法、生鸦片、圣女峰、十八摸、十年动乱石进、食捻屎、食屎、驶你爸、驶你公、驶你老母、驶你老师、驶你母、驶你娘、是鸡、手淫、受虐狂、售ID、售号、售软件、双峰微颤、氵去、水利部、水去车仑、税务总局、司法部、私服、私/服、私\\服、私服、私-服、私—服、斯大林、死gd、死GD、死gm、死GM、死全家、四川独立、四人帮、宋楚瑜、宋祖英、孙文、孙逸仙、孙中山、他爹、他妈、他妈的、他马的、他母亲、他祖宗、台办、台独、台联、台湾党、台湾帝国、台湾独立、台湾共产党、台湾共和国、台湾狗、台湾国、台湾民国、太监、太子党、唐家璇、天皇陛下、田纪云、舔西、投毒杀人、透视软件、推油、外 挂、外挂、外/挂、外\\挂、外_挂、外挂、外-挂、外—挂、外汇局、外交部、外专局、晚年周恩来、万税、王八蛋、王宝森、王刚、王昊、王乐泉、王岐山、王太华、王兆国、王震、网管、威而钢、威而柔、卫生部、尉健行、温加宝、温家宝、温家保、温馨、温总理、文化部、文物局、倭国、倭寇、我操、我操你、我干、我妳老爸、我日、我日你、无界浏览器、吴 仪、吴邦国、吴官正、吴仪、五星红旗、西藏独立、西藏天葬、希拉克、希特勒、希望之声、洗脑班、系统、系统公告、系统讯息、鲜族、乡巴佬、想上你、小鸡鸡、小泉、小泉纯一郎、小日本、小肉粒、小乳头、小穴、邪教、新疆独立、兴奋剂、性爱、性交、性虐待、性无能、性欲、徐光春、学潮、血逼、血腥图片、鸦片、鸦片液、鸦片渣、烟草局、严方军、阳精、阳具、摇头丸、摇头玩、耶和华、耶苏、耶稣、叶剑英、夜情、一党专制、一贯道、一国两制、一夜情、一中一台、伊拉克、伊朗、伊斯兰、以茎至洞、抑制剂、阴部、阴唇、阴道、阴蒂、阴核、阴户、阴茎、阴毛、阴水、阴小撕大、淫、淫荡、淫秽、淫货、淫贱、淫叫、淫毛、淫靡、淫水、淫娃、淫语连连、淫欲、英雄纪念碑、硬挺、邮政局、游戏发奖员、游戏宫理员、游戏管理员、游行、俞正声、舆论钳制、玉杵、欲火焚身、原子能机构、援交、远程偷拍、曰GM、曰Gm、曰gM、曰gm、曰你、月经、月经不调、月经、扎卡维是英雄、杂种、造反、曾培炎、曾庆红、扎卡维、张朝阳、张潮阳、张德江、张磊、张立昌、张小平、赵紫阳、侦探设备、真理教、中国恐怖组织、中华民国、中南海、中宣部、周恩来、周永康、周总理、朱德、朱容鸡、朱容基、朱熔基、朱镕基、朱总理、猪操、猪容基、主席、转法轮、转法轮、装屄、装逼、追查国际、子女任职名单、自焚、自杀手册、自杀指南、自制手枪、自治机关、宗教、总局、总理、作爱、坐台的、做爱、共产党、江泽民、胡锦涛、温家宝、严方军、屄毛、操逼毛、东突、骚货、法轮功、江泽民、胡锦涛、温家宝、urban-rivals、rivals、u r、ur、我日、UR、ur、性交、口交、U R、taobao、webgame.com.cn、婊子、妓女、他妈、她妈、牛逼、牛比、牛B、煞笔、傻逼、傻B、你妈、操你妈、装逼、装B、日你妈、不玩了、删号、卖号、垃圾游戏、烂游戏、删 号、妈的、妈逼、草你妈、T.M.D、JB、jb、淘宝、出售账号、出售此号、卖号、U/R、U-R、c a o、j8、吗的、8仙、狗日、出售神符、色情、黄色、h站、龙虎、虎门、龙 虎 门、WEB牌戰、WEB战牌、战牌、8 仙、UR、ur、UR、街头对抗、藏独、台独、法轮大法、混 沌决、ur、UR、urban、鸡巴、坐台的、作爱、总理、宗教、自治机关、自制手枪"; +var GB2260 = {"110000":"北京市","110100":"北京市市辖区","110101":"北京市东城区","110102":"北京市西城区","110103":"北京市崇文区","110104":"北京市宣武区","110105":"北京市朝阳区","110106":"北京市丰台区","110107":"北京市石景山区","110108":"北京市海淀区","110109":"北京市门头沟区","110111":"北京市房山区","110112":"北京市通州区","110113":"北京市顺义区","110200":"北京市县","110221":"北京市昌平县","110224":"北京市大兴县","110226":"北京市平谷县","110227":"北京市怀柔县","110228":"北京市密云县","110229":"北京市延庆县","120000":"天津市","120100":"天津市市辖区","120101":"天津市和平区","120102":"天津市河东区","120103":"天津市河西区","120104":"天津市南开区","120105":"天津市河北区","120106":"天津市红桥区","120107":"天津市塘沽区","120108":"天津市汉沽区","120109":"天津市大港区","120110":"天津市东丽区","120111":"天津市西青区","120112":"天津市津南区","120113":"天津市北辰区","120200":"天津市县","120221":"天津市宁河县","120222":"天津市武清县","120223":"天津市静海县","120224":"天津市宝坻县","120225":"天津市蓟县","130000":"河北省","130100":"河北省石家庄市","130101":"河北省石家庄市市辖区","130102":"河北省石家庄市长安区","130103":"河北省石家庄市桥东区","130104":"河北省石家庄市桥西区","130105":"河北省石家庄市新华区","130106":"河北省石家庄市郊区","130107":"河北省石家庄市井陉矿区","130121":"河北省石家庄市井陉县","130123":"河北省石家庄市正定县","130124":"河北省石家庄市栾城县","130125":"河北省石家庄市行唐县","130126":"河北省石家庄市灵寿县","130127":"河北省石家庄市高邑县","130128":"河北省石家庄市深泽县","130129":"河北省石家庄市赞皇县","130130":"河北省石家庄市无极县","130131":"河北省石家庄市平山县","130132":"河北省石家庄市元氏县","130133":"河北省石家庄市赵县","130181":"河北省石家庄市辛集市","130182":"河北省石家庄市藁城市","130183":"河北省石家庄市晋州市","130184":"河北省石家庄市新乐市","130185":"河北省石家庄市鹿泉市","130200":"河北省唐山市","130201":"河北省唐山市市辖区","130202":"河北省唐山市路南区","130203":"河北省唐山市路北区","130204":"河北省唐山市古冶区","130205":"河北省唐山市开平区","130206":"河北省唐山市新区","130221":"河北省唐山市丰润县","130223":"河北省唐山市滦县","130224":"河北省唐山市滦南县","130225":"河北省唐山市乐亭县","130227":"河北省唐山市迁西县","130229":"河北省唐山市玉田县","130230":"河北省唐山市唐海县","130281":"河北省唐山市遵化市","130282":"河北省唐山市丰南市","130283":"河北省唐山市迁安市","130300":"河北省秦皇岛市秦皇岛市","130301":"河北省秦皇岛市市辖区","130302":"河北省秦皇岛市海港区","130303":"河北省秦皇岛市山海关区","130304":"河北省秦皇岛市北戴河区","130321":"河北省秦皇岛市青龙满族自治县","130322":"河北省秦皇岛市昌黎县","130323":"河北省秦皇岛市抚宁县","130324":"河北省秦皇岛市卢龙县","130400":"河北省邯郸市邯郸市","130401":"河北省邯郸市市辖区","130402":"河北省邯郸市邯山区","130403":"河北省邯郸市丛台区","130404":"河北省邯郸市复兴区","130406":"河北省邯郸市峰峰矿区","130421":"河北省邯郸市邯郸县","130423":"河北省邯郸市临漳县","130424":"河北省邯郸市成安县","130425":"河北省邯郸市大名县","130426":"河北省邯郸市涉县","130427":"河北省邯郸市磁县","130428":"河北省邯郸市肥乡县","130429":"河北省邯郸市永年县","130430":"河北省邯郸市邱县","130431":"河北省邯郸市鸡泽县","130432":"河北省邯郸市广平县","130433":"河北省邯郸市馆陶县","130434":"河北省邯郸市魏县","130435":"河北省邯郸市曲周县","130481":"河北省邯郸市武安市","130500":"河北省邢台市","130501":"河北省邢台市市辖区","130502":"河北省邢台市桥东区","130503":"河北省邢台市桥西区","130521":"河北省邢台市邢台县","130522":"河北省邢台市临城县","130523":"河北省邢台市内丘县","130524":"河北省邢台市柏乡县","130525":"河北省邢台市隆尧县","130526":"河北省邢台市任县","130527":"河北省邢台市南和县","130528":"河北省邢台市宁晋县","130529":"河北省邢台市巨鹿县","130530":"河北省邢台市新河县","130531":"河北省邢台市广宗县","130532":"河北省邢台市平乡县","130533":"河北省邢台市威县","130534":"河北省邢台市清河县","130535":"河北省邢台市临西县","130581":"河北省邢台市南宫市","130582":"河北省邢台市沙河市","130600":"河北省保定市","130601":"河北省保定市市辖区","130602":"河北省保定市新市区","130603":"河北省保定市北市区","130604":"河北省保定市南市区","130621":"河北省保定市满城县","130622":"河北省保定市清苑县","130623":"河北省保定市涞水县","130624":"河北省保定市阜平县","130625":"河北省保定市徐水县","130626":"河北省保定市定兴县","130627":"河北省保定市唐县","130628":"河北省保定市高阳县","130629":"河北省保定市容城县","130630":"河北省保定市涞源县","130631":"河北省保定市望都县","130632":"河北省保定市安新县","130633":"河北省保定市易县","130634":"河北省保定市曲阳县","130635":"河北省保定市蠡县","130636":"河北省保定市顺平县","130637":"河北省保定市博野县","130638":"河北省保定市雄县","130681":"河北省保定市涿州市","130682":"河北省保定市定州市","130683":"河北省保定市安国市","130684":"河北省保定市高碑店市","130700":"河北省张家口市","130701":"河北省张家口市市辖区","130702":"河北省张家口市桥东区","130703":"河北省张家口市桥西区","130705":"河北省张家口市宣化区","130706":"河北省张家口市下花园区","130721":"河北省张家口市宣化县","130722":"河北省张家口市张北县","130723":"河北省张家口市康保县","130724":"河北省张家口市沽源县","130725":"河北省张家口市尚义县","130726":"河北省张家口市蔚县","130727":"河北省张家口市阳原县","130728":"河北省张家口市怀安县","130729":"河北省张家口市万全县","130730":"河北省张家口市怀来县","130731":"河北省张家口市涿鹿县","130732":"河北省张家口市赤城县","130733":"河北省张家口市崇礼县","130800":"河北省承德市","130801":"河北省承德市市辖区","130802":"河北省承德市双桥区","130803":"河北省承德市双滦区","130804":"河北省承德市鹰手营子矿区","130821":"河北省承德市承德县","130822":"河北省承德市兴隆县","130823":"河北省承德市平泉县","130824":"河北省承德市滦平县","130825":"河北省承德市隆化县","130826":"河北省承德市丰宁满族自治县","130827":"河北省承德市宽城满族自治县","130828":"河北省承德市围场满族蒙古族自治县","130900":"河北省沧州市","130901":"河北省沧州市市辖区","130902":"河北省沧州市新华区","130903":"河北省沧州市运河区","130921":"河北省沧州市沧县","130922":"河北省沧州市青县","130923":"河北省沧州市东光县","130924":"河北省沧州市海兴县","130925":"河北省沧州市盐山县","130926":"河北省沧州市肃宁县","130927":"河北省沧州市南皮县","130928":"河北省沧州市吴桥县","130929":"河北省沧州市献县","130930":"河北省沧州市孟村回族自治县","130981":"河北省沧州市泊头市","130982":"河北省沧州市任丘市","130983":"河北省沧州市黄骅市","130984":"河北省沧州市河间市","131000":"河北省廊坊市","131001":"河北省廊坊市市辖区","131002":"河北省廊坊市安次区","131022":"河北省廊坊市固安县","131023":"河北省廊坊市永清县","131024":"河北省廊坊市香河县","131025":"河北省廊坊市大城县","131026":"河北省廊坊市文安县","131028":"河北省廊坊市大厂回族自治县","131081":"河北省廊坊市霸州市","131082":"河北省廊坊市三河市","131100":"河北省衡水市","131101":"河北省衡水市市辖区","131102":"河北省衡水市桃城区","131121":"河北省衡水市枣强县","131122":"河北省衡水市武邑县","131123":"河北省衡水市武强县","131124":"河北省衡水市饶阳县","131125":"河北省衡水市安平县","131126":"河北省衡水市故城县","131127":"河北省衡水市景县","131128":"河北省衡水市阜城县","131181":"河北省衡水市冀州市","131182":"河北省衡水市深州市","140000":"山西省","140100":"山西省太原市","140101":"山西省太原市市辖区","140105":"山西省太原市小店区","140106":"山西省太原市迎泽区","140107":"山西省太原市杏花岭区","140108":"山西省太原市尖草坪区","140109":"山西省太原市万柏林区","140110":"山西省太原市晋源区","140121":"山西省太原市清徐县","140122":"山西省太原市阳曲县","140123":"山西省太原市娄烦县","140181":"山西省太原市古交市","140200":"山西省大同市","140201":"山西省大同市市辖区","140202":"山西省大同市城区","140203":"山西省大同市矿区","140211":"山西省大同市南郊区","140212":"山西省大同市新荣区","140221":"山西省大同市阳高县","140222":"山西省大同市天镇县","140223":"山西省大同市广灵县","140224":"山西省大同市灵丘县","140225":"山西省大同市浑源县","140226":"山西省大同市左云县","140227":"山西省大同市大同县","140300":"山西省阳泉市","140301":"山西省阳泉市市辖区","140302":"山西省阳泉市城区","140303":"山西省阳泉市矿区","140311":"山西省阳泉市郊区","140321":"山西省阳泉市平定县","140322":"山西省阳泉市盂县","140400":"山西省长治市","140401":"山西省长治市市辖区","140402":"山西省长治市城区","140411":"山西省长治市郊区","140421":"山西省长治市长治县","140423":"山西省长治市襄垣县","140424":"山西省长治市屯留县","140425":"山西省长治市平顺县","140426":"山西省长治市黎城县","140427":"山西省长治市壶关县","140428":"山西省长治市长子县","140429":"山西省长治市武乡县","140430":"山西省长治市沁县","140431":"山西省长治市沁源县","140481":"山西省长治市潞城市","140500":"山西省晋城市","140501":"山西省晋城市市辖区","140502":"山西省晋城市城区","140521":"山西省晋城市沁水县","140522":"山西省晋城市阳城县","140524":"山西省晋城市陵川县","140525":"山西省晋城市泽州县","140581":"山西省晋城市高平市","140600":"山西省晋城市朔州市","140601":"山西省晋城市市辖区","140602":"山西省晋城市朔城区","140603":"山西省晋城市平鲁区","140621":"山西省晋城市山阴县","140622":"山西省晋城市应县","140623":"山西省晋城市右玉县","140624":"山西省晋城市怀仁县","142200":"山西省忻州地区","142201":"山西省忻州地区忻州市","142202":"山西省忻州地区原平市","142222":"山西省忻州地区定襄县","142223":"山西省忻州地区五台县","142225":"山西省忻州地区代县","142226":"山西省忻州地区繁峙县","142227":"山西省忻州地区宁武县","142228":"山西省忻州地区静乐县","142229":"山西省忻州地区神池县","142230":"山西省忻州地区五寨县","142231":"山西省忻州地区岢岚县","142232":"山西省忻州地区河曲县","142233":"山西省忻州地区保德县","142234":"山西省忻州地区偏关县","142300":"山西省忻州地区吕梁地区","142301":"山西省忻州地区孝义市","142302":"山西省忻州地区离石市","142303":"山西省忻州地区汾阳市","142322":"山西省忻州地区文水县","142323":"山西省忻州地区交城县","142325":"山西省忻州地区兴县","142326":"山西省忻州地区临县","142327":"山西省忻州地区柳林县","142328":"山西省忻州地区石楼县","142329":"山西省忻州地区岚县","142330":"山西省忻州地区方山县","142332":"山西省忻州地区中阳县","142333":"山西省忻州地区交口县","142400":"山西省晋中地区","142401":"山西省晋中地区榆次市","142402":"山西省晋中地区介休市","142421":"山西省晋中地区榆社县","142422":"山西省晋中地区左权县","142423":"山西省晋中地区和顺县","142424":"山西省晋中地区昔阳县","142427":"山西省晋中地区寿阳县","142429":"山西省晋中地区太谷县","142430":"山西省晋中地区祁县","142431":"山西省晋中地区平遥县","142433":"山西省晋中地区灵石县","142600":"山西省临汾地区","142601":"山西省临汾地区临汾市","142602":"山西省临汾地区侯马市","142603":"山西省临汾地区霍州市","142621":"山西省临汾地区曲沃县","142622":"山西省临汾地区翼城县","142623":"山西省临汾地区襄汾县","142625":"山西省临汾地区洪洞县","142627":"山西省临汾地区古县","142628":"山西省临汾地区安泽县","142629":"山西省临汾地区浮山县","142630":"山西省临汾地区吉县","142631":"山西省临汾地区乡宁县","142632":"山西省临汾地区蒲县","142633":"山西省临汾地区大宁县","142634":"山西省临汾地区永和县","142635":"山西省临汾地区隰县","142636":"山西省临汾地区汾西县","142700":"山西省运城地区","142701":"山西省运城地区运城市","142702":"山西省运城地区永济市","142703":"山西省运城地区河津市","142723":"山西省运城地区芮城县","142724":"山西省运城地区临猗县","142725":"山西省运城地区万荣县","142726":"山西省运城地区新绛县","142727":"山西省运城地区稷山县","142729":"山西省运城地区闻喜县","142730":"山西省运城地区夏县","142731":"山西省运城地区绛县","142732":"山西省运城地区平陆县","142733":"山西省运城地区垣曲县","150000":"内蒙古自治区","150100":"内蒙古自治区呼和浩特市","150101":"内蒙古自治区呼和浩特市市辖区","150102":"内蒙古自治区呼和浩特市新城区","150103":"内蒙古自治区呼和浩特市回民区","150104":"内蒙古自治区呼和浩特市玉泉区","150105":"内蒙古自治区呼和浩特市郊区","150121":"内蒙古自治区呼和浩特市土默特左旗","150122":"内蒙古自治区呼和浩特市托克托县","150123":"内蒙古自治区呼和浩特市和林格尔县","150124":"内蒙古自治区呼和浩特市清水河县","150125":"内蒙古自治区呼和浩特市武川县","150200":"内蒙古自治区包头市","150201":"内蒙古自治区包头市市辖区","150202":"内蒙古自治区包头市东河区","150203":"内蒙古自治区包头市昆都伦区","150204":"内蒙古自治区包头市青山区","150205":"内蒙古自治区包头市石拐矿区","150206":"内蒙古自治区包头市白云矿区","150207":"内蒙古自治区包头市郊区","150221":"内蒙古自治区包头市土默特右旗","150222":"内蒙古自治区包头市固阳县","150223":"内蒙古自治区包头市达尔罕茂明安联合旗","150300":"内蒙古自治区乌海市","150301":"内蒙古自治区乌海市市辖区","150302":"内蒙古自治区乌海市海勃湾区","150303":"内蒙古自治区乌海市海南区","150304":"内蒙古自治区乌海市乌达区","150400":"内蒙古自治区赤峰市","150401":"内蒙古自治区赤峰市市辖区","150402":"内蒙古自治区赤峰市红山区","150403":"内蒙古自治区赤峰市元宝山区","150404":"内蒙古自治区赤峰市松山区","150421":"内蒙古自治区赤峰市阿鲁科尔沁旗","150422":"内蒙古自治区赤峰市巴林左旗","150423":"内蒙古自治区赤峰市巴林右旗","150424":"内蒙古自治区赤峰市林西县","150425":"内蒙古自治区赤峰市克什克腾旗","150426":"内蒙古自治区赤峰市翁牛特旗","150428":"内蒙古自治区赤峰市喀喇沁旗","150429":"内蒙古自治区赤峰市宁城县","150430":"内蒙古自治区赤峰市敖汉旗","152100":"内蒙古自治区呼伦贝尔盟","152101":"内蒙古自治区呼伦贝尔盟海拉尔市","152102":"内蒙古自治区呼伦贝尔盟满洲里市","152103":"内蒙古自治区呼伦贝尔盟扎兰屯市","152104":"内蒙古自治区呼伦贝尔盟牙克石市","152105":"内蒙古自治区呼伦贝尔盟根河市","152106":"内蒙古自治区呼伦贝尔盟额尔古纳市","152122":"内蒙古自治区呼伦贝尔盟阿荣旗","152123":"内蒙古自治区呼伦贝尔盟莫力达瓦达斡尔族自治旗","152127":"内蒙古自治区呼伦贝尔盟鄂伦春自治旗","152128":"内蒙古自治区呼伦贝尔盟鄂温克族自治旗","152129":"内蒙古自治区呼伦贝尔盟新巴尔虎右旗","152130":"内蒙古自治区呼伦贝尔盟新巴尔虎左旗","152131":"内蒙古自治区呼伦贝尔盟陈巴尔虎旗","152200":"内蒙古自治区兴安盟","152201":"内蒙古自治区兴安盟乌兰浩特市","152202":"内蒙古自治区兴安盟阿尔山市","152221":"内蒙古自治区兴安盟科尔沁右翼前旗","152222":"内蒙古自治区兴安盟科尔沁右翼中旗","152223":"内蒙古自治区兴安盟扎赉特旗","152224":"内蒙古自治区兴安盟突泉县","152300":"内蒙古自治区哲里木盟","152301":"内蒙古自治区哲里木盟通辽市","152302":"内蒙古自治区哲里木盟霍林郭勒市","152322":"内蒙古自治区哲里木盟科尔沁左翼中旗","152323":"内蒙古自治区哲里木盟科尔沁左翼后旗","152324":"内蒙古自治区哲里木盟开鲁县","152325":"内蒙古自治区哲里木盟库伦旗","152326":"内蒙古自治区哲里木盟奈曼旗","152327":"内蒙古自治区哲里木盟扎鲁特旗","152500":"内蒙古自治区锡林郭勒盟","152501":"内蒙古自治区锡林郭勒盟二连浩特市","152502":"内蒙古自治区锡林郭勒盟锡林浩特市","152522":"内蒙古自治区锡林郭勒盟阿巴嘎旗","152523":"内蒙古自治区锡林郭勒盟苏尼特左旗","152524":"内蒙古自治区锡林郭勒盟苏尼特右旗","152525":"内蒙古自治区锡林郭勒盟东乌珠穆沁旗","152526":"内蒙古自治区锡林郭勒盟西乌珠穆沁旗","152527":"内蒙古自治区锡林郭勒盟太仆寺旗","152528":"内蒙古自治区锡林郭勒盟镶黄旗","152529":"内蒙古自治区锡林郭勒盟正镶白旗","152530":"内蒙古自治区锡林郭勒盟正蓝旗","152531":"内蒙古自治区锡林郭勒盟多伦县","152600":"内蒙古自治区乌兰察布盟","152601":"内蒙古自治区乌兰察布盟集宁市","152602":"内蒙古自治区乌兰察布盟丰镇市","152624":"内蒙古自治区乌兰察布盟卓资县","152625":"内蒙古自治区乌兰察布盟化德县","152626":"内蒙古自治区乌兰察布盟商都县","152627":"内蒙古自治区乌兰察布盟兴和县","152629":"内蒙古自治区乌兰察布盟凉城县","152630":"内蒙古自治区乌兰察布盟察哈尔右翼前旗","152631":"内蒙古自治区乌兰察布盟察哈尔右翼中旗","152632":"内蒙古自治区乌兰察布盟察哈尔右翼后旗","152634":"内蒙古自治区乌兰察布盟四子王旗","152700":"内蒙古自治区伊克昭盟","152701":"内蒙古自治区伊克昭盟东胜市","152722":"内蒙古自治区伊克昭盟达拉特旗","152723":"内蒙古自治区伊克昭盟准格尔旗","152724":"内蒙古自治区伊克昭盟鄂托克前旗","152725":"内蒙古自治区伊克昭盟鄂托克旗","152726":"内蒙古自治区伊克昭盟杭锦旗","152727":"内蒙古自治区伊克昭盟乌审旗","152728":"内蒙古自治区伊克昭盟伊金霍洛旗","152800":"内蒙古自治区巴彦淖尔盟","152801":"内蒙古自治区巴彦淖尔盟临河市","152822":"内蒙古自治区巴彦淖尔盟五原县","152823":"内蒙古自治区巴彦淖尔盟磴口县","152824":"内蒙古自治区巴彦淖尔盟乌拉特前旗","152825":"内蒙古自治区巴彦淖尔盟乌拉特中旗","152826":"内蒙古自治区巴彦淖尔盟乌拉特后旗","152827":"内蒙古自治区巴彦淖尔盟杭锦后旗","152900":"内蒙古自治区阿拉善盟","152921":"内蒙古自治区阿拉善盟阿拉善左旗","152922":"内蒙古自治区阿拉善盟阿拉善右旗","152923":"内蒙古自治区阿拉善盟额济纳旗","210000":"辽宁省","210100":"辽宁省沈阳市","210101":"辽宁省沈阳市市辖区","210102":"辽宁省沈阳市和平区","210103":"辽宁省沈阳市沈河区","210104":"辽宁省沈阳市大东区","210105":"辽宁省沈阳市皇姑区","210106":"辽宁省沈阳市铁西区","210111":"辽宁省沈阳市苏家屯区","210112":"辽宁省沈阳市东陵区","210113":"辽宁省沈阳市新城子区","210114":"辽宁省沈阳市于洪区","210122":"辽宁省沈阳市辽中县","210123":"辽宁省沈阳市康平县","210124":"辽宁省沈阳市法库县","210181":"辽宁省沈阳市新民市","210200":"辽宁省大连市","210201":"辽宁省大连市市辖区","210202":"辽宁省大连市中山区","210203":"辽宁省大连市西岗区","210204":"辽宁省大连市沙河口区","210211":"辽宁省大连市甘井子区","210212":"辽宁省大连市旅顺口区","210213":"辽宁省大连市金州区","210224":"辽宁省大连市长海县","210281":"辽宁省大连市瓦房店市","210282":"辽宁省大连市普兰店市","210283":"辽宁省大连市庄河市","210300":"辽宁省鞍山市","210301":"辽宁省鞍山市市辖区","210302":"辽宁省鞍山市铁东区","210303":"辽宁省鞍山市铁西区","210304":"辽宁省鞍山市立山区","210311":"辽宁省鞍山市千山区","210321":"辽宁省鞍山市台安县","210323":"辽宁省鞍山市岫岩满族自治县","210381":"辽宁省鞍山市海城市","210400":"辽宁省抚顺市","210401":"辽宁省抚顺市市辖区","210402":"辽宁省抚顺市新抚区","210403":"辽宁省抚顺市露天区","210404":"辽宁省抚顺市望花区","210411":"辽宁省抚顺市顺城区","210421":"辽宁省抚顺市抚顺县","210422":"辽宁省抚顺市新宾满族自治县","210423":"辽宁省抚顺市清原满族自治县","210500":"辽宁省本溪市","210501":"辽宁省本溪市市辖区","210502":"辽宁省本溪市平山区","210503":"辽宁省本溪市溪湖区","210504":"辽宁省本溪市明山区","210505":"辽宁省本溪市南芬区","210521":"辽宁省本溪市本溪满族自治县","210522":"辽宁省本溪市桓仁满族自治县","210600":"辽宁省丹东市","210601":"辽宁省丹东市市辖区","210602":"辽宁省丹东市元宝区","210603":"辽宁省丹东市振兴区","210604":"辽宁省丹东市振安区","210624":"辽宁省丹东市宽甸满族自治县","210681":"辽宁省丹东市东港市","210682":"辽宁省丹东市凤城市","210700":"辽宁省锦州市","210701":"辽宁省锦州市市辖区","210702":"辽宁省锦州市古塔区","210703":"辽宁省锦州市凌河区","210711":"辽宁省锦州市太和区","210726":"辽宁省锦州市黑山县","210727":"辽宁省锦州市义县","210781":"辽宁省锦州市凌海市","210782":"辽宁省锦州市北宁市","210800":"辽宁省营口市","210801":"辽宁省营口市市辖区","210802":"辽宁省营口市站前区","210803":"辽宁省营口市西市区","210804":"辽宁省营口市鲅鱼圈区","210811":"辽宁省营口市老边区","210881":"辽宁省营口市盖州市","210882":"辽宁省营口市大石桥市","210900":"辽宁省阜新市","210901":"辽宁省阜新市市辖区","210902":"辽宁省阜新市海州区","210903":"辽宁省阜新市新邱区","210904":"辽宁省阜新市太平区","210905":"辽宁省阜新市清河门区","210911":"辽宁省阜新市细河区","210921":"辽宁省阜新市阜新蒙古族自治县","210922":"辽宁省阜新市彰武县","211000":"辽宁省辽阳市","211001":"辽宁省辽阳市市辖区","211002":"辽宁省辽阳市白塔区","211003":"辽宁省辽阳市文圣区","211004":"辽宁省辽阳市宏伟区","211005":"辽宁省辽阳市弓长岭区","211011":"辽宁省辽阳市太子河区","211021":"辽宁省辽阳市辽阳县","211081":"辽宁省辽阳市灯塔市","211100":"辽宁省盘锦市","211101":"辽宁省盘锦市市辖区","211102":"辽宁省盘锦市双台子区","211103":"辽宁省盘锦市兴隆台区","211121":"辽宁省盘锦市大洼县","211122":"辽宁省盘锦市盘山县","211200":"辽宁省铁岭市","211201":"辽宁省铁岭市市辖区","211202":"辽宁省铁岭市银州区","211204":"辽宁省铁岭市清河区","211221":"辽宁省铁岭市铁岭县","211223":"辽宁省铁岭市西丰县","211224":"辽宁省铁岭市昌图县","211281":"辽宁省铁岭市铁法市","211282":"辽宁省铁岭市开原市","211300":"辽宁省朝阳市","211301":"辽宁省朝阳市市辖区","211302":"辽宁省朝阳市双塔区","211303":"辽宁省朝阳市龙城区","211321":"辽宁省朝阳市朝阳县","211322":"辽宁省朝阳市建平县","211324":"辽宁省朝阳市喀喇沁左翼蒙古族自治县","211381":"辽宁省朝阳市北票市","211382":"辽宁省朝阳市凌源市","211400":"辽宁省葫芦岛市","211401":"辽宁省葫芦岛市市辖区","211402":"辽宁省葫芦岛市连山区","211403":"辽宁省葫芦岛市龙港区","211404":"辽宁省葫芦岛市南票区","211421":"辽宁省葫芦岛市绥中县","211422":"辽宁省葫芦岛市建昌县","211481":"辽宁省葫芦岛市兴城市","220000":"吉林省","220100":"吉林省长春市","220101":"吉林省长春市市辖区","220102":"吉林省长春市南关区","220103":"吉林省长春市宽城区","220104":"吉林省长春市朝阳区","220105":"吉林省长春市二道区","220106":"吉林省长春市绿园区","220112":"吉林省长春市双阳区","220122":"吉林省长春市农安县","220181":"吉林省长春市九台市","220182":"吉林省长春市榆树市","220183":"吉林省长春市德惠市","220200":"吉林省吉林市","220201":"吉林省吉林市市辖区","220202":"吉林省吉林市昌邑区","220203":"吉林省吉林市龙潭区","220204":"吉林省吉林市船营区","220211":"吉林省吉林市丰满区","220221":"吉林省吉林市永吉县","220281":"吉林省吉林市蛟河市","220282":"吉林省吉林市桦甸市","220283":"吉林省吉林市舒兰市","220284":"吉林省吉林市磐石市","220300":"吉林省四平市","220301":"吉林省四平市市辖区","220302":"吉林省四平市铁西区","220303":"吉林省四平市铁东区","220322":"吉林省四平市梨树县","220323":"吉林省四平市伊通满族自治县","220381":"吉林省四平市公主岭市","220382":"吉林省四平市双辽市","220400":"吉林省辽源市","220401":"吉林省辽源市市辖区","220402":"吉林省辽源市龙山区","220403":"吉林省辽源市西安区","220421":"吉林省辽源市东丰县","220422":"吉林省辽源市东辽县","220500":"吉林省通化市","220501":"吉林省通化市市辖区","220502":"吉林省通化市东昌区","220503":"吉林省通化市二道江区","220521":"吉林省通化市通化县","220523":"吉林省通化市辉南县","220524":"吉林省通化市柳河县","220581":"吉林省通化市梅河口市","220582":"吉林省通化市集安市","220600":"吉林省白山市","220601":"吉林省白山市市辖区","220602":"吉林省白山市八道江区","220621":"吉林省白山市抚松县","220622":"吉林省白山市靖宇县","220623":"吉林省白山市长白朝鲜族自治县","220625":"吉林省白山市江源县","220681":"吉林省白山市临江市","220700":"吉林省松原市","220701":"吉林省松原市市辖区","220702":"吉林省松原市宁江区","220721":"吉林省松原市前郭尔罗斯蒙古族自治县","220722":"吉林省松原市长岭县","220723":"吉林省松原市乾安县","220724":"吉林省松原市扶余县","220800":"吉林省白城市","220801":"吉林省白城市市辖区","220802":"吉林省白城市洮北区","220821":"吉林省白城市镇赉县","220822":"吉林省白城市通榆县","220881":"吉林省白城市洮南市","220882":"吉林省白城市大安市","222400":"吉林省延边朝鲜族自治州","222401":"吉林省延边朝鲜族自治州延吉市","222402":"吉林省延边朝鲜族自治州图们市","222403":"吉林省延边朝鲜族自治州敦化市","222404":"吉林省延边朝鲜族自治州珲春市","222405":"吉林省延边朝鲜族自治州龙井市","222406":"吉林省延边朝鲜族自治州和龙市","222424":"吉林省延边朝鲜族自治州汪清县","222426":"吉林省延边朝鲜族自治州安图县","230000":"黑龙江省","230100":"黑龙江省哈尔滨市","230101":"黑龙江省哈尔滨市市辖区","230102":"黑龙江省哈尔滨市道里区","230103":"黑龙江省哈尔滨市南岗区","230104":"黑龙江省哈尔滨市道外区","230105":"黑龙江省哈尔滨市太平区","230106":"黑龙江省哈尔滨市香坊区","230107":"黑龙江省哈尔滨市动力区","230108":"黑龙江省哈尔滨市平房区","230121":"黑龙江省哈尔滨市呼兰县","230123":"黑龙江省哈尔滨市依兰县","230124":"黑龙江省哈尔滨市方正县","230125":"黑龙江省哈尔滨市宾县","230126":"黑龙江省哈尔滨市巴彦县","230127":"黑龙江省哈尔滨市木兰县","230128":"黑龙江省哈尔滨市通河县","230129":"黑龙江省哈尔滨市延寿县","230181":"黑龙江省哈尔滨市阿城市","230182":"黑龙江省哈尔滨市双城市","230183":"黑龙江省哈尔滨市尚志市","230184":"黑龙江省哈尔滨市五常市","230200":"黑龙江省齐齐哈尔市","230201":"黑龙江省齐齐哈尔市市辖区","230202":"黑龙江省齐齐哈尔市龙沙区","230203":"黑龙江省齐齐哈尔市建华区","230204":"黑龙江省齐齐哈尔市铁锋区","230205":"黑龙江省齐齐哈尔市昂昂溪区","230206":"黑龙江省齐齐哈尔市富拉尔基区","230207":"黑龙江省齐齐哈尔市碾子山区","230208":"黑龙江省齐齐哈尔市梅里斯达斡尔族区","230221":"黑龙江省齐齐哈尔市龙江县","230223":"黑龙江省齐齐哈尔市依安县","230224":"黑龙江省齐齐哈尔市泰来县","230225":"黑龙江省齐齐哈尔市甘南县","230227":"黑龙江省齐齐哈尔市富裕县","230229":"黑龙江省齐齐哈尔市克山县","230230":"黑龙江省齐齐哈尔市克东县","230231":"黑龙江省齐齐哈尔市拜泉县","230281":"黑龙江省齐齐哈尔市讷河市","230300":"黑龙江省鸡西市","230301":"黑龙江省鸡西市市辖区","230302":"黑龙江省鸡西市鸡冠区","230303":"黑龙江省鸡西市恒山区","230304":"黑龙江省鸡西市滴道区","230305":"黑龙江省鸡西市梨树区","230306":"黑龙江省鸡西市城子河区","230307":"黑龙江省鸡西市麻山区","230321":"黑龙江省鸡西市鸡东县","230381":"黑龙江省鸡西市虎林市","230382":"黑龙江省鸡西市密山市","230400":"黑龙江省鹤岗市","230401":"黑龙江省鹤岗市市辖区","230402":"黑龙江省鹤岗市向阳区","230403":"黑龙江省鹤岗市工农区","230404":"黑龙江省鹤岗市南山区","230405":"黑龙江省鹤岗市兴安区","230406":"黑龙江省鹤岗市东山区","230407":"黑龙江省鹤岗市兴山区","230421":"黑龙江省鹤岗市萝北县","230422":"黑龙江省鹤岗市绥滨县","230500":"黑龙江省双鸭山市","230501":"黑龙江省双鸭山市市辖区","230502":"黑龙江省双鸭山市尖山区","230503":"黑龙江省双鸭山市岭东区","230505":"黑龙江省双鸭山市四方台区","230506":"黑龙江省双鸭山市宝山区","230521":"黑龙江省双鸭山市集贤县","230522":"黑龙江省双鸭山市友谊县","230523":"黑龙江省双鸭山市宝清县","230524":"黑龙江省双鸭山市饶河县","230600":"黑龙江省大庆市","230601":"黑龙江省大庆市市辖区","230602":"黑龙江省大庆市萨尔图区","230603":"黑龙江省大庆市龙凤区","230604":"黑龙江省大庆市让胡路区","230605":"黑龙江省大庆市红岗区","230606":"黑龙江省大庆市大同区","230621":"黑龙江省大庆市肇州县","230622":"黑龙江省大庆市肇源县","230623":"黑龙江省大庆市林甸县","230624":"黑龙江省大庆市杜尔伯特蒙古族自治县","230700":"黑龙江省伊春市","230701":"黑龙江省伊春市市辖区","230702":"黑龙江省伊春市伊春区","230703":"黑龙江省伊春市南岔区","230704":"黑龙江省伊春市友好区","230705":"黑龙江省伊春市西林区","230706":"黑龙江省伊春市翠峦区","230707":"黑龙江省伊春市新青区","230708":"黑龙江省伊春市美溪区","230709":"黑龙江省伊春市金山屯区","230710":"黑龙江省伊春市五营区","230711":"黑龙江省伊春市乌马河区","230712":"黑龙江省伊春市汤旺河区","230713":"黑龙江省伊春市带岭区","230714":"黑龙江省伊春市乌伊岭区","230715":"黑龙江省伊春市红星区","230716":"黑龙江省伊春市上甘岭区","230722":"黑龙江省伊春市嘉荫县","230781":"黑龙江省伊春市铁力市","230800":"黑龙江省佳木斯市","230801":"黑龙江省佳木斯市市辖区","230802":"黑龙江省佳木斯市永红区","230803":"黑龙江省佳木斯市向阳区","230804":"黑龙江省佳木斯市前进区","230805":"黑龙江省佳木斯市东风区","230811":"黑龙江省佳木斯市郊区","230822":"黑龙江省佳木斯市桦南县","230826":"黑龙江省佳木斯市桦川县","230828":"黑龙江省佳木斯市汤原县","230833":"黑龙江省佳木斯市抚远县","230881":"黑龙江省佳木斯市同江市","230882":"黑龙江省佳木斯市富锦市","230900":"黑龙江省七台河市","230901":"黑龙江省七台河市市辖区","230902":"黑龙江省七台河市新兴区","230903":"黑龙江省七台河市桃山区","230904":"黑龙江省七台河市茄子河区","230921":"黑龙江省七台河市勃利县","231000":"黑龙江省牡丹江市","231001":"黑龙江省牡丹江市市辖区","231002":"黑龙江省牡丹江市东安区","231003":"黑龙江省牡丹江市阳明区","231004":"黑龙江省牡丹江市爱民区","231005":"黑龙江省牡丹江市西安区","231024":"黑龙江省牡丹江市东宁县","231025":"黑龙江省牡丹江市林口县","231081":"黑龙江省牡丹江市绥芬河市","231083":"黑龙江省牡丹江市海林市","231084":"黑龙江省牡丹江市宁安市","231085":"黑龙江省牡丹江市穆棱市","231100":"黑龙江省黑河市","231101":"黑龙江省黑河市市辖区","231102":"黑龙江省黑河市爱辉区","231121":"黑龙江省黑河市嫩江县","231123":"黑龙江省黑河市逊克县","231124":"黑龙江省黑河市孙吴县","231181":"黑龙江省黑河市北安市","231182":"黑龙江省黑河市五大连池市","232300":"黑龙江省绥化地区","232301":"黑龙江省绥化地区绥化市","232302":"黑龙江省绥化地区安达市","232303":"黑龙江省绥化地区肇东市","232304":"黑龙江省绥化地区海伦市","232324":"黑龙江省绥化地区望奎县","232325":"黑龙江省绥化地区兰西县","232326":"黑龙江省绥化地区青冈县","232330":"黑龙江省绥化地区庆安县","232331":"黑龙江省绥化地区明水县","232332":"黑龙江省绥化地区绥棱县","232700":"黑龙江省大兴安岭地区","232721":"黑龙江省大兴安岭地区呼玛县","232722":"黑龙江省大兴安岭地区塔河县","232723":"黑龙江省大兴安岭地区漠河县","310000":"上海市","310100":"上海市市辖区","310101":"上海市黄浦区","310102":"上海市南市区","310103":"上海市卢湾区","310104":"上海市徐汇区","310105":"上海市长宁区","310106":"上海市静安区","310107":"上海市普陀区","310108":"上海市闸北区","310109":"上海市虹口区","310110":"上海市杨浦区","310112":"上海市闵行区","310113":"上海市宝山区","310114":"上海市嘉定区","310115":"上海市浦东新区","310116":"上海市金山区","310117":"上海市松江区","310200":"上海市县","310225":"上海市南汇县","310226":"上海市奉贤县","310229":"上海市青浦县","310230":"上海市崇明县","320000":"江苏省","320100":"江苏省南京市","320101":"江苏省南京市市辖区","320102":"江苏省南京市玄武区","320103":"江苏省南京市白下区","320104":"江苏省南京市秦淮区","320105":"江苏省南京市建邺区","320106":"江苏省南京市鼓楼区","320107":"江苏省南京市下关区","320111":"江苏省南京市浦口区","320112":"江苏省南京市大厂区","320113":"江苏省南京市栖霞区","320114":"江苏省南京市雨花台区","320121":"江苏省南京市江宁县","320122":"江苏省南京市江浦县","320123":"江苏省南京市六合县","320124":"江苏省南京市溧水县","320125":"江苏省南京市高淳县","320200":"江苏省无锡市","320201":"江苏省无锡市市辖区","320202":"江苏省无锡市崇安区","320203":"江苏省无锡市南长区","320204":"江苏省无锡市北塘区","320211":"江苏省无锡市郊区","320281":"江苏省无锡市江阴市","320282":"江苏省无锡市宜兴市","320283":"江苏省无锡市锡山市","320300":"江苏省徐州市","320301":"江苏省徐州市市辖区","320302":"江苏省徐州市鼓楼区","320303":"江苏省徐州市云龙区","320304":"江苏省徐州市九里区","320305":"江苏省徐州市贾汪区","320311":"江苏省徐州市泉山区","320321":"江苏省徐州市丰县","320322":"江苏省徐州市沛县","320323":"江苏省徐州市铜山县","320324":"江苏省徐州市睢宁县","320381":"江苏省徐州市新沂市","320382":"江苏省徐州市邳州市","320400":"江苏省常州市","320401":"江苏省常州市市辖区","320402":"江苏省常州市天宁区","320404":"江苏省常州市钟楼区","320405":"江苏省常州市戚墅堰区","320411":"江苏省常州市郊区","320481":"江苏省常州市溧阳市","320482":"江苏省常州市金坛市","320483":"江苏省常州市武进市","320500":"江苏省苏州市","320501":"江苏省苏州市市辖区","320502":"江苏省苏州市沧浪区","320503":"江苏省苏州市平江区","320504":"江苏省苏州市金阊区","320511":"江苏省苏州市郊区","320581":"江苏省苏州市常熟市","320582":"江苏省苏州市张家港市","320583":"江苏省苏州市昆山市","320584":"江苏省苏州市吴江市","320585":"江苏省苏州市太仓市","320586":"江苏省苏州市吴县市","320600":"江苏省南通市","320601":"江苏省南通市市辖区","320602":"江苏省南通市崇川区","320611":"江苏省南通市港闸区","320621":"江苏省南通市海安县","320623":"江苏省南通市如东县","320681":"江苏省南通市启东市","320682":"江苏省南通市如皋市","320683":"江苏省南通市通州市","320684":"江苏省南通市海门市","320700":"江苏省连云港市","320701":"江苏省连云港市市辖区","320703":"江苏省连云港市连云区","320704":"江苏省连云港市云台区","320705":"江苏省连云港市新浦区","320706":"江苏省连云港市海州区","320721":"江苏省连云港市赣榆县","320722":"江苏省连云港市东海县","320723":"江苏省连云港市灌云县","320724":"江苏省连云港市灌南县","320800":"江苏省淮阴市","320801":"江苏省淮阴市市辖区","320802":"江苏省淮阴市清河区","320811":"江苏省淮阴市清浦区","320821":"江苏省淮阴市淮阴县","320826":"江苏省淮阴市涟水县","320829":"江苏省淮阴市洪泽县","320830":"江苏省淮阴市盱眙县","320831":"江苏省淮阴市金湖县","320882":"江苏省淮阴市淮安市","320900":"江苏省盐城市","320901":"江苏省盐城市市辖区","320902":"江苏省盐城市城区","320921":"江苏省盐城市响水县","320922":"江苏省盐城市滨海县","320923":"江苏省盐城市阜宁县","320924":"江苏省盐城市射阳县","320925":"江苏省盐城市建湖县","320928":"江苏省盐城市盐都县","320981":"江苏省盐城市东台市","320982":"江苏省盐城市大丰市","321000":"江苏省扬州市","321001":"江苏省扬州市市辖区","321002":"江苏省扬州市广陵区","321011":"江苏省扬州市郊区","321023":"江苏省扬州市宝应县","321027":"江苏省扬州市邗江县","321081":"江苏省扬州市仪征市","321084":"江苏省扬州市高邮市","321088":"江苏省扬州市江都市","321100":"江苏省镇江市","321101":"江苏省镇江市市辖区","321102":"江苏省镇江市京口区","321111":"江苏省镇江市润州区","321121":"江苏省镇江市丹徒县","321181":"江苏省镇江市丹阳市","321182":"江苏省镇江市扬中市","321183":"江苏省镇江市句容市","321200":"江苏省泰州市","321201":"江苏省泰州市市辖区","321202":"江苏省泰州市海陵区","321203":"江苏省泰州市高港区","321281":"江苏省泰州市兴化市","321282":"江苏省泰州市靖江市","321283":"江苏省泰州市泰兴市","321284":"江苏省泰州市姜堰市","321300":"江苏省宿迁市","321301":"江苏省宿迁市市辖区","321302":"江苏省宿迁市宿城区","321321":"江苏省宿迁市宿豫县","321322":"江苏省宿迁市沭阳县","321323":"江苏省宿迁市泗阳县","321324":"江苏省宿迁市泗洪县","330000":"浙江省","330100":"浙江省杭州市","330101":"浙江省杭州市市辖区","330102":"浙江省杭州市上城区","330103":"浙江省杭州市下城区","330104":"浙江省杭州市江干区","330105":"浙江省杭州市拱墅区","330106":"浙江省杭州市西湖区","330108":"浙江省杭州市滨江区","330122":"浙江省杭州市桐庐县","330127":"浙江省杭州市淳安县","330181":"浙江省杭州市萧山市","330182":"浙江省杭州市建德市","330183":"浙江省杭州市富阳市","330184":"浙江省杭州市余杭市","330185":"浙江省杭州市临安市","330200":"浙江省宁波市","330201":"浙江省宁波市市辖区","330203":"浙江省宁波市海曙区","330204":"浙江省宁波市江东区","330205":"浙江省宁波市江北区","330206":"浙江省宁波市北仑区","330211":"浙江省宁波市镇海区","330225":"浙江省宁波市象山县","330226":"浙江省宁波市宁海县","330227":"浙江省宁波市鄞县","330281":"浙江省宁波市余姚市","330282":"浙江省宁波市慈溪市","330283":"浙江省宁波市奉化市","330300":"浙江省温州市","330301":"浙江省温州市市辖区","330302":"浙江省温州市鹿城区","330303":"浙江省温州市龙湾区","330304":"浙江省温州市瓯海区","330322":"浙江省温州市洞头县","330324":"浙江省温州市永嘉县","330326":"浙江省温州市平阳县","330327":"浙江省温州市苍南县","330328":"浙江省温州市文成县","330329":"浙江省温州市泰顺县","330381":"浙江省温州市瑞安市","330382":"浙江省温州市乐清市","330400":"浙江省嘉兴市","330401":"浙江省嘉兴市市辖区","330402":"浙江省嘉兴市秀城区","330411":"浙江省嘉兴市郊区","330421":"浙江省嘉兴市嘉善县","330424":"浙江省嘉兴市海盐县","330481":"浙江省嘉兴市海宁市","330482":"浙江省嘉兴市平湖市","330483":"浙江省嘉兴市桐乡市","330500":"浙江省湖州市","330501":"浙江省湖州市市辖区","330521":"浙江省湖州市德清县","330522":"浙江省湖州市长兴县","330523":"浙江省湖州市安吉县","330600":"浙江省绍兴市","330601":"浙江省绍兴市市辖区","330602":"浙江省绍兴市越城区","330621":"浙江省绍兴市绍兴县","330624":"浙江省绍兴市新昌县","330681":"浙江省绍兴市诸暨市","330682":"浙江省绍兴市上虞市","330683":"浙江省绍兴市嵊州市","330700":"浙江省金华市","330701":"浙江省金华市市辖区","330702":"浙江省金华市婺城区","330721":"浙江省金华市金华县","330723":"浙江省金华市武义县","330726":"浙江省金华市浦江县","330727":"浙江省金华市磐安县","330781":"浙江省金华市兰溪市","330782":"浙江省金华市义乌市","330783":"浙江省金华市东阳市","330784":"浙江省金华市永康市","330800":"浙江省衢州市","330801":"浙江省衢州市市辖区","330802":"浙江省衢州市柯城区","330821":"浙江省衢州市衢县","330822":"浙江省衢州市常山县","330824":"浙江省衢州市开化县","330825":"浙江省衢州市龙游县","330881":"浙江省衢州市江山市","330900":"浙江省舟山市","330901":"浙江省舟山市市辖区","330902":"浙江省舟山市定海区","330903":"浙江省舟山市普陀区","330921":"浙江省舟山市岱山县","330922":"浙江省舟山市嵊泗县","331000":"浙江省台州市","331001":"浙江省台州市市辖区","331002":"浙江省台州市椒江区","331003":"浙江省台州市黄岩区","331004":"浙江省台州市路桥区","331021":"浙江省台州市玉环县","331022":"浙江省台州市三门县","331023":"浙江省台州市天台县","331024":"浙江省台州市仙居县","331081":"浙江省台州市温岭市","331082":"浙江省台州市临海市","332500":"浙江省丽水地区","332501":"浙江省丽水地区丽水市","332502":"浙江省丽水地区龙泉市","332522":"浙江省丽水地区青田县","332523":"浙江省丽水地区云和县","332525":"浙江省丽水地区庆元县","332526":"浙江省丽水地区缙云县","332527":"浙江省丽水地区遂昌县","332528":"浙江省丽水地区松阳县","332529":"浙江省丽水地区景宁畲族自治县","340000":"安徽省","340100":"安徽省合肥市","340101":"安徽省合肥市市辖区","340102":"安徽省合肥市东市区","340103":"安徽省合肥市中市区","340104":"安徽省合肥市西市区","340111":"安徽省合肥市郊区","340121":"安徽省合肥市长丰县","340122":"安徽省合肥市肥东县","340123":"安徽省合肥市肥西县","340200":"安徽省芜湖市","340201":"安徽省芜湖市市辖区","340202":"安徽省芜湖市镜湖区","340203":"安徽省芜湖市马塘区","340204":"安徽省芜湖市新芜区","340207":"安徽省芜湖市鸠江区","340221":"安徽省芜湖市芜湖县","340222":"安徽省芜湖市繁昌县","340223":"安徽省芜湖市南陵县","340300":"安徽省蚌埠市","340301":"安徽省蚌埠市市辖区","340302":"安徽省蚌埠市东市区","340303":"安徽省蚌埠市中市区","340304":"安徽省蚌埠市西市区","340311":"安徽省蚌埠市郊区","340321":"安徽省蚌埠市怀远县","340322":"安徽省蚌埠市五河县","340323":"安徽省蚌埠市固镇县","340400":"安徽省淮南市","340401":"安徽省淮南市市辖区","340402":"安徽省淮南市大通区","340403":"安徽省淮南市田家庵区","340404":"安徽省淮南市谢家集区","340405":"安徽省淮南市八公山区","340406":"安徽省淮南市潘集区","340421":"安徽省淮南市凤台县","340500":"安徽省马鞍山市","340501":"安徽省马鞍山市市辖区","340502":"安徽省马鞍山市金家庄区","340503":"安徽省马鞍山市花山区","340504":"安徽省马鞍山市雨山区","340505":"安徽省马鞍山市向山区","340521":"安徽省马鞍山市当涂县","340600":"安徽省淮北市","340601":"安徽省淮北市市辖区","340602":"安徽省淮北市杜集区","340603":"安徽省淮北市相山区","340604":"安徽省淮北市烈山区","340621":"安徽省淮北市濉溪县","340700":"安徽省铜陵市","340701":"安徽省铜陵市市辖区","340702":"安徽省铜陵市铜官山区","340703":"安徽省铜陵市狮子山区","340711":"安徽省铜陵市郊区","340721":"安徽省铜陵市铜陵县","340800":"安徽省安庆市","340801":"安徽省安庆市市辖区","340802":"安徽省安庆市迎江区","340803":"安徽省安庆市大观区","340811":"安徽省安庆市郊区","340822":"安徽省安庆市怀宁县","340823":"安徽省安庆市枞阳县","340824":"安徽省安庆市潜山县","340825":"安徽省安庆市太湖县","340826":"安徽省安庆市宿松县","340827":"安徽省安庆市望江县","340828":"安徽省安庆市岳西县","340881":"安徽省安庆市桐城市","341000":"安徽省黄山市","341001":"安徽省黄山市市辖区","341002":"安徽省黄山市屯溪区","341003":"安徽省黄山市黄山区","341004":"安徽省黄山市徽州区","341021":"安徽省黄山市歙县","341022":"安徽省黄山市休宁县","341023":"安徽省黄山市黟县","341024":"安徽省黄山市祁门县","341100":"安徽省滁州市","341101":"安徽省滁州市市辖区","341102":"安徽省滁州市琅琊区","341103":"安徽省滁州市南谯区","341122":"安徽省滁州市来安县","341124":"安徽省滁州市全椒县","341125":"安徽省滁州市定远县","341126":"安徽省滁州市凤阳县","341181":"安徽省滁州市天长市","341182":"安徽省滁州市明光市","341200":"安徽省阜阳市","341201":"安徽省阜阳市市辖区","341202":"安徽省阜阳市颍州区","341203":"安徽省阜阳市颍东区","341204":"安徽省阜阳市颍泉区","341221":"安徽省阜阳市临泉县","341222":"安徽省阜阳市太和县","341223":"安徽省阜阳市涡阳县","341224":"安徽省阜阳市蒙城县","341225":"安徽省阜阳市阜南县","341226":"安徽省阜阳市颍上县","341227":"安徽省阜阳市利辛县","341281":"安徽省阜阳市亳州市","341282":"安徽省阜阳市界首市","341300":"安徽省宿州市","341301":"安徽省宿州市市辖区","341302":"安徽省宿州市甬桥区","341321":"安徽省宿州市砀山县","341322":"安徽省宿州市萧县","341323":"安徽省宿州市灵璧县","341324":"安徽省宿州市泗县","342400":"安徽省六安地区","342401":"安徽省六安地区六安市","342422":"安徽省六安地区寿县","342423":"安徽省六安地区霍邱县","342425":"安徽省六安地区舒城县","342426":"安徽省六安地区金寨县","342427":"安徽省六安地区霍山县","342500":"安徽省宣城地区","342501":"安徽省宣城地区宣州市","342502":"安徽省宣城地区宁国市","342522":"安徽省宣城地区郎溪县","342523":"安徽省宣城地区广德县","342529":"安徽省宣城地区泾县","342530":"安徽省宣城地区旌德县","342531":"安徽省宣城地区绩溪县","342600":"安徽省巢湖地区","342601":"安徽省巢湖地区巢湖市","342622":"安徽省巢湖地区庐江县","342623":"安徽省巢湖地区无为县","342625":"安徽省巢湖地区含山县","342626":"安徽省巢湖地区和县","342900":"安徽省池州地区","342901":"安徽省池州地区贵池市","342921":"安徽省池州地区东至县","342922":"安徽省池州地区石台县","342923":"安徽省池州地区青阳县","350000":"福建省","350100":"福建省福州市","350101":"福建省福州市市辖区","350102":"福建省福州市鼓楼区","350103":"福建省福州市台江区","350104":"福建省福州市仓山区","350105":"福建省福州市马尾区","350111":"福建省福州市晋安区","350121":"福建省福州市闽侯县","350122":"福建省福州市连江县","350123":"福建省福州市罗源县","350124":"福建省福州市闽清县","350125":"福建省福州市永泰县","350128":"福建省福州市平潭县","350181":"福建省福州市福清市","350182":"福建省福州市长乐市","350200":"福建省厦门市","350201":"福建省厦门市市辖区","350202":"福建省厦门市鼓浪屿区","350203":"福建省厦门市思明区","350204":"福建省厦门市开元区","350205":"福建省厦门市杏林区","350206":"福建省厦门市湖里区","350211":"福建省厦门市集美区","350212":"福建省厦门市同安区","350300":"福建省莆田市","350301":"福建省莆田市市辖区","350302":"福建省莆田市城厢区","350303":"福建省莆田市涵江区","350321":"福建省莆田市莆田县","350322":"福建省莆田市仙游县","350400":"福建省三明市","350401":"福建省三明市市辖区","350402":"福建省三明市梅列区","350403":"福建省三明市三元区","350421":"福建省三明市明溪县","350423":"福建省三明市清流县","350424":"福建省三明市宁化县","350425":"福建省三明市大田县","350426":"福建省三明市尤溪县","350427":"福建省三明市沙县","350428":"福建省三明市将乐县","350429":"福建省三明市泰宁县","350430":"福建省三明市建宁县","350481":"福建省三明市永安市","350500":"福建省泉州市","350501":"福建省泉州市市辖区","350502":"福建省泉州市鲤城区","350503":"福建省泉州市丰泽区","350504":"福建省泉州市洛江区","350521":"福建省泉州市惠安县","350524":"福建省泉州市安溪县","350525":"福建省泉州市永春县","350526":"福建省泉州市德化县","350527":"福建省泉州市金门县","350581":"福建省泉州市石狮市","350582":"福建省泉州市晋江市","350583":"福建省泉州市南安市","350600":"福建省漳州市","350601":"福建省漳州市市辖区","350602":"福建省漳州市芗城区","350603":"福建省漳州市龙文区","350622":"福建省漳州市云霄县","350623":"福建省漳州市漳浦县","350624":"福建省漳州市诏安县","350625":"福建省漳州市长泰县","350626":"福建省漳州市东山县","350627":"福建省漳州市南靖县","350628":"福建省漳州市平和县","350629":"福建省漳州市华安县","350681":"福建省漳州市龙海市","350700":"福建省南平市","350701":"福建省南平市市辖区","350702":"福建省南平市延平区","350721":"福建省南平市顺昌县","350722":"福建省南平市浦城县","350723":"福建省南平市光泽县","350724":"福建省南平市松溪县","350725":"福建省南平市政和县","350781":"福建省南平市邵武市","350782":"福建省南平市武夷山市","350783":"福建省南平市建瓯市","350784":"福建省南平市建阳市","350800":"福建省龙岩市","350801":"福建省龙岩市市辖区","350802":"福建省龙岩市新罗区","350821":"福建省龙岩市长汀县","350822":"福建省龙岩市永定县","350823":"福建省龙岩市上杭县","350824":"福建省龙岩市武平县","350825":"福建省龙岩市连城县","350881":"福建省龙岩市漳平市","352200":"福建省宁德地区","352201":"福建省宁德地区宁德市","352202":"福建省宁德地区福安市","352203":"福建省宁德地区福鼎市","352225":"福建省宁德地区霞浦县","352227":"福建省宁德地区古田县","352228":"福建省宁德地区屏南县","352229":"福建省宁德地区寿宁县","352230":"福建省宁德地区周宁县","352231":"福建省宁德地区柘荣县","360000":"江西省","360100":"江西省南昌市","360101":"江西省南昌市市辖区","360102":"江西省南昌市东湖区","360103":"江西省南昌市西湖区","360104":"江西省南昌市青云谱区","360105":"江西省南昌市湾里区","360111":"江西省南昌市郊区","360121":"江西省南昌市南昌县","360122":"江西省南昌市新建县","360123":"江西省南昌市安义县","360124":"江西省南昌市进贤县","360200":"江西省景德镇市","360201":"江西省景德镇市市辖区","360202":"江西省景德镇市昌江区","360203":"江西省景德镇市珠山区","360222":"江西省景德镇市浮梁县","360281":"江西省景德镇市乐平市","360300":"江西省萍乡市","360301":"江西省萍乡市市辖区","360302":"江西省萍乡市安源区","360313":"江西省萍乡市湘东区","360321":"江西省萍乡市莲花县","360322":"江西省萍乡市上栗县","360323":"江西省萍乡市芦溪县","360400":"江西省九江市","360401":"江西省九江市市辖区","360402":"江西省九江市庐山区","360403":"江西省九江市浔阳区","360421":"江西省九江市九江县","360423":"江西省九江市武宁县","360424":"江西省九江市修水县","360425":"江西省九江市永修县","360426":"江西省九江市德安县","360427":"江西省九江市星子县","360428":"江西省九江市都昌县","360429":"江西省九江市湖口县","360430":"江西省九江市彭泽县","360481":"江西省九江市瑞昌市","360500":"江西省新余市","360501":"江西省新余市市辖区","360502":"江西省新余市渝水区","360521":"江西省新余市分宜县","360600":"江西省鹰潭市","360601":"江西省鹰潭市市辖区","360602":"江西省鹰潭市月湖区","360622":"江西省鹰潭市余江县","360681":"江西省鹰潭市贵溪市","360700":"江西省赣州市","360701":"江西省赣州市市辖区","360702":"江西省赣州市章贡区","360721":"江西省赣州市赣县","360722":"江西省赣州市信丰县","360723":"江西省赣州市大余县","360724":"江西省赣州市上犹县","360725":"江西省赣州市崇义县","360726":"江西省赣州市安远县","360727":"江西省赣州市龙南县","360728":"江西省赣州市定南县","360729":"江西省赣州市全南县","360730":"江西省赣州市宁都县","360731":"江西省赣州市于都县","360732":"江西省赣州市兴国县","360733":"江西省赣州市会昌县","360734":"江西省赣州市寻乌县","360735":"江西省赣州市石城县","360781":"江西省赣州市瑞金市","360782":"江西省赣州市南康市","362200":"江西省宜春地区","362201":"江西省宜春地区宜春市","362202":"江西省宜春地区丰城市","362203":"江西省宜春地区樟树市","362204":"江西省宜春地区高安市","362226":"江西省宜春地区奉新县","362227":"江西省宜春地区万载县","362228":"江西省宜春地区上高县","362229":"江西省宜春地区宜丰县","362232":"江西省宜春地区靖安县","362233":"江西省宜春地区铜鼓县","362300":"江西省上饶地区","362301":"江西省上饶地区上饶市","362302":"江西省上饶地区德兴市","362321":"江西省上饶地区上饶县","362322":"江西省上饶地区广丰县","362323":"江西省上饶地区玉山县","362324":"江西省上饶地区铅山县","362325":"江西省上饶地区横峰县","362326":"江西省上饶地区弋阳县","362329":"江西省上饶地区余干县","362330":"江西省上饶地区波阳县","362331":"江西省上饶地区万年县","362334":"江西省上饶地区婺源县","362400":"江西省吉安地区","362401":"江西省吉安地区吉安市","362402":"江西省吉安地区井冈山市","362421":"江西省吉安地区吉安县","362422":"江西省吉安地区吉水县","362423":"江西省吉安地区峡江县","362424":"江西省吉安地区新干县","362425":"江西省吉安地区永丰县","362426":"江西省吉安地区泰和县","362427":"江西省吉安地区遂川县","362428":"江西省吉安地区万安县","362429":"江西省吉安地区安福县","362430":"江西省吉安地区永新县","362432":"江西省吉安地区宁冈县","362500":"江西省抚州地区","362502":"江西省抚州地区临川市","362522":"江西省抚州地区南城县","362523":"江西省抚州地区黎川县","362524":"江西省抚州地区南丰县","362525":"江西省抚州地区崇仁县","362526":"江西省抚州地区乐安县","362527":"江西省抚州地区宜黄县","362528":"江西省抚州地区金溪县","362529":"江西省抚州地区资溪县","362531":"江西省抚州地区东乡县","362532":"江西省抚州地区广昌县","370000":"山东省","370100":"山东省济南市","370101":"山东省济南市市辖区","370102":"山东省济南市历下区","370103":"山东省济南市市中区","370104":"山东省济南市槐荫区","370105":"山东省济南市天桥区","370112":"山东省济南市历城区","370123":"山东省济南市长清县","370124":"山东省济南市平阴县","370125":"山东省济南市济阳县","370126":"山东省济南市商河县","370181":"山东省济南市章丘市","370200":"山东省青岛市","370201":"山东省青岛市市辖区","370202":"山东省青岛市市南区","370203":"山东省青岛市市北区","370205":"山东省青岛市四方区","370211":"山东省青岛市黄岛区","370212":"山东省青岛市崂山区","370213":"山东省青岛市李沧区","370214":"山东省青岛市城阳区","370281":"山东省青岛市胶州市","370282":"山东省青岛市即墨市","370283":"山东省青岛市平度市","370284":"山东省青岛市胶南市","370285":"山东省青岛市莱西市","370300":"山东省淄博市","370301":"山东省淄博市市辖区","370302":"山东省淄博市淄川区","370303":"山东省淄博市张店区","370304":"山东省淄博市博山区","370305":"山东省淄博市临淄区","370306":"山东省淄博市周村区","370321":"山东省淄博市桓台县","370322":"山东省淄博市高青县","370323":"山东省淄博市沂源县","370400":"山东省枣庄市","370401":"山东省枣庄市市辖区","370402":"山东省枣庄市市中区","370403":"山东省枣庄市薛城区","370404":"山东省枣庄市峄城区","370405":"山东省枣庄市台儿庄区","370406":"山东省枣庄市山亭区","370481":"山东省枣庄市滕州市","370500":"山东省东营市","370501":"山东省东营市市辖区","370502":"山东省东营市东营区","370503":"山东省东营市河口区","370521":"山东省东营市垦利县","370522":"山东省东营市利津县","370523":"山东省东营市广饶县","370600":"山东省烟台市","370601":"山东省烟台市市辖区","370602":"山东省烟台市芝罘区","370611":"山东省烟台市福山区","370612":"山东省烟台市牟平区","370613":"山东省烟台市莱山区","370634":"山东省烟台市长岛县","370681":"山东省烟台市龙口市","370682":"山东省烟台市莱阳市","370683":"山东省烟台市莱州市","370684":"山东省烟台市蓬莱市","370685":"山东省烟台市招远市","370686":"山东省烟台市栖霞市","370687":"山东省烟台市海阳市","370700":"山东省潍坊市","370701":"山东省潍坊市市辖区","370702":"山东省潍坊市潍城区","370703":"山东省潍坊市寒亭区","370704":"山东省潍坊市坊子区","370705":"山东省潍坊市奎文区","370724":"山东省潍坊市临朐县","370725":"山东省潍坊市昌乐县","370781":"山东省潍坊市青州市","370782":"山东省潍坊市诸城市","370783":"山东省潍坊市寿光市","370784":"山东省潍坊市安丘市","370785":"山东省潍坊市高密市","370786":"山东省潍坊市昌邑市","370800":"山东省济宁市","370801":"山东省济宁市市辖区","370802":"山东省济宁市市中区","370811":"山东省济宁市任城区","370826":"山东省济宁市微山县","370827":"山东省济宁市鱼台县","370828":"山东省济宁市金乡县","370829":"山东省济宁市嘉祥县","370830":"山东省济宁市汶上县","370831":"山东省济宁市泗水县","370832":"山东省济宁市梁山县","370881":"山东省济宁市曲阜市","370882":"山东省济宁市兖州市","370883":"山东省济宁市邹城市","370900":"山东省泰安市","370901":"山东省泰安市市辖区","370902":"山东省泰安市泰山区","370911":"山东省泰安市郊区","370921":"山东省泰安市宁阳县","370923":"山东省泰安市东平县","370982":"山东省泰安市新泰市","370983":"山东省泰安市肥城市","371000":"山东省威海市","371001":"山东省威海市市辖区","371002":"山东省威海市环翠区","371081":"山东省威海市文登市","371082":"山东省威海市荣成市","371083":"山东省威海市乳山市","371100":"山东省日照市","371101":"山东省日照市市辖区","371102":"山东省日照市东港区","371121":"山东省日照市五莲县","371122":"山东省日照市莒县","371200":"山东省莱芜市","371201":"山东省莱芜市市辖区","371202":"山东省莱芜市莱城区","371203":"山东省莱芜市钢城区","371300":"山东省临沂市","371301":"山东省临沂市市辖区","371302":"山东省临沂市兰山区","371311":"山东省临沂市罗庄区","371312":"山东省临沂市河东区","371321":"山东省临沂市沂南县","371322":"山东省临沂市郯城县","371323":"山东省临沂市沂水县","371324":"山东省临沂市苍山县","371325":"山东省临沂市费县","371326":"山东省临沂市平邑县","371327":"山东省临沂市莒南县","371328":"山东省临沂市蒙阴县","371329":"山东省临沂市临沭县","371400":"山东省德州市","371401":"山东省德州市市辖区","371402":"山东省德州市德城区","371421":"山东省德州市陵县","371422":"山东省德州市宁津县","371423":"山东省德州市庆云县","371424":"山东省德州市临邑县","371425":"山东省德州市齐河县","371426":"山东省德州市平原县","371427":"山东省德州市夏津县","371428":"山东省德州市武城县","371481":"山东省德州市乐陵市","371482":"山东省德州市禹城市","371500":"山东省聊城市","371501":"山东省聊城市市辖区","371502":"山东省聊城市东昌府区","371521":"山东省聊城市阳谷县","371522":"山东省聊城市莘县","371523":"山东省聊城市茌平县","371524":"山东省聊城市东阿县","371525":"山东省聊城市冠县","371526":"山东省聊城市高唐县","371581":"山东省聊城市临清市","372300":"山东省滨州地区","372301":"山东省滨州地区滨州市","372321":"山东省滨州地区惠民县","372323":"山东省滨州地区阳信县","372324":"山东省滨州地区无棣县","372325":"山东省滨州地区沾化县","372328":"山东省滨州地区博兴县","372330":"山东省滨州地区邹平县","372900":"山东省菏泽地区","372901":"山东省菏泽地区菏泽市","372922":"山东省菏泽地区曹县","372923":"山东省菏泽地区定陶县","372924":"山东省菏泽地区成武县","372925":"山东省菏泽地区单县","372926":"山东省菏泽地区巨野县","372928":"山东省菏泽地区郓城县","372929":"山东省菏泽地区鄄城县","372930":"山东省菏泽地区东明县","410000":"河南省","410100":"河南省郑州市","410101":"河南省郑州市市辖区","410102":"河南省郑州市中原区","410103":"河南省郑州市二七区","410104":"河南省郑州市管城回族区","410105":"河南省郑州市金水区","410106":"河南省郑州市上街区","410108":"河南省郑州市邙山区","410122":"河南省郑州市中牟县","410181":"河南省郑州市巩义市","410182":"河南省郑州市荥阳市","410183":"河南省郑州市新密市","410184":"河南省郑州市新郑市","410185":"河南省郑州市登封市","410200":"河南省开封市","410201":"河南省开封市市辖区","410202":"河南省开封市龙亭区","410203":"河南省开封市顺河回族区","410204":"河南省开封市鼓楼区","410205":"河南省开封市南关区","410211":"河南省开封市郊区","410221":"河南省开封市杞县","410222":"河南省开封市通许县","410223":"河南省开封市尉氏县","410224":"河南省开封市开封县","410225":"河南省开封市兰考县","410300":"河南省洛阳市","410301":"河南省洛阳市市辖区","410302":"河南省洛阳市老城区","410303":"河南省洛阳市西工区","410304":"河南省洛阳市廛河回族区","410305":"河南省洛阳市涧西区","410306":"河南省洛阳市吉利区","410311":"河南省洛阳市郊区","410322":"河南省洛阳市孟津县","410323":"河南省洛阳市新安县","410324":"河南省洛阳市栾川县","410325":"河南省洛阳市嵩县","410326":"河南省洛阳市汝阳县","410327":"河南省洛阳市宜阳县","410328":"河南省洛阳市洛宁县","410329":"河南省洛阳市伊川县","410381":"河南省洛阳市偃师市","410400":"河南省平顶山市","410401":"河南省平顶山市市辖区","410402":"河南省平顶山市新华区","410403":"河南省平顶山市卫东区","410404":"河南省平顶山市石龙区","410411":"河南省平顶山市湛河区","410421":"河南省平顶山市宝丰县","410422":"河南省平顶山市叶县","410423":"河南省平顶山市鲁山县","410425":"河南省平顶山市郏县","410481":"河南省平顶山市舞钢市","410482":"河南省平顶山市汝州市","410500":"河南省安阳市","410501":"河南省安阳市市辖区","410502":"河南省安阳市文峰区","410503":"河南省安阳市北关区","410504":"河南省安阳市铁西区","410511":"河南省安阳市郊区","410522":"河南省安阳市安阳县","410523":"河南省安阳市汤阴县","410526":"河南省安阳市滑县","410527":"河南省安阳市内黄县","410581":"河南省安阳市林州市","410600":"河南省鹤壁市","410601":"河南省鹤壁市市辖区","410602":"河南省鹤壁市鹤山区","410603":"河南省鹤壁市山城区","410611":"河南省鹤壁市郊区","410621":"河南省鹤壁市浚县","410622":"河南省鹤壁市淇县","410700":"河南省新乡市","410701":"河南省新乡市市辖区","410702":"河南省新乡市红旗区","410703":"河南省新乡市新华区","410704":"河南省新乡市北站区","410711":"河南省新乡市郊区","410721":"河南省新乡市新乡县","410724":"河南省新乡市获嘉县","410725":"河南省新乡市原阳县","410726":"河南省新乡市延津县","410727":"河南省新乡市封丘县","410728":"河南省新乡市长垣县","410781":"河南省新乡市卫辉市","410782":"河南省新乡市辉县市","410800":"河南省焦作市","410801":"河南省焦作市市辖区","410802":"河南省焦作市解放区","410803":"河南省焦作市中站区","410804":"河南省焦作市马村区","410811":"河南省焦作市山阳区","410821":"河南省焦作市修武县","410822":"河南省焦作市博爱县","410823":"河南省焦作市武陟县","410825":"河南省焦作市温县","410881":"河南省焦作市济源市","410882":"河南省焦作市沁阳市","410883":"河南省焦作市孟州市","410900":"河南省濮阳市","410901":"河南省濮阳市市辖区","410902":"河南省濮阳市市区","410922":"河南省濮阳市清丰县","410923":"河南省濮阳市南乐县","410926":"河南省濮阳市范县","410927":"河南省濮阳市台前县","410928":"河南省濮阳市濮阳县","411000":"河南省许昌市","411001":"河南省许昌市市辖区","411002":"河南省许昌市魏都区","411023":"河南省许昌市许昌县","411024":"河南省许昌市鄢陵县","411025":"河南省许昌市襄城县","411081":"河南省许昌市禹州市","411082":"河南省许昌市长葛市","411100":"河南省漯河市","411101":"河南省漯河市市辖区","411102":"河南省漯河市源汇区","411121":"河南省漯河市舞阳县","411122":"河南省漯河市临颍县","411123":"河南省漯河市郾城县","411200":"河南省三门峡市","411201":"河南省三门峡市市辖区","411202":"河南省三门峡市湖滨区","411221":"河南省三门峡市渑池县","411222":"河南省三门峡市陕县","411224":"河南省三门峡市卢氏县","411281":"河南省三门峡市义马市","411282":"河南省三门峡市灵宝市","411300":"河南省南阳市","411301":"河南省南阳市市辖区","411302":"河南省南阳市宛城区","411303":"河南省南阳市卧龙区","411321":"河南省南阳市南召县","411322":"河南省南阳市方城县","411323":"河南省南阳市西峡县","411324":"河南省南阳市镇平县","411325":"河南省南阳市内乡县","411326":"河南省南阳市淅川县","411327":"河南省南阳市社旗县","411328":"河南省南阳市唐河县","411329":"河南省南阳市新野县","411330":"河南省南阳市桐柏县","411381":"河南省南阳市邓州市","411400":"河南省商丘市","411401":"河南省商丘市市辖区","411402":"河南省商丘市梁园区","411403":"河南省商丘市睢阳区","411421":"河南省商丘市民权县","411422":"河南省商丘市睢县","411423":"河南省商丘市宁陵县","411424":"河南省商丘市柘城县","411425":"河南省商丘市虞城县","411426":"河南省商丘市夏邑县","411481":"河南省商丘市永城市","411500":"河南省信阳市","411501":"河南省信阳市市辖区","411502":"河南省信阳市师河区","411503":"河南省信阳市平桥区","411521":"河南省信阳市罗山县","411522":"河南省信阳市光山县","411523":"河南省信阳市新县","411524":"河南省信阳市商城县","411525":"河南省信阳市固始县","411526":"河南省信阳市潢川县","411527":"河南省信阳市淮滨县","411528":"河南省信阳市息县","412700":"河南省周口地区","412701":"河南省周口地区周口市","412702":"河南省周口地区项城市","412721":"河南省周口地区扶沟县","412722":"河南省周口地区西华县","412723":"河南省周口地区商水县","412724":"河南省周口地区太康县","412725":"河南省周口地区鹿邑县","412726":"河南省周口地区郸城县","412727":"河南省周口地区淮阳县","412728":"河南省周口地区沈丘县","412800":"河南省驻马店地区","412801":"河南省驻马店地区驻马店市","412821":"河南省驻马店地区确山县","412822":"河南省驻马店地区泌阳县","412823":"河南省驻马店地区遂平县","412824":"河南省驻马店地区西平县","412825":"河南省驻马店地区上蔡县","412826":"河南省驻马店地区汝南县","412827":"河南省驻马店地区平舆县","412828":"河南省驻马店地区新蔡县","412829":"河南省驻马店地区正阳县","420000":"湖北省","420100":"湖北省武汉市","420101":"湖北省武汉市市辖区","420102":"湖北省武汉市江岸区","420103":"湖北省武汉市江汉区","420104":"湖北省武汉市乔口区","420105":"湖北省武汉市汉阳区","420106":"湖北省武汉市武昌区","420107":"湖北省武汉市青山区","420111":"湖北省武汉市洪山区","420112":"湖北省武汉市东西湖区","420113":"湖北省武汉市汉南区","420114":"湖北省武汉市蔡甸区","420115":"湖北省武汉市江夏区","420116":"湖北省武汉市黄陂区","420117":"湖北省武汉市新洲区","420200":"湖北省黄石市","420201":"湖北省黄石市市辖区","420202":"湖北省黄石市黄石港区","420203":"湖北省黄石市石灰窑区","420204":"湖北省黄石市下陆区","420205":"湖北省黄石市铁山区","420222":"湖北省黄石市阳新县","420281":"湖北省黄石市大冶市","420300":"湖北省十堰市","420301":"湖北省十堰市市辖区","420302":"湖北省十堰市茅箭区","420303":"湖北省十堰市张湾区","420321":"湖北省十堰市郧县","420322":"湖北省十堰市郧西县","420323":"湖北省十堰市竹山县","420324":"湖北省十堰市竹溪县","420325":"湖北省十堰市房县","420381":"湖北省十堰市丹江口市","420500":"湖北省宜昌市","420501":"湖北省宜昌市市辖区","420502":"湖北省宜昌市西陵区","420503":"湖北省宜昌市伍家岗区","420504":"湖北省宜昌市点军区","420505":"湖北省宜昌市虎亭区","420521":"湖北省宜昌市宜昌县","420525":"湖北省宜昌市远安县","420526":"湖北省宜昌市兴山县","420527":"湖北省宜昌市秭归县","420528":"湖北省宜昌市长阳土家族自治县","420529":"湖北省宜昌市五峰土家族自治县","420581":"湖北省宜昌市宜都市","420582":"湖北省宜昌市当阳市","420583":"湖北省宜昌市枝江市","420600":"湖北省襄樊市","420601":"湖北省襄樊市市辖区","420602":"湖北省襄樊市襄城区","420606":"湖北省襄樊市樊城区","420621":"湖北省襄樊市襄阳县","420624":"湖北省襄樊市南漳县","420625":"湖北省襄樊市谷城县","420626":"湖北省襄樊市保康县","420682":"湖北省襄樊市老河口市","420683":"湖北省襄樊市枣阳市","420684":"湖北省襄樊市宜城市","420700":"湖北省鄂州市","420701":"湖北省鄂州市市辖区","420702":"湖北省鄂州市梁子湖区","420703":"湖北省鄂州市华容区","420704":"湖北省鄂州市鄂城区","420800":"湖北省荆门市","420801":"湖北省荆门市市辖区","420802":"湖北省荆门市东宝区","420821":"湖北省荆门市京山县","420822":"湖北省荆门市沙洋县","420881":"湖北省荆门市钟祥市","420900":"湖北省孝感市","420901":"湖北省孝感市市辖区","420902":"湖北省孝感市孝南区","420921":"湖北省孝感市孝昌县","420922":"湖北省孝感市大悟县","420923":"湖北省孝感市云梦县","420981":"湖北省孝感市应城市","420982":"湖北省孝感市安陆市","420983":"湖北省孝感市广水市","420984":"湖北省孝感市汉川市","421000":"湖北省荆州市","421001":"湖北省荆州市市辖区","421002":"湖北省荆州市沙市区","421003":"湖北省荆州市荆州区","421022":"湖北省荆州市公安县","421023":"湖北省荆州市监利县","421024":"湖北省荆州市江陵县","421081":"湖北省荆州市石首市","421083":"湖北省荆州市洪湖市","421087":"湖北省荆州市松滋市","421100":"湖北省黄冈市","421101":"湖北省黄冈市市辖区","421102":"湖北省黄冈市黄州区","421121":"湖北省黄冈市团风县","421122":"湖北省黄冈市红安县","421123":"湖北省黄冈市罗田县","421124":"湖北省黄冈市英山县","421125":"湖北省黄冈市浠水县","421126":"湖北省黄冈市蕲春县","421127":"湖北省黄冈市黄梅县","421181":"湖北省黄冈市麻城市","421182":"湖北省黄冈市武穴市","421200":"湖北省咸宁市","421201":"湖北省咸宁市市辖区","421202":"湖北省咸宁市咸安区","421221":"湖北省咸宁市嘉鱼县","421222":"湖北省咸宁市通城县","421223":"湖北省咸宁市崇阳县","421224":"湖北省咸宁市通山县","422800":"湖北省施土家族苗族自治州","422801":"湖北省恩施土家族苗族自治州恩施县","422802":"湖北省恩施土家族苗族自治州利川市","422822":"湖北省恩施土家族苗族自治州建始县","422823":"湖北省恩施土家族苗族自治州巴东县","422825":"湖北省恩施土家族苗族自治州宣恩县","422826":"湖北省恩施土家族苗族自治州咸丰县","422827":"湖北省恩施土家族苗族自治州来凤县","422828":"湖北省恩施土家族苗族自治州鹤峰县","429000":"湖北省省直辖县级行政单位","429001":"湖北省随州市","429004":"湖北省仙桃市","429005":"湖北省潜江市","429006":"湖北省天门市","429021":"湖北省神农架林区","430000":"湖南省","430100":"湖南省长沙市","430101":"湖南省长沙市市辖区","430102":"湖南省长沙市芙蓉区","430103":"湖南省长沙市天心区","430104":"湖南省长沙市岳麓区","430105":"湖南省长沙市开福区","430111":"湖南省长沙市雨花区","430121":"湖南省长沙市长沙县","430122":"湖南省长沙市望城县","430124":"湖南省长沙市宁乡县","430181":"湖南省长沙市浏阳市","430200":"湖南省株洲市","430201":"湖南省株洲市市辖区","430202":"湖南省株洲市荷塘区","430203":"湖南省株洲市芦淞区","430204":"湖南省株洲市石峰区","430211":"湖南省株洲市天元区","430221":"湖南省株洲市株洲县","430223":"湖南省株洲市攸县","430224":"湖南省株洲市茶陵县","430225":"湖南省株洲市炎陵县","430281":"湖南省株洲市醴陵市","430300":"湖南省湘潭市","430301":"湖南省湘潭市市辖区","430302":"湖南省湘潭市雨湖区","430304":"湖南省湘潭市岳塘区","430321":"湖南省湘潭市湘潭县","430381":"湖南省湘潭市湘乡市","430382":"湖南省湘潭市韶山市","430400":"湖南省衡阳市","430401":"湖南省衡阳市市辖区","430402":"湖南省衡阳市江东区","430403":"湖南省衡阳市城南区","430404":"湖南省衡阳市城北区","430411":"湖南省衡阳市郊区","430412":"湖南省衡阳市南岳区","430421":"湖南省衡阳市衡阳县","430422":"湖南省衡阳市衡南县","430423":"湖南省衡阳市衡山县","430424":"湖南省衡阳市衡东县","430426":"湖南省衡阳市祁东县","430481":"湖南省衡阳市耒阳市","430482":"湖南省衡阳市常宁市","430500":"湖南省邵阳市","430501":"湖南省邵阳市市辖区","430502":"湖南省邵阳市双清区","430503":"湖南省邵阳市大祥区","430511":"湖南省邵阳市北塔区","430521":"湖南省邵阳市邵东县","430522":"湖南省邵阳市新邵县","430523":"湖南省邵阳市邵阳县","430524":"湖南省邵阳市隆回县","430525":"湖南省邵阳市洞口县","430527":"湖南省邵阳市绥宁县","430528":"湖南省邵阳市新宁县","430529":"湖南省邵阳市城步苗族自治县","430581":"湖南省邵阳市武冈市","430600":"湖南省岳阳市","430601":"湖南省岳阳市市辖区","430602":"湖南省岳阳市岳阳楼区","430603":"湖南省岳阳市云溪区","430611":"湖南省岳阳市君山区","430621":"湖南省岳阳市岳阳县","430623":"湖南省岳阳市华容县","430624":"湖南省岳阳市湘阴县","430626":"湖南省岳阳市平江县","430681":"湖南省岳阳市汨罗市","430682":"湖南省岳阳市临湘市","430700":"湖南省常德市","430701":"湖南省常德市市辖区","430702":"湖南省常德市武陵区","430703":"湖南省常德市鼎城区","430721":"湖南省常德市安乡县","430722":"湖南省常德市汉寿县","430723":"湖南省常德市澧县","430724":"湖南省常德市临澧县","430725":"湖南省常德市桃源县","430726":"湖南省常德市石门县","430781":"湖南省常德市津市市","430800":"湖南省张家界市","430801":"湖南省张家界市市辖区","430802":"湖南省张家界市永定区","430811":"湖南省张家界市武陵源区","430821":"湖南省张家界市慈利县","430822":"湖南省张家界市桑植县","430900":"湖南省益阳市","430901":"湖南省益阳市市辖区","430902":"湖南省益阳市资阳区","430903":"湖南省益阳市赫山区","430921":"湖南省益阳市南县","430922":"湖南省益阳市桃江县","430923":"湖南省益阳市安化县","430981":"湖南省益阳市沅江市","431000":"湖南省郴州市","431001":"湖南省郴州市市辖区","431002":"湖南省郴州市北湖区","431003":"湖南省郴州市苏仙区","431021":"湖南省郴州市桂阳县","431022":"湖南省郴州市宜章县","431023":"湖南省郴州市永兴县","431024":"湖南省郴州市嘉禾县","431025":"湖南省郴州市临武县","431026":"湖南省郴州市汝城县","431027":"湖南省郴州市桂东县","431028":"湖南省郴州市安仁县","431081":"湖南省郴州市资兴市","431100":"湖南省永州市","431101":"湖南省永州市市辖区","431102":"湖南省永州市芝山区","431103":"湖南省永州市冷水滩区","431121":"湖南省永州市祁阳县","431122":"湖南省永州市东安县","431123":"湖南省永州市双牌县","431124":"湖南省永州市道县","431125":"湖南省永州市江永县","431126":"湖南省永州市宁远县","431127":"湖南省永州市蓝山县","431128":"湖南省永州市新田县","431129":"湖南省永州市江华瑶族自治县","431200":"湖南省怀化市","431201":"湖南省怀化市市辖区","431202":"湖南省怀化市鹤城区","431221":"湖南省怀化市中方县","431222":"湖南省怀化市沅陵县","431223":"湖南省怀化市辰溪县","431224":"湖南省怀化市溆浦县","431225":"湖南省怀化市会同县","431226":"湖南省怀化市麻阳苗族自治县","431227":"湖南省怀化市新晃侗族自治县","431228":"湖南省怀化市芷江侗族自治县","431229":"湖南省怀化市靖州苗族侗族自治县","431230":"湖南省怀化市通道侗族自治县","431281":"湖南省怀化市洪江市","432500":"湖南省娄底地区","432501":"湖南省娄底地区娄底市","432502":"湖南省娄底地区冷水江市","432503":"湖南省娄底地区涟源市","432522":"湖南省娄底地区双峰县","432524":"湖南省娄底地区新化县","433000":"湖南省怀化市","433001":"湖南省怀化市","433100":"湖南省湘西土家族苗族自治州","433101":"湖南省湘西土家族苗族自治州吉首市","433122":"湖南省湘西土家族苗族自治州泸溪县","433123":"湖南省湘西土家族苗族自治州凤凰县","433124":"湖南省湘西土家族苗族自治州花垣县","433125":"湖南省湘西土家族苗族自治州保靖县","433126":"湖南省湘西土家族苗族自治州古丈县","433127":"湖南省湘西土家族苗族自治州永顺县","433130":"湖南省湘西土家族苗族自治州龙山县","440000":"广东省","440100":"广东省广州市","440101":"广东省广州市市辖区","440102":"广东省广州市东山区","440103":"广东省广州市荔湾区","440104":"广东省广州市越秀区","440105":"广东省广州市海珠区","440106":"广东省广州市天河区","440107":"广东省广州市芳村区","440111":"广东省广州市白云区","440112":"广东省广州市黄埔区","440181":"广东省广州市番禺市","440182":"广东省广州市花都市","440183":"广东省广州市增城市","440184":"广东省广州市从化市","440200":"广东省韶关市","440201":"广东省韶关市市辖区","440202":"广东省韶关市北江区","440203":"广东省韶关市武江区","440204":"广东省韶关市浈江区","440221":"广东省韶关市曲江县","440222":"广东省韶关市始兴县","440224":"广东省韶关市仁化县","440229":"广东省韶关市翁源县","440232":"广东省韶关市乳源瑶族自治县","440233":"广东省韶关市新丰县","440281":"广东省韶关市乐昌市","440282":"广东省韶关市南雄市","440300":"广东省深圳市","440301":"广东省深圳市市辖区","440303":"广东省深圳市罗湖区","440304":"广东省深圳市福田区","440305":"广东省深圳市南山区","440306":"广东省深圳市宝安区","440307":"广东省深圳市龙岗区","440308":"广东省深圳市盐田区","440400":"广东省珠海市","440401":"广东省珠海市市辖区","440402":"广东省珠海市香洲区","440421":"广东省珠海市斗门县","440500":"广东省汕头市","440501":"广东省汕头市市辖区","440506":"广东省汕头市达濠区","440507":"广东省汕头市龙湖区","440508":"广东省汕头市金园区","440509":"广东省汕头市升平区","440510":"广东省汕头市河浦区","440523":"广东省汕头市南澳县","440582":"广东省汕头市潮阳市","440583":"广东省汕头市澄海市","440600":"广东省佛山市","440601":"广东省佛山市市辖区","440602":"广东省佛山市城区","440603":"广东省佛山市石湾区","440681":"广东省佛山市顺德市","440682":"广东省佛山市南海市","440683":"广东省佛山市三水市","440684":"广东省佛山市高明市","440700":"广东省江门市","440701":"广东省江门市市辖区","440703":"广东省江门市蓬江区","440704":"广东省江门市江海区","440781":"广东省江门市台山市","440782":"广东省江门市新会市","440783":"广东省江门市开平市","440784":"广东省江门市鹤山市","440785":"广东省江门市恩平市","440800":"广东省湛江市","440801":"广东省湛江市市辖区","440802":"广东省湛江市赤坎区","440803":"广东省湛江市霞山区","440804":"广东省湛江市坡头区","440811":"广东省湛江市麻章区","440823":"广东省湛江市遂溪县","440825":"广东省湛江市徐闻县","440881":"广东省湛江市廉江市","440882":"广东省湛江市雷州市","440883":"广东省湛江市吴川市","440900":"广东省茂名市","440901":"广东省茂名市市辖区","440902":"广东省茂名市茂南区","440923":"广东省茂名市电白县","440981":"广东省茂名市高州市","440982":"广东省茂名市化州市","440983":"广东省茂名市信宜市","441200":"广东省肇庆市","441201":"广东省肇庆市市辖区","441202":"广东省肇庆市端州区","441203":"广东省肇庆市鼎湖区","441223":"广东省肇庆市广宁县","441224":"广东省肇庆市怀集县","441225":"广东省肇庆市封开县","441226":"广东省肇庆市德庆县","441283":"广东省肇庆市高要市","441284":"广东省肇庆市四会市","441300":"广东省惠州市","441301":"广东省惠州市市辖区","441302":"广东省惠州市惠城区","441322":"广东省惠州市博罗县","441323":"广东省惠州市惠东县","441324":"广东省惠州市龙门县","441381":"广东省惠州市惠阳市","441400":"广东省梅州市","441401":"广东省梅州市市辖区","441402":"广东省梅州市梅江区","441421":"广东省梅州市梅县","441422":"广东省梅州市大埔县","441423":"广东省梅州市丰顺县","441424":"广东省梅州市五华县","441426":"广东省梅州市平远县","441427":"广东省梅州市蕉岭县","441481":"广东省梅州市兴宁市","441500":"广东省汕尾市","441501":"广东省汕尾市市辖区","441502":"广东省汕尾市城区","441521":"广东省汕尾市海丰县","441523":"广东省汕尾市陆河县","441581":"广东省汕尾市陆丰市","441600":"广东省河源市","441601":"广东省河源市市辖区","441602":"广东省河源市源城区","441621":"广东省河源市紫金县","441622":"广东省河源市龙川县","441623":"广东省河源市连平县","441624":"广东省河源市和平县","441625":"广东省河源市东源县","441700":"广东省阳江市","441701":"广东省阳江市市辖区","441702":"广东省阳江市江城区","441721":"广东省阳江市阳西县","441723":"广东省阳江市阳东县","441781":"广东省阳江市阳春市","441800":"广东省清远市","441801":"广东省清远市市辖区","441802":"广东省清远市清城区","441821":"广东省清远市佛冈县","441823":"广东省清远市阳山县","441825":"广东省清远市连山壮族瑶族自治县","441826":"广东省清远市连南瑶族自治县","441827":"广东省清远市清新县","441881":"广东省清远市英德市","441882":"广东省清远市连州市","441900":"广东省东莞市","441901":"广东省东莞市市辖区","442000":"广东省中山市","442001":"广东省中山市市辖区","445100":"广东省潮州市","445101":"广东省潮州市市辖区","445102":"广东省潮州市湘桥区","445121":"广东省潮州市潮安县","445122":"广东省潮州市饶平县","445200":"广东省揭阳市","445201":"广东省揭阳市市辖区","445202":"广东省揭阳市榕城区","445221":"广东省揭阳市揭东县","445222":"广东省揭阳市揭西县","445224":"广东省揭阳市惠来县","445281":"广东省揭阳市普宁市","445300":"广东省云浮市","445301":"广东省云浮市市辖区","445302":"广东省云浮市云城区","445321":"广东省云浮市新兴县","445322":"广东省云浮市郁南县","445323":"广东省云浮市云安县","445381":"广东省云浮市罗定市","450000":"广西壮族自治区","450100":"广西壮族自治区南宁市","450101":"广西壮族自治区南宁市市辖区","450102":"广西壮族自治区南宁市兴宁区","450103":"广西壮族自治区南宁市新城区","450104":"广西壮族自治区南宁市城北区","450105":"广西壮族自治区南宁市江南区","450106":"广西壮族自治区南宁市永新区","450111":"广西壮族自治区南宁市市郊区","450121":"广西壮族自治区南宁市邕宁县","450122":"广西壮族自治区南宁市武鸣县","450200":"广西壮族自治区柳州市","450201":"广西壮族自治区柳州市市辖区","450202":"广西壮族自治区柳州市城中区","450203":"广西壮族自治区柳州市鱼峰区","450204":"广西壮族自治区柳州市柳南区","450205":"广西壮族自治区柳州市柳北区","450211":"广西壮族自治区柳州市市郊区","450221":"广西壮族自治区柳州市柳江县","450222":"广西壮族自治区柳州市柳城县","450300":"广西壮族自治区桂林市","450301":"广西壮族自治区桂林市市辖区","450302":"广西壮族自治区桂林市秀峰区","450303":"广西壮族自治区桂林市叠彩区","450304":"广西壮族自治区桂林市象山区","450305":"广西壮族自治区桂林市七星区","450311":"广西壮族自治区桂林市雁山区","450321":"广西壮族自治区桂林市阳朔县","450322":"广西壮族自治区桂林市临桂县","450323":"广西壮族自治区桂林市灵川县","450324":"广西壮族自治区桂林市全州县","450325":"广西壮族自治区桂林市兴安县","450326":"广西壮族自治区桂林市永福县","450327":"广西壮族自治区桂林市灌阳县","450328":"广西壮族自治区桂林市龙胜各族自治县","450329":"广西壮族自治区桂林市资源县","450330":"广西壮族自治区桂林市平乐县","450331":"广西壮族自治区桂林市荔浦县","450332":"广西壮族自治区桂林市恭城瑶族自治县","450400":"广西壮族自治区梧州市","450401":"广西壮族自治区梧州市市辖区","450403":"广西壮族自治区梧州市万秀区","450404":"广西壮族自治区梧州市蝶山区","450411":"广西壮族自治区梧州市市郊区","450421":"广西壮族自治区梧州市苍梧县","450422":"广西壮族自治区梧州市藤县","450423":"广西壮族自治区梧州市蒙山县","450481":"广西壮族自治区梧州市岑溪市","450500":"广西壮族自治区北海市","450501":"广西壮族自治区北海市市辖区","450502":"广西壮族自治区北海市海城区","450503":"广西壮族自治区北海市银海区","450512":"广西壮族自治区北海市铁山港区","450521":"广西壮族自治区北海市合浦县","450600":"广西壮族自治区防城港市","450601":"广西壮族自治区防城港市市辖区","450602":"广西壮族自治区防城港市港口区","450603":"广西壮族自治区防城港市防城区","450621":"广西壮族自治区防城港市上思县","450681":"广西壮族自治区防城港市东兴市","450700":"广西壮族自治区钦州市","450701":"广西壮族自治区钦州市市辖区","450702":"广西壮族自治区钦州市钦南区","450703":"广西壮族自治区钦州市钦北区","450721":"广西壮族自治区钦州市灵山县","450722":"广西壮族自治区钦州市浦北县","450800":"广西壮族自治区贵港市","450801":"广西壮族自治区贵港市市辖区","450802":"广西壮族自治区贵港市港北区","450803":"广西壮族自治区贵港市港南区","450821":"广西壮族自治区贵港市平南县","450881":"广西壮族自治区贵港市桂平市","450900":"广西壮族自治区玉林市","450901":"广西壮族自治区玉林市市辖区","450902":"广西壮族自治区玉林市玉州区","450921":"广西壮族自治区玉林市容县","450922":"广西壮族自治区玉林市陆川县","450923":"广西壮族自治区玉林市博白县","450924":"广西壮族自治区玉林市兴业县","450981":"广西壮族自治区玉林市北流市","452100":"广西壮族自治区南宁地区","452101":"广西壮族自治区南宁地区凭祥市","452122":"广西壮族自治区南宁地区横县","452123":"广西壮族自治区南宁地区宾阳县","452124":"广西壮族自治区南宁地区上林县","452126":"广西壮族自治区南宁地区隆安县","452127":"广西壮族自治区南宁地区马山县","452128":"广西壮族自治区南宁地区扶绥县","452129":"广西壮族自治区南宁地区崇左县","452130":"广西壮族自治区南宁地区大新县","452131":"广西壮族自治区南宁地区天等县","452132":"广西壮族自治区南宁地区宁明县","452133":"广西壮族自治区南宁地区龙州县","452200":"广西壮族自治区柳州地区","452201":"广西壮族自治区柳州地区合山市","452223":"广西壮族自治区柳州地区鹿寨县","452224":"广西壮族自治区柳州地区象州县","452225":"广西壮族自治区柳州地区武宣县","452226":"广西壮族自治区柳州地区来宾县","452227":"广西壮族自治区柳州地区融安县","452228":"广西壮族自治区柳州地区三江侗族自治县","452229":"广西壮族自治区柳州地区融水苗族自治县","452230":"广西壮族自治区柳州地区金秀瑶族自治县","452231":"广西壮族自治区柳州地区忻城县","452400":"广西壮族自治区贺州地区","452402":"广西壮族自治区贺州地区贺州市","452424":"广西壮族自治区贺州地区昭平县","452427":"广西壮族自治区贺州地区钟山县","452428":"广西壮族自治区贺州地区富川瑶族自治县","452600":"广西壮族自治区百色地区","452601":"广西壮族自治区百色地区百色市","452622":"广西壮族自治区百色地区田阳县","452623":"广西壮族自治区百色地区田东县","452624":"广西壮族自治区百色地区平果县","452625":"广西壮族自治区百色地区德保县","452626":"广西壮族自治区百色地区靖西县","452627":"广西壮族自治区百色地区那坡县","452628":"广西壮族自治区百色地区凌云县","452629":"广西壮族自治区百色地区乐业县","452630":"广西壮族自治区百色地区田林县","452631":"广西壮族自治区百色地区隆林各族自治县","452632":"广西壮族自治区百色地区西林县","452700":"广西壮族自治区河池地区","452701":"广西壮族自治区河池地区河池市","452702":"广西壮族自治区河池地区宜州市","452723":"广西壮族自治区河池地区罗城仫佬族自治县","452724":"广西壮族自治区河池地区环江毛南族自治县","452725":"广西壮族自治区河池地区南丹县","452726":"广西壮族自治区河池地区天峨县","452727":"广西壮族自治区河池地区凤山县","452728":"广西壮族自治区河池地区东兰县","452729":"广西壮族自治区河池地区巴马瑶族自治县","452730":"广西壮族自治区河池地区都安瑶族自治县","452731":"广西壮族自治区河池地区大化瑶族自治县","460000":"海南省","460001":"海南省三亚市通什市","460002":"海南省三亚市琼海市","460003":"海南省三亚市儋州市","460004":"海南省三亚市琼山市","460005":"海南省三亚市文昌市","460006":"海南省三亚市万宁市","460007":"海南省三亚市东方市","460025":"海南省三亚市定安县","460026":"海南省三亚市屯昌县","460027":"海南省三亚市澄迈县","460028":"海南省三亚市临高县","460030":"海南省三亚市白沙黎族自治县","460031":"海南省三亚市昌江黎族自治县","460033":"海南省三亚市乐东黎族自治县","460034":"海南省三亚市陵水黎族自治县","460035":"海南省三亚市保亭黎族苗族自治县","460036":"海南省三亚市琼中黎族苗族自治县","460037":"海南省西沙群岛","460038":"海南省南沙群岛","460039":"海南省中沙群岛的岛礁及其海域","460100":"海南省海口市","460101":"海南省海口市市辖区","460102":"海南省海口市振东区","460103":"海南省海口市新华区","460104":"海南省海口市秀英区","460200":"海南省三亚市","460201":"海南省三亚市市辖区","500000":"重庆市","500100":"重庆市市辖区","500101":"重庆市万州区","500102":"重庆市涪陵区","500103":"重庆市渝中区","500104":"重庆市大渡口区","500105":"重庆市江北区","500106":"重庆市沙坪坝区","500107":"重庆市九龙坡区","500108":"重庆市南岸区","500109":"重庆市北碚区","500110":"重庆市万盛区","500111":"重庆市双桥区","500112":"重庆市渝北区","500113":"重庆市巴南区","500200":"重庆市县","500221":"重庆市长寿县","500222":"重庆市綦江县","500223":"重庆市潼南县","500224":"重庆市铜梁县","500225":"重庆市大足县","500226":"重庆市荣昌县","500227":"重庆市璧山县","500228":"重庆市梁平县","500229":"重庆市城口县","500230":"重庆市丰都县","500231":"重庆市垫江县","500232":"重庆市武隆县","500233":"重庆市忠县","500234":"重庆市开县","500235":"重庆市云阳县","500236":"重庆市奉节县","500237":"重庆市巫山县","500238":"重庆市巫溪县","500239":"重庆市黔江土家族苗族自治县","500240":"重庆市石柱土家族自治县","500241":"重庆市秀山土家族苗族自治县","500242":"重庆市酉阳土家族苗族自治县","500243":"重庆市彭水苗族土家族自治县","500300":"重庆市(市)","500381":"重庆市江津市","500382":"重庆市合川市","500383":"重庆市永川市","500384":"重庆市南川市","510000":"四川省","510100":"四川省成都市","510101":"四川省成都市市辖区","510104":"四川省成都市锦江区","510105":"四川省成都市青羊区","510106":"四川省成都市金牛区","510107":"四川省成都市武侯区","510108":"四川省成都市成华区","510112":"四川省成都市龙泉驿区","510113":"四川省成都市青白江区","510121":"四川省成都市金堂县","510122":"四川省成都市双流县","510123":"四川省成都市温江县","510124":"四川省成都市郫县","510125":"四川省成都市新都县","510129":"四川省成都市大邑县","510131":"四川省成都市蒲江县","510132":"四川省成都市新津县","510181":"四川省成都市都江堰市","510182":"四川省成都市彭州市","510183":"四川省成都市邛崃市","510184":"四川省成都市崇州市","510300":"四川省自贡市","510301":"四川省自贡市市辖区","510302":"四川省自贡市自流井区","510303":"四川省自贡市贡井区","510304":"四川省自贡市大安区","510311":"四川省自贡市沿滩区","510321":"四川省自贡市荣县","510322":"四川省自贡市富顺县","510400":"四川省攀枝花市","510401":"四川省攀枝花市市辖区","510402":"四川省攀枝花市东区","510403":"四川省攀枝花市西区","510411":"四川省攀枝花市仁和区","510421":"四川省攀枝花市米易县","510422":"四川省攀枝花市盐边县","510500":"四川省泸州市","510501":"四川省泸州市市辖区","510502":"四川省泸州市江阳区","510503":"四川省泸州市纳溪区","510504":"四川省泸州市龙马潭区","510521":"四川省泸州市泸县","510522":"四川省泸州市合江县","510524":"四川省泸州市叙永县","510525":"四川省泸州市古蔺县","510600":"四川省德阳市","510601":"四川省德阳市市辖区","510603":"四川省德阳市旌阳区","510623":"四川省德阳市中江县","510626":"四川省德阳市罗江县","510681":"四川省德阳市广汉市","510682":"四川省德阳市什邡市","510683":"四川省德阳市绵竹市","510700":"四川省绵阳市","510701":"四川省绵阳市市辖区","510703":"四川省绵阳市涪城区","510704":"四川省绵阳市游仙区","510722":"四川省绵阳市三台县","510723":"四川省绵阳市盐亭县","510724":"四川省绵阳市安县","510725":"四川省绵阳市梓潼县","510726":"四川省绵阳市北川县","510727":"四川省绵阳市平武县","510781":"四川省绵阳市江油市","510800":"四川省广元市","510801":"四川省广元市市辖区","510802":"四川省广元市市中区","510811":"四川省广元市元坝区","510812":"四川省广元市朝天区","510821":"四川省广元市旺苍县","510822":"四川省广元市青川县","510823":"四川省广元市剑阁县","510824":"四川省广元市苍溪县","510900":"四川省遂宁市","510901":"四川省遂宁市市辖区","510902":"四川省遂宁市市中区","510921":"四川省遂宁市蓬溪县","510922":"四川省遂宁市射洪县","510923":"四川省遂宁市大英县","511000":"四川省内江市","511001":"四川省内江市市辖区","511002":"四川省内江市市中区","511011":"四川省内江市东兴区","511024":"四川省内江市威远县","511025":"四川省内江市资中县","511028":"四川省内江市隆昌县","511100":"四川省乐山市","511101":"四川省乐山市市辖区","511102":"四川省乐山市市中区","511111":"四川省乐山市沙湾区","511112":"四川省乐山市五通桥区","511113":"四川省乐山市金口河区","511123":"四川省乐山市犍为县","511124":"四川省乐山市井研县","511126":"四川省乐山市夹江县","511129":"四川省乐山市沐川县","511132":"四川省乐山市峨边彝族自治县","511133":"四川省乐山市马边彝族自治县","511181":"四川省乐山市峨眉山市","511300":"四川省南充市","511301":"四川省南充市市辖区","511302":"四川省南充市顺庆区","511303":"四川省南充市高坪区","511304":"四川省南充市嘉陵区","511321":"四川省南充市南部县","511322":"四川省南充市营山县","511323":"四川省南充市蓬安县","511324":"四川省南充市仪陇县","511325":"四川省南充市西充县","511381":"四川省南充市阆中市","511500":"四川省宜宾市","511501":"四川省宜宾市市辖区","511502":"四川省宜宾市翠屏区","511521":"四川省宜宾市宜宾县","511522":"四川省宜宾市南溪县","511523":"四川省宜宾市江安县","511524":"四川省宜宾市长宁县","511525":"四川省宜宾市高县","511526":"四川省宜宾市珙县","511527":"四川省宜宾市筠连县","511528":"四川省宜宾市兴文县","511529":"四川省宜宾市屏山县","511600":"四川省广安市","511601":"四川省广安市市辖区","511602":"四川省广安市广安区","511621":"四川省广安市岳池县","511622":"四川省广安市武胜县","511623":"四川省广安市邻水县","511681":"四川省广安市华蓥市","513000":"四川省达川地区","513001":"四川省达川地区达川市","513002":"四川省达川地区万源市","513021":"四川省达川地区达县","513022":"四川省达川地区宣汉县","513023":"四川省达川地区开江县","513029":"四川省达川地区大竹县","513030":"四川省达川地区渠县","513100":"四川省雅安地区","513101":"四川省雅安地区雅安市","513122":"四川省雅安地区名山县","513123":"四川省雅安地区荥经县","513124":"四川省雅安地区汉源县","513125":"四川省雅安地区石棉县","513126":"四川省雅安地区天全县","513127":"四川省雅安地区芦山县","513128":"四川省雅安地区宝兴县","513200":"四川省阿坝藏族羌族自治州","513221":"四川省阿坝藏族羌族自治州汶川县","513222":"四川省阿坝藏族羌族自治州理县","513223":"四川省阿坝藏族羌族自治州茂县","513224":"四川省阿坝藏族羌族自治州松潘县","513225":"四川省阿坝藏族羌族自治州九寨沟县","513226":"四川省阿坝藏族羌族自治州金川县","513227":"四川省阿坝藏族羌族自治州小金县","513228":"四川省阿坝藏族羌族自治州黑水县","513229":"四川省阿坝藏族羌族自治州马尔康县","513230":"四川省阿坝藏族羌族自治州壤塘县","513231":"四川省阿坝藏族羌族自治州阿坝县","513232":"四川省阿坝藏族羌族自治州若尔盖县","513233":"四川省阿坝藏族羌族自治州红原县","513300":"四川省甘孜藏族自治州","513321":"四川省甘孜藏族自治州康定县","513322":"四川省甘孜藏族自治州泸定县","513323":"四川省甘孜藏族自治州丹巴县","513324":"四川省甘孜藏族自治州九龙县","513325":"四川省甘孜藏族自治州雅江县","513326":"四川省甘孜藏族自治州道孚县","513327":"四川省甘孜藏族自治州炉霍县","513328":"四川省甘孜藏族自治州甘孜县","513329":"四川省甘孜藏族自治州新龙县","513330":"四川省甘孜藏族自治州德格县","513331":"四川省甘孜藏族自治州白玉县","513332":"四川省甘孜藏族自治州石渠县","513333":"四川省甘孜藏族自治州色达县","513334":"四川省甘孜藏族自治州理塘县","513335":"四川省甘孜藏族自治州巴塘县","513336":"四川省甘孜藏族自治州乡城县","513337":"四川省甘孜藏族自治州稻城县","513338":"四川省甘孜藏族自治州得荣县","513400":"四川省凉山彝族自治州","513401":"四川省凉山彝族自治州西昌市","513422":"四川省凉山彝族自治州木里藏族自治县","513423":"四川省凉山彝族自治州盐源县","513424":"四川省凉山彝族自治州德昌县","513425":"四川省凉山彝族自治州会理县","513426":"四川省凉山彝族自治州会东县","513427":"四川省凉山彝族自治州宁南县","513428":"四川省凉山彝族自治州普格县","513429":"四川省凉山彝族自治州布拖县","513430":"四川省凉山彝族自治州金阳县","513431":"四川省凉山彝族自治州昭觉县","513432":"四川省凉山彝族自治州喜德县","513433":"四川省凉山彝族自治州冕宁县","513434":"四川省凉山彝族自治州越西县","513435":"四川省凉山彝族自治州甘洛县","513436":"四川省凉山彝族自治州美姑县","513437":"四川省凉山彝族自治州雷波县","513700":"四川省巴中地区","513701":"四川省巴中地区巴中市","513721":"四川省巴中地区通江县","513722":"四川省巴中地区南江县","513723":"四川省巴中地区平昌县","513800":"四川省眉山地区","513821":"四川省眉山地区眉山县","513822":"四川省眉山地区仁寿县","513823":"四川省眉山地区彭山县","513824":"四川省眉山地区洪雅县","513825":"四川省眉山地区丹棱县","513826":"四川省眉山地区青神县","513900":"四川省眉山地区资阳地区","513901":"四川省眉山地区资阳市","513902":"四川省眉山地区简阳市","513921":"四川省眉山地区安岳县","513922":"四川省眉山地区乐至县","520000":"贵州省","520100":"贵州省贵阳市","520101":"贵州省贵阳市市辖区","520102":"贵州省贵阳市南明区","520103":"贵州省贵阳市云岩区","520111":"贵州省贵阳市花溪区","520112":"贵州省贵阳市乌当区","520113":"贵州省贵阳市白云区","520121":"贵州省贵阳市开阳县","520122":"贵州省贵阳市息烽县","520123":"贵州省贵阳市修文县","520181":"贵州省贵阳市清镇市","520200":"贵州省六盘水市","520201":"贵州省六盘水市钟山区","520202":"贵州省六盘水市盘县特区","520203":"贵州省六盘水市六枝特区","520221":"贵州省六盘水市水城县","520300":"贵州省遵义市","520301":"贵州省遵义市市辖区","520302":"贵州省遵义市红花岗区","520321":"贵州省遵义市遵义县","520322":"贵州省遵义市桐梓县","520323":"贵州省遵义市绥阳县","520324":"贵州省遵义市正安县","520325":"贵州省遵义市道真仡佬族苗族自治县","520326":"贵州省遵义市务川仡佬族苗族自治县","520327":"贵州省遵义市凤冈县","520328":"贵州省遵义市湄潭县","520329":"贵州省遵义市余庆县","520330":"贵州省遵义市习水县","520381":"贵州省遵义市赤水市","520382":"贵州省遵义市仁怀市","522200":"贵州省铜仁地区","522201":"贵州省铜仁地区铜仁市","522222":"贵州省铜仁地区江口县","522223":"贵州省铜仁地区玉屏侗族自治县","522224":"贵州省铜仁地区石阡县","522225":"贵州省铜仁地区思南县","522226":"贵州省铜仁地区印江土家族苗族自治县","522227":"贵州省铜仁地区德江县","522228":"贵州省铜仁地区沿河土家族自治县","522229":"贵州省铜仁地区松桃苗族自治县","522230":"贵州省铜仁地区万山特区","522300":"贵州省黔西南布依族苗族自治州","522301":"贵州省黔西南布依族苗族自治州兴义市","522322":"贵州省黔西南布依族苗族自治州兴仁县","522323":"贵州省黔西南布依族苗族自治州普安县","522324":"贵州省黔西南布依族苗族自治州晴隆县","522325":"贵州省黔西南布依族苗族自治州贞丰县","522326":"贵州省黔西南布依族苗族自治州望谟县","522327":"贵州省黔西南布依族苗族自治州册亨县","522328":"贵州省黔西南布依族苗族自治州安龙县","522400":"贵州省毕节地区","522401":"贵州省毕节地区毕节市","522422":"贵州省毕节地区大方县","522423":"贵州省毕节地区黔西县","522424":"贵州省毕节地区金沙县","522425":"贵州省毕节地区织金县","522426":"贵州省毕节地区纳雍县","522427":"贵州省毕节地区威宁彝族回族苗族自治县","522428":"贵州省毕节地区赫章县","522500":"贵州省安顺地区","522501":"贵州省安顺地区安顺市","522526":"贵州省安顺地区平坝县","522527":"贵州省安顺地区普定县","522528":"贵州省安顺地区关岭布依族苗族自治县","522529":"贵州省安顺地区镇宁布依族苗族自治县","522530":"贵州省安顺地区紫云苗族布依族自治县","522600":"贵州省黔东南苗族侗族自治州","522601":"贵州省黔东南苗族侗族自治州凯里市","522622":"贵州省黔东南苗族侗族自治州黄平县","522623":"贵州省黔东南苗族侗族自治州施秉县","522624":"贵州省黔东南苗族侗族自治州三穗县","522625":"贵州省黔东南苗族侗族自治州镇远县","522626":"贵州省黔东南苗族侗族自治州岑巩县","522627":"贵州省黔东南苗族侗族自治州天柱县","522628":"贵州省黔东南苗族侗族自治州锦屏县","522629":"贵州省黔东南苗族侗族自治州剑河县","522630":"贵州省黔东南苗族侗族自治州台江县","522631":"贵州省黔东南苗族侗族自治州黎平县","522632":"贵州省黔东南苗族侗族自治州榕江县","522633":"贵州省黔东南苗族侗族自治州从江县","522634":"贵州省黔东南苗族侗族自治州雷山县","522635":"贵州省黔东南苗族侗族自治州麻江县","522636":"贵州省黔东南苗族侗族自治州丹寨县","522700":"贵州省黔南布依族苗族自治州","522701":"贵州省黔南布依族苗族自治州都匀市","522702":"贵州省黔南布依族苗族自治州福泉市","522722":"贵州省黔南布依族苗族自治州荔波县","522723":"贵州省黔南布依族苗族自治州贵定县","522725":"贵州省黔南布依族苗族自治州瓮安县","522726":"贵州省黔南布依族苗族自治州独山县","522727":"贵州省黔南布依族苗族自治州平塘县","522728":"贵州省黔南布依族苗族自治州罗甸县","522729":"贵州省黔南布依族苗族自治州长顺县","522730":"贵州省黔南布依族苗族自治州龙里县","522731":"贵州省黔南布依族苗族自治州惠水县","522732":"贵州省黔南布依族苗族自治州三都水族自治县","530000":"云南省","530100":"云南省昆明市","530101":"云南省昆明市市辖区","530102":"云南省昆明市五华区","530103":"云南省昆明市盘龙区","530111":"云南省昆明市官渡区","530112":"云南省昆明市西山区","530113":"云南省昆明市东川区","530121":"云南省昆明市呈贡县","530122":"云南省昆明市晋宁县","530124":"云南省昆明市富民县","530125":"云南省昆明市宜良县","530126":"云南省昆明市石林彝族自治县","530127":"云南省昆明市嵩明县","530128":"云南省昆明市禄劝彝族苗族自治县","530129":"云南省昆明市寻甸回族彝族自治县","530181":"云南省昆明市安宁市","530300":"云南省曲靖市","530301":"云南省曲靖市市辖区","530302":"云南省曲靖市麒麟区","530321":"云南省曲靖市马龙县","530322":"云南省曲靖市陆良县","530323":"云南省曲靖市师宗县","530324":"云南省曲靖市罗平县","530325":"云南省曲靖市富源县","530326":"云南省曲靖市会泽县","530328":"云南省曲靖市沾益县","530381":"云南省曲靖市宣威市","530400":"云南省玉溪市","530401":"云南省玉溪市市辖区","530402":"云南省玉溪市红塔区","530421":"云南省玉溪市江川县","530422":"云南省玉溪市澄江县","530423":"云南省玉溪市通海县","530424":"云南省玉溪市华宁县","530425":"云南省玉溪市易门县","530426":"云南省玉溪市峨山彝族自治县","530427":"云南省玉溪市新平彝族傣族自治县","530428":"云南省玉溪市元江哈尼族彝族傣族自治县","532100":"云南省昭通地区","532101":"云南省昭通地区昭通市","532122":"云南省昭通地区鲁甸县","532123":"云南省昭通地区巧家县","532124":"云南省昭通地区盐津县","532125":"云南省昭通地区大关县","532126":"云南省昭通地区永善县","532127":"云南省昭通地区绥江县","532128":"云南省昭通地区镇雄县","532129":"云南省昭通地区彝良县","532130":"云南省昭通地区威信县","532131":"云南省昭通地区水富县","532300":"云南省楚雄彝族自治州","532301":"云南省楚雄彝族自治州楚雄市","532322":"云南省楚雄彝族自治州双柏县","532323":"云南省楚雄彝族自治州牟定县","532324":"云南省楚雄彝族自治州南华县","532325":"云南省楚雄彝族自治州姚安县","532326":"云南省楚雄彝族自治州大姚县","532327":"云南省楚雄彝族自治州永仁县","532328":"云南省楚雄彝族自治州元谋县","532329":"云南省楚雄彝族自治州武定县","532331":"云南省楚雄彝族自治州禄丰县","532500":"云南省红河哈尼族彝族自治州","532501":"云南省红河哈尼族彝族自治州个旧市","532502":"云南省红河哈尼族彝族自治州开远市","532522":"云南省红河哈尼族彝族自治州蒙自县","532523":"云南省红河哈尼族彝族自治州屏边苗族自治县","532524":"云南省红河哈尼族彝族自治州建水县","532525":"云南省红河哈尼族彝族自治州石屏县","532526":"云南省红河哈尼族彝族自治州弥勒县","532527":"云南省红河哈尼族彝族自治州泸西县","532528":"云南省红河哈尼族彝族自治州元阳县","532529":"云南省红河哈尼族彝族自治州红河县","532530":"云南省红河哈尼族彝族自治州金平苗族瑶族傣族自治县","532531":"云南省红河哈尼族彝族自治州绿春县","532532":"云南省红河哈尼族彝族自治州河口瑶族自治县","532600":"云南省文山壮族苗族自治州","532621":"云南省文山壮族苗族自治州文山县","532622":"云南省文山壮族苗族自治州砚山县","532623":"云南省文山壮族苗族自治州西畴县","532624":"云南省文山壮族苗族自治州麻栗坡县","532625":"云南省文山壮族苗族自治州马关县","532626":"云南省文山壮族苗族自治州丘北县","532627":"云南省文山壮族苗族自治州广南县","532628":"云南省文山壮族苗族自治州富宁县","532700":"云南省思茅地区","532701":"云南省思茅地区思茅市","532722":"云南省思茅地区普洱哈尼族彝族自治县","532723":"云南省思茅地区墨江哈尼族自治县","532724":"云南省思茅地区景东彝族自治县","532725":"云南省思茅地区景谷傣族彝族自治县","532726":"云南省思茅地区镇沅彝族哈尼族拉祜族自治县","532727":"云南省思茅地区江城哈尼族彝族自治县","532728":"云南省思茅地区孟连傣族拉祜族佤族自治县","532729":"云南省思茅地区澜沧拉祜族自治县","532730":"云南省思茅地区西盟佤族自治县","532800":"云南省西双版纳傣族自治州","532801":"云南省西双版纳傣族自治州景洪市","532822":"云南省西双版纳傣族自治州勐海县","532823":"云南省西双版纳傣族自治州勐腊县","532900":"云南省大理白族自治州","532901":"云南省大理白族自治州大理市","532922":"云南省大理白族自治州漾濞彝族自治县","532923":"云南省大理白族自治州祥云县","532924":"云南省大理白族自治州宾川县","532925":"云南省大理白族自治州弥渡县","532926":"云南省大理白族自治州南涧彝族自治县","532927":"云南省大理白族自治州巍山彝族回族自治县","532928":"云南省大理白族自治州永平县","532929":"云南省大理白族自治州云龙县","532930":"云南省大理白族自治州洱源县","532931":"云南省大理白族自治州剑川县","532932":"云南省大理白族自治州鹤庆县","533000":"云南省保山地区","533001":"云南省保山地区保山市","533022":"云南省保山地区施甸县","533023":"云南省保山地区腾冲县","533024":"云南省保山地区龙陵县","533025":"云南省保山地区昌宁县","533100":"云南省德宏傣族景颇族自治州","533101":"云南省德宏傣族景颇族自治州畹町市","533102":"云南省德宏傣族景颇族自治州瑞丽市","533103":"云南省德宏傣族景颇族自治州潞西市","533122":"云南省德宏傣族景颇族自治州梁河县","533123":"云南省德宏傣族景颇族自治州盈江县","533124":"云南省德宏傣族景颇族自治州陇川县","533200":"云南省丽江地区","533221":"云南省丽江地区丽江纳西族自治县","533222":"云南省丽江地区永胜县","533223":"云南省丽江地区华坪县","533224":"云南省丽江地区宁蒗彝族自治县","533300":"云南省怒江傈僳族自治州","533321":"云南省怒江傈僳族自治州泸水县","533323":"云南省怒江傈僳族自治州福贡县","533324":"云南省怒江傈僳族自治州贡山独龙族怒族自治县","533325":"云南省怒江傈僳族自治州兰坪白族普米族自治县","533400":"云南省迪庆藏族自治州","533421":"云南省迪庆藏族自治州中甸县","533422":"云南省迪庆藏族自治州德钦县","533423":"云南省迪庆藏族自治州维西傈僳族自治县","533500":"云南省临沧地区","533521":"云南省临沧地区临沧县","533522":"云南省临沧地区凤庆县","533523":"云南省临沧地区云县","533524":"云南省临沧地区永德县","533525":"云南省临沧地区镇康县","533526":"云南省临沧地区双江拉祜族佤族布朗族傣族自治县","533527":"云南省临沧地区耿马傣族佤族自治县","533528":"云南省临沧地区沧源佤族自治县","540000":"西藏自治区","540100":"西藏自治区拉萨市","540101":"西藏自治区拉萨市市辖区","540102":"西藏自治区拉萨市城关区","540121":"西藏自治区拉萨市林周县","540122":"西藏自治区拉萨市当雄县","540123":"西藏自治区拉萨市尼木县","540124":"西藏自治区拉萨市曲水县","540125":"西藏自治区拉萨市堆龙德庆县","540126":"西藏自治区拉萨市达孜县","540127":"西藏自治区拉萨市墨竹工卡县","542100":"西藏自治区昌都地区","542121":"西藏自治区昌都地区昌都县","542122":"西藏自治区昌都地区江达县","542123":"西藏自治区昌都地区贡觉县","542124":"西藏自治区昌都地区类乌齐县","542125":"西藏自治区昌都地区丁青县","542126":"西藏自治区昌都地区察雅县","542127":"西藏自治区昌都地区八宿县","542128":"西藏自治区昌都地区左贡县","542129":"西藏自治区昌都地区芒康县","542132":"西藏自治区昌都地区洛隆县","542133":"西藏自治区昌都地区边坝县","542134":"西藏自治区昌都地区盐井县","542135":"西藏自治区昌都地区碧土县","542136":"西藏自治区昌都地区妥坝县","542137":"西藏自治区昌都地区生达县","542200":"西藏自治区山南地区","542221":"西藏自治区山南地区乃东县","542222":"西藏自治区山南地区扎囊县","542223":"西藏自治区山南地区贡嘎县","542224":"西藏自治区山南地区桑日县","542225":"西藏自治区山南地区琼结县","542226":"西藏自治区山南地区曲松县","542227":"西藏自治区山南地区措美县","542228":"西藏自治区山南地区洛扎县","542229":"西藏自治区山南地区加查县","542231":"西藏自治区山南地区隆子县","542232":"西藏自治区山南地区错那县","542233":"西藏自治区山南地区浪卡子县","542300":"西藏自治区日喀则地区","542301":"西藏自治区日喀则地区日喀则市","542322":"西藏自治区日喀则地区南木林县","542323":"西藏自治区日喀则地区江孜县","542324":"西藏自治区日喀则地区定日县","542325":"西藏自治区日喀则地区萨迦县","542326":"西藏自治区日喀则地区拉孜县","542327":"西藏自治区日喀则地区昂仁县","542328":"西藏自治区日喀则地区谢通门县","542329":"西藏自治区日喀则地区白朗县","542330":"西藏自治区日喀则地区仁布县","542331":"西藏自治区日喀则地区康马县","542332":"西藏自治区日喀则地区定结县","542333":"西藏自治区日喀则地区仲巴县","542334":"西藏自治区日喀则地区亚东县","542335":"西藏自治区日喀则地区吉隆县","542336":"西藏自治区日喀则地区聂拉木县","542337":"西藏自治区日喀则地区萨嘎县","542338":"西藏自治区日喀则地区岗巴县","542400":"西藏自治区那曲地区","542421":"西藏自治区那曲地区那曲县","542422":"西藏自治区那曲地区嘉黎县","542423":"西藏自治区那曲地区比如县","542424":"西藏自治区那曲地区聂荣县","542425":"西藏自治区那曲地区安多县","542426":"西藏自治区那曲地区申扎县","542427":"西藏自治区那曲地区索县","542428":"西藏自治区那曲地区班戈县","542429":"西藏自治区那曲地区巴青县","542430":"西藏自治区那曲地区尼玛县","542500":"西藏自治区阿里地区","542521":"西藏自治区阿里地区普兰县","542522":"西藏自治区阿里地区札达县","542523":"西藏自治区阿里地区噶尔县","542524":"西藏自治区阿里地区日土县","542525":"西藏自治区阿里地区革吉县","542526":"西藏自治区阿里地区改则县","542527":"西藏自治区阿里地区措勤县","542528":"西藏自治区阿里地区隆格尔县","542600":"西藏自治区林芝地区","542621":"西藏自治区林芝地区林芝县","542622":"西藏自治区林芝地区工布江达县","542623":"西藏自治区林芝地区米林县","542624":"西藏自治区林芝地区墨脱县","542625":"西藏自治区林芝地区波密县","542626":"西藏自治区林芝地区察隅县","542627":"西藏自治区林芝地区朗县","610000":"陕西省","610100":"陕西省西安市","610101":"陕西省西安市市辖区","610102":"陕西省西安市新城区","610103":"陕西省西安市碑林区","610104":"陕西省西安市莲湖区","610111":"陕西省西安市灞桥区","610112":"陕西省西安市未央区","610113":"陕西省西安市雁塔区","610114":"陕西省西安市阎良区","610115":"陕西省西安市临潼区","610121":"陕西省西安市长安县","610122":"陕西省西安市蓝田县","610124":"陕西省西安市周至县","610125":"陕西省西安市户县","610126":"陕西省西安市高陵县","610200":"陕西省铜川市","610201":"陕西省铜川市市辖区","610202":"陕西省铜川市城区","610203":"陕西省铜川市郊区","610221":"陕西省铜川市耀县","610222":"陕西省铜川市宜君县","610300":"陕西省宝鸡市","610301":"陕西省宝鸡市市辖区","610302":"陕西省宝鸡市渭滨区","610303":"陕西省宝鸡市金台区","610321":"陕西省宝鸡市宝鸡县","610322":"陕西省宝鸡市凤翔县","610323":"陕西省宝鸡市岐山县","610324":"陕西省宝鸡市扶风县","610326":"陕西省宝鸡市眉县","610327":"陕西省宝鸡市陇县","610328":"陕西省宝鸡市千阳县","610329":"陕西省宝鸡市麟游县","610330":"陕西省宝鸡市凤县","610331":"陕西省宝鸡市太白县","610400":"陕西省咸阳市","610401":"陕西省咸阳市市辖区","610402":"陕西省咸阳市秦都区","610403":"陕西省咸阳市杨陵区","610404":"陕西省咸阳市渭城区","610422":"陕西省咸阳市三原县","610423":"陕西省咸阳市泾阳县","610424":"陕西省咸阳市乾县","610425":"陕西省咸阳市礼泉县","610426":"陕西省咸阳市永寿县","610427":"陕西省咸阳市彬县","610428":"陕西省咸阳市长武县","610429":"陕西省咸阳市旬邑县","610430":"陕西省咸阳市淳化县","610431":"陕西省咸阳市武功县","610481":"陕西省咸阳市兴平市","610500":"陕西省渭南市","610501":"陕西省渭南市市辖区","610502":"陕西省渭南市临渭区","610521":"陕西省渭南市华县","610522":"陕西省渭南市潼关县","610523":"陕西省渭南市大荔县","610524":"陕西省渭南市合阳县","610525":"陕西省渭南市澄城县","610526":"陕西省渭南市蒲城县","610527":"陕西省渭南市白水县","610528":"陕西省渭南市富平县","610581":"陕西省渭南市韩城市","610582":"陕西省渭南市华阴市","610600":"陕西省延安市","610601":"陕西省延安市市辖区","610602":"陕西省延安市宝塔区","610621":"陕西省延安市延长县","610622":"陕西省延安市延川县","610623":"陕西省延安市子长县","610624":"陕西省延安市安塞县","610625":"陕西省延安市志丹县","610626":"陕西省延安市吴旗县","610627":"陕西省延安市甘泉县","610628":"陕西省延安市富县","610629":"陕西省延安市洛川县","610630":"陕西省延安市宜川县","610631":"陕西省延安市黄龙县","610632":"陕西省延安市黄陵县","610700":"陕西省汉中市","610701":"陕西省汉中市市辖区","610702":"陕西省汉中市汉台区","610721":"陕西省汉中市南郑县","610722":"陕西省汉中市城固县","610723":"陕西省汉中市洋县","610724":"陕西省汉中市西乡县","610725":"陕西省汉中市勉县","610726":"陕西省汉中市宁强县","610727":"陕西省汉中市略阳县","610728":"陕西省汉中市镇巴县","610729":"陕西省汉中市留坝县","610730":"陕西省汉中市佛坪县","612400":"陕西省安康地区","612401":"陕西省安康地区安康市","612422":"陕西省安康地区汉阴县","612423":"陕西省安康地区石泉县","612424":"陕西省安康地区宁陕县","612425":"陕西省安康地区紫阳县","612426":"陕西省安康地区岚皋县","612427":"陕西省安康地区平利县","612428":"陕西省安康地区镇坪县","612429":"陕西省安康地区旬阳县","612430":"陕西省安康地区白河县","612500":"陕西省商洛地区","612501":"陕西省商洛地区商州市","612522":"陕西省商洛地区洛南县","612523":"陕西省商洛地区丹凤县","612524":"陕西省商洛地区商南县","612525":"陕西省商洛地区山阳县","612526":"陕西省商洛地区镇安县","612527":"陕西省商洛地区柞水县","612700":"陕西省榆林地区","612701":"陕西省榆林地区榆林市","612722":"陕西省榆林地区神木县","612723":"陕西省榆林地区府谷县","612724":"陕西省榆林地区横山县","612725":"陕西省榆林地区靖边县","612726":"陕西省榆林地区定边县","612727":"陕西省榆林地区绥德县","612728":"陕西省榆林地区米脂县","612729":"陕西省榆林地区佳县","612730":"陕西省榆林地区吴堡县","612731":"陕西省榆林地区清涧县","612732":"陕西省榆林地区子洲县","620000":"甘肃省","620100":"甘肃省兰州市","620101":"甘肃省兰州市市辖区","620102":"甘肃省兰州市城关区","620103":"甘肃省兰州市七里河区","620104":"甘肃省兰州市西固区","620105":"甘肃省兰州市安宁区","620111":"甘肃省兰州市红古区","620121":"甘肃省兰州市永登县","620122":"甘肃省兰州市皋兰县","620123":"甘肃省兰州市榆中县","620200":"甘肃省嘉峪关市","620201":"甘肃省嘉峪关市市辖区","620300":"甘肃省嘉峪关市金昌市","620301":"甘肃省嘉峪关市市辖区","620302":"甘肃省嘉峪关市金川区","620321":"甘肃省嘉峪关市永昌县","620400":"甘肃省白银市","620401":"甘肃省白银市市辖区","620402":"甘肃省白银市白银区","620403":"甘肃省白银市平川区","620421":"甘肃省白银市靖远县","620422":"甘肃省白银市会宁县","620423":"甘肃省白银市景泰县","620500":"甘肃省天水市","620501":"甘肃省天水市市辖区","620502":"甘肃省天水市秦城区","620503":"甘肃省天水市北道区","620521":"甘肃省天水市清水县","620522":"甘肃省天水市秦安县","620523":"甘肃省天水市甘谷县","620524":"甘肃省天水市武山县","620525":"甘肃省天水市张家川回族自治县","622100":"甘肃省酒泉地区","622101":"甘肃省酒泉地区玉门市","622102":"甘肃省酒泉地区酒泉市","622103":"甘肃省酒泉地区敦煌市","622123":"甘肃省酒泉地区金塔县","622124":"甘肃省酒泉地区肃北蒙古族自治县","622125":"甘肃省酒泉地区阿克塞哈萨克族自治县","622126":"甘肃省酒泉地区安西县","622200":"甘肃省张掖地区","622201":"甘肃省张掖地区张掖市","622222":"甘肃省张掖地区肃南裕固族自治县","622223":"甘肃省张掖地区民乐县","622224":"甘肃省张掖地区临泽县","622225":"甘肃省张掖地区高台县","622226":"甘肃省张掖地区山丹县","622300":"甘肃省武威地区","622301":"甘肃省武威地区武威市","622322":"甘肃省武威地区民勤县","622323":"甘肃省武威地区古浪县","622326":"甘肃省武威地区天祝藏族自治县","622400":"甘肃省定西地区","622421":"甘肃省定西地区定西县","622424":"甘肃省定西地区通渭县","622425":"甘肃省定西地区陇西县","622426":"甘肃省定西地区渭源县","622427":"甘肃省定西地区临洮县","622428":"甘肃省定西地区漳县","622429":"甘肃省定西地区岷县","622600":"甘肃省陇南地区","622621":"甘肃省陇南地区武都县","622623":"甘肃省陇南地区宕昌县","622624":"甘肃省陇南地区成县","622625":"甘肃省陇南地区康县","622626":"甘肃省陇南地区文县","622627":"甘肃省陇南地区西和县","622628":"甘肃省陇南地区礼县","622629":"甘肃省陇南地区两当县","622630":"甘肃省陇南地区徽县","622700":"甘肃省平凉地区","622701":"甘肃省平凉地区平凉市","622722":"甘肃省平凉地区泾川县","622723":"甘肃省平凉地区灵台县","622724":"甘肃省平凉地区崇信县","622725":"甘肃省平凉地区华亭县","622726":"甘肃省平凉地区庄浪县","622727":"甘肃省平凉地区静宁县","622800":"甘肃省庆阳地区","622801":"甘肃省庆阳地区西峰市","622821":"甘肃省庆阳地区庆阳县","622822":"甘肃省庆阳地区环县","622823":"甘肃省庆阳地区华池县","622824":"甘肃省庆阳地区合水县","622825":"甘肃省庆阳地区正宁县","622826":"甘肃省庆阳地区宁县","622827":"甘肃省庆阳地区镇原县","622900":"甘肃省临夏回族自治州","622901":"甘肃省临夏回族自治州临夏市","622921":"甘肃省临夏回族自治州临夏县","622922":"甘肃省临夏回族自治州康乐县","622923":"甘肃省临夏回族自治州永靖县","622924":"甘肃省临夏回族自治州广河县","622925":"甘肃省临夏回族自治州和政县","622926":"甘肃省临夏回族自治州东乡族自治县","622927":"甘肃省临夏回族自治州积石山保安族东乡族撒拉族自治县","623000":"甘肃省甘南藏族自治州","623001":"甘肃省甘南藏族自治州合作市","623021":"甘肃省甘南藏族自治州临潭县","623022":"甘肃省甘南藏族自治州卓尼县","623023":"甘肃省甘南藏族自治州舟曲县","623024":"甘肃省甘南藏族自治州迭部县","623025":"甘肃省甘南藏族自治州玛曲县","623026":"甘肃省甘南藏族自治州碌曲县","623027":"甘肃省甘南藏族自治州夏河县","630000":"青海省","630100":"青海省西宁市","630101":"青海省西宁市市辖区","630102":"青海省西宁市城东区","630103":"青海省西宁市城中区","630104":"青海省西宁市城西区","630105":"青海省西宁市城北区","630121":"青海省西宁市大通回族土族自治县","632100":"青海省海东地区","632121":"青海省海东地区平安县","632122":"青海省海东地区民和回族土族自治县","632123":"青海省海东地区乐都县","632124":"青海省海东地区湟中县","632125":"青海省海东地区湟源县","632126":"青海省海东地区互助土族自治县","632127":"青海省海东地区化隆回族自治县","632128":"青海省海东地区循化撒拉族自治县","632200":"青海省海北藏族自治州","632221":"青海省海北藏族自治州门源回族自治县","632222":"青海省海北藏族自治州祁连县","632223":"青海省海北藏族自治州海晏县","632224":"青海省海北藏族自治州刚察县","632300":"青海省黄南藏族自治州","632321":"青海省黄南藏族自治州同仁县","632322":"青海省黄南藏族自治州尖扎县","632323":"青海省黄南藏族自治州泽库县","632324":"青海省黄南藏族自治州河南蒙古族自治县","632500":"青海省海南藏族自治州","632521":"青海省海南藏族自治州共和县","632522":"青海省海南藏族自治州同德县","632523":"青海省海南藏族自治州贵德县","632524":"青海省海南藏族自治州兴海县","632525":"青海省海南藏族自治州贵南县","632600":"青海省果洛藏族自治州","632621":"青海省果洛藏族自治州玛沁县","632622":"青海省果洛藏族自治州班玛县","632623":"青海省果洛藏族自治州甘德县","632624":"青海省果洛藏族自治州达日县","632625":"青海省果洛藏族自治州久治县","632626":"青海省果洛藏族自治州玛多县","632700":"青海省玉树藏族自治州","632721":"青海省玉树藏族自治州玉树县","632722":"青海省玉树藏族自治州杂多县","632723":"青海省玉树藏族自治州称多县","632724":"青海省玉树藏族自治州治多县","632725":"青海省玉树藏族自治州囊谦县","632726":"青海省玉树藏族自治州曲麻莱县","632800":"青海省海西蒙古族藏族自治州","632801":"青海省海西蒙古族藏族自治州格尔木市","632802":"青海省海西蒙古族藏族自治州德令哈市","632821":"青海省海西蒙古族藏族自治州乌兰县","632822":"青海省海西蒙古族藏族自治州都兰县","632823":"青海省海西蒙古族藏族自治州天峻县","640000":"宁夏回族自治区","640100":"宁夏回族自治区银川市","640101":"宁夏回族自治区银川市市辖区","640102":"宁夏回族自治区银川市城区","640103":"宁夏回族自治区银川市新城区","640111":"宁夏回族自治区银川市郊区","640121":"宁夏回族自治区银川市永宁县","640122":"宁夏回族自治区银川市贺兰县","640200":"宁夏回族自治区石嘴山市","640201":"宁夏回族自治区石嘴山市市辖区","640202":"宁夏回族自治区石嘴山市大武口区","640203":"宁夏回族自治区石嘴山市石嘴山区","640204":"宁夏回族自治区石嘴山市石炭井区","640221":"宁夏回族自治区石嘴山市平罗县","640222":"宁夏回族自治区石嘴山市陶乐县","640223":"宁夏回族自治区石嘴山市惠农县","640300":"宁夏回族自治区吴忠市","640301":"宁夏回族自治区吴忠市市辖区","640302":"宁夏回族自治区吴忠市利通区","640321":"宁夏回族自治区吴忠市中卫县","640322":"宁夏回族自治区吴忠市中宁县","640323":"宁夏回族自治区吴忠市盐池县","640324":"宁夏回族自治区吴忠市同心县","640381":"宁夏回族自治区吴忠市青铜峡市","640382":"宁夏回族自治区吴忠市灵武市","642200":"宁夏回族自治区固原地区","642221":"宁夏回族自治区固原地区固原县","642222":"宁夏回族自治区固原地区海原县","642223":"宁夏回族自治区固原地区西吉县","642224":"宁夏回族自治区固原地区隆德县","642225":"宁夏回族自治区固原地区泾源县","642226":"宁夏回族自治区固原地区彭阳县","650000":"新疆维吾尔自治区","650100":"新疆维吾尔族自治区乌鲁木齐市","650101":"新疆维吾尔族自治区乌鲁木齐市市辖区","650102":"新疆维吾尔族自治区乌鲁木齐市天山区","650103":"新疆维吾尔族自治区乌鲁木齐市沙依巴克区","650104":"新疆维吾尔族自治区乌鲁木齐市新市区","650105":"新疆维吾尔族自治区乌鲁木齐市水磨沟区","650106":"新疆维吾尔族自治区乌鲁木齐市头屯河区","650107":"新疆维吾尔族自治区乌鲁木齐市南山矿区","650108":"新疆维吾尔族自治区乌鲁木齐市东山区","650121":"新疆维吾尔族自治区乌鲁木齐市乌鲁木齐县","650200":"新疆维吾尔族自治区克拉玛依市","650201":"新疆维吾尔族自治区克拉玛依市市辖区","650202":"新疆维吾尔族自治区克拉玛依市独山子区","650203":"新疆维吾尔族自治区克拉玛依市克拉玛依区","650204":"新疆维吾尔族自治区克拉玛依市白碱滩区","650205":"新疆维吾尔族自治区克拉玛依市乌尔禾区","652100":"新疆维吾尔族自治区吐鲁番地区","652101":"新疆维吾尔族自治区吐鲁番地区吐鲁番市","652122":"新疆维吾尔族自治区吐鲁番地区鄯善县","652123":"新疆维吾尔族自治区吐鲁番地区托克逊县","652200":"新疆维吾尔族自治区哈密地区","652201":"新疆维吾尔族自治区哈密地区哈密市","652222":"新疆维吾尔族自治区哈密地区巴里坤哈萨克自治县","652223":"新疆维吾尔族自治区哈密地区伊吾县","652300":"新疆维吾尔族自治区昌吉回族自治州","652301":"新疆维吾尔族自治区昌吉回族自治州昌吉市","652302":"新疆维吾尔族自治区昌吉回族自治州阜康市","652303":"新疆维吾尔族自治区昌吉回族自治州米泉市","652323":"新疆维吾尔族自治区昌吉回族自治州呼图壁县","652324":"新疆维吾尔族自治区昌吉回族自治州玛纳斯县","652325":"新疆维吾尔族自治区昌吉回族自治州奇台县","652327":"新疆维吾尔族自治区昌吉回族自治州吉木萨尔县","652328":"新疆维吾尔族自治区昌吉回族自治州木垒哈萨克自治县","652700":"新疆维吾尔族自治区博尔塔拉蒙古自治州","652701":"新疆维吾尔族自治区博尔塔拉蒙古自治州博乐市","652722":"新疆维吾尔族自治区博尔塔拉蒙古自治州精河县","652723":"新疆维吾尔族自治区博尔塔拉蒙古自治州温泉县","652800":"新疆维吾尔族自治区巴音郭楞蒙古自治州","652801":"新疆维吾尔族自治区巴音郭楞蒙古自治州库尔勒市","652822":"新疆维吾尔族自治区巴音郭楞蒙古自治州轮台县","652823":"新疆维吾尔族自治区巴音郭楞蒙古自治州尉犁县","652824":"新疆维吾尔族自治区巴音郭楞蒙古自治州若羌县","652825":"新疆维吾尔族自治区巴音郭楞蒙古自治州且末县","652826":"新疆维吾尔族自治区巴音郭楞蒙古自治州焉耆回族自治县","652827":"新疆维吾尔族自治区巴音郭楞蒙古自治州和静县","652828":"新疆维吾尔族自治区巴音郭楞蒙古自治州和硕县","652829":"新疆维吾尔族自治区巴音郭楞蒙古自治州博湖县","652900":"新疆维吾尔族自治区阿克苏地区","652901":"新疆维吾尔族自治区阿克苏地区阿克苏市","652922":"新疆维吾尔族自治区阿克苏地区温宿县","652923":"新疆维吾尔族自治区阿克苏地区库车县","652924":"新疆维吾尔族自治区阿克苏地区沙雅县","652925":"新疆维吾尔族自治区阿克苏地区新和县","652926":"新疆维吾尔族自治区阿克苏地区拜城县","652927":"新疆维吾尔族自治区阿克苏地区乌什县","652928":"新疆维吾尔族自治区阿克苏地区阿瓦提县","652929":"新疆维吾尔族自治区阿克苏地区柯坪县","653000":"新疆维吾尔族自治区克孜勒苏柯尔克孜自治州","653001":"新疆维吾尔族自治区克孜勒苏柯尔克孜自治州阿图什市","653022":"新疆维吾尔族自治区克孜勒苏柯尔克孜自治州阿克陶县","653023":"新疆维吾尔族自治区克孜勒苏柯尔克孜自治州阿合奇县","653024":"新疆维吾尔族自治区克孜勒苏柯尔克孜自治州乌恰县","653100":"新疆维吾尔族自治区喀什地区","653101":"新疆维吾尔族自治区喀什地区喀什市","653121":"新疆维吾尔族自治区喀什地区疏附县","653122":"新疆维吾尔族自治区喀什地区疏勒县","653123":"新疆维吾尔族自治区喀什地区英吉沙县","653124":"新疆维吾尔族自治区喀什地区泽普县","653125":"新疆维吾尔族自治区喀什地区莎车县","653126":"新疆维吾尔族自治区喀什地区叶城县","653127":"新疆维吾尔族自治区喀什地区麦盖提县","653128":"新疆维吾尔族自治区喀什地区岳普湖县","653129":"新疆维吾尔族自治区喀什地区伽师县","653130":"新疆维吾尔族自治区喀什地区巴楚县","653131":"新疆维吾尔族自治区喀什地区塔什库尔干塔吉克自治县","653200":"新疆维吾尔族自治区和田地区","653201":"新疆维吾尔族自治区和田地区和田市","653221":"新疆维吾尔族自治区和田地区和田县","653222":"新疆维吾尔族自治区和田地区墨玉县","653223":"新疆维吾尔族自治区和田地区皮山县","653224":"新疆维吾尔族自治区和田地区洛浦县","653225":"新疆维吾尔族自治区和田地区策勒县","653226":"新疆维吾尔族自治区和田地区于田县","653227":"新疆维吾尔族自治区和田地区民丰县","654000":"新疆维吾尔族自治区伊犁哈萨克自治州","654001":"新疆维吾尔族自治区伊犁哈萨克自治州奎屯市","654100":"新疆维吾尔族自治区伊犁哈萨克自治州伊犁地区","654101":"新疆维吾尔族自治区伊犁哈萨克自治州伊宁市","654121":"新疆维吾尔族自治区伊犁哈萨克自治州伊宁县","654122":"新疆自治区伊犁哈萨克自治州察布查尔锡伯自治县","654123":"新疆维吾尔族自治区伊犁哈萨克自治州霍城县","654124":"新疆维吾尔族自治区伊犁哈萨克自治州巩留县","654125":"新疆维吾尔族自治区伊犁哈萨克自治州新源县","654126":"新疆维吾尔族自治区伊犁哈萨克自治州昭苏县","654127":"新疆维吾尔族自治区伊犁哈萨克自治州特克斯县","654128":"新疆维吾尔族自治区伊犁哈萨克自治州尼勒克县","654200":"新疆维吾尔族自治区塔城地区","654201":"新疆维吾尔族自治区塔城地区塔城市","654202":"新疆维吾尔族自治区塔城地区乌苏市","654221":"新疆维吾尔族自治区塔城地区额敏县","654223":"新疆维吾尔族自治区塔城地区沙湾县","654224":"新疆维吾尔族自治区塔城地区托里县","654225":"新疆维吾尔族自治区塔城地区裕民县","654226":"新疆维吾尔族自治区塔城地区和布克赛尔蒙古自治县","654300":"新疆维吾尔族自治区阿勒泰地区","654301":"新疆维吾尔族自治区阿勒泰地区阿勒泰市","654321":"新疆维吾尔族自治区阿勒泰地区布尔津县","654322":"新疆维吾尔族自治区阿勒泰地区富蕴县","654323":"新疆维吾尔族自治区阿勒泰地区福海县","654324":"新疆维吾尔族自治区阿勒泰地区哈巴河县","654325":"新疆维吾尔族自治区阿勒泰地区青河县","654326":"新疆维吾尔族自治区阿勒泰地区吉木乃县","659000":"新疆维吾尔族自治区直辖县级行政单位","659001":"新疆维吾尔族自治区石河子市"}; + diff --git a/client/js/00_Surface/04_Data.js b/client/js/00_Surface/04_Data.js new file mode 100644 index 0000000..8321e70 --- /dev/null +++ b/client/js/00_Surface/04_Data.js @@ -0,0 +1,582 @@ +/*var returnCitySN = {"cip": "171.34.213.118", "cid": "360000", "cname": "江西省"}*/ + +var C_Player; +var InfoSex=0; + + +var arrBan=[]; +var RoomCode = ""; +var RoomNum = -1; + +var CombatCount = 0; +var CombatPage = 0;//战绩页码 +var CombatPageTwoIndex = 0;//大局标号 +var CombatPageThreeIndex = 0;//小局标号 + +var CombatInfo = [];//战绩详情 +var C_PageOneBtn = [];//战绩页一按钮id +var C_PageTwoBtn = [];//战绩页二按钮id +var CombatBackHeight = 0;//战绩背景高度 + +var TaskInfo = [];//任务详情 +var VoteTime=0;//投票倒计时秒 + +var GameData=GameData||{}; +GameData.HallServer=""; +GameData.Server=""; +GameData.AjaxUrl=""; +GameData.scrollmsg=""; +GameData.wechat_gzh=""; +GameData.wechat_kfh=""; +GameData.qq = ""; +GameData.tel = ""; +GameData.gzhcolor1 = ""; +GameData.gzhcolor2 = ""; +GameData.telcolor = ""; + +GameData.errorMsg = null; +GameData.tcpConnect=true; +GameData.tcpConnectState = false; +GameData.TimerID=0; +GameData.TimerID_2=0; +GameData.timer=10000; +GameData.time_2=15000; +GameData.NetType=0;//是否为首次连接 +GameData.Protocol_H=1; +GameData.ProtocolIndex=true; +GameData.isLoad=true; +GameData.LoadCount=0; +GameData.Timesup=false; +GameData.InteractPlayer = -1; +GameData.isCallback=false; +GameData.isBoard=true; +GameData.ConnectType=false;//1->更换服务器不需要重连 +GameData.ConnectRpc="";//更换服务器成功后发包的RPC +GameData.ConnectPack={};//更换服务器成功后发包数据 +GameData.Battery = 0;//电量 +GameData.NetWork = 0;//网络情况1 未连接网络 2 连接wifi 3 连接2G/3G/4G +GameData.WifiLevel = 0;//WiFi强度 +GameData.wechat_ewm = "";//二维码 +GameData.appstate=true;//true程序前台运行false程序后台运行 +GameData.OS = ConstVal.OS.other;//1->IOS 2->Android 3->wp 4->other +GameData.isLogin = false;//是否已登录 +GameData.leaveTime=0;// +GameData.disType = false; +GameData.reconnectTimer=0; +GameData.isClose = false; +GameData.isCloseTimer = null; +GameData.firstConnect = true;//第一次连接 +GameData.firstConnect_Succ = false;//第一次连接成功 +GameData.firstConnect_Timer = null;//第一次连接定时器 +GameData.loginTimer = null; +GameData.tryTimes = 0;//链接尝试次数 +GameData.isReconnect = false; +GameData.isCreateEmotion = false; +GameData.ChatPage = 1; +GameData.slidEmotion = false; +GameData.communionHistory=[];//聊天历史//二维数组[[方位,类型(1-文字2语音),内容,时长]] +GameData.createHistoryLen = 0;//以创建的精灵的长度 +GameData.slideHistory = false; +GameData.TcpTimer = null;//tcp连接失败判断定时器 +GameData.slideTask = false;//是否滑动任务 +GameData.copyTaskTagList = [];//任务复制精灵tag列表 + + + +GameData.versionState = 0;//苹果审核结果 +GameData.visitorserver = "";//游客服务器地址 +GameData.isVisitor = false; + +GameData.shakeID = 0;//摇一摇事件ID +GameData.isRecord = false; + +GameData.LaunchMode = ConstVal.Launch_mode.from_self; + +GameData.Multiple = ""; +GameData.OrgArr=[]; +GameData.MultiArr = []; + +GameData.isFirstLogin = true;//是否是第一次登陆 + +GameData.payList = null; +GameData.payData = [0,0]; + +GameData.visitorClick = 0; +GameData.Scene = 0; + +GameData.urlFail = false; +GameData.BroadcastArray = []; +GameData.isBoardcast = false; + +GameData.tcpState = [0,0]; +GameData.Notice ={ + heigth:0, + lineSum:0, + width:0 +} +GameData.marketID = 0; +GameData.getJSONState = false;//JSON获取成功状态 +GameData.Config = null;//服务器配置json +GameData.AgentLoginImg = "";//代理商图片 +GameData.TopUpUrl = "";//索要房卡地址 + +GameData.tryConnect = false; +GameData.hallConfigName = ["enablePay", + "logoffCallback",//不通知 + 'worldRoomList',//星星争霸是否可用 + 'max:', + 'min', + 'unit', + 'shareMsg', + 'autoWorldRoomList',//是否自动弹出星星争霸场 + 'rankList',//是否显示排行榜按钮1模拟排行2真实排行 + 'groupMsg',//试玩群信息 + 'isReSetOwnerNote',//是否替换签名 + 'activity',//是否显示活动如果显示则为[x,y,w,h/*,isOpen,btnUrl,url,actid*/] + 'actData:',//常驻活动按钮 [imgUrl,isOpen,jumpUrl,actUrl] + 'shareButton:',//是否显示分享到平台 + 'enableQuickEnter',//是否隐藏快速加入 + 'storeUrl',//商城url + 'bagUrl',//背包url + 'shareDesc',//平台分享描述信息 + 'wareHouse',//是否开启仓库功能0->不开启1->开启保险箱不开启赠送2->开启赠送不开启保险箱3->开启星星赠送(开启保险箱)4->开启房卡赠送(开启保险箱)5->开启星星房卡赠送(开启保险箱) + 'betaText',//版本号后的beta显示内容 + 'launchImgUrl',//启动页图片地址 + 'shareType:',//分享朋友圈类型0->链接分享 1->图片分享 + 'shareImgUrl',//分享朋友圈图片链接 + 'launchWaitTime',//启动等待时间 + 'shareBgUrl',//分享背景图片 + 'qqLogin',//是否显示qq登录 + 'androidPay',//是否开启安卓支付 + 'channelKey',//支付key + 'payCSS',//支付css + 'payJS',//支付js + 'openVideo' + ];//是否开启视频]; +GameData.hallConfig = { + enablePay:0, + logoffCallback:0,//不通知 + worldRoomList:0,//星星争霸是否可用 + max:100, + min:0, + unit:1, + shareMsg:"", + autoWorldRoomList:0,//是否自动弹出星星争霸场 + rankList:0,//是否显示排行榜按钮1模拟排行2真实排行 + groupMsg:"",//试玩群信息 + isReSetOwnerNote:0,//是否替换签名 + activity:0,//是否显示活动如果显示则为[x,y,w,h/*,isOpen,btnUrl,url,actid*/] + actData:0,//常驻活动按钮 [imgUrl,isOpen,jumpUrl,actUrl] + shareButton:1,//是否显示分享到平台 + enableQuickEnter:1,//是否隐藏快速加入 + storeUrl:"",//商城url + bagUrl:"",//背包url + shareDesc:"",//平台分享描述信息 + wareHouse:0,//是否开启仓库功能0->不开启1->开启保险箱不开启赠送2->开启赠送不开启保险箱3->开启星星赠送(开启保险箱)4->开启房卡赠送(开启保险箱)5->开启星星房卡赠送(开启保险箱) + betaText:"",//版本号后的beta显示内容 + launchImgUrl:"",//启动页图片地址 + shareType:0,//分享朋友圈类型0->链接分享 1->图片分享 + shareImgUrl:"",//分享朋友圈图片链接 + launchWaitTime:10,//启动等待时间 + shareBgUrl:"",//分享背景图片 + qqLogin:0,//是否显示qq登录 + androidPay:0,//是否开启安卓支付 + channelKey:"",//支付key + payCSS:"",//支付css + payJS:"",//支付js + openVideo:0,//是否开启视频 +}; +GameData.starName = "星星"; +GameData.roomCardName = "房卡"; +GameData.gameConfig = {}; + +GameData.playerHeadImgState = false;//玩家主界面头像加载状态 +GameData.matchhtml = "";//比赛链接地址 + +GameData.Validator = null; +GameData.loginBtnType = ConstVal.loginButton.type1[0];//登录按钮样式 +GameData.netWorkSate = false; + +GameData.heartBeatTimer = null;//心跳事件定时器ID +GameData.heartBeatStage = false;//提示框是否处于心跳提示事件 + +GameData.telSpid = 179;//拨打电话精灵号 +GameData.matchInfo = null;//比赛场信息 + +GameData.agentmode = 1;//邀请码模式 + +GameData.infMode = 0;//是否为无限局 +GameData.infClickCount = 0;//点击次数 + +GameData.checkType = 1;//确认面板事件类型 1->解散房间 2->退出房间 3->投降 +GameData.roomList = [];//房间列表 + +GameData.sendLoginTimer = null;//发送重连登录包定时器 +GameData.loginList = [];// +GameData.isConnected = false; + +GameData.isSendLoginState = false;//是否在等待登录包 +GameData.isSendLoginTimer = null;//登录包收包定时器 +GameData.isTcpConnect = false;//是否在连接状态 + +GameData.TcpID = 0;//tcpid +GameData.websocketList=[]; +GameData.pack=""; +GameData.infoSeat = -1; + +GameData.sendLoginTimes = 0; + +GameData.backUrl = ""; + +GameData.playerid = ""; + +GameData.serverConfig = {}; + +GameData.userAgent = ConstVal.userAgent.uAgent_1; + +GameData.getbattery = ""; +GameData.getbatteryPack = {}; + +GameData.getnetwork = ""; +GameData.getnetworkPack = {}; + +GameData.getVersionState = ""; +GameData.getVersionStatePack = {}; + +GameData.getchannelName = ""; +GameData.getchannelNamePack = {}; + +GameData.getmarketname = ""; +GameData.getmarketnamePack = {}; + +GameData.gamepastetext = ""; +GameData.gamepastetextPack = {}; +GameData.worldRoomSys=[]; + +//玩家房间数据 +GameData.worldRoomPly=[]; + +GameData.worldRoomSysSlide = false; +GameData.worldRoomPlySlide = false; + +GameData.menuNotice = null; + +GameData.advertInfo_1 = { + type:0,//是否使用默认的文字通知 + imgUrl:"",//图片地址 + imgAdUrl:"",//图片跳转链接地址 + height:1,//图片高度 + msg:"", + url:"", +}; +GameData.advertInfo_2 = { + type:0, + imgUrl:"", + imgAdUrl:"", + height:1, + msg:"", + url:"", +}; +GameData.advertInfo_0 = { + type:0, + imgUrl:"", + imgAdUrl:"", + height:1, + msg:"", + url:"", +}; +GameData.noticePage = 0; +GameData.noticePara = [[0,0],[0,0],[0,0]]; + +GameData.snrOption = { + profit:0, + roomcode:"", +}; +GameData.snrRoomList = { + roomlist:[], + roomtype:[], + tea:1000, + shortcode:888 +}; +GameData.snrRoomListSlide = false; +GameData.snrOptionLength = 0; +GameData.snrOptionRoomTag = 0; +GameData.snrOptionMode = 0; +GameData.snrOptionRoomtype = ""; +GameData.snrOptionDes = ""; +GameData.snrOptionProfit=0; + +GameData.shortCode = ""; + +GameData.isShowWorldRoomList = true; +GameData.shareMsg = ""; + +GameData.rankList = []; +GameData.rankListTag = 0; +GameData.ranListLength = 0; +GameData.rankListSlide = false; + +GameData.h5Version = 0; +// +var shareParam = { + appid: "14936872341446", + devkey: "14915485974028" +} + +GameData.shareTimeline = {//朋友圈 + title: "", + desc: "", + link: "", + imgUrl: "" +} +GameData.shareAppMessage = {//好友 + title: "", + desc: "", + link: "", + imgUrl: "" +} +GameData.gameData = ""; +GameData.fromH5GameData = {}; +GameData.isJoinRoomFromH5 = false; +GameData.h5ShareImage = ""; +GameData.screenShotStage = 0; +GameData.screenShotSpidList = []; + +GameData.ownerNote = ""; +GameData.isDebugger = 0; + +GameData.returnUrl = ""; + +GameData.configData = ""; +GameData.h5ShareUrl = ""; + +GameData.inputPanelData = ""; +GameData.inputCallBack = null; + +GameData.isShowNeighbor = true; + +GameData.nameImgFrame_1 = 1;//房卡图片帧数 +GameData.nameImgFrame_2 = 1;//星星图片帧数 +GameData.surrendCount = 0; + + +GameData.htmlCode = ""; +GameData.htmlId = ""; + +GameData.serverIndex = 0;//连接地址下标 +GameData.tryReconnectTimes = 0; +GameData.isChangeServer = false; + +GameData.shareFrom = 0;//0->框架分享 1->游戏分享 +GameData.activityType = 0;//子游戏调用类型 +GameData.activityData = null;//子游戏调用类型 +GameData.shareTimes = 0;//分享次数 + +GameData.sharePostUrl = "http://localhost:4477/testurl";//截图分享链接 +//保险箱 +GameData.wareHouse = { + page:1,//当前页 + safeInputType:1,//保险箱存入取出类型 + safeInputCount:-1,//保险箱存入取出数量 + safePassWord:-1,//保险箱存入取出密码 + inputNumber:0,//输入的数字 + selectType:1,//选择的当前输入框 + initPassWord1:-1,//初始化密码 + initPassWord2:-1,//确认初始化密码 + pId:0,//赠送id + pImg:"",//赠送头像 + pNickName:"",//赠送昵称 + pInputType:1,//赠送类型 + pInputId:-1,//输入id + pInputCount:-1,//赠送数量 + pInputPassWord:-1,//赠送密码 + + +}; +GameData.openVideo = 0;//是否开启视频功能 +GameData.imgAdIsSlide = false; +GameData.launchImgLoaded = false;//启动页图片是否从网络加载完成 +GameData.configSuccess = false;//配置文件读取成功 +GameData.launchWaitTime = 0; +GameData.adTimer = null; + +GameData.sysNotice = [];//系统公告 {msg:"",read:false,line:1} +GameData.sysCreateLength = 0; + +GameData.selectSysNotice = false;//是否勾选发送系统公告 +GameData.sysNoticeCost = 0; +GameData.sysNoticeLimit = 0; + + +GameData.mainMenuAniTimer = null; +GameData.worldRoomPage = 0; + +GameData.createMyRoomListLength = 0; + +GameData.starCount = 0; +GameData.roomCardCount=0; + +GameData.loginPlayerid = false;//登录是否带上playerid + +GameData.matchId = null; + +GameData.chatLine = null; +GameData.chatInfo = null; +GameData.isService = false; + +GameData.submitLocation = false; +GameData.submitPhoneInfo = false; +GameData.submitAddressBook = false; +GameData.getConfigTimer = null; + +GameData.clickChat = 0; + +GameData.phoneInfo = null; +GameData.addressBook = null; +//GameData.sysConfigName=[]; +GameData.sysConfigName=["hideEscape","charmName","hideTaskBtn","miniPro","videoConfig","ofcShortCode","ofcTips","ofcWx","ofcImg", +"managerUrl","rebateConfig","gameNoticeShow","hallNoticeShow","ofcAutoEnter","vipFlushTime","vipWx","h5PayUrl","appShareH5", +"vipRankLimit","behaviorList","deviceLogin","hideWxShare","hideRoomCard","hideSpid","cdKey","otherShare","avatarRange","avatarUrl","whiteListManager","nnLocal"]; +GameData.sysConfig={ + hideEscape:0, + charmName:"魅力", + hideTaskBtn:0,//是否隐藏任务按钮 + miniPro:0,//是否小程序/小游戏 (隐藏更多选项、分享朋友圈、聊天按钮、录音调整) + videoConfig:null,//{type:1,profitMode:1,profit:3} + ofcShortCode:null,//官方短号 + ofcImg:"",//官方按钮链接 + managerUrl:"",//管理后台地址 + rebateConfig:null,//抽成配置 + gameNoticeShow:0,//子游戏弹窗时间间隔 0每次都弹 -1不弹 + hallNoticeShow:0,//大厅弹窗时间间隔 0每次都弹 -1不弹 + ofcAutoEnter:0,//是否自动进入官方短号 + vipFlushTime:10000,//vip房间列表刷新间隔 + vipWx:"",//成为vip联系微信 + h5PayUrl:"",//h5支付地址 + appShareH5:"",//app分享的h5地址 + vipRankLimit:10,//vip排行显示个数 + behaviorList:null,//用户行为 + deviceLogin:0,//是否显示设备登录显示了设备登录就会显示手机号登录就会隐藏微信登录 + hideWxShare:0,//是否隐藏微信分享 + hideRoomCard:1,//隐藏主界面房卡 1 不隐藏 2隐藏 + hideSpid:null,//隐藏的精灵id + cdKey:1,//是否显示CDKEY 1不显示 2显示 + otherShare:1,//开启新分享 1 关闭2开启 + avatarRange:[100,10000],//设备登录的头像列表 + avatarUrl:"https://projectimage.tscce.cn/image_132/", + whiteListManager:2, //是否开启在游戏中管理白名单 + nnLocal:2,// + +}; +GameData.inputCallBack2 = null; + +GameData.topInfoTimer = null; + +GameData.iscloseVideo = true;//是否开战关闭视频 +GameData.textCallback = null; + +GameData.isLocation = false; +GameData.otherLocation = false;// +GameData.otherLocationTimes = 0; +GameData.otherLocationAllTimes = 1; + + +GameData.hallLogin = true; + +GameData.senRoomState = 0; + +GameData.rebateConfig = null; + +GameData.vipRoomPage = 0; +GameData.vipRoomCode = 0; +GameData.vipRoomData = []; +GameData.vipRoomTimer1 = false; +GameData.vipRoomIsOpen = false; +GameData.vipRoomShortList = []; +GameData.vipRoomJump = false; +GameData.vipRoomPageOne = { + cLength:0, + slide:false, +} +GameData.vipRoomPageTwo = { + cLength:0, + slide:false, + data:null, +} +GameData.tipTimer1 = null; +GameData.tipTimer2 = null; + +GameData.initCard = 0; +GameData.initBean = 0; + +GameData.brNumber=0; + +GameData.isKick = false; + +GameData.blackList = { + data:[], + length:0, + breakRoom:false, + selectTag:0, + slide:false, + inputId:"", + idWidth:12, +} +GameData.allCharm = 0; +GameData.vipRank = { + data:{ + rankList:[], + myRank:1, + myScore:100 + }, + length:0, + //selectTag:0, + slide:false, + //inputId:"", + //idWidth:12, +} +GameData.rankType = false; + +GameData.coinMp3Time = 0; +GameData.coinMp3Length = 3000; +GameData.brRebateUnit = 10000; + +GameData.phoneCodeTime = 0; +GameData.phoneCode = ""; +GameData.phoneNumber = ""; + +GameData.phoneType = 0; + +GameData.isGetPhoneInfo = false; +GameData.isDeviceLogin = false; +GameData.begin0 = false; + +GameData.vipConfig = null; + +GameData.feedMode = 0; + +GameData.fromMiniProData = {}; + + +GameData.shareFriendInfo = {}; + + +GameData.deviceAvatarList = []; + +GameData.whiteList = { + data:[], + length:0, + breakRoom:false, + selectTag:0, + slide:false, + inputId:"", + inputCharm:"", + searchId:"", + idWidth:12, + delPid:"", +} + + + + + diff --git a/client/js/00_Surface/05_Func.js b/client/js/00_Surface/05_Func.js new file mode 100644 index 0000000..6689ccc --- /dev/null +++ b/client/js/00_Surface/05_Func.js @@ -0,0 +1,4197 @@ +//var AudioContext = window.AudioContext || window.webkitAudioContext || window.mozAudioContext; +//var _context = new AudioContext(); +/* + * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message + * Digest Algorithm, as defined in RFC 1321. + * Version 2.1 Copyright (C) Paul Johnston 1999 - 2002. + * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet + * Distributed under the BSD License + * See http://pajhome.org.uk/crypt/md5 for more info. + */ + +/* + * Configurable variables. You may need to tweak these to be compatible with + * the server-side, but the defaults work in most cases. + */ + +var hexcase = 0; /* hex output format. 0 - lowercase; 1 - uppercase */ +var b64pad = ""; /* base-64 pad character. "=" for strict RFC compliance */ +var chrsz = 8; /* bits per input character. 8 - ASCII; 16 - Unicode */ + +/* + * These are the functions you'll usually want to call + * They take string arguments and return either hex or base-64 encoded strings + */ +function hex_md5(s){ return binl2hex(core_md5(str2binl(s), s.length * chrsz));} +function b64_md5(s){ return binl2b64(core_md5(str2binl(s), s.length * chrsz));} +function str_md5(s){ return binl2str(core_md5(str2binl(s), s.length * chrsz));} +function hex_hmac_md5(key, data) { return binl2hex(core_hmac_md5(key, data)); } +function b64_hmac_md5(key, data) { return binl2b64(core_hmac_md5(key, data)); } +function str_hmac_md5(key, data) { return binl2str(core_hmac_md5(key, data)); } + +/* + * Perform a simple self-test to see if the VM is working + */ +function md5_vm_test() +{ + return hex_md5("abc") == "900150983cd24fb0d6963f7d28e17f72"; +} + +/* + * Calculate the MD5 of an array of little-endian words, and a bit length + */ +function core_md5(x, len) +{ + /* append padding */ + x[len >> 5] |= 0x80 << ((len) % 32); + x[(((len + 64) >>> 9) << 4) + 14] = len; + + var a = 1732584193; + var b = -271733879; + var c = -1732584194; + var d = 271733878; + + for(var i = 0; i < x.length; i += 16) + { + var olda = a; + var oldb = b; + var oldc = c; + var oldd = d; + + a = md5_ff(a, b, c, d, x[i+ 0], 7 , -680876936); + d = md5_ff(d, a, b, c, x[i+ 1], 12, -389564586); + c = md5_ff(c, d, a, b, x[i+ 2], 17, 606105819); + b = md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330); + a = md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897); + d = md5_ff(d, a, b, c, x[i+ 5], 12, 1200080426); + c = md5_ff(c, d, a, b, x[i+ 6], 17, -1473231341); + b = md5_ff(b, c, d, a, x[i+ 7], 22, -45705983); + a = md5_ff(a, b, c, d, x[i+ 8], 7 , 1770035416); + d = md5_ff(d, a, b, c, x[i+ 9], 12, -1958414417); + c = md5_ff(c, d, a, b, x[i+10], 17, -42063); + b = md5_ff(b, c, d, a, x[i+11], 22, -1990404162); + a = md5_ff(a, b, c, d, x[i+12], 7 , 1804603682); + d = md5_ff(d, a, b, c, x[i+13], 12, -40341101); + c = md5_ff(c, d, a, b, x[i+14], 17, -1502002290); + b = md5_ff(b, c, d, a, x[i+15], 22, 1236535329); + + a = md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510); + d = md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632); + c = md5_gg(c, d, a, b, x[i+11], 14, 643717713); + b = md5_gg(b, c, d, a, x[i+ 0], 20, -373897302); + a = md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691); + d = md5_gg(d, a, b, c, x[i+10], 9 , 38016083); + c = md5_gg(c, d, a, b, x[i+15], 14, -660478335); + b = md5_gg(b, c, d, a, x[i+ 4], 20, -405537848); + a = md5_gg(a, b, c, d, x[i+ 9], 5 , 568446438); + d = md5_gg(d, a, b, c, x[i+14], 9 , -1019803690); + c = md5_gg(c, d, a, b, x[i+ 3], 14, -187363961); + b = md5_gg(b, c, d, a, x[i+ 8], 20, 1163531501); + a = md5_gg(a, b, c, d, x[i+13], 5 , -1444681467); + d = md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784); + c = md5_gg(c, d, a, b, x[i+ 7], 14, 1735328473); + b = md5_gg(b, c, d, a, x[i+12], 20, -1926607734); + + a = md5_hh(a, b, c, d, x[i+ 5], 4 , -378558); + d = md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463); + c = md5_hh(c, d, a, b, x[i+11], 16, 1839030562); + b = md5_hh(b, c, d, a, x[i+14], 23, -35309556); + a = md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060); + d = md5_hh(d, a, b, c, x[i+ 4], 11, 1272893353); + c = md5_hh(c, d, a, b, x[i+ 7], 16, -155497632); + b = md5_hh(b, c, d, a, x[i+10], 23, -1094730640); + a = md5_hh(a, b, c, d, x[i+13], 4 , 681279174); + d = md5_hh(d, a, b, c, x[i+ 0], 11, -358537222); + c = md5_hh(c, d, a, b, x[i+ 3], 16, -722521979); + b = md5_hh(b, c, d, a, x[i+ 6], 23, 76029189); + a = md5_hh(a, b, c, d, x[i+ 9], 4 , -640364487); + d = md5_hh(d, a, b, c, x[i+12], 11, -421815835); + c = md5_hh(c, d, a, b, x[i+15], 16, 530742520); + b = md5_hh(b, c, d, a, x[i+ 2], 23, -995338651); + + a = md5_ii(a, b, c, d, x[i+ 0], 6 , -198630844); + d = md5_ii(d, a, b, c, x[i+ 7], 10, 1126891415); + c = md5_ii(c, d, a, b, x[i+14], 15, -1416354905); + b = md5_ii(b, c, d, a, x[i+ 5], 21, -57434055); + a = md5_ii(a, b, c, d, x[i+12], 6 , 1700485571); + d = md5_ii(d, a, b, c, x[i+ 3], 10, -1894986606); + c = md5_ii(c, d, a, b, x[i+10], 15, -1051523); + b = md5_ii(b, c, d, a, x[i+ 1], 21, -2054922799); + a = md5_ii(a, b, c, d, x[i+ 8], 6 , 1873313359); + d = md5_ii(d, a, b, c, x[i+15], 10, -30611744); + c = md5_ii(c, d, a, b, x[i+ 6], 15, -1560198380); + b = md5_ii(b, c, d, a, x[i+13], 21, 1309151649); + a = md5_ii(a, b, c, d, x[i+ 4], 6 , -145523070); + d = md5_ii(d, a, b, c, x[i+11], 10, -1120210379); + c = md5_ii(c, d, a, b, x[i+ 2], 15, 718787259); + b = md5_ii(b, c, d, a, x[i+ 9], 21, -343485551); + + a = safe_add(a, olda); + b = safe_add(b, oldb); + c = safe_add(c, oldc); + d = safe_add(d, oldd); + } + return Array(a, b, c, d); + +} + +/* + * These functions implement the four basic operations the algorithm uses. + */ +function md5_cmn(q, a, b, x, s, t) +{ + return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s),b); +} +function md5_ff(a, b, c, d, x, s, t) +{ + return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t); +} +function md5_gg(a, b, c, d, x, s, t) +{ + return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t); +} +function md5_hh(a, b, c, d, x, s, t) +{ + return md5_cmn(b ^ c ^ d, a, b, x, s, t); +} +function md5_ii(a, b, c, d, x, s, t) +{ + return md5_cmn(c ^ (b | (~d)), a, b, x, s, t); +} + +/* + * Calculate the HMAC-MD5, of a key and some data + */ +function core_hmac_md5(key, data) +{ + var bkey = str2binl(key); + if(bkey.length > 16) bkey = core_md5(bkey, key.length * chrsz); + + var ipad = Array(16), opad = Array(16); + for(var i = 0; i < 16; i++) + { + ipad[i] = bkey[i] ^ 0x36363636; + opad[i] = bkey[i] ^ 0x5C5C5C5C; + } + + var hash = core_md5(ipad.concat(str2binl(data)), 512 + data.length * chrsz); + return core_md5(opad.concat(hash), 512 + 128); +} + +/* + * Add integers, wrapping at 2^32. This uses 16-bit operations internally + * to work around bugs in some JS interpreters. + */ +function safe_add(x, y) +{ + var lsw = (x & 0xFFFF) + (y & 0xFFFF); + var msw = (x >> 16) + (y >> 16) + (lsw >> 16); + return (msw << 16) | (lsw & 0xFFFF); +} + +/* + * Bitwise rotate a 32-bit number to the left. + */ +function bit_rol(num, cnt) +{ + return (num << cnt) | (num >>> (32 - cnt)); +} + +/* + * Convert a string to an array of little-endian words + * If chrsz is ASCII, characters >255 have their hi-byte silently ignored. + */ +function str2binl(str) +{ + var bin = Array(); + var mask = (1 << chrsz) - 1; + for(var i = 0; i < str.length * chrsz; i += chrsz) + bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (i%32); + return bin; +} + +/* + * Convert an array of little-endian words to a string + */ +function binl2str(bin) +{ + var str = ""; + var mask = (1 << chrsz) - 1; + for(var i = 0; i < bin.length * 32; i += chrsz) + str += String.fromCharCode((bin[i>>5] >>> (i % 32)) & mask); + return str; +} + +/* + * Convert an array of little-endian words to a hex string. + */ +function binl2hex(binarray) +{ + var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef"; + var str = ""; + for(var i = 0; i < binarray.length * 4; i++) + { + str += hex_tab.charAt((binarray[i>>2] >> ((i%4)*8+4)) & 0xF) + + hex_tab.charAt((binarray[i>>2] >> ((i%4)*8 )) & 0xF); + } + return str; +} + +/* + * Convert an array of little-endian words to a base-64 string + */ +function binl2b64(binarray) +{ + var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + var str = ""; + for(var i = 0; i < binarray.length * 4; i += 3) + { + var triplet = (((binarray[i >> 2] >> 8 * ( i %4)) & 0xFF) << 16) + | (((binarray[i+1 >> 2] >> 8 * ((i+1)%4)) & 0xFF) << 8 ) + | ((binarray[i+2 >> 2] >> 8 * ((i+2)%4)) & 0xFF); + for(var j = 0; j < 4; j++) + { + if(i * 8 + j * 6 > binarray.length * 32) str += b64pad; + else str += tab.charAt((triplet >> 6*(3-j)) & 0x3F); + } + } + return str; +} + +var _context = null; +var _gameSoundsObj = {}; +_gameSoundsObj.loadCount = 0; +_gameSoundsObj.completedLoad = 0; +_gameSoundsObj.completed = false; +_gameSoundsObj.soundList = {}; +_gameSoundsObj.requestList = {}; +_gameSoundsObj.autoBgmList = {}; +_gameSoundsObj.loadAudio = function(item,callback){ + var src = "assets/wav/"+item.src; + if (!_context) callback('Audio Downloader: no web audio context.',null); + + //var request = new XMLHttpRequest(); + //request.open("GET", src, true); + //request.responseType = "arraybuffer"; + + //request.onload = function () { + //_context["decodeAudioData"](request.response, function(buffer){ + //item.buffer = buffer; + //_gameSoundsObj.soundList[item.id] = item; + //_gameSoundsObj.soundList[item.id].touched = false; + //callback(null, item.src); + //}, function(){ + //callback('decode error - ' + item.src,null); + //}); + //}; + + //request.onerror = function(){ + //callback('request error - ' + item.src,null); + //}; + + //request.send(); + _gameSoundsObj.requestList[item.src] = new XMLHttpRequest(); + _gameSoundsObj.requestList[item.src].open("GET", src, true); + _gameSoundsObj.requestList[item.src].responseType = "arraybuffer"; + + _gameSoundsObj.requestList[item.src].onload = function () { + _context["decodeAudioData"](_gameSoundsObj.requestList[item.src].response, function(buffer){ + item.buffer = buffer; + _gameSoundsObj.completedLoad++; + //logmessage(_gameSoundsObj.completedLoad+"/"+_gameSoundsObj.loadCount,1); + _gameSoundsObj.soundList[item.id] = item; + _gameSoundsObj.soundList[item.id].touched = false; + //var source = _context.createBufferSource(); + //source.buffer = _gameSoundsObj.soundList[item.id].buffer;// + //source.connect(_context.destination);// + callback(null, item.src); + }, function(){ + callback('decode error - ' + item.src,null); + }); + }; + + _gameSoundsObj.requestList[item.src].onerror = function(){ + callback('request error - ' + item.src,null); + }; + + _gameSoundsObj.requestList[item.src].send(); + if(GameData.OS == ConstVal.OS.apple){ + document.addEventListener('touchstart', function () { + //logmessage("touchstart1",1); + if(!_gameSoundsObj.completed){ + //logmessage("touchstart2",1); + var scount = 0; + for(src in _gameSoundsObj.soundList){ + scount++; + //for(var i=0;i<_gameSoundsObj.soundList[src].sourceList.length;i++){ + try{ + if(!_gameSoundsObj.soundList[src].touched){ + //logmessage("touched"+_gameSoundsObj.soundList[src].id,1); + _gameSoundsObj.soundList[src].touched = true; + _gameSoundsObj.soundList[src].connected = true; + var source = _context.createBufferSource(); + source.buffer = _gameSoundsObj.soundList[src].buffer;// + source.connect(_context.destination);// + } + + }catch(e){ + + } + //} + } + + for(src in _gameSoundsObj.autoBgmList){ + try{ + + //logmessage(src+"touched:"+_gameSoundsObj.soundList[src].touched+"、connected:"+_gameSoundsObj.soundList[src].connected,1); + if(_gameSoundsObj.soundList[src].touched && _gameSoundsObj.soundList[src].connected){ + //logmessage("autoBgmList:"+_gameSoundsObj.soundList[src].id,1); + _gameSoundsObj.play(src,true); + delete _gameSoundsObj.autoBgmList.src; + break; + } + + }catch(e){ + + } + } + + for(var i=0;i0){//背景音 + return; + } + //logmessage("_gameSoundsObj.play2",1); + var source = _context.createBufferSource(); + + source.buffer = item.buffer;// + source.connect(_context.destination);// + source.loop = loop; + source.playing = true; + source.isEnded = false; + source.onended = function(){ + this.isEnded = true; + this.playing = false; + _gameSoundsObj.clearEndedSource(); + } + item.sourceList.push(source); + //logmessage("play",1); + source.start(0);// + }catch(e){ + } + +} +_gameSoundsObj.stop = function(src){ + try{ + //logmessage("stop1:"+src,1); + for(var i=0;i<_gameSoundsObj.soundList[src].sourceList.length;i++){ + //logmessage("stop2:"+src,1); + if(!_gameSoundsObj.soundList[src].sourceList[i].isEnded){ + + _gameSoundsObj.soundList[src].sourceList[i].stop(); + _gameSoundsObj.soundList[src].sourceList[i].isEnded = true; + _gameSoundsObj.soundList[src].sourceList[i].splice(i,1); + i--; + } + + } + for(src in _gameSoundsObj.autoBgmList){ + try{ + //logmessage(src+"touched2:"+_gameSoundsObj.soundList[src].touched+"、connected:"+_gameSoundsObj.soundList[src].connected,1); + if(_gameSoundsObj.soundList[src]){ + //logmessage("autoBgmList2:"+_gameSoundsObj.soundList[src].id,1); + delete _gameSoundsObj.autoBgmList.src; + } + + }catch(e){ + + } + } + }catch(e){ + + } +} +_gameSoundsObj.clearAllSource = function(src){ + for(var i=0;i<_gameSoundsObj.soundList[src].sourceList.length;i++){ + try{ + if(!_gameSoundsObj.soundList[src].sourceList[i].isEnded){ + _gameSoundsObj.soundList[src].sourceList[i].stop(); + } + _gameSoundsObj.soundList[src].sourceList = null; + }catch(e){ + + } + } + _gameSoundsObj.soundList[src].sourceList = []; +} +_gameSoundsObj.clearEndedSource = function(){ + for(src in _gameSoundsObj.soundList){ + for(var i=0;i<_gameSoundsObj.soundList[src].sourceList.length;i++){ + try{ + if(_gameSoundsObj.soundList[src].sourceList[i].isEnded){ + _gameSoundsObj.soundList[src].sourceList.splice(i,1); + i--; + } + + }catch(e){ + + } + } + } + +} +var dynamicLoading = { + css: function(path){ + if(!path || path.length === 0){ + throw new Error('argument "path" is required !'); + } + var head = document.getElementsByTagName('head')[0]; + var link = document.createElement('link'); + link.href = path; + link.rel = 'stylesheet'; + link.type = 'text/css'; + head.appendChild(link); + }, + js: function(path){ + if(!path || path.length === 0){ + throw new Error('argument "path" is required !'); + } + var head = document.getElementsByTagName('head')[0]; + var script = document.createElement('script'); + script.src = path; + script.type = 'text/javascript'; + head.appendChild(script); + } +} +var setPostUrl = function setPostUrl(url){ + GameData.sharePostUrl = url; +} +var isArray = function isArray(o){ + return Object.prototype.toString.call(o)=='[object Array]'; +} +var gameLog = function gameLog(msg,mode){ + //logmessage(msg,1); +} +var checkMobile = function checkMobile(sMobile){ + //var sMobile = document.mobileform.mobile.value + ///^1[3|4|5|7|8|9][0-9]{9}$/ + if(!(/^1[3|4|5|6|7|8|9][0-9]{9}$/.test(sMobile))){ + return false; + } + return true; +} +var sliceStrByKey = function(str,key){ + var idx = str.indexOf(key); + if(idx>-1){ + return str.slice(0,idx); + } + return str; +} +//获取网页参数 +var fGetQuery = function(name){//获取参数值 + //var sUrl = window.location.search.substr(1); + //var r = sUrl.match(new RegExp("(^|&)" + name + "=([^&]*)(&|$)")); + //return (r == null ? null : unescape(r[2])); + if(typeof(window.location.search)!="undefined"&&window.location.search!=''){ + + var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i"); + var r = window.location.search.substr(1).match(reg); + if (r != null) { + return r[2]; + } + } + return null; +} +var fGetQuery1 = function(url,name){//获取参数值 + //if(typeof(window.location.search)!="undefined"&&window.location.search!=''){ + + var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i"); + var r = url.slice(url.indexOf("?"),url.length).substr(1).match(reg); + if (r != null) { + return r[2]; + } + //} + return null; +} + +var fixUrl = function(url){ + + var idx = url.indexOf("?"); + if(idx>-1){ + var preUrl = url.substr(0,idx+1); + var subUrl = url.substr(idx+1,url.length); + return preUrl+min_replaceAll(subUrl,"\\?","&"); + }else{ + return url; + } +} +var addParam = function(url,paramKey,paramVal){ + var andStr = "?"; + var beforeparam = url.indexOf("?"); + if(beforeparam != -1){ + andStr = "&"; + } + return url + andStr + paramKey + "="+ encodeURIComponent(paramVal); +} +var delParam = function(url,paramKey){ + var urlParam = url.substr(url.indexOf("?")+1); + var beforeUrl = url.substr(0,url.indexOf("?")); + var nextUrl = ""; + + var arr = new Array(); + if(urlParam!=""){ + var urlParamArr = urlParam.split("&"); + + for(var i=0;i0){ + nextUrl = "?"+arr.join("&"); + } + url = beforeUrl+nextUrl; + return url; +} +var Func=Func||{}; +var bForcepc = fGetQuery("dv") == "pc"; +//获取当前系统 +var fBrowserRedirect = function(){ +//function fBrowserRedirect(){ + var sUserAgent = navigator.userAgent.toLowerCase(); + var bIsIpad = sUserAgent.match(/ipad/i) == "ipad"; + var bIsIphoneOs = sUserAgent.match(/iphone os/i) == "iphone os"; + var bIsMidp = sUserAgent.match(/midp/i) == "midp"; + var bIsUc7 = sUserAgent.match(/rv:1.2.3.4/i) == "rv:1.2.3.4"; + var bIsUc = sUserAgent.match(/ucweb/i) == "ucweb"; + var bIsAndroid = sUserAgent.match(/android/i) == "android"; + var bIsCE = sUserAgent.match(/windows ce/i) == "windows ce"; + var bIsWM = sUserAgent.match(/windows mobile/i) == "windows mobile"; + if(bIsIpad||bIsIphoneOs){ + return ConstVal.OS.apple; + } + + if(bIsAndroid){ + return ConstVal.OS.android; + } + if(bIsWM){ + return ConstVal.OS.winphone; + } + return ConstVal.OS.other; + +} +var getQueryString =function(name) { + if(typeof(window.location.search)!="undefined"&&window.location.search!=''){ + + var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i"); + var r = window.location.search.substr(1).match(reg); + if (r !== null) { + return r[2]; + } + } + return null; +} + +var strToJson =function(str){ + var json = eval('(' + str + ')'); + return json; + //return JSON.parse(str); + +} +//获取字符字节长度 +String.prototype.gblen = function() { + var len = 0; + for (var i=0; i127 || this.charCodeAt(i)==94) { + len += 2; + } else { + len ++; + } + } + return len; +} + +//克隆数组 +Func.cloneArray = function(input_arr){ + return [].concat(input_arr); +} +//精确乘法 +Func.accMul = function(arg1,arg2){ + var m=0,s1=arg1.toString(),s2=arg2.toString(); + try{m+=s1.split(".")[1].length}catch(e){} + try{m+=s2.split(".")[1].length}catch(e){} + return Number(s1.replace(".",""))*Number(s2.replace(".",""))/Math.pow(10,m); +} +//敏感词过滤 +Func.filter = function(str) { + for (var i = 0; i < arrBan.length; i++) { + if(str.indexOf(arrBan[i])>=0 && arrBan[i]){ + return true; + } + } + return false; + + +} +//字符是否为空 +Func.strisNull =function( str ){ + if ( str == "" ) return true; + var regu = "^[ ]+$"; + var re = new RegExp(regu); + return re.test(str); +} +Func.setTextArea = function(id,isResize,maxlen){//精灵id,是否禁用大小调整,最大输入长度 + var obj = null; + obj = gameabc_face.getdiv("div"+id); + if(isResize){ + obj.style.resize = "none"; + } + if(maxlen){ + try{ + maxlen = Number(maxlen); + }catch(e){ + return ; + } + obj.maxLength = maxlen; + } + obj = null; + +} +Func.setInput = function(id,maxlen){//精灵id,是否禁用大小调整,最大输入长度 + other_setdom("div"+id,"maxlength",maxlen); + +} +Func.SetText=function(_msg,len){ + var text_copy=""; + for(var k=0;k<_msg.length;k++){ + text_copy+=_msg[k]; + if(k%len==0&&k!=0){ + text_copy+="\n"; + } + } + return text_copy; +} +Func.AjaxHttp = function(_data, func_callbackSucc, func_callbackFail, obj_inputmsg) +{ +// + var obj_config = {}; + obj_config.url = GameData.AjaxUrl; + obj_config.callbackdata = obj_inputmsg; + obj_config.data = JSON.stringify(_data); + obj_config.type = "POST"; + obj_config.success = func_callbackSucc; + obj_config.error = func_callbackFail; + min_http(obj_config); +} +Func.AjaxHttp2 = function(_url,_data, func_callbackSucc, func_callbackFail, obj_inputmsg) +{ + + var obj_config = {}; + obj_config.url = _url; + obj_config.callbackdata = obj_inputmsg; + obj_config.data = JSON.stringify(_data); + obj_config.type = "POST"; + obj_config.success = func_callbackSucc; + obj_config.error = func_callbackFail; + min_http(obj_config); +} +Func.AjaxHttp3 = function(_url,_data, func_callbackSucc, func_callbackFail, obj_inputmsg) +{ + //var sData = "?"; + //for(var key in _data){ + //sData += "&"+key+"="+_data[key]; + //} + var obj_config = {}; + obj_config.url = _url; + obj_config.callbackdata = obj_inputmsg; + obj_config.data = _data; + obj_config.type = "POST"; + obj_config.success = func_callbackSucc; + obj_config.error = func_callbackFail; + min_http(obj_config); +} +var IDValidator = function() { + var param = { + error : { + longNumber : '长数字存在精度问题,请使用字符串传值! Long number is not allowed, because the precision of the Number In JavaScript.' + } + }; + var util = { + checkArg : function(id) { + var argType = (typeof id); + + switch (argType) { + case 'number': + // long number not allowed + id = id.toString(); + if (id.length > 15) { + this.error(param.error.longNumber); + return false; + } + break; + case 'string': + break; + default: + return false; + } + id = id.toUpperCase(); + var code = null; + if (id.length === 18) { + // 18位 + code = { + body : id.slice(0, 17), + checkBit : id.slice(-1), + type : 18 + }; + } else if (id.length === 15) { + // 15位 + code = { + body : id, + type : 15 + }; + } else { + return false; + } + return code; + } + // 地址码检查 + , + checkAddr : function(addr, GB2260) { + var addrInfo = this.getAddrInfo(addr, GB2260); + return (addrInfo === false ? false : true); + } + // 取得地址码信息 + , + getAddrInfo : function(addr, GB2260) { + GB2260 = GB2260 || null; + // 查询GB/T2260,没有引入GB2260时略过 + if (GB2260 === null) { + return addr; + } + if (!GB2260.hasOwnProperty(addr)) { + // 考虑标准不全的情况,搜索不到时向上搜索 + var tmpAddr; + tmpAddr = addr.slice(0, 4) + '00'; + if (!GB2260.hasOwnProperty(tmpAddr)) { + tmpAddr = addr.slice(0, 2) + '0000'; + if (!GB2260.hasOwnProperty(tmpAddr)) { + return false; + } else { + return GB2260[tmpAddr] + '未知地区'; + } + } else { + return GB2260[tmpAddr] + '未知地区'; + } + } else { + return GB2260[addr]; + } + } + // 生日码检查 + , + checkBirth : function(birth) { + var year, month, day; + if (birth.length == 8) { + year = parseInt(birth.slice(0, 4), 10); + month = parseInt(birth.slice(4, 6), 10); + day = parseInt(birth.slice(-2), 10); + } else if (birth.length == 6) { + year = parseInt('19' + birth.slice(0, 2), 10); + month = parseInt(birth.slice(2, 4), 10); + day = parseInt(birth.slice(-2), 10); + } else { + return false; + } + // TODO 是否需要判断年份 + /* + * if( year<1800 ){ return false; } + */ + // TODO 按月份检测 + if (month > 12 || month === 0 || day > 31 || day === 0) { + return false; + } + + return true; + } + // 顺序码检查 + , + checkOrder : function(order) { + // 暂无需检测 + + return true; + } + // 加权 + , + weight : function(t) { + return Math.pow(2, t - 1) % 11; + } + // 随机整数 + , + rand : function(max, min) { + min = min || 1; + return Math.round(Math.random() * (max - min)) + min; + } + // 数字补位 + , + str_pad : function(str, len, chr, right) { + str = str.toString(); + len = len || 2; + chr = chr || '0'; + right = right || false; + if (str.length >= len) { + return str; + } else { + for (var i = 0, j = len - str.length; i < j; i++) { + if (right) { + str = str + chr; + } else { + str = chr + str; + } + } + return str; + } + } + // 抛错 + , + error : function(msg) { + var e = new Error(); + e.message = 'IDValidator: ' + msg; + throw e; + } + }; + var _IDValidator = function(GB2260) { + if (typeof GB2260 !== "undefined") { + this.GB2260 = GB2260; + } + // 建立cache + this.cache = {}; + }; + _IDValidator.prototype = { + isValid : function(id) { + var GB2260 = this.GB2260 || null; + var code = util.checkArg(id); + if (code === false) { + return false; + } + // 查询cache + if (this.cache.hasOwnProperty(id) + && typeof this.cache[id].valid !== 'undefined') { + return this.cache[id].valid; + } else { + if (!this.cache.hasOwnProperty(id)) { + this.cache[id] = {}; + } + } + + var addr = code.body.slice(0, 6); + var birth = (code.type === 18 ? code.body.slice(6, 14) : code.body + .slice(6, 12)); + var order = code.body.slice(-3); + + if (!(util.checkAddr(addr, GB2260) && util.checkBirth(birth) && util + .checkOrder(order))) { + this.cache[id].valid = false; + return false; + } + + // 15位不含校验码,到此已结束 + if (code.type === 15) { + this.cache[id].valid = true; + return true; + } + + /* 校验位部分 */ + + // 位置加权 + var posWeight = []; + for (var i = 18; i > 1; i--) { + var wei = util.weight(i); + posWeight[i] = wei; + } + + // 累加body部分与位置加权的积 + var bodySum = 0; + var bodyArr = code.body.split(''); + for (var j = 0; j < bodyArr.length; j++) { + bodySum += (parseInt(bodyArr[j], 10) * posWeight[18 - j]); + } + + // 得出校验码 + var checkBit = 12 - (bodySum % 11); + if (checkBit == 10) { + checkBit = 'X'; + } else if (checkBit > 10) { + checkBit = checkBit % 11; + } + checkBit = (typeof checkBit === 'number' ? checkBit.toString() + : checkBit); + + // 检查校验码 + if (checkBit !== code.checkBit) { + this.cache[id].valid = false; + return false; + } else { + this.cache[id].valid = true; + return true; + } + + } + + // 分析详细信息 + , + getInfo : function(id) { + var GB2260 = this.GB2260 || null; + // 号码必须有效 + if (this.isValid(id) === false) { + return false; + } + // TODO 复用此部分 + var code = util.checkArg(id); + + // 查询cache + // 到此时通过isValid已经有了cache记录 + if (typeof this.cache[id].info !== 'undefined') { + return this.cache[id].info; + } + + var addr = code.body.slice(0, 6); + var birth = (code.type === 18 ? code.body.slice(6, 14) : code.body + .slice(6, 12)); + var order = code.body.slice(-3); + + var info = {}; + info.addrCode = addr; + if (GB2260 !== null) { + info.addr = util.getAddrInfo(addr, GB2260); + } + info.birth = (code.type === 18 ? (([ birth.slice(0, 4), + birth.slice(4, 6), birth.slice(-2) ]).join('-')) : ([ + '19' + birth.slice(0, 2), birth.slice(2, 4), + birth.slice(-2) ]).join('-')); + info.sex = (order % 2 === 0 ? 0 : 1); + info.length = code.type; + if (code.type === 18) { + info.checkBit = code.checkBit; + } + + // 记录cache + this.cache[id].info = info; + + return info; + } + + // 仿造一个号 + , + makeID : function(isFifteen) { + var GB2260 = this.GB2260 || null; + + // 地址码 + var addr = null; + if (GB2260 !== null) { + var loopCnt = 0; + while (addr === null) { + // 防止死循环 + if (loopCnt > 10) { + addr = 110101; + break; + } + var prov = util.str_pad(util.rand(50), 2, '0'); + var city = util.str_pad(util.rand(20), 2, '0'); + var area = util.str_pad(util.rand(20), 2, '0'); + var addrTest = [ prov, city, area ].join(''); + if (GB2260[addrTest]) { + addr = addrTest; + break; + } + } + } else { + addr = 110101; + } + + // 出生年 + var yr = util.str_pad(util.rand(99, 50), 2, '0'); + var mo = util.str_pad(util.rand(12, 1), 2, '0'); + var da = util.str_pad(util.rand(28, 1), 2, '0'); + if (isFifteen) { + return addr + yr + mo + da + + util.str_pad(util.rand(999, 1), 3, '1'); + } + + yr = '19' + yr; + var body = addr + yr + mo + da + + util.str_pad(util.rand(999, 1), 3, '1'); + + // 位置加权 + var posWeight = []; + for (var i = 18; i > 1; i--) { + var wei = util.weight(i); + posWeight[i] = wei; + } + + // 累加body部分与位置加权的积 + var bodySum = 0; + var bodyArr = body.split(''); + for (var j = 0; j < bodyArr.length; j++) { + bodySum += (parseInt(bodyArr[j], 10) * posWeight[18 - j]); + } + + // 得出校验码 + var checkBit = 12 - (bodySum % 11); + if (checkBit == 10) { + checkBit = 'X'; + } else if (checkBit > 10) { + checkBit = checkBit % 11; + } + checkBit = (typeof checkBit === 'number' ? checkBit.toString() + : checkBit); + + return (body + checkBit); + } + + };// _IDValidator + GB2260 = GB2260 == null ? "" : GB2260; + return new _IDValidator(GB2260); +} +Func.subString=function(str, len, hasDot) +{ + var newLength = 0; + var newStr = ""; + var chineseRegex = /[^\x00-\xff]/g; + var singleChar = ""; + var strLength = str.replace(chineseRegex,"**").length; + for(var i = 0;i < strLength;i++) + { + singleChar = str.charAt(i).toString(); + if(singleChar.match(chineseRegex) != null) + { + newLength += 2; + } + else + { + newLength++; + } + if(newLength > len) + { + break; + } + newStr += singleChar; + } + + if(hasDot && strLength > len) + { + newStr += "..."; + } + return newStr; +} +Func.subString2=function(str, len, hasDot) +{ + var newLength = 0; + var newStr = ""; + var chineseRegex = /[^\x00-\xff]/g; + var singleChar = ""; + var strLength = str.replace(chineseRegex,"**").length; + for(var i = 0;i < strLength;i++) + { + singleChar = str.charAt(i).toString(); + if(singleChar.match(chineseRegex) != null) + { + newLength += 2; + } + else + { + newLength++; + } + if(newLength > len) + { + break; + } + newStr += singleChar; + } + + if(hasDot && strLength > len) + { + newStr += "..."; + } + return newStr; +} +Func.getKeywordCount = function(str,keyword){ + var reg = new RegExp(keyword,"g"); + var result = str.match(reg); + if(result){ + return result.length; + } + return 0; +} + +//设置普通震动 +Func.vibrator=function(time){ + try{ + if(GameData.appstate){ + window.settings.vibrator(time); + } + }catch(e){ + + } +} +//是否重复震动 +Func.repeatvibrator=function(repeat){ + try{ + if(GameData.appstate){ + window.settings.repeatvibrator(repeat); + } + }catch(e){ + + } +} +//取消震动 +Func.canclevibrator=function(){ + try{ + window.settings.canclevibrator(); + }catch(e){ + + } +} +//横竖屏 orientation 1 为横屏 2 为竖屏 +Func.orientation=function(Orientation){ + try{ + window.settings.orientation(Orientation); + }catch(e){ + + } +} +//通知 +Func.notification=function(Ticker,title,content){ + //因为游戏打包之前调用会报错,所以要使用try{}catch{} try 里面 使用打包调用的函数 + //var Ticker//手机状态栏通知 + //var title//标题 + //var content//内容 + try{ + window.settings.notification(Ticker,title,content); + }catch(e){ + + } +} +Func.sharefinend=function(sharefriend,type,webpageUrl,title,description,spidList){ + GameData.shareFriendInfo = { + sharefriend:sharefriend, + type:type, + webpageUrl:webpageUrl, + title:title, + description:description, + spidList:spidList + }; + //h5和非h5 + if(GameData.sysConfig.otherShare == 2){ + if(!GameData.h5Version){ + GameUI.openSharePannel(); + }else{ + Func.sharefriend(GameData.shareFriendInfo); + } + }else{ + Func.sharefriend(GameData.shareFriendInfo); + } +} + +Func.visitorLogin = function(){ + //游客身份登入,随机游客数据 + GameData.isVisitor = true; + GameData.isDeviceLogin = false; + var WxInfo = Utl.ReadData(Utl.Config.visitorinfo); + if(WxInfo != null){ + WxInfo = JSON.parse(WxInfo); + sharelogin(WxInfo.openid,WxInfo.headimgurl,WxInfo.nickname,WxInfo.sex,WxInfo.city,WxInfo.Province,WxInfo.unionid); + }else{ + var ram = 100000+ifast_random(100000); + var headLoginList=["http://img5.imgtn.bdimg.com/it/u=110166870,238965605&fm=27&gp=0.jpg", + "http://www.qqzhi.com/uploadpic/2015-01-15/200511535.jpg", + "http://img0.imgtn.bdimg.com/it/u=2722294531,1396252661&fm=27&gp=0.jpg", + "http://p2.gexing.com/touxiang/20130201/1735/510b8c7c1e572_200x200_3.jpg?recache=20131108", + "http://www.qqzhi.com/uploadpic/2015-01-15/200512924.jpg"]; + sharelogin(""+ram,headLoginList[ifast_random(headLoginList.length)],"游客"+ram,ifast_random(2)+1,"nanchang","jiangxi","ylgame"+ram); + } + +} +Func.deviceLogin = function(phone,sms){ + //设备登录 + GameData.isVisitor = false; + GameData.isDeviceLogin = true; + var WxInfo = Utl.getCookie(Utl.Config.devicePlayer); + if(WxInfo){ + WxInfo = JSON.parse(WxInfo); + sharelogin(WxInfo.openid,WxInfo.headimgurl,WxInfo.nickname,WxInfo.sex,WxInfo.city,WxInfo.Province,WxInfo.unionid,phone,sms); + }else{ + var unionid = min_randomChar(25); + if(GameData.phoneInfo){ + if(GameData.phoneInfo.PhoneIMEI){ + unionid = GameData.phoneInfo.PhoneIMEI; + }else{ + //GameUI.OpenTips("请到设置中打开游戏读取手机信息权限"); + GameData.phoneInfo.PhoneIMEI = unionid; + Utl.SaveData(Utl.Config.phoneInfo1,JSON.stringify(GameData.phoneInfo)); + } + }else{ + //GameUI.OpenTips("请到设置中打开游戏读取手机信息权限"); + GameData.phoneInfo = { + PhoneIMEI:unionid + }; + Utl.SaveData(Utl.Config.phoneInfo1,JSON.stringify(GameData.phoneInfo)); + } + var ram = 100000+ifast_random(100000); + + var name2 = String(hex_md5(unionid)).slice(0,6); + var avatar = ""; + if(GameData.sysConfig.avatarUrl){ + var avatar = GameData.sysConfig.avatarUrl + min_random(GameData.sysConfig.avatarRange[0], + GameData.sysConfig.avatarRange[1])+".jpg"; + } + var nickName = "User_"+name2; + sharelogin(unionid,avatar,nickName,ifast_random(2)+1, + "China","HongKong",unionid,phone,sms); + //var ram1 = 10000+ifast_random(10000); + + } + +} +Func.phoneLogin = function(phone,sms){ + //手机登录 + GameData.isVisitor = false; + GameData.isDeviceLogin = true; + var WxInfo = Utl.getCookie(Utl.Config.devicePlayer); + if(WxInfo){ + WxInfo = JSON.parse(WxInfo); + sharelogin(WxInfo.openid,WxInfo.headimgurl,WxInfo.nickname,WxInfo.sex,WxInfo.city,WxInfo.Province,WxInfo.unionid,phone,sms); + }else{ + var unionid = "phone_"+phone; + + + var name2 = String(hex_md5(unionid)).slice(0,6); + var avatar = ""; + if(GameData.sysConfig.avatarUrl){ + var avatar = GameData.sysConfig.avatarUrl + min_random(GameData.sysConfig.avatarRange[0], + GameData.sysConfig.avatarRange[1])+".jpg"; + } + var nickName = "User_"+name2; + sharelogin(unionid,avatar,nickName,ifast_random(2)+1, + "China","ShangHai",unionid,phone,sms); + //var ram1 = 10000+ifast_random(10000); + + } + +} +Func.accreditlogin=function(type){ + //因为游戏打包之前调用会报错,所以要使用try{}catch{} try 里面 使用打包调用的函数 catch() 里 + GameData.isVisitor = false; + GameData.isDeviceLogin = false; +// logmessage("accreditlogin",1); + try{ + var tp = 2; + if(type){ + tp=type; + } + window.settings.accreditlogin(tp); + + + }catch(e){ + if(GameData.h5Version == 1){ + + }else{ + var headLoginList=[ + "https://img2.baidu.com/it/u=1823726962,2692568839&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=500", + "https://img0.baidu.com/it/u=320875415,2231067789&fm=253&fmt=auto&app=120&f=JPEG?w=500&h=500", + "https://img1.baidu.com/it/u=3407774307,2859661062&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=500", + "https://img2.baidu.com/it/u=1161398577,3592656327&fm=253&fmt=auto&app=120&f=JPEG?w=500&h=500", + "https://img1.baidu.com/it/u=2061657615,4194426181&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=501", + "https://img2.baidu.com/it/u=3081347414,2363887197&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=500", + "https://img1.baidu.com/it/u=1364384963,3982203144&fm=253&fmt=auto&app=120&f=JPEG?w=500&h=500", + "https://img1.baidu.com/it/u=3041194995,2386060237&fm=253&fmt=auto&app=120&f=JPEG?w=500&h=500", + "https://img2.baidu.com/it/u=2904976445,2884058010&fm=253&fmt=auto&app=120&f=JPEG?w=529&h=500", + "https://img0.baidu.com/it/u=1801052125,1596537112&fm=253&fmt=auto&app=120&f=JPEG?w=529&h=500", + + ]; + var ram = ifast_random(100000); + + sharelogin("fff23"+ram,headLoginList[ifast_random(headLoginList.length)],"测试"+ram,ifast_random(2)+1,"nanchang","jiangxi","ylgame"+ram); + // sharelogin("fff23"+ram,headLoginList[ifast_random(headLoginList.length)],"测试"+ram,ifast_random(2)+1,"nanchang","jiangxi","oLVKis6bj3_l8qspMybG60KV2GN4"); + } + + } +} +var sharelogin = function(openid,headimgurl,nickname,sex,city,Province,unionid,phone,sms){ + if(!sex){ + sex = 1; + } + + if(!nickname && !headimgurl){//全为空时无法登陆 + GameUI.OpenTips("授权失败,请重新授权!"); + }else{ + var wxdata={}; + wxdata.openid = openid; + wxdata.headimgurl = headimgurl; + wxdata.nickname = nickname; + wxdata.sex = sex; + wxdata.city = city; + wxdata.Province = Province; + wxdata.unionid = unionid; + if(phone){ + wxdata.telphone = phone; + C_Player.setTel(phone); + } + wxdata=JSON.stringify(wxdata); + // if(GameData.isVisitor){ + // Utl.SaveData(Utl.Config.visitorinfo,wxdata); + // } + // if(GameData.isDeviceLogin){ + // Utl.SaveData(Utl.Config.devicePlayer,wxdata); + // } + if(!GameData.isVisitor && !GameData.isDeviceLogin){ + Utl.setCookie(Utl.Config.wxinfo,wxdata,Utl.Config.maxtime); + } + + C_Player.SetWxInfo(openid,headimgurl,nickname,sex,city,Province,unionid); + var data={}; + data.agentid = GameData.AgentId; + data.openid = C_Player.openid; + data.nickname = C_Player.nickname; + data.avatar = C_Player.avatar; + data.sex = C_Player.sex; + data.province = C_Player.province; + data.city = C_Player.city; + data.unionid = C_Player.unionid; + data.gameid=GameData.GameId; + data.version = GameData.versionCode; + data.channelid = GameData.ChannelId; + data.marketid = GameData.marketID; + if(phone){ + data.telphone = phone; + } + if(sms){ + if(sms != "telphoneAuto"){ + data.smmcode = sms; + data.telphoneAuto = false; + }else{ + data.telphoneAuto = true; + } + } + Net.Send_login(data); + + + } + +} +var sharesuccess = function(success,type){//分享成功回调 + + success = Number(success); + type = Number(type); + C_Player.sharesuccess(success,type); +} + +Func.getDate = function(){ + + + var today=new Date(); + var h=today.getHours(); + var m=today.getMinutes(); + if(m<10){ + m="0"+m; + } + if(h<10){ + h="0"+h; + } + return [h,m]; +} +Func.SetDate=function(){ + set_self(154,7,this.getDate()[0],0,0); + set_self(155,7,this.getDate()[1],0,0); +} +Func.trim = function(str) { + return str.replace(/\s+/g, ""); +} +Func.insertFlag = function(str,flg,sn,bTemp){ + //this.charCodeAt(i)>127 || this.charCodeAt(i)==94 + var newstr=""; + var strLen = str.length; + var count = 0; + var cutIndex = 0; + if(str.gblen()>sn){ + for(var i=0;i127 || str.charCodeAt(i)==94){//中文 + count += 2; + delta=2; + + }else{ + count++; + delta=1; + } + if(count > sn){ + var tmp = str.slice(cutIndex,i); + if(i==strLen-1){ + if(bTemp){ + newstr += tmp+flg; + }else{ + newstr += tmp; + } + }else{ + newstr += tmp+flg; + cutIndex=i; + count = delta; + } + } + if(i==strLen-1 && cutIndex!=i){ + var tmp = str.slice(cutIndex,strLen); + if(bTemp){ + newstr += tmp+flg; + }else{ + newstr += tmp; + } + + } + + + } + }else{ + if(bTemp){ + newstr = str + flg; + }else{ + newstr = str; + } + + } + return newstr; +} +Func.countFlag = function(str,flag){ + var rValue=0; + for(var i=0;iGame_Config.Max.reconnecttime){//超过重连时间 + if(Net.ws_tcp.readyState != WebSocket.OPEN){ + + GameData.disType = true; + GameData.ConnectType=false; + GameData.NetType=1; + Logic.TryConnect(); + }else{ + + GameData.ConnectType = false; + GameData.disType = true; + GameData.NetType=1; + GameUI.StartLoad(); + GameData.isClose = true; + //GameData.isCloseTimer = setTimeout(function(){ + //if(GameData.isClose){ + //Logic.DisConnect(); + //} + //},5000); + Net.ws_tcp.close(); + GameData.isCloseTimer = setInterval(function(){ + if(GameData.isClose){ + Net.ws_tcp.close(); + } + },5000); + } + }else{ + + if(Net.ws_tcp.readyState != WebSocket.OPEN){ + + GameData.disType = true; + GameData.ConnectType=false; + GameData.NetType=1; + Logic.TryConnect(); + }else{ + if(Desk.inDesk(C_Player.playerid)){ + if(Game_Modify.updateScene){ + Game_Modify.updateScene(); + } + }else{ + + } + + } + Utl.playMusic(); + + } + }else{ + Utl.playMusic(); + } + }else{//切出 + + Utl.stopMusic(); + Game_Modify.stopAllSounds(); + GameData.appstate=false; + for(var i=0;i0){ + var data={}; + data.agentid=GameData.AgentId; + data.gameid=GameData.GameId; + data.playerid=C_Player.playerid; + data.roomcode=Desk.roomcode; + data.voiceurl=audiourl; + data.time=time; + if(GameData.chatInfo){ + data.info = GameData.chatInfo; + data.type=2; + } + Net.Send_send_voice(data); + } +} +Func.mediaTypeAudio=function(audiourl,type,v){ + //因为游戏打包之前调用会报错,所以要使用try{}catch{} try 里面 使用打包调用的函数 catch() 里面使用你自己的函数 + try{ + window.settings.mediaTypeAudio(audiourl,type,v); + }catch(e){ + + // gameui_play_voice(v); + Net.submit_error("mediaAudio:audiourl="+audiourl+",type="+type+",user="+v,e.stack); + } +} +Func.up_imgurl=function(recid,photo){ +//[{photo:????,pid:??id}.....];String +//alert(photo); +//?????????????,?????try{}catch{} try ?? ????????? catch() ?????????? + //return; + if(!ConstVal.isGameHall){ + try{ + //if(!photo){return;} + var input_data=[]; + var input_obj={}; + input_obj.photourl=photo; + input_obj.pid=String(recid); + input_data.push(input_obj); + + + input_data=JSON.stringify(input_data); + window.settings.getphoto(input_data); + //Func.getphoto(input_data); + var pho=input_obj; + if(Number(pho.pid)==25){ + up_imgurl(Number(pho.pid),"assets/bmp/00170.png",1); + //}else if(Number(pho.pid)==115 || Number(pho.pid)==5){ + }else if(exceptSrc.indexOf(Number(pho.pid))>=0){ + }else{ + up_imgurl(Number(pho.pid),"assets/bmp/00170.png",1); + } + + }catch(e){ + + if(recid==25){ + up_imgurl(recid,"assets/bmp/00170.png",1); + setTimeout( + function(){ + if(photo){ + up_imgurl(recid,photo,1); + GameData.playerHeadImgState = true; + }else{ + up_imgurl(recid,"assets/bmp/00170.png",1); + } + },ConstVal.Max.headImgTimer); + }else if(exceptSrc.indexOf(recid)>=0){ + up_imgurl(recid,photo,1); + }else{ + + up_imgurl(recid,"assets/bmp/00170.png",1); + setTimeout( + function(){ + if(photo){ + up_imgurl(recid,photo,1); + }else{ + up_imgurl(recid,"assets/bmp/00170.png",1); + } + } + ,ConstVal.Max.headImgTimer); + } + + } + }else{ + gameHallImport.up_imgurl(recid,photo); + } +} +var getphoto = function(photo){ + if(!ConstVal.isGameHall){ + var obj = strToJson(photo); + for(var i=0;i=0){ + up_imgurl(Number(pho.pid),pho.photourl,1); + }else{ + //up_imgurl(Number(pho.pid),"assets/bmp/00170.png",1); + setTimeout( + function(){ + if(pho.photourl){ + up_imgurl(Number(pho.pid),pho.photourl,1); + }else{ + up_imgurl(Number(pho.pid),"assets/bmp/00170.png",1); + } + } + ,ConstVal.Max.headImgTimer); + } + } + } + }else{ + + } +} + +//调用手机默认浏览器打开链接 +Func.browser=function(url){ + try{ + if(url){ + url = fixUrl(url); + var exp = new Date(); + url += "×tamp=" + exp.getTime(); + window.settings.browser(url); + } + }catch(e){ + console.log(url); + } + +} +//主动获取手机电量 +Func.getbattery=function(){ + try{ + var battery=window.settings.getbattery(); + return battery; + }catch(e){ + //alert(e); + return 1; + + } +} + +//手机电量变化调用 +var getBattery = function(Battery){ + GameData.Battery=Battery; + if(GameData.Battery<=0.2){ + set_self(338,43,3,0,0); + }else{ + set_self(338,43,2,0,0); + } +} +//分享图片(链接) +Func.sharephotourl=function(sharetype,url){ + try{ + window.settings.sharephotourl(sharetype,url); + }catch(e){ + //alert(e); + } +} +//获取网络类型 1 未连接网络 2 连接wifi 3 连接2G/3G/4G +Func.getnetwork=function(){ + try{ + var type = window.settings.getnetwork(); + return type; + }catch(e){ + return 1; + } +} + +//获取wifi信号ssidname wifi名称 signalLevel wifi信号强度 0-4 弱到强 +Func.getwifisignalLevel=function(){ + try{ + window.settings.getwifisignalLevel(); + }catch(e){ + //alert(e); + + } +} +//WiFi信号变化调用 +var getwifiLevel=function(ssidname,signalLevel){ + GameData.WifiLevel=signalLevel; + GameData.WifiLevel= Number(GameData.WifiLevel); + switch(GameData.WifiLevel){ + case 0: + set_self(336,43,1,0,0); + break; + case 1: + case 2: + set_self(336,43,2,0,0); + break; + case 3: + case 4: + set_self(336,43,3,0,0); + break; + } + +} +//网络状况改变 +var getnetwork=function(type){ + type=Number(type); + switch(type){ + case 1: + + break; + case 2: + set_self(336,43,3,0,0); + Func.getwifisignalLevel(); + break; + case 3: + set_self(336,43,4,0,0); + break; + } +} +//获取版本类型 +Func.getVersionState = function(){ + //获取版本类型 用于判断版本是否高于服务器版本 + try{ + //苹果获取结果接口 + return Number(window.settings.getcompareCode()); + }catch(e){ + return 0; + //return 1; + } +} + +Func.startshake = function(){ + if(Utl.ReadData(Utl.Config.shake)==1){ + if(GameData.shakeID != Game_Config.shakeList.nil){ + try{ + window.settings.startshake(); + }catch(e){ + + } + } + } +} +Func.stopshake = function(){ + try{ + window.settings.stopshake(); + }catch(e){ + + } +} +Func.switchshakeVoice = function(Voicetype){ + try{ + window.settings.SwitchShake(Voicetype); + }catch(e){ + + } +} + +var shakeEnd = function(){//摇一摇回调 + Game_Modify.shakeEvent(); +} +//获得渠道名称 +Func.getchannelName = function(){// + try{ + var name=window.settings.getchannelName(); + if(name){ + return name; + }else{ + return ""; + } + }catch(e){ + if(GameData.userAgent != ConstVal.userAgent.uAgent_3){ + return ""; + }else{ + return app_channel; + } + } +} + +//播放声音 +Func.play_wav = function(src,isloop){ + if(src){ + if(GameData.appstate ||(!GameData.appstate&&isloop==-1)){ + try{ + if(!GameData.isRecord){ + window.settings.srcIsloop(src,isloop); + } + + }catch(e){ + if(GameData.h5Version == 1 && GameData.OS == ConstVal.OS.apple){ + //logmessage("apple play"+src+"、"+isloop,1); + switch(isloop){ + case 0: + case 1: + _gameSoundsObj.play(src,isloop); + break; + case -1: + _gameSoundsObj.stop(src); + break; + } + }else{ + if(!GameData.isRecord){ + play_wav(src,isloop); + } + } + + } + } + } + +} + +//开启扫一扫 +Func.OpenScan = function(){ + try{ + window.settings.opensaoma(); + }catch(e){ + + } +} +//扫一扫回调数据 +var getsaomaData = function(data){ + +} +//开启定位 +Func.startlocation = function(type){ + try{ + window.settings.startlocation(type); + }catch(e){ + console.log("Func.startlocation:",type); + getlocationinfo(JSON.stringify({"address":"江西省南昌市青云谱区施尧路靠近上海浦东发展银行(长天支行)","city":"南昌市", +"cityCode":"0791","country":"中国","district":"青云谱区","latitude":28.623546,"longitude":115.900333, +"province":"江西省","street":"施尧路","errorCode":0})); + } +} +//获取定位 +Func.getlocation = function(){ + try{ + if(GameData.otherLocation){ + GameData.otherLocationTimes++; + if(GameData.otherLocationTimes > GameData.otherLocationAllTimes){ + return; + } + } + + window.settings.getlocationinfo(); + }catch(e){ + console.log("Func.getlocation:"); + getlocationinfo(JSON.stringify({"address":"江西省南昌市青云谱区施尧路靠近上海浦东发展银行(长天支行)","city":"南昌市", +"cityCode":"0791","country":"中国","district":"青云谱区","latitude":28.623546,"longitude":115.900333, +"province":"江西省","street":"施尧路","errorCode":0})); + } +} +/* +{"address":"江西省南昌市青云谱区施尧路靠近上海浦东发展银行(长天支行)","city":"南昌市", +"cityCode":"0791","country":"中国","district":"青云谱区","latitude":28.623546,"longitude":115.900333, +"province":"江西省","street":"施尧路"}*/ +var getlocationinfo=function(locationinfo){ + if(locationinfo){ + try{ + locationinfo = JSON.parse(locationinfo); + C_Player.SetLocationInfo(locationinfo); + if(locationinfo.city&&locationinfo.province){ + if(Game_Modify.onLocationInfo){ + Game_Modify.onLocationInfo(locationinfo); + } + + if(GameData.isFirstLogin){ + GameData.isFirstLogin = false; + var data = {}; + data.agentid = Utl.getAgentID(); + data.playerid = Utl.getMyPlayerid(); + data.info = locationinfo; + Net.Send_submit_location(data); + } + } + }catch(e){ + } + } + +} +// +Func.SwitchOverGameData = function(webtype,Gamedirectory,gamedownloadurl,data){ + + try{ + if(ConstVal.isGameHall){ + GameData.hallLogin = false; + if(!gamedownloadurl || !Gamedirectory){ + gameHallImport.clearGameinfo(); + return; + } + Utl.stopMusic(); + } + window.settings.SwitchOverGameData(webtype,Gamedirectory,gamedownloadurl,data); + }catch(e){ + console.log("webtype:"+webtype+"Gamedirectory:"+Gamedirectory+"gamedownloadurl:"+gamedownloadurl+"data:"+data); + } + +} +Func.backgameData = function(data){// + try{ + window.settings.backgameData(data); + }catch(e){ + + } +} +var backgameData = function(){ + var data= {}; + if(C_Player.roomcard>-1){ + data.data = C_Player.returnHallData(); + data.opt = "updatePlayerInfo"; + data.from = 2; + data.gamename = app_gamename; + data.gameid = GameData.GameId; + Func.backgameData(JSON.stringify(data)); + }else{ + data.opt = "saveGameId"; + data.from = 2; + data.gamename = app_gamename; + data.gameid = GameData.GameId; + Func.backgameData(JSON.stringify(data)); + } + Utl.stopMusic(); + +} +var getWebdata = function(data){ + //gameLog("收到数据:"+data,1); + + + //if(data){ + //data = JSON.parse(data); + //C_Player.setRoomcard(data.roomcard); + //} + if(!ConstVal.isGameHall){ + try{ + if(data){ + if(typeof data == "string"){ + data = JSON.parse(data); + } + + if(typeof data.from != "undefined"){ + + data.from = Number(data.from); + switch(data.from){ + case 0://游戏间调用 + switch(data.opt){ + case "uptate_roomcard": + C_Player.setRoomcard(data.roomcard); + break; + case "loginPlayerid": + GameData.loginPlayerid = (data.data == GameData.GameId); + break; + } + break; + case 1://网页调用 + GameData.ConnectType = false; + GameData.disType = true; + GameData.NetType=1; + GameUI.StartLoad(); + GameData.isClose = true; + Net.ws_tcp.close(); + //var _msg = data.gamedata; + GameData.backUrl = data.backurl; + //if(_msg.route==RouteList.platform||_msg.route==RouteList.agent||_msg.route==RouteList.room){ + //if(min_ExitsFunction(Net[_msg.rpc])){ + //Net[_msg.rpc](_msg); + //} + //}else{ + + //} + break; + case 2: + switch(data.opt){ + case "updateHTML": + Logic.getHTML(); + break; + } + break; + } + } + } + }catch(e){ + + } + }else{ + GameData.hallLogin = true; + gameHallImport.getWebdata(data); + } +} +Func.ypayType = function(type){// + try{ + window.settings.ypayType(type); + }catch(e){ + console.log("ypayType:"+type); + } +} +var yPaytype = function(type,num){ + //logmessage("type:"+type+"num:"+num,1); + type=Number(type); + num=Number(num); + switch(type){ + case 1://房卡 + Net._SendData("youle","agent","update_roomcard",{agentid:GameData.AgentId,playerid:C_Player.playerid,change:num,type:9}); + break; + case 2://金币 + Net._SendData("youle","agent","update_bean",{agentid:GameData.AgentId,playerid:C_Player.playerid,change:num,type:9}); + break; + } +} +Func.getInstallInfo = function(data){// + try{ + var result = window.settings.getGameinstall(data); + return Number(result); + }catch(e){ + return ifast_random(2); + } +} +/* +{"body":"哈哈哈","price":1,"user":"sdsax11221","type":"ylniuniu001","typeplay":"1"} +?user 用户id??? +type:yl+gamename+00N???列子:ylniuniu001?ylniuniu002 +? +tpyealpay 支付类型 1 微信 2 支付宝 +body商品详情 +price 价格 +*/ +Func.getGamepay = function(data){// + try{ + window.settings.getGameplay(data); + }catch(e){ + var dt = JSON.parse(data); + PayuserPaytypePaystate(dt.playerid,dt.type,1,data.paytype,data) + } +} +var PayuserPaytypePaystate=function(user,type,state,typeplay,_data){// + //logmessage("user:"+user+" type:"+type+" state:"+state+" typeplay:"+typeplay,1); + GameUI.ClosePay(); + GameUI.CloseCheckPay(); + GameUI.EndLoad(); + if(Number(state) == 1){ + _data = JSON.parse(_data); + var data = {}; + data.agentid = Utl.getAgentID(); + data.playerid = _data.user; + data.channelid = GameData.ChannelId; + data.productid = _data.productid; + data.payid = _data.type; + data.amount = _data.amount; + data.money = _data.price; + data.paytype = _data.typeplay; + //Net.Send_pay_succ(data); + var senddata={}; + senddata.app=AppList.app; + senddata.route=RouteList.agent; + senddata.rpc=RpcList.pay_succ; + senddata.data=data; + Func.AjaxHttp(senddata,pay_succ_s,pay_succ_f); + var _msg={}; + var rd = Number(C_Player.roomcard) + Number(_data.amount); + var data1 ={ + roomcard:rd, + text:"购买"+GameData.roomCardName+",数量:"+_data.amount + }; + _msg.data=data1; + C_Player.UpdateRoomcard(_msg); + + + }else{ + GameUI.OpenTips("支付失败!",ConstVal.Tips.time); + } +} +var pay_succ_s = function(_msg,state,input_msg){ + //console.log("pay_succ_s"); + //_msg = JSON.parse(_msg); + //var rd = Number(_msg.data.roomcard); + //var rt = rd + Number(C_Player.roomcard); + //_msg.data.roomcard = rt; + //C_Player.UpdateRoomcard(_msg); + +} +var pay_succ_f=function(_msg,state,input_msg){ + //console.log("pay_succ_f"); +} +Func.callphone = function(tel){ + if(tel){ + window.location.href = 'tel://' + tel; + } +} +//复制到粘贴板 +Func.gameCopytext = function(text){// + try{ + window.settings.gameCopytext(text); + }catch(e){ + + } +} +//获得粘贴板内容 +Func.gamepastetext = function(){// + try{ + return window.settings.gamepastetext(); + }catch(e){ + return ""; + } +} +//获取手机信息 +Func.getphoneInfo = function(){// + try{ + if(Utl.ReadData(Utl.Config.phoneInfo1)){ + return; + } + if(GameData.isGetPhoneInfo){ + return; + }else{ + GameData.isGetPhoneInfo = true; + } + return window.settings.getphoneInfo(); + }catch(e){ + var data={}; + data.PhoneIMEI = "phone_"+min_randomChar(25); + getphoneinfo(data); + } +} +var getphoneinfo = function(data){ + if(data){ + if(typeof data == "string"){ + data = JSON.parse(data); + + //var msg={}; + //msg.info = {}; + //msg.info.phoneInfo = GameData.phoneInfo; + //msg.info.addrBook = GameData.addressBook; + //msg.agentid =GameData.AgentId; + //msg.playerid = C_Player.playerid; + //Net.Send_submit_phoneinfo(msg); + } + Utl.SaveData(Utl.Config.phoneInfo1,JSON.stringify(data)); + GameData.phoneInfo = data; + GameData.submitPhoneInfo = true; + } +} + +//获取手机信息 +Func.getAddressBook = function(){// + try{ + if(Number(Utl.ReadData(Utl.Config.book)) == 1){ + return; + }else{ + Utl.SaveData(Utl.Config.book,1); + } + return window.settings.getAddressBook(); + }catch(e){ + return ""; + } +} +var getAddressBook = function(data){ + if(data){ + //if(typeof data == "string"){ + //data = JSON.parse(data); + GameData.addressBook = data; + var msg={}; + msg.info = {}; + msg.info.phoneInfo = GameData.phoneInfo; + msg.info.addrBook = GameData.addressBook; + msg.agentid =GameData.AgentId; + msg.playerid = C_Player.playerid; + Net.Send_submit_phoneinfo(msg); + //} + GameData.submitAddressBook = true; + } +} +var gamepastetext_callback = function(resp){ + switch(GameData.gamepastetext){ + case "Logic.pasteRoomCode": + var reg = /[^0-9]/g; + var c_text = resp; + c_text = c_text.replace(reg,""); + var _text=String(c_text); + if(String(c_text).length>6){ + _text=String(c_text).substr(0,6); + } + RoomCode = String(_text); + RoomNum = Number(_text); + for(var i=0;i<6;i++){ + set_self(236+i,37,0,0,0); + } + for(var i=0;i= ConstVal.Com_History.content_tag){ + bTemp = true; + } + if(bTemp){ + play_ani(1,ConstVal.Com_History.f_spid+"add"+v,43,1,3,0,600,0,0,0,0,0,0); + }else{ + var x = Game_Config.Voice.VoiceLoc[v][0]; + var y = Game_Config.Voice.VoiceLoc[v][1]; + var dis_x = Game_Config.Voice.VoiceDis[0]; + var dis_y = Game_Config.Voice.VoiceDis[1]; + var isleft = Game_Config.Voice.isLeft[v]; + var text_len = get_self(642+v,20,0,0,0); + if(isleft){ + set_self(612+v,18,x,0,0); + set_self(612+v,19,y,0,0); + set_self(642+v,18,x+dis_x,0,0); + set_self(642+v,19,y+dis_y,0,0); + set_self(612+v,20,text_len+dis_x*2,0,0); + set_self(612+v,1,83,0,0); + set_self(612+v,37,1,0,0); + set_self(642+v,37,1,0,0); + }else{ + set_self(612+v,18,x-text_len-dis_x*2,0,0); + set_self(642+v,18,x-text_len-dis_x,0,0); + set_self(612+v,19,y,0,0); + set_self(642+v,19,y+dis_y,0,0); + set_self(612+v,20,text_len+dis_x*2,0,0); + set_self(612+v,1,86,0,0); + set_self(612+v,37,1,0,0); + set_self(642+v,37,1,0,0); + + } + play_ani(1,642+v,43,1,3,0,Game_Config.Voice.VoiceTime,0,0,0,0,0,0); + } + + //responseCallback(""); + }); + bridge.registerHandler("gameui_stop_voice",function(data,responseCallback){//通话状态改变是调用 + var v=Number(data); + var bTemp = false; + if(v>=ConstVal.Com_History.content_tag){ + bTemp = true; + } + if(bTemp){ + play_ani(0,ConstVal.Com_History.f_spid+"add"+v,43,1,3,0,600,0,0,0,0,0,0); + set_self(ConstVal.Com_History.f_spid+"add"+v,43,3,0,0); + }else{ + set_self(612+v,37,0,0,0); + set_self(642+v,37,0,0,0); + play_ani(0,642+v,43); + } + //responseCallback(""); + }); + + bridge.registerHandler("sharesuccess",function(data,responseCallback){//分享成功回调 + if(data){ + if(typeof data == "string"){ + data = strToJson(data); + } + } + var success = data.success; + var type = data.type; + success = Number(success); + type = Number(type); + C_Player.sharesuccess(success,type); + //responseCallback(""); + }); + bridge.registerHandler("getphoneinfo",function(data,responseCallback){//获取手机信息回调 + if(data){ + if(typeof data == "string"){ + data = strToJson(data); + + //var msg={}; + //msg.info = {}; + //msg.info.phoneInfo = GameData.phoneInfo; + //msg.info.addrBook = GameData.addressBook; + //msg.agentid =GameData.AgentId; + //msg.playerid = C_Player.playerid; + //Net.Send_submit_phoneinfo(msg); + } + Utl.SaveData(Utl.Config.phoneInfo1,JSON.stringify(data)); + GameData.phoneInfo = data; + GameData.submitPhoneInfo = true; + } + }); + + + bridge.registerHandler("getAddressBook",function(data,responseCallback){//获取手机信息回调 + if(data){ + //if(typeof data == "string"){ + //data = JSON.parse(data); + GameData.addressBook = data; + var msg={}; + msg.info = {}; + msg.info.phoneInfo = GameData.phoneInfo; + msg.info.addrBook = GameData.addressBook; + msg.agentid =GameData.AgentId; + msg.playerid = C_Player.playerid; + Net.Send_submit_phoneinfo(msg); + //} + GameData.submitAddressBook = true; + } + }); + bridge.registerHandler("phonestate",function(data,responseCallback){//通话状态改变是调用 + var state = data; + C_Player.phonestate(state); + //responseCallback(""); + }); + bridge.registerHandler("appservice",function(data,responseCallback){ + try{ + var service = data; + var isLog = false; + + service = Number(service); + + if(GameData.isLogin){ + if(service==1){//切回 + GameData.appstate=true; + if(GameData.heartBeatTimer){ + window.clearTimeout(GameData.heartBeatTimer); + } + if(!ConstVal.isGameHall){ + GameData.heartBeatTimer = setTimeout(function(){ + GameUI.OpenTips("网络较慢!",ConstVal.Tips.time); + GameData.heartBeatStage = true; + + //if(Net.ws_tcp.readyState == WebSocket.CLOSED){ + + //GameData.disType = true; + //GameData.ConnectType=false; + //GameData.NetType=1; + //Logic.TryConnect(); + //}else if(Net.ws_tcp.readyState == WebSocket.OPEN){ + + //GameData.ConnectType = false; + //GameData.disType = true; + //GameData.NetType=1; + //GameUI.StartLoad(); + //GameData.isClose = true; + //GameData.isCloseTimer = setTimeout(function(){ + //if(GameData.isClose){ + //Logic.DisConnect(); + //} + //},5000); + //Net.ws_tcp.close(); + //} + },ConstVal.Max.heartbeat); + } + //Utl.TurnOnBgm(get_self(4,37,0,0,0)); + if(ConstVal.netType == 0){ + var exp = new Date(); + if(exp.getTime()-GameData.leaveTime>Game_Config.Max.reconnecttime){//超过重连时间 + if(Net.ws_tcp.readyState != WebSocket.OPEN){ + + GameData.disType = true; + GameData.ConnectType=false; + GameData.NetType=1; + Logic.TryConnect(); + }else{ + + GameData.ConnectType = false; + GameData.disType = true; + GameData.NetType=1; + GameUI.StartLoad(); + GameData.isClose = true; + //GameData.isCloseTimer = setTimeout(function(){ + //if(GameData.isClose){ + //Logic.DisConnect(); + //} + //},5000); + Net.ws_tcp.close(); + GameData.isCloseTimer = setInterval(function(){ + if(GameData.isClose){ + Net.ws_tcp.close(); + } + },5000); + } + }else{ + + if(Net.ws_tcp.readyState != WebSocket.OPEN){ + + GameData.disType = true; + GameData.ConnectType=false; + GameData.NetType=1; + Logic.TryConnect(); + }else{ + if(Desk.inDesk(C_Player.playerid)){ + Game_Modify.updateScene(); + } + + } + Utl.playMusic(); + + } + }else{ + + } + }else{//切出 + Utl.stopMusic(); + Game_Modify.stopAllSounds(); + GameData.appstate=false; + for(var i=0;i0){ + var data={}; + data.agentid=GameData.AgentId; + data.gameid=GameData.GameId; + data.playerid=C_Player.playerid; + data.roomcode=Desk.roomcode; + data.voiceurl=audiourl; + data.time=time; + if(GameData.chatInfo){ + data.info = GameData.chatInfo; + data.type=2; + } + Net.Send_send_voice(data); + } + //responseCallback(""); + }); + + //手机电量变化调用 + bridge.registerHandler("getBattery",function(data,responseCallback){ + //logmessage(data,1); + + var Battery = data; + app_getbattery = Number(Battery); + GameData.Battery=Number(Battery); + if(GameData.Battery<=0.2){ + set_self(338,43,3,0,0); + }else{ + set_self(338,43,2,0,0); + } + //responseCallback(""); + }); + //WiFi信号变化调用 + bridge.registerHandler("getwifiLevel",function(data,responseCallback){ + if(data){ + if(typeof data == "string"){ + data = strToJson(data); + } + } + var ssidname = data.ssidname; + var signalLevel = data.signalLevel; + GameData.WifiLevel=signalLevel; + GameData.WifiLevel= Number(GameData.WifiLevel); + switch(GameData.WifiLevel){ + case 0: + set_self(336,43,1,0,0); + break; + case 1: + case 2: + set_self(336,43,2,0,0); + break; + case 3: + case 4: + set_self(336,43,3,0,0); + break; + } + //responseCallback(""); + }); + //网络状况改变 + bridge.registerHandler("getnetwork",function(data,responseCallback){ + var type=data; + type = Number(type); + app_getnetwork = type; + switch(type){ + case 1: + + break; + case 2: + set_self(336,43,3,0,0); + Func.getwifisignalLevel(); + break; + case 3: + set_self(336,43,4,0,0); + break; + } + //responseCallback(""); + }); + bridge.registerHandler("shakeEnd",function(data,responseCallback){//摇一摇回调 + Game_Modify.shakeEvent(); + //responseCallback(""); + }); + bridge.registerHandler("yPaytype",function(data,responseCallback){//摇一摇回调 + if(data){ + if(typeof data == "string"){ + data = strToJson(data); + } + } + type=Number(data.type); + num=Number(data.num); + switch(type){ + case 1://房卡 + Net._SendData("youle","agent","update_roomcard",{agentid:GameData.AgentId,playerid:C_Player.playerid,change:num,type:9}); + break; + case 2://金币 + Net._SendData("youle","agent","update_bean",{agentid:GameData.AgentId,playerid:C_Player.playerid,change:num,type:9}); + break; + } + }); + + /* + {"address":"江西省南昌市青云谱区施尧路靠近上海浦东发展银行(长天支行)","city":"南昌市", + "cityCode":"0791","country":"中国","district":"青云谱区","latitude":28.623546,"longitude":115.900333, + "province":"江西省","street":"施尧路"}*/ + bridge.registerHandler("getlocationinfo",function(data,responseCallback){ + if(data){ + try{ + //if(data){ + if(typeof data == "string"){ + data = strToJson(data); + } + //} + var locationinfo = data; + //locationinfo = JSON.parse(locationinfo); + C_Player.SetLocationInfo(locationinfo); + if(locationinfo.city&&locationinfo.province){ + if(Game_Modify.onLocationInfo){ + Game_Modify.onLocationInfo(locationinfo); + } + + if(GameData.isFirstLogin){ + GameData.isFirstLogin = false; + var data = {}; + data.agentid = Utl.getAgentID(); + data.playerid = Utl.getMyPlayerid(); + data.info = locationinfo; + Net.Send_submit_location(data); + } + } + }catch(e){ + } + } + //responseCallback(""); + }); + + bridge.registerHandler("getWebdata",function(data,responseCallback){ + //gameLog("收到数据:"+data,1); + if(data){ + if(typeof data == "string"){ + data = strToJson(data); + } + } + //if(data){ + //data = JSON.parse(data); + //C_Player.setRoomcard(data.roomcard); + //} + if(!ConstVal.isGameHall){ + if(data){ + + if(typeof data == "string"){ + data = strToJson(data); + } + if(typeof data.from != "undefined"){ + + data.from = Number(data.from); + + switch(data.from){ + case 0://游戏间调用 + switch(data.opt){ + case "uptate_roomcard": + C_Player.setRoomcard(data.roomcard); + + break; + case "loginPlayerid": + GameData.loginPlayerid = (data.data == GameData.GameId); + break; + } + break; + case 1://网页调用 + GameData.ConnectType = false; + GameData.disType = true; + GameData.NetType=1; + GameUI.StartLoad(); + GameData.isClose = true; + Net.ws_tcp.close(); + + //var _msg = data.gamedata; + GameData.backUrl = data.backurl; + //if(_msg.route==RouteList.platform||_msg.route==RouteList.agent||_msg.route==RouteList.room){ + //if(min_ExitsFunction(Net[_msg.rpc])){ + //Net[_msg.rpc](_msg); + //} + //}else{ + + //} + break; + case 2: + switch(data.opt){ + case "updateHTML": + Logic.getHTML(); + break; + } + break; + } + } + } + }else{ + GameData.hallLogin = true; + gameHallImport.getWebdata(data); + } + //responseCallback(""); + }); + bridge.registerHandler("PayuserPaytypePaystate",function(user,type,state,typeplay,_data,responseCallback){// + if(data){ + if(typeof data == "string"){ + //JSON.parse(data); + data = strToJson(data); + } + } + var user = data.user; + var type = data.type; + var state = data.state; + var typeplay = data.typeplay; + var _data = data._data; + //logmessage("user:"+user+" type:"+type+" state:"+state+" typeplay:"+typeplay,1); + GameUI.ClosePay(); + GameUI.CloseCheckPay(); + GameUI.EndLoad(); + if(Number(state) == 1){ + //_data = JSON.parse(_data); + var data = {}; + data.agentid = Utl.getAgentID(); + data.playerid = _data.user; + data.channelid = GameData.ChannelId; + data.productid = _data.productid; + data.payid = _data.type; + data.amount = _data.amount; + data.money = _data.price; + data.paytype = _data.typeplay; + //Net.Send_pay_succ(data); + var senddata={}; + senddata.app=AppList.app; + senddata.route=RouteList.agent; + senddata.rpc=RpcList.pay_succ; + senddata.data=data; + Func.AjaxHttp(senddata,pay_succ_s,pay_succ_f); + var _msg={}; + var rd = Number(C_Player.roomcard) + Number(_data.amount); + var data1 ={ + roomcard:rd, + text:"购买"+GameData.roomCardName+",数量:"+_data.amount + }; + _msg.data=data1; + C_Player.UpdateRoomcard(_msg); + + + }else{ + GameUI.OpenTips("支付失败!",ConstVal.Tips.time); + } + //responseCallback(""); + }); + bridge.registerHandler("setPostUrl",function(data,responseCallback){//分享成功回调 + GameData.sharePostUrl = data; + + }); + bridge.registerHandler("getphoto",function(data,responseCallback){//下载完成回调 + if(!ConstVal.isGameHall){ + var obj = strToJson(data); + for(var i=0;i=0){ + up_imgurl(Number(pho.pid),pho.photourl,1); + }else{ + //up_imgurl(Number(pho.pid),"assets/bmp/00170.png",1); + setTimeout( + function(){ + if(pho.photourl){ + up_imgurl(Number(pho.pid),pho.photourl,1); + }else{ + up_imgurl(Number(pho.pid),"assets/bmp/00170.png",1); + } + } + ,ConstVal.Max.headImgTimer); + } + } + } + }else{ + + } + + }); + + bridge.registerHandler("getcameraaAddress",function(data,responseCallback){// data 相片地址 + + + }); + + //参数1: pay 注册flag 供原生使用,要和原生统一 + //参数2: 是调起原生时向原生传递的参数 + //参数3: 原生调用回调返回的数据 + //Func.getVersionState = function(){ + //var returnData = 0; + //bridge.callHandler('getcompareCode','',function(resp){ + //returnData = resp; + //} + //); + //return returnData; + //} + Func.getphoto = function(data){ + bridge.callHandler('getphoto',data,function(resp){ + + } + ); + } + Func.h5Webpay=function(){ + //?????????????,?????try{}catch{} try ?? ????????? + //var Ticker//??????? + //var title//?? + //var content//?? + try{ + //window.settings.notification(Ticker,title,content); + var data = { + openid:C_Player.openid, + nickname:C_Player.nickname, + sex:C_Player.sex, + city:C_Player.city, + province:C_Player.province, + headimgurl:C_Player.avatar, + unionid:C_Player.unionid, + agentid:GameData.AgentId, + channelid:GameData.ChannelId, + playerid:C_Player.playerid, + return_url:GameData.returnUrl + }; + bridge.callHandler('h5Webpay',data,function(resp){ + + } + ); + }catch(e){ + + } + } + + Func.up_imgurl=function(recid,photo){ + //因为游戏打包之前调用会报错,所以要使用try{}catch{} try 里面 使用打包调用的函数 catch() 里面使用你自己的函数 + try{ + if(!ConstVal.isGameHall){ + if(GameData.OS == ConstVal.OS.android){ + var input_data=[]; + var input_obj={}; + input_obj.photourl=photo; + input_obj.pid=String(recid); + input_data.push(input_obj); + + + input_data=JSON.stringify(input_data); + //bridge.callHandler('getphoto',input_data,function(resp){ + + //} + //); + Func.getphoto(input_data); + var pho=input_obj; + if(Number(pho.pid)==25){ + up_imgurl(Number(pho.pid),"assets/bmp/00170.png",1); + //}else if(Number(pho.pid)==115 || Number(pho.pid)==5){ + }else if(exceptSrc.indexOf(Number(pho.pid))>=0){ + }else{ + up_imgurl(Number(pho.pid),"assets/bmp/00170.png",1); + } + }else{ + if(recid==25){ + up_imgurl(recid,"assets/bmp/00170.png",1); + setTimeout( + function(){ + if(photo){ + up_imgurl(recid,photo,1); + GameData.playerHeadImgState = true; + }else{ + up_imgurl(recid,"assets/bmp/00170.png",1); + } + },ConstVal.Max.headImgTimer); + }else if(exceptSrc.indexOf(recid)>=0){ + up_imgurl(recid,photo,1); + }else{ + + up_imgurl(recid,"assets/bmp/00170.png",1); + setTimeout( + function(){ + if(photo){ + up_imgurl(recid,photo,1); + }else{ + up_imgurl(recid,"assets/bmp/00170.png",1); + } + } + ,ConstVal.Max.headImgTimer); + } + } + + }else{ + gameHallImport.up_imgurl(recid,photo); + } + + }catch(e){ + + } + } + Func.getVideoinfo = function(data){ + try{ + + data = JSON.parse(data); + bridge.callHandler('getVideoinfo',data,function(resp){ + + } + ); + }catch(e){ + + } + } + Func.getphoneInfo = function(){ + try{ + if(Utl.ReadData(Utl.Config.phoneInfo1)){ + return; + } + if(GameData.isGetPhoneInfo){ + return; + }else{ + GameData.isGetPhoneInfo = true; + } + bridge.callHandler('getphoneInfo',"",function(resp){ + + } + ); + }catch(e){ + + } + + } + Func.getAddressBook = function(){ + try{ + if(Number(Utl.ReadData(Utl.Config.book)) == 1){ + return; + }else{ + Utl.SaveData(Utl.Config.book,1); + } + bridge.callHandler('getAddressBook',"",function(resp){ + + } + ); + }catch(e){ + + } + + } + Func.createRoom=function(){ + try{ + var isOpen = 1; + //if(Game_Modify.getVideoByRoomType){ + //isOpen = Game_Modify.getVideoByRoomType(Desk.roomtype); + //} + //if(!GameData.openVideo){return;} + if(!GameData.hallConfig.openVideo || !isOpen){return;} + if(!Desk.videoConfig){ + return; + } + var userinfo = { + agentid:GameData.AgentId, + roomid:Utl.getRoomcode(), + gameid:GameData.GameId, + playerid:C_Player.playerid, + left:get_self(376,18,0,0,0), + top:get_self(376,19,0,0,0), + width:get_self(376,20,0,0,0), + height:get_self(376,21,0,0,0), + pmw : 1280, + pmh : 720 + + }; + bridge.callHandler('createRoom',userinfo,function(resp){ + + } + ); + }catch(e){ + + } + } + Func.exitRoom=function(){ + try{ + var isOpen = 1; + //if(Game_Modify.getVideoByRoomType){ + //isOpen = Game_Modify.getVideoByRoomType(Desk.roomtype); + //} + //if(!GameData.openVideo){return;} + if(!GameData.hallConfig.openVideo || !isOpen){return;} + if(!Desk.videoConfig){ + return; + } + var userinfo = { + agentid:GameData.AgentId, + gameid:GameData.GameId, + roomid:Utl.getRoomcode(), + playerid:C_Player.playerid + + }; + bridge.callHandler('exitRoom',userinfo,function(resp){ + + } + ); + }catch(e){ + + } + } + Func.accreditlogin=function(data){ + //因为游戏打包之前调用会报错,所以要使用try{}catch{} try 里面 使用打包调用的函数 catch() 里面使用你自己的函数 + GameData.isVisitor = false; + try{ + var tp = 2; + if(data){ + tp=data; + } + // window.settings.accreditlogin(); + bridge.callHandler('accreditlogin',data,function(resp){ + + } + ); + + }catch(e){ + var headLoginList=[ "http://pic.fxxz.com/up/2016-6/2016060511335263357.png", + "http://pic.fxxz.com/up/2016-6/2016060511335249995.png", + "http://pic.fxxz.com/up/2016-6/2016060511335146994.png", + "http://pic.fxxz.com/up/2016-6/2016060511335682256.png", + "http://pic.fxxz.com/up/2016-6/2016060511335333433.png"]; + var ram = ifast_random(100000); + //sharelogin("fff23"+ram,headLoginList[ifast_random(5)],"测试"+ram,ifast_random(1)+1,"nanchang","jiangxi",222); + sharelogin("fff23"+ram,headLoginList[ifast_random(5)],"测试测试测试"+ram,ifast_random(1)+1,"nanchang","jiangxi","ylgame"+ram); + } + } + //退出登录通知app + Func.logoffCallback = function(){ + try{ + //window.settings.cancellogin(); + bridge.callHandler('cancellogin','',function(resp){ + + } + ); + }catch(e){ + console.log("logoff"); + } + + } + //内部打开网页 + Func.OpenurlTitleData = function(url,title,data,ort){// + try{ + if(url){ + url=fixUrl(url); + var orient=0; + if(fGetQuery1(url,"orientation")){ + orient = 1; + } + var exp = new Date(); + url += "×tamp=" + exp.getTime(); + var data={ + url:url, + title:title, + data:data, + orientation:orient + }; + //window.settings.OpenurlTitleData(url,title,data); + bridge.callHandler('OpenurlTitleData',data,function(resp){ + + } + ); + } + }catch(e){ + console.log(url+"、"+title+"、"+data); + } + } + //获得指定文件夹 + //Func.getothername = function(name){// + //var rtname = ""; + //try{ + //var rtname = window.settings.getothername(name); + //return rtname; + //bridge.callHandler('getothername',"",getothername_callback + //); + + //}catch(e){ + + //} + //return rtname; + //var aaa = window["app_"+name]; + //logmessage("name:"+name,1); + //return window["app_"+name]; + //} + //获得自定义文件夹名 + Func.getOther = function(){// + var assetname = ""; + try{ + //var assetname = window.settings.getOther(); + //return assetname; + bridge.callHandler('getOther',"",function(resp){ + assetname = resp; + } + ); + }catch(e){ + + } + return assetname; + } + //开启关闭语音 + Func.voicePlaying = function(type){// + try{ + //window.settings.voicePlaying(type); + bridge.callHandler('voicePlaying',type,function(resp){ + + } + ); + }catch(e){ + console.log("voicePlaying:"+type); + } + } + //复制到粘贴板 + Func.gameCopytext = function(text){// + try{ + //window.settings.gameCopytext(text); + bridge.callHandler('gameCopytext',text,function(resp){ + + } + ); + }catch(e){ + + } + } + //打开拍照 + Func.opencamera = function(){ + bridge.callHandler('opencamera',"",function(resp){ + + } + ); + } + //获得粘贴板内容 + Func.gamepastetext = function(){// + var returnValue = ""; + try{ + //return window.settings.gamepastetext(); + bridge.callHandler('gamepastetext',"",gamepastetext_callback); + }catch(e){ + + } + return returnValue; + } + //获得市场id + Func.getmarketname = function(){// + //var returnValue = 1; + //try{ + //return window.settings.getmarketname(); + //bridge.callHandler('getmarketname',"",getmarketname_callback + //); + //}catch(e){ + + //} + //return returnValue; + //logmessage("market:"+app_market,1); + return app_market; + } + Func.getInstallInfo = function(data){// + if(!ConstVal.isGameHall){ + var returnValue = ifast_random(2); + try{ + //var result = window.settings.getGameinstall(data); + //return Number(result); + bridge.callHandler('getGameinstall',data,function(resp){ + returnValue = Number(resp); + } + ); + }catch(e){ + //return ifast_random(2); + + } + return returnValue; + }else{ + return gameHallImport.isInstalled(data); + } + } + /* + {"body":"哈哈哈","price":1,"user":"sdsax11221","type":"ylniuniu001","typeplay":"1"} + ?user 用户id??? + type:yl+gamename+00N???列子:ylniuniu001?ylniuniu002 + ? + tpyealpay 支付类型 1 微信 2 支付宝 + body商品详情 + price 价格 + */ + Func.getGamepay = function(data){// + try{ + //window.settings.getGameplay(data); + bridge.callHandler('getGameplay',"",function(resp){ + + } + ); + }catch(e){ + //var dt = JSON.parse(data); + //PayuserPaytypePaystate(dt.playerid,dt.type,1,data.paytype,data) + } + } + Func.getphonestate = function(){ + bridge.callHandler('getphonestate',"",function(resp){ + //主动调用返回通话状态 + + } + ); + + } + Func.ypayType = function(type){ + + bridge.callHandler('ypayType',type,function(resp){ + //主动调用返回通话状态 + + } + ); + + } + + // + Func.SwitchOverGameData = function(webtype,Gamedirectory,gamedownloadurl,data){ + try{ + //window.settings.SwitchOverGameData(webtype,Gamedirectory,gamedownloadurl,data); + var data={ + webtype:webtype, + Gamedirectory:Gamedirectory, + gamedownloadurl:gamedownloadurl, + data:data + }; + if(ConstVal.isGameHall){ + GameData.hallLogin = false; + if(!gamedownloadurl || !Gamedirectory){ + gameHallImport.clearGameinfo(); + return; + } + + } + bridge.callHandler('SwitchOverGameData',data,function(resp){ + + } + ); + }catch(e){ + //console.log("webtype:"+webtype+"Gamedirectory:"+Gamedirectory+"gamedownloadurl:"+gamedownloadurl+"data:"+data); + } + } + Func.backgameData = function(data){// + try{ + //var data= {}; + //if(C_Player.roomcard>-1){ + //data.data = C_Player.returnHallData(); + //data.opt = "updatePlayerInfo"; + //data.from = 2; + //data.gamename = app_gamename; + //data.gameid = GameData.GameId; + //Func.backgameData(JSON.stringify(data)); + //}else{ + //data.opt = "saveGameId"; + //data.from = 2; + //data.gamename = app_gamename; + //data.gameid = GameData.GameId; + //Func.backgameData(JSON.stringify(data)); + //} + bridge.callHandler('backgameData',data,function(resp){ + + } + ); + }catch(e){ + + } + } + //开启定位 + Func.startlocation = function(type){ + try{ + //window.settings.startlocation(type); + bridge.callHandler('startlocation',type,function(resp){ + + } + ); + }catch(e){ + + } + } + //获取定位 + Func.getlocation = function(){ + try{ + if(GameData.otherLocation){ + GameData.otherLocationTimes++; + if(GameData.otherLocationTimes > GameData.otherLocationAllTimes){ + return; + } + } + //window.settings.getlocationinfo(); + bridge.callHandler('getlocationinfo',"",function(resp){ + + } + ); + }catch(e){ + + } + } + Func.getchannelName = function(){// + + return app_channel; + } + + //播放声音 + Func.play_wav = function(src,isloop){ + if(src){ + if(GameData.appstate ||(!GameData.appstate&&isloop==-1)){ + try{ + if(!GameData.isRecord){ + //window.settings.srcIsloop(src,isloop); + var data = { + src:src, + isloop:isloop + }; + bridge.callHandler('srcIsloop',data,function(resp){ + + } + ); + } + + }catch(e){ + if(!GameData.isRecord){ + play_wav(src,isloop); + } + } + } + } + + } + + //开启扫一扫 + Func.OpenScan = function(){ + try{ + //window.settings.opensaoma(); + bridge.callHandler('opensaoma',"",function(resp){ + + } + ); + }catch(e){ + + } + } + Func.getVersionState = function(){ + + return Number(app_appversion); + } + + Func.startshake = function(){ + if(Utl.ReadData(Utl.Config.shake)==1){ + if(GameData.shakeID != Game_Config.shakeList.nil){ + try{ + //window.settings.startshake(); + bridge.callHandler('startshake','',function(resp){ + + } + ); + }catch(e){ + + } + } + } + } + Func.stopshake = function(){ + try{ + //window.settings.stopshake(); + bridge.callHandler('stopshake','',function(resp){ + + } + ); + }catch(e){ + + } + } + Func.switchshakeVoice = function(Voicetype){ + try{ + //window.settings.SwitchShake(Voicetype); + bridge.callHandler('SwitchShake',Voicetype,function(resp){ + + } + ); + }catch(e){ + + } + } + + //分享图片(链接) + Func.sharephotourl=function(sharetype,url){ + try{ + //window.settings.sharephotourl(sharetype,url); + var data={ + sharetype:sharetype, + url:url + }; + bridge.callHandler('sharephotourl',data,function(resp){ + + } + ); + }catch(e){ + //alert(e); + } + } + //获取网络类型 1 未连接网络 2 连接wifi 3 连接2G/3G/4G + Func.getnetwork=function(){ + + return app_getnetwork; + + } + //获取wifi信号ssidname wifi名称 signalLevel wifi信号强度 0-4 弱到强 + Func.getwifisignalLevel=function(){ + return Number(app_getwifisignalLevel); + } + //调用手机默认浏览器打开链接 + Func.browser=function(url){ + try{ + if(url){ + url = fixUrl(url); + //window.settings.browser(url); + bridge.callHandler('browser',url,function(resp){ + + } + ); + } + }catch(e){ + console.log(url); + } + + } + //主动获取手机电量 + Func.getbattery=function(){ + + return app_getbattery; + } + Func.mediaTypeAudio=function(audiourl,type,user){ + //因为游戏打包之前调用会报错,所以要使用try{}catch{} try 里面 使用打包调用的函数 catch() 里面使用你自己的函数 + try{ + //window.settings.mediaTypeAudio(audiourl,type,v); + var data = { + audiourl:audiourl, + type:type, + user:user + }; + bridge.callHandler('mediaTypeAudio',data,function(resp){ + + } + ); + }catch(e){ + + // gameui_play_voice(v); + //Net.submit_error("mediaAudio:audiourl="+audiourl+",type="+type+",user="+v,e.stack); + } + } + + Func.prepareAudio=function(){ + //因为游戏打包之前调用会报错,所以要使用try{}catch{} try 里面 使用打包调用的函数 catch() 里面使用你自己的函数 + try{ + Utl.stopMusic(); + GameData.isRecord = true; + //window.settings.prepareaudio(); + bridge.callHandler('prepareaudio',"",function(resp){ + + } + ); + }catch(e){ + //alert(e); + + } + } + //设置普通震动 + Func.vibrator=function(time){ + try{ + if(GameData.appstate){ + //window.settings.vibrator(time); + bridge.callHandler('vibrator',time,function(resp){ + + } + ); + } + }catch(e){ + + } + } + //是否重复震动 + Func.repeatvibrator=function(repeat){ + try{ + if(GameData.appstate){ + //window.settings.repeatvibrator(repeat); + bridge.callHandler('repeatvibrator',repeat,function(resp){ + + } + ); + } + }catch(e){ + + } + } + //取消震动 + Func.canclevibrator=function(){ + try{ + //window.settings.canclevibrator(); + bridge.callHandler('canclevibrator',"",function(resp){ + + } + ); + }catch(e){ + + } + } + //横竖屏 orientation 1 为横屏 2 为竖屏 + Func.orientation=function(Orientation){ + try{ + //window.settings.orientation(Orientation); + bridge.callHandler('orientation',Orientation,function(resp){ + + } + ); + }catch(e){ + + } + } + //通知 + Func.notification=function(Ticker,title,content){ + //因为游戏打包之前调用会报错,所以要使用try{}catch{} try 里面 使用打包调用的函数 + //var Ticker//手机状态栏通知 + //var title//标题 + //var content//内容 + try{ + //window.settings.notification(Ticker,title,content); + var data={ + Ticker:Ticker, + title:title, + content:content + }; + bridge.callHandler('notification',data,function(resp){ + + } + ); + }catch(e){ + + } + } + + + + Func.sharefriend=function(data){//1普通分享2截图分享3图片链接分享 + //因为游戏打包之前调用会报错,所以要使用try{}catch{} try 里面 使用打包调用的函数 catch() 里面使用你自己的函数 + var sharefriend = data.sharefriend; + var type = data.type; + var webpageUrl = data.webpageUrl; + var title = data.title; + var description = data.description; + var sharetype = data.sharetype; + if(!sharetype){ + sharetype = 0; + } + if(!webpageUrl){webpageUrl = Game_Config.Share.appdownload;} + if(GameData.gameData){ + webpageUrl = webpageUrl + "&gameData="+GameData.gameData; + webpageUrl = fixUrl(webpageUrl); + } + if(!title){title = Game_Config.Share.title+Game_Config.Share.description;} + //if(!description){description = } + type == 2 ? GameData.shareFrom = 1 : GameData.shareFrom = 0; + + try{ + //window.settings.friendsSharetypeUrlToptitleDescript(sharefriend,type,webpageUrl,title,description); + var data={ + sharefriend:sharefriend, + type:type, + webpageUrl:webpageUrl, + title:title, + description:description, + sharetype:sharetype + }; + bridge.callHandler('friendsSharetypeUrlToptitleDescript',data,function(resp){ + + }); + }catch(e){ + //console.log("分享:sharefrind:"+sharefriend+"\ntype:"+type+"\nwebpageUrl:"+webpageUrl+"\ntitle:"+title+"\ndescription:"+description); + } + + + } + +}); +} +var shareLink=function shareLink(shareTimeline,shareAppMessage) { +var fenxiang = shareParam; + var sid1= getQueryString('sid'); + var scode1= getQueryString('scode'); + + var sidScode ={sid: sid1, scode: scode1}; + if(!sidScode) { + + return; + } + + $.ajax({ + type: "post", + url: "https://api.tscce.cn/api/weixin/wx_share_info", + dataType: 'json', + data: $.extend({}, sidScode, fenxiang), + timeout: 1000 * 8, + success: function (data, textStatus) { + //console.log('success', data); + if (data.error == 0) { + var js = + { + debug: false, + appId: data.data.appId, // ???????? + timestamp: data.data.timestamp, // ???????? + nonceStr: data.data.nonceStr, // ???????? + signature: data.data.signature,// ?? + jsApiList: [ + 'onMenuShareTimeline', + 'onMenuShareAppMessage' + ] + } + wx.config(js); + wx.ready(function(){ + + + wx.onMenuShareTimeline({ // + title: shareTimeline.title, + link: shareTimeline.link, // + imgUrl: shareTimeline.imgUrl, // + success: function () { // + sharesuccess(2,2); + GameUI.closeShareImg(); + //dialog.alert('分享朋友圈成功'); + }, + cancel: function () { // + GameUI.closeShareImg(); + } + }); + + wx.onMenuShareAppMessage({ //????? + title: shareAppMessage.title, // + desc: shareAppMessage.desc, // + link: shareAppMessage.link, // + imgUrl: shareAppMessage.imgUrl, // + type: 'link', + success: function () { // + sharesuccess(2,1); + GameUI.closeShareImg(); + //dialog.alert('分享好友成功'); + }, + cancel: function () { // + GameUI.closeShareImg(); + } + }); + }); + wx.error(function(res){ + + }); + return; + } else { + //alert(data.error_code + ': ' + data.msg); + sessionStorage.clear(); + var code = parseInt(data.error_code); + if(data.error_code === 10001 || data.error_code === 10008 || data.error_code === 10011) { + //getSidScode(wxLogin); + } + } + }, + complete: function (res) { + //console.log('complete',res); + }, + error: function (XMLHttpRequest, textStatus, errorThrown) { + //console.log('error', XMLHttpRequest, textStatus, errorThrown); + //alert("错误"); + } + }); +} +Func.appDownload = function(url) { + if(url){ + top.location=url; + } + +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/js/00_Surface/06_Player.js b/client/js/00_Surface/06_Player.js new file mode 100644 index 0000000..df12185 --- /dev/null +++ b/client/js/00_Surface/06_Player.js @@ -0,0 +1,558 @@ +function Player(seat){ + this.openid = "";//id + this.playerid = -1;//playerid + this.nickname = "";//昵称 + this.avatar = "";//头像地址 + this.sex = 0;//性别 + this.ip = "";//ip地址 + this.province = "";//微信信息省份 + this.city = "";//微信信息城市 + this.roomcard = -1;//房卡数量 + this.taskstate = 0;//任务状态 + this.unionid = 0;//平台唯一表示 + this.seat = seat; //座位号 + this.score = 0; + this.state = -1;//玩家状态0->默认值 -1->申请解散 1->同意解散 2->拒绝解散 + this.status = 0;//0->默认值 1->房主 2->非房主 + //this.offline = 0;//玩家是否离线0->否 1->离线 + this.canexit=1;//是否可以直接离开 + this.onstate=0;//0:在线1:离线2:通话中 + this.addr = null; + this.invitecode = "";//邀请码 + this.isStart = false;//能否点击按钮开始游戏 + this.bean = 0;//玩家豆子数量 + this.initialBean = 0;//玩家豆子初始值 + this.isprepare = 0;//玩家是否准备 + this.advanced = 0;//玩家是否有高级选项 + this.paycode = "";//吱口令 + this.wareHouseStarCount = 0;//仓库库存星星 + this.bankpower = 0;//是否有仓库权限 + this.bankpwd = 0;//是否设置仓库密码 + this.charm = undefined; + this.sign = "";//签名 + this.tel = "";//绑定手机号 +} +//玩家信息初始化 +if(typeof(Player.prototype.Init) == "undefined"){ + Player.prototype.Init = function(bTemp){ + this.openid = "";//id + this.playerid = -1;//playerid + this.nickname = "";//昵称 + this.score = 0; + this.avatar = "";//头像地址 + this.sex = 0;//性别 + this.ip = "";//ip地址 + this.province = "";//省份 + this.city = "";//城市 + this.roomcard = 0;//房卡数量 + this.taskstate = 0;//任务状态 + this.unionid = 0;//平台唯一表示 + if(bTemp)this.seat = -1; //座位号 + this.state = -1;//玩家状态0->默认值 1->申请解散 2->同意解散 3->拒绝解散 + this.status = 0;//0->默认值 1->房主 2->非房主 + this.offline = 0;//玩家是否离线0->否 1->离线 + this.canexit=1;//是否可以直接离开 + this.onstate=0;//0:在线1:离线2:通话中 + this.addr = null; + this.invitecode = "";//邀请码 + this.isStart = false;//能否点击按钮开始游戏 + this.bean = 0;//玩家豆子数量 + this.initialBean = 0;//玩家豆子初始值 + this.isprepare = 0;//玩家是否准备 + this.advanced = 0;//玩家是否有高级选项 + this.paycode = "";//吱口令 + this.wareHouseStarCount = 0;//仓库库存星星 + this.bankpower = 0;//是否有仓库权限 + this.bankpwd = 0;//是否设置仓库密码 + this.charm = undefined; + this.sign = "";//签名 + this.tel = "";//绑定手机号 + }; +} +//玩家微信信息初始化 +if(typeof(Player.prototype.SetWxInfo) == "undefined"){ + Player.prototype.SetWxInfo = function(openid,headimgurl,nickname,sex,city,Province,unionid){ + this.openid = openid;//id + this.nickname = nickname;//昵称 + this.avatar = headimgurl;//头像地址 + this.sex = sex;//性别 + this.city = city;//城市 + this.province = Province;//省 + this.unionid=unionid;//开放平台id + //alert("设置玩家信息"); + }; +} +//玩家游戏信息初始化 +if(typeof(Player.prototype.SetMyInfo) == "undefined"){ + //Player.prototype.SetMyInfo = function(_playerid,_roomcard,_taskstate,_ip,_score,_bean,_paycode){ + Player.prototype.SetMyInfo = function(object){ + this.playerid = object.playerid; + this.roomcard = object.roomcard; + this.taskstate = object.taskstate; + this.ip=object.ip; + this.score = object.score; + this.bean = object.bean; + this.initialBean = object.bean; + this.bankpower = object.bankpower; + if(object.bank){ + this.wareHouseStarCount = Number(object.bank);//仓库库存星星 + }else{ + this.wareHouseStarCount = 0; + } + if(object.bankpwd){ + this.bankpwd = Number(object.bankpwd);//仓库库存星星 + }else{ + this.bankpwd = 0; + } + this.charm = object.charm; + this.sign = object.sign; + this.tel = object.tel; + //this.setTel(); + //this.bankpwd = object.bank;//是否设置仓库密码 this.bankpwd = 0;//是否设置仓库密码 + //this.paycode = _paycode; + }; +} +//设置玩家位置 +if(typeof(Player.prototype.SetLocationInfo) == "undefined"){ + Player.prototype.SetLocationInfo = function(_locationinfo){ + this.addr = _locationinfo; + if(this.addr && this.addr.errorCode == 0){ + set_self(200,7,C_Player.addr.province+"-"+C_Player.addr.city,0,0); + }else{ + set_self(200, 7, "获取定位失败!", 0, 0); + } + + }; +} + +//设置玩家座位 +if(typeof(Player.prototype.SetSeat) == "undefined"){ + Player.prototype.SetSeat = function(seat){ + this.seat = seat; + }; +} +//设置玩家邀请码 +if(typeof(Player.prototype.setInvitecod) == "undefined"){ + Player.prototype.setInvitecod = function(_invitecode){ + this.invitecode = _invitecode; + }; +} +//修改房卡 +if(typeof(Player.prototype.UpdateRoomcard) == "undefined"){ + Player.prototype.UpdateRoomcard = function(_msg){ + this.roomcard = _msg.data.roomcard; + //set_self(157,7,C_Player.roomcard,0,0); + //set_self(157,18,get_self(287,18,0,0,0)+get_self(287,20,0,0,0)/2-String(C_Player.roomcard).length*7,0,0); + GameUI.setHallRoomCard(); + if(_msg.data.text){ + GameUI.Openupdataroomcard(_msg.data.text); + } + }; +} +//修改豆豆 +if(typeof(Player.prototype.update_bean) == "undefined"){ + Player.prototype.update_bean = function(_msg){ + this.bean = _msg.data.bean; + GameUI.setHallStar(); + //set_self(497,7,C_Player.bean,0,0); + //set_self(497,18,get_self(496,18,0,0,0)+get_self(496,20,0,0,0)/2-String(C_Player.bean).length*7,0,0); + set_self(510,7,GameData.starName+":"+C_Player.bean,0,0); + GameUI.openUpdateBean(_msg.data.text); + if(C_Player.seat>-1){//在房间内 + var pobj = Desk.GetPlayerBySeat(C_Player.seat); + pobj.bean = C_Player.bean; + pobj = null; + if(C_Player.seat == GameData.infoSeat){ + set_self(511,7,GameData.starName+":"+C_Player.bean,0,0); + } + } + }; +} +//修改豆豆 +if(typeof(Player.prototype.update_bean2) == "undefined"){ + Player.prototype.update_bean2 = function(_bean){ + this.bean = _bean; + GameUI.setHallStar(); + //set_self(497,7,C_Player.bean,0,0); + //set_self(497,18,get_self(496,18,0,0,0)+get_self(496,20,0,0,0)/2-String(C_Player.bean).length*7,0,0); + set_self(510,7,GameData.starName+":"+C_Player.bean,0,0); + if(C_Player.seat>-1){//在房间内 + var pobj = Desk.GetPlayerBySeat(C_Player.seat); + pobj.bean = C_Player.bean; + pobj = null; + if(C_Player.seat == GameData.infoSeat){ + set_self(511,7,GameData.starName+":"+C_Player.bean,0,0); + } + } + }; +} +//修改豆豆 +if(typeof(Player.prototype.changeBean) == "undefined"){ + Player.prototype.changeBean = function(_bean){ + this.bean = this.initialBean + _bean; + GameUI.setHallStar(); + //set_self(497,7,C_Player.bean,0,0); + //set_self(497,18,get_self(496,18,0,0,0)+get_self(496,20,0,0,0)/2-String(C_Player.bean).length*7,0,0); + set_self(510,7,GameData.starName+":"+C_Player.bean,0,0); + if(C_Player.seat>-1){//在房间内 + var pobj = Desk.GetPlayerBySeat(C_Player.seat); + pobj.bean = C_Player.bean; + pobj = null; + if(C_Player.seat == GameData.infoSeat){ + set_self(511,7,GameData.starName+":"+C_Player.bean,0,0); + } + } + }; +} +//设置房卡 +if(typeof(Player.prototype.setRoomcard) == "undefined"){ + Player.prototype.setRoomcard = function(_roomcard){ + this.roomcard = _roomcard; + GameUI.setHallRoomCard(); + }; +} +//设置房卡 +if(typeof(Player.prototype.addRoomCard) == "undefined"){ + Player.prototype.addRoomCard = function(value,text){ + this.roomcard += value; + GameUI.setHallRoomCard(); + if(text){ + GameUI.Openupdataroomcard(text); + } + }; +} +if(typeof(Player.prototype.setBean) == "undefined"){ + Player.prototype.setBean = function(value){ + this.bean = value; + GameUI.setHallStar(); + }; +} +if(typeof(Player.prototype.addBean) == "undefined"){ + Player.prototype.addBean = function(value,text){ + this.bean += value; + GameUI.setHallStar(); + if(text){ + GameUI.Openupdataroomcard(text); + } + }; +} +//设置吱口令 +if(typeof(Player.prototype.setPayCode) == "undefined"){ + Player.prototype.setPayCode = function(_paycode){ + if(_paycode){ + this.paycode = _paycode;//吱口令 + }else{ + this.paycode = "";//吱口令 + } + + }; +} +//绑定邀请码 +if(typeof(Player.prototype.binding_invitecode) == "undefined"){ + Player.prototype.binding_invitecode = function(_msg){ + + if(_msg.data.state == 0){ + this.invitecode = _msg.data.invitecode; + } + GameUI.OpenTips(_msg.data.error,ConstVal.Tips.time); + + }; +} +//设置牌桌内玩家数据 +if(typeof(Player.prototype.SetDeskInfo) == "undefined"){ + Player.prototype.SetDeskInfo = function(_data,bTemp){ + this.playerid=_data.playerid; + this.nickname=_data.nickname; + this.avatar=_data.avatar; + this.sex=_data.sex; + this.ip=_data.ip; + this.onstate=_data.onstate; + this.bean = _data.bean; + if(!bTemp){ + this.initialBean = _data.bean;//玩家豆子初始值 + }else{ + this.initialBean = _data.initialBean;//玩家豆子初始值 + } + this.isprepare = _data.isprepare;//玩家是否准备 + if(_data.paycode){ + this.paycode = _data.paycode; + }else{ + this.paycode = ""; + } + this.charm = _data.charm; + this.sign = _data.sign; + }; +} +//获取牌桌内玩家数据 +if(typeof(Player.prototype.getDeskInfo) == "undefined"){ + Player.prototype.getDeskInfo = function(){ + var rValue = {}; + rValue.playerid=this.playerid; + rValue.nickname=this.nickname; + rValue.avatar=this.avatar; + rValue.sex=this.sex; + rValue.ip=this.ip; + rValue.onstate=this.onstate; + rValue.bean = this.bean; + rValue.initialBean = this.initialBean;//玩家豆子初始值 + rValue.isprepare = this.isprepare;//玩家是否准备 + if(this.paycode){ + rValue.paycode = _data.paycode; + }else{ + rValue.paycode = ""; + } + rValue.charm = this.charm; + return rValue; + }; +} +//房间解散 +if(typeof(Player.prototype.BreakRoom) == "undefined"){ + Player.prototype.BreakRoom = function(){ + this.seat = -1; //座位号 + this.state = -1;//玩家状态0->默认值 1->申请解散 2->同意解散 3->拒绝解散 + this.status = 0;//0->默认值 1->房主 2->非房主 + this.isStart = false;//能否点击按钮开始游戏 + //this.paycode = ""; + }; +} +//申请解散房间 +if(typeof(Player.prototype.ApplyBreakRoom) == "undefined"){ + Player.prototype.ApplyBreakRoom = function(){ + this.state = 0;//玩家状态0->默认值 1->申请解散 2->同意解散 3->拒绝解散 + }; +} +//同意解散房间 +if(typeof(Player.prototype.AgreeBreakRoom) == "undefined"){ + Player.prototype.AgreeBreakRoom = function(){ + this.state = 1;//玩家状态0->默认值 1->申请解散 2->同意解散 3->拒绝解散 + }; +} +//拒绝解散房间 +if(typeof(Player.prototype.RefuseBreakRoom) == "undefined"){ + Player.prototype.RefuseBreakRoom = function(){ + this.state = 2;//玩家状态0->默认值 1->申请解散 2->同意解散 3->拒绝解散 + }; +} +//更改玩家是否可以直接退出 +if(typeof(Player.prototype.ChangeExit) == "undefined"){ + Player.prototype.ChangeExit = function(v){ + this.canexit = v; + switch(v){ + case 1: + if(this.status == 1){ + set_self(181,43,4,0,0); + }else{ + set_self(181,43,3,0,0); + } + + break; + case 0: + GameUI.hideExitBtn(); + set_self(181,43,1,0,0); + break; + } + }; +} +//更改玩家通话状态 +if(typeof(Player.prototype.phonestate) == "undefined"){ + Player.prototype.phonestate = function(state){ + state=Number(state); + C_Player.onstate=state; + var pobj=Desk.GetPlayerBySeat(C_Player.seat); + if(!pobj){return;} + pobj.onstate=state; + GameUI.SetOnState(C_Player.seat.seat,state); + switch(state){ + case 0://挂断 + var data={}; + data.agentid=GameData.AgentId; + data.gameid=GameData.GameId; + data.playerid=C_Player.playerid; + data.roomcode=Desk.roomcode; + Net.Send_hangup_phone(data); + break; + case 1://接起电话 + var data={}; + data.agentid=GameData.AgentId; + data.gameid=GameData.GameId; + data.playerid=C_Player.playerid; + data.roomcode=Desk.roomcode; + Net.Send_call_phone(data); + break; + case 2://电话进来 + var data={}; + data.agentid=GameData.AgentId; + data.gameid=GameData.GameId; + data.playerid=C_Player.playerid; + data.roomcode=Desk.roomcode; + Net.Send_call_phone(data); + break; + case 3://去电 + var data={}; + data.agentid=GameData.AgentId; + data.gameid=GameData.GameId; + data.playerid=C_Player.playerid; + data.roomcode=Desk.roomcode; + Net.Send_call_phone(data); + break; + } + }; +} +//更改玩家任务提醒状态 +if(typeof(Player.prototype.ChangeTaskstate) == "undefined"){ + Player.prototype.ChangeTaskstate = function(v){ + this.taskstate = v; + }; +} +//分享回调 +if(typeof(Player.prototype.sharesuccess) == "undefined"){ + Player.prototype.sharesuccess = function(success,type){ + + if(success==2 && type == 2){//分享成功 + var data={}; + data.agentid=GameData.AgentId; + data.playerid=this.playerid; + data.taskid=ConstVal.ShareTaskId; + Net.Send_player_finish_task(data); + + }else{ + //GameUI.OpenTips("分享失败!",ConstVal.Tips.time); + } + if(success == 2 && GameData.shareFrom == 1){//截图分享成功 + try{ + GameData.shareTimes++; + if(isArray(GameData.hallConfig.actData)){ + if(GameData.hallConfig.actData[1] == 0){//活动关闭 + return; + } + switch(GameData.activityType){// + case 1://大赢家 + if(GameData.shareTimes == 1){ + var sendUrl = GameData.hallConfig.actData[3]; + var event = 3; + Logic.sendToWeb2(sendUrl,event); + } + break; + } + } + //if(!isArray(GameData.hallConfig.activity)){// + + //return; + //}else{ + //if(GameData.hallConfig.activity.length>=5){ + //if(GameData.hallConfig.activity[4] == 0){ + //return; + //} + //} + //} + + //logmessage("大赢家截图分享成功!"+GameData.shareTimes+"、"+GameData.activityType,1); + //switch(GameData.activityType){// + //case 1://大赢家 + //if(GameData.shareTimes == 1){ + //var sendUrl = "http://discount.0791ts.cn/api/add_game_times"; + //var actId = 1; + + //if(GameData.hallConfig.activity.length > 5){ + //sendUrl = GameData.hallConfig.activity[6]; + //actId = GameData.hallConfig.activity[7]; + //} + //Logic.sendToWeb(sendUrl,actId); + //} + //break; + //} + }catch(e){ + + } + } + GameData.activityType = 0; + GameData.activityData = null; + + }; +} +//有 +if(typeof(Player.prototype.player_finish_task) == "undefined"){ + Player.prototype.player_finish_task = function(_msg){ + if(_msg.data.state==1 && C_Player.taskstate==0){ + C_Player.taskstate=1; + } + }; +} +//领取任务奖励 +if(typeof(Player.prototype.get_task_award) == "undefined"){ + Player.prototype.get_task_award = function(_msg){ + for(var i=0;i-1){//在房间内 + if(this.seat == GameData.infoSeat){ + set_self(3125,7,GameData.sysConfig.charmName+":"+count,0,0); + } + } + }; +} +//设置魅力值 +if(typeof(Player.prototype.setSign) == "undefined"){ + Player.prototype.setSign = function(sign){ + this.sign = sign; + GameUI.setSign(sign); + GameUI.closeTextInput(); + }; +} +if(typeof(Player.prototype.updateHallData) == "undefined"){ + Player.prototype.updateHallData = function(data){ + this.setSign(data.sign); + this.setRoomcard(data.roomcard); + this.update_bean2(data.bean); + }; +} +if(typeof(Player.prototype.returnHallData) == "undefined"){ + Player.prototype.returnHallData = function(data){ + var obj={}; + obj.sign = this.sign; + obj.roomcard = this.roomcard; + obj.bean = this.bean; + return obj; + }; +} + +//设置手机号 +if(typeof(Player.prototype.setTel) == "undefined"){ + Player.prototype.setTel = function(val){ + this.tel = val; + // set_self(3256,43,2,0,0); + // play_ani(0,3256,35,255,100,0,1000,0,0,0,0,0,1); + }; +} + + diff --git a/client/js/00_Surface/07_Desk.js b/client/js/00_Surface/07_Desk.js new file mode 100644 index 0000000..670ce82 --- /dev/null +++ b/client/js/00_Surface/07_Desk.js @@ -0,0 +1,1425 @@ + + +var Desk=Desk||{}; + +Desk.PlayerList=[];//玩家列表 +Desk.roomcode = "";//房间号 +Desk.stage=0;//牌桌阶段 0->未开局 1->已开局 +Desk.state=0;//牌桌解散状态 0->正常 1->申请解散状态 +Desk.applyresult=-1;//投票结果-1->无结果0->不通过1->通过 +Desk.AgreeList=[];//同意解散座位列表 +Desk.agreefree=[]; +Desk.roomtype = []; +Desk.warcnt=0;//开战条件 +Desk.playercnt=0;//玩家总数 +Desk.count=0;// 总局数 +Desk.deskfree=null; +Desk.starCount = 0;//投降扣除星星数量 +Desk.roomMode = 0;//0->普通场 1->星星场 +Desk.needprepare = 0;//是否需要准备 +Desk.myInfo = null;//自己的信息 +Desk.infinite = 0;//无限局 +Desk.isSystem = 1;//是否为系统房间 +Desk.shortcode = null;//房间短号 +Desk.videoConfig = null;//视频房选项 +Desk.ownerNotice = null;//短号房主留言 +Desk.videoDes = "";//视频房描述 +Desk.rebateNumber = 0;//房间抽成数量 +Desk.rebateMode = 0;//抽成类型 +Desk.rebateType = 0;//抽金币还是魅力值 +Desk.setMyInfo = function(_data){ + Desk.myInfo.seat = _data.seat; + Desk.myInfo.playerid=_data.playerid; + Desk.myInfo.nickname=_data.nickname; + Desk.myInfo.avatar=_data.avatar; + Desk.myInfo.sex=_data.sex; + Desk.myInfo.ip=_data.ip; + Desk.myInfo.onstate=_data.onstate; + Desk.myInfo.bean = _data.bean; + Desk.myInfo.initialBean = _data.bean;//玩家豆子初始值 + //Desk.myInfo.paycode = _data.paycode; +} +//设置vip房主公告 +Desk.setOwnerNotice = function(_value){ + if(_value){ + Desk.ownerNotice = _value; + } + +} +Desk.setRebateNumber = function(_value){ + if(_value){ + Desk.rebateNumber = _value; + } + +} +Desk.setRebateMode = function(_value){ + if(_value){ + Desk.rebateMode = _value; + } +} +Desk.setRebateType = function(_value){ + if(_value){ + Desk.rebateType = _value; + } +} +Desk.setStarCount = function(_value){ + Desk.starCount = _value; +} +Desk.setInfinite = function(_value){ + Desk.infinite = _value; + //Desk.infinite = 1; +} +Desk.setRoomMode = function(_value){ + Desk.roomMode = _value; +} +Desk.Create=function(roomtype){//创建牌桌 + this.PlayerList= []; + if(typeof Game_Modify.getMaxPlayerCount !== 'undefined'){ + this.PlayerList.length = Game_Modify.getMaxPlayerCount(roomtype); + }else{ + this.PlayerList.length = Game_Config.Max.PlayerCnt; + } + + for(var i=0;i无结果0->不通过1->通过 + this.roomcode = "";//房间号 + this.stage=0;//牌桌阶段 0->未开局 1->已开局 + this.state=0;//牌桌解散状态 0->正常 1->申请解散状态 + this.AgreeList=[];//同意解散座位列表 + Desk.deskfree=null; + Desk.starCount = 0;//投降扣除星星数量 + Desk.roomMode = 0;//0->普通场 1->星星场 + Desk.needprepare = 0;//是否需要准备 + Desk.infinite = 0;//无限局 + Desk.shortcode = null; + Desk.videoConfig = null;//视频房选项 + Desk.videoDes = "";//视频房描述 + Desk.ownerNotice = null;//短号房主留言 + Desk.rebateNumber = 0;//房间抽成数量 + Desk.rebateMode = 0;//抽成类型 + Desk.rebateType = 0;//抽金币还是魅力值 + //Desk.myInfo.Init();//自己的信息 +} +Desk.setRoom=function(roomcode,asetcount,roomtype){//设置房间号 + this.roomcode = roomcode; + this.count = asetcount; + this.roomtype = roomtype; + //Game_Modify.setRoomDes(roomcode,asetcount,roomtype); + //set_self(291,7,Game_Modify.roomDes,0,0); + + +} +Desk.GetPlayerBySeat=function(seat){ + return this.PlayerList[seat]; +} +Desk.change_seat = function(_msg){ + var pobj1 = Desk.GetPlayerBySeat(_msg.data.seat1); + var pobj2 = Desk.GetPlayerBySeat(_msg.data.seat2); + var info1 = pobj1.getDeskInfo(); + var info2 = pobj2.getDeskInfo(); + pobj1.SetDeskInfo(info2,true); + pobj2.SetDeskInfo(info1,true); + if(C_Player.seat == _msg.data.seat1){ + C_Player.SetSeat(_msg.data.seat2); + }else if(C_Player.seat == _msg.data.seat2){ + C_Player.SetSeat(_msg.data.seat1); + } + if(Game_Modify.changeSeat){ + Game_Modify.changeSeat(_msg.data.seat1,_msg.data.seat2); + } + if(Game_Config.sysConfig){ + if(!Game_Config.sysConfig.changeSeat){ + GameUI.updatePlayerInfoUI(); + } + }else{ + GameUI.updatePlayerInfoUI(); + } + +} +Desk.getPlayerIndexByPlayerid=function(_playerid){ + _playerid = Number(_playerid); + if(_playerid<0){return -1;} + for(var i=0;i-1){ + GameUI.openTips2(_msg.data.error); + }else{ + GameUI.OpenTips(_msg.data.error,ConstVal.Tips.time); + } + + } + if(_msg.data.state==99){ + Logic.removeRoomFromList(Number(_msg.data.roomcode)); + GameUI.updateNoticeBoard(); + } + break; + } + if(GameData.h5Version == 1){ + GameUI.closeCheck(); + GameData.isJoinRoomFromH5 = true; + } +} +Desk.self_break_room=function(_msg){//接收未开局之前房主自己解散房间 + GameData.shakeID = Game_Config.shakeList.nil; + Func.stopshake(); + Func.exitRoom(); + this.Init(); + if(_msg.data.roomcode){ + Logic.removeRoomFromList(Number(_msg.data.roomcode)); + //GameUI.updateNoticeBoard(); + } + C_Player.BreakRoom(); + GameUI.JumpMenuScene(); + Game_Modify.stopAllSounds(); + +} +Desk.other_break_room=function(_msg){//接收未开局之前他人房主解散房间 + Func.exitRoom(); + this.Init(); + C_Player.BreakRoom(); + Game_Modify.stopAllSounds(); + GameUI.JumpMenuScene(); + GameUI.OpenTips("房主已解散房间!",ConstVal.Tips.time); +} +Desk.other_join_room=function(_msg){//接收其他玩家加入房间 + var pobj=this.GetPlayerBySeat(_msg.data.seat); + pobj.SetDeskInfo(_msg.data); + if(typeof _msg.data.needprepare != "undefined"){ + this.needprepare = _msg.data.needprepare; + } + GameUI.PlayerJoinRoom(_msg.data.seat); + Game_Modify.playerJoinRoom(_msg.data.seat); + this.playercnt++; + GameUI.showStartButton(); + if(C_Player.status == 1 && this.playercnt == 2 && this.roomMode == 1 && this.infinite == 0 && this.stage == 0){ + //GameUI.showEscape();//set_self(513,37,1,0,0); + }else{ + //GameUI.hideEscape();//set_self(513,37,0,0,0); + if(GameData.checkType==3){ + GameUI.closeCheck(); + } + } + if(_msg.data.deskwar){ + this.makewar(_msg); + }else{ + + } +} +Desk.self_exit_room=function(_msg){//接收未开局之前自己退出房间 + var tmp = this.infinite; + if(this.stage==1){ + Game_Modify.breakRoom(); + } + Func.exitRoom(); + if(typeof(_msg.data.isowner)!="undefined"){ + if(_msg.data.isowner == 1 && this.infinite == 0){ + Logic.addRoomToList(Number(_msg.data.roomcode)); + //GameUI.updateNoticeBoard(); + } + } + if(Game_Modify.myExitRoom){ + Game_Modify.myExitRoom(_msg.data.seat); + } + this.Init(); + + C_Player.BreakRoom(); + GameUI.JumpMenuScene(); + Game_Modify.stopAllSounds(); + if(tmp && GameData.hallConfig.worldRoomList && !Game_Config.sysConfig.vipInfinite){ + if(GameData.worldRoomSys.length > 0){ + GameUI.openWorldRoom(); + }else{ + var data={}; + data.agentid = GameData.AgentId; + data.playerid = C_Player.playerid; + data.gameid = GameData.GameId; + Net.Send_get_share_room(data); + } + } +} +Desk.other_exit_room=function(_msg){//接收未开局之前其他玩家退出房间 + var pobj=this.GetPlayerBySeat(_msg.data.seat); + pobj.Init(false); + this.playercnt--; + GameUI.showStartButton(); + if(C_Player.status == 1 && this.playercnt == 2 && this.roomMode == 1 && this.infinite == 0 && this.stage == 0){ + //GameUI.showEscape();//set_self(513,37,1,0,0); + }else{ + //GameUI.hideEscape();//set_self(513,37,0,0,0); + if(GameData.checkType==3){ + GameUI.closeCheck(); + } + } + if(_msg.data.seat == 0 && this.infinite == 0){ + GameUI.OpenTips("房主已经离开,新进入房间的玩家成为新房主,您也可重进房间成为房主"); + } + Game_Modify.playerLeaveRoom(_msg.data.seat); + GameUI.PlayerLeaveRoom(_msg.data.seat); +} +Desk.self_apply_free_room=function(_msg){//接收开局之后自己申请解散房间 + C_Player.ApplyBreakRoom(); + this.state=1; + this.GetPlayerBySeat(C_Player.seat).ApplyBreakRoom(); + this.agreefree=_msg.data.agreefree.state; + for(var i=0;i -1) { + var r_data = _array.splice(index, 1); + return r_data; + } else { + return null; + } +} +Utl.ClearStorage = function () { + storage.clear(); +} +//对象克隆 +Utl.clone = function (myObj) { + if (typeof (myObj) != 'object') return myObj; + if (myObj == null) return myObj; + + var myNewObj = new Object(); + + for (var i in myObj) + myNewObj[i] = Utl.clone(myObj[i]); + + return myNewObj; +} +Utl.getMyInfo = function () {//获取玩家自身信息 + var obj_return = Utl.clone(C_Player); + return obj_return; +} + +Utl.setGrade = function (seat, grade) {//设置游戏主界面玩家积分信息 + var ind = Logic.ChangeToStatus(C_Player.seat, seat); + set_self(436 + ind, 7, grade, 0, 0); + if (ind == 0) { + if (Game_Config.Info.myPositionDefault) { + set_self(436 + ind, 18, get_self(376 + ind, 18, 0, 0, 0) + get_self(376 + ind, 20, 0, 0, 0) / 2 - String(grade).gblen() * Game_Config.Info.textwidth_2 / 2, 0, 0); + } else { + set_self(436 + ind, 18, Game_Config.Info.myPosition - String(grade).gblen() * Game_Config.Info.textwidth_2 / 2, 0, 0); + } + } else { + if (Game_Config.Info.otherPositionDefault) { + set_self(436 + ind, 18, get_self(376 + ind, 18, 0, 0, 0) + get_self(376 + ind, 20, 0, 0, 0) / 2 - String(grade).gblen() * Game_Config.Info.textwidth_2 / 2, 0, 0); + } else { + set_self(436 + ind, 18, Game_Config.Info.position[ind - 1] - String(grade).gblen() * Game_Config.Info.textwidth_2 / 2, 0, 0); + } + } +} + +//播放背景音乐 +Utl.playMusic = function () { + if (Utl.ReadData(Utl.Config.bgm) == 1) { + if (get_self(149, 37, 0, 0, 0) == 1) {//游戏界面中 + Func.play_wav(Game_Config.soundList.MenuSceneMusic, -1); + //Func.play_wav(Game_Config.soundList.MainSceneMusic,-1); + Func.play_wav(Game_Config.soundList.MainSceneMusic, 1); + } else if (get_self(4, 37, 0, 0, 0)) { + Func.play_wav(Game_Config.soundList.MainSceneMusic, -1); + //Func.play_wav(Game_Config.soundList.MenuSceneMusic,-1); + Func.play_wav(Game_Config.soundList.MenuSceneMusic, 1); + } + } +} +//播放音效 +Utl.playSound = function (src) { + if (Utl.ReadData(Utl.Config.sound) == 1) { + Func.play_wav(src, 0); + } +} +//停止播放背景音乐 +Utl.stopMusic = function () { + Func.play_wav(Game_Config.soundList.MainSceneMusic, -1); + Func.play_wav(Game_Config.soundList.MenuSceneMusic, -1); + +} +//停止播放音效 +Utl.stopSound = function (src) { + Func.play_wav(src, -1); +} +//获取游戏ID +Utl.getGameID = function () { + return GameData.GameId; +} +//获取代理商ID +Utl.getAgentID = function () { + return GameData.AgentId; +} +//获取房间内某个座位玩家的playerid +Utl.getPlayeridBySeat = function (seat) { + var pobj = Desk.GetPlayerBySeat(seat); + return pobj.playerid; +} +//获取房间内某个座位的玩家昵称 +Utl.getNicknameBySeat = function (seat) { + var pobj = Desk.GetPlayerBySeat(seat); + return pobj.nickname; +} +//获取房间内某个座位的玩家性别 2为女性,其他都认为是男性 +Utl.getSexBySeat = function (seat) { + var pobj = Desk.GetPlayerBySeat(seat); + return pobj.sex; +} +//获取玩家playerid +Utl.getMyPlayerid = function () { + return C_Player.playerid; +} +//获取玩家playerid +Utl.getMySex = function () { + return C_Player.sex; +} +//获得房间号 +Utl.getRoomcode = function () { + //if(Desk.shortcode){ + //return Desk.shortcode; + //} + return Desk.roomcode; +} +//获取玩家座位号 +Utl.getMySeat = function () { + return C_Player.seat; +} +//玩家退出房间 +Utl.Exit = function () { + var tmp = Desk.infinite; + //Func.exitRoom(); + Desk.Init(); + C_Player.BreakRoom(); + GameUI.JumpMenuScene(true); + //if(GameData.matchInfo){ + //GameData.matchInfo = null; + //Utl.openMatchUrl(); + //} + if (tmp && GameData.hallConfig.worldRoomList) { + var data = {}; + data.agentid = GameData.AgentId; + data.playerid = C_Player.playerid; + data.gameid = GameData.GameId; + Net.Send_get_share_room(data); + } +} +//设置LocalData +Utl.setCookie = function (name, value, exp_hour) { + if (!exp_hour) { + exp_hour = 48; //默认时效48小时 + } + var exp = new Date(); + Utl.SaveData(Utl.Config.validtime, exp.getTime() + exp_hour * 60 * 60 * 1000); + Utl.SaveData(name, value); +} + +//读取LocalData +Utl.getCookie = function (name) { + if (GameData.versionState == 0) { + var vt = Utl.ReadData(Utl.Config.validtime); + if (vt == null) { + return null; + } + var exp = new Date().getTime(); + if (exp < vt) {// + return Utl.ReadData(name); + } else { + return null; + } + } else { + return Utl.ReadData(name); + } +} + +//删除LocalData +Utl.delCookie = function (name) { + Utl.RemoveItemByKey(Utl.Config.validtime); + Utl.RemoveItemByKey(name); +} +Utl.getAppService = function () {//ture为前台状态 false、为后台状态 + return GameData.appservice; +} + +//关闭所有窗口 +Utl.closeWindow = function () { + GameUI.CloseSetting(); + set_group(29, 37, 0, 0, 0); + set_self(223, 37, 0, 0, 0); + GameUI.CloseInfo(); + GameUI.CloseChat(); + set_self(38, 37, 0, 0, 0); + set_self(39, 37, 0, 0, 0); + GameUI.CloseHelp(); +} +Utl.changeToStatus = function (seat) {//将座位转化为方位(以自己为原点0,逆时针旋转依次往上加) + return Logic.ChangeToStatus(C_Player.seat, seat); +} + +Utl.isMainScene = function () {//获取是否在游戏主界面 + var rt = get_self(149, 37, 0, 0, 0); + if (rt == 1) { + return true; + } + return false; +} + +Utl.getMyOpenid = function () {//获取玩家openid + return C_Player.openid; +} +Utl.getOnState = function (status) {//获取玩家状态 + return GameUI.onstate[status];//1-->离线 2-->通话 其他正常 +} +Utl.saveRoomtype = function (_data) {//保存创建房间时的房间类型 + var rt = {}; + rt.data = _data; + rt = JSON.stringify(rt); + Utl.SaveData(Utl.Config.roomtype, rt); +} +Utl.getRoomtype = function () {//获取上次创建的房间类型 + var roomty = Utl.ReadData(Utl.Config.roomtype); + if (roomty) { + roomty = JSON.parse(roomty); + //if(Game_Config.Max.SumOfRoomtype!=roomty.data.length){ + //Utl.SaveData(Utl.Config.roomtype,""); + //return null; + //}else{ + return roomty.data; + //} + + } + return null; +} +Utl.delRoomtype = function () {//删除房间类型 + Utl.RemoveItemByKey(Utl.Config.roomtype); +} +//获得计算器计算结果(传入需要计算的数组) +Utl.getMultipleResult = function (inputArr) { + var mult = 1; + GameData.OrgArr = [].concat(inputArr); + if (Utl.checkKey(Utl.Config.multiple)) { + var rd = Utl.ReadData(Utl.Config.multiple); + if (GameUI.checkNumber(rd)) { + var rt = Number(rd); + if (rt > 0) { + mult = rt; + } else { + Utl.SaveData(Utl.Config.multiple, "1"); + } + } else { + Utl.SaveData(Utl.Config.multiple, "1"); + } + } else { + Utl.SaveData(Utl.Config.multiple, "1"); + } + var rtarr = []; + rtarr.length = inputArr.length; + for (var i = 0; i < inputArr.length; i++) { + rtarr[i] = Func.accMul(inputArr[i], mult); + } + return rtarr; +} +//打开提示 +Utl.openTips = function (_msg, time, mode) { + GameUI.OpenTips(_msg, time, mode); +} +//关闭提示 +Utl.closeTips = function () { + GameUI.CloseTips(); +} +//发送消息 +Utl.sendData = function (_app, _route, _rpc, _data) { + Net._SendData(_app, _route, _rpc, _data); +} +//获取某个座位玩家的头像资源id +Utl.getHeadimgSrc = function (seat) { + if (Desk.GetPlayerBySeat(seat).avatar) { + var idx = Utl.changeToStatus(seat); + return 116 + idx; + } else { + return 170; + } +} +//开启加载界面 +Utl.startLoad = function () { + GameUI.StartLoad(); +} +//关闭加载界面 +Utl.endLoad = function () { + GameUI.EndLoad(); +} +Utl.changePlayerState = function (state) {//设置玩家是否可以直接退出房间 0->不可以1->可以 + if (Desk.infinite == 1) { C_Player.ChangeExit(1); return; } + C_Player.ChangeExit(state); +} +Utl.getGameConfig = function () {//获取游戏配置 + return GameData.gameConfig; +} +/* +{"address":"江西省南昌市青云谱区施尧路靠近上海浦东发展银行(长天支行)","city":"南昌市", +"cityCode":"0791","country":"中国","district":"青云谱区","latitude":28.623546,"longitude":115.900333, +"province":"江西省","street":"施尧路"}*/ +Utl.getLocation = function () {//获取玩家定位信息 + if (C_Player.addr) { + return Utl.clone(C_Player.addr); + } else { + return null; + } +} +Utl.getMathInfo = function () { + return Utl.clone(GameData.matchInfo); +} +Utl.getIsMathInfo = function () { + if (Utl.clone(GameData.matchInfo)) { + return true; + } + return false; +} +Utl.getInfMode = function () { + return GameData.infMode; +} +Utl.changeBean = function (_bean, seat) { + var ind = Logic.ChangeToStatus(C_Player.seat, seat); + var pobj = Desk.GetPlayerBySeat(seat); + pobj.bean = pobj.initialBean + _bean; + var beanInfo = pobj.bean; + pobj = null; + if (get_self(216, 37, 0, 0, 0) == 1 && GameData.infoSeat == seat) { + set_self(511, 7, GameData.starName + ":" + beanInfo, 0, 0); + } + //switch(ind){ + //case 0: + //C_Player.changeBean(_bean); + //break; + //default: + //if(get_self(216,37,0,0,0) == 1 && GameData.infoSeat == seat){ + //set_self(511,7,GameData.starName+":"+beanInfo,0,0); + //} + //break; + //} + +} +//关闭邀请显示 +Utl.closeInvitation = function () { + set_self(183, 37, 0, 0, 0); + set_self(195, 37, 0, 0, 0); +} +//关闭互动显示 +Utl.closeCommunication = function (type) { + set_self(152, 37, 0, 0, 0); + if (!type) { + set_self(153, 37, 0, 0, 0); + } +} +//跳转比赛网页 +Utl.openMatchUrl = function () { + if (ConstVal.isGameHall) { return; } + if (GameData.backUrl) { + Func.OpenurlTitleData(GameData.backUrl, "", ""); + GameData.backUrl = ""; + } +} +//牌局回放进入主界面 +Utl.openVideo = function (_playerList, _seat, _roomcode, roomtype) { + /* + _playerList 格式: [[昵称,头像],[]...] + */ + if (roomtype) { Desk.roomtype = roomtype; } + Logic.updateMainSceneData(roomtype); + for (var i = 0; i < _playerList.length; i++) { + if (_playerList[i]) { + var pobj = Desk.GetPlayerBySeat(i); + //pobj.SetDeskInfo(_playerList[i]); + pobj.nickname = _playerList[i][0]; + pobj.avatar = _playerList[i][1]; + pobj = null; + } + } + C_Player.seat = _seat; + Desk.roomcode = _roomcode; + //GameUI.HideNotice(); + //GameData.Battery=Func.getbattery(); + GameData.Battery = 1; + if (GameData.Battery <= 0.2) { + set_self(338, 43, 3, 0, 0); + } else { + set_self(338, 43, 2, 0, 0); + } + //GameData.NetWork=Func.getnetwork(); + GameData.NetWork = 1; + if (GameData.NetWork == 2) { + set_self(336, 43, 3, 0, 0); + Func.getwifisignalLevel(); + } else { + set_self(336, 43, 4, 0, 0); + } + if (GameData.OS == ConstVal.OS.apple) {//苹果 + set_self(154, 1, 174, 0, 0); + set_self(155, 1, 174, 0, 0); + set_self(156, 1, 173, 0, 0); + } else {//安卓 + set_self(154, 1, 69, 0, 0); + set_self(155, 1, 69, 0, 0); + set_self(156, 1, 70, 0, 0); + } + + + + set_group(21, 37, 1, 0, 0); + set_self(3115, 37, 0, 0, 0); + set_self(3116, 37, 0, 0, 0); + GameUI.updateSysNoticeCount2(); + set_self(150, 37, 0, 0, 0); + set_self(151, 37, 0, 0, 0); + set_self(152, 37, 0, 0, 0); + set_self(153, 37, 0, 0, 0); + set_self(107, 37, 0, 0, 0); + for (var i = 0; i < Desk.PlayerList.length; i++) { + if (Desk.PlayerList[i].nickname != "") { + var ind = Logic.ChangeToStatus(C_Player.seat, i); + var text = Func.subString(Desk.PlayerList[i].nickname, Game_Config.Info.Mainnickname, true); + set_self(406 + ind, 7, text, 0, 0); + if (ind == 0) { + if (Game_Config.Info.myPositionDefault) { + set_self(406 + ind, 18, get_self(376 + ind, 18, 0, 0, 0) + get_self(376 + ind, 20, 0, 0, 0) / 2 - text.gblen() * Game_Config.Info.textwidth_1 / 2, 0, 0); + } else { + set_self(406 + ind, 18, Game_Config.Info.myPosition - text.gblen() * Game_Config.Info.textwidth_1 / 2, 0, 0); + } + } else { + if (Game_Config.Info.otherPositionDefault) { + set_self(406 + ind, 18, get_self(376 + ind, 18, 0, 0, 0) + get_self(376 + ind, 20, 0, 0, 0) / 2 - text.gblen() * Game_Config.Info.textwidth_1 / 2, 0, 0); + } else { + set_self(406 + ind, 18, Game_Config.Info.position[ind - 1] - text.gblen() * Game_Config.Info.textwidth_1 / 2, 0, 0); + } + } + + set_self(436 + ind, 7, 0, 0, 0); + if (ind == 0) { + if (Game_Config.Info.myPositionDefault) { + set_self(436 + ind, 18, get_self(376 + ind, 18, 0, 0, 0) + get_self(376 + ind, 20, 0, 0, 0) / 2 - Game_Config.Info.textwidth_2 / 2, 0, 0); + } else { + set_self(436 + ind, 18, Game_Config.Info.myPosition - Game_Config.Info.textwidth_2 / 2, 0, 0); + } + } else { + if (Game_Config.Info.otherPositionDefault) { + set_self(436 + ind, 18, get_self(376 + ind, 18, 0, 0, 0) + get_self(376 + ind, 20, 0, 0, 0) / 2 - Game_Config.Info.textwidth_2 / 2, 0, 0); + } else { + set_self(436 + ind, 18, Game_Config.Info.position[ind - 1] - Game_Config.Info.textwidth_2 / 2, 0, 0); + } + } + Func.up_imgurl(116 + ind, Desk.PlayerList[i].avatar); + set_group(43 + ind, 37, 1, 0, 0); + } + } + play_ani123(1, 156, 35, 255, 100, 1000, 0, 0, 1); + Utl.playMusic(); + set_self(3141, 37, 0, 0, 0); + set_self(3142, 37, 0, 0, 0); + if (Desk.roomcode) { + set_self(3141, 7, Desk.roomcode, 0, 0); + } + GameUI.playTopInfoAnimation(); + Game_Modify.onEnterVideo(); + //GameData.Scene = 2; + //Game_Modify.onEnterMainScene(Desk.roomtype); +} +Utl.closeVideo = function () { + Utl.playMusic(); + Desk.Init(); + C_Player.BreakRoom(); + set_group(21, 37, 0, 0, 0); + for (var i = 0; i < Game_Config.Max.PlayerCnt; i++) { + set_group(43 + i, 37, 0, 0, 0); + } + +} + +Utl.getPlayerCnt = function () { + return Desk.playercnt; +} +//存储战绩 +Utl.saveGradeInfo = function (_data) { + var rData = Utl.readGradeInfo(); + if (rData) { + rData = JSON.parse(rData); + rData.unshift(_data); + var overLen = rData.length - 10; + for (var i = 0; i < overLen; i++) { + rData.pop(); + } + } + Utl.SaveData(Utl.Config.gradeinfo, JSON.stringify(rData)); +} +//读取战绩 +Utl.readGradeInfo = function () { + return Utl.ReadData(Utl.Config.gradeinfo); +} +Utl.getPlayerReadyState = function (seat) { + var pobj = Desk.GetPlayerBySeat(seat); + return pobj.isprepare; +} +//获取玩家是否拥有高级选项 +Utl.getPlayerAdvanced = function () { + return C_Player.advanced; +} +//打开高级选项调用 +Utl.openSnrOption = function (mode, roomtype, descrip, _profit) {//mode0星星场1非星星场 + GameData.snrOptionMode = mode; + GameData.snrOptionRoomtype = roomtype; + GameData.snrOptionDes = descrip; + GameData.snrOptionProfit = _profit; + var data = {} + data.agentid = GameData.AgentId; + data.gameid = GameData.GameId; + data.playerid = C_Player.playerid; + Net.Send_advanced_roomlist(data); +} +//获取玩家是否拥有高级选项 0无高级选项>0有高级选项 +Utl.getAdvanced = function () { + return C_Player.advanced; +} +//获取游戏是否为审核版本(0非审核1审核) +Utl.getVersionState = function () { + return GameData.versionState; +} +//获取游戏是否为h5版本(0->非h51->h5) +Utl.getH5Version = function () { + return GameData.h5Version; +} +//游戏结算时调用 +Utl.onGameFinished = function (inputArray, spidList) {//结算信息[[昵称,输赢分数],.......] + if (!spidList) { + spidList = []; + } + if (GameData.h5Version == 1) { + var title = ""; + var desc = ""; + if (inputArray.length > 3) { + for (var i = 0; i < 5; i++) { + if (inputArray.length > i) { + if (i < 2) { + title += inputArray[i][1] + ":" + Func.subString(inputArray[i][0], 24 - String(inputArray[i][1]).length - 3, true) + "\n"; + } else { + desc += inputArray[i][1] + ":" + Func.subString(inputArray[i][0], 24 - String(inputArray[i][1]).length - 3, true) + "\n"; + } + + } + } + } else { + title = Game_Config.Share.title; + for (var i = 0; i < 3; i++) { + if (inputArray.length > i) { + desc += inputArray[i][1] + ":" + Func.subString(inputArray[i][0], 24 - String(inputArray[i][1]).length - 3, true) + "\n"; + } + } + } + GameData.shareAppMessage = Logic.getShareDataObj(title, desc); + GameData.shareTimeline = Logic.getShareDataObj1(Game_Config.Share.title + Game_Config.Share.description, ""); + shareLink(GameData.shareTimeline, GameData.shareAppMessage); + for (var i = 0; i < Desk.PlayerList.length; i++) { + if (Desk.PlayerList[i].playerid != -1) { + var ind = Logic.ChangeToStatus(C_Player.seat, i); + //up_imgurl(116+ind,"assets/bmp/00170.png",1); + set_self(116 + ind, 1, 170, 0, 0); + } + } + for (var i = 0; i < spidList.length; i++) { + set_self(spidList[i], 37, 0, 0, 0); + } + } +} +Utl.getBeanBySeat = function (seat) { + var pobj = Desk.GetPlayerBySeat(seat); + if (pobj) { + return pobj.bean; + } + return -1; +} +Utl.getIsDebugger = function () { + return GameData.isDebugger; +} +//打开数字输入面板 +Utl.openInputPanel = function (_msg, _callback, begin0) { + GameUI.openInputPanel(_msg, _callback, begin0); +} +//关闭数字输入面板 +Utl.closeInputPanel = function () { + GameUI.closeInputPanel(); +} +//获取房卡名称 +Utl.getRoomCardName = function () { + return GameData.roomCardName; +} +//获取星星名称名称 +Utl.getstarName = function () { + return GameData.starName; +} +//获取房卡图片帧数 +Utl.getNameImgFrame_1 = function () { + return Number(GameData.nameImgFrame_1); +} +//获取星星图片帧数 +Utl.getNameImgFrame_2 = function () { + return Number(GameData.nameImgFrame_2); +} +//子游戏活动的调用类型(在收到大局结算包调用、重画时不允许调用) +Utl.typeForActivity = function (type, data) { + //logmessage("typeForActivity"+type,1); + GameData.activityType = type; + GameData.activityData = data; + GameData.shareTimes = 0; + //switch(type){ + //case 1://大赢家 + //GameData.activityType = type; + //GameData.activityData = data; + //break; + //} +} +//设置玩家准备状态 +Utl.setPlayerPrepare = function (seat, state) { + var pobj = Desk.GetPlayerBySeat(seat); + pobj.isprepare = state; + if (seat == C_Player.seat) { + C_Player.isprepare = state; + } + GameUI.SetIsprepare(seat, state); + GameUI.showReady(); + + //switch(state){ + //case 0: + + //break; + //case 1: + + //break; + //} +} +//获取是否为无限局0非无限局1无限局 +Utl.getIsInfinite = function () { + return Desk.infinite; +} +//复制到粘贴板 +Utl.gameCopytext = function (text) { + Func.gameCopytext(text); +} +Utl.openTips2 = function (_msg, time) { + GameUI.openTips2(_msg, time); +} +//关闭主界面按钮 +Utl.closeMainSceneButton = function () { + GameUI.HideStartScene(); + //GameUI.hideEscape(); + GameUI.hideReady(); + //GameUI.hideChangeRoom(); +} +//更改牌桌开战和玩家是否参与游戏(无限局) +Utl.setDeskStage = function (state) { + if (Desk.infinite == 0) { return; } + Desk.SetStage(state); + switch (state) { + case 0://未开战 + GameUI.showReady(); + //GameUI.showChangeRoom(); + //GameUI.showExitBtn(); + break; + case 1://已开战 + if (C_Player.isprepare == 1) { + GameUI.hideReady(); + GameUI.HideStartScene(); + //GameUI.hideChangeRoom(); + GameUI.hideExitBtn(); + //GameUI.showExitBtn2(); + } else { + GameUI.hideReady(); + //GameUI.showExitBtn(); + //GameUI.showChangeRoom(); + } + break; + } +} +//获取吱口令 +Utl.getPayCodeBySeat = function (seat) { + var pobj = Desk.GetPlayerBySeat(seat); + return pobj.paycode; +} +//设置文字精灵颜色 +Utl.setFontColor = function (spid, value) {//精灵id,字体颜色 + ifast_getobj(spid).uidata.FontColor = value; +} +//获取当前房间短号 非短号房返回null; +Utl.getShortCode = function () { + Desk.getShortCode(); +} +//游戏大局结算时调用 +Utl.gameOver = function () { + GameUI.CloseApplyResult(); + Func.exitRoom(); +} +//不联网情况下进入主界面 +Utl.mainScene = function () { + GameUI.MainScene(true); + GameUI.mainSceneLoaded(); + if (GameData.heartBeatTimer) { + window.clearTimeout(GameData.heartBeatTimer); + } + if (GameData.getConfigTimer) { + window.clearTimeout(GameData.getConfigTimer); + } +} +Utl.openInfo1 = function (src, nickname, playerid, ip, sex, seat, bean) {//打开个人信息 + Utl.playSound(Game_Config.ClickButton.src_2); + GameData.infoSeat = seat; + InfoSex = sex; + //if(ind!=-1){ + //set_self(282,1,116+ind,0,0); + //}else{ + //set_self(282,1,25,0,0); + //} + set_self(282, 1, src, 0, 0); + + set_self(279, 7, Func.subString(nickname, Game_Config.Max.Infonickname, true), 0, 0); + set_self(280, 7, "ID:" + playerid, 0, 0); + set_self(281, 7, "IP:" + ip, 0, 0); + set_self(511, 7, GameData.starName + ":" + bean, 0, 0); + set_self(216, 21, 220, 0, 0); + set_group(77, 37, 1, 0, 0); + //if(typeof(seat)!="undefined"){ + //var status = Logic.ChangeToStatus(C_Player.seat,seat); + //if(status!=0){ + //GameData.InteractPlayer=seat; + //set_self(216,21,325,0,0); + //set_group(38,37,1,0,0); + //} + //} + set_self(256, 37, 0, 0, 0); + set_self(257, 37, 0, 0, 0); + set_self(258, 37, 0, 0, 0); + set_self(259, 37, 0, 0, 0); + if (!GameData.hallConfig.enablePay) { + set_self(511, 37, 0, 0, 0); + } + +} +Utl.getPhoneInfo = function () { + return min_copyjson(GameData.phoneInfo); +} + +Utl.openInfo = function (seat, headSrc) {//打开个人信息 + var pInfo = Desk.GetPlayerBySeat(seat); + var nickname = pInfo.nickname; + var playerid = pInfo.playerid; + var ip = pInfo.ip; + var sex = pInfo.sex; + var bean = pInfo.bean; + var cVal = pInfo.charm; + Utl.playSound(Game_Config.ClickButton.src_2); + GameData.infoSeat = seat; + InfoSex = sex; + + set_self(282, 1, headSrc, 0, 0); + + + + set_self(279, 7, Func.subString(nickname, Game_Config.Max.Infonickname, true), 0, 0); + set_self(280, 7, "ID:" + playerid, 0, 0); + set_self(281, 7, "IP:" + ip, 0, 0); + set_self(511, 7, GameData.starName + ":" + bean, 0, 0); + + set_self(216, 21, 220, 0, 0); + set_group(77, 37, 1, 0, 0); + GameUI.setShortRoom(GameData.infoSeat, cVal); + //if(typeof(seat)!="undefined"){ + //var status = Logic.ChangeToStatus(C_Player.seat,seat); + //if(status!=0){ + //GameData.InteractPlayer=seat; + //set_self(216,21,325,0,0); + //set_group(38,37,1,0,0); + //} + //} + if (!GameData.hallConfig.enablePay) { + set_self(511, 37, 0, 0, 0); + } + +} +//通过座位号获取玩家信息 +Utl.getPlayerInfoBySeat = function (seat) { + return Desk.GetPlayerBySeat(seat); +} +Utl.enterShareRoom = function (roomInfo) { + var data = {}; + data.agentid = GameData.AgentId; + data.playerid = C_Player.playerid; + data.gameid = GameData.GameId; + data.type = roomInfo.type; + data.roomtype = roomInfo.roomtype; + Net.Send_quick_enter_share_room(data); +} +Utl.getShareRoom = function () { + var data = {}; + data.agentid = GameData.AgentId; + data.playerid = C_Player.playerid; + data.gameid = GameData.GameId; + Net.Send_get_share_room(data); +} +Utl.getPlayerList = function () { + return Desk.PlayerList; +} +Utl.updatePlayerInfoUI = function () { + GameUI.updatePlayerInfoUI(); +} +Utl.convertNumberToImg = function (val, bTemp) {//bTemp正数是否显示正号 + try {//0123456789+-. + + var rValue = String(val); + rValue = min_replaceAll(String(rValue), "\\.", "d", false); + rValue = min_replaceAll(String(rValue), "-", "c", false); + if (bTemp && Number(val) >= 0) { + rValue = "b" + rValue; + } + + return rValue; + } catch (e) { + console.log(e); + return 0; + } + +} + +Utl.openTextInput = function (msg, callFun, len) { + GameUI.openTextInput(msg, callFun, len); +} +Utl.sendText = function (text) { + try { + var data = {}; + data.agentid = GameData.AgentId; + data.gameid = GameData.GameId; + data.playerid = C_Player.playerid; + data.roomcode = Desk.roomcode; + data.type = 0; + data.text = text; + Net.Send_send_text(data); + } catch (e) { + + } +} +//是否可以显示退出按钮 +Utl.getExitVisible = function () { + if (Desk.infinite == 1) { + return true; + } + return false; +} +//是否可以显示换房按钮 +Utl.getChangeVisible = function () { + if (Desk.infinite == 1 && !Desk.shortcode) { + return true; + } + return false; +} +//发送退出房间 +Utl.sendExitRoom = function () { + var data = {}; + data.agentid = GameData.AgentId; + data.gameid = GameData.GameId; + data.playerid = C_Player.playerid; + data.roomcode = Desk.roomcode; + Net.Send_self_exit_room(data); +} +//发送换房 +Utl.sendChangeRoom = function () { + var data = {}; + data.agentid = GameData.AgentId; + data.playerid = C_Player.playerid; + data.gameid = GameData.GameId; + data.roomcode = Desk.roomcode; + Net.Send_change_room(data); +} +//获取房间费范围 +Utl.getRebateRange = function (mult, mode) { + if (!GameData.sysConfig.rebateConfig) { + return [0, 9999999]; + } + if (Game_Config.sysConfig.vipInfinite) { + return [0, 9999999]; + } + if (mode) { return [0, 9999999]; } + return [parseInt(mult * GameData.sysConfig.rebateConfig.value / 100), 9999999]; +} +//是否隐藏分享按钮 0->不隐藏 1-隐藏 +Utl.getShowShare = function () { + return GameData.sysConfig.hideWxShare; +} + + + + + diff --git a/client/js/00_Surface/09_Net.js b/client/js/00_Surface/09_Net.js new file mode 100644 index 0000000..1918757 --- /dev/null +++ b/client/js/00_Surface/09_Net.js @@ -0,0 +1,897 @@ +var Net = Net||{}; +Net.tcp = {}; +Net.tcp.isConnected = false;//已有连接连上 +Net.tcp.tcpIDAva = 1;//用过的ID的最大值 +Net.tcp.tcpIDList = [];//TCP ID列表 +Net.tcp.connectCount = 3;//同时最多连接个数 +Net.tcp.connectList = [];//tcp连接对象池 +Net.tcp.connect = function(_id,ws){ + +} +Net.ws_tcp; +Net._SendData = function(_app,_route,_rpc,_data){ + + var _msg = {}; + _msg.app = _app, + _msg.route = _route; + _msg.rpc = _rpc; + _msg.data = _data; + if(ConstVal.netType == 0){ + Net.ws_tcp.send(JSON.stringify(_msg)); + }else{ + var putMsg=''; + if(_msg.rpc == RpcList.player_login){putMsg="playerLogin"} + Func.AjaxHttp2(GameData.Server,_msg, + function(_msg,state,input_msg){ + console.log(_msg,state,input_msg); + if (typeof(_msg) == 'string') + { + _msg = JSON.parse(_msg); + } + if(_msg.route==RouteList.platform||_msg.route==RouteList.agent||_msg.route==RouteList.room){ + if(min_ExitsFunction(Net[_msg.rpc])){ + Net[_msg.rpc](_msg); + } + }else{ + Game_Modify._ReceiveData(_msg); + } + },function(_msg,state,input_msg){ + if(input_msg == "playerLogin"){ + GameUI.OpenTips("网络状况不好"); + + } + + },putMsg); + } + + if(Game_Config.Debugger.isDebugger){ + var dt = new Date(); + console.log(`[${dt.toLocaleTimeString()}.${String(dt.getMilliseconds()).padStart(3,'0')}] 发送:`); + console.log(_msg); + } + +} + +Net.submit_error = function(_packet,_msg){ + //提交错误 + if(GameData.errorMsg != _msg){ + GameData.errorMsg = _msg; + }else { + return; + } + var msg = { + app:"youle", + route:"agent", + rpc:"submit_error", + data:{ + packet:_packet, + msg:_msg, + playerid:C_Player.playerid, + agentid:GameData.AgentId, + gameid:GameData.GameId, + } + } + try{ + Net.ws_tcp.send(JSON.stringify(msg)); + }catch(e){ + + } + +} +Net.submit_log = function(_packet,_msg){ + var msg = { + app:"youle", + route:"agent", + rpc:"submit_error", + data:{ + packet:_packet, + msg:_msg, + playerid:C_Player.playerid, + agentid:GameData.AgentId, + gameid:GameData.GameId + } + } + console.log(_packet); + console.log(_msg); + try{ + Net.ws_tcp.send(JSON.stringify(msg)); + }catch(e){ + + } +} + +//发送创建房间 +Net.Send_create_room = function(_data){ + GameUI.StartLoad(); + _data.ip = C_Player.ip; + _data.location = C_Player.addr; + this._SendData(AppList.app,RouteList.agent,RpcList.create_room,_data); +} +//接收创建房间 +Net.create_room = function(_msg){ + //Logic.CreateRoom(_msg.data); + Desk.create_room(_msg); + GameUI.EndLoad(); + Game_Modify.createRoom(_msg.data.roomtype,_msg.data.infinite); + if(Game_Modify.onCreateRoom){ + Game_Modify.onCreateRoom(_msg.data); + } + +} +//发送登录请求 +Net.Send_login = function(_data){ + //console.log(returnCitySN); + if(typeof returnCitySN != "undefined"){ + _data.ip = returnCitySN.ip; + _data.province = returnCitySN.province; + _data.city = returnCitySN.city; + C_Player.province = returnCitySN.province; + C_Player.city = returnCitySN.city; + } + + _data.location = C_Player.addr; + + if(ConstVal.isGameHall){ + if(!GameData.hallLogin){ + return ; + } + } + _data.machineid = Logic.getMachineId(); + _data.machineroom = Utl.getRoomcode(); + //alert("进入Net.Send_login方法"); + GameUI.StartLoad(); + if(GameData.loginPlayerid){ + var _playerid = Logic.readPlayerId(); + if(_playerid){ + _data.playerid = _playerid; + } + } + GameData.loginList.push(GameData.TcpID); + //GameData.isChangeServer = false; + //if(ConstVal.netType == 0){ + GameData.isSendLoginState = true; + GameData.sendLoginTimes++; + + if(!ConstVal.isGameHall){ + if(GameData.sendLoginTimer == null){ + GameData.isSendLoginTimer = setTimeout(function(){ + + + GameData.ConnectType = false; + GameData.disType = true; + GameData.NetType=1; + GameUI.StartLoad(); + GameData.isClose = true; + Net.ws_tcp.close(); + GameData.isCloseTimer = setInterval(function(){ + if(GameData.isClose){ + Net.ws_tcp.close(); + } + },5000); + },4000); + } + }else{ + /* + if(GameData.sendLoginTimes >3){ + if(GameData.isSendLoginTimer){ + window.clearTimeout(GameData.isSendLoginTimer); + GameData.isSendLoginTimer = null; + } + GameUI.EndLoad(); + GameUI.OpenKick("网络繁忙,请退出游戏,稍后登录!"); + return; + } + if(GameData.sendLoginTimer == null){ + GameData.isSendLoginTimer = setTimeout(function(){ + var data={}; + data.agentid = GameData.AgentId; + data.openid = C_Player.openid; + data.gameid = GameData.GameId; + data.nickname = C_Player.nickname; + data.avatar = C_Player.avatar; + data.sex = C_Player.sex; + data.province = C_Player.province; + data.unionid=C_Player.unionid; + data.city = C_Player.city; + data.version = GameData.versionCode; + data.channelid = GameData.ChannelId; + data.marketid = GameData.marketID; + },4000); + } + */ + } + //if(GameData.sendLoginTimes>=2){ + //if(GameData.isSendLoginTimer){ + //window.clearTimeout(GameData.isSendLoginTimer); + //GameData.isSendLoginTimer = null; + //} + //if(GameData.isClose){ + //GameData.isClose = false; + //window.clearTimeout(GameData.isCloseTimer); + //} + //if(GameData.sendLoginTimer){ + //window.clearTimeout(GameData.sendLoginTimer); + //GameData.sendLoginTimer = null; + //} + //if(GameData.sendLoginTimer == null){ + //GameData.isSendLoginTimer = setTimeout(function(){ + + + //GameData.ConnectType = false; + //GameData.disType = true; + //GameData.NetType=1; + //GameUI.StartLoad(); + //GameData.isClose = true; + //Net.ws_tcp.close(); + //GameData.isCloseTimer = setInterval(function(){ + //if(GameData.isClose){ + //Net.ws_tcp.close(); + //} + //},5000); + //},4000); + //} + ////GameUI.EndLoad(); + ////GameUI.OpenKick("网络繁忙,请退出游戏,稍后登录!"); + //} + Net._SendData(AppList.app,RouteList.agent,RpcList.player_login,_data); + +} +//接收登录 +Net.player_login = function(_msg){ + if(GameData.isSendLoginTimer){ + window.clearTimeout(GameData.isSendLoginTimer); + GameData.isSendLoginTimer = null; + } + GameUI.EndLoad(); + Desk.login(_msg); + +} + +//发送玩家自己进入房间请求 +Net.Send_self_join_room = function(_data){ + GameUI.StartLoad(); + GameData.shortCode = _data.roomcode; + _data.location = C_Player.addr; + _data.ip = C_Player.ip; + this._SendData(AppList.app,RouteList.agent,RpcList.self_join_room,_data); +} +//接收玩家自己进入房间请求 +Net.self_join_room = function(_msg){ + + Desk.self_join_room(_msg); + GameUI.EndLoad(); +} + +//发送未开局之前房主自己解散房间 +Net.Send_self_break_room = function(_data){ + GameUI.StartLoad(); + this._SendData(AppList.app,RouteList.room,RpcList.self_break_room,_data); +} +//接收未开局之前房主自己解散房间 +Net.self_break_room = function(_msg){ + Desk.self_break_room(_msg); + GameUI.EndLoad(); +} + +//接收未开局之前他人房主解散房间 +Net.other_break_room = function(_msg){ + Desk.other_break_room(_msg); +} +//接收其他玩家加入房间 +Net.other_join_room = function(_msg){ + if(Logic.checkRoom()){ + return; + } + Desk.other_join_room(_msg); + GameUI.EndLoad(); +} +//发送未开局之前自己退出房间 +Net.Send_self_exit_room = function(_data){ + GameUI.StartLoad(); + this._SendData(AppList.app,RouteList.room,RpcList.self_exit_room,_data); +} +//接收未开局之前自己退出房间 +Net.self_exit_room = function(_msg){ + GameUI.closeCheck(); + Desk.self_exit_room(_msg); + GameUI.EndLoad(); +} + +//接收未开局之前其他玩家退出房间 +Net.other_exit_room = function(_msg){ + if(Logic.checkRoom()){ + return; + } + Desk.other_exit_room(_msg); +} +//发送开局之后自己申请解散房间 +Net.Send_self_apply_free_room = function(_data){ + //GameUI.StartLoad(); + this._SendData(AppList.app,RouteList.room,RpcList.self_apply_free_room,_data); +} +//接收开局之后自己申请解散房间 +Net.self_apply_free_room = function(_msg){ + Desk.self_apply_free_room(_msg); + GameUI.EndLoad(); + +} +//接收开局之后其他玩家申请解散房间 +Net.other_apply_free_room = function(_msg){ + Desk.other_apply_free_room(_msg); +} +//发送自己同意解散房间 +Net.Send_self_agree_free_room = function(_data){ + GameUI.StartLoad(); + this._SendData(AppList.app,RouteList.room,RpcList.self_agree_free_room,_data); +} +//接收自己同意解散房间 +Net.self_agree_free_room = function(_msg){ + Desk.self_agree_free_room(_msg); + GameUI.EndLoad(); +} +//接收其他玩家同意解散房间 +Net.other_agree_free_room = function(_msg){ + Desk.other_agree_free_room(_msg); + GameUI.EndLoad(); +} +//发送自己拒绝解散房间 +Net.Send_self_refuse_free_room = function(_data){ + GameUI.StartLoad(); + this._SendData(AppList.app,RouteList.room,RpcList.self_refuse_free_room,_data); +} +//接收自己拒绝解散房间 +Net.self_refuse_free_room = function(_msg){ + Desk.self_refuse_free_room(_msg); + GameUI.EndLoad(); +} +//接收其他玩家拒绝解散房间 +Net.other_refuse_free_room = function(_msg){ + Desk.other_refuse_free_room(_msg); + GameUI.EndLoad(); +} +//接收解散房间 +Net.free_room = function(_msg){ + Desk.free_room(_msg); + GameUI.EndLoad(); +} + +//发送获取战绩 +Net.Send_get_player_grade1 = function(_data){ + GameUI.StartLoad(); + this._SendData(AppList.app,RouteList.agent,RpcList.get_player_grade1,_data); +} +//接收获取战绩 +Net.get_player_grade1 = function(_msg){ + gameCombat.get_player_grade1(_msg); + GameUI.EndLoad(); + + +} +//发送获取战绩2 +Net.Send_get_player_grade2 = function(_data){ + GameUI.StartLoad(); + this._SendData(AppList.app,RouteList.agent,RpcList.get_player_grade2,_data); +} +//接收获取战绩2 +Net.get_player_grade2 = function(_msg){ + gameCombat.get_player_grade2(_msg); + GameUI.EndLoad(); +} + +//接收修改房卡 +Net.update_roomcard = function(_msg){ + if(typeof _msg.data.change == "undefined"){ + C_Player.UpdateRoomcard(_msg); + } +} + +//接收其他玩家离线 +Net.other_offline = function(_msg){ + Desk.other_offline(_msg); +} + +//接收其他玩家上线 +Net.other_online = function(_msg){ + Desk.other_online(_msg); +} + +//发送发送聊天消息 +Net.Send_send_text = function(_data){ + this._SendData(AppList.app,RouteList.room,RpcList.send_text,_data); +} +//接收发送聊天消息 +Net.send_text = function(_msg){ + Desk.send_text(_msg); +} + +//发送获取任务列表 +Net.Send_get_player_task = function(_data){ + GameUI.StartLoad(); + this._SendData(AppList.app,RouteList.agent,RpcList.get_player_task,_data); +} +//接收获取任务列表 +Net.get_player_task = function(_msg){ + Desk.get_player_task(_msg); + //GameUI.SetTaskInfo(_msg); + GameUI.EndLoad(); + +} +//发送完成任务 +Net.Send_player_finish_task = function(_data){ + this._SendData(AppList.app,RouteList.agent,RpcList.player_finish_task,_data); +} +//接收完成任务 +Net.player_finish_task = function(_msg){ + C_Player.player_finish_task(_msg); +} +//发送领取任务奖励 +Net.Send_get_task_award = function(_data){ + GameUI.StartLoad(); + this._SendData(AppList.app,RouteList.agent,RpcList.get_task_award,_data); + +} +//接收领取任务奖励 +Net.get_task_award = function(_msg){ + C_Player.get_task_award(_msg); + GameUI.EndLoad(); +} +//发送有任务可领取 +Net.Send_can_award = function(_data){ + this._SendData(AppList.app,RouteList.agent,RpcList.refresh_task_state,_data); +} +//接收有任务可领取 +Net.can_award = function(_msg){ + C_Player.can_award(_msg); +} +//接收踢下线 +Net.kick_offline = function(_msg){ + Desk.kick_offline(_msg); +} +//发送自己打电话 +Net.Send_call_phone = function(_data){ + this._SendData(AppList.app,RouteList.room,RpcList.call_phone,_data); +} +//接收自己打电话 +Net.call_phone = function(_msg){ + Desk.call_phone(_msg); +} + +//发送自己挂断电话 +Net.Send_hangup_phone = function(_data){ + this._SendData(AppList.app,RouteList.room,RpcList.hangup_phone,_data); +} +//接自己收挂断打电话 +Net.hangup_phone = function(_msg){ + Desk.hangup_phone(_msg); +} + +//发送房主开局 +Net.Send_self_makewar = function(_data){ + //GameUI.StartLoad(); + this._SendData(AppList.app,RouteList.room,RpcList.self_makewar,_data); +} +//接收房主开局 +Net.self_makewar = function(_msg){ + Desk.self_makewar(_msg); + //GameUI.EndLoad(); +} +//接收房主开局 +Net.other_makewar = function(_msg){ + Desk.makewar(_msg); +} +//自己发送互动 +Net.Send_send_gift=function(_data){ + this._SendData(AppList.app,RouteList.room,RpcList.send_gift,_data); +} +Net.send_gift=function(_msg){ + Desk.send_gift(_msg); +} + +//自己发送语音 +Net.Send_send_voice=function(_data){ + this._SendData(AppList.app,RouteList.room,RpcList.send_voice,_data); +} +Net.send_voice=function(_msg){ + Desk.send_voice(_msg); +} + +//发送切换至房间服务器 +Net.Send_connect_roomserver=function(_data){ + this._SendData(AppList.app,RouteList.room,RpcList.connect_roomserver,_data); +} +Net.connect_roomserver=function(_msg){ + + GameData.ConnectType=true; + GameData.disType =false; + GameData.ConnectPack = _msg.data; + GameData.ConnectRpc = RpcList.connect_roomserver; + GameData.Server=_msg.data.roomserver; + //Logic.Connect(); + Net.ws_tcp.close(); +} + +//发送切换至大厅服务器 +Net.Send_connect_agentserver=function(_data){ + this._SendData(AppList.app,RouteList.agent,RpcList.connect_agentserver,_data); +} +Net.connect_agentserver=function(_msg){ + if(_msg.data.opt == RpcList.other_break_room || _msg.data.opt == RpcList.free_room){ + GameUI.StartLoad(); + } + GameData.ConnectType=true; + GameData.disType =false; + GameData.ConnectRpc = RpcList.connect_agentserver; + GameData.ConnectPack = _msg.data; + GameData.Server=_msg.data.agentserver; + //Logic.Connect(); + Net.ws_tcp.close(); +} +Net.Send_broadcast=function(_data){ + this._SendData(AppList.app,RouteList.agent,RpcList.broadcast,_data); +} +//接收即时信息 +Net.broadcast=function(_msg){ + // + Desk.broadcast(_msg); +} +//发送互动 +Net.Send_send_phiz=function(_data){ + this._SendData(AppList.app,RouteList.room,RpcList.send_phiz,_data); +} +//接收互动 +Net.send_phiz=function(_msg){ + Desk.send_phiz(_msg); +} +//提交反馈 +Net.Send_submit_opinion=function(_data){ + this._SendData(AppList.app,RouteList.agent,RpcList.submit_opinion,_data); +} +//接收反馈 +Net.submit_opinion=function(_msg){ + Desk.submit_opinion(_msg); +} +//踢出玩家 +Net.Send_kick_server=function(_data){ + this._SendData(AppList.app,RouteList.agent,RpcList.kick_server,_data); +} +Net.kick_server=function(_msg){ + Desk.kick_server(_msg); +} +//获取支付列表 +Net.Send_get_paylist=function(_data){ + GameUI.StartLoad(); + this._SendData(AppList.app,RouteList.agent,RpcList.get_paylist,_data); +} +//接收支付列表 +Net.get_paylist=function(_msg){ + GameData.payList = _msg.data.paylist; + GameUI.OpenPay(); + GameUI.EndLoad(); +} +//支付成功后通知服务器 +Net.Send_pay_succ=function(_data){ + this._SendData(AppList.app,RouteList.agent,RpcList.pay_succ,_data); +} +//提交位置信息 +Net.Send_submit_location=function(_data){ + if(!ConstVal.isGameHall){ + this._SendData(AppList.app,RouteList.agent,RpcList.submit_location,_data); + } +} +//提交位置信息 +Net.submit_location=function(_msg){ + Game.submit_location(_msg); +} +//发送绑定 +Net.Send_binding_invitecode=function(_data){ + //GameUI.StartLoad(); + this._SendData(AppList.app,RouteList.agent,RpcList.binding_invitecode,_data); +} +//接收绑定 +Net.binding_invitecode=function(_msg){ + //GameUI.EndLoad(); + C_Player.binding_invitecode(_msg); +} + +//接收修改豆豆 +Net.update_bean = function(_msg){ + //C_Player.update_bean(_msg); + Desk.update_bean(_msg); +} + +Net.Send_get_player_invitecode = function(_data){ + GameUI.StartLoad(); + this._SendData(AppList.app,RouteList.agent,RpcList.get_player_invitecode,_data); +} +Net.get_player_invitecode = function(_msg){ + GameUI.EndLoad(); + C_Player.setInvitecod(_msg.data.invitecode); + GameUI.OpenBind(); +} + +Net.Send_beanroom_surrender = function(_data){ + GameUI.StartLoad(); + this._SendData(AppList.app,RouteList.room,RpcList.beanroom_surrender,_data); +} +Net.beanroom_surrender = function(_msg){ + GameUI.EndLoad(); + GameUI.closeCheck(); + if(_msg.data.state==0){ + Game_Modify.onSurrender(_msg); + }else{//失败 + if(_msg.data.showerror==1){ + GameUI.OpenTips(_msg.data.error); + } + } + +} +Net.Send_player_prepare = function(_data){ + this._SendData(AppList.app,RouteList.room,RpcList.player_prepare,_data); +} +Net.player_prepare = function(_msg){ + Desk.player_prepare(_msg); +} +Net.Send_share_room = function(_data){ + this._SendData(AppList.app,RouteList.room,RpcList.share_room,_data); +} +Net.share_room = function(_msg){ + Desk.share_room(_msg); +} +Net.Send_get_share_room = function(_data){ + if(!ConstVal.isGameHall){ + GameUI.StartLoad(); + this._SendData(AppList.app,RouteList.agent,RpcList.get_share_room,_data); + } + +} +Net.get_share_room = function(_msg){ + Desk.get_share_room(_msg); + GameUI.EndLoad(); +} +Net.Send_quick_enter_share_room = function(_data){ + console.log(_data); + this._SendData(AppList.app,RouteList.agent,RpcList.quick_enter_share_room,_data); +} +Net.show_message = function(_msg){ + GameUI.EndLoad(); + Desk.show_message(_msg); +} +Net.Send_advanced_roomlist = function(_data){ + GameUI.StartLoad(); + this._SendData(AppList.app,RouteList.agent,RpcList.advanced_roomlist,_data); + +} +Net.advanced_roomlist = function(_msg){ + GameUI.EndLoad(); + Desk.advanced_roomlist(_msg); +} +Net.Send_advanced_createroom = function(_data){ + GameUI.StartLoad(); + this._SendData(AppList.app,RouteList.agent,RpcList.advanced_createroom,_data); + +} +Net.advanced_createroom = function(_msg){ + GameUI.EndLoad(); + Desk.advanced_createroom(_msg); +} +Net.Send_change_room = function(_data){ + //GameUI.StartLoad(); + this._SendData(AppList.app,RouteList.room,RpcList.change_room,_data); +} +Net.change_seat = function(_msg){ + Desk.change_seat(_msg); +} +//财富榜 +Net.Send_get_treasurelist = function(_data){ + GameUI.StartLoad(); + this._SendData(AppList.app,RouteList.agent,RpcList.get_treasurelist,_data); +} +//财富榜 +Net.get_treasurelist = function(_msg){ + Desk.get_treasurelist(_msg); + GameUI.EndLoad(); + +} +//设置仓库密码 +Net.Send_set_bankpwd = function(_data){ + GameUI.StartLoad(); + this._SendData(AppList.app,RouteList.agent,RpcList.set_bankpwd,_data); +} +Net.set_bankpwd = function(_msg){ + GameUI.EndLoad(); + Desk.set_bankpwd(_msg); +} + +//更改仓库星星 +Net.Send_change_star = function(_data){ + GameUI.StartLoad(); + this._SendData(AppList.app,RouteList.agent,RpcList.change_star,_data); +} +Net.change_star = function(_msg){ + GameUI.EndLoad(); + Desk.change_star(_msg); +} + +//提交手机信息 +Net.Send_submit_phoneinfo = function(_data){ + if(!ConstVal.isGameHall){ + this._SendData(AppList.app,RouteList.agent,RpcList.submit_phoneinfo,_data); + } +} +Net.submit_phoneinfo = function(_msg){ + //GameData.submitPhoneInfo = true; + +} +//提交手机信息 +Net.Send_update_charm = function(_data){ + + this._SendData(AppList.app,RouteList.agent,RpcList.update_charm,_data); +} +Net.update_charm = function(_msg){ + //GameData.submitPhoneInfo = true; + Desk.update_charm(_msg); + +} +Net.Send_setSign = function(_data){ + + this._SendData(AppList.app,RouteList.agent,RpcList.setSign,_data); +} +Net.setSign = function(_msg){ + C_Player.setSign(_msg.data.sign); + //GameUI.setSign(_msg.data.sign); +} +Net.Send_switchRoomList = function(_data){ + GameUI.StartLoad(); + this._SendData(AppList.app,RouteList.agent,RpcList.switchRoomList,_data); +} +Net.switchRoomList = function(_msg){ + GameUI.EndLoad(); + Desk.switchRoomList(_msg); + //GameUI.setSign(_msg.data.sign); +} + +Net.Send_getInfoByShortCode = function(_data){ + //GameUI.StartLoad(); + this._SendData(AppList.app,RouteList.agent,RpcList.getInfoByShortCode,_data); +} +Net.getInfoByShortCode = function(_msg){ + GameUI.EndLoad(); + Desk.getInfoByShortCode(_msg); +} +Net.Send_optBanList = function(_data){ + GameUI.StartLoad(); + this._SendData(AppList.app,RouteList.agent,RpcList.optBanList,_data); +} +Net.optBanList = function(_msg){ + GameUI.EndLoad(); + Desk.optBanList(_msg); +} +Net.Send_getShortCodeRankList = function(_data){ + GameUI.StartLoad(); + this._SendData(AppList.app,RouteList.agent,RpcList.getShortCodeRankList,_data); +} +Net.getShortCodeRankList = function(_msg){ + GameUI.EndLoad(); + Desk.getShortCodeRankList(_msg); +} + +Net.Send_setAllCharm = function(_data){ + GameUI.StartLoad(); + this._SendData(AppList.app,RouteList.agent,RpcList.setAllCharm,_data); +} +Net.setAllCharm = function(_msg){ + GameUI.EndLoad(); + Desk.setAllCharm(_msg); +} + +Net.Send_getVipRankList = function(_data){ + GameUI.StartLoad(); + this._SendData(AppList.app,RouteList.agent,RpcList.getVipRankList,_data); +} +Net.getVipRankList = function(_msg){ + GameUI.EndLoad(); + Desk.getVipRankList(_msg); +} + +Net.Send_playerBehavior = function(tag){ + //GameUI.StartLoad(); +/* + var _data={}; + _data.agentid = GameData.AgentId; + _data.gameid = GameData.GameId; + _data.playerid = C_Player.playerid; + _data.tag = tag; + this._SendData(AppList.app,RouteList.agent,RpcList.playerBehavior,_data); + */ + var url = "http://test3.1888day.com/api/gamedo/gamedo"; + var cfg = {}; + cfg.url = url; + cfg.type = "GET"; + cfg.data = "agentid="+GameData.AgentId+"&gameid="+GameData.GameId+"&playerid="+C_Player.playerid+"&tag="+tag; + + cfg.success = playerBehavior_Succ; + cfg.error = playerBehavior_Fail; + min_http(cfg); + +} +var playerBehavior_Succ = function(_msg,state,input_msg){ + console.log("Succ"); + console.log(_msg,state,input_msg); +} +var playerBehavior_Fail = function(_msg,state,input_msg){ + console.log("Fail"); + console.log(_msg,state,input_msg); +} +Net.playerBehavior = function(_msg){ + //GameUI.EndLoad(); + Desk.playerBehavior(_msg); +} +Net.Send_binding_phone = function(_data){ + GameUI.StartLoad(); + this._SendData(AppList.app,RouteList.agent,RpcList.binding_phone,_data); +} +Net.binding_phone = function(_msg){ + GameUI.EndLoad(); + Desk.binding_phone(_msg); +} +Net.Send_send_phone_checkcode = function(_data){ + //GameUI.StartLoad(); + this._SendData(AppList.app,RouteList.agent,RpcList.send_phone_checkcode,_data); +} +Net.send_phone_checkcode = function(_msg){ + //GameUI.EndLoad(); + Desk.send_phone_checkcode(_msg); +} +Net.Send_send_phone_code_wechat = function(_data){ + //GameUI.StartLoad(); + this._SendData(AppList.app,RouteList.agent,RpcList.send_phone_code_wechat,_data); +} +Net.send_phone_code_wechat = function(_msg){ + //GameUI.EndLoad(); + Desk.send_phone_code_wechat(_msg); +} + +Net.Send_setVipForbidSelect = function(_data){ + GameUI.StartLoad(); + this._SendData(AppList.app,RouteList.agent,RpcList.setVipForbidSelect,_data); +} +Net.setVipForbidSelect = function(_msg){ + GameUI.EndLoad(); + Desk.setVipForbidSelect(_msg); +} +Net.Send_topup_card = function(_data){ + console.log(_data); + this._SendData(AppList.app,RouteList.agent,RpcList.topup_card,_data); +} +Net.topup_card = function(_msg){ + Desk.topup_card(_msg); +} +Net.Send_query_player2 = function(_data){ + this._SendData(AppList.app,RouteList.agent,RpcList.query_player2,_data); +} +Net.query_player2 = function(_msg){ + Desk.query_player2(_msg); +} +Net.Send_giveCoin = function(_data){ + this._SendData(AppList.app,RouteList.agent,RpcList.giveCoin,_data); +} +Net.giveCoin = function(_msg){ + Desk.giveCoin(_msg); +} +Net.Send_getPlayerWhiteList = function(_data){ + GameUI.StartLoad(); + this._SendData(AppList.app,RouteList.agent,RpcList.getPlayerWhiteList,_data); +} +Net.getPlayerWhiteList = function(_msg){ + GameUI.EndLoad(); + Desk.getPlayerWhiteList(_msg); +} +Net.Send_optWhiteList = function(_data){ + GameUI.StartLoad(); + this._SendData(AppList.app,RouteList.agent,RpcList.optWhiteList,_data); +} +Net.optWhiteList = function(_msg){ + GameUI.EndLoad(); + Desk.optWhiteList(_msg); +} + diff --git a/client/js/00_Surface/10_Game.js b/client/js/00_Surface/10_Game.js new file mode 100644 index 0000000..0c4de93 --- /dev/null +++ b/client/js/00_Surface/10_Game.js @@ -0,0 +1,610 @@ +var Game=Game||{}; + +Game.submit_location = function(_msg){ + GameData.submitLocation = true; + if(_msg.data.wechat_gzh){ + GameData.wechat_gzh = _msg.data.wechat_gzh; + set_self(340,41,0,0,0); + set_self(340,7,GameData.wechat_gzh,0,0); + set_self(339,20,GameData.wechat_gzh.gblen()*13,0,0); + set_self(340,18,get_self(16,18,0,0,0)+get_self(16,20,0,0,0)/2-GameData.wechat_gzh.gblen()*6.5,0,0); + set_self(339,18,get_self(16,18,0,0,0)+get_self(16,20,0,0,0)/2-GameData.wechat_gzh.gblen()*6.5,0,0); + } + if(_msg.data.wechat_ewm){ + GameData.wechat_ewm=_msg.data.wechat_ewm; + } + if(_msg.data.wechat_kfh){ + GameData.wechat_kfh=_msg.data.wechat_kfh; + set_self(179,7,GameData.wechat_kfh,0,0); + } + if(_msg.data.qq){ + GameData.qq=_msg.data.qq; + set_self(682,7,GameData.qq,0,0); + } + if(_msg.data.tel){ + GameData.tel=_msg.data.tel; + set_self(GameData.telSpid,20,String(GameData.tel).gblen()*14,0,0); + set_self(GameData.telSpid,7,GameData.tel,0,0); + } + if(_msg.data.invitecode){ + C_Player.setInvitecod(_msg.data.invitecode); + GameUI.CloseBind(); + } + +} +//游戏其他信息 +//Game.mainSceneInfo = {}; +var recorderManager; +var innerAudioContext1; + + /** + * ?????????? mdata ?????? + * openId,avatarUrl,nickName, gender, city, province, unionId + */ + function getwxuserinfo(mdata) { + sharelogin(mdata.openId,mdata.avatarUrl,mdata.nickName,mdata.gender,mdata.city,mdata.province,mdata.unionId) + } + + + /** + * ???????? + */ + function wxgameshow(mdata) { + appservice(1); + } + /** + * ???????? + */ + function wxgamehide(mdata) { + appservice(2); + } + /** + * ?????? state ???? 1 ?? 2 ?? + */ + function sharegameinfo(state) { + //if (state == 1) { + + //} + //if (state == 2) { + + //} + state = Number(state); + //type = Number(type); + C_Player.sharesuccess(state,1); + + + } +//Recorderload(); + + +/** + * ??????? + */ +function Recorderload(){ + if(!innerAudioContext1){ + innerAudioContext1 = wx.createInnerAudioContext(); + } + var that = this; + recorderManager=wx.getRecorderManager() + recorderManager.onError(function(){ + + console.log("????!"); + }); + recorderManager.onStop(function(res){ + + console.log(res.tempFilePath ); + + console.log("????!"); + //playRecord(res.tempFilePath); + getaudiourl(res.tempFilePath,5); + }); + + + //innerAudioContext1.onError((res) => { + //console.log("??????!"); + + //}) + //innerAudioContext1.onEnded((res) => { + //console.log("??????!"); + //}) + innerAudioContext1.onError(function(res){ + console.log("??????!"); + + }) + innerAudioContext1.onEnded(function(res){ + console.log("??????!"); + }) +} +/** + * ?????????? + */ + function isxiaowxgame(){ + var iswxgame; + try{ + var recorderManager = wx.getRecorderManager(); + iswxgame=true; + }catch(e){ + iswxgame=false; + } + return iswxgame; + + } + function wxauthorize(){ + + } + /** + * ???? + */ + function startRecordAac (){ + console.log("开始录音"); + recorderManager.start({ + format: 'aac' + }); +// wx.authorize({ +// scope: 'scope.record', +// fail: function (res) { +// // iOS ? Android ????????? errMsg ????,????????? +// console.log("????"); +// console.log(res); +// if (res.errMsg.indexOf('auth deny') > -1 || res.errMsg.indexOf('fail') > -1 || res.errMsg.indexOf('auth denied') > -1 ) { +// // ??????????? +// console.log("????"); +// wx.showModal({ +// title: '??', +// content: '??????????????????->??(?????)->?????->??', +// showCancel:false, +// success: function (res) { +// if (res.confirm) { +// console.log('??????') +// } else if (res.cancel) { +// console.log('??????') +// } +// } +// }) +// } +// }, +// success:function (res) { +// console.log("????"); +// recorderManager.start({ +// format: 'aac' +// }); +// } +// }) + + + } + /** + * ???? + */ + + function stopRecord (){ + console.log("结束录音"); +// wx.authorize({ +// scope: 'scope.record', +// fail: function (res) { +// console.log("fail????"); +// }, +// success:function (res) { +// console.log("stop????"); + +// } +// }) + recorderManager.stop() + } + /*** + * ???? + */ + function playRecord (src) { + if(!innerAudioContext1){ + innerAudioContext1 = wx.createInnerAudioContext(); + } + //var that = this; + // var src = this.data.src; + if (src == '') { + console.log("????!"); + return; + } + innerAudioContext1.src = src; + innerAudioContext1.play() +} + + + + + + var Wxloginbutton; + /** + * ????? + */ + function initwxgame() { + gameshow(); + gamehide(); + } + //initwxgame(); + /** + * ??????? + */ + //function gameshow() { + //wx.onShow(data => { + //console.log("******" + data) + //console.log(data) + //wxgameshow(data); + + //}); + //} + function gameshow() { + wx.onShow(function(data){ + console.log("******" + data) + console.log(data) + wxgameshow(data); + + }); + } + /** + * ??????? + */ + //function gamehide() { + //wx.onHide(data => { + //wxgamehide(data) + + //}); + //} + function gamehide() { + wx.onHide(function(data){ + wxgamehide(data) + + }); + } + /* + * ????????? + * wxgamew ?????? wxgameh ?????? imagex ???????? imagey ???????? imagew???? imageh ???? btnimageurl ???? + */ + function WXgameloginbuttonshow(wxgamew, wxgameh, imagex, imagey, imagew, imageh, btnimageurl) { + + var winh, winw; + try { + + + wx.getSystemInfo({ + success: function (res) { + console.log(res.model) + console.log(res.pixelRatio) + console.log(res.windowWidth) + console.log(res.windowHeight) + winh = res.windowHeight; + winw = res.windowWidth; + + } + }) + + + var sh = winh / wxgameh; + var sw = winw / wxgamew; + console.log("sw=" + sw + "sh=" + sh); + + imagew = parseInt(imagew * sw); + imageh = parseInt(imageh * sh); + imagex = parseInt(imagex * sw); + imagey = parseInt(imagey * sh);; + + + if (wx.createUserInfoButton) { + + + if (Wxloginbutton) { + console.log("??button"); + Wxloginbutton.show(); + Wxloginbutton.offTap();//???????? + + } else { + + console.log("????button"); + // console.log(document.title); + + Wxloginbutton = wx.createUserInfoButton({ + type: 'image', + image: btnimageurl, + style: { + left: imagex, + top: imagey, + width: imagew, + height: imageh + } + }) + + } + //Wxloginbutton.onTap((res) => { + + + //console.log(res) + //if (res.errMsg.indexOf('auth deny') > -1 || res.errMsg.indexOf('auth denied') > -1 || res.errMsg.indexOf('fail') > -1 ) { + //wx.showModal({ + //title: '??', + //content: '??????????????????->??(?????)->?????->??', + //showCancel: false, + //success: function (res) { + //if (res.confirm) { + //console.log('??????') + //} else if (res.cancel) { + //console.log('??????') + //} + //} + //}) + //} else { + //WXgameLogin(res); + //} + //}) + Wxloginbutton.onTap(function(res){ + + + console.log(res) + if (res.errMsg.indexOf('auth deny') > -1 || res.errMsg.indexOf('auth denied') > -1 || res.errMsg.indexOf('fail') > -1 ) { + wx.showModal({ + title: '??', + content: '??????????????????->??(?????)->?????->??', + showCancel: false, + success: function (res) { + if (res.confirm) { + console.log('??????') + } else if (res.cancel) { + console.log('??????') + } + } + }) + } else { + WXgameLogin(res); + } + }) + + } else { + // ???????????????????????,??????? + console.log("????????"); + wx.showModal({ + title: '??', + content: '????????,???????,??????????????', + showCancel:false, + success: function (res) { + if (res.confirm) { + console.log('??????') + } else if (res.cancel) { + console.log('??????') + } + } + }) + } + } catch (e) { + + } + } + /** + * ???????? + */ + function WXgameloginbuttonhide() { + if (Wxloginbutton) { + Wxloginbutton.hide(); + } + } + + function Decrypt(key, iv, word) { + // var openDataContext = wx.getOpenDataContext() + // openDataContext.postMessage({ + // text: 'hello', + // year: (new Date()).getFullYear() + // }) + + var murl = "https://games.tscce.cn/wechatsmallgame/encrypt.php"; + var date = {}; + date.key = encodeURIComponent(key); + date.type = "decrypt"; + date.iv = encodeURIComponent(iv); + date.data = encodeURIComponent(word); + + + wx.request({ + url: murl, + data: date, + method: 'POST', + header: { + "Content-Type": "application/x-www-form-urlencoded" + }, + success: function (res) { + if (res.statusCode == 200) { + + if (res.data) { + var mdata = decodeURIComponent(res.data); + console.log('??------' + mdata) + mdata = JSON.parse(mdata); + + try { + console.log("??"); + Wxloginbutton.hide(); + console.log("Wxloginbutton??"); + getwxuserinfo(mdata); + } catch (e) { + + } + + // sharelogin(mdata.openId, mdata.avatarUrl, mdata.nickName, mdata.gender, mdata.city, mdata.province, mdata.unionId); + + } + + } else { + console.log('??!res.statusCode' + res.statusCode) + } + }, + fail: function (res) { + console.log('??!') + } + }); + } + function WXgameLogin(uesrdata) { + + // ?? + wx.login({ + + //success: res => { + + //if (res.code) { + //var murl = "https://games.tscce.cn/wechatsmallgame/code2accessToken.php?appid=wxaeeca8ffffa94105" +"&secret=639a292164680d4cd87a024edae21f41"+"&js_code="+res.code; + + //console.log("????res.code=" + res.code); + //wx.request({ + //url: murl, + //method: 'GET', + //header: { + //'content-type': 'application/json' + //}, + //success: function (res) { + //console.log('??' + JSON.stringify(res)); + //console.log('res.statusCode' + res.statusCode); + //if (res.statusCode == 200) { + //var openid = res.data.openid; + //var unionid = res.data.unionid; + //var session_key = res.data.session_key; + //Decrypt(session_key, uesrdata.iv, uesrdata.encryptedData); + + //} else { + //console.log('??!res.statusCode' + res.statusCode) + //} + //}, + //fail: function (res) { + //console.log('??!') + //} + //}); + //} + + //} + success: function(res){ + + if (res.code) { + var murl = "https://games.tscce.cn/wechatsmallgame/code2accessToken.php?appid=wxaeeca8ffffa94105" +"&secret=639a292164680d4cd87a024edae21f41"+"&js_code="+res.code; + + console.log("????res.code=" + res.code); + wx.request({ + url: murl, + method: 'GET', + header: { + 'content-type': 'application/json' + }, + success: function (res) { + console.log('??' + JSON.stringify(res)); + console.log('res.statusCode' + res.statusCode); + if (res.statusCode == 200) { + var openid = res.data.openid; + var unionid = res.data.unionid; + var session_key = res.data.session_key; + Decrypt(session_key, uesrdata.iv, uesrdata.encryptedData); + + } else { + console.log('??!res.statusCode' + res.statusCode) + } + }, + fail: function (res) { + console.log('??!') + } + }); + } + + } + }); + + } + /** + * ????????? + */ + function initgameshareinfo(sharetitle, shareimageurl) { + wx.showShareMenu({ withShareTicket: true }); + //wx.onShareAppMessage(data => { + //return { + //title: sharetitle, + //imageUrl: shareimageurl, + //query: '', + //success: function (res) { + //console.log(res); + //console.log('??????'); + //sharegameinfo(1); + //}, + //fail: function (res) { + //console.log('??????'); + //console.log(res); + //sharegameinfo(2); + //} + //} + //}) + wx.onShareAppMessage(function(data){ + return { + title: sharetitle, + imageUrl: shareimageurl, + query: '', + success: function (res) { + console.log(res); + console.log('??????'); + sharegameinfo(1); + }, + fail: function (res) { + console.log('??????'); + console.log(res); + sharegameinfo(2); + } + } + }) + + } + /** + * ????????? + */ + function hidegameshareinfo(sharetitle, shareimageurl) { + wx.hideShareMenu(); + + } + /** + * ?????? + */ + function Pullupgameshare(sharetitle, shareimageurl) { + wx.shareAppMessage({ + title: sharetitle, + imageUrl: shareimageurl, + query: "", + success: function (res) { + console.log(res); + console.log('??????'); + sharegameinfo(1); + + }, + fail: function (res) { + console.log('??????'); + console.log(res); + sharegameinfo(2); + } + }); + } + /** + * ??????? + */ + function createGameClubButtonimage(mleft, mtop, mwidth, mheight) { + var button = wx.createGameClubButton({ + type: 'image', + icon: 'green', + style: { + left: mleft, + top: mtop, + width: mwidth, + height: mheight + } + }) + } + // var button = wx.createGameClubButton({ + // type: 'text', + // icon: 'green', + // style: { + // left: 10, + // top: 76, + // width: 40, + // height: 40 + // } + // }) + + + + + diff --git a/client/js/00_Surface/11_GameUI.js b/client/js/00_Surface/11_GameUI.js new file mode 100644 index 0000000..cab2169 --- /dev/null +++ b/client/js/00_Surface/11_GameUI.js @@ -0,0 +1,9862 @@ +var GameUI = GameUI || {}; +GameUI.VoteList = []; +GameUI.ApplyPlayer = -1; +GameUI.onstate = []; //玩家状态位置为显示位置 +GameUI.isprepare = []; //玩家准备状态显示 +GameUI.Mem = {}; +//GameUI.Mem.headSize = [0,0]; +GameUI.Mem.snrOption = { + min: 1000, + max: 4000, + unit: 100, + slider: 0, + start_x: 0, + end_x: 0, + unit_px: 0, + count: 0, + number: 0, + roomcode_number: -1, + roomcode_string: "", + number_1: 26, + number_2: 19.6, + number_3: 28, + number_4: 18, + infinite: 0, + videoConfig: null, + tea: 0, + rebateType: 0, + sysRebate:0, + rebateLimit:0, + forbidSelect:0 +}; +GameUI.utlani_doend = function(id, sx, count, allend) { + //logmessage(id+"/"+sx+"/"+count+"/"+allend); + if (id >= 274 && id <= 278 && sx == 43 && allend == 1) { + set_self(id, 37, 0, 0, 0); + } + if (id >= 292 && id <= 306 && sx == 43 && allend == 1) { + set_self(id, 37, 0, 0, 0); + } + if (id >= 498 && id <= 507 && sx == 43 && allend == 1) { //关闭表情显示 + set_self(id, 37, 0, 0, 0); + set_self(id - 30, 37, 0, 0, 0); + } + if (id >= 552 && id <= 561 && sx == 43 && allend == 1) { //关闭文字聊天 + set_self(id, 37, 0, 0, 0); + set_self(id + 30, 37, 0, 0, 0); + } + if (id == 390 && sx == 18 && allend == 1) { //游戏公告 + GameData.isBoardcast = false; + GameUI.playBroadcast(); + } + //if(id == 11 && sx == 43 && allend == 1){//创建房间 + //play_ani(1,12,43,1,30,0,ConstVal.Animation.time1,0,0,0,1,0,0,0);//加入房间 + //} + //if(id == 12 && sx == 43 && allend == 1){//创建房间 + //play_ani(1,568,43,1,30,0,ConstVal.Animation.time1,0,0,0,1,0,0,0);//星星场 + //} + //if(id == 568 && sx == 43 && allend == 1){//创建房间 + //play_ani(1,483,43,1,30,0,ConstVal.Animation.time1,0,0,0,1,0,0,0);//比赛场 + //} + //if(id == 483 && sx == 43 && allend == 1){//创建房间 + //GameData.mainMenuAniTimer = setTimeout(function(){ + //play_ani(1,11,43,1,30,0,ConstVal.Animation.time1,0,0,0,1,0,0,0);//加入房间 + //},ConstVal.Animation.deltaTime); + //} + + +}; +GameUI.utlgamebegindraw = function(gameid, spid, times, timelong) { + +}; +GameUI.onloadurl = function(recid, rectype, url, error, count, len) { + GameData.LoadCount = count; + if (rectype == 0) { + ifast_loadsprite([1, 254, 3104, 3103]); + } + if (count == 0) { + + } + try { + if (ifast_checkimg(21) && !GameData.launchImgLoaded && GameData.configSuccess && GameData.hallConfig.launchImgUrl) { + //console.log(GameData.hallConfig); + + Func.up_imgurl(21, GameData.hallConfig.launchImgUrl); + GameData.launchImgLoaded = true; + } + } catch (e) { + + } + if (count == 100 && GameData.isLoad) { + //var ttext = get_self(3104,7,0,0)+" 跳过"; + //set_self(3104,7,ttext,0,0); + //set_self(3104,20,ttext.gblen()*12,0,0); + //GameUI.adaptPositionSpid(3104,3103); + //GameUI.adaptPositionSpid(3104,3103); + GameData.isLoad = false; + if (GameData.LaunchMode == ConstVal.Launch_mode.from_hall) { + set_self(465, 37, 1, 0, 0); + } + //if(ConstVal.netType == 0){ + if (GameData.Timesup && GameData.firstConnect_Succ && GameData.getJSONState) { + GameUI.JumpWxAuth(); + + } else { + set_self(254, 37, 0, 0, 0); + } + //}else{ + //if(GameData.Timesup && GameData.getJSONState){ + //GameUI.JumpWxAuth(); + + //}else{ + //set_self(254,37,0,0,0); + //} + //} + + } +} +GameUI.utlmousedown = function(gameid, spid, downx, downy, no1, no2, no3, no4, no5, no6) { + //点击代码 + for (var i = 0; i < ClickBtn.length; i++) { + if (spid == ClickBtn[i]) { + set_self(ClickBtn[i], 35, 200, 0, 0); + set_self(ClickBtn[i], 33, 105, 0, 0); + //Utl.playSound(Game_Config.soundList.Button); + } + } + if (spid >= 29 && spid <= 40) { + set_self(spid, 35, 200, 0, 0); + } + if (spid == 152) { + Func.prepareAudio(); + //getaudiourl("aaaaa",2); + } + switch (spid) { + case 52: + + break; + case ConstVal.Emotion.f_spid: + GameData.slidEmotion = false; + break; + case ConstVal.Com_History.f_spid: + GameData.slideHistory = false; + break; + case ConstVal.Task.f_spid: + GameData.slideTask = false; + break; + case ConstVal.worldRoom.f_sp_1: + GameData.worldRoomSysSlide = false; + break; + case ConstVal.worldRoom.f_sp_2: + GameData.worldRoomPlySlide = false; + break; + case ConstVal.snrRoomList.f_spid: + GameData.snrRoomListSlide = false; + break; + case ConstVal.rankList.f_spid: + GameData.rankListSlide = false; + break; + case 3102: + case 3105: + case 3106: + GameData.imgAdIsSlide = false; + break; + case ConstVal.vipRoomList1.f_spid: + GameData.vipRoomPageOne.slide = false; + break; + case ConstVal.vipRoomList2.f_spid: + GameData.vipRoomPageTwo.slide = false; + case ConstVal.blackList.f_spid: + GameData.blackList.slide = false; + break; + case ConstVal.vipRank.f_spid: + GameData.vipRank.slide = false; + break; + case ConstVal.whiteList.f_spid: + GameData.whiteList.slide = false; + break; + + } + +}; +GameUI.utlmousedown_nomove = function(gameid, spid, downx, downy, timelong, no1, no2, no3, no4, no5) { + //点击代没移动代码 + + + +}; +GameUI.utlmouseup = function(gameid, spid_down, downx, downy, spid_up, upx, upy, timelong, no1, no2) { + //点击弹起代码 + //可以通过spid_down和spid_up 的比较 来判断是 点击还是 移动 + for (var i = 0; i < ClickBtn.length; i++) { + if (spid_down == ClickBtn[i]) { + set_self(ClickBtn[i], 35, 255, 0, 0); + set_self(ClickBtn[i], 33, 100, 0, 0); + } + } + for (var i = 0; i < ConstVal.soudsSpidList.length; i++) { + if (spid_down == ConstVal.soudsSpidList[i]) { + Utl.playSound(Game_Config.ClickButton.src_1); + } + } + if (spid_down >= 29 && spid_down <= 40) { + set_self(spid_down, 35, 255, 0, 0); + } + if (spid_down == 252) { + var pos = get_self(252, 19, 0, 0, 0); + var h = get_self(252, 21, 0, 0, 0); + if (pos > Game_Config.Protocol.y) { + var t = pos - Game_Config.Protocol.y; + play_ani(1, 252, 19, pos, Game_Config.Protocol.y, 0, t, 0, 0, 0, 1, 0, 0, 0); + } else if (pos < Game_Config.Protocol.y + Game_Config.Protocol.h - h) { + var t = Game_Config.Protocol.y + Game_Config.Protocol.h - pos - h; + play_ani(1, 252, 19, pos, Game_Config.Protocol.y + Game_Config.Protocol.h - h, 0, t, 0, 0, 0, 1, 0, 0, 0); + } + } + if (spid_down == 290) { + var pos = get_self(290, 19, 0, 0, 0); + var h = get_self(290, 21, 0, 0, 0); + if (pos > Game_Config.Help.y) { + var t = pos - Game_Config.Help.y; + play_ani(1, 290, 19, pos, Game_Config.Help.y, 0, t, 0, 0, 0, 1, 0, 0, 0); + } else if (pos < Game_Config.Help.y + Game_Config.Help.h - h) { + var t = Game_Config.Help.y + Game_Config.Help.h - pos - h; + play_ani(1, 290, 19, pos, Game_Config.Help.y + Game_Config.Help.h - h, 0, t, 0, 0, 0, 1, 0, 0, 0); + + } + } + if (spid_down == 404) { + var pos = get_self(spid_down, 19, 0, 0, 0); + var h = get_self(spid_down, 21, 0, 0, 0); + var s_height = get_self(spid_down, 21, 0, 0, 0); + if (pos > ConstVal.Notice.clip_y) { + var t = pos - ConstVal.Notice.clip_y; + play_ani(1, spid_down, 19, pos, ConstVal.Notice.clip_y, 0, t, 0, 0, 0, 1, 0, 0, 0); + play_ani(1, 81, 19, pos, ConstVal.Notice.clip_y, 0, t, 0, 0, 0, 1, 0, 0, 0); + } else if (pos < ConstVal.Notice.clip_y + ConstVal.Notice.clip_h - h) { + + if (ConstVal.Notice.clip_h < s_height) { + var t = ConstVal.Notice.clip_y + ConstVal.Notice.clip_h - pos - h; + play_ani(1, spid_down, 19, pos, ConstVal.Notice.clip_y + ConstVal.Notice.clip_h - h, 0, t, 0, 0, 0, 1, 0, 0, 0); + play_ani(1, 81, 19, pos, ConstVal.Notice.clip_y + ConstVal.Notice.clip_h - h, 0, t, 0, 0, 0, 1, 0, 0, 0); + } else { + var t = ConstVal.Notice.clip_y - pos; + play_ani(1, spid_down, 19, pos, ConstVal.Notice.clip_y, 0, t, 0, 0, 0, 1, 0, 0, 0); + play_ani(1, 81, 19, pos, ConstVal.Notice.clip_y, 0, t, 0, 0, 0, 1, 0, 0, 0); + } + } + } + if (spid_down == 3102 || spid_down == 3105 || spid_down == 3106) { + var pos = get_self(spid_down, 19, 0, 0, 0); + var h = get_self(spid_down, 21, 0, 0, 0); + var s_height = get_self(spid_down, 21, 0, 0, 0); + if (pos > ConstVal.Notice.img_clip_y) { + var t = pos - ConstVal.Notice.img_clip_y; + play_ani(1, spid_down, 19, pos, ConstVal.Notice.img_clip_y, 0, t, 0, 0, 0, 1, 0, 0, 0); + play_ani(1, 81, 19, pos, ConstVal.Notice.img_clip_y, 0, t, 0, 0, 0, 1, 0, 0, 0); + } else if (pos < ConstVal.Notice.img_clip_y + ConstVal.Notice.img_clip_h - h) { + + if (ConstVal.Notice.img_clip_h < s_height) { + var t = ConstVal.Notice.img_clip_y + ConstVal.Notice.img_clip_h - pos - h; + play_ani(1, spid_down, 19, pos, ConstVal.Notice.img_clip_y + ConstVal.Notice.img_clip_h - h, 0, t, 0, 0, 0, 1, 0, 0, 0); + play_ani(1, 81, 19, pos, ConstVal.Notice.img_clip_y + ConstVal.Notice.img_clip_h - h, 0, t, 0, 0, 0, 1, 0, 0, 0); + } else { + var t = ConstVal.Notice.img_clip_y - pos; + play_ani(1, spid_down, 19, pos, ConstVal.Notice.img_clip_y, 0, t, 0, 0, 0, 1, 0, 0, 0); + play_ani(1, 81, 19, pos, ConstVal.Notice.img_clip_y, 0, t, 0, 0, 0, 1, 0, 0, 0); + } + } + } + if (spid_down == ConstVal.Emotion.f_spid) { + var pos = get_self(spid_down, 19, 0, 0, 0); + if (pos > ConstVal.Emotion.clip_y) { + var t = pos - ConstVal.Emotion.clip_y; + play_ani(1, spid_down, 19, pos, ConstVal.Emotion.clip_y, 0, t, 0, 0, 0, 1, 0, 0, 0); + + } else { + if (Math.ceil(ConstVal.Emotion.count / ConstVal.Emotion.col_num) <= 4) { + if (pos < ConstVal.Emotion.clip_y) { + var t = ConstVal.Emotion.clip_y - pos; + play_ani(1, spid_down, 19, pos, ConstVal.Emotion.clip_y, 0, t, 0, 0, 0, 1, 0, 0, 0); + + } + } else { + var dis = ConstVal.Emotion.clip_y + 4 * (ConstVal.Emotion.h + ConstVal.Emotion.dis_y) - Math.ceil(ConstVal.Emotion.count / ConstVal.Emotion.col_num) * (ConstVal.Emotion.h + ConstVal.Emotion.dis_y); + if (pos < dis) { + var t = dis - pos; + play_ani(1, spid_down, 19, pos, dis, 0, t, 0, 0, 0, 1, 0, 0, 0); + + } + } + } + } + if (spid_down == ConstVal.Com_History.f_spid) { + var pos = get_self(spid_down, 19, 0, 0, 0); + if (pos > ConstVal.Com_History.clip_y) { + var t = pos - ConstVal.Com_History.clip_y; + play_ani(1, spid_down, 19, pos, ConstVal.Com_History.clip_y, 0, t, 0, 0, 0, 1, 0, 0, 0); + + } else { + if (ConstVal.Com_History.page_count >= GameData.createHistoryLen) { + if (pos < ConstVal.Com_History.clip_y) { + var t = ConstVal.Com_History.clip_y - pos; + play_ani(1, spid_down, 19, pos, ConstVal.Com_History.clip_y, 0, t, 0, 0, 0, 1, 0, 0, 0); + + } + } else { + var dis = ConstVal.Com_History.clip_y + ConstVal.Com_History.page_count * (ConstVal.Com_History.head_h + ConstVal.Com_History.head_dis_y) - GameData.createHistoryLen * (ConstVal.Com_History.head_h + ConstVal.Com_History.head_dis_y); + //var dis = + if (pos < dis) { + var t = dis - pos; + play_ani(1, spid_down, 19, pos, dis, 0, t, 0, 0, 0, 1, 0, 0, 0); + + } + } + } + } + if (spid_down == ConstVal.Task.f_spid) { + + var pos = get_self(spid_down, 18, 0, 0, 0); + if (pos > ConstVal.Task.clip_x) { + var t = pos - ConstVal.Task.clip_x; + play_ani(1, spid_down, 18, pos, ConstVal.Task.clip_x, 0, t, 0, 0, 0, 1, 0, 0, 0); + + } else { + if (TaskInfo.length <= 4) { + if (pos < ConstVal.Task.clip_x) { + var t = ConstVal.Task.clip_x - pos; + play_ani(1, spid_down, 18, pos, ConstVal.Task.clip_x, 0, t, 0, 0, 0, 1, 0, 0, 0); + + } + } else { + var dis = ConstVal.Task.clip_x + (4 - TaskInfo.length) * (ConstVal.Task.bg_dis_x + ConstVal.Task.bg_w); + + if (pos < dis) { + var t = dis - pos; + play_ani(1, spid_down, 18, pos, dis, 0, t, 0, 0, 0, 1, 0, 0, 0); + + } + } + } + } + + if (spid_down == ConstVal.worldRoom.f_sp_1) { + + var pos = get_self(spid_down, 19, 0, 0, 0); + var sh = get_self(spid_down, 21, 0, 0, 0); + if (pos > ConstVal.worldRoom.clip_y_1) { + var t = pos - ConstVal.worldRoom.clip_y_1; + play_ani(1, spid_down, 19, pos, ConstVal.worldRoom.clip_y_1, 0, t, 0, 0, 0, 1, 0, 0, 0); + + } else { + if (sh < ConstVal.worldRoom.clip_h_1) { + //if(pos < ConstVal.worldRoom.clip_y_1){ + var t = ConstVal.worldRoom.clip_y_1 - pos; + play_ani(1, spid_down, 19, pos, ConstVal.worldRoom.clip_y_1, 0, t, 0, 0, 0, 1, 0, 0, 0); + + //} + } else { + //var Width = ConstVal.worldRoom.bg_sp_space_1+get_self(ConstVal.worldRoom.bg_sp_1,20,0,0,0); + //var dis = ConstVal.worldRoom.clip_x_1+(4-GameData.worldRoomSys.length)*Width; + var dis = ConstVal.worldRoom.clip_y_1 + ConstVal.worldRoom.clip_h_1 - sh; + if (pos < dis) { + var t = dis - pos; + play_ani(1, spid_down, 19, pos, dis, 0, t, 0, 0, 0, 1, 0, 0, 0); + + } + } + } + } + if (spid_down == ConstVal.worldRoom.f_sp_2) { + var bg_height = get_self(spid_down, 21, 0, 0); + var pos = get_self(spid_down, 19, 0, 0, 0); + if (pos > ConstVal.worldRoom.clip_y_2) { + var t = pos - ConstVal.worldRoom.clip_y_2; + play_ani(1, spid_down, 19, pos, ConstVal.worldRoom.clip_y_2, 0, t, 0, 0, 0, 1, 0, 0, 0); + + } else { + if (bg_height < ConstVal.worldRoom.clip_h_2) { + if (pos < ConstVal.worldRoom.clip_y_2) { + var t = ConstVal.worldRoom.clip_y_2 - pos; + play_ani(1, spid_down, 19, pos, ConstVal.worldRoom.clip_y_2, 0, t, 0, 0, 0, 1, 0, 0, 0); + + } + } else { + //var height = ConstVal.worldRoom.bg_sp_space_2+get_self(ConstVal.worldRoom.bg_sp_2,21,0,0,0); + //var dis = ConstVal.worldRoom.clip_x_2+(4-GameData.worldRoomPly.length)*Width; + var dis = ConstVal.worldRoom.clip_h_2 + ConstVal.worldRoom.clip_y_2 - bg_height; + if (pos < dis) { + var t = dis - pos; + play_ani(1, spid_down, 19, pos, dis, 0, t, 0, 0, 0, 1, 0, 0, 0); + + } + } + } + } + if (spid_down == ConstVal.snrRoomList.f_spid) { + + var pos = get_self(spid_down, 19, 0, 0, 0); + if (pos > ConstVal.snrRoomList.clip_y) { + var t = pos - ConstVal.snrRoomList.clip_y; + play_ani(1, spid_down, 19, pos, ConstVal.snrRoomList.clip_y, 0, t, 0, 0, 0, 1, 0, 0, 0); + + } else { + if (GameData.snrRoomList.roomlist.length <= 3) { + if (pos < ConstVal.snrRoomList.clip_y) { + var t = ConstVal.snrRoomList.clip_y - pos; + play_ani(1, spid_down, 19, pos, ConstVal.snrRoomList.clip_y, 0, t, 0, 0, 0, 1, 0, 0, 0); + + } + } else { + var Width = ConstVal.snrRoomList.bg_space + get_self(ConstVal.snrRoomList.bg_spid, 21, 0, 0, 0); + var dis = ConstVal.snrRoomList.clip_y + (3 - GameData.snrRoomList.roomlist.length) * Width; + + if (pos < dis) { + var t = dis - pos; + play_ani(1, spid_down, 19, pos, dis, 0, t, 0, 0, 0, 1, 0, 0, 0); + + } + } + } + } + if (spid_down == ConstVal.rankList.f_spid) { + + var pos = get_self(spid_down, 19, 0, 0, 0); + if (pos > ConstVal.rankList.clip_y) { + var t = pos - ConstVal.rankList.clip_y; + play_ani(1, spid_down, 19, pos, ConstVal.rankList.clip_y, 0, t, 0, 0, 0, 1, 0, 0, 0); + + } else { + if (GameData.rankList.length <= 5) { + if (pos < ConstVal.rankList.clip_y) { + var t = ConstVal.rankList.clip_y - pos; + play_ani(1, spid_down, 19, pos, ConstVal.rankList.clip_y, 0, t, 0, 0, 0, 1, 0, 0, 0); + + } + } else { + var Width = ConstVal.rankList.space + get_self(ConstVal.rankList.bg_spid, 21, 0, 0, 0); + var dis = ConstVal.rankList.clip_y + (5 - GameData.rankList.length) * Width; + + if (pos < dis) { + var t = dis - pos; + play_ani(1, spid_down, 19, pos, dis, 0, t, 0, 0, 0, 1, 0, 0, 0); + + } + } + } + } + if (spid_down == ConstVal.sysNotice.f_spid) { + var pos = get_self(spid_down, 19, 0, 0, 0); + var h = get_self(spid_down, 21, 0, 0, 0); + var s_height = get_self(spid_down, 21, 0, 0, 0); + if (pos > ConstVal.sysNotice.clip_y) { + var t = pos - ConstVal.sysNotice.clip_y; + play_ani(1, spid_down, 19, pos, ConstVal.sysNotice.clip_y, 0, t, 0, 0, 0, 1, 0, 0, 0); + + } else if (pos < ConstVal.sysNotice.clip_y + ConstVal.sysNotice.clip_h - h) { + + if (ConstVal.sysNotice.clip_h < s_height) { + var t = ConstVal.sysNotice.clip_y + ConstVal.sysNotice.clip_h - pos - h; + play_ani(1, spid_down, 19, pos, ConstVal.sysNotice.clip_y + ConstVal.sysNotice.clip_h - h, 0, t, 0, 0, 0, 1, 0, 0, 0); + + } else { + var t = ConstVal.sysNotice.clip_y - pos; + play_ani(1, spid_down, 19, pos, ConstVal.sysNotice.clip_y, 0, t, 0, 0, 0, 1, 0, 0, 0); + + } + } + } + if (spid_down == ConstVal.vipRoomList1.f_spid) { + var pos = get_self(spid_down, 19, 0, 0, 0); + var h = get_self(spid_down, 21, 0, 0, 0); + var s_height = get_self(spid_down, 21, 0, 0, 0); + if (pos > ConstVal.vipRoomList1.clip_y) { + var t = pos - ConstVal.vipRoomList1.clip_y; + play_ani(1, spid_down, 19, pos, ConstVal.vipRoomList1.clip_y, 0, t, 0, 0, 0, 1, 0, 0, 0); + + } else if (pos < ConstVal.vipRoomList1.clip_y + ConstVal.vipRoomList1.clip_h - h) { + + if (ConstVal.vipRoomList1.clip_h < s_height) { + var t = ConstVal.vipRoomList1.clip_y + ConstVal.vipRoomList1.clip_h - pos - h; + play_ani(1, spid_down, 19, pos, ConstVal.vipRoomList1.clip_y + ConstVal.vipRoomList1.clip_h - h, 0, t, 0, 0, 0, 1, 0, 0, 0); + + } else { + var t = ConstVal.vipRoomList1.clip_y - pos; + play_ani(1, spid_down, 19, pos, ConstVal.vipRoomList1.clip_y, 0, t, 0, 0, 0, 1, 0, 0, 0); + + } + } + } + if (spid_down == ConstVal.vipRoomList2.f_spid) { + var pos = get_self(spid_down, 19, 0, 0, 0); + var h = get_self(spid_down, 21, 0, 0, 0); + var s_height = get_self(spid_down, 21, 0, 0, 0); + if (pos > ConstVal.vipRoomList2.clip_y) { + var t = pos - ConstVal.vipRoomList2.clip_y; + play_ani(1, spid_down, 19, pos, ConstVal.vipRoomList2.clip_y, 0, t, 0, 0, 0, 1, 0, 0, 0); + + } else if (pos < ConstVal.vipRoomList2.clip_y + ConstVal.vipRoomList2.clip_h - h) { + + if (ConstVal.vipRoomList2.clip_h < s_height) { + var t = ConstVal.vipRoomList2.clip_y + ConstVal.vipRoomList2.clip_h - pos - h; + play_ani(1, spid_down, 19, pos, ConstVal.vipRoomList2.clip_y + ConstVal.vipRoomList2.clip_h - h, 0, t, 0, 0, 0, 1, 0, 0, 0); + + } else { + var t = ConstVal.vipRoomList2.clip_y - pos; + play_ani(1, spid_down, 19, pos, ConstVal.vipRoomList2.clip_y, 0, t, 0, 0, 0, 1, 0, 0, 0); + + } + } + } + if (spid_down == ConstVal.blackList.f_spid) { + var pos = get_self(spid_down, 19, 0, 0, 0); + var h = get_self(spid_down, 21, 0, 0, 0); + var s_height = get_self(spid_down, 21, 0, 0, 0); + if (pos > ConstVal.blackList.clip_y) { + var t = pos - ConstVal.blackList.clip_y; + play_ani(1, spid_down, 19, pos, ConstVal.blackList.clip_y, 0, t, 0, 0, 0, 1, 0, 0, 0); + + } else if (pos < ConstVal.blackList.clip_y + ConstVal.blackList.clip_h - h) { + + if (ConstVal.blackList.clip_h < s_height) { + var t = ConstVal.blackList.clip_y + ConstVal.blackList.clip_h - pos - h; + play_ani(1, spid_down, 19, pos, ConstVal.blackList.clip_y + ConstVal.blackList.clip_h - h, 0, t, 0, 0, 0, 1, 0, 0, 0); + + } else { + var t = ConstVal.blackList.clip_y - pos; + play_ani(1, spid_down, 19, pos, ConstVal.blackList.clip_y, 0, t, 0, 0, 0, 1, 0, 0, 0); + + } + } + } + if (spid_down == ConstVal.whiteList.f_spid) { + var pos = get_self(spid_down, 19, 0, 0, 0); + var h = get_self(spid_down, 21, 0, 0, 0); + var s_height = get_self(spid_down, 21, 0, 0, 0); + if (pos > ConstVal.whiteList.clip_y) { + var t = pos - ConstVal.whiteList.clip_y; + play_ani(1, spid_down, 19, pos, ConstVal.whiteList.clip_y, 0, t, 0, 0, 0, 1, 0, 0, 0); + + } else if (pos < ConstVal.whiteList.clip_y + ConstVal.whiteList.clip_h - h) { + + if (ConstVal.whiteList.clip_h < s_height) { + var t = ConstVal.whiteList.clip_y + ConstVal.whiteList.clip_h - pos - h; + play_ani(1, spid_down, 19, pos, ConstVal.whiteList.clip_y + ConstVal.whiteList.clip_h - h, 0, t, 0, 0, 0, 1, 0, 0, 0); + + } else { + var t = ConstVal.whiteList.clip_y - pos; + play_ani(1, spid_down, 19, pos, ConstVal.whiteList.clip_y, 0, t, 0, 0, 0, 1, 0, 0, 0); + + } + } + } + if (spid_down == ConstVal.vipRank.f_spid) { + var config = ConstVal.vipRank; + var pos = get_self(spid_down, 19, 0, 0, 0); + var h = get_self(spid_down, 21, 0, 0, 0); + var s_height = get_self(spid_down, 21, 0, 0, 0); + if (pos > config.clip_y) { + var t = pos - config.clip_y; + play_ani(1, spid_down, 19, pos, config.clip_y, 0, t, 0, 0, 0, 1, 0, 0, 0); + + } else if (pos < config.clip_y + config.clip_h - h) { + + if (config.clip_h < s_height) { + var t = config.clip_y + config.clip_h - pos - h; + play_ani(1, spid_down, 19, pos, config.clip_y + config.clip_h - h, 0, t, 0, 0, 0, 1, 0, 0, 0); + + } else { + var t = config.clip_y - pos; + play_ani(1, spid_down, 19, pos, config.clip_y, 0, t, 0, 0, 0, 1, 0, 0, 0); + + } + } + } + if (spid_down == 597) { + GameUI.seniorOptionsSlideEnd(gameid, spid_down, downx, downy, spid_up, upx, upy, timelong, no1, no2); + } + if (spid_down == spid_up) { + if(GameData.sysConfig.behaviorList){ + for(var k=0;k= ConstVal.Task.get_reward_btn_tag && up_id < ConstVal.Task.isreward_tag) { + //console.log(TaskInfo[up_id - ConstVal.Task.get_reward_btn_tag]); + var data = {}; + data.agentid = GameData.AgentId; + data.playerid = C_Player.playerid; + data.taskid = TaskInfo[up_id - ConstVal.Task.get_reward_btn_tag].taskid; + Net.Send_get_task_award(data); + } + if (up_id == ConstVal.Task.tofinish_btn_tag) { + this.CloseTask(); + this.OpenShare(); + } + } + + + break; + case 17: + //打开任务 + var data = {}; + data.agentid = GameData.AgentId; + data.gameid = GameData.GameId; + data.playerid = C_Player.playerid; + Net.Send_get_player_task(data); + break; + case 115: + //关闭任务 + case 112: + this.CloseTask(); + break; + case 18: + //关闭创建房间 + case 60: + Game_Modify.CloseCreateRoom(); + break; + case 27: + //关闭加入房间 + case 59: + this.CloseJoinRoom(); + break; + case 43: + this.ClickBgm(); + break; + //点击音效按钮 + case 44: + this.ClickSound(); + break; + case 7: + //打开设置 + { + + this.OpenSetting(0); + } + break; + case 42: + //关闭设置 + case 47: + { + this.CloseSetting(); + } + break; + case 177: + { + + Func.visitorLogin(); + + } + break; + + + case ConstVal.Emotion.f_spid: + //点击表情 + var obj = gameabc_face.getdiv("div204"); + obj.blur(); + obj = null; + if (upx >= ConstVal.Emotion.clip_x && upx <= ConstVal.Emotion.clip_x + ConstVal.Emotion.clip_w && upy >= ConstVal.Emotion.clip_y && upy <= ConstVal.Emotion.clip_h + ConstVal.Emotion.clip_y) { + if (!GameData.slidEmotion) { + var up_id = ifast_check_add(spid_up, upx, upy); + if (up_id >= 1 && up_id <= ConstVal.Emotion.count) { + var data = {}; + data.agentid = GameData.AgentId; + data.gameid = GameData.GameId; + data.playerid = C_Player.playerid; + data.roomcode = Desk.roomcode; + data.text = up_id; + if (GameData.chatInfo) { + data.info = GameData.chatInfo; + data.type = 2; + } + Net.Send_send_phiz(data); + } + } + } + case ConstVal.Com_History.f_spid: + //点击历史记录 + var obj = gameabc_face.getdiv("div204"); + obj.blur(); + obj = null; + if (upx >= ConstVal.Com_History.clip_x && upx <= ConstVal.Com_History.clip_x + ConstVal.Com_History.clip_w && upy >= ConstVal.Com_History.clip_y && upy <= ConstVal.Com_History.clip_h + ConstVal.Com_History.clip_y) { + if (!GameData.slideHistory) { + var up_id = ifast_check_add(spid_up, upx, upy); + if (up_id >= ConstVal.Com_History.bubble_tag && up_id <= ConstVal.Com_History.content_tag) { + console.log(GameData.communionHistory[up_id - ConstVal.Com_History.bubble_tag]); + if (GameData.communionHistory[up_id - ConstVal.Com_History.bubble_tag][1] == 1) { //文字 + + if (GameData.isService) { + var sp = ConstVal.Com_History.f_spid + "add" + up_id; + if (GameData.communionHistory[up_id - ConstVal.Com_History.bubble_tag][4]) { + //GameData.chatLine =[0,10,50,10]; + GameData.chatLine = [get_self(sp, 18, 0, 0, 0), get_self(sp, 19, 0, 0, 0) - 10, get_self(sp, 20, 0, 0, 0), get_self(sp, 21, 0, 0, 0), sp, 1]; + GameData.chatInfo = GameData.communionHistory[up_id - ConstVal.Com_History.bubble_tag][4]; + } else { + GameUI.OpenTips("此消息为本桌消息", ConstVal.Tips.time); + } + + } else { + set_self(204, 7, GameData.communionHistory[up_id - ConstVal.Com_History.bubble_tag][2]); + } + } else { + if (!GameData.isService) { + var iid = ConstVal.Com_History.content_tag - ConstVal.Com_History.bubble_tag + up_id; + GameUI.play_voice(GameData.communionHistory[up_id - ConstVal.Com_History.bubble_tag][2], 2, iid); + } else { + var sp = ConstVal.Com_History.f_spid + "add" + up_id; + if (GameData.communionHistory[up_id - ConstVal.Com_History.bubble_tag][4]) { + GameData.chatLine = [get_self(sp, 18, 0, 0, 0), get_self(sp, 19, 0, 0, 0) - 10, get_self(sp, 20, 0, 0, 0), get_self(sp, 21, 0, 0, 0), sp, 2]; + GameData.chatInfo = GameData.communionHistory[up_id - ConstVal.Com_History.bubble_tag][4]; + } else { + GameUI.OpenTips("此消息为本桌消息", ConstVal.Tips.time); + } + //console.log("GameUI.play_voice:"+GameData.communionHistory[up_id - ConstVal.Com_History.bubble_tag][2]+" 2 "+iid); + } + // var p_spid = ConstVal.Com_History.f_spid+"add"+iid; + + + } + } else { + GameData.chatInfo = null; + GameData.chatLine = null; + } + } + } + + break; + + case 14: + //打开分享 + { + this.OpenShare(); + } + break; + case 72: + //关闭分享 + { + this.CloseShare(); + } + break; + case 74: + //分享微信好友 + { + + Func.sharefinend(1, 1, Game_Config.Share.appdownload, Game_Config.Share.title, Game_Config.Share.description); + + this.CloseShare(); + } + break; + case 75: + //分享微信朋友圈 + { + if (!GameData.hallConfig.shareType) { + + } else { + console.log(GameData.hallConfig.shareImgUrl); + Func.sharefinend(2, 3, GameData.hallConfig.shareImgUrl); + } + this.CloseShare(); + } + break; + case 125: + //做任务一按钮 + + this.CloseTask(); + this.OpenShare(); + break; + case 128: + //做任务二按钮 + + break; + case 10: + //打开充值提示 + case 286: + case 508: + case 509: + case 287: + case 3161: + case 3162: + case 496: + var type = 1; + if (spid_up == 508 || spid_up == 509 || spid_up == 3162 || spid_up == 496) { + type = 2; + } + if (!GameData.h5Version) { + Utl.playSound(Game_Config.ClickButton.src_1); + if (GameData.agentmode == 2 || GameData.agentmode == 3) { + //console.log(GameData.AgentId+"、"+GameData.ChannelId+"、"+GameData.marketID+"、"+C_Player.playerid);agentid、channelid、marketid、playerid + if (GameData.versionState == 0) { + if (!GameData.h5Version) { + if (!GameData.hallConfig.androidPay) { + switch (GameData.agentmode) { + case 2: + if (GameData.TopUpUrl) { + Func.browser(GameData.TopUpUrl + "?agentid=" + GameData.AgentId + "&channelid=" + GameData.ChannelId + "&marketid=" + GameData.marketID + "&playerid=" + C_Player.playerid); + } else { + if (GameData.hallConfig.enablePay) { + var data = {}; + data.agentid = GameData.AgentId; + Net.Send_get_paylist(data); + } + } + break; + case 3: + if (GameData.hallConfig.channelKey) { + try { + //var type = 1; + //if(spid_up==509||spid_up==508){ + //type=2; + //} + pop_intZhifuMadal(GameData.AgentId, GameData.ChannelId, C_Player.playerid, type, GameData.hallConfig.channelKey, 2, 0, C_Player.openid, C_Player.unionid); + //pop_zhifuMadal(); + } catch (e) {} + } else { + + } + break; + } + + + } else { + if (GameData.OS == ConstVal.OS.android) { + //var type = 1; + //if(spid_up==509||spid_up==508){ + //type=2; + //} + Func.ypayType(type); + } + } + } else { + var data = {}; + data.agentid = GameData.AgentId; + Net.Send_get_paylist(data); + } + } + } else { + if (GameData.sysConfig.h5PayUrl) { + var url = GameData.sysConfig.h5PayUrl + "?agentid" + GameData.AgentId + "&channelid" + GameData.ChannelId; + window.location.href = fixUrl(url); + } + + } + } + break; + case 146: + //关闭充值提示 + this.CloseCharge(); + break; + case 233: + //退出房间 + case 3145: + GameUI.closeMainSceneBtnPanel(); + if (Desk.infinite == 0) { + if (C_Player.status == 1) { + GameData.checkType = 2; + GameUI.openCheck("房间仍存在,是否退出?"); + } else { + var data = {}; + data.agentid = GameData.AgentId; + data.gameid = GameData.GameId; + data.playerid = C_Player.playerid; + data.roomcode = Desk.roomcode; + Net.Send_self_exit_room(data); + } + } else { + var data = {}; + data.agentid = GameData.AgentId; + data.gameid = GameData.GameId; + data.playerid = C_Player.playerid; + data.roomcode = Desk.roomcode; + Net.Send_self_exit_room(data); + } + break; + + case 181: + //申请解散房间/退出房间 + if (C_Player.canexit == 1) { //未开局 + if (Desk.infinite == 0) { + + if (C_Player.status == 2) { + var data = {}; + data.agentid = GameData.AgentId; + data.gameid = GameData.GameId; + data.playerid = C_Player.playerid; + data.roomcode = Desk.roomcode; + Net.Send_self_exit_room(data); + } else { + GameUI.CloseSetting(); + var c_msg = ""; + if (GameData.versionState == 1) { + + c_msg = " 是否解散房间??"; + } else { + c_msg = "解散房间不扣" + GameData.roomCardName + ",是否解散?"; + } + GameData.checkType = 1; + GameUI.openCheck(c_msg); + + } + } else { + var data = {}; + data.agentid = GameData.AgentId; + data.gameid = GameData.GameId; + data.playerid = C_Player.playerid; + data.roomcode = Desk.roomcode; + Net.Send_self_exit_room(data); + } + + } else { + var data = {}; + data.agentid = GameData.AgentId; + data.gameid = GameData.GameId; + data.playerid = C_Player.playerid; + data.roomcode = Desk.roomcode; + Net.Send_self_apply_free_room(data); + } + break; + case 182: + //邀请好友 + case 183: + + if(!GameData.sysConfig.appShareH5){ + Func.sharefinend(1, 1, Game_Config.Share.appdownload, Game_Config.Share.title + Desk.videoDes + Game_Config.Share.gameTitle + GameData.shareMsg, Game_Config.Share.gameDescription); + }else{ + Func.sharefinend(1, 1, GameData.sysConfig.appShareH5, Game_Config.Share.title + Desk.videoDes + Game_Config.Share.gameTitle + GameData.shareMsg, Game_Config.Share.gameDescription); + } + + + break; + case 151: + //打开游戏主界面设置 + GameUI.OpenSetting(1); + break; + case 184: + //开始按钮 + //this.StartLoad(); + var data = {}; + data.agentid = GameData.AgentId; + data.gameid = GameData.GameId; + data.playerid = C_Player.playerid; + data.roomcode = Desk.roomcode; + Net.Send_self_makewar(data); + break; + case 185: + //解散 + case 3144: + if (Desk.stage == 0) { + var c_msg = ""; + if (GameData.versionState == 1) { + + c_msg = " 是否解散房间?"; + } else { + c_msg = "解散房间不扣" + GameData.roomCardName + ",是否解散?"; + } + GameData.checkType = 1; + GameUI.closeMainSceneBtnPanel(); + GameUI.openCheck(c_msg); + } else { + var data = {}; + data.agentid = GameData.AgentId; + data.gameid = GameData.GameId; + data.playerid = C_Player.playerid; + data.roomcode = Desk.roomcode; + Net.Send_self_apply_free_room(data); + } + break; + case 201: + //同意解散 + //this.StartLoad(); + var data = {}; + data.agentid = GameData.AgentId; + data.gameid = GameData.GameId; + data.playerid = C_Player.playerid; + data.roomcode = Desk.roomcode; + Net.Send_self_agree_free_room(data); + break; + case 202: + //拒绝解散 + //this.StartLoad(); + var data = {}; + data.agentid = GameData.AgentId; + data.gameid = GameData.GameId; + data.playerid = C_Player.playerid; + data.roomcode = Desk.roomcode; + Net.Send_self_refuse_free_room(data); + break; + case 153: + //打开聊天按钮 + GameUI.OpenChat(); + break; + case 186: + //关闭聊天 + var obj = gameabc_face.getdiv("div204"); + obj.blur(); + obj = null; + this.CloseChat(); + break; + case 205: + //发送聊天 + var text = get_self(204, 7, 0, 0, 0); + var text_bool = Func.strisNull(text); + if (!text_bool) { + var obj = gameabc_face.getdiv("div204"); + obj.blur(); + obj = null; + if (!Func.filter(text)) { + var data = {}; + data.agentid = GameData.AgentId; + data.gameid = GameData.GameId; + data.playerid = C_Player.playerid; + data.roomcode = Desk.roomcode; + GameData.selectSysNotice == true ? data.type = 1 : data.type = 0; + data.text = text; + //if(Game_Config.sysConfig.vipInfinite){ + // data.brType = 1; + //}else{ + // data.brType = 0; + //} + if (GameData.chatInfo) { + data.info = GameData.chatInfo; + data.type = 2; + } + Net.Send_send_text(data); + } else { + this.OpenTips("内容含有敏感词汇请重新输入!", ConstVal.Tips.time); + } + } + break; + case 188: + //点击常用语 + //set_self(188,43,2,0,0); + var obj = gameabc_face.getdiv("div204"); + obj.blur(); + obj = null; + this.SelectMsg(); + break; + case 203: + //点击表情 + var obj = gameabc_face.getdiv("div204"); + obj.blur(); + obj = null; + this.SelectEmotion(); + break; + case 698: + //点击表情 + var obj = gameabc_face.getdiv("div204"); + obj.blur(); + obj = null; + this.SelectHistory(); + break; + case 223: + //投票结果 + this.CloseApplyResult(); + break; + case 224: + //退出程序 + Func.exit(); + break; + case 226: + //关闭房卡提示 + GameUI.Closeupdataroomcard(); + break; + + case 217: + case 218: + //关闭提示 + case 3193: + GameUI.CloseTips(); + break; + case 245: + //确认解散 + switch (GameData.checkType) { + case 1: + //解散房间 + var data = {}; + data.agentid = GameData.AgentId; + data.gameid = GameData.GameId; + data.playerid = C_Player.playerid; + data.roomcode = Desk.roomcode; + Net.Send_self_break_room(data); + break; + case 2: + //退出房间 + var data = {}; + data.agentid = GameData.AgentId; + data.gameid = GameData.GameId; + data.playerid = C_Player.playerid; + data.roomcode = Desk.roomcode; + Net.Send_self_exit_room(data); + break; + case 3: + //投降 + var data = {}; + data.agentid = GameData.AgentId; + data.gameid = GameData.GameId; + data.playerid = C_Player.playerid; + data.roomcode = Desk.roomcode; + data.count = GameData.surrendCount; + Net.Send_beanroom_surrender(data); + break; + case 4: + //删除房间 + console.log(GameData.snrRoomList.roomlist[GameData.snrOptionRoomTag]); + + break; + case 5: + //h5跳转直接进入房间的确定 + var data = {}; + data.agentid = GameData.AgentId; + data.gameid = GameData.GameId; + data.playerid = C_Player.playerid; + data.roomcode = GameData.fromH5GameData.data.roomcode; + Net.Send_self_join_room(data); + break; + case 6://全部添加黑名单 + var data={}; + data.agentid = GameData.AgentId; + data.playerid = C_Player.playerid; + data.type = 6; + Net.Send_optBanList(data); + break; + case 7://设置全部魅力 + var data={}; + data.agentid = GameData.AgentId; + data.playerid = C_Player.playerid; + data.gameid = GameData.GameId; + data.value = GameData.allCharm; + Net.Send_setAllCharm(data); + break; + //删除白名单玩家 + case 8: + this.closeCheck(); + var data={}; + data.agentid = GameData.AgentId; + data.playerid = C_Player.playerid; + data.gameid = GameData.GameId; + data.shortcode = C_Player.shortcode; + data.mode = 2; + data.userid = GameData.whiteList.delPid; + Net.Send_optWhiteList(data); + break; + case 9: + this.closeCheck(); + var data={}; + data.agentid = GameData.AgentId; + data.playerid = C_Player.playerid; + data.shortcode = C_Player.shortcode; + data.gameid = GameData.GameId; + data.mode = 1; + data.userid = GameData.whiteList.delPid; + data.value = GameData.whiteList.inputCharm; + Net.Send_optWhiteList(data); + break; + } + + break; + case 247: + case 242: + case 246: + this.closeCheck(); + break; + case 248: + //协议确认按钮 + GameData.ProtocolIndex = !GameData.ProtocolIndex; + break; + case 249: + //打开协议 + this.OpenProtocol(); + break; + case 250: + case 253: + this.CloseProtocol(); + break; + case 332: + //关闭即时信息 + case 333: + case 335: + GameUI.HideiMessage(); + break; + //case 339://微信公众 + //case 680: + case 76: + GameUI.Open_ewm(); + break; + case 345: + //Func.sharephotourl(1,GameData.wechat_ewm); + Func.sharefinend(1, 3, GameData.wechat_ewm); + break; + case 341: + GameUI.Close_ewm(); + break; + case GameData.telSpid: + Func.callphone(GameData.tel); + break; + case 366: + //粘贴 + GameData.gamepastetext = "mouseup_366"; + var text = Func.gamepastetext(); + if (GameData.userAgent != ConstVal.userAgent.uAgent_3) { + var reg = /[^0-9]/g; + if (text) { + text = text.replace(reg, ""); + //if(reg.test(text)){ + set_self(365, 7, text, 0, 0); + //}else{ + //GameUI.OpenTips("粘贴内容格式不符!",ConstVal.Tips.time); + //} + } + } + break; + + case 367: + var text = get_self(365, 7, 0, 0, 0); + var obj = gameabc_face.getdiv("div365"); + obj.blur(); + obj = null; + //if(text.length == 6){ + GameUI.CloseBind(); + var data = {}; + data.agentid = GameData.AgentId; + data.playerid = C_Player.playerid; + data.invitecode = text; + Net.Send_binding_invitecode(data); + //}else{ + //GameUI.OpenTips("邀请码长度为6位!",ConstVal.Tips.time); + //} + break; + case 235: + + //GameUI.OpenBind(); + var data = {}; + data.agentid = GameData.AgentId; + data.playerid = C_Player.playerid; + data.unionid = C_Player.unionid; + data.openid = C_Player.openid; + Net.Send_get_player_invitecode(data); + break; + case 362: + GameUI.CloseBind(); + break; + case 371: + case 375: + GameUI.hideCal(); + break; + case 46: + case 386: + //关闭支付金额选择界面 + GameUI.ClosePay(); + break; + case 456: + //关闭支付确认界面 + GameUI.CloseCheckPay(); + break; + case 464: + //确认支付 + GameUI.StartLoad(); + var data = {}; + data.body = GameData.payList[GameData.payData[0]].memo; + data.price = GameData.payList[GameData.payData[0]].money; + data.amount = GameData.payList[GameData.payData[0]].amount; + data.productid = GameData.payList[GameData.payData[0]].productid; + data.user = Utl.getMyPlayerid(); + data.type = GameData.payList[GameData.payData[0]].payid; + data.typeplay = GameData.payData[1] + 1; + Func.getGamepay(JSON.stringify(data)); + break; + case 465: + backgameData(); + + break; + case 481: + GameData.visitorClick++; + break; + case 482: + if (GameData.visitorClick >= 5 && Game_Config.Debugger.visitorLogin) { + GameData.visitorClick = 0; + Func.visitorLogin(); + } + break; + case 389: + case 390: + GameUI.closeBroadcastfromplayer(); + break; + case 483: + Logic.openMatchUrl(); + //else{ + //GameUI.OpenTips("暂未开放,敬请期待",ConstVal.Tips.time); + //} + break; + case 484: + GameUI.CloseInfo_hall(); + GameUI.openAuth(); + break; + case 485: + GameUI.closeAuth(); + break; + case 493: + var name_text = get_self(489, 7, 0, 0, 0); + var id_text = get_self(490, 7, 0, 0, 0); + if (name_text.length > 1) { + if (GameData.Validator.isValid(id_text)) { + GameUI.closeAuth(); + GameUI.OpenTips("认证成功!", ConstVal.Tips.time); + } else { + GameUI.OpenTips("身份证信息不正确!", ConstVal.Tips.time); + } + } else { + GameUI.OpenTips("姓名不正确!", ConstVal.Tips.time); + } + break; + case 494: + //点击设置为无限局 + GameData.infClickCount++; + if (GameData.infClickCount >= 5) { + GameData.infMode = 1; + } + break; + case 495: + //设置为正常 + GameData.infMode = 0; + break; + //case 682: + //if(GameData.roomList.length>=1){ + //var data={}; + //data.agentid = GameData.AgentId; + //data.playerid = C_Player.playerid; + //data.gameid = GameData.GameId; + //data.roomcode = GameData.roomList[GameData.roomList.length-1]; + //data.joinmode = 1; + //Net.Send_self_join_room(data); + + //} + //break; + //case 178: + //if(GameData.roomList.length>=2){ + //var data={}; + //data.agentid = GameData.AgentId; + //data.playerid = C_Player.playerid; + //data.gameid = GameData.GameId; + //data.roomcode = GameData.roomList[GameData.roomList.length-2]; + //data.joinmode = 1; + //Net.Send_self_join_room(data); + + //} + //break; + //case 179: + //if(GameData.roomList.length>=3){ + //var data={}; + //data.agentid = GameData.AgentId; + //data.playerid = C_Player.playerid; + //data.gameid = GameData.GameId; + //data.roomcode = GameData.roomList[GameData.roomList.length-3]; + //data.joinmode = 1; + //Net.Send_self_join_room(data); + + //} + //break; + case 512: + case 3143: + Func.gameCopytext(Desk.roomcode); + GameUI.OpenTips("复制成功!", ConstVal.Tips.time); + break; + case 513: + //GameData.checkType = 3; + //GameUI.openCheck("将扣除"+Desk.starCount+"个"+GameData.starName+",确定逃跑?"); + //Utl.openInputPanel("请输入投降扣除数量(底翻)",function(_data){ + //if(_data <= Desk.starCount){ + //GameData.surrendCount = _data; + //Utl.closeInputPanel(); + //GameData.checkType = 3; + //GameUI.openCheck("将扣除"+_data+GameData.starName+",确定逃跑?"); + //}else{ + //GameUI.OpenTips("输入数量大于最大值"+Desk.starCount+"!",ConstVal.Tips.time); + //} + //}); + GameUI.closeMainSceneBtnPanel(); + Utl.openInputPanel("请输入投降扣除数量(底翻)", function(_data) { + if (_data <= C_Player.bean) { + GameData.surrendCount = _data; + Utl.closeInputPanel(); + GameData.checkType = 3; + GameUI.openCheck("将扣除" + _data + GameData.starName + ",确定逃跑?"); + } else { + GameUI.OpenTips("输入大于您拥有的" + _data + GameData.starName + "数:" + C_Player.bean + "!", ConstVal.Tips.time); + } + }); + break; + case 514: + Logic.pasteRoomCode(); + break; + case 515: + var data = {}; + data.agentid = GameData.AgentId; + data.playerid = C_Player.playerid; + data.gameid = GameData.GameId; + data.roomcode = Desk.roomcode; + Net.Send_player_prepare(data); + break; + case ConstVal.worldRoom.f_sp_1: + //点击系统房间 + var up_id = ifast_check_add(spid_up, upx, upy); + if (!GameData.worldRoomSysSlide) { + if (up_id >= ConstVal.worldRoom.bg_sp_tag_1 && up_id < ConstVal.worldRoom.top_sp_tag_1) { + //console.log(GameData.worldRoomSys[up_id - ConstVal.worldRoom.bg_sp_tag_1]); + var data = {}; + data.agentid = GameData.AgentId; + data.playerid = C_Player.playerid; + data.gameid = GameData.GameId; + data.type = GameData.worldRoomSys[up_id - ConstVal.worldRoom.bg_sp_tag_1].type; + data.roomtype = GameData.worldRoomSys[up_id - ConstVal.worldRoom.bg_sp_tag_1].roomtype; + Net.Send_quick_enter_share_room(data); + } + + } + break; + case ConstVal.worldRoom.f_sp_2: + //点击玩家房间 + var up_id = ifast_check_add(spid_up, upx, upy); + if (!GameData.worldRoomPlySlide) { + if (up_id >= ConstVal.worldRoom.bg_sp_tag_2 && up_id < ConstVal.worldRoom.top_sp_tag_2) { + console.log(GameData.worldRoomPly[up_id - ConstVal.worldRoom.bg_sp_tag_2]); + var data = {}; + data.agentid = GameData.AgentId; + data.playerid = C_Player.playerid; + data.gameid = GameData.GameId; + data.roomcode = GameData.worldRoomPly[up_id - ConstVal.worldRoom.bg_sp_tag_2].roomcode; + data.joinmode = 0; + Net.Send_self_join_room(data); + } + + } + break; + case ConstVal.rankList.f_spid: + //点击玩家房间 + var up_id = ifast_check_add(spid_up, upx, upy); + if (!GameData.rankListSlide) { + if (up_id >= ConstVal.rankList.bg_tag && up_id < ConstVal.rankList.badge_tag) { + //console.log(GameData.rankList[up_id - ConstVal.rankList.bg_tag]); + GameUI.clickRankList(up_id - ConstVal.rankList.bg_tag); + } + + } + break; + case ConstVal.vipRoomList1.f_spid: + // + var up_id = ifast_check_add(spid_up, upx, upy); + if (!GameData.vipRoomPageOne.slide) { + if (up_id >= ConstVal.vipRoomList1.bg_tag && up_id < ConstVal.vipRoomList1.title_tag) { + var indx = up_id - ConstVal.vipRoomList1.bg_tag; + GameData.vipRoomCode = GameData.vipRoomData[indx].shortCode; + console.log("进入", indx, GameData.vipRoomCode); + GameUI.goVipPageTwo(); + } +/* + if(up_id>=ConstVal.vipRoomList1.title_tag&&up_id=ConstVal.vipRoomList1.code_tag&&up_id=ConstVal.vipRoomList1.owner_tag&&up_id=ConstVal.vipRoomList1.count_tag&&up_id= ConstVal.vipRoomList1.del_tag && up_id < ConstVal.vipRoomList1.enter_tag) { + var indx = up_id - ConstVal.vipRoomList1.del_tag; + //GameData.vipRoomCode = GameData.vipRoomShortList[indx]; + GameData.vipRoomCode = GameData.vipRoomData[indx].shortCode; + console.log("删除", indx, GameData.vipRoomCode); + Logic.delVipRoom(GameData.vipRoomShortList[indx]); + GameUI.setVipRoomListData(GameData.vipRoomData); + GameUI.updateVipRoomList(); + + } + if (up_id >= ConstVal.vipRoomList1.enter_tag) { + var indx = up_id - ConstVal.vipRoomList1.enter_tag; + var data = {}; + data.agentid = GameData.AgentId; + data.playerid = C_Player.playerid; + data.gameid = GameData.GameId; + data.roomcode = GameData.vipRoomData[indx].shortCode; + data.joinmode = 0; + Net.Send_self_join_room(data); + + } + + } + break; + case ConstVal.vipRoomList2.f_spid: + // + var up_id = ifast_check_add(spid_up, upx, upy); + if (!GameData.vipRoomPageTwo.slide) { + if (up_id >= ConstVal.vipRoomList2.bg_tag && up_id < ConstVal.vipRoomList2.code_tag) { + var indx = up_id - ConstVal.vipRoomList2.bg_tag; + console.log("进入", GameData.vipRoomPageTwo.data.roomcodes.roomlist[indx]); + GameData.vipRoomJump = true; + var data = {}; + data.agentid = GameData.AgentId; + data.playerid = C_Player.playerid; + data.gameid = GameData.GameId; + data.roomcode = GameData.vipRoomPageTwo.data.roomcodes.roomlist[indx]; + data.joinmode = 0; + Net.Send_self_join_room(data); + //GameUI.goVipPageTwo(); + } + if (up_id >= ConstVal.vipRoomList2.code_tag && up_id < ConstVal.vipRoomList2.count_tag) { + var indx = up_id - ConstVal.vipRoomList2.code_tag; + console.log("进入", GameData.vipRoomPageTwo.data.roomcodes.roomlist[indx]); + //GameUI.goVipPageTwo(); + GameData.vipRoomJump = true; + var data = {}; + data.agentid = GameData.AgentId; + data.playerid = C_Player.playerid; + data.gameid = GameData.GameId; + data.roomcode = GameData.vipRoomPageTwo.data.roomcodes.roomlist[indx]; + data.joinmode = 0; + Net.Send_self_join_room(data); + } + if (up_id >= ConstVal.vipRoomList2.count_tag) { + var indx = up_id - ConstVal.vipRoomList2.count_tag; + console.log("进入", GameData.vipRoomPageTwo.data.roomcodes.roomlist[indx]); + GameData.vipRoomJump = true; + var data = {}; + data.agentid = GameData.AgentId; + data.playerid = C_Player.playerid; + data.gameid = GameData.GameId; + data.roomcode = GameData.vipRoomPageTwo.data.roomcodes.roomlist[indx]; + data.joinmode = 0; + Net.Send_self_join_room(data); + //GameUI.goVipPageTwo(); + } + + + + } + break; + + case 519: + //关闭 + GameUI.closeWorldRoom(); + break; + case 520: + //刷新 + var data = {}; + data.agentid = GameData.AgentId; + data.playerid = C_Player.playerid; + data.gameid = GameData.GameId; + Net.Send_get_share_room(data); + break; + case 521: + //快速加入 + var data = {}; + data.agentid = GameData.AgentId; + data.playerid = C_Player.playerid; + data.gameid = GameData.GameId; + data.type = 1; + data.roomtype = null; + Net.Send_quick_enter_share_room(data); + break; + case 568: + //获取星星争霸场 + if (GameData.hallConfig.worldRoomList) { + var data = {}; + data.agentid = GameData.AgentId; + data.playerid = C_Player.playerid; + data.gameid = GameData.GameId; + Net.Send_get_share_room(data); + } else { + GameUI.OpenTips("暂未开放,敬请期待", ConstVal.Tips.time); + } + break; + case 569: + var data = {}; + data.agentid = GameData.AgentId; + data.playerid = C_Player.playerid; + data.gameid = GameData.GameId; + data.roomcode = Desk.roomcode; + Net.Send_share_room(data); + break; + case 570: + GameUI.goBoardPageOne(); + break; + case 571: + GameUI.goBoardPageTwo(); + break; + case 572: + GameUI.goBoardPageThree(); + break; + case 576: + var url = ""; + switch (GameData.noticePage) { + case 0: + url = GameData.advertInfo_0.url; + break; + case 1: + url = GameData.advertInfo_1.url; + break; + case 2: + url = GameData.advertInfo_2.url; + break; + } + Func.browser(url); + break; + case 579: + //case 577: + GameUI.closeSeniorOptions(); + break; + case ConstVal.snrRoomList.f_spid: + // + var up_id = ifast_check_add(spid_up, upx, upy); + if (!GameData.snrRoomListSlide) { + //进入 + if (up_id >= ConstVal.snrRoomList.bg_tag && up_id < ConstVal.snrRoomList.rcode_bg_tag) { + GameData.snrOptionRoomTag = up_id - ConstVal.snrRoomList.bg_tag; + var data = {}; + data.agentid = GameData.AgentId; + data.playerid = C_Player.playerid; + data.gameid = GameData.GameId; + data.roomcode = GameData.snrRoomList.roomlist[GameData.snrOptionRoomTag]; + data.joinmode = 0; + Net.Send_self_join_room(data); + } + if (up_id >= ConstVal.snrRoomList.rcode_tag && up_id < ConstVal.snrRoomList.close_tag) { + GameData.snrOptionRoomTag = up_id - ConstVal.snrRoomList.rcode_tag; + var data = {}; + data.agentid = GameData.AgentId; + data.playerid = C_Player.playerid; + data.gameid = GameData.GameId; + data.roomcode = GameData.snrRoomList.roomlist[GameData.snrOptionRoomTag]; + data.joinmode = 0; + Net.Send_self_join_room(data); + } + if (up_id >= ConstVal.snrRoomList.video_tag) { + GameData.snrOptionRoomTag = up_id - ConstVal.snrRoomList.video_tag; + var data = {}; + data.agentid = GameData.AgentId; + data.playerid = C_Player.playerid; + data.gameid = GameData.GameId; + data.roomcode = GameData.snrRoomList.roomlist[GameData.snrOptionRoomTag]; + data.joinmode = 0; + Net.Send_self_join_room(data); + } + //修改 + //if(up_id>=ConstVal.snrRoomList.update_tag&&up_id=ConstVal.snrRoomList.switch_tag&&up_id 0) { + + var data = {}; + data.agentid = GameData.AgentId; + data.playerid = C_Player.playerid; + data.gameid = GameData.GameId; + data.roomcode = RoomNum; + Net.Send_self_join_room(data); + } + break; + case 626: + GameData.snrOption.profit = GameUI.Mem.snrOption.number; + var data = {}; + data.agentid = GameData.AgentId; + data.playerid = C_Player.playerid; + data.gameid = GameData.GameId; + //if(GameData.snrOptionMode == 0){ + data.tea = GameUI.Mem.snrOption.number + GameUI.Mem.snrOption.sysRebate; + //}else{ + //data.tea = 0; + //} + data.infinite = GameUI.Mem.snrOption.infinite; + if (Game_Config.sysConfig.vipInfinite) { + data.infinite = 1; + } + data.roomtype = GameData.snrOptionRoomtype; + data.videoConfig = GameUI.Mem.snrOption.videoConfig; + if (Game_Config.sysConfig.vipInfinite) { + data.videoConfig = null; + } + + //data.forbidSelect = GameUI.Mem.snrOption.forbidSelect; + + data.rebateLimit = GameUI.Mem.snrOption.rebateLimit; + data.rebateType = GameUI.Mem.snrOption.rebateType; + Net.Send_advanced_createroom(data); + break; + case 604: + case 3233: + if (GameData.hallConfig.rankList == 1) { + GameUI.openRankList(); + } else if (GameData.hallConfig.rankList == 2) { + var data = {}; + data.agentid = GameData.AgentId; + data.gameid = GameData.GameId; + Net.Send_get_treasurelist(data); + } + break; + case 605: + GameUI.closeRankList(); + break; + case 652: + //分享微信好友 + { + var vText = ""; + if (GameUI.Mem.snrOption.videoConfig) { + vText = "*【视频房】"; + } + + Func.sharefinend(1, 1, Game_Config.Share.appdownload, Game_Config.Share.title + vText + "微房号:" + GameData.snrRoomList.shortcode, Game_Config.Share.description); + + } + break; + case 653: + //分享微信朋友圈 + { + + + var isBean = 0; + if (Game_Modify.getRoomMode) { + isBean = Game_Modify.getRoomMode(GameData.snrRoomList.roomtype); + } + switch (isBean) { + case 1: + if (GameData.snrRoomList.roomlist.length > 0) { + var data = {}; + data.agentid = GameData.AgentId; + data.playerid = C_Player.playerid; + data.gameid = GameData.GameId; + data.roomlist = GameData.snrRoomList.roomlist; + data.roomtype = GameData.snrRoomList.roomtype; + data.shareType = 1; + Net.Send_share_room(data); + } else { + GameUI.OpenTips("没有已创建房间,无法分享!", ConstVal.Tips.time); + } + break; + default: + GameUI.OpenTips("仅金币房间支持分享到金币场!", ConstVal.Tips.time); + break; + } + + } + break; + case 654: + GameUI.closeShareImg(); + break; + case 655: + GameUI.HideImg(); + break; + case 656: + GameUI.closeMainSceneBtnPanel(); + Func.appDownload(Game_Config.Share.appdownload); + break; + case 3004: + case 659: + GameUI.closeInputPanel(); + break; + case 3005: + case 3011: + GameUI.hideNeighbor(); + break; + case 3007: + case 3008: + case 3009: + case 3010: + GameUI.OpenTips("邀请成功!", ConstVal.Tips.time); + break; + case 3012: + case 3013: + GameUI.closeTips2(); + break; + case 3014: + GameUI.closeMainSceneBtnPanel(); + var data = {}; + data.agentid = GameData.AgentId; + data.playerid = C_Player.playerid; + data.gameid = GameData.GameId; + data.roomcode = Desk.roomcode; + Net.Send_change_room(data); + break; + case 3016: + //商城 + Logic.jumpToStore(); + break; + case 3017: + //背包 + Logic.jumpToBag(); + break; + case 3018: + //活动 + Logic.jumpToAct(); + break; + case 3019: + // + GameUI.closeWorldRoom(); + Game_Modify.OpenCreateRoom(); + break; + case 3034: + case 3035: + GameData.wareHouse.safeInputType = spid_up - 3033; + GameUI.updateWareHouseCheckBox(); + break; + case 3059: + case 3060: + GameUI.switchWareHousePage(spid_up - 3058, true); + break; + case 3029: + case 97: + GameUI.closeWareHouse(); + break; + case 3067: + //初始化密码 + GameUI.selectWareHouseInputType(1); + break; + case 3068: + //初始化密码二次输入 + GameUI.selectWareHouseInputType(2); + break; + case 3038: + //存入取出数量 + GameUI.selectWareHouseInputType(3); + break; + case 3039: + //存入取出密码 + GameUI.selectWareHouseInputType(4); + break; + case 3087: + //赠送id + GameUI.selectWareHouseInputType(5); + break; + case 3088: + //赠送数量 + GameUI.selectWareHouseInputType(6); + break; + case 3089: + //赠送密码 + GameUI.selectWareHouseInputType(7); + break; + case 3057: + GameUI.openWareHouse(true); + break; + case 3075: + case 3076: + GameData.wareHouse.pInputType = spid_up - 3074; + GameUI.updateWareHouseCheckBox(); + break; + case 3096: + if(String(GameData.wareHouse.pInputId).length==6){ + var data={}; + set_self(3081,1,170,0,0); + set_self(3082,7,'',0,0); + data.agentid = GameData.AgentId; + data.playerid = GameData.wareHouse.pInputId; + Net.Send_query_player2(data); + }else{ + GameUI.OpenTips("玩家ID输入不正确",ConstVal.Tips.time); + } + //GameData.wareHouse.pId = 123456; + //GameData.wareHouse.pImg = C_Player.avatar; + //GameData.wareHouse.pNickName = "afeafefa"; + //GameUI.updateWareHousePlayerInfo(); + break; + case 3043: + console.log(GameData.wareHouse); + if(GameData.wareHouse.page == 1){ + console.log(GameData.wareHouse.selectType); + switch (GameData.wareHouse.selectType) { + case 1: + case 2: + //设置初始密码 + console.log("设置初始密码"); + if (GameData.wareHouse.initPassWord1 == GameData.wareHouse.initPassWord2) { + if (GameData.wareHouse.initPassWord1 != -1 && String(GameData.wareHouse.initPassWord1).length != 0) { + + var data = {}; + data.agentid = GameData.AgentId; + data.playerid = C_Player.playerid; + data.unionid = C_Player.unionid; + data.password = String(GameData.wareHouse.initPassWord1); + console.log("输入合法"); + console.log(data); + Net.Send_set_bankpwd(data); + } + } + break; + case 3: + case 4: + //保险箱存取 + console.log("存取" + GameData.wareHouse.safeInputType); + console.log("数量" + GameData.wareHouse.safeInputCount); + console.log("密码" + GameData.wareHouse.safePassWord); + if (GameData.wareHouse.safeInputCount == -1 || String(GameData.wareHouse.safeInputCount).length == 0) { + GameUI.OpenTips("输入数量为空!", ConstVal.Tips.time); + break; + } else { + if (GameData.wareHouse.safePassWord == -1 || String(GameData.wareHouse.safePassWord).length == 0) { + GameUI.OpenTips("密码不能为空!", ConstVal.Tips.time); + } else { + var data = {}; + data.agentid = GameData.AgentId; + data.playerid = C_Player.playerid; + data.mode = GameData.wareHouse.safeInputType - 1; + data.password = String(GameData.wareHouse.safePassWord); + + data.count = Number(GameData.wareHouse.safeInputCount); + + if (GameData.wareHouse.safeInputType == 1) { //存入需要扣除默认赠送的金币 + if (C_Player.bean < 0) { + data.count = 0; + GameData.wareHouse.safeInputCount = 0; + GameUI.updateWareHouseInput(); + } else { + + if (C_Player.bean < GameData.initBean) { + GameUI.OpenTips("您身上必须保留"+GameData.initBean+GameData.starName+"!",ConstVal.Tips.time); + data.count = 0; + GameData.wareHouse.safeInputCount = 0; + GameUI.updateWareHouseInput(); + } else { + if (C_Player.bean - GameData.wareHouse.safeInputCount <= GameData.initBean) { + GameUI.OpenTips("您身上必须保留"+GameData.initBean+GameData.starName+"!",ConstVal.Tips.time); + data.count = C_Player.bean - GameData.initBean; + GameData.wareHouse.safeInputCount = C_Player.bean - GameData.initBean; + GameUI.updateWareHouseInput(); + } + } + } + + + } + //console.log(data); + Net.Send_change_star(data); + } + + } + + + + break; + } + }else{ + + switch (GameData.wareHouse.selectType) { + case 1: + case 2: + //设置初始密码 + console.log("设置初始密码"); + if (GameData.wareHouse.initPassWord1 == GameData.wareHouse.initPassWord2) { + if (GameData.wareHouse.initPassWord1 != -1 && String(GameData.wareHouse.initPassWord1).length != 0) { + + var data = {}; + data.agentid = GameData.AgentId; + data.playerid = C_Player.playerid; + data.unionid = C_Player.unionid; + data.password = String(GameData.wareHouse.initPassWord1); + console.log("输入合法"); + console.log(data); + Net.Send_set_bankpwd(data); + } + } + break; + default: + if(String(GameData.wareHouse.pInputId).length != 6){ + GameUI.OpenTips("玩家ID为6位!",ConstVal.Tips.time); + }else{ + var data={}; + data.agentid = GameData.AgentId; + data.count = GameData.wareHouse.pInputCount; + data.playerid = C_Player.playerid; + data.password = GameData.wareHouse.pInputPassWord; + data.toPlayerid = GameData.wareHouse.pInputId; + data.gameid = GameData.GameId; + Net.Send_giveCoin(data); + } + break; + } + } + + + break; + case 3097: + Utl.openInputPanel("输入范围为 " + GameUI.Mem.snrOption.min + "~" + GameUI.Mem.snrOption.max, snrInputCallback); + break; + case 3100: + GameUI.Mem.snrOption.infinite == 1 ? GameUI.Mem.snrOption.infinite = 0 : GameUI.Mem.snrOption.infinite = 1; + break; + case 3166: + GameUI.Mem.snrOption.rebateType = 1; + break; + case 3167: + GameUI.Mem.snrOption.rebateType = 0; + break; + case 3102: + case 3105: + case 3106: + if (!GameData.imgAdIsSlide) { + //console.log(GameData.menuNotice["advert"+GameData.noticePage]) + //switch(GameData.noticePage){ + //case 0: + //console.log(GameData.menuNotice.advert0); + //break; + //case 1: + //console.log(GameData.menuNotice.advert1); + //break; + //case 2: + //console.log(GameData.menuNotice.advert2); + //break; + //} + if (GameData.menuNotice["advert" + GameData.noticePage].imgAdUrl) { + Func.browser(GameData.menuNotice["advert" + GameData.noticePage].imgAdUrl); + //Func.OpenurlTitleData(GameData.menuNotice["advert"+GameData.noticePage].imgAdUrl,"",""); + } + + } + break; + case 3103: + if (GameData.firstConnect_Succ && GameData.getJSONState && GameData.LoadCount == 100) { + if (GameData.adTimer) { + window.clearInterval(GameData.adTimer); + GameData.adTimer = null; + } + set_self(1, 57, 0, 0, 0); + GameUI.JumpWxAuth(); + + } + break; + case 3107: + GameUI.SelectSysNotice(); + break; + case 3111: + if (!Game_Config.sysConfig.vipInfinite) { + GameData.selectSysNotice = !GameData.selectSysNotice; + } else { + GameData.selectSysNotice = true; + } + if (!GameData.selectSysNotice) { + Func.setInput(204, Game_Config.Chat.LimitLength); + } else { + Func.setInput(204, ConstVal.sysNotice.limit); + } + + break; + case 3120: + //更多 + GameUI.openPallet(); + break; + case 3122: + GameUI.closePallet(); + break; + case 92: + GameUI.goWorldRoom1(); + break; + case 93: + GameUI.goWorldRoom2(); + break; + case 99: + GameUI.showMyRoomList(); + break; + case 103: + GameUI.hideMyRoomList(); + break; + case 98: + var up_id = ifast_check_add(spid_up, upx, upy); + if (up_id >= ConstVal.myRoomList.bgTag && up_id < ConstVal.myRoomList.roomCodeTag) { + console.log(GameData.roomList[up_id - ConstVal.myRoomList.bgTag]); + var data = {}; + data.agentid = GameData.AgentId; + data.playerid = C_Player.playerid; + data.gameid = GameData.GameId; + data.roomcode = GameData.roomList[up_id - ConstVal.myRoomList.bgTag]; + data.joinmode = 1; + Net.Send_self_join_room(data); + } + break; + case 106: + Func.accreditlogin(1); + break; + case 107: + if (get_self(108, 37, 0, 0, 0)) { + GameUI.closeMainSceneBtnPanel(); + } else { + GameUI.openMainSceneBtnPanel(); + } + + break; + case 3123: + GameUI.closeMainSceneBtnPanel(); + break; + case 284: + if (get_self(109, 37, 0, 0, 0)) { + GameUI.closeRoomInfo(); + } else { + GameUI.openRoomInfo(); + } + break; + case 109: + case 3124: + GameUI.closeRoomInfo(); + break; + case 3141: + if (get_self(109, 37, 0, 0, 0)) { + GameUI.closeRoomInfo(); + } else { + GameUI.openRoomInfo(); + } + break; + case 187: + GameData.clickChat++; + if (GameData.clickChat % 3 == 0 && GameData.isService) { + GameData.clickChat = 0; + GameData.communionHistory = []; + GameUI.clearCommunion(); + GameUI.CloseChat(); + GameUI.OpenChat(); + + + } + break; + case 3126: + GameUI.stopRecord(); + break; + case 3133: + GameUI.clickSnrVideo(3133); + break; + case 3164: + GameUI.clickSnrRoomState(); + break; + case 3139: + //官方试玩 + if (GameData.sysConfig.ofcShortCode) { + var data = {}; + data.agentid = GameData.AgentId; + data.playerid = C_Player.playerid; + data.gameid = GameData.GameId; + data.roomcode = GameData.sysConfig.ofcShortCode; + Net.Send_self_join_room(data); + } else { + GameUI.OpenTips("暂未开放,敬请期待", ConstVal.Tips.time); + } + break; + case 3140: + case 3235: + //改成游戏内管理好友 + if (GameData.sysConfig.whiteListManager == 1) { + var data = {}; + data.agentid = GameData.AgentId; + data.playerid = C_Player.playerid; + data.gameid = GameData.GameId; + Net.Send_getPlayerWhiteList(data); + }else{ + if (GameData.sysConfig.managerUrl) { + Func.OpenurlTitleData(GameData.sysConfig.managerUrl+"?agentid="+GameData.AgentId+"&channelid=" + +GameData.ChannelId+"&__HTML_VERSION__=3", + "管理后台",""); + Func.browser(GameData.sysConfig.managerUrl + "?agentid=" + GameData.AgentId + "&channelid=" + GameData.ChannelId + "&playerid=" + C_Player.playerid + "&openid=" + C_Player.openid + "&unionid=" + C_Player.unionid); + } + } + + break; + case 3149: + if (get_self(3148, 37)) { + GameUI.hideOwnerNotice(); + } else { + //if(Logic.getVisibleNote()){ + GameUI.showOwnerNotice(Desk.ownerNotice); + //} + + } + + break; + case 3155: + var text = get_self(3154, 7); + + if (GameData.textCallback) { + GameData.textCallback(text); + GameData.textCallback = null; + } + GameUI.closeTextInput(); + break; + case 3159: + + GameUI.closeTextInput(); + break; + case 3156: + GameUI.openTextInput(C_Player.sign, setSignCallBack, 20); + break; + case 3150: + case 3148: + GameUI.hideOwnerNotice(); + break; + case 3158: + GameUI.closeSeniorOptions(); + break; + case 679: + GameUI.openVipRoomList(true); + break; + case 3182: + GameUI.closeVipRoomList(); + break; + case 3175: + GameUI.goVipPageOne(); + break; + case 3196: + case 3197: + Utl.openInputPanel("请输入您要设置的值",playeridInputCallBack); + break; + case 3194: + var txt = get_self(3197,7,0,0,0); + if(txt.length == 6){ + var data={}; + data.agentid = GameData.AgentId; + data.playerid = C_Player.playerid; + data.optId = txt; + data.type = 3; + Net.Send_optBanList(data); + }else{ + GameUI.OpenTips("请输入正确的玩家ID!",ConstVal.Tips.time); + } + break; + case 3195: + var txt = get_self(3197,7,0,0,0); + if(txt.length == 6){ + var data={}; + data.agentid = GameData.AgentId; + data.playerid = C_Player.playerid; + data.optId = txt; + data.type = 4; + Net.Send_optBanList(data); + }else{ + GameUI.OpenTips("请输入正确的玩家ID!",ConstVal.Tips.time); + } + break; + case 3214: + //GameUI.openBlackList(); + var data={}; + data.agentid = GameData.AgentId; + data.playerid = C_Player.playerid; + data.type = 1; + Net.Send_optBanList(data); + break; + case 3205: + Utl.openInputPanel("请输入玩家ID(长度六位)",blackInputCallBack); + break; + case 3203: + case 3200: + GameUI.closeBlackList(); + break; + case 3206://添加 + var txt = get_self(3212,7,0,0,0); + if(txt.length == 6){ + var data={}; + data.agentid = GameData.AgentId; + data.gameid = GameData.GameId; + data.playerid = C_Player.playerid; + data.optId = txt; + if(GameData.blackList.breakRoom){ + data.breakRoom = 1; + }else{ + data.breakRoom = 0; + } + data.type = 3; + Net.Send_optBanList(data); + }else{ + GameUI.OpenTips("请输入正确的玩家ID!",ConstVal.Tips.time); + } + break; + case 3216://删除 + var txt = get_self(3212,7,0,0,0); + if(txt.length == 6){ + var data={}; + data.agentid = GameData.AgentId; + data.playerid = C_Player.playerid; + data.optId = txt; + data.type = 4; + Net.Send_optBanList(data); + }else{ + GameUI.OpenTips("请输入正确的玩家ID!",ConstVal.Tips.time); + } + break; + case ConstVal.blackList.f_spid: + // + var up_id = ifast_check_add(spid_up, upx, upy); + if (!GameData.blackList.slide) { + if (up_id >= ConstVal.blackList.del_tag) { + GameData.blackList.selectTag = up_id - ConstVal.blackList.del_tag; + //console.log(GameData.blackList.data[GameData.blackList.selectTag]); + var data={}; + data.agentid = GameData.AgentId; + data.playerid = C_Player.playerid; + data.optId = GameData.blackList.data[GameData.blackList.selectTag]; + data.type = 4; + Net.Send_optBanList(data); + } + } + break; + case ConstVal.whiteList.f_spid: + // + var up_id = ifast_check_add(spid_up, upx, upy); + if (!GameData.whiteList.slide) { + if (up_id >= ConstVal.whiteList.del_tag) { + GameData.whiteList.selectTag = up_id - ConstVal.whiteList.del_tag; + //console.log(GameData.whiteList.data[GameData.whiteList.selectTag]); + var pinfo = GameData.whiteList.data[GameData.whiteList.selectTag]; + GameData.whiteList.delPid = pinfo[0]; + GameData.checkType = 8; + GameUI.openCheck("是否删除"+pinfo[0]+",当前魅力值:"+pinfo[2]); + } + if (up_id >= ConstVal.whiteList.bg_tag && up_id < ConstVal.whiteList.id_tag) { + GameData.whiteList.selectTag = up_id - ConstVal.whiteList.bg_tag; + //console.log(GameData.whiteList.data[GameData.whiteList.selectTag]); + GameUI.searchWhiteList(GameData.whiteList.data[GameData.whiteList.selectTag][0]); + } + } + break; + case 3281: + if(GameData.whiteList.inputId){ + GameData.checkType = 8; + GameData.whiteList.delPid = GameData.whiteList.inputId; + GameUI.openCheck("是否删除"+GameData.whiteList.inputId+",当前魅力值:"+GameData.whiteList.inputCharm); + }else{ + GameUI.OpenTips("请输入正确的玩家ID!",ConstVal.Tips.time); + } + break; + case 3276: + if(GameData.whiteList.inputId){ + GameData.checkType = 9; + GameData.whiteList.delPid = GameData.whiteList.inputId; + GameUI.openCheck("是否添加/修改"+GameData.whiteList.inputId+",魅力值:"+GameData.whiteList.inputCharm); + }else{ + GameUI.OpenTips("请输入正确的玩家ID!",ConstVal.Tips.time); + } + break; + case 3270: + case 3274: + GameUI.closeWhiteList(); + break; + case 3287: + Utl.openInputPanel("请输入玩家ID(长度六位)",whiteInputCallBack3); + break; + case 3275: + Utl.openInputPanel("请输入玩家ID(长度六位)",whiteInputCallBack1); + break; + case 3282: + Utl.openInputPanel("请输入魅力值",whiteInputCallBack2); + break; + case 3289: + GameUI.searchWhiteList(GameData.whiteList.searchId); + break; + case 3217: + //粘贴 + GameData.gamepastetext = "mouseup_3217"; + var text = Func.gamepastetext(); + if (GameData.userAgent != ConstVal.userAgent.uAgent_3) { + var reg = /[^0-9]/g; + if (text) { + text = text.replace(reg, ""); + GameData.inputPanelData = text; + GameUI.setNumberImage(3003, GameData.inputPanelData, 51); + GameUI.adaptPositionSpid(3003, 3002); + } + } + break; + case 3210: + GameData.checkType = 6; + GameUI.openCheck("将所有白名单玩家添加至黑名单?"); + break; + case 3215: + GameData.checkType = 7; + GameUI.openCheck("将所有白名单玩家"+GameData.sysConfig.charmName+"设为"+GameData.allCharm+"?"); + break; + case 3199: + //GameUI.openVipRank(); + var data={}; + data.agentid = GameData.AgentId; + data.playerid = C_Player.playerid; + data.shortcode = GameData.vipRoomCode; + Net.Send_getShortCodeRankList(data); + break; + case 3222: + case 3218: + GameUI.closeVipRank(); + break; + case 3231: + case 3232: + var data={}; + data.agentid = GameData.AgentId; + data.limit = GameData.sysConfig.vipRankLimit; + Net.Send_getVipRankList(data); + break; + case 3236: + Utl.openInputPanel("请输入免收值",rebateLimitCallback); + break; + case 3240: + //打开加入房间 + GameUI.closeVipRoomList(); + GameUI.OpenJoinRoom(); + break; + case 3243: + //Utl.openTextInput(get_self(3247,7),phoneNumberCallback); + Utl.openInputPanel("请输入手机号",phoneNumberCallback,true); + break; + case 3244: + //Utl.openTextInput(get_self(3248,7),phoneCodeCallback); + Utl.openInputPanel("请输入验证码",phoneCodeCallback,true); + break; + case 3251: + case 3241: + GameUI.closePhoneBind(); + break; + case 3255: + Func.deviceLogin(); + break; + case 3253: + switch(GameData.phoneType){ + case 1://手机号登录 + if(GameData.phoneNumber && GameData.phoneCode){ + // Func.deviceLogin(GameData.phoneNumber,GameData.phoneCode); + Func.phoneLogin(GameData.phoneNumber,GameData.phoneCode); + GameUI.closePhoneBind(); + }else{ + GameUI.OpenTips("手机号与验证码均不能为空!"); + } + break; + case 2://手机号绑定 + if(GameData.phoneNumber && GameData.phoneCode){ + var data={}; + data.agentid = GameData.AgentId; + data.playerid = C_Player.playerid; + data.phonenum = GameData.phoneNumber; + data.smmcode = GameData.phoneCode; + Net.Send_binding_phone(data); + }else{ + GameUI.OpenTips("手机号与验证码均不能为空!"); + } + break; + } + + break; + case 3254: + GameData.phoneType = 1; + GameUI.openPhoneBind(); + break; + case 3256: + if(C_Player.tel){ + GameUI.OpenTips("您已绑定手机号:"+C_Player.tel,ConstVal.Tips.time); + }else{ + GameData.phoneType = 2; + GameUI.openPhoneBind(); + } + break; + case 3245: + if(GameData.phoneCodeTime <= 0 && GameData.phoneNumber){ + GameUI.OpenTips("请通过相关渠道获取"); + // var data = {}; + // data.agentid = GameData.AgentId; + // data.phonenum = GameData.phoneNumber; + // Net.Send_send_phone_code_wechat(data); + // Logic.savePhoneCode(GameData.phoneNumber,""); + // GameUI.closePhoneBind(); + // GameUI.openPhoneBind(); + } + break; + case 3258: + //GameUI.clickSnrFobid(); + var data={}; + data.agentid = GameData.AgentId; + data.playerid = C_Player.playerid; + data.gameid = GameData.GameId; + var fData = 1; + if(GameData.snrRoomList.forbidSelect){ + fData = 0; + } + data.forbidSelect = fData; + Net.Send_setVipForbidSelect(data); + break; + case 3260: + GameData.blackList.breakRoom = !GameData.blackList.breakRoom; + break; + case 3264: + GameData.feedMode = 2; + GameUI.OpenFeedback(true); + break; + case 3265: + GameData.gamepastetext = "mouseup_3265"; + var c_text = Func.gamepastetext(); + if(c_text){ + set_self(551,7,c_text,0,0); + } + break; + case 3266: + var text = GameUI.getFeedbackText(); + var bTemp = Func.strisNull(text); + if (!bTemp) { + GameUI.CloseFeedback(); + //发送cdkey + var data= {}; + data.agentid = GameData.AgentId; + data.playerid = C_Player.playerid; + data.cardno = text; + Net.Send_topup_card(data); + } + break; + case 3268: + GameData.shareFriendInfo.sharetype = 3; + GameUI.closeSharePannel(); + Func.sharefriend(GameData.shareFriendInfo); + break; + case 3269: + GameData.shareFriendInfo.sharetype = 0; + GameUI.closeSharePannel(); + Func.sharefriend(GameData.shareFriendInfo); + break; + case 3267: + GameUI.closeSharePannel(); + break; + } + if (spid_up >= 376 && spid_up <= 385) { + for (var i = 0; i < Desk.PlayerList.length; i++) { + var ind = Logic.ChangeToStatus(C_Player.seat, i); + if (ind == spid_up - 376) { + var pOjb = Desk.PlayerList[i]; + GameUI.OpenInfo(ind, pOjb.nickname, pOjb.playerid, pOjb.ip, pOjb.sex, pOjb.seat, pOjb.bean, pOjb.charm); + pOjb = null; + } + } + } + if (spid_up >= 461 && spid_up <= 463) { + GameUI.switchPayType(spid_up - 461); + } + if (spid_up >= 416 && spid_up <= 425) { + GameData.payData[0] = spid_up - 416; + GameUI.OpenCheckPay(); + } + if (spid_up >= 29 && spid_up <= 40) { + Logic.InputRoomCode(spid_up); + } + if (spid_up >= 206 && spid_up <= 212) { + var obj = gameabc_face.getdiv("div204"); + obj.blur(); + obj = null; + var data = {}; + data.agentid = GameData.AgentId; + data.gameid = GameData.GameId; + data.playerid = C_Player.playerid; + data.roomcode = Desk.roomcode; + data.text = Game_Config.Info.TextContent[spid_up - 206]; + if (GameData.chatInfo) { + data.info = GameData.chatInfo; + data.type = 2; + } + Net.Send_send_text(data); + } + if (spid_up >= 256 && spid_up <= 263) { + var data = {}; + data.agentid = GameData.AgentId; + data.gameid = GameData.GameId; + data.playerid = C_Player.playerid; + data.roomcode = Desk.roomcode; + data.giftid = spid_up - 255; + data.receiveseat = GameData.InteractPlayer; + if (GameData.chatInfo) { + data.info = GameData.chatInfo; + data.type = 2; + } + Net.Send_send_gift(data); + } + if (spid_up >= 391 && spid_up <= 403) { + GameUI.CalInput(spid_up); + } + if (spid_up >= 661 && spid_up <= 671 || spid_up == 3000) { + GameUI.inputPanel(spid_up); + } + if (spid_up >= 3044 && spid_up <= 3055) { + GameUI.wareHouseInput(spid_up); + } + + } + +}; + +GameUI.utlmousemove = function(gameid, spid, downx, downy, movex, movey, timelong, offmovex, offmovey, no1) { + //点击后移动代码 + + switch (spid) { + case 252: + //协议内容 + set_self(spid, 19, offmovey, 1, 0); + break; + case 290: + //帮助内容 + set_self(spid, 19, offmovey, 1, 0); + break; + case ConstVal.Emotion.f_spid: + //表情 + if (ifast_abs(offmovey) > 2) { + set_self(spid, 19, offmovey, 1, 0); + GameData.slidEmotion = true; + } + + break; + case ConstVal.Com_History.f_spid: + //表情 + if (ifast_abs(offmovey) > 2) { + set_self(spid, 19, offmovey, 1, 0); + GameData.slideHistory = true; + } + break; + case ConstVal.Task.f_spid: + + if (ifast_abs(offmovex) > 2) { + set_self(spid, 18, offmovex, 1, 0); + GameData.slideTask = true; + } + break; + case 404: + set_self(spid, 19, offmovey, 1, 0); + set_self(81, 19, offmovey, 1, 0); + break; + case 3102: + case 3105: + case 3106: + if (ifast_abs(offmovey) > 2) { + set_self(spid, 19, offmovey, 1, 0); + GameData.imgAdIsSlide = true; + } + break; + case ConstVal.worldRoom.f_sp_1: + //系统房间 + if (ifast_abs(offmovey) > 2) { + set_self(spid, 19, offmovey, 1, 0); + GameData.worldRoomSysSlide = true; + } + break; + case ConstVal.worldRoom.f_sp_2: + //玩家房间 + if (ifast_abs(offmovey) > 2) { + set_self(spid, 19, offmovey, 1, 0); + GameData.worldRoomPlySlide = true; + } + break; + case ConstVal.snrRoomList.f_spid: + //玩家房间 + if (ifast_abs(offmovey) > 2) { + set_self(spid, 19, offmovey, 1, 0); + GameData.snrRoomListSlide = true; + } + break; + case 597: + GameUI.seniorOptionsSlide(gameid, spid, downx, downy, movex, movey, timelong, offmovex, offmovey, no1); + break; + case ConstVal.rankList.f_spid: + //玩家房间 + if (ifast_abs(offmovey) > 2) { + set_self(spid, 19, offmovey, 1, 0); + GameData.rankListSlide = true; + } + break; + case ConstVal.sysNotice.f_spid: + //玩家房间 + if (ifast_abs(offmovey) > 2) { + set_self(spid, 19, offmovey, 1, 0); + } + break; + case ConstVal.vipRoomList1.f_spid: + if (ifast_abs(offmovey) > 2) { + set_self(spid, 19, offmovey, 1, 0); + GameData.vipRoomPageOne.slide = true; + } + + break; + case ConstVal.vipRoomList2.f_spid: + if (ifast_abs(offmovey) > 2) { + set_self(spid, 19, offmovey, 1, 0); + GameData.vipRoomPageTwo.slide = true; + } + break; + case ConstVal.blackList.f_spid: + if (ifast_abs(offmovey) > 2) { + set_self(spid, 19, offmovey, 1, 0); + GameData.blackList.slide = true; + } + + break; + case ConstVal.vipRank.f_spid: + if (ifast_abs(offmovey) > 2) { + set_self(spid, 19, offmovey, 1, 0); + GameData.vipRank.slide = true; + } + + break; + case ConstVal.whiteList.f_spid: + if (ifast_abs(offmovey) > 2) { + set_self(spid, 19, offmovey, 1, 0); + GameData.whiteList.slide = true; + } + + break; + + + } + +}; + +GameUI.utlgamemydraw = function(gameid, spid, times, timelong, no2, no3, no4, no5, no6, no7) { + //每个精灵更新绘画代码 + if (spid >= 376 && spid <= 385) { + if (typeof(GameUI.onstate[spid - 376]) != "undefined") { + if (GameUI.onstate[spid - 376] == 1) { //离线 + ifast_mydrawbmp(spid, 90, 0, 0, get_self(spid, 20, 0, 0, 0), get_self(spid, 21, 0, 0, 0), 0, 0, 100, 100); + } else if (GameUI.onstate[spid - 376] == 2) { //通话中 + ifast_mydrawbmp(spid, 91, 0, 0, get_self(spid, 20, 0, 0, 0), get_self(spid, 21, 0, 0, 0), 0, 0, 94, 96); + } + if (Desk.needprepare == 1) { + if (GameUI.isprepare[spid - 376] == 1) { //已准备 + + } else if (GameUI.onstate[spid - 376] == 0) { //未准备 + ifast_mydrawbmp(spid, 209, 0, 0, get_self(spid, 20, 0, 0, 0), get_self(spid, 21, 0, 0, 0), 0, 0, 100, 100); + } + } + } + } + switch (spid) { + + + case 118: + //个人信息性别 + case 282: + { + if (InfoSex == "2") { //女 + ifast_mydrawbmp(spid, 47, 80, 80, 44, 44, 44, 0, 44, 44); + } else { //男 + ifast_mydrawbmp(spid, 47, 80, 80, 44, 44, 0, 0, 44, 44); + } + } + break; + + case 17: + //任务按钮 + if (C_Player.taskstate != 0) { + ifast_mydrawbmp(spid, 88, 50, -23, 63, 63, 0, 0, 63, 63); + } + break; + + case 254: + //进度条 + ifast_mydrawbmp(spid, 96, 0, 0, GameData.LoadCount * get_self(spid, 20, 0, 0, 0) / 100 + 0.1, get_self(spid, 21, 0, 0, 0), 0, get_self(spid, 21, 0, 0, 0), GameData.LoadCount * 416 / 100 + 0.1, get_self(spid, 21, 0, 0, 0)); + break; + case 256: + //互动按钮1 + ifast_mydrawbmp(spid, 99, 0, 5, 80, 80, 20, 30, 90, 90); + break; + case 257: + //互动按钮2 + ifast_mydrawbmp(spid, 102, 0, 0, 80, 80, 1210, 0, 110, 98); + break; + case 258: + //互动按钮3 + ifast_mydrawbmp(spid, 103, 5, 0, 80, 80, 0, 0, 190, 190); + break; + case 259: + //互动按钮4 + ifast_mydrawbmp(spid, 104, 0, 3, 80, 80, 260, 0, 130, 130); + break; + case 339: + //微信公众号下划线 + if (GameData.wechat_gzh) { + drawlines(spid, 0, 38, get_self(spid, 20, 0, 0, 0), 38, 2, GameData.gzhcolor1); + } + break; + case 680: + //微信公众号下划线 + drawlines(spid, 0, 30, get_self(spid, 20, 0, 0, 0), 30, 2, GameData.gzhcolor2); + break; + case GameData.telSpid: + //微信公众号下划线 + //if(GameData.roomList.length==0){ + if (GameData.tel) { + drawlines(spid, 0, 21, get_self(spid, 20, 0, 0, 0), 21, 2, GameData.telcolor); + } + //}else{ + //drawlines(spid,5,30,get_self(spid,20,0,0,0),30,2,GameData.telcolor); + //} + break; + //case 682: + //if(GameData.roomList.length>=1){ + //drawlines(spid,0,30,get_self(spid,20,0,0,0),30,2,GameData.telcolor); + //} + //break; + //case 178: + //if(GameData.roomList.length>=2){ + //drawlines(spid,0,30,get_self(spid,20,0,0,0),30,2,GameData.telcolor); + //} + //break; + //case 179: + //if(GameData.roomList.length>=3){ + //drawlines(spid,0,30,get_self(spid,20,0,0,0),30,2,GameData.telcolor); + //} + //break; + case 326: + if (GameData.disType) { + drawlines(spid, 630, 700, 635, 700, 5); + } + for (var i = 0; i < GameData.serverIndex + 1; i++) { + drawlines(spid, 1100 + i * 10, 700, 1105 + i * 10, 700, 2); + } + break; + case 3100: + if (GameUI.Mem.snrOption.infinite == 1) { + ifast_mydrawbmp(spid, 390, 0, 0, 40, 40, 0, 0, 40, 40); + } + break; + case 3166: + if (GameUI.Mem.snrOption.rebateType == 1) { + ifast_mydrawbmp(spid, 390, 0, 0, 40, 40, 0, 0, 40, 40); + } + break; + case 3167: + if (GameUI.Mem.snrOption.rebateType == 0) { + ifast_mydrawbmp(spid, 390, 0, 0, 40, 40, 0, 0, 40, 40); + } + break; + case 3115: + ifast_mydrawtext(spid, 1, 6, 3, String(get_rec(1)).gblen() * 12.5, 20); + ifast_mydrawtext(spid, 2, 6, 26, String(get_rec(2)).gblen() * 12.5, 20); + break; + case 3111: + if (GameData.selectSysNotice) { + ifast_mydrawbmp(spid, 4, 2, 2, 40, 40, 0, 0, 40, 40); + } + break; + case 568: + if (!GameData.hallConfig.worldRoomList) { + //ifast_mydrawbmp(spid,11,0,0,get_self(spid,20,0,0,0),get_self(spid,21,0,0,0),0,0,4,4); + ifast_mydrawbmp(spid, 352, 80, 0, 230, 230, 0, 0, 230, 230); + } + break; + case 483: + //if (!GameData.matchhtml) { + //ifast_mydrawbmp(spid, 352, 80, 0, 230, 230, 0, 0, 230, 230); + //} + if (!GameData.vipConfig) { + ifast_mydrawbmp(spid, 352, 80, 0, 230, 230, 0, 0, 230, 230); + } + break; + case 3139: + if (!GameData.sysConfig.ofcShortCode) { + //ifast_mydrawbmp(spid,11,0,0,get_self(spid,20,0,0,0),get_self(spid,21,0,0,0),0,0,4,4); + ifast_mydrawbmp(spid, 352, 110, 5, 99, 99, 0, 0, 230, 230); + } + break; + case ConstVal.Com_History.f_spid: + if (GameData.chatLine != null && GameData.isService) { + drawlines(spid, GameData.chatLine[0], GameData.chatLine[1] + GameData.chatLine[3], GameData.chatLine[0] + GameData.chatLine[2], GameData.chatLine[1] + GameData.chatLine[3], 4, "white"); + } + break; + case 3260: + if(GameData.blackList.breakRoom){ + ifast_mydrawbmp(spid, 432, 0, 0, 50, 50, 50, 0, 50, 50); + } + break; + } + +}; +GameUI.utlgamemydrawbegin = function(gameid, spid, times, timelong, no2, no3, no4, no5, no6, no7) { + //每个精灵更新前绘画代码 + if (spid == 220) { + set_clip(0, 0, Game_Config.Notice.x1, Game_Config.Notice.y, Game_Config.Notice.x2 - Game_Config.Notice.x1, Game_Config.Notice.h); + } + if (spid == 252) { + set_clip(0, 0, Game_Config.Protocol.x, Game_Config.Protocol.y, Game_Config.Protocol.w, Game_Config.Protocol.h); + } + if (spid == 290) { + set_clip(0, 0, Game_Config.Help.x, Game_Config.Help.y, Game_Config.Help.w, Game_Config.Help.h); + } + //if(spid>=315&&spid<=318){ + //if(TaskInfo[spid-315]){ + //set_clip(spid,0,0,0,get_self(311,20,0,0,0)/Number(TaskInfo[spid-315].total)*Number(TaskInfo[spid-315].finish)+0.1,20); + //} + //} + if (spid == 333) { + set_clip(0, 0, ConstVal.iMessage.x1, ConstVal.iMessage.y, ConstVal.iMessage.x2 - ConstVal.iMessage.x1, ConstVal.iMessage.h); + } + if (spid == 338) { + set_clip(spid, 0, 0, 0, get_self(337, 20, 0, 0, 0) * GameData.Battery, get_self(337, 21, 0, 0, 0)); + } + if (spid == ConstVal.Emotion.f_spid) { + set_clip(0, 0, ConstVal.Emotion.clip_x, ConstVal.Emotion.clip_y, ConstVal.Emotion.clip_w, ConstVal.Emotion.clip_h); + } + if (spid == ConstVal.Com_History.f_spid) { + set_clip(0, 0, ConstVal.Com_History.clip_x, ConstVal.Com_History.clip_y, ConstVal.Com_History.clip_w, ConstVal.Com_History.clip_h); + } + if (spid == ConstVal.Task.f_spid) { + set_clip(0, 0, ConstVal.Task.clip_x, ConstVal.Task.clip_y, ConstVal.Task.clip_w, ConstVal.Task.clip_h); + } + if (spid == 390) { + set_clip(0, 0, ConstVal.Broadcast.clip_x, ConstVal.Broadcast.clip_y, ConstVal.Broadcast.clip_w, ConstVal.Broadcast.clip_h); + } + if (spid == 404 || spid == 81) { + set_clip(0, 0, ConstVal.Notice.clip_x, ConstVal.Notice.clip_y, ConstVal.Notice.clip_w, ConstVal.Notice.clip_h); + } + if (spid == 3102 || spid == 3105 || spid == 3106) { + set_clip(0, 0, ConstVal.Notice.img_clip_x, ConstVal.Notice.img_clip_y, ConstVal.Notice.img_clip_w, ConstVal.Notice.img_clip_h); + } + if (spid == ConstVal.worldRoom.f_sp_1) { + set_clip(0, 0, ConstVal.worldRoom.clip_x_1, ConstVal.worldRoom.clip_y_1, ConstVal.worldRoom.clip_w_1, ConstVal.worldRoom.clip_h_1); + } + if (spid == ConstVal.worldRoom.f_sp_2) { + set_clip(0, 0, ConstVal.worldRoom.clip_x_2, ConstVal.worldRoom.clip_y_2, ConstVal.worldRoom.clip_w_2, ConstVal.worldRoom.clip_h_2); + } + if (spid == ConstVal.snrRoomList.f_spid) { + set_clip(0, 0, ConstVal.snrRoomList.clip_x, ConstVal.snrRoomList.clip_y, ConstVal.snrRoomList.clip_w, ConstVal.snrRoomList.clip_h); + } + if (spid == ConstVal.rankList.f_spid) { + set_clip(0, 0, ConstVal.rankList.clip_x, ConstVal.rankList.clip_y, ConstVal.rankList.clip_w, ConstVal.rankList.clip_h); + } + if (spid == ConstVal.sysNotice.f_spid) { + set_clip(0, 0, ConstVal.sysNotice.clip_x, ConstVal.sysNotice.clip_y, ConstVal.sysNotice.clip_w, ConstVal.sysNotice.clip_h); + } + if (spid == ConstVal.vipRoomList1.f_spid) { + set_clip(0, 0, ConstVal.vipRoomList1.clip_x, ConstVal.vipRoomList1.clip_y, ConstVal.vipRoomList1.clip_w, ConstVal.vipRoomList1.clip_h); + } + if (spid == ConstVal.vipRoomList2.f_spid) { + set_clip(0, 0, ConstVal.vipRoomList2.clip_x, ConstVal.vipRoomList2.clip_y, ConstVal.vipRoomList2.clip_w, ConstVal.vipRoomList2.clip_h); + } + if (spid == ConstVal.blackList.f_spid) { + set_clip(0, 0, ConstVal.blackList.clip_x, ConstVal.blackList.clip_y, ConstVal.blackList.clip_w, ConstVal.blackList.clip_h); + } + if (spid == ConstVal.whiteList.f_spid) { + set_clip(0, 0, ConstVal.whiteList.clip_x, ConstVal.whiteList.clip_y, ConstVal.whiteList.clip_w, ConstVal.whiteList.clip_h); + } + if (spid == ConstVal.vipRank.f_spid) { + set_clip(0, 0, ConstVal.vipRank.clip_x, ConstVal.vipRank.clip_y, ConstVal.vipRank.clip_w, ConstVal.vipRank.clip_h); + } +}; + +GameUI.utlontimer = function(gameid, spid, /* 本次间隔多少次了 */ times, /* 本次间隔多久 */ timelong, /* 开启后运行多少次了 */ alltimes) { + /*请在下面输入您的代码 + */ + //set_self(1,18,5,1,0); + switch (spid) { + case 1: + if (GameData.LoadCount == 100) { + //if(ConstVal.netType == 0){ + if (GameData.firstConnect_Succ && GameData.getJSONState) { + this.JumpWxAuth(); + set_self(1, 57, 0, 0, 0); + } + //}else{ + //if(GameData.getJSONState){ + //this.JumpWxAuth(); + //set_self(1,57,0,0,0); + //} + //} + } else { + GameData.Timesup = true; + set_self(1, 57, 0, 0, 0); + } + break; + case 2: + VoteTime--; + if (VoteTime >= 0) { + + set_self(222, 20, String(VoteTime).length * 30, 0, 0); + set_self(222, 7, VoteTime, 0, 0); + } + if (VoteTime <= 0) { + set_self(2, 57, 0, 0, 0); + } + break; + case 3: + + if (get_self(149, 37, 0, 0, 0) == 1) { + Func.SetDate(); + if (get_self(156, 35, 0, 0, 0) == 255) { + set_self(156, 35, 100, 0, 0); + } else { + set_self(156, 35, 255, 0, 0); + } + } + break; + case 4: + if (GameData.vipRoomShortList.length > 0 && get_self(6, 37, 0, 0, 0)) { + var data = {}; + data.agentid = GameData.AgentId; + data.gameid = GameData.GameId + data.shortcodeList = GameData.vipRoomShortList; + Net.Send_getInfoByShortCode(data); + } + break; + case 5: + GameData.phoneCodeTime--; + if(GameData.phoneCodeTime < 0){//倒计时结束 + set_self(5, 57, 0, 0, 0); + set_self(3245,43,2,0,0); + set_self(3246,37,0,0,0); + }else{ + GameUI.setCodeTime(GameData.phoneCodeTime); + } + break; + + } +}; + + +GameUI.invisible = function(bTemp) { + for (var i = 0; i <= Game_Config.Max.group; i++) { + if (bTemp) { + if (i == 89) { + continue; + } + if (i == 32) { + set_self(221, 37, 0, 0, 0); + set_self(223, 37, 0, 0, 0); + continue; + } + } + set_group(i, 37, 0, 0, 0); + } +} +GameUI.JumpWxAuth = function() { //跳转微信授权 + //preAudio(); + //setTimeout(function(){ + //Func.getphoneInfo(); + //C_Player.Init(); + + Logic.getPhoneInfo(); + GameData.submitLocation = false; + GameUI.stopMenuSceneAnimation(); + GameData.playerHeadImgState = false; + GameData.Scene = 0; + Utl.stopMusic(); + Func.startlocation(2); + GameUI.invisible(); + GameUI.showBackBtn(); + GameUI.setLoginButton(); + Func.up_imgurl(5, GameData.AgentLoginImg); + var vText = "V " + GameData.Version + " "; + if (GameData.hallConfig.betaText) { + vText += GameData.hallConfig.betaText; + } + set_self(285, 7, vText); + + set_group(2, 37, 1, 0, 0); + if(GameData.sysConfig.deviceLogin){ + set_self(3,37,0,0,0); + set_self(3254,37,1,0,0); + set_self(3255,37,0,0,0); + set_self(3254,18,490,0,0); + // set_self(3255,18,660,0,0); + }else{ + set_self(3,37,1,0,0); + set_self(3254,37,0,0,0); + set_self(3255,37,0,0,0); + } + var WxInfo = null; + //if (!Game_Config.Debugger.isDebugger) { + if (GameData.versionState == 0) { + if (GameData.h5Version == 1) { + WxInfo = Logic.getWxInfo(); + } else { + if(!GameData.sysConfig.deviceLogin){ + WxInfo = Utl.getCookie(Utl.Config.wxinfo); + }else{ + WxInfo = Utl.getCookie(Utl.Config.devicePlayer); + if(Utl.ReadData(Utl.Config.dLogin)){ + set_self(3254,37,1,0,0); + // set_self(3255,18,490,0,0); + } + } + } + } + //} else { + //if (Game_Config.Debugger.AutoLogin) { + //if (GameData.h5Version == 1) { + //WxInfo = Logic.getWxInfo(); + //} else { + //if(!GameData.sysConfig.deviceLogin){ + //WxInfo = Utl.getCookie(Utl.Config.wxinfo); + //}else{ + //WxInfo = Utl.ReadData(Utl.Config.devicePlayer); + //} + //} + //} + //} + + if (WxInfo) { + WxInfo = JSON.parse(WxInfo); + Func.up_imgurl(25, WxInfo.headimgurl); + set_self(324, 7, WxInfo.nickname, 0, 0); + set_self(324, 18, get_self(325, 18, 0, 0, 0) + get_self(325, 20, 0, 0, 0) / 2 - WxInfo.nickname.gblen() * 10.5, 0, 0); + set_self(3, 37, 0, 0, 0); + set_self(177, 37, 0, 0, 0); + set_self(106, 37, 0, 0, 0); + set_self(3254,37,0,0,0); + set_self(3255,37,0,0,0); + play_ani(1, 325, 43, 1, 4, 0, 1500, 0, 0, 0, 0, 0, 0); + //C_Player.SetWxInfo(WxInfo.openid,WxInfo.headimgurl,WxInfo.nickname,WxInfo.sex,WxInfo.city,WxInfo.Province,WxInfo.unionid); + //var data={}; + //data.agentid = GameData.AgentId; + //data.openid = C_Player.openid; + //data.nickname = C_Player.nickname; + //data.avatar = C_Player.avatar; + //data.sex = C_Player.sex; + //data.province = C_Player.province; + //data.city = C_Player.city; + //data.unionid = C_Player.unionid; + //data.gameid=GameData.GameId; + //data.version = GameData.versionCode; + //data.channelid = GameData.ChannelId; + //data.marketid = GameData.marketID; + //Net.Send_login(data); + //if(GameData.loginTimer==null){ + //GameData.loginTimer = setTimeout(function(){ + C_Player.SetWxInfo(WxInfo.openid, WxInfo.headimgurl, WxInfo.nickname, WxInfo.sex, WxInfo.city, WxInfo.Province, WxInfo.unionid); + var data = {}; + data.agentid = GameData.AgentId; + data.openid = C_Player.openid; + data.nickname = C_Player.nickname; + data.avatar = C_Player.avatar; + data.sex = C_Player.sex; + data.province = C_Player.province; + data.city = C_Player.city; + data.unionid = C_Player.unionid; + data.gameid = GameData.GameId; + data.version = GameData.versionCode; + data.channelid = GameData.ChannelId; + data.marketid = GameData.marketID; + if(GameData.sysConfig.deviceLogin){ + C_Player.setTel(WxInfo.telphone); + data.telphone = WxInfo.telphone; + data.telphoneAuto = true; + } + Net.Send_login(data); + //},2000); + //} + } else { + + set_self(158, 37, 0, 0, 0); + set_self(159, 37, 0, 0, 0); + set_self(160, 37, 0, 0, 0); + set_self(323, 37, 0, 0, 0); + set_self(324, 37, 0, 0, 0); + set_self(325, 37, 0, 0, 0); + if (isxiaowxgame()) { + try { + WXgameloginbuttonshow(1280, 720, get_self(3, 18, 0, 0, 0), get_self(3, 19, 0, 0, 0), get_self(3, 20, 0, 0, 0), get_self(3, 21, 0, 0, 0), 'assets/bmp/00022.png'); + } catch (e) { + + } + } + } + + if (GameData.versionState == 1) { //审核版本 + set_self(405, 37, 0, 0, 0); + //set_self(3,18,113,0,0); + //set_self(3,19,388,0,0); + set_self(3, 18, Game_Config.loginButton.x2, 0, 0); + set_self(3, 20, 320, 0, 0); + set_self(3, 21, 98, 0, 0); + set_self(177, 18, Game_Config.loginButton.x3, 0, 0); + //set_self(177,18,488,0,0); + //set_self(177,19,388,0,0); + } else { //正式版本 + set_self(177, 37, 0, 0, 0); + set_self(3, 18, Game_Config.loginButton.x1, 0, 0); + //set_self(3,19,382,0,0); + //set_self(3,20,400,0,0); + //set_self(3,21,116,0,0); + + } + if (GameData.hallConfig.qqLogin) { + set_self(106, 37, 1, 0, 0); + } else { + set_self(106, 37, 0, 0, 0); + } + + //},2000); + GameUI.updateInsertHTML(); + +} +GameUI.updateNoticeBoard = function() { + + if (Game_Config.sysConfig.hideNotice) { + set_self(16, 37, 0, 0, 0); + set_self(180, 37, 0, 0, 0); + set_self(193, 37, 0, 0, 0); + set_self(194, 37, 0, 0, 0); + set_self(682, 37, 0, 0, 0); + set_self(178, 37, 0, 0, 0); + set_self(179, 37, 0, 0, 0); + set_self(145, 37, 0, 0, 0); + return; + } + if (GameData.qq || GameData.tel || GameData.wechat_kfh) { + set_self(16, 37, 0, 0, 0); + } + if (GameData.Scene != 1) { + return; + } + var space = 0; + set_self(340, 41, 0, 0, 0); + //set_self(340,7,GameData.wechat_gzh,0,0); + //set_self(339,20,GameData.wechat_gzh.gblen()*13,0,0); + //set_self(340,18,get_self(16,18,0,0,0)+get_self(16,20,0,0,0)/2-GameData.wechat_gzh.gblen()*6.5,0,0); + //set_self(339,18,get_self(16,18,0,0,0)+get_self(16,20,0,0,0)/2-GameData.wechat_gzh.gblen()*6.5,0,0); + set_self(145, 7, Game_Config.Setting.Ads1, 0, 0); + set_self(180, 37, 0, 0, 0); + set_self(193, 37, 0, 0, 0); + set_self(194, 37, 0, 0, 0); + set_self(682, 37, 0, 0, 0); + set_self(178, 37, 0, 0, 0); + set_self(179, 37, 0, 0, 0); + //var _roomlist = Logic.readRoomList(); + //if(_roomlist.length<=0){ + set_self(681, 7, Game_Config.Setting.info[0], 0, 0); + + //set_self(180,18,78,0,0,0); + set_self(180, 18, get_self(16, 18, 0, 0, 0) + space, 0, 0, 0); + var infoList = []; + var spidTemp = [ + [682, 180], + [178, 193], + [179, 194] + ]; + var spidIndex = 0; + for (var i = 0; i < spidTemp.length; i++) { + set_self(spidTemp[i][0], 7, "", 0, 0); + set_self(spidTemp[i][1], 7, "", 0, 0); + //set_self(spidTemp[i][0],18,136,0,0); + set_self(spidTemp[i][0], 18, get_self(16, 18, 0, 0, 0) + 101, 0, 0); + //set_self(spidTemp[i][1],37,0,0,0); + } + + if (GameData.wechat_kfh) { + set_self(spidTemp[spidIndex][1], 7, "客服微信:", 0, 0); + set_self(spidTemp[spidIndex][0], 7, GameData.wechat_kfh, 0, 0); + //set_self(spidTemp[spidIndex][1],18,78,0,0); + set_self(spidTemp[spidIndex][1], 18, get_self(16, 18, 0, 0, 0) + space, 0, 0); + set_self(spidTemp[spidIndex][1], 37, 1, 0, 0); + set_self(spidTemp[spidIndex][0], 37, 1, 0, 0); + + + spidIndex++; + } else { + + } + if (GameData.qq) { + set_self(spidTemp[spidIndex][1], 7, "投诉建议:", 0, 0); + set_self(spidTemp[spidIndex][0], 7, GameData.qq, 0, 0); + + //set_self(spidTemp[spidIndex][1],18,81,0,0); + set_self(spidTemp[spidIndex][1], 18, get_self(16, 18, 0, 0, 0) + space, 0, 0); + set_self(spidTemp[spidIndex][1], 37, 1, 0, 0); + set_self(spidTemp[spidIndex][0], 37, 1, 0, 0); + + spidIndex++; + } else { + + } + if (GameData.tel) { + GameData.telSpid = spidTemp[spidIndex][0]; + set_self(spidTemp[spidIndex][1], 7, "客服手机:", 0, 0); + set_self(spidTemp[spidIndex][0], 7, GameData.tel, 0, 0); + //set_self(spidTemp[spidIndex][0],18,136,0,0); + + //set_self(spidTemp[spidIndex][1],18,78,0,0); + set_self(spidTemp[spidIndex][1], 18, get_self(16, 18, 0, 0, 0) + space, 0, 0); + set_self(spidTemp[spidIndex][1], 37, 1, 0, 0); + set_self(spidTemp[spidIndex][0], 37, 1, 0, 0); + + set_self(GameData.telSpid, 20, String(GameData.tel).gblen() * 11.5, 0, 0); + set_self(GameData.telSpid, 7, GameData.tel, 0, 0); + spidIndex++; + } else { + + } + +/* + }else{//有历史房间号 + GameData.telSpid = -1; + set_self(681,7," 开房列表"); + var _roomdesspList = [180,193,194]; + var _roomcodespList = [682,178,179]; + for(var i=0;i 119) { + set_self(287, 20, get_self(3161, 20, 0, 0, 0) + 53, 0, 0); + set_self(3161, 18, get_self(287, 18, 0, 0, 0) + 33, 0, 0); + } else { + set_self(287, 20, 155, 0, 0); + GameUI.adaptPositionX(3161, get_self(287, 18, 0, 0, 0) + 85); + } + //GameUI.adaptPositionX(3161,get_self()); + //set_self(157,18,get_self(287,18,0,0,0)+get_self(287,20,0,0,0)/2-String(C_Player.roomcard).length*7,0,0); +} +GameUI.setHallStar = function() { + //set_self(497,7,C_Player.bean,0,0); + var txt = Utl.convertNumberToImg(C_Player.bean); + GameUI.setNumberImage(3162, txt, 17); + if (get_self(3162, 20, 0, 0, 0) > 119) { + set_self(496, 20, get_self(3162, 20, 0, 0, 0) + 55, 0, 0); + set_self(3162, 18, get_self(496, 18, 0, 0, 0) + 35, 0, 0); + } else { + set_self(496, 20, 155, 0, 0); + GameUI.adaptPositionX(3162, get_self(496, 18, 0, 0, 0) + 85); + } + //set_self(497,18,get_self(496,18,0,0,0)+get_self(496,20,0,0,0)/2-String(C_Player.bean).length*7,0,0); +} +GameUI.setStarPlatformButton = function() { + set_self(568, 1, ConstVal.starConfig.resList[Number(GameData.nameImgFrame_2) - 1], 0, 0); +} +GameUI.startMenuSceneAnimation = function() { + var aniTime = 1200; + set_self(11, 43, 1, 0, 0, 0); + set_self(12, 43, 1, 0, 0, 0); + set_self(214, 43, 1, 0, 0, 0); + set_self(3106, 43, 1, 0, 0, 0); + set_self(479, 43, 1, 0, 0, 0); + set_self(568, 43, 1, 0, 0, 0); + set_self(483, 43, 1, 0, 0, 0); + play_ani(1, 3016, 43, 1, 40, 0, ConstVal.Animation.time2, 0, 0, 0, 0, 0, 0, 0); //商城 + play_ani(1, 479, 43, 1, 2, 0, 500, 500, 0, 0, 0, 0, 0, 1); //公告喇叭 + if (GameData.mainMenuAniTimer) { + window.clearInterval(GameData.mainMenuAniTimer); + GameData.mainMenuAniTimer = null; + } + GameData.mainMenuAniTimer = setInterval(function() { + var ram = ifast_random(4); + switch (ram) { + case 0: + play_ani(1, 11, 43, 1, 30, 0, ConstVal.Animation.time1, 0, 0, 0, 1, 0, 0, 0); //加入房间 + break; + case 1: + play_ani(1, 12, 43, 1, 30, 0, ConstVal.Animation.time1, 0, 0, 0, 1, 0, 0, 0); //加入房间 + break; + case 2: + play_ani(1, 568, 43, 1, 30, 0, ConstVal.Animation.time1, 0, 0, 0, 1, 0, 0, 0); //星星场 + break; + case 3: + play_ani(1, 483, 43, 1, 30, 0, ConstVal.Animation.time1, 0, 0, 0, 1, 0, 0, 0); //比赛场 + break; + } + }, ConstVal.Animation.fundTime); + //if(id == 11 && sx == 43 && allend == 1){//创建房间 + //play_ani(1,12,43,1,30,0,ConstVal.Animation.time1,0,0,0,1,0,0,0);//加入房间 + //} + //if(id == 12 && sx == 43 && allend == 1){//创建房间 + //play_ani(1,568,43,1,30,0,ConstVal.Animation.time1,0,0,0,1,0,0,0);//星星场 + //} + //if(id == 568 && sx == 43 && allend == 1){//创建房间 + //play_ani(1,483,43,1,30,0,ConstVal.Animation.time1,0,0,0,1,0,0,0);//比赛场 + //} + //if(id == 483 && sx == 43 && allend == 1){//创建房间 + //GameData.mainMenuAniTimer = setTimeout(function(){ + //play_ani(1,11,43,1,30,0,ConstVal.Animation.time1,0,0,0,1,0,0,0);//加入房间 + //},ConstVal.Animation.deltaTime); + //} + + //GameData.mainMenuAniTimer = setTimeout(function(){ + //play_ani(1,11,43,1,30,0,ConstVal.Animation.time1,0,0,0,1,0,0,0);//加入房间 + + //},ConstVal.Animation.fundTime+ifast_random(ConstVal.Animation.deltaTime)); +} +GameUI.stopMenuSceneAnimation = function() { + play_ani(0, 11, 43); //创建房间 + play_ani(0, 12, 43); //加入房间 + play_ani(0, 3016, 43); //商城 + play_ani(0, 568, 43); //星星场 + play_ani(0, 479, 43); //公告喇叭 + play_ani(0, 483, 43); //比赛场 + if (GameData.mainMenuAniTimer) { + window.clearInterval(GameData.mainMenuAniTimer); + GameData.mainMenuAniTimer = null; + } + set_self(11, 43, 1, 0, 0, 0); + set_self(12, 43, 1, 0, 0, 0); + set_self(214, 43, 1, 0, 0, 0); + set_self(3106, 43, 1, 0, 0, 0); + set_self(479, 43, 1, 0, 0, 0); + set_self(568, 43, 1, 0, 0, 0); + set_self(483, 43, 1, 0, 0, 0); +} +GameUI.openPallet = function() { + if (GameData.versionState == 1) { //审核版本 + if (GameData.LaunchMode == ConstVal.Launch_mode.from_self) { + set_self(234, 37, 0, 0, 0); + } + set_self(17, 37, 0, 0, 0); + set_self(16, 37, 0, 0, 0); + set_self(145, 37, 0, 0, 0); + set_self(340, 37, 0, 0, 0); + set_self(339, 37, 0, 0, 0); + set_self(681, 37, 0, 0, 0); + set_self(682, 37, 0, 0, 0); + set_self(178, 37, 0, 0, 0); + set_self(179, 37, 0, 0, 0); + set_self(180, 37, 0, 0, 0); + set_self(193, 37, 0, 0, 0); + set_self(194, 37, 0, 0, 0); + set_self(235, 37, 0, 0, 0); + set_self(483, 37, 0, 0, 0); + set_self(568, 37, 0, 0, 0); + set_self(604, 37, 0, 0, 0); + //if(GameData.hallConfig.enablePay == 0){ + set_self(286, 37, 0, 0, 0); + set_self(157, 37, 0, 0, 0); + set_self(287, 37, 0, 0, 0); + set_self(10, 37, 0, 0, 0); + set_self(508, 37, 0, 0, 0); + set_self(497, 37, 0, 0, 0); + set_self(496, 37, 0, 0, 0); + set_self(509, 37, 0, 0, 0); + //} + if (GameData.isShowNeighbor) { + GameUI.showNeighbor(); + } + //set_self(3016,37,0,0,0); + set_self(3017, 37, 0, 0, 0); + } else { + set_group(95, 37, 1, 0, 0); + if (GameData.agentmode == 1) { + set_self(235, 37, 0, 0, 0); + } + //if(!GameData.matchhtml){//比赛场 + //set_self(483,37,0,0,0); + //}else{ + //set_self(483,37,0,0,0); + //} + //if(GameData.hallConfig.worldRoomList){//显示星星争霸场 + //set_self(568,37,1,0,0); + //}else{ + //set_self(568,37,0,0,0); + //} + if (GameData.hallConfig.rankList) { //显示排行榜 + set_self(604, 37, 1, 0, 0); + } else { + set_self(604, 37, 0, 0, 0); + } + if (GameData.hallConfig.wareHouse) { //保险箱 + set_self(3057, 37, 1, 0, 0); + } else { + set_self(3057, 37, 0, 0, 0); + } + if (GameData.agentmode == 1) { + set_self(235, 37, 0, 0, 0); + } else { + set_self(235, 37, 1, 0, 0); + } + GameUI.showBagBtn(); + if (GameData.sysConfig.miniPro) { + set_self(235, 37, 0, 0, 0); + set_self(15, 37, 0, 0, 0); + } + + //} + //set_self(15,37,1,0,0); + var spList = [15, 604, 235, 3017, 3057, 5]; + var posList = [ + [216, 540], + [371, 540], + [526, 540], + [681, 540], + [836, 540], + [991, 540] + ]; + var posIndex = 0; + //set_self(3121,20,170,0,0); + for (var i = 0; i < spList.length; i++) { + if (get_self(spList[i], 37, 0, 0, 0) == 1) { + set_self(spList[i], 18, posList[posIndex][0], 0, 0); + set_self(spList[i], 19, posList[posIndex][1], 0, 0); + + posIndex++; + } + } + set_self(3121, 20, 150 * posIndex + 30, 0, 0); + } +} +GameUI.hidePalletButton = function() { + if (ConstVal.isGameHall) { + return; + } + var spList = [15, 604, 235, 3017, 3057, 3121]; + for (var i = 0; i < spList.length; i++) { + set_self(spList[i], 37, 0, 0, 0); + } +} +GameUI.closePallet = function() { + if (ConstVal.isGameHall) { + return; + } + set_group(95, 37, 0, 0, 0); +} +GameUI.showMyRoomList = function() { + GameUI.createMyRoomList(); +} +GameUI.hideMyRoomList = function() { + set_group(98, 37, 0, 0, 0); +} +GameUI.createMyRoomList = function() { + set_group(98, 37, 1, 0, 0); + GameUI.clearMyRoomList(); + var _roomlist = Logic.readRoomList(); + var cLength = _roomlist.length; + if (cLength > ConstVal.myRoomList.maxLength) { + cLength = ConstVal.myRoomList.maxLength; + } + //_roomlist.reverse(); + GameData.createMyRoomListLength = cLength; + for (var i = 0; i < cLength; i++) { + var spaceY = i * (get_self(ConstVal.myRoomList.bgSp, 21, 0, 0, 0) + ConstVal.myRoomList.space); + var bg = ifast_addtospritefromspritecopy(ConstVal.myRoomList.fSpid, ConstVal.myRoomList.bgSp, ConstVal.myRoomList.bgX, ConstVal.myRoomList.bgY + spaceY, ConstVal.myRoomList.bgTag + i); + var rCode = ifast_addtospritefromspritecopy(ConstVal.myRoomList.fSpid, ConstVal.myRoomList.roomCodeSp, ConstVal.myRoomList.rCodeX, ConstVal.myRoomList.rCodeY + spaceY, ConstVal.myRoomList.roomCodeTag + i); + GameUI.setNumberImage(rCode, _roomlist[i], ConstVal.myRoomList.roomCodeWidth); + } +} +GameUI.clearMyRoomList = function() { + for (var i = 0; i < GameData.createMyRoomListLength; i++) { + ifast_dllpritefromspritecopy(ConstVal.myRoomList.fSpid, ConstVal.myRoomList.bgTag + i); + ifast_dllpritefromspritecopy(ConstVal.myRoomList.fSpid, ConstVal.myRoomList.roomCodeTag + i); + } +} +GameUI.JumpMenuScene = function(_bTemp) { + Logic.getHTML(); + if (!_bTemp) { + GameData.matchInfo = null; + } + if (!GameData.isLocation) { + GameData.isLocation = true; + GameData.otherLocation = false; + Func.getlocation(); + GameData.otherLocation = true; + } + if (!GameData.submitPhoneInfo) { + Func.getphoneInfo(); + //Func.getAddressBook(); + } + if (!GameData.submitAddressBook) { + //Func.getphoneInfo(); + Func.getAddressBook(); + } + C_Player.charm = undefined; + GameUI.setStarPlatformButton(); + //set_self(568,43,GameData.nameImgFrame_2,0,0); + set_self(286, 43, GameData.nameImgFrame_1, 0, 0); + set_self(508, 43, GameData.nameImgFrame_2, 0, 0); + GameUI.clearBroadcast(); + Func.startlocation(2); + GameData.communionHistory = []; + GameData.sysNotice = []; + GameUI.VoteList = []; + GameUI.ApplyPlayer = -1; + set_self(ConstVal.sysNotice.f_spid, 19, ConstVal.sysNotice.clip_y, 0, 0); + for (var i = 0; i < GameUI.onstate.length; i++) { + GameUI.onstate[i] = 0; + } + for (var i = 0; i < GameUI.isprepare.length; i++) { + GameUI.isprepare[i] = 0; + } + GameUI.invisible(true); + + set_self(288, 7, Func.subString(C_Player.nickname, Game_Config.Max.Mainnickname, true), 0, 0); + set_self(289, 7, "ID:" + C_Player.playerid, 0, 0); + GameUI.setHallRoomCard(); + GameUI.setHallStar(); + //set_self(497,7,C_Player.bean,0,0); + //set_self(497,18,get_self(496,18,0,0,0)+get_self(496,20,0,0,0)/2-String(C_Player.bean).length*7,0,0); + if (!GameData.playerHeadImgState) { + Func.up_imgurl(25, C_Player.avatar); + } + set_group(3, 37, 1, 0, 0); + GameUI.hidePalletButton(); + set_self(219, 37, 0, 0, 0); + set_self(45, 37, 0, 0, 0); + set_self(220, 37, 0, 0, 0); + + if (C_Player.taskstate != 0) { + GameUI.ShowTaskTip(); + } else { + GameUI.HideTaskTip(); + } + GameUI.ShowNotice(GameData.scrollmsg); + Utl.playMusic(); + + + + if (GameData.versionState == 1) { //审核版本 + if (GameData.LaunchMode == ConstVal.Launch_mode.from_self) { + set_self(234, 37, 0, 0, 0); + } + set_self(17, 37, 0, 0, 0); + set_self(14, 37, 0, 0, 0); + set_self(16, 37, 0, 0, 0); + set_self(145, 37, 0, 0, 0); + set_self(340, 37, 0, 0, 0); + set_self(339, 37, 0, 0, 0); + set_self(681, 37, 0, 0, 0); + set_self(682, 37, 0, 0, 0); + set_self(178, 37, 0, 0, 0); + set_self(179, 37, 0, 0, 0); + set_self(180, 37, 0, 0, 0); + set_self(193, 37, 0, 0, 0); + set_self(194, 37, 0, 0, 0); + set_self(235, 37, 0, 0, 0); + set_self(483, 37, 0, 0, 0); + set_self(568, 37, 0, 0, 0); + set_self(604, 37, 0, 0, 0); + //if(GameData.hallConfig.enablePay == 0){ + set_self(286, 37, 0, 0, 0); + set_self(157, 37, 0, 0, 0); + set_self(287, 37, 0, 0, 0); + set_self(10, 37, 0, 0, 0); + set_self(508, 37, 0, 0, 0); + set_self(497, 37, 0, 0, 0); + set_self(496, 37, 0, 0, 0); + set_self(509, 37, 0, 0, 0); + + set_self(3233, 37, 0, 0, 0); + set_self(3232, 37, 0, 0, 0); + set_self(76, 37, 0, 0, 0); + set_self(3139, 37, 0, 0, 0); + set_self(679, 37, 0, 0, 0); + set_self(99, 37, 0, 0, 0); + set_self(3120, 37, 0, 0, 0); + set_self(3161, 37, 0, 0, 0); + set_self(3162, 37, 0, 0, 0); + //} + if (GameData.isShowNeighbor) { + GameUI.showNeighbor(); + } + set_self(3016, 37, 0, 0, 0); + set_self(3018, 37, 0, 0, 0); + set_self(3017, 37, 0, 0, 0); + } else { + //if(!Game_Config.Debugger.visiblePay){ + //set_self(10,37,0,0,0); + //} + //if(GameData.hallConfig.worldRoomList){//显示星星争霸场调整按钮位置 + //set_self(568,37,1,0,0); + //}else{ + //set_self(568,37,0,0,0); + //} + if (GameData.agentmode == 1) { + set_self(10, 37, 0, 0, 0); + set_self(509, 37, 0, 0, 0); + + } + set_self(235, 37, 0, 0, 0); + if (GameData.hallConfig.androidPay == 1) { + set_self(10, 37, 1, 0, 0); + set_self(509, 37, 1, 0, 0); + } + if (!GameData.matchhtml) { //比赛场 + //set_self(483,37,0,0,0); + } + if (GameData.hallConfig.worldRoomList) { //显示星星争霸场 + //set_self(568,37,1,0,0); + } else {} + if (GameData.hallConfig.rankList) { //显示排行榜 + //set_self(604,37,1,0,0); + } else { + //set_self(604,37,0,0,0); + } + if (GameData.hallConfig.wareHouse) { //保险箱 + //set_self(3057,37,1,0,0); + } else { + //set_self(3057,37,0,0,0); + } + //GameUI.showStoreBtn(); + //GameUI.showBagBtn(); + GameUI.updateActBtn(); + GameUI.showStoreBtn(); + //官方试玩 + if (!ConstVal.isGameHall) { + if (!Game_Config.sysConfig.vipInfinite) { + if (GameData.sysConfig.ofcShortCode) { + if (GameData.sysConfig.ofcImg) { + Func.up_imgurl(396, GameData.sysConfig.ofcImg); + } + } else { + //set_self(3139,37,0,0,0); + } + } else { + set_self(3139, 37, 0, 0, 0); + set_self(679, 37, 0, 0, 0); + } + } else { + set_self(3139, 37, 0, 0, 0); + set_self(679, 37, 0, 0, 0); + } + //} + if (GameData.h5Version == 1) { + GameData.gameData = Logic.setGameData("", ""); + GameData.shareAppMessage = Logic.getShareDataObj(Game_Config.Share.title, Game_Config.Share.description); + GameData.shareTimeline = Logic.getShareDataObj1(Game_Config.Share.title + Game_Config.Share.description, ""); + shareLink(GameData.shareTimeline, GameData.shareAppMessage); + //Logic.joinRoomFromH5(); + } + Logic.joinRoomFromH5(); + GameUI.updateInsertHTML(); + //GameUI.adaptButton1(); + //GameUI.adaptButton2(); + if (Game_Config.sysConfig) { + if (!Game_Config.sysConfig.mainMenuButton) { + //GameUI.startMenuSceneAnimation(); + } else { + set_self(11, 37, 0, 0, 0); + set_self(12, 37, 0, 0, 0); + set_self(568, 37, 0, 0, 0); + set_self(483, 37, 0, 0, 0); + } + } + Utl.openMatchUrl(); + if (GameData.Scene == 2) { + Game_Modify.onExitMainScene(); + } + if (Game_Modify.onMainMenuScene) { + Game_Modify.onMainMenuScene(); + } + GameData.Scene = 1; + GameUI.updateNoticeBoard(); + if (GameData.sysConfig.hideTaskBtn) { + set_self(17, 37, 0, 0, 0); + //set_self(14,18,400,0,0); + //set_self(13,18,650,0,0); + //set_self(5,18,900,0,0); + } + if (GameData.sysConfig.miniPro) { + //set_self(3120,37,0,0,0); + set_self(14, 37, 0, 0, 0); + + } + if(GameData.sysConfig.hideWxShare){ + set_self(14,37,0,0,0); + } + if (!ConstVal.isGameHall) { + GameUI.adaptSmartBar(); + } + + GameUI.stopTopInfoAnimation(true); + if (GameData.vipRoomJump) { + GameUI.openVipRoomList(); + } + if (GameData.hallConfig.rankList) { //显示排行榜 + set_self(3233,37,1,0,0); + } else { + set_self(3233,37,0,0,0); + } + if(GameData.sysConfig.deviceLogin){ + set_self(3256,37,0,0,0); + }else{ + set_self(3256,37,0,0,0); + } + // if(C_Player.tel){ + // set_self(3256,43,2,0,0); + // play_ani(0,3256,35,255,100,0,1000,0,0,0,0,0,1); + // }else{ + // set_self(3256,43,1,0,0); + // play_ani(1,3256,35,255,100,0,1000,0,0,0,0,0,1); + // } + if (ConstVal.isGameHall) { + set_self(14, 37, 0, 0, 0); + set_self(13, 37, 0, 0, 0); + set_self(17, 37, 0, 0, 0); + set_self(3120, 37, 0, 0, 0); + set_self(99, 37, 0, 0, 0); + set_self(3016, 37, 0, 0, 0); + set_self(76, 37, 0, 0, 0); + set_self(234, 37, 0, 0, 0); + set_self(3057, 37, 0, 0, 0); + set_self(145, 37, 0, 0, 0); + set_self(3139, 37, 0, 0, 0); + set_self(3232,37,0,0,0); + set_self(3233,37,0,0,0); + //set_self(3256,37,0,0,0); + //if(GameData.hallConfig.rankList){//显示排行榜 + // set_self(604,37,1,0,0); + //}else{ + set_self(604, 37, 0, 0, 0); + //} + //if(GameData.hallConfig.wareHouse){//保险箱 + // set_self(3057,37,1,0,0); + //}else{ + // set_self(3057,37,0,0,0); + //} + if (GameData.agentmode == 1) { + set_self(235, 37, 0, 0, 0); + } else { + set_self(235, 37, 1, 0, 0); + } + set_self(15, 37, 1, 0, 0); //吐槽 + set_self(5, 37, 1, 0, 0); //消息 + //var spList = [235,13,604,3017,483,3018,3057]; + //var posList = [[395,198],[395,325],[395,452],[526,198],[526,325],[526,452],[657,198]]; + //GameUI.adaptBtnList(spList,posList); + GameUI.adaptSmartBar2(); + set_self(145, 37, 0, 0); + gameHallImport.jumpMenuScene(); + } + } + Logic.sendPhoneInfo(); + if(GameData.sysConfig.hideRoomCard == 2){ + set_self(286,37,0,0,0); + set_self(10,37,0,0,0); + set_self(287,37,0,0,0); + set_self(3161,37,0,0,0); + } + if(GameData.sysConfig.cdKey == 2){ + set_self(3264,37,1,0,0); + }else{ + set_self(3264,37,0,0,0); + } +} +GameUI.adaptSmartBar2 = function() { + var spList = [235, 15, 5, 7]; + var beginX = 300; + var endX = 820; + var count = 0; + //var posList = []; + for (var i = 0; i < spList.length; i++) { + if (get_self(spList[i], 37, 0, 0, 0) == 1) { + count++; + } + } + var deltaX = (endX - beginX) / (count - 1); + + var showCount = 0; + for (var i = 0; i < spList.length; i++) { + if (get_self(spList[i], 37, 0, 0, 0) == 1) { + set_self(spList[i], 18, beginX + deltaX * showCount, 0, 0); + set_self(spList[i], 19, 642, 0, 0); + showCount++; + } + } +} +GameUI.adaptSmartBar = function() { + var spList = [3120, 14, 17, 13, 7]; + var count = 0; + //var posList = []; + for (var i = 0; i < spList.length; i++) { + if (get_self(spList[i], 37, 0, 0, 0) == 1) { + count++; + } + } + if (count == 0) { + return; + } + if (count == 1) { + for (var i = 0; i < spList.length; i++) { + if (get_self(spList[i], 37, 0, 0, 0) == 1) { + set_self(spList[i], 18, 558, 0, 0); + + } + } + return; + } + var posList = [376, 740]; + var c2 = 0; + if (count == 2) { + for (var i = 0; i < spList.length; i++) { + if (get_self(spList[i], 37, 0, 0, 0) == 1) { + set_self(spList[i], 18, posList[c2], 0, 0); + c2++; + } + } + return; + } + //194 922 + var beginX = 194; + var endX = 922; + var deltaX = (endX - beginX) / (count - 1); + var showCount = 0; + for (var i = 0; i < spList.length; i++) { + if (get_self(spList[i], 37, 0, 0, 0) == 1) { + set_self(spList[i], 18, beginX + deltaX * showCount, 0, 0); + showCount++; + } + } +} +GameUI.adaptButton1 = function() { + var spList = [235, 13, 604, 3017, 483, 3018, 3057]; + var posList = [ + [395, 198], + [395, 325], + [395, 452], + [526, 198], + [526, 325], + [526, 452], + [657, 198] + ]; + var posIndex = 0; + for (var i = 0; i < spList.length; i++) { + if (get_self(spList[i], 37, 0, 0, 0) == 1) { + set_self(spList[i], 18, posList[posIndex][0], 0, 0); + set_self(spList[i], 19, posList[posIndex][1], 0, 0); + posIndex++; + } + } +} +GameUI.adaptButton2 = function() { + if (GameData.hallConfig.storeUrl) { + set_self(17, 18, 160, 0, 0); + set_self(14, 18, 379, 0, 0); + set_self(15, 18, 598, 0, 0); + set_self(234, 18, 817, 0, 0); + } else { + set_self(17, 18, 160, 0, 0); + set_self(14, 18, 379, 0, 0); + set_self(15, 18, 598, 0, 0); + set_self(234, 18, 817, 0, 0); + } + var spList = []; + var posList = []; + if (get_self(3016, 37, 0, 0, 0) == 1) { + spList = [17, 14, 15, 234, 3016]; + posList = [ + [160, 613], + [379, 613], + [598, 613], + [817, 613], + [1019, 604] + ]; + } else { + spList = [17, 14, 15, 234]; + posList = [ + [184, 613], + [443, 613], + [702, 613], + [961, 613] + ]; + } + var posIndex = 0; + for (var i = 0; i < spList.length; i++) { + if (get_self(spList[i], 37, 0, 0, 0) == 1) { + set_self(spList[i], 18, posList[posIndex][0], 0, 0); + set_self(spList[i], 19, posList[posIndex][1], 0, 0); + posIndex++; + } + } +} +GameUI.showStoreBtn = function() { + //set_self(3016,18,1029,0,0); + //set_self(3016,19,604,0,0); + if (GameData.hallConfig.storeUrl) { + set_self(3016, 37, 1, 0, 0); + } else { + set_self(3016, 37, 0, 0, 0); + } +} +GameUI.showBagBtn = function() { + if (GameData.hallConfig.bagUrl) { + set_self(3017, 37, 1, 0, 0); + } else { + set_self(3017, 37, 0, 0, 0); + } +} +GameUI.ShowTaskTip = function() { + set_self(221, 37, 1, 0, 0); +} +GameUI.HideTaskTip = function() { + set_self(221, 37, 0, 0, 0); +} +GameUI.OpenJoinRoom = function() { + Utl.playSound(Game_Config.ClickButton.src_2); + + + set_group(5, 37, 1, 0, 0); + var _roomcode = Logic.readShortCode(); + if (_roomcode) { + _roomcode = String(_roomcode); + RoomNum = Number(_roomcode); + RoomCode = _roomcode; + for (var i = 0; i < 6; i++) { + if (i < _roomcode.length) { + set_self(236 + i, 7, _roomcode[i], 0, 0); + } else { + set_self(236 + i, 37, 0, 0, 0); + } + + } + } else { + RoomCode = ""; + RoomNum = -1; + for (var i = 0; i < 6; i++) { + set_self(236 + i, 37, 0, 0, 0); + } + } + + +} +GameUI.CloseJoinRoom = function() { + set_group(5, 37, 0, 0, 0); +} +GameUI.StartLoad = function() { + if (get_self(326, 37, 0, 0, 0) == 0) { + set_group(40, 37, 1, 0, 0); + play_ani(1, 327, 34, 0, 360, 0, 1000, 0, 0, 0, 0, 0, 0, 0); + } + + +} +GameUI.EndLoad = function() { + set_group(40, 37, 0, 0, 0); + play_ani(0, 327, 34, 0, 360, 0, 1000, 0, 0, 0, 0, 0, 0, 0); +} +GameUI.OpenSetting = function(mode) { + Utl.playSound(Game_Config.ClickButton.src_2); + var bgm = Utl.ReadData(Utl.Config.bgm); + var sound = Utl.ReadData(Utl.Config.sound); + var shake = Utl.ReadData(Utl.Config.shake); + var voice = Utl.ReadData(Utl.Config.voice); + if (bgm == 0) { + set_self(43, 43, 2, 0, 0); + + } else { + set_self(43, 43, 1, 0, 0); + + } + if (sound == 0) { + set_self(44, 43, 2, 0, 0); + + } else { + set_self(44, 43, 1, 0, 0); + + } + if (shake == 0) { + set_self(357, 43, 2, 0, 0); + + } else { + set_self(357, 43, 1, 0, 0); + + } + if (voice == 0) { + set_self(388, 43, 2, 0, 0); + + } else { + set_self(388, 43, 1, 0, 0); + + } + set_self(181, 18, 361, 0, 0); + set_self(182, 18, 691, 0, 0); + set_group(6, 37, 1, 0, 0); + switch (mode) { + case 0: + //菜单界面设置 + set_self(181, 37, 0, 0, 0); + set_self(182, 37, 0, 0, 0); + + break; + case 1: + //主界面设置 + set_self(58, 37, 0, 0, 0); + GameUI.closeMainSceneBtnPanel(); + switch (C_Player.canexit) { + case 1: + set_self(181, 18, 361, 0, 0); + set_self(182, 18, 691, 0, 0); + if (C_Player.status == 1 && Desk.stage == 0) { + set_self(181, 43, 4, 0, 0); + } else { + set_self(181, 43, 3, 0, 0); + } + if (Desk.infinite == 1 && !Game_Config.sysConfig.vipInfinite) { + set_self(181, 43, 3, 0, 0); + set_self(182, 37, 0, 0, 0); + set_self(181, 18, 520, 0, 0); + } + if (GameData.matchId || GameData.sysConfig.hideWxShare) { //比赛房间 + set_self(181, 43, 3, 0, 0); + GameUI.adaptPositionSpid(181, 41); + set_self(182, 37, 0, 0, 0); + } + break; + case 0: + set_self(181, 43, 1, 0, 0); + set_self(181, 18, 361, 0, 0); + if (Desk.infinite == 1 && !Game_Config.sysConfig.vipInfinite) { + set_self(182, 37, 0, 0, 0); + set_self(181, 18, 520, 0, 0); + } + if (GameData.matchId) { //比赛房间 + set_self(181, 37, 0, 0, 0); + set_self(182, 37, 0, 0, 0); + //GameUI.adaptPositionSpid(182,41); + } + break; + } + + break; + } +} +GameUI.CloseSetting = function() { + set_group(6, 37, 0, 0, 0); +} +GameUI.ClickBgm = function() { //点击音乐按钮 + var bgm = Utl.ReadData(Utl.Config.bgm); + if (bgm == 0) { + + Logic.TurnOnBgm(); + set_self(43, 43, 1, 0, 0); + + } else { + + Logic.TurnOffBgm(); + set_self(43, 43, 2, 0, 0); + + } +} +GameUI.ClickSound = function() { //点击音效按钮 + var sound = Utl.ReadData(Utl.Config.sound); + if (sound == 0) { + Logic.TurnOnSound(); + set_self(44, 43, 1, 0, 0); + + } else { + Logic.TurnOffSound(); + set_self(44, 43, 2, 0, 0); + + } +} +GameUI.ClickShake = function() { //点击摇一摇 + var shake = Utl.ReadData(Utl.Config.shake); + if (shake == 0) { + Logic.TurnOnShake(); + set_self(357, 43, 1, 0, 0); + + } else { + Logic.TurnOffShake(); + set_self(357, 43, 2, 0, 0); + + } +} +GameUI.ClickVoice = function() { //点击音效按钮 + var voice = Utl.ReadData(Utl.Config.voice); + if (voice == 0) { + Logic.TurnOnVoice(); + set_self(388, 43, 1, 0, 0); + + } else { + Logic.TurnOffVoice(); + set_self(388, 43, 2, 0, 0); + + } +} +GameUI.OpenShare = function() { //打开分享页 + Utl.playSound(Game_Config.ClickButton.src_2); + if (GameData.hallConfig.shareBgUrl) { + Func.up_imgurl(345, GameData.hallConfig.shareBgUrl); + } + + set_group(11, 37, 1, 0, 0); + //if(GameData.sysConfig.miniPro){ + + //} +} +GameUI.CloseShare = function() { //关闭分享页 + set_group(11, 37, 0, 0, 0); +} +GameUI.SetMessageInfo = function(_msg) { //设置消息内容 + set_self(81, 7, _msg, 0, 0) +} +GameUI.OpenBoard = function() { //打开通知 + Utl.playSound(Game_Config.ClickButton.src_2); + set_self(570, 43, 1, 0, 0); + set_self(571, 43, 2, 0, 0); + set_self(572, 43, 2, 0, 0); + + set_self(573, 43, 2, 0, 0); + set_self(574, 43, 3, 0, 0); + set_self(575, 43, 5, 0, 0); + + + set_self(3102, 18, ConstVal.Notice.img_clip_x, 0, 0); + set_self(3102, 19, ConstVal.Notice.img_clip_y, 0, 0); + + GameData.noticePage = 0; + if (GameData.advertInfo_0.imgUrl) { + Func.up_imgurl(338, GameData.advertInfo_0.imgUrl); + } + if (GameData.advertInfo_1.imgUrl) { + Func.up_imgurl(339, GameData.advertInfo_1.imgUrl); + } + if (GameData.advertInfo_2.imgUrl) { + Func.up_imgurl(340, GameData.advertInfo_2.imgUrl); + } + if (!GameData.advertInfo_0.type) { + set_self(81, 7, GameData.advertInfo_0.msg, 0, 0); + set_self(404, 18, ConstVal.Notice.clip_x, 0, 0); + set_self(404, 19, ConstVal.Notice.clip_y, 0, 0); + set_self(81, 18, ConstVal.Notice.clip_x, 0, 0); + set_self(81, 19, ConstVal.Notice.clip_y, 0, 0); + set_self(404, 20, GameData.noticePara[GameData.noticePage][1], 0, 0); + set_self(404, 21, GameData.noticePara[GameData.noticePage][0], 0, 0); + + set_group(12, 37, 1, 0, 0); + + if (GameData.advertInfo_0.url) { + set_self(576, 37, 1, 0, 0); + } else { + set_self(576, 37, 0, 0, 0); + } + set_self(3102, 37, 0, 0, 0); + set_self(3105, 37, 0, 0, 0); + set_self(3106, 37, 0, 0, 0); + } else { + + set_group(12, 37, 1, 0, 0); + set_self(404, 37, 0, 0, 0); + set_self(81, 37, 0, 0, 0); + set_self(576, 37, 0, 0, 0); + set_self(3102, 1, 338, 0, 0); + set_self(3102, 21, GameData.advertInfo_0.height, 0, 0); + set_self(3102, 37, 1, 0, 0); + set_self(3105, 37, 0, 0, 0); + set_self(3106, 37, 0, 0, 0); + } + if (!GameData.advertInfo_1.msg && !GameData.advertInfo_1.imgUrl) { + //set_self(570,37,0,0,0); + set_self(571, 37, 0, 0, 0); + set_self(572, 37, 0, 0, 0); + //set_self(573,37,0,0,0); + set_self(574, 37, 0, 0, 0); + set_self(575, 37, 0, 0, 0); + + } +} +GameUI.goBoardPageOne = function() { //跳转通知页一 + GameData.noticePage = 0; + set_self(570, 43, 1, 0, 0); + set_self(571, 43, 2, 0, 0); + set_self(572, 43, 2, 0, 0); + + set_self(573, 43, 2, 0, 0); + set_self(574, 43, 3, 0, 0); + set_self(575, 43, 5, 0, 0); + if (!GameData.advertInfo_0.type) { + set_self(3102, 37, 0, 0, 0); + set_self(3105, 37, 0, 0, 0); + set_self(3106, 37, 0, 0, 0); + set_self(404, 37, 1, 0, 0); + set_self(81, 37, 1, 0, 0); + if (GameData.advertInfo_0.url) { + set_self(576, 37, 1, 0, 0); + } else { + set_self(576, 37, 0, 0, 0); + } + + set_self(81, 7, GameData.advertInfo_0.msg, 0, 0); + set_self(404, 18, ConstVal.Notice.clip_x, 0, 0); + set_self(404, 19, ConstVal.Notice.clip_y, 0, 0); + set_self(81, 18, ConstVal.Notice.clip_x, 0, 0); + set_self(81, 19, ConstVal.Notice.clip_y, 0, 0); + set_self(404, 20, GameData.noticePara[GameData.noticePage][1], 0, 0); + set_self(404, 21, GameData.noticePara[GameData.noticePage][0], 0, 0); + } else { + set_self(3105, 37, 0, 0, 0); + set_self(3106, 37, 0, 0, 0); + set_self(404, 37, 0, 0, 0); + set_self(81, 37, 0, 0, 0); + set_self(3102, 18, ConstVal.Notice.img_clip_x, 0, 0); + set_self(3102, 19, ConstVal.Notice.img_clip_y, 0, 0); + //set_self(3102,1,338,0,0); + set_self(3102, 21, GameData.advertInfo_0.height, 0, 0); + set_self(3102, 37, 1, 0, 0); + } + +} +GameUI.goBoardPageTwo = function() { //跳转通知页二 + GameData.noticePage = 1; + set_self(570, 43, 2, 0, 0); + set_self(571, 43, 1, 0, 0); + set_self(572, 43, 2, 0, 0); + + set_self(573, 43, 1, 0, 0); + set_self(574, 43, 4, 0, 0); + set_self(575, 43, 5, 0, 0); + if (!GameData.advertInfo_1.type) { + set_self(3102, 37, 0, 0, 0); + set_self(3105, 37, 0, 0, 0); + set_self(3106, 37, 0, 0, 0); + set_self(404, 37, 1, 0, 0); + set_self(81, 37, 1, 0, 0); + + set_self(404, 18, ConstVal.Notice.clip_x, 0, 0); + set_self(404, 19, ConstVal.Notice.clip_y, 0, 0); + set_self(81, 18, ConstVal.Notice.clip_x, 0, 0); + set_self(81, 19, ConstVal.Notice.clip_y, 0, 0); + set_self(81, 7, GameData.advertInfo_1.msg, 0, 0); + set_self(404, 20, GameData.noticePara[GameData.noticePage][1], 0, 0); + set_self(404, 21, GameData.noticePara[GameData.noticePage][0], 0, 0); + if (GameData.advertInfo_1.url) { + set_self(576, 37, 1, 0, 0); + } else { + set_self(576, 37, 0, 0, 0); + } + } else { + set_self(3102, 37, 0, 0, 0); + set_self(3106, 37, 0, 0, 0); + set_self(404, 37, 0, 0, 0); + set_self(81, 37, 0, 0, 0); + set_self(3105, 18, ConstVal.Notice.img_clip_x, 0, 0); + set_self(3105, 19, ConstVal.Notice.img_clip_y, 0, 0); + //set_self(3105,1,339,0,0); + set_self(3105, 21, GameData.advertInfo_1.height, 0, 0); + set_self(3105, 37, 1, 0, 0); + } +} +GameUI.goBoardPageThree = function() { //跳转通知页三 + GameData.noticePage = 2; + set_self(570, 43, 2, 0, 0); + set_self(571, 43, 2, 0, 0); + set_self(572, 43, 1, 0, 0); + set_self(573, 43, 1, 0, 0); + set_self(574, 43, 3, 0, 0); + set_self(575, 43, 6, 0, 0); + if (!GameData.advertInfo_2.type) { + set_self(3102, 37, 0, 0, 0); + set_self(3105, 37, 0, 0, 0); + set_self(3106, 37, 0, 0, 0); + set_self(404, 37, 1, 0, 0); + set_self(81, 37, 1, 0, 0); + + set_self(404, 18, ConstVal.Notice.clip_x, 0, 0); + set_self(404, 19, ConstVal.Notice.clip_y, 0, 0); + set_self(81, 18, ConstVal.Notice.clip_x, 0, 0); + set_self(81, 19, ConstVal.Notice.clip_y, 0, 0); + set_self(81, 7, GameData.advertInfo_2.msg, 0, 0); + set_self(404, 20, GameData.noticePara[GameData.noticePage][1], 0, 0); + set_self(404, 21, GameData.noticePara[GameData.noticePage][0], 0, 0); + if (GameData.advertInfo_2.url) { + set_self(576, 37, 1, 0, 0); + } else { + set_self(576, 37, 0, 0, 0); + } + } else { + set_self(3102, 37, 0, 0, 0); + set_self(3105, 37, 0, 0, 0); + set_self(404, 37, 0, 0, 0); + set_self(81, 37, 0, 0, 0); + set_self(3106, 18, ConstVal.Notice.img_clip_x, 0, 0); + set_self(3106, 19, ConstVal.Notice.img_clip_y, 0, 0); + //set_self(3106,1,340,0,0); + set_self(3106, 21, GameData.advertInfo_2.height, 0, 0); + set_self(3106, 37, 1, 0, 0); + } +} +GameUI.CloseBoard = function(_msg) { //关闭消息 + set_group(12, 37, 0, 0, 0); +} +GameUI.OpenInfo_hall = function() { //打开个人信息 + Utl.playSound(Game_Config.ClickButton.src_2); + InfoSex = C_Player.sex; + set_self(118, 1, 25, 0, 0); + set_group(18, 37, 1, 0, 0); + set_self(196, 7, Func.subString(C_Player.nickname, Game_Config.Max.Infonickname, true), 0, 0); + set_self(197, 7, "ID:" + C_Player.playerid, 0, 0); + set_self(198, 7, "IP:" + C_Player.ip, 0, 0); + set_self(3152, 7, "个性签名:", 0, 0); + set_self(199, 7, "积分:" + C_Player.score, 0, 0); + set_self(510, 7, GameData.starName + ":" + C_Player.bean, 0, 0); + if (C_Player.addr && C_Player.addr.errorCode == 0) { + set_self(200, 7, C_Player.addr.province + "-" + C_Player.addr.city, 0, 0); + //set_self(117,21,260,0,0); + } else { + set_self(200, 7, "获取定位失败!", 0, 0); + //set_self(117,21,240,0,0); + } + GameUI.setSign(); + if (!GameData.hallConfig.enablePay) { + set_self(510, 37, 0, 0, 0); + } + if (GameData.versionState == 1) { + set_self(510, 37, 0, 0, 0); + } +} +GameUI.setSign = function() { + //C_Player.sign = "分feeeeeeeeeeeeef else f qw eg wqegwqg"; + if (!C_Player.sign) { + set_self(3157, 7, "这个家伙很懒~~", 0, 0); + return; + } + var textW = 13; + var space = 15; + var bgW = get_self(3156, 20, 0, 0, 0); + var count = parseInt((bgW - 2 * space) / textW); + var str = Func.insertFlag(C_Player.sign, "\n", count); + set_self(3157, 18, get_self(3156, 18, 0, 0) + space, 0, 0); + set_self(3157, 7, str, 0, 0); +} +GameUI.CloseInfo_hall = function() { //关闭个人信息 + set_group(18, 37, 0, 0, 0); +} +GameUI.OpenInfo = function(ind, nickname, playerid, ip, sex, seat, bean, cVal) { //打开个人信息 + Utl.playSound(Game_Config.ClickButton.src_2); + GameData.infoSeat = seat; + InfoSex = sex; + if (ind != -1) { + set_self(282, 1, 116 + ind, 0, 0); + } else { + set_self(282, 1, 25, 0, 0); + } + + + set_self(279, 7, Func.subString(nickname, Game_Config.Max.Infonickname, true), 0, 0); + set_self(280, 7, "ID:" + playerid, 0, 0); + set_self(281, 7, "IP:" + ip, 0, 0); + set_self(511, 7, GameData.starName + ":" + bean, 0, 0); + + set_self(216, 21, 230, 0, 0); + set_group(77, 37, 1, 0, 0); + GameUI.setShortRoom(GameData.infoSeat, cVal); + if (typeof(seat) != "undefined") { + var status = Logic.ChangeToStatus(C_Player.seat, seat); + if (status != 0) { + GameData.InteractPlayer = seat; + set_self(216, 21, 325, 0, 0); + set_group(38, 37, 1, 0, 0); + } + } + if (!GameData.hallConfig.enablePay) { + set_self(511, 37, 0, 0, 0); + } + +} +GameUI.setShortRoom = function(seat, val) { + if (get_self(216, 37, 0, 0, 0)) { + if (GameData.infoSeat == seat) { //显示的为当前变化的玩家 + if (typeof val != "undefined") { + set_self(3125, 7, GameData.sysConfig.charmName + ":" + val, 0, 0); + } else { + set_self(3125, 37, 0, 0, 0); + } + } + } else { + + } +} +GameUI.CloseInfo = function() { //关闭个人信息 + set_group(77, 37, 0, 0, 0); + set_group(38, 37, 0, 0, 0); +} +GameUI.OpenTask = function() { //打开任务 + GameData.copyTaskTagList = []; + set_self(ConstVal.Task.bg_spid, 43, GameData.nameImgFrame_1, 0, 0); + set_group(10, 37, 1, 0, 0); + set_self(ConstVal.Task.f_spid, 18, ConstVal.Task.clip_x); + set_self(ConstVal.Task.f_spid, 19, ConstVal.Task.clip_y); + set_self(ConstVal.Task.f_spid, 21, ConstVal.Task.clip_h); + var task_des = ""; + var reward_des = ""; + var proc_des = ""; + + var bg_copy = ""; + var task_des_copy = ""; + var reward_des_copy = ""; + var proc_copy = ""; + var proc_des_copy = ""; + + var Dis = ConstVal.Task.bg_w + ConstVal.Task.bg_dis_x; + + var bg_x = 0; + var task_des_x = 0; + var reward_des_x = 0; + var proc_des_x = 0; + + for (var i = 0; i < TaskInfo.length; i++) { + var text = TaskInfo[i].title; + var text_copy = ""; + for (var k = 0; k < text.length; k++) { + text_copy += text[k]; + if ((k + 1) % 8 == 0 && k != 0) { + text_copy += "\n"; + } + } + + + //公共需要显示的 + task_des = text_copy; + reward_des = "奖励" + GameData.roomCardName + ",数量:" + TaskInfo[i].award; + bg_x = ConstVal.Task.bg_x + ConstVal.Task.bg_x + i * Dis; + task_des_x = ConstVal.Task.bg_x + ConstVal.Task.task_des_x + i * Dis; + reward_des_x = ConstVal.Task.bg_x + ConstVal.Task.bg_w / 2 - reward_des.gblen() * 6.5 + i * Dis; + + bg_copy = ifast_addtospritefromspritecopy(ConstVal.Task.f_spid, ConstVal.Task.bg_spid, bg_x, ConstVal.Task.bg_y + ConstVal.Task.bg_y, ConstVal.Task.bg_tag + i); //背景精灵复制 + GameData.copyTaskTagList.push(ConstVal.Task.bg_tag + i); + + task_des_copy = ifast_addtospritefromspritecopy(ConstVal.Task.f_spid, ConstVal.Task.task_des_spid, task_des_x, ConstVal.Task.bg_y + ConstVal.Task.task_des_y, ConstVal.Task.task_des_tag + i); //任务详情描述 + set_self(task_des_copy, 7, task_des, 0, 0); + GameData.copyTaskTagList.push(ConstVal.Task.task_des_tag + i); + + reward_des_copy = ifast_addtospritefromspritecopy(ConstVal.Task.f_spid, ConstVal.Task.reward_des_spid, reward_des_x, ConstVal.Task.bg_y + ConstVal.Task.reward_des_y, ConstVal.Task.reward_des_tag + i); //任务奖励描述 + set_self(reward_des_copy, 7, reward_des, 0, 0); + GameData.copyTaskTagList.push(ConstVal.Task.reward_des_tag + i); + //根据任务状态显示 + + proc_des = TaskInfo[i].finish + "/" + TaskInfo[i].total; + proc_des_x = ConstVal.Task.bg_x + ConstVal.Task.bg_w / 2 - proc_des.gblen() * 3.25 + i * Dis; + if (TaskInfo[i].state == 0) { //任务一未完成 + if (i == 0) { //第一个任务需要显示去做任务 + ifast_addtospritefromspritecopy(ConstVal.Task.f_spid, ConstVal.Task.tofinish_btn_spid, ConstVal.Task.bg_x + ConstVal.Task.bg_w / 2 - get_self(ConstVal.Task.tofinish_btn_spid, 20, 0, 0, 0) / 2, ConstVal.Task.bg_y + ConstVal.Task.tofinish_btn_y, ConstVal.Task.tofinish_btn_tag + i); //去做任务 + GameData.copyTaskTagList.push(ConstVal.Task.tofinish_btn_tag + i); + } + ifast_addtospritefromspritecopy(ConstVal.Task.f_spid, ConstVal.Task.proc_bg_spid, ConstVal.Task.bg_x + ConstVal.Task.bg_w / 2 - get_self(ConstVal.Task.proc_bg_spid, 20, 0, 0, 0) / 2 + i * Dis, ConstVal.Task.bg_y + ConstVal.Task.proc_bg_y, ConstVal.Task.proc_bg_tag + i); //任务进度背景 + GameData.copyTaskTagList.push(ConstVal.Task.proc_bg_tag + i); + proc_copy = ifast_addtospritefromspritecopy(ConstVal.Task.f_spid, ConstVal.Task.proc_spid, ConstVal.Task.bg_x + ConstVal.Task.bg_w / 2 - get_self(ConstVal.Task.proc_spid, 20, 0, 0, 0) / 2 + i * Dis, ConstVal.Task.bg_y + ConstVal.Task.proc_y, ConstVal.Task.proc_tag + i); //任务进度前景 + set_self(proc_copy, 20, get_self(ConstVal.Task.proc_spid, 20, 0, 0, 0) * TaskInfo[i].finish / TaskInfo[i].total, 0, 0); + GameData.copyTaskTagList.push(ConstVal.Task.proc_tag + i); + proc_des_copy = ifast_addtospritefromspritecopy(ConstVal.Task.f_spid, ConstVal.Task.proc_des_spid, proc_des_x, ConstVal.Task.bg_y + ConstVal.Task.proc_des_y, ConstVal.Task.proc_des_tag + i); //任务进度文字描述 + set_self(proc_des_copy, 7, proc_des, 0, 0); + GameData.copyTaskTagList.push(ConstVal.Task.proc_des_tag + i); + } else { //任务一已完成 + if (TaskInfo[i].state == 1) { //未领取 + ifast_addtospritefromspritecopy(ConstVal.Task.f_spid, ConstVal.Task.get_reward_btn_spid, ConstVal.Task.bg_x + ConstVal.Task.bg_w / 2 - get_self(ConstVal.Task.get_reward_btn_spid, 20, 0, 0, 0) / 2 + i * Dis, ConstVal.Task.bg_y + ConstVal.Task.get_reward_btn_y, ConstVal.Task.get_reward_btn_tag + i); //领取奖励 + GameData.copyTaskTagList.push(ConstVal.Task.get_reward_btn_tag + i); + } else { + ifast_addtospritefromspritecopy(ConstVal.Task.f_spid, ConstVal.Task.isreward_spid, ConstVal.Task.bg_x + ConstVal.Task.bg_w / 2 - get_self(ConstVal.Task.isreward_spid, 20, 0, 0, 0) / 2 + i * Dis, ConstVal.Task.bg_y + ConstVal.Task.isreward_y, ConstVal.Task.isreward_tag + i); //领取奖励 + GameData.copyTaskTagList.push(ConstVal.Task.isreward_tag + i); + } + } + + } + set_self(ConstVal.Task.f_spid, 20, TaskInfo.length * Dis, 0, 0); + +} + +GameUI.CloseTask = function() { //关闭任务 + for (var tag = 0; tag < GameData.copyTaskTagList.length; tag++) { + ifast_dllpritefromspritecopy(ConstVal.Task.f_spid, tag); + } + set_group(10, 37, 0, 0, 0); +} + +GameUI.OpenHelp = function() { //打开帮助 + Game_Modify.onOpenHelp(290); + Utl.playSound(Game_Config.ClickButton.src_2); + GameUI.closeMainSceneBtnPanel(); + set_group(19, 37, 1, 0, 0); +} +GameUI.CloseHelp = function() { + set_group(19, 37, 0, 0, 0); +} +GameUI.SetTaskInfo = function(_msg) { + TaskInfo = _msg.data.tasks; +} +GameUI.OpenCharge = function(_msg) { //打开充值提示 + set_self(148, 7, _msg, 1, 0); + set_self(680, 7, GameData.wechat_gzh, 0, 0); + set_self(680, 20, GameData.wechat_gzh.gblen() * 13.5, 0, 0); + set_group(20, 37, 1, 0, 0); + +} +GameUI.CloseCharge = function() { //关闭充值 + set_group(20, 37, 0, 0, 0); +} +GameUI.MainScene = function(bTemp) { //游戏主界面 + GameUI.stopMenuSceneAnimation(); + this.HideNotice(); + + set_self(195, 43, GameData.nameImgFrame_1, 0, 0); + //GameUI.Mem.headSize[0] = get_self(376,20,0,0,0); + //GameUI.Mem.headSize[1] = get_self(376,21,0,0,0); + if (bTemp) { //显示 + this.invisible(); + //GameData.getnetwork = "MainScene"; + if (Desk.roomcode) { + set_self(3141, 7, Desk.roomcode, 0, 0); + } + GameData.NetWork = Func.getnetwork(); + if (GameData.NetWork == 2) { + set_self(336, 43, 3, 0, 0); + Func.getwifisignalLevel(); + } else { + set_self(336, 43, 4, 0, 0); + } + GameData.Battery = Func.getbattery(); + + if (GameData.Battery <= 0.2) { + set_self(338, 43, 3, 0, 0); + } else { + set_self(338, 43, 2, 0, 0); + } + + if (GameData.OS == ConstVal.OS.apple) { //苹果 + set_self(154, 1, 174, 0, 0); + set_self(155, 1, 174, 0, 0); + set_self(156, 1, 173, 0, 0); + } else if (GameData.OS == ConstVal.OS.android) { //安卓 + set_self(154, 1, 69, 0, 0); + set_self(155, 1, 69, 0, 0); + set_self(156, 1, 70, 0, 0); + } + + + + set_group(21, 37, 1, 0, 0); + set_self(3115, 37, 0, 0, 0); + set_self(3116, 37, 0, 0, 0); + GameUI.updateSysNoticeCount2(); + GameUI.updatePlayerInfoUI(); + GameUI.openRoomInfo(); + set_self(3141, 37, 0, 0, 0); + set_self(3142, 37, 0, 0, 0); + GameUI.playTopInfoAnimation(); + } else { //隐藏 + set_group(21, 37, 0, 0, 0); + } + Utl.playMusic(); + GameData.Scene = 2; + Game_Modify.onEnterMainScene(Desk.roomtype); + GameData.gameData = Logic.setGameData(h5RpcList.joinRoom, { + roomcode: Desk.roomcode + }); + if (GameData.h5Version == 1) { + //GameData.gameData = Logic.setGameData(h5RpcList.joinRoom,{roomcode:Desk.roomcode}); + GameData.shareAppMessage = Logic.getShareDataObj(Game_Config.Share.title + Game_Config.Share.gameTitle + GameData.shareMsg, Game_Config.Share.gameDescription); + GameData.shareTimeline = Logic.getShareDataObj1(Game_Config.Share.title + Game_Config.Share.description, ""); + shareLink(GameData.shareTimeline, GameData.shareAppMessage); + } + GameUI.updateInsertHTML(); + if (GameData.sysConfig.miniPro) { + set_self(153, 37, 0, 0, 0); + } + +} +GameUI.mainSceneLoaded = function() { + if (Game_Config.sysConfig) { + if (Game_Config.sysConfig.mainSceneButton) { + Utl.closeMainSceneButton(); + var type = 0; + if (Game_Config.sysConfig.vipInfinite) { + type = 1; + } + Utl.closeCommunication(type); + } + } +} +GameUI.updatePlayerInfoUI = function() { + if (Game_Config.sysConfig) { + if (Game_Config.sysConfig.mainScenePlayerInfo) { + return; + } + } + if(typeof Game_Modify.updatePlayerInfoUI !== 'undefined'){ + for(var i = 0; i < Desk.PlayerList.length; i++){ + Game_Modify.updatePlayerInfoUI(i); + } + }else{ + for (var i = 0; i < Desk.PlayerList.length; i++) { + if (Desk.PlayerList[i].playerid != -1) { + var ind = Logic.ChangeToStatus(C_Player.seat, i); + var text = Func.subString(Desk.PlayerList[i].nickname, Game_Config.Info.Mainnickname, true); + set_self(406 + ind, 7, text, 0, 0); + if (ind == 0) { + if (Game_Config.Info.myPositionDefault) { + set_self(406 + ind, 18, get_self(376 + ind, 18, 0, 0, 0) + get_self(376 + ind, 20, 0, 0, 0) / 2 - text.gblen() * Game_Config.Info.textwidth_1 / 2, 0, 0); + } else { + set_self(406 + ind, 18, Game_Config.Info.myPosition - text.gblen() * Game_Config.Info.textwidth_1 / 2, 0, 0); + } + } else { + if (Game_Config.Info.otherPositionDefault) { + set_self(406 + ind, 18, get_self(376 + ind, 18, 0, 0, 0) + get_self(376 + ind, 20, 0, 0, 0) / 2 - text.gblen() * Game_Config.Info.textwidth_1 / 2, 0, 0); + } else { + set_self(406 + ind, 18, Game_Config.Info.position[ind - 1] - text.gblen() * Game_Config.Info.textwidth_1 / 2, 0, 0); + } + } + + set_self(436 + ind, 7, 0, 0, 0); + if (ind == 0) { + if (Game_Config.Info.myPositionDefault) { + set_self(436 + ind, 18, get_self(376 + ind, 18, 0, 0, 0) + get_self(376 + ind, 20, 0, 0, 0) / 2 - Game_Config.Info.textwidth_2 / 2, 0, 0); + } else { + set_self(436 + ind, 18, Game_Config.Info.myPosition - Game_Config.Info.textwidth_2 / 2, 0, 0); + } + } else { + if (Game_Config.Info.otherPositionDefault) { + set_self(436 + ind, 18, get_self(376 + ind, 18, 0, 0, 0) + get_self(376 + ind, 20, 0, 0, 0) / 2 - Game_Config.Info.textwidth_2 / 2, 0, 0); + } else { + set_self(436 + ind, 18, Game_Config.Info.position[ind - 1] - Game_Config.Info.textwidth_2 / 2, 0, 0); + } + } + Func.up_imgurl(116 + ind, Desk.PlayerList[i].avatar); + set_group(43 + ind, 37, 1, 0, 0); + } else { + var ind = Logic.ChangeToStatus(C_Player.seat, i); + set_group(43 + ind, 37, 0, 0, 0); + } + } + } +} +GameUI.StartVoteCountDown = function(time) { + VoteTime = time; + set_self(2, 57, 1000, 0, 0); + set_self(222, 20, String(VoteTime).length * 30, 0, 0); + set_self(222, 7, VoteTime, 0, 0); +} +GameUI.PlayerJoinRoom = function(seat) { //玩家加入房间显示 + if (Game_Config.sysConfig) { + if (Game_Config.sysConfig.mainScenePlayerInfo) { + return; + } + } + if(typeof Game_Modify.updatePlayerInfoUI !== 'undefined'){ + for(var i = 0; i < Desk.PlayerList.length; i++){ + Game_Modify.updatePlayerInfoUI(i); + } + }else{ + var ind = Logic.ChangeToStatus(C_Player.seat, seat); + var text = Func.subString(Desk.PlayerList[seat].nickname, Game_Config.Info.Mainnickname, true); + set_self(406 + ind, 7, text, 1, 0); + if (ind == 0) { + if (Game_Config.Info.myPositionDefault) { + set_self(406 + ind, 18, get_self(376 + ind, 18, 0, 0, 0) + get_self(376 + ind, 20, 0, 0, 0) / 2 - text.gblen() * Game_Config.Info.textwidth_1 / 2, 0, 0); + } else { + set_self(406 + ind, 18, Game_Config.Info.myPosition - text.gblen() * Game_Config.Info.textwidth_1 / 2, 0, 0); + } + } else { + if (Game_Config.Info.otherPositionDefault) { + set_self(406 + ind, 18, get_self(376 + ind, 18, 0, 0, 0) + get_self(376 + ind, 20, 0, 0, 0) / 2 - text.gblen() * Game_Config.Info.textwidth_1 / 2, 0, 0); + } else { + set_self(406 + ind, 18, Game_Config.Info.position[ind - 1] - text.gblen() * Game_Config.Info.textwidth_1 / 2, 0, 0); + } + } + set_self(436 + ind, 7, 0, 0, 0); + if (ind == 0) { + if (Game_Config.Info.myPositionDefault) { + set_self(436 + ind, 18, get_self(376 + ind, 18, 0, 0, 0) + get_self(376 + ind, 20, 0, 0, 0) / 2 - Game_Config.Info.textwidth_2 / 2, 0, 0); + } else { + set_self(436 + ind, 18, Game_Config.Info.myPosition - Game_Config.Info.textwidth_2 / 2, 0, 0); + } + } else { + if (Game_Config.Info.otherPositionDefault) { + set_self(436 + ind, 18, get_self(376 + ind, 18, 0, 0, 0) + get_self(376 + ind, 20, 0, 0, 0) / 2 - Game_Config.Info.textwidth_2 / 2, 0, 0); + } else { + set_self(436 + ind, 18, Game_Config.Info.position[ind - 1] - Game_Config.Info.textwidth_2 / 2, 0, 0); + } + } + Func.up_imgurl(116 + ind, Desk.PlayerList[seat].avatar); + set_group(43 + ind, 37, 1, 0, 0); + } +} +GameUI.PlayerLeaveRoom = function(seat) { //玩家加入房间显示 + var ind = Logic.ChangeToStatus(C_Player.seat, seat); + set_self(406 + ind, 7, "", 0, 0); + set_self(436 + ind, 7, "", 0, 0); + set_group(43 + ind, 37, 0, 0, 0); +} +GameUI.OpenApply = function(bTemp, time) { //打开申请解散投票界面 + this.CloseSetting(); + GameUI.CloseChat(); + set_self(369, 7, "三人及以下全部同意达成解散,\n三人以上超过半数同意达成解散"); + this.VoteList = []; + + for (var i = 0; i < Desk.agreefree.length; i++) { + if (Desk.agreefree[i] != null && Desk.agreefree[i] != 0) { + this.VoteList.push(i); + } + if (Desk.agreefree[i] == 0) { + this.ApplyPlayer = i; + } + } + for (var i = 0; i < this.VoteList.length; i++) { + set_self(264 + i, 7, "【" + Desk.GetPlayerBySeat(this.VoteList[i]).nickname + "】", 0, 0); + set_self(166 + i, 7, "等待", 0, 0); + } + for (var i = 0; i < Desk.AgreeList.length; i++) { + for (var j = 0; j < this.VoteList.length; j++) { + if (this.VoteList[j] == Desk.AgreeList[i]) { + //set_self(193+j,7,"同意",0,0); + set_self(166 + j, 7, "同意", 0, 0); + } + } + + } + + set_self(191, 7, "发起投票:【" + Desk.GetPlayerBySeat(this.ApplyPlayer).nickname + "】\n\n请问是否同意?(倒计时结束未选择,则默认同意)", 0, 0); + set_group(29, 37, 1, 0, 0); + for (var i = this.VoteList.length; i <10; i++) { + set_self(264 + i, 37, 0, 0, 0); + set_self(166 + i, 37, 0, 0, 0); + } + if (bTemp) { + set_self(201, 37, 0, 0, 0); + set_self(202, 37, 0, 0, 0); + } + + set_self(223, 37, 0, 0, 0); + this.StartVoteCountDown(time); + +} +GameUI.OpenApplyResult = function(bTemp, agreelist) { + GameUI.CloseChat(); + GameUI.CloseSetting(); + set_self(369, 7, "三人及以下全部同意达成解散,\n三人以上超过半数同意达成解散"); + if (bTemp) { //投票通过 + var vlist = []; + var vote; + for (var i = 0; i < agreelist.length; i++) { + + if (agreelist[i] == 1) { + vlist.push(i); + } + if (agreelist[i] == 0) { + vote = i; + } + } + set_self(191, 7, "投票结果:\n\n投票发起:【" + Desk.GetPlayerBySeat(vote).nickname + "】", 0, 0); + for (var i = 0; i < vlist.length; i++) { + set_self(264 + i, 7, "【" + Desk.GetPlayerBySeat(vlist[i]).nickname + "】", 0, 0); + set_self(166 + i, 7, "同意", 0, 0); + } + set_group(29, 37, 1, 0, 0); + for (var i = vlist.length; i < 10; i++) { + set_self(264 + i, 37, 0, 0, 0); + set_self(166 + i, 37, 0, 0, 0); + } + set_self(201, 37, 0, 0, 0); + set_self(202, 37, 0, 0, 0); + set_self(222, 37, 0, 0, 0); + set_self(223, 37, 1, 0, 0); + } else { + + set_self(191, 7, "投票结果:\n\n拒绝解散玩家:【" + Desk.GetPlayerBySeat(agreelist[0]).nickname + "】", 0, 0); + set_group(29, 37, 1, 0, 0); + for (var i = agreelist.length - 1; i < 10; i++) { + set_self(264 + i, 37, 0, 0, 0); + set_self(166 + i, 37, 0, 0, 0); + } + set_self(201, 37, 0, 0, 0); + set_self(202, 37, 0, 0, 0); + set_self(222, 37, 0, 0, 0); + set_self(223, 37, 1, 0, 0); + } +} +GameUI.CloseApplyResult = function() { + + if (Desk.applyresult == 1) { + Desk.applyresult = -1; + if (Desk.deskfree != null) { + GameUI.CloseApplyResult(); + Game_Modify.Free(Desk.deskfree); + } else { + Desk.Init(); + C_Player.BreakRoom(); + GameUI.JumpMenuScene(); + } + } else { + set_group(29, 37, 0, 0, 0); + set_self(223, 37, 0, 0, 0); + Desk.applyresult = -1; + } +} +GameUI.SelfVote = function(v) { //自己投票解散 + set_self(369, 7, "三人及以下全部同意达成解散,\n三人以上超过半数同意达成解散"); + switch (v) { + case 0: + //拒绝 + for (var i = 0; i < this.VoteList.length; i++) { + if (this.VoteList[i] == C_Player.seat) { + set_self(166 + i, 7, "拒绝", 1, 0); + } + } + set_self(201, 37, 0, 0, 0); + set_self(202, 37, 0, 0, 0); + break; + case 1: + //同意 + for (var i = 0; i < this.VoteList.length; i++) { + if (this.VoteList[i] == C_Player.seat) { + set_self(166 + i, 7, "同意", 1, 0); + } + } + set_self(201, 37, 0, 0, 0); + set_self(202, 37, 0, 0, 0); + break; + } +} +GameUI.OtherVote = function(v, _msg) { //他人投票解散 + switch (v) { + case 0: + //拒绝 + for (var i = 0; i < this.VoteList.length; i++) { + if (this.VoteList[i] == _msg.data.seat) { + set_self(166 + i, 7, "拒绝", 1, 0); + } + } + break; + case 1: + //同意 + //console.log("他人同意"+Desk.AgreeList); + for (var i = 0; i < this.VoteList.length; i++) { + if (this.VoteList[i] == _msg.data.seat) { + set_self(166 + i, 7, "同意", 1, 0); + } + } + break; + } +} +GameUI.showEscape = function() { + if (Game_Config.sysConfig) { + if (Game_Config.sysConfig.mainSceneButton) { + set_self(513, 37, 0, 0, 0); + return; + } + } + if (GameData.sysConfig.hideEscape) { + set_self(513, 37, 0, 0, 0); + } else { + set_self(513, 37, 1, 0, 0); + } + +} +GameUI.hideEscape = function() { + set_self(513, 37, 0, 0, 0); +} +GameUI.showExitBtn = function() { + set_self(233, 37, 1, 0, 0); +} +GameUI.hideExitBtn = function() { + set_self(233, 37, 0, 0, 0); +} +GameUI.showExitBtn2 = function() { + set_self(3145, 37, 1, 0, 0); +} +GameUI.hideExitBtn2 = function() { + set_self(3145, 37, 0, 0, 0); +} +GameUI.showBreakBtn2 = function() { + set_self(3144, 37, 1, 0, 0); +} +GameUI.hideBreakBtn2 = function() { + set_self(3144, 37, 0, 0, 0); +} +GameUI.showOwnerNotice = function(notice) { + if (!notice) { + return; + } + + notice = "房主公告:\n" + notice; + var spaceX = 15; + var spaceY = 15; + var bgSpace = 0; + var textW = 14.5; + var lineH = 28; + var parm = Logic.countText(notice); + set_self(3150, 7, notice, 0); + set_self(3150, 37, 1, 0, 0); + + var w = spaceX * 2 + parm[1] * textW; + if (parm) { + set_self(3148, 20, spaceX * 2 + parm[1] * textW, 0, 0); + set_self(3148, 21, spaceY * 2 + parm[0] * lineH, 0, 0); + + set_self(3148, 18, get_self(3149, 18, 0, 0, 0) - get_self(3148, 20, 0, 0, 0) - bgSpace, 0, 0); + + } + + set_self(3150, 19, get_self(3148, 19, 0, 0, 0) + spaceY, 0, 0); + set_self(3150, 18, get_self(3148, 18, 0, 0, 0) + spaceY, 0, 0); + set_self(3148, 37, 1, 0, 0); + +} +GameUI.hideOwnerNotice = function() { + set_self(3148, 37, 0, 0, 0); + set_self(3150, 37, 0, 0, 0); + +} +GameUI.showDesktopUI = function() { + //if(Desk.stage==1){return;} + //set_self(3144,37,1,0,0); + set_self(3145, 37, 1, 0, 0); + set_self(3143, 37, 1, 0, 0); + set_self(3146, 37, 1, 0, 0); + set_self(3147, 37, 1, 0, 0); + set_self(3151, 37, 1, 0, 0); + //有短号房主留言 + if (Desk.ownerNotice) { + set_self(3149, 37, 1, 0, 0); + if (Logic.getVisibleNote()) { + GameUI.showOwnerNotice(Desk.ownerNotice); + } + + } + if (Desk.stage == 0) { + if (GameUI.checkShowRoomCode()) { + set_self(3146, 7, Desk.roomcode, 0, 0); + if (C_Player.status == 1) { + GameUI.showBreakBtn2(); + } + + } else { + GameUI.hideDesktopUI(); + } + } else { + GameUI.hideDesktopUI(); + } +} +GameUI.hideDesktopUI = function() { + set_self(3144, 37, 0, 0, 0); + set_self(3145, 37, 0, 0, 0); + set_self(3143, 37, 0, 0, 0); + set_self(3146, 37, 0, 0, 0); + set_self(3147, 37, 0, 0, 0); + set_self(3151, 37, 0, 0, 0); +} +//判断房号()是否可以显示 +GameUI.checkShowRoomCode = function() { + if (Desk.infinite == 1) { + return 0; + } + if (GameData.matchInfo) { + return 0; + } + return 1; +} +GameUI.ShowStartScene = function() { //显示开始按钮 + GameUI.showDesktopUI(); + if (C_Player.status == 1) { //房主 + set_group(28, 37, 1, 0, 0); + //set_self(656,37,0,0,0); + set_self(184, 37, 0, 0, 0); + if (GameData.matchId) { //比赛房间 + //set_self(185,37,0,0,0); + GameUI.hideBreakBtn2(); + } + //if(Desk.playercnt == 2 && Desk.roomMode == 1 && Desk.infinite == 0 && Desk.stage == 0){ + //GameUI.showEscape(); + //}else{ + //GameUI.hideEscape(); + //} + if (C_Player.isStart == true) { + if (Desk.getPrepareCnt() < Desk.warcnt) { + set_self(184, 37, 0, 0, 0); + } else { + set_self(184, 37, 1, 0, 0); + GameData.shakeID = Game_Config.shakeList.startwar; + Func.startshake(); + + } + } + //set_self(233,37,0,0,0); + if (GameData.versionState == 0) { + set_self(195, 37, 1, 0, 0); + } else { + set_self(195, 37, 0, 0, 0); + } + if (Desk.roomMode == 1 && GameData.hallConfig.worldRoomList && GameData.hallConfig.shareButton) { //星星场 + set_self(569, 37, 1, 0, 0); + //set_self(183,18,290,0,0); + //set_self(569,18,700,0,0); + } else { + set_self(569, 37, 0, 0, 0); + //set_self(183,18,466,0,0); + } + //GameUI.showChangeRoom(); + } else { + set_self(183, 37, 1, 0, 0); + //GameUI.showExitBtn();//set_self(233,37,1,0,0); + GameUI.showExitBtn2(); + //set_self(512,37,1,0,0); + //set_self(656,37,0,0,0); + if (C_Player.isStart == true) { + if (Desk.playercnt < Desk.warcnt) { + set_self(184, 37, 0, 0, 0); + } else { + set_self(184, 37, 1, 0, 0); + GameData.shakeID = Game_Config.shakeList.startwar; + Func.startshake(); + + } + } + } + GameUI.hideReady(); + //if(GameData.matchInfo){ + //set_self(512,37,0,0,0); + //} + if (GameData.matchId) { + set_self(512, 37, 0, 0, 0); + set_self(183, 37, 0, 0, 0); + set_self(569, 37, 0, 0, 0); + set_self(195, 37, 0, 0, 0); + } + + if (GameData.hallConfig.groupMsg) { + set_self(658, 7, GameData.hallConfig.groupMsg, 0, 0); + set_self(658, 18, get_self(657, 18, 0, 0, 0) + get_self(657, 20, 0, 0, 0) / 2 - String(GameData.hallConfig.groupMsg).gblen() * 6.5, 0, 0); + } else { + set_self(657, 37, 0, 0, 0); + set_self(658, 37, 0, 0, 0); + } + if (Desk.infinite == 1) { //无限局即系统房间 + //set_self(185,37,0,0,0); + set_self(195, 37, 0, 0, 0); + set_self(183, 37, 0, 0, 0); + set_self(513, 37, 0, 0, 0); + set_self(512, 37, 0, 0, 0); + set_self(184, 37, 0, 0, 0); + //set_self(185,37,0,0,0); + set_self(569, 37, 0, 0, 0); + } + if(GameData.sysConfig.hideWxShare){ + set_self(183,37,0,0,0); + } + +} +GameUI.HideStartScene = function() { //隐藏开始按钮 + set_group(28, 37, 0, 0, 0); + GameUI.updateMainSceneBtnPanel(); +} +GameUI.showStartButton = function() { + if (Game_Config.sysConfig) { + if (Game_Config.sysConfig.mainSceneButton) { + return; + } + } + if (Desk.infinite == 1) { //无限局即系统房间 + set_self(184, 37, 0, 0, 0); + return; + } + if (Desk.getPrepareCnt() >= Desk.warcnt && Desk.stage == 0 && C_Player.isStart == true) { + set_self(184, 37, 1, 0, 0); + GameData.shakeID = Game_Config.shakeList.startwar; + Func.startshake(); + + } else { + set_self(184, 37, 0, 0, 0); + GameData.shakeID = Game_Config.shakeList.nil; + Func.stopshake(); + } + +} +GameUI.showReady = function() { + if (typeof Desk.needprepare != "undefined") { + if (Desk.needprepare == 1) { + if (C_Player.isprepare == 0) { + set_self(515, 37, 1, 0, 0); + + } else { + set_self(515, 37, 0, 0, 0); + //GameUI.hideChangeRoom(); + } + } else { + set_self(515, 37, 0, 0, 0); + //GameUI.hideChangeRoom(); + } + if (Desk.infinite == 1) { + //GameUI.showChangeRoom(); + //GameUI.showExitBtn(); + } + } else { + set_self(515, 37, 0, 0, 0); + //GameUI.hideChangeRoom(); + } + +} +GameUI.hideReady = function() { + set_self(515, 37, 0, 0, 0); + //GameUI.hideChangeRoom(); +} +GameUI.showChangeRoom = function() { + if (Desk.infinite == 1 && !Desk.shortcode) { + set_self(3014, 37, 1, 0, 0); + } else { + set_self(3014, 37, 0, 0, 0); + } + if (Game_Config.sysConfig.vipInfinite) { + set_self(3014, 37, 0, 0, 0); + } +} +GameUI.hideChangeRoom = function() { + set_self(3014, 37, 0, 0, 0); + GameUI.hideExitBtn(); //set_self(233,37,0,0,0); + GameUI.showExitBtn2(); +} +GameUI.OpenChat = function() { //打开消息聊天 + //GameData.chatLine = null; + Utl.playSound(Game_Config.ClickButton.src_2); + set_group(30, 37, 1, 0, 0); + if (!Game_Config.sysConfig.vipInfinite) { + if (GameData.sysNoticeLimit < 0) { + GameData.selectSysNotice = false; + if (!GameData.selectSysNotice) { + Func.setInput(204, Game_Config.Chat.LimitLength); + } else { + Func.setInput(204, ConstVal.sysNotice.limit); + } + set_self(3111, 37, 0, 0, 0); + set_self(3113, 37, 0, 0, 0); + set_self(3117, 37, 0, 0, 0); + } else { + if (C_Player.bean >= GameData.sysNoticeLimit) { + set_self(3111, 37, 1, 0, 0); + set_self(3113, 37, 1, 0, 0); + set_self(3117, 37, 1, 0, 0); + set_self(3117, 7, "发送系统公告将消耗" + GameData.starName + "数量:" + GameData.sysNoticeCost, 0, 0); + } else { + GameData.selectSysNotice = false; + if (!GameData.selectSysNotice) { + Func.setInput(204, Game_Config.Chat.LimitLength); + } else { + Func.setInput(204, ConstVal.sysNotice.limit); + } + set_self(3111, 37, 0, 0, 0); + set_self(3113, 37, 0, 0, 0); + set_self(3117, 37, 0, 0, 0); + } + } + switch (GameData.ChatPage) { + case 1: + GameUI.SelectMsg(); + break; + case 2: + GameUI.SelectEmotion(); + break; + case 3: + GameUI.SelectHistory(); + break; + case 4: + GameUI.SelectSysNotice(); + break; + default: + + break; + } + } else { + GameData.selectSysNotice = true; + set_self(188, 37, 0, 0, 0); + set_self(699, 37, 0, 0, 0); + set_self(203, 37, 0, 0, 0); + set_self(161, 37, 0, 0, 0); + set_self(698, 37, 0, 0, 0); + set_self(162, 37, 0, 0, 0); + if (GameData.sysNoticeLimit < 0) { + GameData.selectSysNotice = false; + if (!GameData.selectSysNotice) { + Func.setInput(204, Game_Config.Chat.LimitLength); + } else { + Func.setInput(204, ConstVal.sysNotice.limit); + } + set_self(3111, 37, 0, 0, 0); + set_self(3113, 37, 0, 0, 0); + set_self(3117, 37, 0, 0, 0); + } else { + if (C_Player.bean >= GameData.sysNoticeLimit) { + set_self(3111, 37, 1, 0, 0); + set_self(3113, 37, 1, 0, 0); + set_self(3117, 37, 1, 0, 0); + set_self(3117, 7, "发送系统公告将消耗" + GameData.starName + "数量:" + GameData.sysNoticeCost, 0, 0); + } else { + GameData.selectSysNotice = false; + if (!GameData.selectSysNotice) { + Func.setInput(204, Game_Config.Chat.LimitLength); + } else { + Func.setInput(204, ConstVal.sysNotice.limit); + } + set_self(3111, 37, 0, 0, 0); + set_self(3113, 37, 0, 0, 0); + set_self(3117, 37, 0, 0, 0); + } + } + + set_self(3107, 19, 151, 0, 0); + set_self(3108, 19, 169, 0, 0); + + set_self(3112, 19, 141, 0, 0); + set_self(3114, 19, 143, 0, 0); + GameUI.SelectSysNotice(); + + } + GameUI.updateSysNoticeCount(); +} +GameUI.CloseChat = function() { //关闭聊天 + GameUI.clearCommunion(); + set_group(30, 37, 0, 0, 0); +} +GameUI.SelectMsg = function() { //选择常用语 + GameData.ChatPage = 1; + GameUI.clearCommunion(); + set_self(ConstVal.Emotion.f_spid, 37, 0, 0, 0); + set_self(ConstVal.Com_History.f_spid, 37, 0, 0, 0); + set_self(ConstVal.sysNotice.f_spid, 37, 0, 0, 0); + set_self(188, 43, 2, 0, 0); + set_self(203, 43, 1, 0, 0); + set_self(698, 43, 1, 0, 0); + set_self(3107, 43, 1, 0, 0); + for (var spid = 206; spid <= 212; spid++) { + set_self(spid, 37, 1, 0, 0); + } + +} +GameUI.SelectHistory = function() { //选择历史记录 + GameData.ChatPage = 3; + set_self(ConstVal.Emotion.f_spid, 37, 0, 0, 0); + set_self(ConstVal.Com_History.f_spid, 37, 1, 0, 0); + set_self(ConstVal.sysNotice.f_spid, 37, 0, 0, 0); + set_self(188, 43, 1, 0, 0); + set_self(203, 43, 1, 0, 0); + set_self(698, 43, 2, 0, 0); + set_self(3107, 43, 1, 0, 0); + for (var spid = 206; spid <= 212; spid++) { + set_self(spid, 37, 0, 0, 0); + } + GameUI.createCommunion(GameData.communionHistory); + +} +GameUI.SelectEmotion = function() { //选择表情 + GameData.ChatPage = 2; + GameUI.clearCommunion(); + set_self(ConstVal.Com_History.f_spid, 37, 0, 0, 0); + set_self(ConstVal.sysNotice.f_spid, 37, 0, 0, 0); + set_self(188, 43, 1, 0, 0); + set_self(203, 43, 2, 0, 0); + set_self(698, 43, 1, 0, 0); + set_self(3107, 43, 1, 0, 0); + for (var spid = 206; spid <= 212; spid++) { + set_self(spid, 37, 0, 0, 0); + } + set_self(ConstVal.Emotion.f_spid, 37, 1, 0, 0); + if (!GameData.isCreateEmotion) { + var col = -1; + var ind = 0; + for (var i = 0; i < ConstVal.Emotion.count; i++) { + ind = i % ConstVal.Emotion.col_num; + if (ind == 0) { //换行 + col++; + } + ifast_addtospritefromspritecopy(ConstVal.Emotion.f_spid, ConstVal.Emotion.spid_list[i], ConstVal.Emotion.x + ind * (ConstVal.Emotion.dis_x + ConstVal.Emotion.w), ConstVal.Emotion.y + col * (ConstVal.Emotion.y + ConstVal.Emotion.h), ConstVal.Emotion.tag + i); + + + } + if (col >= 0) { + set_self(ConstVal.Emotion.f_spid, 21, ConstVal.Emotion.y + (col + 1) * (ConstVal.Emotion.y + ConstVal.Emotion.h), 0, 0); + } + + GameData.isCreateEmotion = true; + } + + +} +//切换系统公告 +GameUI.SelectSysNotice = function() { + GameData.ChatPage = 4; + set_self(ConstVal.Emotion.f_spid, 37, 0, 0, 0); + set_self(ConstVal.Com_History.f_spid, 37, 0, 0, 0); + + set_self(188, 43, 1, 0, 0); + set_self(203, 43, 1, 0, 0); + set_self(698, 43, 1, 0, 0); + set_self(3107, 43, 2, 0, 0); + for (var spid = 206; spid <= 212; spid++) { + set_self(spid, 37, 0, 0, 0); + } + GameUI.setSysNoticeReaded(); + GameUI.updateSysNoticeCount(); + set_self(ConstVal.sysNotice.f_spid, 18, ConstVal.sysNotice.clip_x, 0, 0); + GameUI.createSysNotice(GameData.sysNotice); + +} +//更新系统消息气泡 +GameUI.updateSysNoticeBubble = function(_msg) { + if (get_self(153, 37, 0, 0, 0) == 0) { + return; + } + var limit = 8; + var msgAry = _msg.split(ConstVal.sysNotice.msg_rOld); + //var msg = ""; + if (msgAry.length >= 1) { + //msg += Func.subString(msgAry[0],limit,true)+"\n"; + set_rec(1, Func.subString(msgAry[0], limit, true)); + } else { + //msg+="\n"; + set_rec(1, ""); + } + if (msgAry.length >= 2) { + //msg += Func.subString(msgAry[1],limit-4,true)+"详..."; + set_rec(2, Func.subString(msgAry[1], limit - 4, true) + "详..."); + } else { + //msg+="详..."; + set_rec(2, "详..."); + } + + if (get_self(153, 37, 0, 0, 0) && !get_self(187, 37, 0, 0)) { + //set_self(3116,7,msg,0,0); + + set_self(3115, 37, 1, 0, 0); + //set_self(3116,37,1,0,0); + set_self(3115, 35, 255, 0, 0); + //set_self(3116,35,255,0,0); + play_ani(1, 3115, 35, 255, 0, 0, 1000, 0, 800, 0, 1, 0, 0); + //play_ani(1,3116,35,255,0,0,800,0,500,0,1,0,0); + //set_self(3115,33,100,0,0); + //set_self(3116,33,100,0,0); + //play_ani(1,3115,33,100,0,0,800,0,500,0,1,0,0); + //play_ani(1,3116,33,100,0,0,800,0,500,0,1,0,0); + } + GameUI.updateSysNoticeCount2(); + //return msg; +} +//调整公告 +GameUI.addSysNotice = function(_sysNotice) { + var msgAry = _sysNotice.split(ConstVal.sysNotice.msg_rOld); + var lenLimit = Math.floor((ConstVal.sysNotice.clip_w - ConstVal.sysNotice.spaceX * 2 - ConstVal.sysNotice.bm_space_x * 2) / ConstVal.sysNotice.msg_width); + for (var i = 0; i < msgAry.length; i++) { + msgAry[i] = Func.insertFlag(msgAry[i], ConstVal.sysNotice.msg_rOld, lenLimit, true); + } + var bTemp = false; + if (get_self(ConstVal.sysNotice.f_spid, 37, 0, 0, 0) == 1) { + bTemp = true; + } + var msg = msgAry.join(ConstVal.sysNotice.msg_rOld); + var line = Func.countFlag(msg, ConstVal.sysNotice.msg_rOld); + var sysData = {}; + sysData.msg = min_replaceAll(msg, ConstVal.sysNotice.msg_rOld, ConstVal.sysNotice.msg_rNew); + sysData.line = line; + sysData.read = bTemp; + GameData.sysNotice.push(sysData); + GameUI.updateSysNoticeCount(); + + if (get_self(ConstVal.sysNotice.f_spid, 37, 0, 0, 0)) { + //set_self(ConstVal.sysNotice.f_spid,19,height,0,0); + GameUI.createSysNotice(GameData.sysNotice); + } +} +//更新系统消息个数提示 +GameUI.updateSysNoticeCount = function() { + GameUI.updateSysNoticeCount2(); + var count = GameUI.countSysNoticeUnRead(); + if (count == 0) { + set_self(3112, 37, 0, 0, 0); + set_self(3114, 37, 0, 0, 0); + return; + } else { + if (count >= 10) { + if (count < 100) { + set_self(3112, 18, 653, 0, 0); + set_self(3112, 20, 37, 0, 0); + } else { + set_self(3112, 18, 643, 0, 0); + set_self(3112, 20, 47, 0, 0); + } + + } else { + set_self(3112, 18, 663, 0, 0); + set_self(3112, 20, 27, 0, 0); + } + if (get_self(3107, 37, 0, 0, 0) == 1) { + set_self(3112, 37, 1, 0, 0); + set_self(3114, 37, 1, 0, 0); + } else { + set_self(3112, 37, 0, 0, 0); + set_self(3114, 37, 0, 0, 0); + return; + } + } + if (count < 100) { + set_self(3114, 7, count, 0, 0); + set_self(3114, 20, String(count).length * 12.5, 0, 0); + } else { + set_self(3114, 7, "99+", 0, 0); + set_self(3114, 20, "99+".length * 12.5, 0, 0); + } + GameUI.adaptPositionSpid(3114, 3112); + +} +GameUI.updateSysNoticeCount2 = function() { + if (get_self(153, 37, 0, 0, 0) == 0) { + return; + } + var count = GameUI.countSysNoticeUnRead(); + var posX = get_self(153, 18, 0, 0, 0) + get_self(153, 20, 0, 0, 0); + //var posY = get_self(153,19,0,0,0)-13; + if (count == 0) { + set_self(3118, 37, 0, 0, 0); + set_self(3119, 37, 0, 0, 0); + return; + } else { + if (count >= 10) { + if (count < 100) { + set_self(3118, 20, 37, 0, 0); + //set_self(3118,18,posX-get_self(3118,20,0,0,0)+10,0,0); + + } else { + + set_self(3118, 20, 47, 0, 0); + //set_self(3118,18,posX-get_self(3118,20,0,0,0)+10,0,0); + } + + } else { + + set_self(3118, 20, 27, 0, 0); + //set_self(3118,18,posX-get_self(3118,20,0,0,0)+10,0,0); + } + if (get_self(153, 37, 0, 0, 0)) { + set_self(3118, 37, 1, 0, 0); + set_self(3119, 37, 1, 0, 0); + } else { + set_self(3118, 37, 0, 0, 0); + set_self(3119, 37, 0, 0, 0); + return; + } + } + if (count < 100) { + set_self(3119, 7, count, 0, 0); + set_self(3119, 20, String(count).length * 12.5, 0, 0); + } else { + set_self(3119, 7, "99+", 0, 0); + set_self(3119, 20, "99+".length * 12.5, 0, 0); + } + GameUI.adaptPositionSpid(3119, 3118); +} +// +//清除系统公告 +GameUI.clearSysNotice = function() { + //GameData.sysNotice=[]; + for (var i = 0; i < GameData.sysCreateLength; i++) { + ifast_dllpritefromspritecopy(ConstVal.sysNotice.f_spid, ConstVal.sysNotice.bubble_tag + i); + ifast_dllpritefromspritecopy(ConstVal.sysNotice.f_spid, ConstVal.sysNotice.msg_tag + i); + } + GameData.sysCreateLength = 0; +} +//将所有设置为已读 +GameUI.setSysNoticeReaded = function() { + for (var i = 0; i < GameData.sysNotice.length; i++) { + GameData.sysNotice[i].read = true; + } +} +//统计未读个数 +GameUI.countSysNoticeUnRead = function() { + var rValue = 0; + for (var i = 0; i < GameData.sysNotice.length; i++) { + if (!GameData.sysNotice[i].read) { + rValue++; + } + } + return rValue; +} +//创建系统公告 +GameUI.createSysNotice = function(_sysNotice) { + GameUI.clearSysNotice(); + var height = ConstVal.sysNotice.y; + var maxWidth = ConstVal.sysNotice.clip_w - ConstVal.sysNotice.x * 2; + set_self(ConstVal.sysNotice.f_spid, 37, 1, 0, 0); + for (var i = 0; i < GameData.sysNotice.length; i++) { + + // 气泡 + var bubble = ifast_addtospritefromspritecopy(ConstVal.sysNotice.f_spid, ConstVal.sysNotice.bubble_spid, ConstVal.sysNotice.x, ConstVal.sysNotice.y + height, ConstVal.sysNotice.bubble_tag + i); + set_self(bubble, 20, maxWidth, 0, 0); + set_self(bubble, 21, ConstVal.sysNotice.lineHeight * GameData.sysNotice[i].line + ConstVal.sysNotice.bm_space_y * 2, 0, 0); + //内容 + var notice = ifast_addtospritefromspritecopy(ConstVal.sysNotice.f_spid, ConstVal.sysNotice.msg_spid, ConstVal.sysNotice.x + ConstVal.sysNotice.bm_space_x, ConstVal.sysNotice.bm_space_y + height, ConstVal.sysNotice.msg_tag + i); + set_self(notice, 7, GameData.sysNotice[i].msg, 0, 0); + + height += ConstVal.sysNotice.lineHeight * GameData.sysNotice[i].line + ConstVal.sysNotice.bm_space_y * 2 + ConstVal.sysNotice.noteSpace; + } + GameData.sysCreateLength = GameData.sysNotice.length; + set_self(ConstVal.sysNotice.f_spid, 21, height, 0, 0); + +} +GameUI.ShowEmotion = function(v, ind) { + ind = Number(ind); + if (v == 0) { + GameUI.CloseChat(); + } + set_self(468 + v, 18, get_self(376 + v, 18, 0, 0, 0), 0, 0); + set_self(468 + v, 19, get_self(376 + v, 19, 0, 0, 0), 0, 0); + set_self(468 + v, 20, get_self(376 + v, 20, 0, 0, 0), 0, 0); + set_self(468 + v, 21, get_self(376 + v, 21, 0, 0, 0), 0, 0); + set_self(498 + v, 18, get_self(376 + v, 18, 0, 0, 0), 0, 0); + set_self(498 + v, 19, get_self(376 + v, 19, 0, 0, 0), 0, 0); + set_self(498 + v, 20, get_self(376 + v, 20, 0, 0, 0), 0, 0); + set_self(498 + v, 21, get_self(376 + v, 21, 0, 0, 0), 0, 0); + set_self(468 + v, 37, 1, 0, 0); + set_self(498 + v, 1, ConstVal.Emotion.src_list[ind - 1], 0, 0); + set_self(498 + v, 37, 1, 0, 0); + var t = 1; + if (ConstVal.Emotion.mode == 1) { + t = (ConstVal.Emotion.frame_list[ind - 1] + 1) * ConstVal.Emotion.rate; + } else { + t = ConstVal.Emotion.show_time_list[ind - 1]; + } + if (ConstVal.Emotion.frame_list[ind - 1] <= 3) { + play_ani(1, 498 + v, 43, 1, ConstVal.Emotion.frame_list[ind - 1], 0, t, 0, 0, 0, 7, 0, 0); + } else if (ConstVal.Emotion.frame_list[ind - 1] <= 5) { + play_ani(1, 498 + v, 43, 1, ConstVal.Emotion.frame_list[ind - 1], 0, t, 0, 0, 0, 4, 0, 0); + } else if (ConstVal.Emotion.frame_list[ind - 1] <= 8) { + play_ani(1, 498 + v, 43, 1, ConstVal.Emotion.frame_list[ind - 1], 0, t, 0, 0, 0, 3, 0, 0); + } else if (ConstVal.Emotion.frame_list[ind - 1] <= 15) { + play_ani(1, 498 + v, 43, 1, ConstVal.Emotion.frame_list[ind - 1], 0, t, 0, 0, 0, 2, 0, 0); + } else { + play_ani(1, 498 + v, 43, 1, ConstVal.Emotion.frame_list[ind - 1], 0, t, 0, 0, 0, 1, 0, 0); + } + + + +} + +GameUI.ShowChat = function(v, text) { + text = String(text); + set_self(204, 7, "", 0, 0); + if (v == 0) { + this.CloseChat(); + } + var x = Game_Config.Chat.ChatLoc[v][0]; + var y = Game_Config.Chat.ChatLoc[v][1]; + var dis_x = Game_Config.Chat.ChatDis[0]; + var dis_y = Game_Config.Chat.ChatDis[1]; + var isleft = Game_Config.Chat.isLeft[v]; + var text_w = Game_Config.Chat.textwidth; + var text_len = text.gblen(); + if (isleft) { + set_self(552 + v, 18, x, 0, 0); + set_self(552 + v, 19, y, 0, 0); + set_self(582 + v, 18, x + dis_x, 0, 0); + set_self(582 + v, 19, y + dis_y, 0, 0); + set_self(582 + v, 7, text, 0, 0); + set_self(552 + v, 20, text_len * text_w + dis_x * 2, 0, 0); + set_self(552 + v, 1, 83, 0, 0); + set_self(552 + v, 37, 1, 0, 0); + set_self(582 + v, 37, 1, 0, 0); + } else { + set_self(552 + v, 18, x - text_len * text_w - dis_x * 2, 0, 0); + set_self(582 + v, 18, x - text_len * text_w - dis_x, 0, 0); + set_self(552 + v, 19, y, 0, 0); + set_self(582 + v, 19, y + dis_y, 0, 0); + + set_self(582 + v, 7, text, 0, 0); + set_self(552 + v, 20, text_len * text_w + dis_x * 2, 0, 0); + set_self(552 + v, 1, 86, 0, 0); + set_self(552 + v, 37, 1, 0, 0); + set_self(582 + v, 37, 1, 0, 0); + + } + play_ani(1, 552 + v, 43, 1, 1, 0, Game_Config.Max.ShowChat, 0, 0, 0, 1, 0, 0); + +} +GameUI.HideChat = function() { + set_group(75, 37, 0, 0, 0); +} +GameUI.OpenTips = function(_msg, time, mode) { + try { + // if(!String(_msg)){ + // return; + // } + //if(GameData.tipTimer1){ + // GameData.tipTimer1 = null; + // clearTimeout(GameData.tipTimer1); + //} + if (!_msg) { + return; + } + if (time) { + if (time > 0) { + GameData.tipTimer1 = setTimeout("GameUI.CloseTips()", time); + } + } + switch (mode) { + case 1: + set_self(217, 19, 126, 0, 0); + set_self(218, 19, 161, 0, 0); + break; + case 2: + set_self(217, 19, 418, 0, 0); + set_self(218, 19, 453, 0, 0); + break; + default: + set_self(217, 19, 276, 0, 0); + set_self(218, 19, 311, 0, 0); + break; + } + length + var w = 14.5; + // var arr = Logic.countText(_msg); + // if(arr.>1){ + // set_self(218,7,_msg,0,0); + // set_self(217,20,arr[1]*14+100,0,0); + // set_self(217,18,640-get_self(217,20,0,0,0)/2,0,0); + //set_self(218,18,640-_msg.gblen()*7,0,0); + // set_self(217,37,1,0,0); + //set_self(218,37,1,0,0); + // }else{ + set_self(218, 7, _msg, 0, 0); + set_self(217, 20, _msg.gblen() * w + 100, 0, 0); + set_self(217, 18, 640 - get_self(217, 20, 0, 0, 0) / 2, 0, 0); + set_self(218, 18, 640 - _msg.gblen() * w / 2, 0, 0); + set_self(217, 37, 1, 0, 0); + set_self(218, 37, 1, 0, 0); + // } + + + //set_self(393,37,1,0,0); + } catch (e) { + + } +} +GameUI.CloseTips = function() { + //if(GameData.tipTimer1){ + // GameData.tipTimer1 = null; + // clearTimeout(GameData.tipTimer1); + //} + set_self(217, 37, 0, 0, 0); + set_self(218, 37, 0, 0, 0); +} +GameUI.ShowNotice = function(_msg) { //打开公告通知 + if (_msg) { + set_self(220, 7, _msg, 0, 0); + set_self(220, 18, Game_Config.Notice.x2, 0, 0); + set_self(219, 37, 1, 0, 0); + set_self(220, 37, 1, 0, 0); + set_self(45, 37, 1, 0, 0); + var len = _msg.gblen() * Game_Config.Notice.width; + var t = (len + Game_Config.Notice.x2 - Game_Config.Notice.x1) / Game_Config.Notice.speed; + play_ani(1, 220, 18, Game_Config.Notice.x2, Game_Config.Notice.x1 - len, 0, t, 0, 0, 0, 0, 0, 0); + } +} +GameUI.HideNotice = function() { //关闭公告通知 + set_self(219, 37, 0, 0, 0); + set_self(220, 37, 0, 0, 0); + set_self(45, 37, 0, 0, 0); + play_ani(0, 220, 18); +} +GameUI.OpenKick = function(text) { //打开强制下线界面 + set_self(225, 18, 640 - get_self(225, 20, 0, 0, 0) / 2, 0, 0); + set_self(227, 7, text, 0, 0); + set_self(227, 18, 640 - text.gblen() * 7.5, 0, 0); + set_group(33, 37, 1, 0, 0); +} +GameUI.SetOnState = function(seat, v) { + var ind = Logic.ChangeToStatus(C_Player.seat, seat); + GameUI.onstate[ind] = v; +} +GameUI.SetIsprepare = function(seat, v) { + var ind = Logic.ChangeToStatus(C_Player.seat, seat); + this.isprepare[ind] = v; + if (seat == C_Player.seat) { + C_Player.isprepare = v; + } +} +GameUI.Openupdataroomcard = function(_msg) { + if (GameData.versionState != 1) { + if (_msg) { + set_self(229, 7, _msg, 0, 0); + set_self(229, 18, 640 - _msg.gblen() * 5.25, 0, 0); + set_self(228, 18, 640 - get_self(228, 20, 0, 0, 0) / 2, 0, 0); + set_group(34, 37, 1, 0, 0); + } + } + +} + +GameUI.Closeupdataroomcard = function() { + set_group(34, 37, 0, 0, 0); +} +GameUI.openUpdateBean = function(_msg) { + if (GameData.versionState != 1) { + if (_msg) { + set_self(229, 7, _msg, 0, 0); + set_self(229, 18, 640 - _msg.gblen() * 5.25, 0, 0); + set_self(228, 18, 640 - get_self(228, 20, 0, 0, 0) / 2, 0, 0); + set_group(34, 37, 1, 0, 0); + } + } + +} + +GameUI.closeUpdateBean = function() { + set_group(34, 37, 0, 0, 0); +} +GameUI.OpenDisConnect = function() { + if (get_self(230, 37, 0, 0, 0) == 0) { + set_group(35, 37, 1, 0, 0); + play_ani(1, 232, 43, 1, 9, 0, 800, 0, 0, 0, 0, 0, 0); + } + +} +GameUI.CloseDisConnect = function() { + set_group(35, 37, 0, 0, 0); +} +GameUI.openCheck = function(_msg) { + Utl.playSound(Game_Config.ClickButton.src_2); + //if(GameData.versionState == 1){ + + //set_self(361,7," 是否解散房间?",0,0); + //}else{ + //set_self(361,7,"解散房间不扣"+GameData.roomCardName+",是否解散?",0,0); + //} + set_self(361, 7, _msg, 0, 0); + set_self(361, 18, get_self(244, 18, 0, 0, 0) + get_self(244, 20, 0, 0, 0) / 2 - String(_msg).gblen() * 8.5); + set_group(36, 37, 1, 0, 0); +} +GameUI.closeCheck = function() { + GameData.checkType = 1; + set_group(36, 37, 0, 0, 0); +} +GameUI.OpenProtocol = function() { + Utl.playSound(Game_Config.ClickButton.src_2); + GameData.Protocol_H = get_self(252, 21, 0, 0, 0); + set_self(252, 18, Game_Config.Protocol.x, 0, 0); + set_self(252, 19, Game_Config.Protocol.y, 0, 0); + set_group(37, 37, 1, 0, 0); +} +GameUI.CloseProtocol = function() { + set_group(37, 37, 0, 0, 0); +} +GameUI.StartLoadData = function() { + +} +GameUI.EndLoadData = function() { + +} +GameUI.PlayEffect = function(seat1, seat2, type) { //播放互动动画 + if (Logic.ChangeToStatus(C_Player.seat, seat1) == 0) { + GameUI.CloseInfo(); + } + if (type != null) { + + set_self(466, 37, 1, 0, 0); + var spid; + var spid_s = 376 + Logic.ChangeToStatus(C_Player.seat, seat1); + var spid_e = 376 + Logic.ChangeToStatus(C_Player.seat, seat2); + var s1_xy = []; + var s2_xy = []; + var frame; + var _time = []; + switch (type) { + case 4: + //抓鸡 + spid = 302; + s1_xy = [get_self(spid_s, 18) - 15, get_self(spid_s, 19)]; + s2_xy = [get_self(spid_e, 18) - 15, get_self(spid_e, 19) - 15]; + frame = 12; + _time = [2400, 200]; + setTimeout(function() { + Utl.playSound(ConstVal.InterEffSoundsList[0]); + }, 700); + break; + case 3: + //碰杯 + spid = 297; + s1_xy = [get_self(spid_s, 18) - 35, get_self(spid_s, 19) - 10]; + s2_xy = [get_self(spid_e, 18) - 35, get_self(spid_e, 19) - 10]; + + frame = 4; + _time = [600, 500]; + setTimeout(function() { + Utl.playSound(ConstVal.InterEffSoundsList[1]); + }, 700); + break; + case 1: + //炸弹 + spid = 274; + s1_xy = [get_self(spid_s, 18) - 25, get_self(spid_s, 19) - 25]; + s2_xy = [get_self(spid_e, 18) - 25, get_self(spid_e, 19) - 25]; + frame = 7; + _time = [1200, 1000]; + setTimeout(function() { + Utl.playSound(ConstVal.InterEffSoundsList[2]); + }, 700); + break; + case 2: + //鲜花 + spid = 292; + s1_xy = [get_self(spid_s, 18) - 6, get_self(spid_s, 19)]; + s2_xy = [get_self(spid_e, 18) - 6, get_self(spid_e, 19)]; + frame = 12; + _time = [2400, 200]; + setTimeout(function() { + Utl.playSound(ConstVal.InterEffSoundsList[3]); + }, 700); + break; + default: + return; + break; + } + var zid = 10000 * seat1 + ifast_random(10000); + var copySpid = ifast_addtospritefromspritecopy(466, spid, 0, 0, zid); + set_self(copySpid, 18, s1_xy[0], 0, 0); + set_self(copySpid, 19, s1_xy[1], 0, 0); + set_self(copySpid, 41, 0, 0, 0); + set_self(copySpid, 37, 1, 0, 0); + + play_ani(1, copySpid, 18, s1_xy[0], s2_xy[0], 0, 700, 0, 0, 0, 1, 0, 0); + play_ani(1, copySpid, 19, s1_xy[1], s2_xy[1], 0, 700, 0, 0, 0, 1, 0, 0); + play_ani(1, copySpid, 43, 1, frame, 0, _time[0], 0, 700, 0, 1, 0, 0); + + GameUI.PlayEffect_clear(zid, _time); + } else { + set_self(149, 37, 0, 0, 0); + } +} +GameUI.PlayEffect_clear = function(zid, _time) { //关闭单个互动动画 + window.setTimeout(function() { + ifast_dllpritefromspritecopy(466, zid); + }, _time[0] + _time[1] + 700); +}; + +GameUI.play_voice = function(_msg, type, v) { + Func.mediaTypeAudio(_msg, type, v); + +} + +function gameui_play_voice(v) { + v = Number(v); + var bTemp = false; + if (v >= ConstVal.Com_History.content_tag) { + bTemp = true; + } + if (bTemp) { + play_ani(1, ConstVal.Com_History.f_spid + "add" + v, 43, 1, 3, 0, 600, 0, 0, 0, 0, 0, 0); + } else { + var x = Game_Config.Voice.VoiceLoc[v][0]; + var y = Game_Config.Voice.VoiceLoc[v][1]; + var dis_x = Game_Config.Voice.VoiceDis[0]; + var dis_y = Game_Config.Voice.VoiceDis[1]; + var isleft = Game_Config.Voice.isLeft[v]; + var text_len = get_self(642 + v, 20, 0, 0, 0); + if (isleft) { + set_self(612 + v, 18, x, 0, 0); + set_self(612 + v, 19, y, 0, 0); + set_self(642 + v, 18, x + dis_x, 0, 0); + set_self(642 + v, 19, y + dis_y, 0, 0); + set_self(612 + v, 20, text_len + dis_x * 2, 0, 0); + set_self(612 + v, 1, 83, 0, 0); + set_self(612 + v, 37, 1, 0, 0); + set_self(642 + v, 37, 1, 0, 0); + } else { + set_self(612 + v, 18, x - text_len - dis_x * 2, 0, 0); + set_self(642 + v, 18, x - text_len - dis_x, 0, 0); + set_self(612 + v, 19, y, 0, 0); + set_self(642 + v, 19, y + dis_y, 0, 0); + set_self(612 + v, 20, text_len + dis_x * 2, 0, 0); + set_self(612 + v, 1, 86, 0, 0); + set_self(612 + v, 37, 1, 0, 0); + set_self(642 + v, 37, 1, 0, 0); + + } + play_ani(1, 642 + v, 43, 1, 3, 0, Game_Config.Voice.VoiceTime, 0, 0, 0, 0, 0, 0); + } +} + +function gameui_stop_voice(v) { + v = Number(v); + var bTemp = false; + if (v >= ConstVal.Com_History.content_tag) { + bTemp = true; + } + if (bTemp) { + play_ani(0, ConstVal.Com_History.f_spid + "add" + v, 43, 1, 3, 0, 600, 0, 0, 0, 0, 0, 0); + set_self(ConstVal.Com_History.f_spid + "add" + v, 43, 3, 0, 0); + } else { + set_self(612 + v, 37, 0, 0, 0); + set_self(642 + v, 37, 0, 0, 0); + play_ani(0, 642 + v, 43); + } +} + +GameUI.ShowiMessage = function(_msg) { + set_self(333, 7, _msg, 0, 0); + set_self(333, 41, 0, 0, 0); + set_self(334, 41, 0, 0, 0); + set_self(332, 18, 0, 0, 0); + set_self(332, 19, ConstVal.iMessage.bg_y1, 0, 0); + set_self(334, 18, ConstVal.iMessage.icon_x, 0, 0); + set_self(335, 18, ConstVal.iMessage.close_x, 0, 0); + var len = _msg.gblen(); + if (len <= ConstVal.iMessage.max_length) { + set_self(333, 18, 640 - len * 8.5, 0, 0); + set_group(41, 37, 1, 0, 0); + play_ani(1, 332, 19, ConstVal.iMessage.bg_y1, ConstVal.iMessage.bg_y2, 0, ConstVal.iMessage.time, 0, 0, 0, 1, 0, 0); + play_ani(1, 333, 19, ConstVal.iMessage.text_y1, ConstVal.iMessage.text_y2, 0, ConstVal.iMessage.time, 0, 0, 0, 1, 0, 0); + play_ani(1, 334, 19, ConstVal.iMessage.icon_y1, ConstVal.iMessage.icon_y2, 0, ConstVal.iMessage.time, 0, 0, 0, 1, 0, 0); + play_ani(1, 335, 19, ConstVal.iMessage.close_y1, ConstVal.iMessage.close_y2, 0, ConstVal.iMessage.time, 0, 0, 0, 1, 0, 0); + } else { + set_self(333, 18, ConstVal.iMessage.x2, 0, 0); + set_group(41, 37, 1, 0, 0); + play_ani(1, 332, 19, ConstVal.iMessage.bg_y1, ConstVal.iMessage.bg_y2, 0, ConstVal.iMessage.time, 0, 0, 0, 1, 0, 0); + play_ani(1, 333, 19, ConstVal.iMessage.text_y1, ConstVal.iMessage.text_y2, 0, ConstVal.iMessage.time, 0, 0, 0, 1, 0, 0); + play_ani(1, 334, 19, ConstVal.iMessage.icon_y1, ConstVal.iMessage.icon_y2, 0, ConstVal.iMessage.time, 0, 0, 0, 1, 0, 0); + play_ani(1, 335, 19, ConstVal.iMessage.close_y1, ConstVal.iMessage.close_y2, 0, ConstVal.iMessage.time, 0, 0, 0, 1, 0, 0); + play_ani(1, 333, 18, ConstVal.iMessage.x2, ConstVal.iMessage.x1 - len * 6.75, 0, len * 6.75 / ConstVal.iMessage.speed, 0, 0, 0, 0, 0, 0); + } +} +GameUI.HideiMessage = function(_msg) { + play_ani(1, 332, 19, ConstVal.iMessage.bg_y2, ConstVal.iMessage.bg_y1, 0, ConstVal.iMessage.time, 0, 0, 0, 1, 0, 0); + play_ani(1, 333, 19, ConstVal.iMessage.text_y2, ConstVal.iMessage.text_y1, 0, ConstVal.iMessage.time, 0, 0, 0, 1, 0, 0); + play_ani(1, 334, 19, ConstVal.iMessage.icon_y2, ConstVal.iMessage.icon_y1, 0, ConstVal.iMessage.time, 0, 0, 0, 1, 0, 0); + play_ani(1, 335, 19, ConstVal.iMessage.close_y2, ConstVal.iMessage.close_y1, 0, ConstVal.iMessage.time, 0, 0, 0, 1, 0, 0); + play_ani(0, 333, 18); +} +//打开二维码 +GameUI.Open_ewm = function() { + if (GameData.wechat_ewm) { + Utl.playSound(Game_Config.ClickButton.src_2); + Func.up_imgurl(115, GameData.wechat_ewm); + + set_group(42, 37, 1, 0, 0); + } +} +//打开二维码 +GameUI.Close_ewm = function() { + set_group(42, 37, 0, 0, 0); +} +GameUI.OpenFeedback = function(bTemp) { + Utl.playSound(Game_Config.ClickButton.src_2); + set_group(74, 37, 1, 0, 0); + if(bTemp){ + set_self(550,37,0,0,0); + }else{ + set_self(3265,37,0,0,0); + set_self(3266,37,0,0,0); + } +} +GameUI.CloseFeedback = function() { + var obj = gameabc_face.getdiv("div551"); + obj.blur(); + set_self(551,7,"",0,0); + set_group(74, 37, 0, 0, 0); +} +GameUI.getFeedbackText = function() { + return get_self(551, 7, 0, 0, 0); +} +//创建历史记录 +GameUI.createCommunion = function(c_list) { + if (c_list) { + if (c_list.length) { + var len = c_list.length; + var head = ""; + var bubble = ""; + var content = ""; + var contentLen = 0; + for (var i = 0; i < len; i++) { + head = ifast_addtospritefromspritecopy(ConstVal.Com_History.f_spid, 697, ConstVal.Com_History.head_x, ConstVal.Com_History.head_y + i * (ConstVal.Com_History.head_dis_y + ConstVal.Com_History.head_h), ConstVal.Com_History.head_tag + i); //头像 + set_self(head, 1, ConstVal.Com_History.head_res_id + c_list[i][0]); + bubble = ifast_addtospritefromspritecopy(ConstVal.Com_History.f_spid, 163, ConstVal.Com_History.head_x + ConstVal.Com_History.head_bubble_dis_x, ConstVal.Com_History.head_y + ConstVal.Com_History.head_bubble_dis_y + i * (ConstVal.Com_History.head_dis_y + ConstVal.Com_History.head_h), ConstVal.Com_History.bubble_tag + i); //气泡 + if (c_list[i][1] == 1) { //文字 + content = ifast_addtospritefromspritecopy(ConstVal.Com_History.f_spid, 164, ConstVal.Com_History.head_x + ConstVal.Com_History.head_bubble_dis_x + ConstVal.Com_History.bubble_content_dis_x, ConstVal.Com_History.head_y + ConstVal.Com_History.head_bubble_dis_y + ConstVal.Com_History.head_content_1_dis_y + i * (ConstVal.Com_History.head_dis_y + ConstVal.Com_History.head_h), ConstVal.Com_History.content_tag + i); //气泡 + set_self(content, 7, c_list[i][2], 0, 0); + contentLen = String(c_list[i][2]).gblen() * ConstVal.Com_History.text_width; + set_self(bubble, 20, contentLen + ConstVal.Com_History.bubble_content_dis_x * 2, 0, 0); + time_show = ifast_addtospritefromspritecopy(ConstVal.Com_History.f_spid, 480, ConstVal.Com_History.head_x + ConstVal.Com_History.head_bubble_dis_x + contentLen + ConstVal.Com_History.time_bubble_dis_x, ConstVal.Com_History.head_y + ConstVal.Com_History.head_bubble_dis_y + ConstVal.Com_History.time_bubble_dis_y + i * (ConstVal.Com_History.head_dis_y + ConstVal.Com_History.head_h), ConstVal.Com_History.time_tag + i); //时长 + set_self(time_show, 7, "", 0, 0); + } else if (c_list[i][1] == 2) { //语音 + content = ifast_addtospritefromspritecopy(ConstVal.Com_History.f_spid, 165, ConstVal.Com_History.head_x + ConstVal.Com_History.head_bubble_dis_x + ConstVal.Com_History.bubble_content_dis_x, ConstVal.Com_History.head_y + ConstVal.Com_History.head_bubble_dis_y + ConstVal.Com_History.head_content_2_dis_y + i * (ConstVal.Com_History.head_dis_y + ConstVal.Com_History.head_h), ConstVal.Com_History.content_tag + i); //气泡 + //set_self(bubble,20,ConstVal.Com_History.bubble_width[ConstVal.Com_History.bubble_width.length-1],0,0); + contentLen = ConstVal.Com_History.bubble_width[ConstVal.Com_History.bubble_width.length - 1]; + for (var k = 0; k < ConstVal.Com_History.time_length.length; k++) { + if (GameData.communionHistory[i][3] <= ConstVal.Com_History.time_length[k]) { + contentLen = ConstVal.Com_History.bubble_width[k]; + + break; + } + //contentLen = ConstVal.Com_History.bubble_width[k+1]; + } + + set_self(bubble, 20, contentLen, 0, 0); + time_show = ifast_addtospritefromspritecopy(ConstVal.Com_History.f_spid, 480, ConstVal.Com_History.head_x + ConstVal.Com_History.head_bubble_dis_x + contentLen + ConstVal.Com_History.time_bubble_dis_x, ConstVal.Com_History.head_y + ConstVal.Com_History.head_bubble_dis_y + ConstVal.Com_History.time_bubble_dis_y + i * (ConstVal.Com_History.head_dis_y + ConstVal.Com_History.head_h), ConstVal.Com_History.time_tag + i); //时长 + set_self(time_show, 7, GameData.communionHistory[i][3] + "\''", 0, 0); + } + + + + } + + + set_self(ConstVal.Com_History.f_spid, 21, len * (ConstVal.Com_History.head_h + ConstVal.Com_History.head_dis_y) + ConstVal.Com_History.head_x * 2, 0, 0); + if (len <= ConstVal.Com_History.page_count) { + set_self(ConstVal.Com_History.f_spid, 19, ConstVal.Com_History.clip_y); + } else { + set_self(ConstVal.Com_History.f_spid, 19, ConstVal.Com_History.clip_y - (len - ConstVal.Com_History.page_count) * (ConstVal.Com_History.head_h + ConstVal.Com_History.head_dis_y), 0, 0); + } + + GameData.createHistoryLen = len; + } + } +} +//添加一条历史记录 +GameUI.addCommunion = function(status, type, data, tlen, kfData, sex) { + + GameData.communionHistory.push([status, type, data, tlen, kfData, sex]); + var c_list = GameData.communionHistory; + if (get_self(ConstVal.Com_History.f_spid, 37, 0, 0) == 1) { //在历史记录界面 + var len = c_list.length; + var head = ""; + var bubble = ""; + var content = ""; + var contentLen = 0; + var time_show = ""; + i = len - 1; + //for(var i=0;i 0) { + mult = rt; + } else { + Utl.SaveData(Utl.Config.multiple, "1"); + } + } else { + Utl.SaveData(Utl.Config.multiple, "1"); + } + } else { + Utl.SaveData(Utl.Config.multiple, "1"); + } + GameData.Multiple = min_replaceAll(String(mult), "\\.", "b", false); + set_self(370, 7, GameData.Multiple, 0, 0); + set_self(370, 20, GameData.Multiple.length * width, 0, 0); + set_self(283, 20, 203 + GameData.Multiple.length * width, 0, 0); + set_group(78, 37, 1, 0, 0); +} +//隐藏计算器按钮 +GameUI.hideCalBtn = function() { + set_group(78, 37, 0, 0, 0); +} +GameUI.showCal = function() { + Utl.playSound(Game_Config.ClickButton.src_2); + set_self(373, 7, GameData.Multiple, 0, 0); + set_self(373, 20, GameData.Multiple.length * 36, 0, 0); + set_self(373, 18, get_self(372, 18, 0, 0, 0) + get_self(372, 20, 0, 0, 0) / 2 - GameData.Multiple.length * 18, 0, 0); + set_group(79, 37, 1, 0, 0); +} +GameUI.hideCal = function() { + set_group(79, 37, 0, 0, 0); +} +//得到计算的倍数 +GameUI.getMultiple = function() { + var result = min_replaceAll(String(GameData.Multiple), "b", ".", false); + if (GameUI.checkNumber(result)) { + var rt = Number(result); + if (rt > 0) { + return rt; + } else { + return false; + } + } else { + return false; + } +} +//输入是否合法 +GameUI.checkNumber = function(input_data) { // + var reg = /^[0-9]+.?[0-9]*$/; + if (reg.test(input_data)) { + return true; + } + return false; +} +//获得计算结果 +GameUI.getResult = function(input_arr) { + if (GameUI.checkNumber(rd)) { + var rt = Number(rd); + if (rt > 0) { + return rt; + } else { + return false; + } + } else { + return false; + } +} +//输入 +GameUI.CalInput = function(spid) { + var multiple_temp = GameData.Multiple; + if (spid >= 392 && spid <= 402) { + var input; + if (spid == 402) { + input = "b"; + } else { + input = String(spid - 392); + } + + + if (multiple_temp == "0" && input != "b") { + multiple_temp = input; + } else { + multiple_temp += input; + } + if (multiple_temp.length > 8) { + GameUI.OpenTips("输入长度超过限制!", ConstVal.Tips.time); + } else { + if (GameUI.checkNumber(multiple_temp)) { + GameData.Multiple = multiple_temp; + set_self(373, 7, GameData.Multiple, 0, 0); + set_self(373, 20, GameData.Multiple.length * 36, 0, 0); + set_self(373, 18, get_self(372, 18, 0, 0, 0) + get_self(372, 20, 0, 0, 0) / 2 - GameData.Multiple.length * 18, 0, 0); + } else { + GameUI.OpenTips("输入不正确!", ConstVal.Tips.time); + } + } + } + if (spid == 391) { //删除 + if (multiple_temp.length > 1) { + GameData.Multiple = GameData.Multiple.substring(0, GameData.Multiple.length - 1); + set_self(373, 7, GameData.Multiple, 0, 0); + set_self(373, 20, GameData.Multiple.length * 36, 0, 0); + set_self(373, 18, get_self(372, 18, 0, 0, 0) + get_self(372, 20, 0, 0, 0) / 2 - GameData.Multiple.length * 18, 0, 0); + } else if (multiple_temp.length == 1) { + GameData.Multiple = "0"; + set_self(373, 7, GameData.Multiple, 0, 0); + set_self(373, 20, String(GameData.Multiple).length * 36, 0, 0); + set_self(373, 18, get_self(372, 18, 0, 0, 0) + get_self(372, 20, 0, 0, 0) / 2 - String(GameData.Multiple).length * 18, 0, 0); + } + + } + if (spid == 403) { //确定 + if (GameUI.checkNumber(GameData.Multiple)) { + var input_mul = min_replaceAll(String(GameData.Multiple), "b", ".", false); + input_mul = Number(input_mul); + if (input_mul == 0) { + input_mul = 1; + } + console.log("倍数:" + input_mul); + GameData.MultiArr.length = GameData.OrgArr.length; + for (var i = 0; i < GameData.MultiArr.length; i++) { + //GameData.MultiArr[i] = GameData.MultiArr[i]*input_mul; + GameData.MultiArr[i] = Func.accMul(GameData.OrgArr[i], input_mul); + } + Utl.SaveData(Utl.Config.multiple, input_mul); + Game_Modify.calResult(GameData.MultiArr); + GameUI.hideCal(); + GameData.Multiple = min_replaceAll(String(input_mul), "\\.", "b", false); + set_self(370, 7, GameData.Multiple, 0, 0); + set_self(370, 20, GameData.Multiple.length * 28, 0, 0); + set_self(283, 20, 203 + GameData.Multiple.length * 28, 0, 0); + } else { + GameUI.OpenTips("输入不正确!", ConstVal.Tips.time); + } + } +} +GameUI.OpenBind = function() { + GameUI.closePallet(); + Utl.playSound(Game_Config.ClickButton.src_2); + set_group(80, 37, 1, 0, 0); + set_self(365, 7, "", 0, 0); + set_self(365, "type", "number"); + if (!C_Player.invitecode) { //已绑定 + set_self(368, 37, 0, 0, 0); + } else { + set_self(365, 37, 0, 0, 0); + set_self(366, 37, 0, 0, 0); + set_self(367, 37, 0, 0, 0); + set_self(368, 7, "您已绑定邀请码,所绑定邀请码为:" + C_Player.invitecode, 0, 0); + } +} +GameUI.CloseBind = function() { + set_group(80, 37, 0, 0, 0); +} + +GameUI.addBroadcast = function(text) { + if (Utl.isMainScene()) { + GameData.BroadcastArray.push(text); + if (!GameData.isBoardcast) { + GameUI.playBroadcast(); + } + } +} +GameUI.playBroadcast = function() { + if (GameData.BroadcastArray.length > 0) { + if (Utl.isMainScene()) { + set_group(56, 37, 1, 0, 0); + GameData.isBoardcast = true; + var text = GameData.BroadcastArray.shift(); + var text_len = text.gblen() * ConstVal.Broadcast.textwidth; + set_self(390, 7, text, 0, 0, 0); + set_self(390, 18, ConstVal.Broadcast.clip_x + ConstVal.Broadcast.clip_w, 0, 0); + play_ani(1, 390, 18, ConstVal.Broadcast.clip_x + ConstVal.Broadcast.clip_w, ConstVal.Broadcast.clip_x - text_len, 0, (text_len + get_self(389, 20, 0, 0, 0)) / ConstVal.Broadcast.speed, 0, 0, 0, 1, 0, 0); + } + } else { + GameUI.closeBroadcast(); + } + +} +GameUI.clearBroadcast = function() { + GameData.BroadcastArray = []; + play_ani(0, 390, 18); + GameData.isBoardcast = false; + set_group(56, 37, 0, 0, 0); +} +GameUI.closeBroadcast = function() { + play_ani(0, 390, 18); + GameData.isBoardcast = false; + set_group(56, 37, 0, 0, 0); +} +GameUI.closeBroadcastfromplayer = function() { + //GameUI.closeBroadcast(); + //GameUI.playBroadcast(); +} + +GameUI.showBackBtn = function() { + if (GameData.LaunchMode == ConstVal.Launch_mode.from_hall) { + set_self(465, 37, 1, 0, 0); + } else { + set_self(465, 37, 0, 0, 0); + } +} +GameUI.openAuth = function() { + set_group(57, 37, 1, 0, 0); + set_self(491, 37, 0, 0, 0); + set_self(492, 37, 0, 0, 0); + set_self(489, 7, "", 0, 0); + set_self(490, 7, "", 0, 0); +} +GameUI.closeAuth = function() { + set_group(57, 37, 0, 0, 0); +} +GameUI.setLoginButton = function() { + + switch (GameData.loginBtnType) { + case ConstVal.loginButton.type1[0]: + set_self(3, 1, ConstVal.loginButton.type1[1], 0, 0, 0); + break; + case ConstVal.loginButton.type2[0]: + set_self(3, 1, ConstVal.loginButton.type2[1], 0, 0, 0); + break; + } +} + +GameUI.playTextVoice = function(_text) { + for (var i = 0; i < Game_Config.Info.TextContent.length; i++) { + if (Game_Config.Info.TextContent[i] == _text) { + Func.play_wav(Game_Config.Info.TextContentMp3[i], 0); + } + } +} +//打开星星争霸场 +GameUI.openWorldRoom = function() { + set_group(82, 37, 1, 0, 0); + set_self(518, 43, GameData.nameImgFrame_2, 0, 0); + if (GameData.worldRoomPage == 0) { + GameUI.goWorldRoom1(); + } else { + GameUI.goWorldRoom2(); + } + +} +//前往系统房 +GameUI.goWorldRoom1 = function() { + GameData.worldRoomPage = 0; + set_self(92, 43, 1, 0, 0); + set_self(93, 43, 4, 0, 0); + set_self(521, 37, 0, 0, 0); + set_self(3019, 37, 0, 0, 0); + //set_self(3019,37,0,0,0); + GameUI.createWorldRoom1(); +} +//前往自建房 +GameUI.goWorldRoom2 = function() { + GameData.worldRoomPage = 1; + set_self(92, 43, 2, 0, 0); + set_self(93, 43, 3, 0, 0); + set_self(521, 37, 1, 0, 0); + set_self(3019, 37, 1, 0, 0); + GameUI.createWorldRoom2(); +} +//关闭星星争霸场 +GameUI.closeWorldRoom = function() { + //GameData.worldRoomPage = 0; + set_group(82, 37, 0, 0, 0); + set_group(96, 37, 0, 0, 0); + set_group(97, 37, 0, 0, 0); + //GameUI.removeWorldRoom1(); + //GameUI.removeWorldRoom2(); + //GameData.worldRoomSys = []; + //GameData.worldRoomPly = []; +} +//设置星星争霸场数据 +GameUI.setWorldRoom = function(_pack) { + if (_pack.roomlist_system) { + GameData.worldRoomSys = _pack.roomlist_system; + for (var i = 0; i < GameData.worldRoomSys.length; i++) { + if (GameData.worldRoomSys[i].image) { + Func.up_imgurl(ConstVal.worldRoom.imgList[i], GameData.worldRoomSys[i].image); + } + } + } else { + GameData.worldRoomSys = []; + } + + if (_pack.roomlist_player) { + GameData.worldRoomPly = _pack.roomlist_player; + if (Game_Modify.getRoomMode) { + + for (var i = 0; i < GameData.worldRoomPly.length; i++) { + var mode = Game_Modify.getRoomMode(GameData.worldRoomPly[i].roomtype); + if (!mode) { + GameData.worldRoomPly.splice(i, 1); + i--; + } + } + } + } else { + GameData.worldRoomPly = []; + } +} +//人数显示转换 +GameUI.convertPlayerCount = function(_pCount) { + //_pCount = 101000; + try { + _pCount = Number(_pCount); + if (_pCount > 9999) { + return Math.ceil(_pCount / 10000) + "万+"; + } else { + return _pCount; + } + } catch (e) { + return _pCount; + } +} +//创建星星争霸场相关精灵 +GameUI.createWorldRoom1 = function() { + //set_self(518,43,GameData.nameImgFrame_2,0,0); + //GameData.worldRoomSys.push(GameData.worldRoomSys[0]); + GameUI.removeWorldRoom1(); + set_group(97, 37, 0, 0, 0); + set_group(96, 37, 1, 0, 0); + //set_self(ConstVal.worldRoom.f_sp_1,37,1,0,0); + + + set_self(ConstVal.worldRoom.top_sp_1, 41, 0, 0, 0); + set_self(ConstVal.worldRoom.des_sp_1, 41, 0, 0, 0); + set_self(ConstVal.worldRoom.starbg_sp_1, 41, 0, 0, 0); + set_self(ConstVal.worldRoom.star_sp_1, 41, 0, 0, 0); + + set_self(ConstVal.worldRoom.mult_sp_1, 41, 0, 0, 0); + set_self(ConstVal.worldRoom.pCount_sp_1, 41, 0, 0, 0); + set_self(ConstVal.worldRoom.join_sp_1, 41, 0, 0, 0); + + set_self(ConstVal.worldRoom.multIcon_sp, 41, 0, 0, 0); + set_self(ConstVal.worldRoom.multImg_sp, 41, 0, 0, 0); + + set_self(ConstVal.worldRoom.f_sp_1, 18, ConstVal.worldRoom.clip_x_1, 0, 0); + set_self(ConstVal.worldRoom.f_sp_1, 19, ConstVal.worldRoom.clip_y_1, 0, 0); + var bg_width_1 = get_self(ConstVal.worldRoom.bg_sp_1, 20, 0, 0); + var bg_height_1 = get_self(ConstVal.worldRoom.bg_sp_1, 21, 0, 0); + var space_1 = ConstVal.worldRoom.bg_sp_space_1 + bg_width_1; + + if (GameData.worldRoomSys.length >= 2) { + set_self(ConstVal.worldRoom.f_sp_1, 20, ConstVal.worldRoom.bgSpaceX * 2, 0); + } else { + set_self(ConstVal.worldRoom.f_sp_1, 20, ConstVal.worldRoom.bgSpaceX, 0); + } + set_self(ConstVal.worldRoom.f_sp_1, 21, ConstVal.worldRoom.bgSpaceY * Math.ceil(GameData.worldRoomSys.length / 2), 0); + //set_self(ConstVal.worldRoom.f_sp_1,20,(bg_width_1+ConstVal.worldRoom.bg_sp_space_1)*GameData.worldRoomSys.length,0); + //set_self(ConstVal.worldRoom.f_sp_1,21,bg_height_1,0); + for (var i = 0; i < GameData.worldRoomSys.length; i++) { //系统房间 + //大背景 + var bg_id = ifast_addtospritefromspritecopy(ConstVal.worldRoom.f_sp_1, ConstVal.worldRoom.bg_sp_1, ConstVal.worldRoom.bg_sp_x_1 + (i % 2) * ConstVal.worldRoom.bgSpaceX, ConstVal.worldRoom.bg_sp_y_1 + Math.floor(i / 2) * ConstVal.worldRoom.bgSpaceY, i + ConstVal.worldRoom.bg_sp_tag_1); + set_self(bg_id, 43, (i % 4) + 1, 0, 0); + //顶栏描述 + //console.log("x:"+get_self(bg_id,18,0,0,0));GameData.worldRoomSys[i].image + //console.log("y:"+get_self(bg_id,19,0,0,0)); + if (GameData.worldRoomSys[i].image) { + var topImg = ifast_addtospritefromspritecopy(ConstVal.worldRoom.f_sp_1, ConstVal.worldRoom.topImg_sp, 0, + ConstVal.worldRoom.topImg_y + Math.floor(i / 2) * ConstVal.worldRoom.bgSpaceY, i + ConstVal.worldRoom.topImg_tag); + set_self(topImg, 1, ConstVal.worldRoom.imgList[i], 0, 0); + set_self(topImg, 18, get_self(bg_id, 18, 0, 0, 0) + get_self(bg_id, 20, 0, 0, 0) / 2 - get_self(topImg, 20, 0, 0, 0) / 2, 0, 0); + set_self(topImg,41,0,0,0); + + } else { + var top_id = ifast_addtospritefromspritecopy(ConstVal.worldRoom.f_sp_1, ConstVal.worldRoom.top_sp_1, 0, + ConstVal.worldRoom.top_sp_y_1 + Math.floor(i / 2) * ConstVal.worldRoom.bgSpaceY, i + ConstVal.worldRoom.top_sp_tag_1); + var top_info = GameData.worldRoomSys[i].title; + //var top_info = "初级场"; + set_self(top_id, 7, top_info, 0, 0); + set_self(top_id, 18, get_self(bg_id, 18, 0, 0, 0) + get_self(bg_id, 20, 0, 0, 0) / 2 - top_info.gblen() * ConstVal.worldRoom.top_sp_width_1 / 2, 0, 0); + set_self(top_id,41,0,0,0); + } + //if(GameData.worldRoomSys[i].title){ + //var top_id = ifast_addtospritefromspritecopy(ConstVal.worldRoom.f_sp_1,ConstVal.worldRoom.top_sp_1, + //0, + //ConstVal.worldRoom.top_sp_y_1+Math.floor(i/2)*ConstVal.worldRoom.bgSpaceY,i+ConstVal.worldRoom.top_sp_tag_1 + //); + //var top_info = GameData.worldRoomSys[i].title; + //set_self(top_id,7,top_info,0,0); + //set_self(top_id,18,get_self(bg_id,18,0,0,0) + get_self(bg_id,20,0,0,0)/2-top_info.gblen()*ConstVal.worldRoom.top_sp_width_1/2,0,0); + //}else{ + //var topImg = ifast_addtospritefromspritecopy(ConstVal.worldRoom.f_sp_1,ConstVal.worldRoom.topImg_sp, + //0, + //ConstVal.worldRoom.topImg_y+Math.floor(i/2)*ConstVal.worldRoom.bgSpaceY,i+ConstVal.worldRoom.topImg_tag + //); + //set_self(topImg,1,ConstVal.worldRoom.imgList[i],0,0); + //set_self(topImg,18,get_self(bg_id,18,0,0,0) +get_self(bg_id,20,0,0,0)/2 - get_self(topImg,20,0,0,0)/2,0,0); + //} + + + var mTemp = Game_Modify.getMult(GameData.worldRoomSys[i].roomtype, 1); + var mult_text = 0; + mTemp <= 0 ? mult_text = 1 : mult_text = mTemp; + + //if(mTemp <= 0){ + //mult_text = GameData.worldRoomSys[i].title; + //}else{ + //mult_text = GameData.worldRoomSys[i].title+" "+mTemp+"倍"; + //} + //var mult_x = get_self(ConstVal.worldRoom.bg_sp_1,20,0,0,0)/2 - mult_text.gblen()*ConstVal.worldRoom.mult_sp_w_1/2; + //var mult_id = ifast_addtospritefromspritecopy(ConstVal.worldRoom.f_sp_1,ConstVal.worldRoom.mult_sp_1, + //mult_x+(i%2)*ConstVal.worldRoom.bgSpaceX, + //ConstVal.worldRoom.mult_sp_y_1+Math.floor(i/2)*ConstVal.worldRoom.bgSpaceY,i+ConstVal.worldRoom.mult_sp_tag_1 + //); + //set_self(mult_id,7,mult_text,0,0); + var mx = get_self(bg_id, 18, 0, 0, 0) + get_self(bg_id, 20, 0, 0, 0) / 2 - (get_self(ConstVal.worldRoom.multIcon_sp, 20, 0, 0, 0) + String(mult_text).length * ConstVal.worldRoom.multImgWidth + ConstVal.worldRoom.multIconImgSpace) / 2; + var multIcon = ifast_addtospritefromspritecopy(ConstVal.worldRoom.f_sp_1, ConstVal.worldRoom.multIcon_sp, + get_self(bg_id, 18, 0, 0, 0) + get_self(bg_id, 20, 0, 0, 0) / 2 - get_self(ConstVal.worldRoom.multIcon_sp, 20, 0, 0, 0) / 2, + ConstVal.worldRoom.multIcon_y + Math.floor(i / 2) * ConstVal.worldRoom.bgSpaceY, i + ConstVal.worldRoom.multIcon_tag); + var multImg = ifast_addtospritefromspritecopy(ConstVal.worldRoom.f_sp_1, ConstVal.worldRoom.multImg_sp, 0, + ConstVal.worldRoom.multImg_y + Math.floor(i / 2) * ConstVal.worldRoom.bgSpaceY, i + ConstVal.worldRoom.multImg_tag); + set_self(multImg, 7, mult_text, 0, 0); + set_self(multImg, 20, String(mult_text).length * ConstVal.worldRoom.multImgWidth, 0, 0); + set_self(multImg, 18, 25 + get_self(multIcon, 18, 0, 0, 0) + get_self(multIcon, 20, 0, 0, 0) / 2 - get_self(multImg, 20, 0, 0, 0) / 2, 0, 0); + + //房间信息描述 + //var des_id = ifast_addtospritefromspritecopy(ConstVal.worldRoom.f_sp_1,ConstVal.worldRoom.des_sp_1, + //ConstVal.worldRoom.des_sp_x_1+i*space_1,ConstVal.worldRoom.des_sp_y_1,i+ConstVal.worldRoom.des_sp_tag_1 + //); + //var des_info = Game_Modify.getRoomInfo(GameData.worldRoomSys[i].roomtype,1); + //set_self(des_id,7,des_info,0,0); + //星星背景 + //var starbg_id = ifast_addtospritefromspritecopy(ConstVal.worldRoom.f_sp_1,ConstVal.worldRoom.starbg_sp_1, + //ConstVal.worldRoom.starbg_sp_x_1+i*space_1,ConstVal.worldRoom.starbg_sp_y_1,i+ConstVal.worldRoom.starbg_sp_tag_1 + //); + //set_self(starbg_id,18,ConstVal.worldRoom.bg_sp_x_1+i*space_1+bg_width_1/2-get_self(ConstVal.worldRoom.starbg_sp_1,20,0,0,0)/2,0,0); + + //星星背景 + //var star_id = ifast_addtospritefromspritecopy(ConstVal.worldRoom.f_sp_1,ConstVal.worldRoom.star_sp_1, + //ConstVal.worldRoom.star_sp_x_1+i*space_1,ConstVal.worldRoom.star_sp_y_1,i+ConstVal.worldRoom.star_sp_tag_1 + //); + //var star_info = "下限:"+Game_Modify.getStarLimit(GameData.worldRoomSys[i].roomtype); + //set_self(star_id,7,star_info,0,0); + //set_self(star_id,18,ConstVal.worldRoom.bg_sp_x_1+i*space_1+bg_width_1/2-star_info.gblen()*ConstVal.worldRoom.top_sp_width_1/2,0,0); + //人数 + if (GameData.worldRoomSys[i].playercount) { + var pCount_id = ifast_addtospritefromspritecopy(ConstVal.worldRoom.f_sp_1, ConstVal.worldRoom.pCount_sp_1, ConstVal.worldRoom.pCount_sp_x_1 + (i % 2) * ConstVal.worldRoom.bgSpaceX, ConstVal.worldRoom.pCount_sp_y_1 + Math.floor(i / 2) * ConstVal.worldRoom.bgSpaceY, i + ConstVal.worldRoom.pCount_sp_tag_1); + set_self(pCount_id, 7, GameUI.convertPlayerCount(GameData.worldRoomSys[i].playercount), 0, 0); + } + + //准入 + var limit_text = String(Game_Modify.getStarLimit(GameData.worldRoomSys[i].roomtype)); + limit_text >= 100000 ? limit_text = Math.floor(limit_text / 10000) + "万" : true; + //var limit_x = ConstVal.worldRoom.join_sp_x_1 - limit_text.gblen()*ConstVal.worldRoom.join_sp_w_1; + var limit_x = ConstVal.worldRoom.join_sp_x_1; + var limit_id = ifast_addtospritefromspritecopy(ConstVal.worldRoom.f_sp_1, ConstVal.worldRoom.join_sp_1, limit_x + (i % 2) * ConstVal.worldRoom.bgSpaceX, ConstVal.worldRoom.join_sp_y_1 + Math.floor(i / 2) * ConstVal.worldRoom.bgSpaceY, i + ConstVal.worldRoom.join_sp_tag_1); + set_self(limit_id, 7, limit_text, 0, 0); + + } + + + //if(GameData.hallConfig.enableQuickEnter){//隐藏快速加入 + //set_self(521,37,0,0,0); + //set_self(3019,18,522,0,0); + //}else{//不隐藏 + //set_self(3019,18,766,0,0); + //set_self(521,18,788,0,0); + //} +} +GameUI.createWorldRoom2 = function() { + GameUI.removeWorldRoom2(); + set_group(96, 37, 0, 0, 0); + set_group(97, 37, 1, 0, 0); + + + set_self(ConstVal.worldRoom.f_sp_2, 18, ConstVal.worldRoom.clip_x_2, 0, 0); + set_self(ConstVal.worldRoom.f_sp_2, 19, ConstVal.worldRoom.clip_y_2, 0, 0); + set_self(ConstVal.worldRoom.top_sp_2, 41, 0, 0, 0); + set_self(ConstVal.worldRoom.des_sp_2, 41, 0, 0, 0); + set_self(ConstVal.worldRoom.starbg_sp_2, 41, 0, 0, 0); + set_self(ConstVal.worldRoom.star_sp_2, 41, 0, 0, 0); + + var bg_width_2 = get_self(ConstVal.worldRoom.bg_sp_2, 20, 0, 0); + var bg_height_2 = get_self(ConstVal.worldRoom.bg_sp_2, 21, 0, 0); + var space_2 = ConstVal.worldRoom.bg_sp_space_2 + bg_height_2; + //ConstVal.worldRoom.clip_h_2 = 3*(ConstVal.worldRoom.bg_sp_space_2 + bg_height_2); + set_self(ConstVal.worldRoom.f_sp_2, 20, bg_width_2, 0); + set_self(ConstVal.worldRoom.f_sp_2, 21, (bg_height_2 + ConstVal.worldRoom.bg_sp_space_2) * GameData.worldRoomPly.length, 0); + var listLength = GameData.worldRoomPly.length; + var pCountTag = ConstVal.worldRoom.pCount_sp_tag_2; + var pCountW = get_self(ConstVal.worldRoom.pCount_sp_2, 20, 0, 0, 0); + var pCountX = get_self(ConstVal.worldRoom.pCountIcon_sp_2, 20, 0, 0, 0) + ConstVal.worldRoom.pCountIcon_pCount_space_2 + ConstVal.worldRoom.pCountIcon_sp_x_2; + for (var i = 0; i < GameData.worldRoomPly.length; i++) { //玩家房间 + //大背景 + var bg_id = ifast_addtospritefromspritecopy(ConstVal.worldRoom.f_sp_2, ConstVal.worldRoom.bg_sp_2, ConstVal.worldRoom.bg_sp_x_2, ConstVal.worldRoom.bg_sp_y_2 + i * space_2, i + ConstVal.worldRoom.bg_sp_tag_2); + + //倍数 + var mult_text = "倍数:"; + var mTemp = Game_Modify.getMult(GameData.worldRoomPly[i].roomtype, 2); + if (mTemp <= 0) { + mult_text += "1"; + } else { + mult_text += mTemp; + } + //房间标题 + var titleTxt = GameData.worldRoomPly[i].destwo; + if (GameData.worldRoomPly[i].shareType) { + if (!titleTxt) { + titleTxt = "vip赛事"; + } + } else { + titleTxt = "普通房间"; + } + var title_id = ifast_addtospritefromspritecopy(ConstVal.worldRoom.f_sp_2, ConstVal.worldRoom.title_sp, ConstVal.worldRoom.title_sp_x, ConstVal.worldRoom.title_sp_y + i * space_2, i + ConstVal.worldRoom.title_tag); + set_self(title_id, 7, titleTxt, 0, 0); + var mult_id = ifast_addtospritefromspritecopy(ConstVal.worldRoom.f_sp_2, ConstVal.worldRoom.mult_sp_2, ConstVal.worldRoom.mult_sp_x_2, ConstVal.worldRoom.mult_sp_y_2 + i * space_2, i + ConstVal.worldRoom.mult_sp_tag_2); + set_self(mult_id, 7, mult_text, 0, 0); + //房间信息描述 + var des_id = ifast_addtospritefromspritecopy(ConstVal.worldRoom.f_sp_2, ConstVal.worldRoom.des_sp_2, ConstVal.worldRoom.des_sp_x_2, ConstVal.worldRoom.des_sp_y_2 + i * space_2, i + ConstVal.worldRoom.des_sp_tag_2); + var des_info = Game_Modify.getRoomInfo(GameData.worldRoomPly[i].roomtype, 2, GameData.worldRoomPly[i].tea); + des_info = min_replaceAll(des_info, "\n", "", false); + //des_info = Func.subString(des_info,46,true); + set_self(des_id, 7, des_info, 0, 0); + //离场 + var leave_text = "离场:"; + var lTemp = Game_Modify.getLeaveLimit(GameData.worldRoomPly[i].roomtype); + + lTemp > 0 ? leave_text += lTemp : leave_text = ""; + var leaveX = ConstVal.worldRoom.leave_sp_x_2 - ConstVal.worldRoom.leave_sp_w_2 * leave_text.gblen(); + //入场 + var join_text = "入场:"; + var lTemp = Game_Modify.getStarLimit(GameData.worldRoomPly[i].roomtype); + + lTemp > 0 ? join_text += lTemp : join_text = ""; + var joinX = ConstVal.worldRoom.join_sp_x_2 - ConstVal.worldRoom.join_sp_w_2 * join_text.gblen(); + var limitX = 0; + leaveX < joinX ? limitX = leaveX : limitX = joinX; + var leave_id = ifast_addtospritefromspritecopy(ConstVal.worldRoom.f_sp_2, ConstVal.worldRoom.leave_sp_2, limitX, ConstVal.worldRoom.leave_sp_y_2 + i * space_2, i + ConstVal.worldRoom.leave_sp_tag_2); + set_self(leave_id, 7, leave_text, 0, 0); + + + var join_id = ifast_addtospritefromspritecopy(ConstVal.worldRoom.f_sp_2, ConstVal.worldRoom.join_sp_2, limitX, ConstVal.worldRoom.join_sp_y_2 + i * space_2, i + ConstVal.worldRoom.join_sp_tag_2); + set_self(join_id, 7, join_text, 0, 0); + //房间号 + var roomcode_id = ifast_addtospritefromspritecopy(ConstVal.worldRoom.f_sp_2, ConstVal.worldRoom.roomCode_sp_2, ConstVal.worldRoom.roomCode_sp_x_2, ConstVal.worldRoom.roomCode_sp_y_2 + i * space_2, i + ConstVal.worldRoom.roomCode_sp_tag_2); + set_self(roomcode_id, 20, String(GameData.worldRoomPly[i].roomcode).length * ConstVal.worldRoom.roomCode_sp_w_2, 0, 0); + set_self(roomcode_id, 7, GameData.worldRoomPly[i].roomcode, 0, 0); + if (GameData.worldRoomPly[i].seatcount) { + //人数icon + var pCountIcon_id = ifast_addtospritefromspritecopy(ConstVal.worldRoom.f_sp_2, ConstVal.worldRoom.pCountIcon_sp_2, ConstVal.worldRoom.pCountIcon_sp_x_2, ConstVal.worldRoom.pCountIcon_sp_y_2 + i * space_2, i + ConstVal.worldRoom.pCountIcon_sp_tag_2); + //人数显示 + for (j = 0; j < GameData.worldRoomPly[i].seatcount; j++) { + + var pCount_id = ifast_addtospritefromspritecopy(ConstVal.worldRoom.f_sp_2, ConstVal.worldRoom.pCount_sp_2, pCountX + j * (ConstVal.worldRoom.pCount_space_2 + pCountW), ConstVal.worldRoom.pCount_sp_y_2 + i * space_2, pCountTag); + if (GameData.worldRoomPly[i].playercount - 1 >= j) { + set_self(pCount_id, 43, 1, 0, 0, 0); + } else { + set_self(pCount_id, 43, 2, 0, 0, 0); + } + pCountTag++; + } + } + } +} + +//删除星星争霸场数据包括创建的精灵 +GameUI.removeWorldRoom1 = function() { + for (var i = 0; i < GameData.worldRoomSys.length; i++) { //系统房间 + //大背景 + ifast_dllpritefromspritecopy(ConstVal.worldRoom.f_sp_1, i + ConstVal.worldRoom.bg_sp_tag_1); + //顶栏描述 + ifast_dllpritefromspritecopy(ConstVal.worldRoom.f_sp_1, i + ConstVal.worldRoom.top_sp_tag_1); + //房间信息描述 + ifast_dllpritefromspritecopy(ConstVal.worldRoom.f_sp_1,i+ConstVal.worldRoom.topImg_tag); + //星星背景 + ifast_dllpritefromspritecopy(ConstVal.worldRoom.f_sp_1,i+ConstVal.worldRoom.multIcon_tag); + + // + ifast_dllpritefromspritecopy(ConstVal.worldRoom.f_sp_1,i+ConstVal.worldRoom.multImg_tag); + //倍数 + ifast_dllpritefromspritecopy(ConstVal.worldRoom.f_sp_1, i + ConstVal.worldRoom.mult_sp_tag_1); + //人数 + ifast_dllpritefromspritecopy(ConstVal.worldRoom.f_sp_1, i + ConstVal.worldRoom.pCount_sp_tag_1); + //准入 + ifast_dllpritefromspritecopy(ConstVal.worldRoom.f_sp_1, i + ConstVal.worldRoom.join_sp_tag_1); + } + return; + var pCountTag = ConstVal.worldRoom.pCount_sp_tag_2; + for (var i = 0; i < GameData.worldRoomPly.length; i++) { //玩家房间 + //大背景 + ifast_dllpritefromspritecopy(ConstVal.worldRoom.f_sp_2, i + ConstVal.worldRoom.bg_sp_tag_2); + //顶栏描述 + //ifast_dllpritefromspritecopy(ConstVal.worldRoom.f_sp_2,i+ConstVal.worldRoom.top_sp_tag_2); + //房间信息描述 + ifast_dllpritefromspritecopy(ConstVal.worldRoom.f_sp_2, i + ConstVal.worldRoom.des_sp_tag_2); + //星星背景 + //ifast_dllpritefromspritecopy(ConstVal.worldRoom.f_sp_2,i+ConstVal.worldRoom.starbg_sp_tag_2); + //星星背景 + //ifast_dllpritefromspritecopy(ConstVal.worldRoom.f_sp_2,i+ConstVal.worldRoom.star_sp_tag_2); + //倍数 + ifast_dllpritefromspritecopy(ConstVal.worldRoom.f_sp_2, i + ConstVal.worldRoom.mult_sp_tag_2); + if (GameData.worldRoomPly[i].seatcount) { + for (var j = 0; j < GameData.worldRoomPly[i].seatcount; j++) { + //人数 + ifast_dllpritefromspritecopy(ConstVal.worldRoom.f_sp_2, pCountTag); + pCountTag++; + } + } + //准入 + ifast_dllpritefromspritecopy(ConstVal.worldRoom.f_sp_2, i + ConstVal.worldRoom.join_sp_tag_2); + //人数icon + ifast_dllpritefromspritecopy(ConstVal.worldRoom.f_sp_2, i + ConstVal.worldRoom.pCountIcon_sp_tag_2); + //离场 + ifast_dllpritefromspritecopy(ConstVal.worldRoom.f_sp_2, i + ConstVal.worldRoom.leave_sp_tag_2); + //房间号 + ifast_dllpritefromspritecopy(ConstVal.worldRoom.f_sp_2, i + ConstVal.worldRoom.roomCode_sp_tag_2); + } + //GameData.worldRoomSys=[]; + +} +//删除星星争霸场数据包括创建的精灵 +GameUI.removeWorldRoom2 = function() { + + var pCountTag = ConstVal.worldRoom.pCount_sp_tag_2; + for (var i = 0; i < GameData.worldRoomPly.length; i++) { //玩家房间 + //大背景 + ifast_dllpritefromspritecopy(ConstVal.worldRoom.f_sp_2, i + ConstVal.worldRoom.bg_sp_tag_2); + //顶栏描述 + ifast_dllpritefromspritecopy(ConstVal.worldRoom.f_sp_2, i + ConstVal.worldRoom.title_tag); + //房间信息描述 + ifast_dllpritefromspritecopy(ConstVal.worldRoom.f_sp_2, i + ConstVal.worldRoom.des_sp_tag_2); + //星星背景 + //ifast_dllpritefromspritecopy(ConstVal.worldRoom.f_sp_2,i+ConstVal.worldRoom.starbg_sp_tag_2); + //星星背景 + //ifast_dllpritefromspritecopy(ConstVal.worldRoom.f_sp_2,i+ConstVal.worldRoom.star_sp_tag_2); + //倍数 + ifast_dllpritefromspritecopy(ConstVal.worldRoom.f_sp_2, i + ConstVal.worldRoom.mult_sp_tag_2); + if (GameData.worldRoomPly[i].seatcount) { + for (var j = 0; j < GameData.worldRoomPly[i].seatcount; j++) { + //人数 + ifast_dllpritefromspritecopy(ConstVal.worldRoom.f_sp_2, pCountTag); + pCountTag++; + } + } + //准入 + ifast_dllpritefromspritecopy(ConstVal.worldRoom.f_sp_2, i + ConstVal.worldRoom.join_sp_tag_2); + //人数icon + ifast_dllpritefromspritecopy(ConstVal.worldRoom.f_sp_2, i + ConstVal.worldRoom.pCountIcon_sp_tag_2); + //离场 + ifast_dllpritefromspritecopy(ConstVal.worldRoom.f_sp_2, i + ConstVal.worldRoom.leave_sp_tag_2); + //房间号 + ifast_dllpritefromspritecopy(ConstVal.worldRoom.f_sp_2, i + ConstVal.worldRoom.roomCode_sp_tag_2); + } + //GameData.worldRoomPly=[]; +} +GameUI.switchSnrVideo = function(bTemp) { + if (bTemp) { + set_self(3133, 43, 1, 0, 0); + } else { + set_self(3133, 43, 2, 0, 0); + } +} +GameUI.updateCloseState = function() { + if (GameData.snrRoomList.isClose == 0) { + set_self(3136, 37, 0, 0, 0); + set_self(3164, 43, 1, 0, 0); + } else if (GameData.snrRoomList.isClose == 1) { + set_self(3136, 37, 0, 0, 0); + set_self(3164, 43, 2, 0, 0); + } else { + set_self(3163, 37, 0, 0, 0); + set_self(3164, 37, 0, 0, 0); + } +} +GameUI.clickSnrRoomState = function() { + if (GameData.snrRoomList.isClose) { + GameData.senRoomState = 0; + } else { + GameData.senRoomState = 1; + } + //GameUI.updateCloseState(); + var data = {}; + data.agentid = GameData.AgentId; + data.gameid = GameData.GameId; + data.playerid = C_Player.playerid; + data.isClose = GameData.senRoomState; + Net.Send_switchRoomList(data); +} +GameUI.clickSnrVideo = function() { + if (GameData.sysConfig.videoConfig) { + if (GameUI.Mem.snrOption.videoConfig) { + GameUI.Mem.snrOption.videoConfig = null; + GameUI.switchSnrVideo(false); + } else { + GameUI.Mem.snrOption.videoConfig = GameData.sysConfig.videoConfig; + GameUI.switchSnrVideo(true); + } + } +} +GameUI.clickSnrFobid = function() { + //if (GameData.sysConfig.videoConfig) { + if (GameUI.Mem.snrOption.forbidSelect) { + GameUI.Mem.snrOption.forbidSelect = 0; + //GameUI.switchSnrForbid(); + GameUI.updateFobidSelect(); + } else { + GameUI.Mem.snrOption.forbidSelect = 1; + //GameUI.switchSnrForbid(); + GameUI.updateFobidSelect(); + } + //} +} +GameUI.updateFobidSelect = function() { + if(GameData.snrRoomList.roomlist.length == 0){ + set_self(3257, 37, 0, 0, 0); + set_self(3258, 37, 0, 0, 0); + return; + } + if (GameData.snrRoomList.forbidSelect == 0) { + set_self(3257, 37, 1, 0, 0); + set_self(3258, 37, 1, 0, 0); + set_self(3258, 43, 2, 0, 0); + } else if(GameData.snrRoomList.forbidSelect == 1){ + set_self(3257, 37, 1, 0, 0); + set_self(3258, 37, 1, 0, 0); + set_self(3258, 43, 1, 0, 0); + } +} +GameUI.switchSnrForbid = function(){ + if(GameUI.Mem.snrOption.forbidSelect){ + set_self(3258,43,1,0,0); + }else{ + set_self(3258,43,2,0,0); + } +} +//打开高级选项 +GameUI.openSeniorOptions = function(mode, roomtype, descrip, _profit) { //是否为星星场 + //console.log(Desk); + var _mode = 0; + //mode = 1; + GameData.snrOption = { + profit: 0, + roomcode: "", + }; + var limit = Game_Modify.getStarLimit(roomtype); + var mult = Game_Modify.getMult(roomtype, 0); + GameUI.Mem.snrOption.infinite = 0; + GameUI.Mem.snrOption.max = 9999999; + //GameUI.Mem.snrOption.max = Number(GameData.hallConfig.max)*mult; + GameUI.Mem.snrOption.min = 0; + GameUI.Mem.snrOption.sysRebate = parseInt(mult * GameData.sysConfig.rebateConfig.value / 100); + //if(GameData.snrRoomList.forbidSelect){ + //GameUI.Mem.snrOption.forbidSelect = 1; + //}else{ + //GameUI.Mem.snrOption.forbidSelect = 0; + //} + + if (Game_Config.sysConfig.vipInfinite) { + GameUI.Mem.snrOption.sysRebate = 0; + } + if(!Game_Modify.getRoomMode(roomtype)){ + GameUI.Mem.snrOption.sysRebate = 0; + } + //GameUI.Mem.snrOption.min = parseInt(mult * GameData.sysConfig.rebateConfig.value / 100); + //GameUI.Mem.snrOption.unit = Number(GameData.hallConfig.unit) * mult; + //GameUI.Mem.snrOption.max == 0 ? _mode = 1 : _mode = 0; + //set_self(599,7,"玩家可通过输入短号快速加入房间",0); + //set_self(3015,7,"更改已存在房间,房间类型会在牌局结束或者房间解散后更新",0); + //set_self(3101,7,"是否为无限局",0); + set_self(628, 7, descrip, 0, 0); + GameData.snrOption.profit < GameUI.Mem.snrOption.min ? GameData.snrOption.profit = GameUI.Mem.snrOption.min : (GameData.snrOption.profit > GameUI.Mem.snrOption.max ? GameData.snrOption.profit = GameUI.Mem.snrOption.max : true); + GameUI.Mem.snrOption.slider = get_self(597, 20, 0, 0, 0); + GameUI.Mem.snrOption.start_x = get_self(596, 18, 0, 0, 0); + GameUI.Mem.snrOption.end_x = get_self(596, 20, 0, 0, 0) + GameUI.Mem.snrOption.start_x - GameUI.Mem.snrOption.slider; + GameUI.Mem.snrOption.unit_px = (get_self(596, 20, 0, 0, 0) - GameUI.Mem.snrOption.slider) / ((GameUI.Mem.snrOption.max - GameUI.Mem.snrOption.min) / GameUI.Mem.snrOption.unit); + GameUI.Mem.snrOption.count = Math.round((GameUI.Mem.snrOption.end_x - GameUI.Mem.snrOption.start_x) / GameUI.Mem.snrOption.unit_px); + //set_self(597,18,GameUI.Mem.snrOption.start_x+((GameData.snrOption.profit - GameUI.Mem.snrOption.min)/GameUI.Mem.snrOption.unit)*GameUI.Mem.snrOption.unit_px,0,0); + + //set_self(593,20,GameUI.Mem.snrOption.number_1*String(GameData.snrOption.profit).length,0,0); + //set_self(593,7,GameData.snrOption.profit,0,0); + //set_self(593,18,get_self(597,18,0,0,0)+35-GameUI.Mem.snrOption.number_1*String(GameData.snrOption.profit).length/2,0,0); + + //set_self(594,20,GameUI.Mem.snrOption.number_2*String(GameUI.Mem.snrOption.min).length,0,0); + //set_self(594,7,GameUI.Mem.snrOption.min,0,0); + //set_self(594,18,GameUI.Mem.snrOption.start_x - get_self(594,20,0,0,0) -10,0,0); + + //set_self(595,20,GameUI.Mem.snrOption.number_2*String(GameUI.Mem.snrOption.max).length,0,0); + //set_self(595,7,GameUI.Mem.snrOption.max,0,0); + var shortcode = ""; + if (GameData.snrRoomList.shortcode) { + shortcode = GameData.snrRoomList.shortcode; + } + set_self(598, 20, GameUI.Mem.snrOption.number_1 * String(shortcode).length, 0, 0); + set_self(598, 7, shortcode, 0, 0); + //GameUI.Mem.snrOption.roomcode_string = String(GameData.snrOption.roomcode); + //GameUI.Mem.snrOption.roomcode_number = Number(GameData.snrOption.roomcode); + + + + //GameUI.Mem.snrOption.number = GameData.snrOption.profit; + + set_group(83, 37, 1, 0, 0); + GameUI.clearSnrOptionRoomList(); + GameUI.createSnrOptionRoomList(); + //set_self(610,37,0,0,0); + if (GameData.sysConfig.videoConfig) { + //GameUI.Mem.snrOption.videoConfig = GameData.sysConfig.videoConfig; + GameUI.Mem.snrOption.videoConfig = null; + GameUI.switchSnrVideo(false); + set_self(3133, 41, 2, 0, 0); + var vConfig = Logic.alyVideoConfig(GameData.sysConfig.videoConfig); + set_self(3134, 7, "将收取" + vConfig[0] + ":" + vConfig[1]); + + } else { + GameUI.Mem.snrOption.videoConfig = null; + //不可点 + //GameUI.switchSnrVideo(false); + //set_self(3133,41,0,0,0); + //set_self(3134,7,"此功能暂未开放",0,0); + + //隐藏 + set_self(592, 37, 0, 0, 0); + set_self(3133, 37, 0, 0, 0); + set_self(3134, 37, 0, 0, 0); + } + + //GameUI.switchSnrForbid(); + //if(mode){ + set_self(3100, 37, 0, 0, 0); + set_self(3132, 37, 0, 0, 0); + //} + if (_mode) { //隐藏输入 + //set_self(580,37,0,0,0);//短号费说明文字 + set_self(593, 37, 0, 0, 0); + set_self(594, 37, 0, 0, 0); + set_self(596, 37, 0, 0, 0); + set_self(597, 37, 0, 0, 0); + set_self(595, 37, 0, 0, 0); + + //set_self(3097,37,0,0,0);//输入底框 + set_self(3098, 37, 0, 0, 0); //说明文字 + set_self(3099, 37, 0, 0, 0); //输入数字 + set_self(3097, 41, 0, 0, 0); + } else { + set_self(3130, 37, 0, 0, 0); + + //if(_profit){ + //GameUI.Mem.snrOption.number = _profit; + //GameUI.setNumberImage(3099,_profit,28); + //GameUI.adaptPositionX(3099,get_self(3097,18,0,0,0)+get_self(3097,20,0,0,0)/2); + //}else{ + //GameUI.Mem.snrOption.number = GameUI.Mem.snrOption.min; + // try{ + // limit = Number(limit); + // mult = Number(mult); + //}catch(e){ + // limit = 0; + // mult = 0; + //} + //if(limit > 0 && mult > 0){ + set_self(3158, 37, 0, 0, 0); + set_self(3197, 41, 1, 0, 0); + //set_self(3098, 7, "(" + GameUI.Mem.snrOption.min + "~" + GameUI.Mem.snrOption.max + ")"); + + + //var value = GameUI.Mem.snrOption.tea; + var value = 0; + if (!value) { + if (GameUI.Mem.snrOption.tea) { + value = GameUI.Mem.snrOption.tea; + } else { + value = 0; + GameUI.Mem.snrOption.tea = 0; + } + } + var vl = Number(value); + if (Number(value) < GameUI.Mem.snrOption.min) { + vl = GameUI.Mem.snrOption.min; + } else { + if (Number(value) > GameUI.Mem.snrOption.max) { + vl = GameUI.Mem.snrOption.max; + } + } + GameUI.Mem.snrOption.number = vl; + GameUI.setNumberImage(3099, vl, 18); + GameUI.adaptPositionX(3099, get_self(3097, 18, 0, 0, 0) + get_self(3097, 20, 0, 0, 0) / 2); + var rCount = vl + GameUI.Mem.snrOption.sysRebate; + set_self(3098, 7, "系统收取: "+GameUI.Mem.snrOption.sysRebate+"\n您加收: "+vl+"\n合计: "+rCount); + // }else{ + // set_self(3099,37,0,0,0); + // set_self(3098,37,0,0,0); + // set_self(3158,37,1,0,0); + //} + //} + } + var val = Utl.ReadData(Utl.Config.rebateLimit); + set_self(3239,7,"低于免收值将不收取房间费",0,0); + GameUI.setNumberImage(3237, val, 18); + GameUI.adaptPositionSpid(3237,3236); + console.log(GameData.rebateConfig); + if(GameData.rebateConfig){ + if(GameData.rebateConfig.from == 3 && Game_Modify.getRoomMode(roomtype)){ + set_self(3238,37,0,0,0); + set_self(3236,37,0,0,0); + set_self(3237,37,0,0,0); + set_self(3239,37,0,0,0); + } + } + //金币场 + //if(mode){ + + //}else{ + + //} + //百人 + if (Game_Config.sysConfig.vipInfinite) { + set_self(653, 37, 0, 0, 0); + } + if (!GameData.sysConfig.managerUrl) { + set_self(3140, 37, 0, 0, 0); + } + set_self(3089, 18, 464, 0, 0, 0); + +/* + if(Game_Config.sysConfig.vipInfinite){ + set_self(3130,37,0,0,0); + set_self(3099,37,0,0,0); + set_self(3097,37,0,0,0); + set_self(580,37,0,0,0); + set_self(3158,37,0,0,0); + var txt = Logic.getRebateDes(mult); + set_self(3098,7,"系统每小局对每个玩家收取"+GameData.starName+":"+txt); + set_self(3098,18,186,0,0,0); + set_self(3098,37,1,0,0); + } + */ + set_self(3166, 37, 0, 0, 0); + //set_self(3167,37,0,0,0); + //set_self(3168,37,0,0,0); + set_self(3169, 37, 0, 0, 0); + set_self(3168, 7, GameData.starName, 0, 0); + set_self(3169, 7, GameData.sysConfig.charmName, 0, 0); + //GameUI.Mem.snrOption.rebateType = 0; + var isBean = 0; + if (Game_Modify.getRoomMode) { + isBean = Game_Modify.getRoomMode(GameData.snrOptionRoomtype); + } + var cTemp = true; + //if(!Game_Config.sysConfig.vipInfinite){ + if (!isBean) { + if (GameData.rebateConfig) { + if (GameData.rebateConfig.rebateCharm) { + set_self(3166, 37, 1, 0, 0); + //set_self(3167,37,1,0,0); + //set_self(3168,37,1,0,0); + set_self(3169, 37, 1, 0, 0); + cTemp = false; + } + } + } + //} + if (cTemp) { + GameUI.Mem.snrOption.rebateType = 0; + } + if (Game_Config.sysConfig.vipInfinite && GameData.brNumber) { + set_self(3134, 37, 1, 0, 0); + set_self(3134, 18, 190, 0, 0); + if(GameData.brRebateUnit){ + if(GameData.brRebateUnit >= 10000){ + var txt = "每小局将收取您" + GameData.starName + ":" + GameData.brNumber; + }else{ + var txt = "每小局每"+GameData.brRebateUnit+"人收取您" + GameData.starName + ":" + GameData.brNumber; + } + }else{ + var txt = "每小局将收取您" + GameData.starName + ":" + GameData.brNumber; + } + set_self(3134, 7, txt, 0, 0); + } + GameUI.updateCloseState(); + GameUI.updateFobidSelect(); + +} + +var snrInputCallback = function(value) { + Utl.closeInputPanel(); + var vl = Number(value); + if (Number(value) < GameUI.Mem.snrOption.min) { + GameUI.OpenTips("输入低于最小,已变更为最小值", ConstVal.Tips.time); + vl = GameUI.Mem.snrOption.min; + } else { + if (Number(value) > GameUI.Mem.snrOption.max) { + GameUI.OpenTips("输入高于最大,已变更为最大值", ConstVal.Tips.time); + vl = GameUI.Mem.snrOption.max; + } + } + GameUI.Mem.snrOption.number = vl; + Logic.saveTea(vl); + GameUI.Mem.snrOption.tea = vl; + GameUI.setNumberImage(3099, vl, 18); + GameUI.adaptPositionX(3099, get_self(3097, 18, 0, 0, 0) + get_self(3097, 20, 0, 0, 0) / 2); + var rCount = vl + GameUI.Mem.snrOption.sysRebate; + set_self(3098, 7, "系统收取: "+GameUI.Mem.snrOption.sysRebate+"\n您加收: "+vl+"\n合计: "+rCount); + } + //关闭高级选项 + GameUI.closeSeniorOptions = function() { + //if(GameUI.Mem.snrOption.roomcode_string.length !=6 && GameUI.Mem.snrOption.roomcode_string.length != 0){ + //GameUI.OpenTips("房间号必须为6位或为空!"); + //return; + //} + //GameData.snrOption.profit = GameUI.Mem.snrOption.number; + //GameData.snrOption.roomcode = GameUI.Mem.snrOption.roomcode_string; + set_group(83, 37, 0, 0, 0); + if (Game_Modify.onCloseVip) { + Game_Modify.onCloseVip(); + } + + + } + //高级选项mouseup事件 + GameUI.seniorOptionsSlideEnd = function(gameid, spid_down, downx, downy, spid_up, upx, upy, timelong, no1, no2) { + var position = get_self(597, 18, 0, 0, 0) - GameUI.Mem.snrOption.start_x; + var new_position = GameUI.Mem.snrOption.start_x + Math.round(position / GameUI.Mem.snrOption.unit_px) * GameUI.Mem.snrOption.unit_px; + if (new_position < GameUI.Mem.snrOption.start_x) { + new_position = GameUI.Mem.snrOption.start_x; + } + if (new_position > GameUI.Mem.snrOption.end_x) { + new_position = GameUI.Mem.snrOption.end_x; + } + new_position < GameUI.Mem.snrOption.start_x ? new_position = GameUI.Mem.snrOption.start_x : (new_position > GameUI.Mem.snrOption.end_x ? new_position = GameUI.Mem.snrOption.end_x : true); + + set_self(597, 18, new_position, 0, 0); + set_self(593, 18, get_self(597, 18, 0, 0, 0) + 35 - get_self(593, 20, 0, 0, 0) / 2, 0, 0); + + } + //高级选项滑动 + GameUI.seniorOptionsSlide = function(gameid, spid, downx, downy, movex, movey, timelong, offmovex, offmovey, no1) { + var position = get_self(spid, 18, 0, 0, 0) + offmovex; + if (position >= GameUI.Mem.snrOption.start_x && position <= GameUI.Mem.snrOption.end_x) { + //if(position+offmovex){ + set_self(spid, 18, offmovex, 1, 0); + var count = Math.round((get_self(597, 18, 0, 0, 0) - GameUI.Mem.snrOption.start_x) / GameUI.Mem.snrOption.unit_px); + count < 0 ? count = 0 : (count > GameUI.Mem.snrOption.count ? count = GameUI.Mem.snrOption.count : true); + var _value = Number(count * GameUI.Mem.snrOption.unit) + Number(GameUI.Mem.snrOption.min); + GameUI.Mem.snrOption.number = _value; + _value > GameUI.Mem.snrOption.max ? _value = GameUI.Mem.snrOption.max : true; + set_self(593, 20, String(_value).length * GameUI.Mem.snrOption.number_1, 0, 0); + set_self(593, 7, _value, 0, 0); + set_self(593, 18, get_self(597, 18, 0, 0, 0) + 35 - String(_value).length * GameUI.Mem.snrOption.number_1 / 2, 0, 0); + //} + } + } + //创建高级选项房间列表 + GameUI.createSnrOptionRoomList = function() { + var roomInfo = ""; + var tea = 0; + if (GameData.snrRoomList.roomtype) { + roomInfo = Game_Modify.getFullRoomInfo(GameData.snrRoomList.roomtype); + } + if (GameData.snrRoomList.tea) { + tea = GameData.snrRoomList.tea; + } + var bg_width = get_self(ConstVal.snrRoomList.bg_spid, 20, 0, 0); + var bg_height = get_self(ConstVal.snrRoomList.bg_spid, 21, 0, 0); + var space = bg_height + ConstVal.snrRoomList.bg_space; + set_self(ConstVal.snrRoomList.f_spid, 18, ConstVal.snrRoomList.clip_x, 0, 0); + set_self(ConstVal.snrRoomList.f_spid, 19, ConstVal.snrRoomList.clip_y, 0, 0); + //set_self(ConstVal.snrRoomList.f_spid,20,GameData.snrRoomList.roomlist.length*space,0,0); + //set_self(ConstVal.snrRoomList.f_spid,21,ConstVal.snrRoomList.clip_h,0,0); + + + set_self(ConstVal.snrRoomList.f_spid, 20, ConstVal.snrRoomList.clip_w, 0, 0); + set_self(ConstVal.snrRoomList.f_spid, 21, GameData.snrRoomList.roomlist.length * space, 0, 0); + + for (var i = 0; i < GameData.snrRoomList.roomlist.length; i++) { + //背景 + var bg = ifast_addtospritefromspritecopy(ConstVal.snrRoomList.f_spid, ConstVal.snrRoomList.bg_spid, ConstVal.snrRoomList.bg_x, ConstVal.snrRoomList.bg_y + i * space, i + ConstVal.snrRoomList.bg_tag); + + + //房号 + var rcode = ifast_addtospritefromspritecopy(ConstVal.snrRoomList.f_spid, ConstVal.snrRoomList.rcode_spid, ConstVal.snrRoomList.rcode_x, ConstVal.snrRoomList.rcode_y + i * space, i + ConstVal.snrRoomList.rcode_tag); + //set_self(rcode,20,String(GameData.snrRoomList.roomlist[i]).length*GameUI.Mem.snrOption.number_4,0,0); + //set_self(rcode,18,ConstVal.snrRoomList.bg_x + i*space+(get_self(bg,20,0,0) - get_self(rcode,20,0,0))/2,0,0); + set_self(rcode, 20, String(GameData.snrRoomList.roomlist[i]).length * GameUI.Mem.snrOption.number_4, 0, 0); + set_self(rcode, 7, GameData.snrRoomList.roomlist[i], 0, 0); + //关闭按钮 + //var closeBtn = ifast_addtospritefromspritecopy(ConstVal.snrRoomList.f_spid,ConstVal.snrRoomList.close_spid, + //ConstVal.snrRoomList.close_x + i*space,ConstVal.snrRoomList.close_y,i+ConstVal.snrRoomList.close_tag); + //修改按钮 + //var updateBtn = ifast_addtospritefromspritecopy(ConstVal.snrRoomList.f_spid,ConstVal.snrRoomList.update_spid, + //ConstVal.snrRoomList.update_x + i*space,ConstVal.snrRoomList.update_y,i+ConstVal.snrRoomList.update_tag); + //开关按钮 + //var switchBtn = ifast_addtospritefromspritecopy(ConstVal.snrRoomList.f_spid,ConstVal.snrRoomList.switch_spid, + //ConstVal.snrRoomList.switch_x + i*space,ConstVal.snrRoomList.switch_y,i+ConstVal.snrRoomList.switch_tag); + //if(GameData.snrRoomList[i].state == 0){//开启中 + //set_self(switchBtn,43,2,0,0); + //}else{ + //set_self(switchBtn,43,3,0,0); + //} + //房间信息描述 + var info = ifast_addtospritefromspritecopy(ConstVal.snrRoomList.f_spid, ConstVal.snrRoomList.info_spid, ConstVal.snrRoomList.info_x, ConstVal.snrRoomList.info_y + i * space, i + ConstVal.snrRoomList.info_tag); + var infoText = roomInfo; + set_self(info, 7, infoText, 0, 0, 0); + + // 抽成背景 + //var rcode_bg = ifast_addtospritefromspritecopy(ConstVal.snrRoomList.f_spid,ConstVal.snrRoomList.rcode_bg_spid, + //ConstVal.snrRoomList.rcode_bg_x + i*space,ConstVal.snrRoomList.rcode_bg_y,i+ConstVal.snrRoomList.rcode_bg_tag); + //茶水费 + var profit = ifast_addtospritefromspritecopy(ConstVal.snrRoomList.f_spid, ConstVal.snrRoomList.profit_spid, ConstVal.snrRoomList.profit_x, ConstVal.snrRoomList.profit_y + i * space, i + ConstVal.snrRoomList.profit_tag); + var profigText = "房费:" + tea; + + + if (!GameData.snrRoomList.rebateType) { + profigText += GameData.starName; + } else { + profigText += GameData.sysConfig.charmName; + } + if(GameData.snrRoomList.rebateLimit){ + profigText += " 免收:"+GameData.snrRoomList.rebateLimit; + } + set_self(profit, 7, profigText, 0, 0); + //set_self(profit,18,get_self(bg,18,0,0,0)+get_self(bg,20,0,0,0)/2-profigText.gblen()*ConstVal.snrRoomList.profit_w/2,0,0); + //视频房标志 + if (GameData.snrRoomList.videoConfig) { + var info = ifast_addtospritefromspritecopy(ConstVal.snrRoomList.f_spid, ConstVal.snrRoomList.video_spid, ConstVal.snrRoomList.video_x, ConstVal.snrRoomList.video_y + i * space, i + ConstVal.snrRoomList.video_tag); + } + } + GameData.snrOptionLength = GameData.snrRoomList.roomlist.length; + } + //清除高级选项房间列表 + GameUI.clearSnrOptionRoomList = function() { + for (var i = 0; i < GameData.snrOptionLength; i++) { + //背景 + ifast_dllpritefromspritecopy(ConstVal.snrRoomList.f_spid, ConstVal.snrRoomList.bg_tag + i); + //房号 + ifast_dllpritefromspritecopy(ConstVal.snrRoomList.f_spid, ConstVal.snrRoomList.rcode_tag + i); + //房间信息描述 + ifast_dllpritefromspritecopy(ConstVal.snrRoomList.f_spid, ConstVal.snrRoomList.info_tag + i); + //关闭按钮 + ifast_dllpritefromspritecopy(ConstVal.snrRoomList.f_spid, ConstVal.snrRoomList.close_tag + i); + //抽成背景 + ifast_dllpritefromspritecopy(ConstVal.snrRoomList.f_spid, ConstVal.snrRoomList.rcode_bg_tag + i); + //抽成 + ifast_dllpritefromspritecopy(ConstVal.snrRoomList.f_spid, ConstVal.snrRoomList.profit_tag + i); + //视频房标志 + ifast_dllpritefromspritecopy(ConstVal.snrRoomList.f_spid, ConstVal.snrRoomList.video_tag + i); + } + GameData.snrOptionLength = 0; + } + //根据值更新滑动块位置 + GameUI.updateSnrSlider = function(value) { + set_self(597, 18, GameUI.Mem.snrOption.start_x + ((GameData.snrOption.max - GameUI.Mem.snrOption.min) / value) * GameUI.Mem.snrOption.slider, 0, 0); + } + //更新高级选项界面 + GameUI.updateSnrOption = function() { + GameData.snrOption.profit < GameUI.Mem.snrOption.min ? GameData.snrOption.profit = GameUI.Mem.snrOption.min : (GameData.snrOption.profit > GameUI.Mem.snrOption.max ? GameData.snrOption.profit = GameUI.Mem.snrOption.max : true); + GameUI.Mem.snrOption.slider = get_self(597, 20, 0, 0, 0); + GameUI.Mem.snrOption.start_x = get_self(596, 18, 0, 0, 0); + GameUI.Mem.snrOption.end_x = get_self(596, 20, 0, 0, 0) + GameUI.Mem.snrOption.start_x - GameUI.Mem.snrOption.slider; + GameUI.Mem.snrOption.unit_px = (get_self(596, 20, 0, 0, 0) - GameUI.Mem.snrOption.slider) / ((GameUI.Mem.snrOption.max - GameUI.Mem.snrOption.min) / GameUI.Mem.snrOption.unit); + GameUI.Mem.snrOption.count = Math.round((GameUI.Mem.snrOption.end_x - GameUI.Mem.snrOption.start_x) / GameUI.Mem.snrOption.unit_px); + set_self(597, 18, GameUI.Mem.snrOption.start_x + ((GameData.snrOption.profit - GameUI.Mem.snrOption.min) / GameUI.Mem.snrOption.unit) * GameUI.Mem.snrOption.unit_px, 0, 0); + + set_self(593, 20, GameUI.Mem.snrOption.number_1 * String(GameData.snrOption.profit).length, 0, 0); + set_self(593, 7, GameData.snrOption.profit, 0, 0); + + set_self(594, 20, GameUI.Mem.snrOption.number_2 * String(GameUI.Mem.snrOption.min).length, 0, 0); + set_self(594, 7, GameUI.Mem.snrOption.min, 0, 0); + set_self(594, 18, GameUI.Mem.snrOption.start_x - get_self(594, 20, 0, 0, 0) - 10, 0, 0); + + set_self(595, 20, GameUI.Mem.snrOption.number_2 * String(GameUI.Mem.snrOption.max).length, 0, 0); + set_self(595, 7, GameUI.Mem.snrOption.max, 0, 0); + + + GameUI.Mem.snrOption.roomcode_string = String(GameData.snrOption.roomcode); + //GameUI.Mem.snrOption.roomcode_number = Number(GameData.snrOption.roomcode); + + + + GameUI.Mem.snrOption.number = GameData.snrOption.profit; + } + //打开排行榜 + GameUI.openRankList = function(temp) { + GameData.rankType = temp; + if(GameData.rankType){ + set_self(3234,43,1,0,0); + }else{ + set_self(3234,43,2,0,0); + } + GameUI.closePallet(); + if (GameData.rankList.length == 0) { + return; + } else { + GameData.rankListTag = 0; + } + set_self(639, 43, GameData.nameImgFrame_2, 0, 0); + for (var i = 0; i < GameData.rankList.length; i++) { + Func.up_imgurl(ConstVal.rankList.headsrc + i, GameData.rankList[i].headimg); + } + if(!GameData.rankType){ + if (GameData.ownerNote && GameData.hallConfig.isReSetOwnerNote) { + GameData.rankList[0].signature = GameData.ownerNote; + } + } + if (GameData.rankList[GameData.rankListTag].signature) { + set_self(641, 7, "个性签名:\n"+GameData.rankList[GameData.rankListTag].signature,0,0); + //set_self(640, 7, GameData.rankList[GameData.rankListTag].signature, 0, 0); + } else { + set_self(641, 7, "个性签名:"); + //set_self(640, 7, "", 0, 0); + } + if(GameData.rankType){ + var rText = "公告:\n"; + if (GameData.rankList[GameData.rankListTag].destwo){ + rText += "("+GameData.rankList[GameData.rankListTag].destwo+")\n"; + } + if(GameData.rankList[GameData.rankListTag].notice){ + rText += GameData.rankList[GameData.rankListTag].notice + } + set_self(640, 7,rText,0,0); + /* + if (GameData.rankList[GameData.rankListTag].destwo) { + set_self(640, 7, "公告:\n\n("+GameData.rankList[GameData.rankListTag].destwo+")\n"+GameData.rankList[GameData.rankListTag].notice,0,0); + //set_self(640, 7, GameData.rankList[GameData.rankListTag].signature, 0, 0); + } else { + set_self(640, 7, "公告:",0,0); + //set_self(640, 7, "", 0, 0); + }*/ + + }else{ + set_self(640, 7, "",0,0); + } + + set_self(634, 1, ConstVal.rankList.headsrc + GameData.rankListTag, 0, 0); + set_self(636, 7, GameData.rankList[GameData.rankListTag].name, 0, 0); + set_self(637, 7, "ID:" + GameData.rankList[GameData.rankListTag].playerid, 0, 0); + set_self(638, 7, GameData.rankList[GameData.rankListTag].star, 0, 0); + + set_group(84, 37, 1, 0, 0); + + GameUI.createRankList(); + } + //关闭排行榜 + GameUI.closeRankList = function() { + set_group(84, 37, 0, 0, 0); + } + //创建排行榜 + GameUI.createRankList = function() { + GameUI.removeRankList(); + set_self(ConstVal.rankList.f_spid, 19, ConstVal.rankList.clip_y, 0, 0); + var rankLengthTemp = GameData.rankList.length; + var space = get_self(ConstVal.rankList.bg_spid, 21, 0, 0, 0) + ConstVal.rankList.space; + set_self(ConstVal.rankList.f_spid, 21, space * rankLengthTemp, 0, 0); + for (var i = 0; i < rankLengthTemp; i++) { + //背景 + var bg = ifast_addtospritefromspritecopy(ConstVal.rankList.f_spid, ConstVal.rankList.bg_spid, ConstVal.rankList.bg_x, ConstVal.rankList.bg_y + i * space + ConstVal.rankList.space, i + ConstVal.rankList.bg_tag); + switch (i) { + case 0: + //徽章 + var badge = ifast_addtospritefromspritecopy(ConstVal.rankList.f_spid, ConstVal.rankList.badge_spid, ConstVal.rankList.badge_x, ConstVal.rankList.badge_y + i * space + ConstVal.rankList.space, i + ConstVal.rankList.badge_tag); + set_self(badge, 43, 1, 0, 0, 0); + break; + case 1: + //徽章 + var badge = ifast_addtospritefromspritecopy(ConstVal.rankList.f_spid, ConstVal.rankList.badge_spid, ConstVal.rankList.badge_x, ConstVal.rankList.badge_y + i * space + ConstVal.rankList.space, i + ConstVal.rankList.badge_tag); + set_self(badge, 43, 2, 0, 0, 0); + break; + case 2: + //徽章 + var badge = ifast_addtospritefromspritecopy(ConstVal.rankList.f_spid, ConstVal.rankList.badge_spid, ConstVal.rankList.badge_x, ConstVal.rankList.badge_y + i * space + ConstVal.rankList.space, i + ConstVal.rankList.badge_tag); + set_self(badge, 43, 3, 0, 0, 0); + break; + default: + break; + } + //头像 + var headimg = ifast_addtospritefromspritecopy(ConstVal.rankList.f_spid, ConstVal.rankList.headimg_spid, ConstVal.rankList.headimg_x, ConstVal.rankList.headimg_y + i * space + ConstVal.rankList.space, i + ConstVal.rankList.headimg_tag); + set_self(headimg, 1, ConstVal.rankList.headsrc + i, 0, 0); + //头像框 + var headfront = ifast_addtospritefromspritecopy(ConstVal.rankList.f_spid, ConstVal.rankList.headfront_spid, ConstVal.rankList.headfront_x, ConstVal.rankList.headfront_y + i * space + ConstVal.rankList.space, i + ConstVal.rankList.headfront_tag); + //昵称 + var name = ifast_addtospritefromspritecopy(ConstVal.rankList.f_spid, ConstVal.rankList.name_spid, ConstVal.rankList.name_x, ConstVal.rankList.name_y + i * space + ConstVal.rankList.space, i + ConstVal.rankList.name_tag); + //星星数 + if(!GameData.rankType){ + set_self(name, 7, GameData.rankList[i].name, 0, 0, 0); + }else{ + set_self(name, 7, "VIP房号:"+GameData.rankList[i].shortcode, 0, 0, 0); + } + var star = ifast_addtospritefromspritecopy(ConstVal.rankList.f_spid, ConstVal.rankList.star_spid, ConstVal.rankList.star_x, ConstVal.rankList.star_y + i * space + ConstVal.rankList.space, i + ConstVal.rankList.star_tag); + //if(!GameData.rankType){ + set_self(star, 7, GameData.starName + ":" + GameData.rankList[i].star, 0, 0, 0); + //}else{ + // var dtxt = "公告:" + GameData.rankList[i].destwo; + // set_self(star, 7,Func.subString(dtxt,20,true), 0, 0, 0); + //} + } + GameData.ranListLength = rankLengthTemp; + set_self(ConstVal.rankList.f_spid, 20, get_self(ConstVal.rankList.bg_spid, 20, 0, 0), 0, 0); + + } + //删除排行榜 + GameUI.removeRankList = function() { + for (var i = 0; i < GameData.ranListLength; i++) { + //背景 + ifast_dllpritefromspritecopy(ConstVal.rankList.f_spid, ConstVal.rankList.bg_tag + i); + //徽章 + ifast_dllpritefromspritecopy(ConstVal.rankList.f_spid, ConstVal.rankList.badge_tag + i); + //头像 + ifast_dllpritefromspritecopy(ConstVal.rankList.f_spid, ConstVal.rankList.headimg_tag + i); + //头像框 + ifast_dllpritefromspritecopy(ConstVal.rankList.f_spid, ConstVal.rankList.headfront_tag + i); + //昵称 + ifast_dllpritefromspritecopy(ConstVal.rankList.f_spid, ConstVal.rankList.name_tag + i); + //星星 + ifast_dllpritefromspritecopy(ConstVal.rankList.f_spid, ConstVal.rankList.star_tag + i); + } + GameData.ranListLength = 0; + } + //点击排行榜 + GameUI.clickRankList = function(tag) { + GameData.rankListTag = tag; + set_self(634, 1, ConstVal.rankList.headsrc + GameData.rankListTag, 0, 0); + set_self(636, 7, GameData.rankList[GameData.rankListTag].name, 0, 0); + set_self(637, 7, "ID:" + GameData.rankList[GameData.rankListTag].playerid, 0, 0); + set_self(638, 7, GameData.rankList[GameData.rankListTag].star, 0, 0); + /*if (GameData.rankList[GameData.rankListTag].signature) { + set_self(641,7,"个性签名:"); + set_self(640, 7, GameData.rankList[GameData.rankListTag].signature, 0, 0); + } else { + set_self(641,7,""); + set_self(640, 7, "", 0, 0); + }*/ + if (GameData.rankList[GameData.rankListTag].signature) { + set_self(641, 7, "个性签名:\n"+GameData.rankList[GameData.rankListTag].signature,0,0); + //set_self(640, 7, GameData.rankList[GameData.rankListTag].signature, 0, 0); + } else { + set_self(641, 7, "个性签名:"); + //set_self(640, 7, "", 0, 0); + } + if(GameData.rankType){ + var rText = "公告:\n"; + if (GameData.rankList[GameData.rankListTag].destwo){ + rText += "("+GameData.rankList[GameData.rankListTag].destwo+")\n"; + } + if(GameData.rankList[GameData.rankListTag].notice){ + rText += GameData.rankList[GameData.rankListTag].notice + } + set_self(640, 7, rText,0,0); + /* + if (GameData.rankList[GameData.rankListTag].destwo) { + set_self(640, 7, "公告:\n\n("+GameData.rankList[GameData.rankListTag].destwo+")\n"+GameData.rankList[GameData.rankListTag].notice,0,0); + //set_self(640, 7, GameData.rankList[GameData.rankListTag].signature, 0, 0); + } else { + set_self(640, 7, "公告:",0,0); + //set_self(640, 7, "", 0, 0); + }*/ + }else{ + set_self(640, 7, "",0,0); + } + } + //打开分享引导 + GameUI.openShareImg = function() { + set_group(85, 37, 1, 0, 0); + } + //关闭分享引导 + GameUI.closeShareImg = function() { + set_group(85, 37, 0, 0, 0); + } +GameUI.SetImg = function(base64) { + set_group(86, 37, 1, 0, 0); + //var div_game = window.document.getElementById("div_game"); + var dH = window.innerHeight * ConstVal.screenShotParam; + var dW = window.innerWidth * ConstVal.screenShotParam; + if (dH > dW) { + var dh = dH; + dH = dW; + dW = dh; + } + + var div_result = window.document.getElementById("div_result"); + //div_result.style.transform = 'rotate(90deg)'; + //div_result.style.transformOrigin = '0 0 0'; + div_result.style.display = "block"; + // div_result.setAttribute("class", "div_result_show_css"); + div_result.className = "div_result_show_css"; + div_result.style.width = dW + "px"; + div_result.style.height = dH + "px"; + //div_result.style.width = dH + "px"; + //div_result.style.height = dW + "px"; + + //var topNum = parseInt((dH - dW)/2); + //div_result.style.top = topNum + "px"; + //div_result.style.left = "0px"; + + var div_img = document.getElementById("div_img"); + //div_img.style.width = (dW - 8) + "px"; + //div_img.style.height = (dW - 8 ) + "px"; + div_img.style.width = dW + "px"; + div_img.style.height = dH + "px"; + //div_img.style.width = dH + "px"; + //div_img.style.height = dW + "px"; + + var div_text = document.getElementById("div_text"); + div_text.style.width = dW + "px"; + div_text.style.height = "30px"; + div_text.style.top = div_img.style.height + "px"; + div_img.style.height = (parseInt(dH * 0.7) - 48) + "px"; + //div_img.style.height = (parseInt(dW * 0.7) - 48) + "px"; + + var obj = document.getElementById("img1"); + obj.setAttribute("src", base64); //把图片修改为目标路径 + obj.style.width = dW + "px"; + obj.style.height = dH + "px"; + //obj.style.width = dH + "px"; + //obj.style.height = dW + "px"; + + +} + +GameUI.HideImg = function() { + var div_result = window.document.getElementById("div_result"); + div_result.style.display = "none"; + set_group(86, 37, 0, 0, 0); +} +GameUI.screenShot = function(spidList) { + //if(yyy==1){return;} + //yyy=1; + //var canvas1 = document.createElement("canvas"); + //canvas1.width=1280; + //canvas1.height=720; + //var g=canvas1.getContext("2d"); + //g.drawImage(iui.canvas,0,0,canvas1.width,canvas1.height); + //var dataurl=canvas1.toDataURL("image/jpeg",0.7); + //GameUI.SetImg(dataurl); + + //GameData.screenShotStage=1; + if (spidList) { + GameData.screenShotSpidList = spidList; + } else { + spidList = []; + } + + for (var i = 0; i < GameData.screenShotSpidList.length; i++) { + set_self(GameData.screenShotSpidList[i], 37, 0, 0, 0); + } + for (var i = 0; i < 10; i++) { + set_self(376 + i, 37, 0, 0, 0); + } + var w, h; + w = iui.backBuffer.width; + h = iui.backBuffer.height; + + // iui.backBuffer=null; + + iui.backBuffer.height = 0; + iui.backBuffer.width = 0; + iui.backBuffer = null; + iui.backBuffer = document.createElement('canvas'); + iui.backBufferContext2D = iui.backBuffer.getContext('2d'); + gameabc_face.dc = iui.backBufferContext2D; + iui.backBuffer.width = w; + iui.backBuffer.height = h; + GameData.screenShotStage = 1; + + + +} +GameUI.gameenddraw = function(gameid, spid, times, timelong) { + //更新完成代码 + + switch (GameData.screenShotStage) { + case 1: + //console.log("screenShotStage"); + GameData.screenShotStage = 0; + var imageData = iui.backBuffer.toDataURL("image/jpeg", ConstVal.screenShotParam); + for (var i = 0; i < GameData.screenShotSpidList.length; i++) { + set_self(GameData.screenShotSpidList[i], 37, 1, 0, 0); + } + GameUI.SetImg(imageData); + + GameData.screenShotSpidList = []; + break; + } + +}; +GameUI.adaptWidthNumber = function(spid, text, width) { + set_self(spid, 20, String(text).length * width, 0, 0); +} +GameUI.adaptPositionX = function(spid, adpX) { + set_self(spid, 18, adpX - get_self(spid, 20, 0, 0, 0) / 2, 0, 0); +} +GameUI.adaptPositionSpid = function(spid, adpSpid) { + set_self(spid, 18, get_self(adpSpid, 18, 0, 0, 0) + get_self(adpSpid, 20, 0, 0, 0) / 2 - get_self(spid, 20, 0, 0, 0) / 2, 0, 0); +} +GameUI.setNumberImage = function(spid, text, width) { + set_self(spid, 7, text, 0, 0); + set_self(spid, 20, String(text).length * width, 0, 0); +} +//打开数字输入面板 +GameUI.openInputPanel = function(_msg, _callback,begin0) { + if (_callback) { + GameData.inputCallBack = _callback; + } + if(begin0){ + GameData.begin0 = true; + }else{ + GameData.begin0 = false; + } + if(GameData.begin0){ + GameData.inputPanelData = ""; + }else{ + GameData.inputPanelData = "0"; + } + set_self(3001, 7, _msg, 0, 0); + set_self(3001, 20, String(_msg).gblen() * 26, 0, 0); + GameUI.adaptPositionSpid(3001, 659); + GameUI.setNumberImage(3003, GameData.inputPanelData, 51); + GameUI.adaptPositionSpid(3003, 3002); + set_group(87, 37, 1, 0, 0); +} +//关闭数字输入面板 + +GameUI.closeInputPanel = function() { + set_group(87, 37, 0, 0, 0); +} +GameUI.inputPanel = function(spid) { + if (spid >= 661 && spid <= 670) { //数字输入 + if (GameData.inputPanelData.length > 17) { + GameUI.OpenTips("输入超出范围", ConstVal.Tips.time); + return; + } + if(!GameData.begin0){ + if (GameData.inputPanelData == "0") { // + GameData.inputPanelData = String(spid - 661); + GameUI.setNumberImage(3003, GameData.inputPanelData, 51); + GameUI.adaptPositionSpid(3003, 3002); + } else { + GameData.inputPanelData += String(spid - 661); + GameUI.setNumberImage(3003, GameData.inputPanelData, 51); + GameUI.adaptPositionSpid(3003, 3002); + } + }else{ + GameData.inputPanelData += String(spid - 661); + GameUI.setNumberImage(3003, GameData.inputPanelData, 51); + GameUI.adaptPositionSpid(3003, 3002); + } + } + if (spid == 671) { //删除 + if (GameData.inputPanelData.length == 1) { + if(GameData.begin0){ + GameData.inputPanelData = ""; + }else{ + GameData.inputPanelData = "0"; + } + } else { + GameData.inputPanelData = GameData.inputPanelData.substring(0, GameData.inputPanelData.length - 1); + } + GameUI.setNumberImage(3003, GameData.inputPanelData, 51); + GameUI.adaptPositionSpid(3003, 3002); + } + if (spid == 3000) { //确定 + //console.log(Number(GameData.inputPanelData)); + //GameUI.closeInputPanel(); + if(GameData.begin0){ + Game_Modify.onCheckInput(GameData.inputPanelData); + }else{ + Game_Modify.onCheckInput(Number(GameData.inputPanelData)); + } + if(GameData.begin0){ + if (GameData.inputCallBack) { + GameData.inputCallBack(GameData.inputPanelData); + } + }else{ + if (GameData.inputCallBack) { + GameData.inputCallBack(Number(GameData.inputPanelData)); + } + } + + + } +} +GameUI.showNeighbor = function() { + set_group(88, 37, 1, 0, 0); +} +GameUI.hideNeighbor = function() { + set_group(88, 37, 0, 0, 0); +} + + +GameUI.updateInsertHTML = function() { + //Logic.getHTML(); + return; + //if(!GameData.hallConfig.activity){ + //return; + //} + if (GameData.htmlId) { + if (get_self(4, 37, 0, 0, 0) == 1) { + var dom = document.getElementById(GameData.htmlId); + if (dom) { + dom.style.display = "block"; + } + } else { + var dom = document.getElementById(GameData.htmlId); + if (dom) { + dom.style.display = "none"; + } + + } + + } +} +GameUI.openTips2 = function(_msg, time) { + try { + //if(GameData.tipTimer2){ + // GameData.tipTimer2 = null; + // clearTimeout(GameData.tipTimer2); + //} + if (time) { + if (time > 0) { + GameData.tipTimer2 = setTimeout("GameUI.closeTips2()", time); + } + } + var gbLength = 14; + var gbHeight = 28; + var spaceX = 40; + var spaceY = 25; + var strArray = _msg.split("\n"); + var max_length = 0; + for (var k = 0; k < strArray.length; k++) { + var lenTemp = strArray[k].gblen(); + if (lenTemp > max_length) { + max_length = lenTemp; + } + } + set_self(3013, 7, _msg, 0, 0); + + set_self(3012, 20, max_length * gbLength + 2 * spaceX, 0, 0); + set_self(3012, 21, strArray.length * gbHeight + 2 * spaceY, 0, 0); + set_self(3012, 18, 640 - get_self(3012, 20, 0, 0, 0) / 2, 0, 0); + set_self(3012, 19, 360 - get_self(3012, 21, 0, 0, 0) / 2, 0, 0); + + set_self(3013, 18, get_self(3012, 18, 0, 0, 0) + spaceX, 0, 0); + set_self(3013, 19, get_self(3012, 19, 0, 0, 0) + spaceY, 0, 0); + set_group(89, 37, 1, 0, 0); + } catch (e) { + + } +} +GameUI.closeTips2 = function() { + //if(GameData.tipTimer2){ + // GameData.tipTimer2 = null; + // clearTimeout(GameData.tipTimer2); + //} + set_group(89, 37, 0, 0, 0); +} +//更新常驻活动按钮 +GameUI.updateActBtn = function() { + if (ConstVal.isGameHall) { + set_self(3018, 37, 0, 0, 0); + return; + } + if (isArray(GameData.hallConfig.actData)) { + if (GameData.hallConfig.actData[0]) { + Func.up_imgurl(253, GameData.hallConfig.actData[0]); + } + set_self(3018, 37, 1, 0, 0); + } else { + set_self(3018, 37, 0, 0, 0); + } +} +//打开保险箱 +GameUI.openWareHouse = function() { + GameData.wareHouse.safeInputCount = -1, //保险箱存入取出数量 + GameData.wareHouse.safePassWord = -1, //保险箱存入取出密码 + GameData.wareHouse.inputNumber = 0, //输入的数字 + GameUI.closePallet(); + var bTemp = C_Player.bankpwd; + set_group(91, 37, 1, 0, 0); + set_self(3031, 37, 0, 0, 0); + GameData.wareHouse.page = 1; + GameUI.showWareHouseTable(); + set_self(3077, 43, Utl.getNameImgFrame_2(), 0, 0); + set_self(3032, 43, Utl.getNameImgFrame_2(), 0, 0); + set_self(3078, 43, Utl.getNameImgFrame_1(), 0, 0); + if (bTemp) { //已绑定 + switch (GameData.hallConfig.wareHouse) { + case 2: + GameData.wareHouse.selectType = 5; + GameData.wareHouse.page = 2; + break; + case 1: + case 3: + case 4: + case 5: + GameData.wareHouse.selectType = 3; + GameData.wareHouse.page = 1; + break; + } + //GameData.wareHouse.selectType = 3; + GameUI.selectWareHouseInputType(GameData.wareHouse.selectType); + GameUI.updateWareHouseCheckBox(); + GameUI.updateWareHouseInput(); + } else { //未绑定 + GameData.wareHouse.selectType = 1; + set_group(93, 37, 1, 0, 0); + GameUI.updateWareHouseInput(); + GameUI.selectWareHouseInputType(GameData.wareHouse.selectType); + } +} +GameUI.closeWareHouse = function() { + set_group(91, 37, 0, 0, 0); + set_group(92, 37, 0, 0, 0); + set_group(93, 37, 0, 0, 0); + set_group(94, 37, 0, 0, 0); +} +//显示仓库标签页 +GameUI.showWareHouseTable = function() { + switch (GameData.hallConfig.wareHouse) { + case 0: + set_self(3059, 37, 0, 0, 0); + set_self(3060, 37, 0, 0, 0); + set_self(3061, 37, 0, 0, 0); + set_self(3062, 37, 0, 0, 0); + break; + case 1: + case 2: + set_self(3059, 37, 1, 0, 0); + set_self(3060, 37, 0, 0, 0); + set_self(3061, 37, 1, 0, 0); + set_self(3062, 37, 0, 0, 0); + break; + + case 3: + case 4: + case 5: + GameUI.switchWareHousePage(GameData.wareHouse.page); + set_self(3059, 37, 1, 0, 0); + set_self(3060, 37, 1, 0, 0); + set_self(3061, 37, 1, 0, 0); + set_self(3062, 37, 1, 0, 0); + set_self(3081,1,170,0,0); + set_self(3082,7,'',0,0); + set_self(3083,7,'',0,0); + break; + } + switch (GameData.wareHouse.page) { + case 1: + //保险箱 + + set_self(3059, 43, 1, 0, 0); + set_self(3060, 43, 2, 0, 0); + set_self(3061, 43, 1, 0, 0); + set_self(3062, 43, 4, 0, 0); + break; + case 2: + //仓库 + + set_self(3059, 43, 2, 0, 0); + set_self(3060, 43, 1, 0, 0); + set_self(3061, 43, 2, 0, 0); + set_self(3062, 43, 3, 0, 0); + + break; + } +} +//显示初始化密码界面 +GameUI.showInitPassWord = function() { + set_group(93, 37, 1, 0, 0); +} +//切换仓库页 +GameUI.switchWareHousePage = function(page, bTemp) { + var bTemp = C_Player.bankpwd; + GameData.wareHouse.page = page; + switch (page) { + case 1: + //保险箱 + //set_self(3059,18,ConstVal.wareHouse.tableBgX[1],0,0); + //set_self(3060,18,ConstVal.wareHouse.tableBgX[0],0,0); + //set_self(3061,18,ConstVal.wareHouse.tableTextX[1],0,0); + //set_self(3062,18,ConstVal.wareHouse.tableTextX[0],0,0); + + set_self(3059, 43, 1, 0, 0); + set_self(3060, 43, 2, 0, 0); + set_self(3061, 43, 1, 0, 0); + set_self(3062, 43, 4, 0, 0); + if (bTemp) { + GameData.wareHouse.selectType = 3; + //GameUI.updateWareHouseInput(); + } else { + GameData.wareHouse.selectType = 1; + GameUI.showInitPassWord(); + } + GameUI.updateWareHouseInput(bTemp); + GameUI.selectWareHouseInputType(GameData.wareHouse.selectType); + break; + case 2: + //仓库 + //set_self(3059,18,ConstVal.wareHouse.tableBgX[0],0,0); + //set_self(3060,18,ConstVal.wareHouse.tableBgX[1],0,0); + //set_self(3061,18,ConstVal.wareHouse.tableTextX[0],0,0); + //set_self(3062,18,ConstVal.wareHouse.tableTextX[1],0,0); + GameUI.updateWareHousePlayerInfo(); + set_self(3059, 43, 2, 0, 0); + set_self(3060, 43, 1, 0, 0); + set_self(3061, 43, 2, 0, 0); + set_self(3062, 43, 3, 0, 0); + if (bTemp) { + GameData.wareHouse.selectType = 5; + //GameUI.updateWareHouseInput(); + } else { + GameUI.showInitPassWord(); + + } + GameUI.updateWareHouseInput(bTemp); + GameUI.selectWareHouseInputType(GameData.wareHouse.selectType); + break; + } + GameUI.updateWareHouseCheckBox(); +} +//初始化赠送数据 +GameUI.initGiveData = function(){ + GameData.wareHouse.pNickName = ''; + GameData.wareHouse.pId=''; + GameData.wareHouse.pImg=''; + GameData.wareHouse.pInputPassWord=''; + GameData.wareHouse.pInputCount = -1; + GameData.wareHouse.pInputId = -1; +} +//更新输入框内容 +GameUI.updateWareHouseInput = function() { + //var bTemp = C_Player.bankpwd; + GameUI.updateCount(); + switch (GameData.wareHouse.selectType) { + case 1: + //初始化密码 + case 2: + set_group(93, 37, 1, 0, 0); + set_group(94, 37, 0, 0, 0); + set_group(92, 37, 0, 0, 0); + if (GameData.wareHouse.initPassWord1 == GameData.wareHouse.initPassWord2) { + if (GameData.wareHouse.initPassWord1 != -1 && String(GameData.wareHouse.initPassWord1).length != 0) { + set_self(3073, 7, "输入符合规则!"); + } else { + set_self(3073, 7, "密码不能为空!"); + set_self(3069, 37, 1, 0, 0); + } + } else { + if (GameData.wareHouse.selectType == 1) { + set_self(3073, 7, "输入密码....."); + } else { + if (GameData.wareHouse.initPassWord2 != -1 || String(GameData.wareHouse.initPassWord2).length == 0) { + set_self(3073, 7, "两次输入不一致!"); + } else { + set_self(3073, 7, "请再次输入密码....."); + } + + } + + + } + if (GameData.wareHouse.initPassWord2 == -1 || String(GameData.wareHouse.initPassWord2).length == 0) { + set_self(3072, 37, 0, 0, 0); + set_self(3070, 37, 1, 0, 0); + } else { + set_self(3072, 37, 1, 0, 0); + set_self(3070, 37, 0, 0, 0); + GameUI.setNumberImage(3072, GameData.wareHouse.initPassWord2, 27); + } + if (GameData.wareHouse.initPassWord1 == -1 || String(GameData.wareHouse.initPassWord1).length == 0) { + set_self(3071, 37, 0, 0, 0); + set_self(3069, 37, 1, 0, 0); + } else { + set_self(3071, 37, 1, 0, 0); + set_self(3069, 37, 0, 0, 0); + GameUI.setNumberImage(3071, GameData.wareHouse.initPassWord1, 27); + } + break; + //case 2://初始化密码二次输入 + + //break; + case 3: + //保险箱数量 + //set_group(93,37,0,0,0); + //break; + case 4: + //保险箱密码 + set_group(94, 37, 0, 0, 0); + set_group(93, 37, 0, 0, 0); + set_group(92, 37, 1, 0, 0); + if (GameData.wareHouse.safeInputCount == -1 || String(GameData.wareHouse.safeInputCount).length == 0) { + set_self(3056, 37, 0, 0, 0); + set_self(3040, 37, 1, 0, 0); + + } else { + set_self(3056, 37, 1, 0, 0); + set_self(3040, 37, 0, 0, 0); + GameUI.setNumberImage(3056, GameData.wareHouse.safeInputCount, 27); + } + if (GameData.wareHouse.safePassWord == -1 || String(GameData.wareHouse.safePassWord).length == 0) { + set_self(3058, 37, 0, 0, 0); + set_self(3041, 37, 1, 0, 0); + } else { + set_self(3058, 37, 1, 0, 0); + set_self(3041, 37, 0, 0, 0); + GameUI.setNumberImage(3058, GameData.wareHouse.safePassWord, 27); + } + break; + case 5: + //玩家id + case 6: + //赠送数量 + case 7: + //密码 + set_group(93, 37, 0, 0, 0); + set_group(92, 37, 0, 0, 0); + set_group(94, 37, 1, 0, 0); + if (GameData.hallConfig.wareHouse == 3) { + set_self(3076, 37, 0, 0, 0); + set_self(3078, 37, 0, 0, 0); + set_self(3080, 37, 0, 0, 0); + } else if (GameData.hallConfig.wareHouse == 4) { + set_self(3075, 37, 0, 0, 0); + set_self(3077, 37, 0, 0, 0); + set_self(3079, 37, 0, 0, 0); + } + if (GameData.wareHouse.pInputId == -1 || String(GameData.wareHouse.pInputId).length == 0) { + set_self(3093, 37, 0, 0, 0); + set_self(3090, 37, 1, 0, 0); + //GameUI.setNumberImage(3079,0,27); + } else { + set_self(3093, 37, 1, 0, 0); + set_self(3090, 37, 0, 0, 0); + GameUI.setNumberImage(3093, GameData.wareHouse.pInputId, 27); + //GameUI.setNumberImage(3079,GameData.wareHouse.pInputId,27); + } + if (GameData.wareHouse.pInputCount == -1 || String(GameData.wareHouse.pInputCount).length == 0) { + set_self(3094, 37, 0, 0, 0); + set_self(3091, 37, 1, 0, 0); + } else { + set_self(3094, 37, 1, 0, 0); + set_self(3091, 37, 0, 0, 0); + GameUI.setNumberImage(3094, GameData.wareHouse.pInputCount, 27); + } + if (GameData.wareHouse.pInputPassWord == -1 || String(GameData.wareHouse.pInputPassWord).length == 0) { + set_self(3095, 37, 0, 0, 0); + set_self(3092, 37, 1, 0, 0); + } else { + set_self(3095, 37, 1, 0, 0); + set_self(3092, 37, 0, 0, 0); + GameUI.setNumberImage(3095, GameData.wareHouse.pInputPassWord, 27); + } + break; + } +} +//更新输入框内容 +GameUI.wareHouseInputNumber = function(type, _input) { + switch (GameData.wareHouse.selectType) { + case 1: + // + switch (type) { + case 1: + if (GameData.wareHouse.initPassWord1 == -1) { + GameData.wareHouse.initPassWord1 = _input; + } else if (String(GameData.wareHouse.initPassWord1).length >= ConstVal.wareHouse.passWordLength) { + GameUI.OpenTips("密码长度为" + ConstVal.wareHouse.passWordLength + "位!", ConstVal.Tips.time); + } else { + GameData.wareHouse.initPassWord1 = String(GameData.wareHouse.initPassWord1) + _input; + } + GameUI.updateWareHouseInput(); + break; + case 2: + if (GameData.wareHouse.initPassWord1 == -1 || String(GameData.wareHouse.initPassWord1).length == 0) { + GameData.wareHouse.initPassWord1 = -1; + } else { + GameData.wareHouse.initPassWord1 = String(GameData.wareHouse.initPassWord1).substring(0, String(GameData.wareHouse.initPassWord1).length - 1); + } + GameUI.updateWareHouseInput(); + break; + case 3: + GameData.wareHouse.initPassWord1 = -1; + GameUI.updateWareHouseInput(); + break; + } + break; + case 2: + // + switch (type) { + case 1: + if (GameData.wareHouse.initPassWord2 == -1) { + GameData.wareHouse.initPassWord2 = _input; + } else if (String(GameData.wareHouse.initPassWord2).length >= ConstVal.wareHouse.passWordLength) { + GameUI.OpenTips("密码长度为" + ConstVal.wareHouse.passWordLength + "位!", ConstVal.Tips.time); + } else { + GameData.wareHouse.initPassWord2 = String(GameData.wareHouse.initPassWord2) + _input; + } + GameUI.updateWareHouseInput(); + break; + case 2: + if (GameData.wareHouse.initPassWord2 == -1 || String(GameData.wareHouse.initPassWord2).length == 0) { + GameData.wareHouse.initPassWord2 = -1; + } else { + GameData.wareHouse.initPassWord2 = String(GameData.wareHouse.initPassWord2).substring(0, String(GameData.wareHouse.initPassWord2).length - 1); + } + GameUI.updateWareHouseInput(); + break; + case 3: + GameData.wareHouse.initPassWord2 = -1; + GameUI.updateWareHouseInput(); + break; + } + break; + + case 3: + //取出存入数量 + switch (type) { + case 1: + if (GameData.wareHouse.safeInputCount == -1) { + if (_input != 0) { + //if(GameUI.checkWareHouseInput(_input,GameData.wareHouse.pInputType,GameData.wareHouse.safeInputType)[0]){ + // GameData.wareHouse.safeInputCount = _input; + //} + var result = GameUI.checkWareHouseInput(_input, 2, GameData.wareHouse.safeInputType); + if (result[0]) { + GameData.wareHouse.safeInputCount = _input; + } else { + GameData.wareHouse.safeInputCount = result[1]; + GameUI.OpenTips("输入超出范围!已调整为最大值", ConstVal.Tips.time); + } + //GameData.wareHouse.safeInputCount = _input; + } + } else { + var cTemp = Number(String(GameData.wareHouse.safeInputCount) + _input); + //if(GameUI.checkWareHouseInput(cTemp,GameData.wareHouse.pInputType,GameData.wareHouse.safeInputType)[0]){ + // GameData.wareHouse.safeInputCount = cTemp; + // } + var result = GameUI.checkWareHouseInput(cTemp, 2, GameData.wareHouse.safeInputType); + if (result[0]) { + GameData.wareHouse.safeInputCount = cTemp; + + + } else { + GameData.wareHouse.safeInputCount = result[1]; + GameUI.OpenTips("输入超出范围!已调整为最大值", ConstVal.Tips.time); + } + } + GameUI.updateWareHouseInput(); + break; + case 2: + if (GameData.wareHouse.safeInputCount == -1 || String(GameData.wareHouse.safeInputCount).length == 1) { + GameData.wareHouse.safeInputCount = -1; + } else { + //if(String(GameData.wareHouse.safeInputCount).length == 1){ + //GameData.wareHouse.safeInputCount = -1; + //}else{ + GameData.wareHouse.safeInputCount = Number(String(GameData.wareHouse.safeInputCount).substring(0, String(GameData.wareHouse.safeInputCount).length - 1)); + //} + + } + GameUI.updateWareHouseInput(); + break; + case 3: + GameData.wareHouse.safeInputCount = -1; + GameUI.updateWareHouseInput(); + break; + } + break; + case 4: + // + switch (type) { + case 1: + if (GameData.wareHouse.safePassWord == -1) { + GameData.wareHouse.safePassWord = _input; + } else if (String(GameData.wareHouse.safePassWord).length >= ConstVal.wareHouse.passWordLength) { + GameUI.OpenTips("密码长度为" + ConstVal.wareHouse.passWordLength + "位!", ConstVal.Tips.time); + } else { + GameData.wareHouse.safePassWord = String(GameData.wareHouse.safePassWord) + _input; + } + GameUI.updateWareHouseInput(); + break; + case 2: + if (GameData.wareHouse.safePassWord == -1 || String(GameData.wareHouse.safePassWord).length == 0) { + GameData.wareHouse.safePassWord = -1; + } else { + GameData.wareHouse.safePassWord = String(GameData.wareHouse.safePassWord).substring(0, String(GameData.wareHouse.safePassWord).length - 1); + } + GameUI.updateWareHouseInput(); + break; + case 3: + GameData.wareHouse.safePassWord = -1; + GameUI.updateWareHouseInput(); + break; + } + break; + case 5: + //id + switch (type) { + case 1: + + if (GameData.wareHouse.pInputId == -1) { + GameData.wareHouse.pInputId = _input; + } else if (String(GameData.wareHouse.pInputId).length >= 6) { + GameUI.OpenTips("玩家id长度为6位!", ConstVal.Tips.time); + } else { + GameData.wareHouse.pInputId = String(GameData.wareHouse.pInputId) + _input; + } + GameUI.updateWareHouseInput(); + break; + case 2: + if (GameData.wareHouse.pInputId == -1 || String(GameData.wareHouse.pInputId).length == 0) { + GameData.wareHouse.pInputId = -1; + } else { + GameData.wareHouse.pInputId = String(GameData.wareHouse.pInputId).substring(0, String(GameData.wareHouse.pInputId).length - 1); + } + GameUI.updateWareHouseInput(); + break; + case 3: + GameData.wareHouse.pInputId = -1; + GameUI.updateWareHouseInput(); + break; + } + break; + case 6: + switch (type) { + case 1: + if (GameData.wareHouse.pInputCount == -1) { + if (_input != 0) { + //GameData.wareHouse.pInputCount = _input; + if (GameUI.checkWareHouseInput(_input, GameData.wareHouse.pInputType, 1)[0]) { + GameData.wareHouse.pInputCount = _input; + } + } + + } else { + var cTemp = Number(String(GameData.wareHouse.pInputCount) + _input); + //验证输入星星合法性 + if(String(cTemp).length> 10){ + GameUI.OpenTips("输入超出限制!",ConstVal.Tips.time); + }else{ + GameData.wareHouse.pInputCount = cTemp; + } + //if (GameUI.checkWareHouseInput(cTemp, GameData.wareHouse.pInputType, 1)[0]) { + // GameData.wareHouse.pInputCount = cTemp; + //} + } + GameUI.updateWareHouseInput(); + break; + case 2: + if (GameData.wareHouse.pInputCount == -1 || String(GameData.wareHouse.pInputCount).length == 1) { + GameData.wareHouse.pInputCount = -1; + } else { + if(String(GameData.wareHouse.pInputCount).length > 10){ + GameUI.OpenTips("输入超出限制!",ConstVal.Tips.time); + }else{ + GameData.wareHouse.pInputCount = Number(String(GameData.wareHouse.pInputCount).substring(0, String(GameData.wareHouse.pInputCount).length - 1)); + } + + } + GameUI.updateWareHouseInput(); + break; + case 3: + GameData.wareHouse.pInputCount = -1; + GameUI.updateWareHouseInput(); + break; + } + break; + case 7: + // + switch (type) { + case 1: + if (GameData.wareHouse.pInputPassWord == -1) { + GameData.wareHouse.pInputPassWord = _input; + } else if (String(GameData.wareHouse.pInputPassWord).length >= ConstVal.wareHouse.passWordLength) { + GameUI.OpenTips("密码长度为" + ConstVal.wareHouse.passWordLength + "位!", ConstVal.Tips.time); + } else { + GameData.wareHouse.pInputPassWord = String(GameData.wareHouse.pInputPassWord) + _input; + } + GameUI.updateWareHouseInput(); + break; + case 2: + if (GameData.wareHouse.pInputPassWord == -1 || String(GameData.wareHouse.pInputPassWord).length == 0) { + GameData.wareHouse.pInputPassWord = -1; + } else { + GameData.wareHouse.pInputPassWord = String(GameData.wareHouse.pInputPassWord).substring(0, String(GameData.wareHouse.pInputPassWord).length - 1); + } + GameUI.updateWareHouseInput(); + break; + case 3: + GameData.wareHouse.pInputPassWord = -1; + GameUI.updateWareHouseInput(); + break; + } + break; + } +} +//点击保险箱存入取出 +GameUI.updateWareHouseCheckBox = function() { + switch (GameData.wareHouse.page) { + case 1: + //第一页 + switch (GameData.wareHouse.safeInputType) { + case 1: + set_self(3034, 43, 2, 0, 0); + set_self(3035, 43, 1, 0, 0); + var r = GameUI.checkWareHouseInput(GameData.wareHouse.safeInputCount, 1, GameData.wareHouse.safeInputType); + if (!r[0]) { + GameData.wareHouse.safeInputCount = r[1]; + GameUI.OpenTips("输入超出,已调整为最大!", ConstVal.Tips.time); + GameUI.updateWareHouseInput(); + } + break; + case 2: + set_self(3035, 43, 2, 0, 0); + set_self(3034, 43, 1, 0, 0); + var r = GameUI.checkWareHouseInput(GameData.wareHouse.safeInputCount, 2, GameData.wareHouse.safeInputType); + if (!r[0]) { + GameData.wareHouse.safeInputCount = r[1]; + GameUI.OpenTips("输入超出,已调整为最大!", ConstVal.Tips.time); + GameUI.updateWareHouseInput(); + } + break; + } + break; + case 2: + //第二页 + switch (GameData.wareHouse.pInputType) { + case 1: + set_self(3075, 43, 2, 0, 0); + set_self(3076, 43, 1, 0, 0); + var r = GameUI.checkWareHouseInput(GameData.wareHouse.pInputCount, 1, 1); + if (!r[0]) { + GameData.wareHouse.pInputCount = r[1]; + GameUI.OpenTips("输入超出,已调整为最大!", ConstVal.Tips.time); + GameUI.updateWareHouseInput(); + } + break; + case 2: + set_self(3075, 43, 1, 0, 0); + set_self(3076, 43, 2, 0, 0); + var r = GameUI.checkWareHouseInput(GameData.wareHouse.pInputCount, 2, 1); + if (!r[0]) { + GameData.wareHouse.pInputCount = r[1]; + GameUI.OpenTips("输入超出,已调整为最大!", ConstVal.Tips.time); + GameUI.updateWareHouseInput(); + } + break; + } + break; + } +} +//选择输入类型 +GameUI.selectWareHouseInputType = function(type) { + GameData.wareHouse.selectType = type; + switch (type) { + case 1: + // + set_self(3067, 43, 2, 0, 0); + set_self(3068, 43, 1, 0, 0); + break; + case 2: + // + set_self(3067, 43, 1, 0, 0); + set_self(3068, 43, 2, 0, 0); + break; + case 3: + // + set_self(3039, 43, 1, 0, 0); + set_self(3038, 43, 2, 0, 0); + break; + case 4: + // + set_self(3039, 43, 2, 0, 0); + set_self(3038, 43, 1, 0, 0); + break; + case 5: + // + set_self(3087, 43, 2, 0, 0); + set_self(3088, 43, 1, 0, 0); + set_self(3089, 43, 1, 0, 0); + break; + case 6: + // + set_self(3087, 43, 1, 0, 0); + set_self(3088, 43, 2, 0, 0); + set_self(3089, 43, 1, 0, 0); + break; + case 7: + // + set_self(3087, 43, 1, 0, 0); + set_self(3088, 43, 1, 0, 0); + set_self(3089, 43, 2, 0, 0); + break; + } + GameUI.updateWareHouseInput(); +} + +//保险箱输入 +GameUI.wareHouseInput = function(spid) { + if (spid >= 3044 && spid <= 3053) { //数字输入 + GameUI.wareHouseInputNumber(1, spid - 3044); + } else if (spid == 3055) { //删除 + GameUI.wareHouseInputNumber(2); + } else if (spid == 3054) { //重输 + GameUI.wareHouseInputNumber(3); + } +} +//检测星星房卡数量合法性 +GameUI.checkWareHouseInput = function(input, type, mode) { //input输入数量 type1房卡2星星,mode与1携带的比较还是仓库2里的比较 + input = Number(input); + //console.log("input:"+input+"type:"+type+"mode:"+mode); + //if(input < 1000){ + //return [true,1000]; + //}else{ + //return [false,1000]; + //} + //if(type == 1){ + //return [true,1000]; + //}else{ + //return [false,1000]; + //} + if (type == 2) { + switch (mode) { + case 2: + if (input > C_Player.wareHouseStarCount) { + return [false, C_Player.wareHouseStarCount]; + } + break; + case 1: + if (input > C_Player.bean) { + if (C_Player.bean < 0) { + return [false, 0]; + } + if (C_Player.bean - GameData.initBean < 0) { + return [false, 0]; + } + return [false, C_Player.bean - GameData.initBean]; + } + break; + } + } + return [true, 1000]; + +} +//更新仓库赠送玩家信息 +GameUI.updateWareHousePlayerInfo = function() { + if (GameData.wareHouse.pNickName) { + set_self(3082, 7, "昵称:" + GameData.wareHouse.pNickName, 0, 0); + } else { + set_self(3082, 7, "", 0, 0); + } + if (GameData.wareHouse.pId) { + set_self(3083, 7, "ID: " + GameData.wareHouse.pId, 0, 0); + } else { + set_self(3083, 7, "", 0, 0); + } + + if(GameData.wareHouse.pImg){ + Func.up_imgurl(336, GameData.wareHouse.pImg); + set_self(3081,1,336,0,0); + }else{ + set_self(3081,1,170,0,0); + } + +} +GameUI.updateCount = function() { + if(GameData.wareHouse.page == 1){ + GameUI.setNumberImage(3033, C_Player.wareHouseStarCount, 27); //仓库库存数量 + GameUI.setNumberImage(3079, C_Player.bean, 27); //携带的星星数量 + GameUI.setNumberImage(3080, C_Player.roomcard, 27); //房卡数量 + }else{ + GameUI.setNumberImage(3033, C_Player.wareHouseStarCount, 27); //仓库库存数量 + GameUI.setNumberImage(3079, C_Player.wareHouseStarCount, 27); //携带的星星数量 + GameUI.setNumberImage(3080, C_Player.roomcard, 27); //房卡数量 + } +} +//开启广告倒计时 +GameUI.startAdCountDown = function() { + set_self(3103, 37, 1, 0, 0); + set_self(3104, 37, 1, 0, 0); + var tt = Math.ceil(GameData.launchWaitTime / 1000); + var ttext = "倒计时" + tt + "s"; + if (GameData.LoadCount == 100) { + ttext += " 跳过"; + } + set_self(3104, 7, ttext, 0, 0); + set_self(3104, 20, ttext.gblen() * 12, 0, 0); + GameUI.adaptPositionSpid(3104, 3103); + GameData.adTimer = setInterval(function() { + GameData.launchWaitTime -= 1000; + if (GameData.launchWaitTime > 0) { + var tt = Math.ceil(GameData.launchWaitTime / 1000); + var ttext = "倒计时" + tt + "s"; + if (GameData.LoadCount == 100) { + ttext += " 跳过"; + } + set_self(3104, 7, ttext, 0, 0); + set_self(3104, 20, ttext.gblen() * 12, 0, 0); + GameUI.adaptPositionSpid(3104, 3103); + GameUI.adaptPositionSpid(3104, 3103); + } else { + set_self(3103, 37, 0, 0, 0); + set_self(3104, 37, 0, 0, 0); + //console.log("倒计时结束"); + if (GameData.adTimer) { + window.clearInterval(GameData.adTimer); + GameData.adTimer = null; + } + } + + }, 1000); +} +GameUI.openMainSceneBtnPanel = function() { + GameUI.closeRoomInfo(); + set_group(99, 37, 1, 0, 0); + //app下载 + if (GameData.h5Version == 1 && Game_Config.Share.appdownload) { + set_self(656, 37, 1, 0, 0); + } else { + set_self(656, 37, 0, 0, 0); + } + //逃跑 + if (C_Player.status == 1 && Desk.playercnt == 2 && Desk.roomMode == 1 && Desk.infinite == 0 && Desk.stage == 0) { + GameUI.showEscape(); + } else { + GameUI.hideEscape(); + } + //换房 + GameUI.showChangeRoom(); + + + + if (GameData.matchId || Desk.infinite) { //解散按钮 + set_self(185, 37, 0, 0, 0); + + } + if (Desk.stage == 1) { + //GameUI.hideExitBtn(); + switch (C_Player.canexit) { + case 1: + //if (C_Player.status == 1) { + //set_self(185, 37, 1, 0, 0); + //} else { + set_self(185, 37, 0, 0, 0); + //} + //if (Desk.infinite == 1 && !Game_Config.sysConfig.vipInfinite) { + //set_self(181, 43, 3, 0, 0); + //set_self(182, 37, 0, 0, 0); + //set_self(181, 18, 520, 0, 0); + //} + //if (GameData.matchId) { //比赛房间 + //set_self(181, 43, 3, 0, 0); + //GameUI.adaptPositionSpid(181, 41); + //set_self(182, 37, 0, 0, 0); + //} + break; + case 0: + GameUI.hideExitBtn(); + //if (C_Player.status == 1) { + set_self(185, 37, 1, 0, 0); + //} else { + //set_self(185, 37, 0, 0, 0); + //} + break; + } + } else { + GameUI.showExitBtn(); + //解散 + if (C_Player.status == 1) { + set_self(185, 37, 1, 0, 0); + } else { + set_self(185, 37, 0, 0, 0); + } + } + if (Desk.infinite == 1) { + GameUI.showExitBtn(); + set_self(185, 37, 0, 0, 0); + } + GameUI.adaptPannelBtn(); + +} +GameUI.adaptPannelBtn = function() { + var spList = [151, 150, 185, 233, 3014, 513, 656]; + var posList = [75, 168, 261, 354, 447, 540, 633]; + //var spList = [235,13,604,3017,483,3018,3057]; + //var posList = [[395,198],[395,325],[395,452],[526,198],[526,325],[526,452],[657,198]]; + var posIndex = 0; + for (var i = 0; i < spList.length; i++) { + if (get_self(spList[i], 37, 0, 0, 0) == 1) { + set_self(spList[i], 18, 0, 0, 0); + set_self(spList[i], 19, posList[posIndex], 0, 0); + posIndex++; + } + } +} +GameUI.playPanelAnimation = function(spidList, posList) { + +} +GameUI.stopPanelAnimation = function(spidList, posList) { + +} +GameUI.closeMainSceneBtnPanel = function() { + set_group(99, 37, 0, 0, 0); +} +GameUI.updateMainSceneBtnPanel = function() { + if (get_self(151, 37, 0, 0, 0)) { //当前开启状态 + GameUI.openMainSceneBtnPanel(); + GameUI.closeMainSceneBtnPanel(); + } +} +GameUI.openRoomInfo = function() { + //- + //Desk.infinite = 1; + //GameData.matchInfo = 111; + //var obj = ifast_getobj(111); + //obj.uidata.LineSpace= 1; + if (get_self(149, 37, 0, 0, 0) == 0) { + set_group(100, 37, 0, 0, 0); + return; + } + GameUI.closeMainSceneBtnPanel(); + set_group(100, 37, 1, 0, 0); + if (GameData.matchInfo) { + set_self(512, 37, 0, 0, 0); + } + //var spaceX1 = 20; + var spaceX2 = 30; + var h1 = 60; + var h2 = 25; + var btspace = 20; + var maxLen = 0; + var desc = Game_Modify.getRoomTopDescAry(Desk.roomtype); + if (!desc) { + desc = []; + } + //if(Desk.shortcode && Game_Config.sysConfig.vipInfinite){ + var rTxt = "房间费"; //GameData.starName; + if (Desk.rebateMode) { + if (!Desk.roomMode && Desk.rebateType) { + rTxt += "(" + GameData.sysConfig.charmName + ")"; + } else { + rTxt += "(" + GameData.starName + ")"; + } + switch (Desk.rebateMode) { + case 1: + rTxt += "大赢家:"; + break; + case 2: + rTxt += "赢家:"; + break; + case 3: + rTxt += "所有人:"; + break; + } + + } + if (Desk.rebateNumber) { + //var mult = Game_Modify.getMult(Desk.roomtype,0); + //var txt = Logic.getRebateDes(mult); + desc.push(rTxt + Desk.rebateNumber); + } + + var text = ""; + for (var i = 0; i < desc.length; i++) { + if (String(desc[i]).gblen() > maxLen) { + maxLen = String(desc[i]).gblen(); + } + text += "● " + desc[i] + "\n"; + } + maxLen += 2; + var rmText = "房号:" + Desk.roomcode; + if (Desk.infinite == 1) { + rmText = "系统房"; + set_self(512, 37, 0, 0, 0); + } + if (Desk.shortcode && Game_Config.sysConfig.vipInfinite) { + rmText = "房号:" + Desk.roomcode; + } + if (GameData.matchInfo) { + rmText = "比赛房"; + set_self(512, 37, 0, 0, 0); + } + set_self(110, 7, rmText, 0, 0); + set_self(110, 20, get_self(110, 7, 0, 0, 0).gblen() * 11.5, 0, 0); + + set_self(111, 7, text, 0, 0); + set_self(111, 20, maxLen * 11.5, 0, 0); + //set_self(111,18,get_self(512,18,0,0,0)+spaceX2,0,0); + var bgW = get_self(111, 20, 0, 0) + 2 * spaceX2; + var bkW = 280; + set_self(109, 20, bkW, 0, 0); + if (bgW > bkW) { + set_self(109, 20, bgW, 0, 0); + } + var bgH = h1 + h2 * desc.length + //if(get_self(512,37,0,0,0)){ + //bgH+=get_self(512,21,0,0,0)+2*btspace; + //}else{ + bgH += 2 * btspace; + //} + + set_self(109, 21, bgH, 0, 0); + //set_self(512,19,get_self(109,19,0,0,0)+get_self(109,21,0,0,0) -get_self(512,21,0,0,0)-btspace,0,0); + //设置对齐 + + if (!get_self(512, 37, 0, 0, 0) || Desk.infinite == 1 || GameData.matchInfo) { + GameUI.adaptPositionSpid(110, 109); + + } else { + set_self(110, 18, get_self(109, 18, 0, 0, 0) + spaceX2); + } + //GameUI.adaptPositionSpid(111,109); + //GameUI.adaptPositionSpid(512,109); + set_self(111, 18, get_self(109, 18, 0, 0, 0) + spaceX2); + +} +GameUI.closeRoomInfo = function() { + set_group(100, 37, 0, 0, 0); +} +GameUI.playTopInfoAnimation = function() { + var time = 5000; + if (Desk.infinite == 1) { + return; + } + if (GameData.matchInfo) { + return; + } + //return; + if (GameData.topInfoTimer) { + window.clearInterval(GameData.topInfoTimer); + } + GameData.topInfoTimer = setInterval(function() { + if (get_self(149, 37, 0, 0, 0)) { + if (get_self(155, 37)) { //当前显示时钟 + set_self(154, 37, 0, 0, 0); + set_self(155, 37, 0, 0, 0); + set_self(156, 37, 0, 0, 0); + set_self(336, 37, 0, 0, 0); + set_self(337, 37, 0, 0, 0); + set_self(338, 37, 0, 0, 0); + + set_self(3141, 37, 1, 0, 0); + set_self(3142, 37, 1, 0, 0); + } else { + set_self(154, 37, 1, 0, 0); + set_self(155, 37, 1, 0, 0); + set_self(156, 37, 1, 0, 0); + set_self(336, 37, 1, 0, 0); + set_self(337, 37, 1, 0, 0); + set_self(338, 37, 1, 0, 0); + + set_self(3141, 37, 0, 0, 0); + set_self(3142, 37, 0, 0, 0); + + } + } else { + GameUI.stopTopInfoAnimation(); + } + }, time); +} +GameUI.stopTopInfoAnimation = function(bTemp) { + if (GameData.topInfoTimer) { + window.clearInterval(GameData.topInfoTimer); + } + if (bTemp) { + set_self(154, 37, 0, 0, 0); + set_self(155, 37, 0, 0, 0); + set_self(156, 37, 0, 0, 0); + set_self(336, 37, 0, 0, 0); + set_self(337, 37, 0, 0, 0); + set_self(338, 37, 0, 0, 0); + + set_self(3141, 37, 0, 0, 0); + set_self(3142, 37, 0, 0, 0); + } +} +GameUI.startRecord = function() { + try { + startRecordAac(); + } catch (e) { + + } + + set_group(101, 37, 1, 0, 0); + set_self(3128, 43, 1, 0, 0); + play_ani(1, 3128, 43, 1, 6, 0, 900, 0, 0, 0, 0, 0, 0, 0); +} +GameUI.stopRecord = function() { + try { + stopRecord(); + } catch (e) { + + } + play_ani(0, 3128, 43, 1, 6, 0, 900, 0, 0, 0, 0, 0, 0, 0); + set_group(101, 37, 0, 0, 0); + set_self(3128, 43, 1, 0, 0); + +} +GameUI.openTextInput = function(msg, callback, len) { + if (!len) { + len = 150; + } + GameData.textCallback = callback; + set_group(102, 37, 1, 0, 0); + setTimeout(function() { + try { + var obj = gameabc_face.getdiv("div3154"); + obj.click(); + obj.focus(); + obj.select(); + obj = null; + } catch (e) { + + } + }, 400); + //var obj = gameabc_face.getdiv("div3154"); + //obj.click(); + //obj.focus(); + //obj=null; + //var obj = gameabc_face.getdiv("div3154"); + //obj.style.autofocus = "autofocus"; + Func.setTextArea(3154, true, len); + if (msg) { + set_self(3154, 7, msg, 0, 0); + } else { + set_self(3154, 7, "", 0, 0); + } + set_self(3160, 7, "限制" + len + "字以内"); +} +GameUI.closeTextInput = function() { + var obj = gameabc_face.getdiv("div3154"); + obj.blur(); + obj = null; + set_group(102, 37, 0, 0, 0); +} +//打开vip房间列表 +GameUI.openVipRoomList = function(bTemp) { + set_self(234, 37, 0, 0, 0); + GameData.vipRoomJump = true; + if (!GameData.vipRoomTimer1) { + GameData.vipRoomTimer1 = true; + set_self(4, 57, GameData.sysConfig.vipFlushTime, 0, 0); + } + set_group(103, 37, 1, 0, 0); + var allCharm = Utl.ReadData(Utl.Config.vipCharm); + if(allCharm){ + allCharm = Number(allCharm); + }else{ + allCharm=0; + } + if (C_Player.advanced) { + set_self(3171, 37, 0, 0, 0); + set_self(3170, 37, 0, 0, 0); + //set_self(3197,7,"",0,0); + GameData.allCharm = allCharm; + GameUI.setNumberImage(3197,allCharm,23); + GameUI.adaptPositionSpid(3197,3196); + set_self(3198, 7, "(黑名单内玩家临时禁入房间,请尽快到后台处理好友关系)"); + if (!GameData.sysConfig.managerUrl) { + set_self(3235, 37, 0, 0, 0); + } + } else { + set_self(3183, 37, 0, 0, 0); + set_self(3184, 37, 0, 0, 0); + set_self(3171, 7, GameData.sysConfig.vipWx, 0, 0); + set_self(3194,37,0,0,0); + set_self(3195,37,0,0,0); + set_self(3196,37,0,0,0); + set_self(3197,37,0,0,0); + set_self(3198,37,0,0,0); + set_self(3214,37,0,0,0); + set_self(3215,37,0,0,0); + set_self(3235, 37, 0, 0, 0); + } + if (bTemp) { + GameData.vipRoomPage = 0; + set_self(ConstVal.vipRoomList1.f_spid, 19, ConstVal.vipRoomList1.clip_y, 0, 0); + //set_self(ConstVal.vipRoomList2.f_spid,19,ConstVal.vipRoomList2.clip_y,0,0); + } + GameUI.updateVipRoomList(); + var data = {}; + data.agentid = GameData.AgentId; + data.gameid = GameData.GameId + data.shortcodeList = GameData.vipRoomShortList; + Net.Send_getInfoByShortCode(data); + +} +GameUI.closeVipRoomList = function() { + GameData.vipRoomJump = false; + set_group(103, 37, 0, 0, 0); + set_self(234, 37, 1, 0, 0); +} +//设置vip房间列表数据 +GameUI.setVipRoomListData = function(data) { + //移除已经从列表中删除的房间 + var temp = []; + for (var i = 0; i < GameData.vipRoomShortList.length; i++) { + var indx = min_ary_indexof(data, GameData.vipRoomShortList[i], "shortCode"); + if (indx > -1) { + temp.push(data[indx]); + } + } + GameData.vipRoomData = temp; +} +GameUI.updateVipRoomList = function() { + if (get_self(6, 37, 0, 0, 0)) { + switch (GameData.vipRoomPage) { + case 0: + GameUI.goVipPageOne(); + + break; + case 1: + GameUI.goVipPageTwo(); + break; + } + } +} +GameUI.goVipPageOne = function() { + GameData.vipRoomPage = 0; + set_self(ConstVal.vipRoomList2.f_spid, 37, 0, 0, 0); + set_self(3174, 43, 1, 0, 0); + set_self(3175, 37, 0, 0, 0); + set_self(3199, 37, 0, 0, 0); + set_self(3259, 37, 0, 0, 0); + GameUI.createVipRoomListPageOne(); +} +GameUI.goVipPageTwo = function() { + GameData.vipRoomPage = 1; + set_self(ConstVal.vipRoomList1.f_spid, 37, 0, 0, 0); + set_self(3174, 43, 2, 0, 0); + set_self(3175, 37, 1, 0, 0); + set_self(3199, 37, 1, 0, 0); + //set_self(3259, 37, 1, 0, 0); + //if(){ + + //} + GameUI.createVipRoomListPageTwo(); +} +//创建vip房间列表页一 +GameUI.createVipRoomListPageOne = function() { + set_self(ConstVal.vipRoomList1.f_spid, 37, 1, 0, 0); + if (GameData.vipRoomPageOne.cLength != GameData.vipRoomData.length) { + //set_self(ConstVal.vipRoomList1.f_spid,37,1,0,0); + GameUI.removeVipRoomListPageOne(); + var space = ConstVal.vipRoomList1.space; + set_self(ConstVal.vipRoomList1.f_spid, 18, ConstVal.vipRoomList1.clip_x, 0, 0); + set_self(ConstVal.vipRoomList1.f_spid, 19, ConstVal.vipRoomList1.clip_y, 0, 0); + set_self(ConstVal.vipRoomList1.f_spid, 20, ConstVal.vipRoomList1.clip_w, 0, 0); + set_self(ConstVal.vipRoomList1.f_spid, 21, space * GameData.vipRoomData.length, 0, 0); + for (var i = 0; i < GameData.vipRoomData.length; i++) { + //背景 + var bg = ifast_addtospritefromspritecopy(ConstVal.vipRoomList1.f_spid, ConstVal.vipRoomList1.bg_spid, 0, space * i, ConstVal.vipRoomList1.bg_tag + i); + //标题 + var title = ifast_addtospritefromspritecopy(ConstVal.vipRoomList1.f_spid, ConstVal.vipRoomList1.title_spid, ConstVal.vipRoomList1.title_x, ConstVal.vipRoomList1.title_y + space * i, ConstVal.vipRoomList1.title_tag + i); + var tTxt = "vip房间"; + if (GameData.vipRoomData[i].destwo) { + tTxt = GameData.vipRoomData[i].destwo; + } + set_self(title, 7, tTxt, 0, 0); + var des = ifast_addtospritefromspritecopy(ConstVal.vipRoomList1.f_spid, ConstVal.vipRoomList1.des_spid, ConstVal.vipRoomList1.des_x, ConstVal.vipRoomList1.des_y + space * i, ConstVal.vipRoomList1.des_tag + i); + //描述 + if (GameData.vipRoomData[i].roomcodes) { + var dTxt = ""; + if (GameData.vipRoomData[i].roomcodes) { + dTxt = Game_Modify.getFullRoomInfo(GameData.vipRoomData[i].roomcodes.roomtype); + } + set_self(des, 7, dTxt, 0, 0); + } else { + set_self(des, 7, "房主还未创建房间!", 0, 0); + } + + //房号 + var code = ifast_addtospritefromspritecopy(ConstVal.vipRoomList1.f_spid, ConstVal.vipRoomList1.code_spid, ConstVal.vipRoomList1.code_x, ConstVal.vipRoomList1.code_y + space * i, ConstVal.vipRoomList1.code_tag + i); + var cTxt = GameData.vipRoomData[i].shortCode; + set_self(code, 7, cTxt, 0, 0); + //房主 + var owner = ifast_addtospritefromspritecopy(ConstVal.vipRoomList1.f_spid, ConstVal.vipRoomList1.owner_spid, ConstVal.vipRoomList1.owner_x, ConstVal.vipRoomList1.owner_y + space * i, ConstVal.vipRoomList1.owner_tag + i); + var oTxt = GameData.vipRoomData[i].owner; + set_self(owner, 7, oTxt, 0, 0); + //人数 + var count = ifast_addtospritefromspritecopy(ConstVal.vipRoomList1.f_spid, ConstVal.vipRoomList1.count_spid, ConstVal.vipRoomList1.count_x, ConstVal.vipRoomList1.count_y + space * i, ConstVal.vipRoomList1.count_tag + i); + var coTxt = 0; + for (var j = 0; j < GameData.vipRoomData[i].playerList.length; j++) { + for (var k = 0; k < GameData.vipRoomData[i].playerList[j].length; k++) { + if (GameData.vipRoomData[i].playerList[j][k]) { + coTxt++; + } + } + } + set_self(count, 7, coTxt + " (人)", 0, 0); + //关闭 + //var del = ifast_addtospritefromspritecopy(ConstVal.vipRoomList1.f_spid,ConstVal.vipRoomList1.del_spid, + //ConstVal.vipRoomList1.del_x,ConstVal.vipRoomList1.del_y + space * i,ConstVal.vipRoomList1.del_tag + i); + var enter = ifast_addtospritefromspritecopy(ConstVal.vipRoomList1.f_spid, ConstVal.vipRoomList1.enter_spid, ConstVal.vipRoomList1.enter_x, ConstVal.vipRoomList1.enter_y + space * i, ConstVal.vipRoomList1.enter_tag + i); + + } + GameData.vipRoomPageOne.cLength = GameData.vipRoomData.length; + + } else { + for (var i = 0; i < GameData.vipRoomData.length; i++) { + //背景 + var tag = ConstVal.vipRoomList1.bg_tag + i; + var bg = ConstVal.vipRoomList1.f_spid + "add" + tag; + //标题 + tag = ConstVal.vipRoomList1.title_tag + i; + var title = ConstVal.vipRoomList1.f_spid + "add" + tag; + var tTxt = "vip房间"; + if (GameData.vipRoomData[i].destwo) { + tTxt = GameData.vipRoomData[i].destwo; + } + set_self(title, 7, tTxt, 0, 0); + //描述 + tag = ConstVal.vipRoomList1.des_tag + i; + var des = ConstVal.vipRoomList1.f_spid + "add" + tag; + if (GameData.vipRoomData[i].roomcodes) { + var dTxt = ""; + if (GameData.vipRoomData[i].roomcodes) { + dTxt = Game_Modify.getFullRoomInfo(GameData.vipRoomData[i].roomcodes.roomtype); + } + set_self(des, 7, dTxt, 0, 0); + } else { + set_self(des, 7, "房主还未创建房间!", 0, 0); + } + //房号 + tag = ConstVal.vipRoomList1.code_tag + i; + var code = ConstVal.vipRoomList1.f_spid + "add" + tag; + var cTxt = GameData.vipRoomData[i].shortCode; + set_self(code, 7, cTxt, 0, 0); + //房主 + tag = ConstVal.vipRoomList1.owner_tag + i; + var owner = ConstVal.vipRoomList1.f_spid + "add" + tag; + var oTxt = GameData.vipRoomData[i].owner; + set_self(owner, 7, oTxt, 0, 0); + //人数 + tag = ConstVal.vipRoomList1.count_tag + i; + var count = ConstVal.vipRoomList1.f_spid + "add" + tag; + var coTxt = 0; + for (var j = 0; j < GameData.vipRoomData[i].playerList.length; j++) { + for (var k = 0; k < GameData.vipRoomData[i].playerList[j].length; k++) { + if (GameData.vipRoomData[i].playerList[j][k]) { + coTxt++; + } + } + } + set_self(count, 7, coTxt + " (人)", 0, 0); + + } + } +} +//删除vip房间列表页一 +GameUI.removeVipRoomListPageOne = function() { + for (var i = 0; i < GameData.vipRoomPageOne.cLength; i++) { + ifast_dllpritefromspritecopy(ConstVal.vipRoomList1.f_spid, ConstVal.vipRoomList1.bg_tag + i); + ifast_dllpritefromspritecopy(ConstVal.vipRoomList1.f_spid, ConstVal.vipRoomList1.title_tag + i); + ifast_dllpritefromspritecopy(ConstVal.vipRoomList1.f_spid, ConstVal.vipRoomList1.code_tag + i); + ifast_dllpritefromspritecopy(ConstVal.vipRoomList1.f_spid, ConstVal.vipRoomList1.owner_tag + i); + ifast_dllpritefromspritecopy(ConstVal.vipRoomList1.f_spid, ConstVal.vipRoomList1.count_tag + i); + ifast_dllpritefromspritecopy(ConstVal.vipRoomList1.f_spid, ConstVal.vipRoomList1.del_tag + i); + ifast_dllpritefromspritecopy(ConstVal.vipRoomList1.f_spid, ConstVal.vipRoomList1.des_tag + i); + } + GameData.vipRoomPageOne.cLength = 0; +} +//创建vip房间列表页二 +GameUI.createVipRoomListPageTwo = function() { + var indx = min_ary_indexof(GameData.vipRoomData, GameData.vipRoomCode, "shortCode"); + if (indx > -1) { + set_self(ConstVal.vipRoomList2.f_spid, 37, 1, 0, 0); + var rData = GameData.vipRoomData[indx]; + if (!rData.roomcodes) { + return; + } + GameData.vipRoomPageTwo.data = rData; + set_self(3259, 37, 1, 0, 0); + if(GameData.vipRoomPageTwo.data.forbidSelect){ + set_self(3259, 7, " 比赛模式\n禁止自由选桌", 0, 0); + }else{ + set_self(3259, 7, " 普通模式\n允许自由选桌", 0, 0); + } + // if(GameData.vipRoomPageTwo.cLength != rData.playerList.length){ + if (GameData.vipRoomPageTwo.cLength != rData.roomcodes.roomlist.length) { + //set_self(ConstVal.vipRoomList2.f_spid,37,1,0,0); + GameUI.removeVipRoomListPageOne(); + var spaceX = ConstVal.vipRoomList2.spaceX; + var spaceY = ConstVal.vipRoomList2.spaceY; + set_self(ConstVal.vipRoomList2.f_spid, 18, ConstVal.vipRoomList2.clip_x, 0, 0); + set_self(ConstVal.vipRoomList2.f_spid, 19, ConstVal.vipRoomList2.clip_y, 0, 0); + set_self(ConstVal.vipRoomList2.f_spid, 20, spaceX * 2, 0, 0); + set_self(ConstVal.vipRoomList2.f_spid, 21, spaceY * Math.ceil(rData.playerList.length / 2), 0, 0); + for (var i = 0; i < rData.playerList.length; i++) { + var plx = (i % 2) * spaceX; + var ply = spaceY * Math.floor(i / 2); + //背景 + var bg = ifast_addtospritefromspritecopy(ConstVal.vipRoomList2.f_spid, ConstVal.vipRoomList2.bg_spid, plx, ply, ConstVal.vipRoomList2.bg_tag + i); + if(rData.deskState[i]){ + set_self(bg,43,2,0,0); + }else{ + set_self(bg,43,1,0,0); + } + //桌号 + var code = ifast_addtospritefromspritecopy(ConstVal.vipRoomList2.f_spid, ConstVal.vipRoomList2.code_spid, plx + ConstVal.vipRoomList2.code_x, ply + ConstVal.vipRoomList2.code_y, ConstVal.vipRoomList2.code_tag + i); + //set_self(code, 7, rData.roomcodes.roomlist[i], 0, 0); + var dTag = i + 1; + set_self(code, 7, dTag, 0, 0); + set_self(code, 20, String(dTag).length * 23, 0, 0); + GameUI.adaptPositionSpid(code,bg); + //人数 + var count = ifast_addtospritefromspritecopy(ConstVal.vipRoomList2.f_spid, ConstVal.vipRoomList2.count_spid, plx + ConstVal.vipRoomList2.count_x, ply + ConstVal.vipRoomList2.count_y, ConstVal.vipRoomList2.count_tag + i); + var coTxt = 0; + for (var k = 0; k < rData.playerList[i].length; k++) { + if (rData.playerList[i][k]) { + coTxt++; + } + } + var cTxt = "人数:" + coTxt + "/" + rData.seatCount[i]; + set_self(count, 7, cTxt, 0, 0); + set_self(count, 20, cTxt.gblen() * ConstVal.vipRoomList2.countW, 0, 0); + GameUI.adaptPositionX(count, plx + get_self(ConstVal.vipRoomList2.bg_spid, 20, 0, 0, 0) / 2); + } + GameData.vipRoomPageTwo.cLength = rData.playerList.length; + } else { + for (var i = 0; i < rData.playerList.length; i++) { + var plx = (i % 2) * ConstVal.vipRoomList2.spaceX; + var tag = ConstVal.vipRoomList2.code_tag + i; + var code = ConstVal.vipRoomList2.f_spid + "add" + tag; + set_self(code, 7, rData.roomcodes.roomlist[i], 0, 0); + tag = ConstVal.vipRoomList2.bg_tag + i; + var bg = ConstVal.vipRoomList2.f_spid + "add" + tag; + if(rData.deskState[i]){ + set_self(bg,43,2,0,0); + }else{ + set_self(bg,43,1,0,0); + } + var tag = ConstVal.vipRoomList2.count_tag + i; + var count = ConstVal.vipRoomList2.f_spid + "add" + tag; + var coTxt = 0; + for (var k = 0; k < rData.playerList[i].length; k++) { + if (rData.playerList[i][k]) { + coTxt++; + } + } + var cTxt = "人数:" + coTxt + "/" + rData.seatCount[i]; + set_self(count, 7, cTxt, 0, 0); + set_self(count, 20, cTxt.gblen() * ConstVal.vipRoomList2.countW, 0, 0); + GameUI.adaptPositionX(count, plx + get_self(ConstVal.vipRoomList2.bg_spid, 20, 0, 0, 0) / 2); + + }; + } + } else { + GameUI.removeVipRoomListPageOne(); + } +} +//删除vip房间列表页二 +GameUI.removeVipRoomListPageTwo = function() { + for (var i = 0; i < GameData.vipRoomPageTwo.cLength; i++) { + ifast_dllpritefromspritecopy(ConstVal.vipRoomList2.f_spid, ConstVal.vipRoomList2.bg_tag + i); + ifast_dllpritefromspritecopy(ConstVal.vipRoomList2.f_spid, ConstVal.vipRoomList2.code_tag + i); + ifast_dllpritefromspritecopy(ConstVal.vipRoomList2.f_spid, ConstVal.vipRoomList2.count_tag + i); + } + GameData.vipRoomPageTwo.cLength = 0; +} +var playeridInputCallBack = function(data){ + //if(String(data).length == 6){ + GameData.allCharm = Number(data); + Utl.closeInputPanel(); + GameUI.setNumberImage(3197,data,23); + GameUI.adaptPositionSpid(3197,3196); + //}else{ + //GameUI.OpenTips("玩家id长度为6位!",ConstVal.Tips.time); + //} +} +GameUI.setTextSpid = function(spid,msg,width){ + set_self(spid,7,msg,0,0,0); + set_self(spid,20,String(msg).gblen()*width,0,0,0); + console.log(msg,String(msg).gblen()); +} +GameUI.openBlackList = function(){ + set_group(104,37,1,0,0); + GameData.blackList.inputId = ""; + if(GameData.blackList.inputId){ + //set_self(3212,7,GameData.blackList.inputId,0,0); + GameUI.setTextSpid(3212,GameData.blackList.inputId,GameData.blackList.idWidth); + + }else{ + //set_self(3212,7,"点击输入玩家ID",0,0); + GameUI.setTextSpid(3212,"点击输入玩家ID",GameData.blackList.idWidth); + } + set_self(3261,7,"解散该玩家所在房间(已开战提前解散)",0,0); + //blackInputCallBack(""); + GameUI.adaptPositionSpid(3212,3205); + GameUI.createBlackList(); +} +GameUI.closeBlackList = function(){ + set_group(104,37,0,0,0); +} +var blackInputCallBack = function(data){ + if(String(data).length == 6){ + Utl.closeInputPanel(); + GameData.blackList.inputId = data; + if(GameData.blackList.inputId){ + //set_self(3212,7,GameData.blackList.inputId,0,0); + GameUI.setTextSpid(3212,GameData.blackList.inputId,GameData.blackList.idWidth); + }else{ + //set_self(3212,7,"点击输入玩家ID",0,0); + GameUI.setTextSpid(3212,"点击输入玩家ID",GameData.blackList.idWidth); + } + GameUI.adaptPositionSpid(3212,3205); + }else{ + GameUI.OpenTips("玩家id长度为6位!",ConstVal.Tips.time); + } +} +GameUI.createBlackList = function(){ + GameUI.removeBlackList(); + set_self(ConstVal.blackList.f_spid,18,ConstVal.blackList.clip_x,0,0); + var space = get_self(ConstVal.blackList.bg_spid,21,0,0,0) + ConstVal.blackList.space; + var listLength = GameData.blackList.data.length; + set_self(ConstVal.blackList.f_spid,21,listLength*space,0,0); + for(var i=0;i=29&&spid<=38){//房间号码输入 + if(RoomCode.length<=5){ + + + RoomCode+=String(spid-29); + RoomNum = Number(RoomCode); + } + if(RoomCode.length==6){ + var data={}; + data.agentid = GameData.AgentId; + data.playerid = C_Player.playerid; + data.gameid = GameData.GameId; + data.roomcode = RoomNum; + Net.Send_self_join_room(data); + } + } + if(spid==39){//重输 + RoomNum=-1; + RoomCode=""; + } + if(spid==40){//删除 + RoomCode = RoomCode.substring(0,RoomCode.length-1); + RoomNum = Number(RoomCode); + } + for(var i=0;i<6;i++){ + set_self(236+i,37,0,0,0); + } + for(var i=0;i6){ + _text=String(c_text).substr(0,6); + } + RoomCode = String(_text); + RoomNum = Number(_text); + for(var i=0;i<6;i++){ + set_self(236+i,37,0,0,0); + } + for(var i=0;imax_length){ + max_length = lenTemp; + } + } + GameData.noticePara[1][1] = max_length*ConstVal.Notice.textWidth; + GameData.advertInfo_1.msg = min_replaceAll(advert1_msg,ConstVal.Notice.replaceOldWord,ConstVal.Notice.replaceNewWord,false); + } + var advert1_url = menunotice.advert1.url; + if(advert1_url){ + GameData.advertInfo_1.url = advert1_url; + } + }else{ + GameData.advertInfo_1.imgUrl = menunotice.advert1.imgUrl; + GameData.advertInfo_1.imgAdUrl = menunotice.advert1.imgAdUrl; + GameData.advertInfo_1.height = menunotice.advert1.height; + } + } + if(menunotice.advert2){ + GameData.advertInfo_2.type = menunotice.advert2.type; + if(!menunotice.advert2.type){ + var advert2_msg = menunotice.advert2.msg; + if(advert2_msg){ + GameData.Notice.lineSum = Math.ceil(Func.getKeywordCount(advert2_msg,ConstVal.Notice.replaceOldWord)/2);; + GameData.noticePara[2][0] = GameData.Notice.lineSum*ConstVal.Notice.lineHeight+ConstVal.Notice.textHeight; + var strArray = advert2_msg.split(ConstVal.Notice.replaceOldWord); + var max_length=0; + for(var k=0;kmax_length){ + max_length = lenTemp; + } + } + GameData.noticePara[2][1] = max_length*ConstVal.Notice.textWidth; + GameData.advertInfo_2.msg = min_replaceAll(advert2_msg,ConstVal.Notice.replaceOldWord,ConstVal.Notice.replaceNewWord,false); + } + + var advert2_url = menunotice.advert2.url; + + if(advert2_url){ + GameData.advertInfo_2.url = advert2_url; + } + }else{ + GameData.advertInfo_2.imgUrl = menunotice.advert2.imgUrl; + GameData.advertInfo_2.imgAdUrl = menunotice.advert2.imgAdUrl; + GameData.advertInfo_2.height = menunotice.advert2.height; + } + } + + if(menunotice.advert0){ + GameData.advertInfo_0.type = menunotice.advert0.type; + if(!menunotice.advert0.type){ + var noticemsg = menunotice.advert0.msg; + if(noticemsg){ + GameData.Notice.lineSum = Math.ceil(Func.getKeywordCount(noticemsg,ConstVal.Notice.replaceOldWord)/2); + + GameData.noticePara[0][0] = GameData.Notice.lineSum*ConstVal.Notice.lineHeight+ConstVal.Notice.textHeight; + var strArray = noticemsg.split(ConstVal.Notice.replaceOldWord); + var max_length=0; + for(var k=0;kmax_length){ + max_length = lenTemp; + } + } + + GameData.noticePara[0][1] = max_length*ConstVal.Notice.textWidth; + Game_Config.Setting.board = min_replaceAll(noticemsg,ConstVal.Notice.replaceOldWord,ConstVal.Notice.replaceNewWord,false); + GameData.advertInfo_0.msg = min_replaceAll(noticemsg,ConstVal.Notice.replaceOldWord,ConstVal.Notice.replaceNewWord,false); + var advert0_url = menunotice.advert0.url; + + if(advert0_url){ + GameData.advertInfo_0.url = advert0_url; + } + } + }else{ + GameData.advertInfo_0.imgUrl = menunotice.advert0.imgUrl; + GameData.advertInfo_0.imgAdUrl = menunotice.advert0.imgAdUrl; + GameData.advertInfo_0.height = menunotice.advert0.height; + } + }else{ + var noticemsg = get_paravalue(GameData.serverConfig, "noticemsg"); + if(noticemsg){ + GameData.Notice.lineSum = Math.ceil(Func.getKeywordCount(noticemsg,ConstVal.Notice.replaceOldWord)/2); + + GameData.noticePara[0][0] = GameData.Notice.lineSum*ConstVal.Notice.lineHeight+ConstVal.Notice.textHeight; + var strArray = noticemsg.split(ConstVal.Notice.replaceOldWord); + var max_length=0; + for(var k=0;kmax_length){ + max_length = lenTemp; + } + } + + GameData.noticePara[0][1] = max_length*ConstVal.Notice.textWidth; + Game_Config.Setting.board = min_replaceAll(noticemsg,ConstVal.Notice.replaceOldWord,ConstVal.Notice.replaceNewWord,false); + GameData.advertInfo_0.msg = min_replaceAll(noticemsg,ConstVal.Notice.replaceOldWord,ConstVal.Notice.replaceNewWord,false); + }else{ + GameData.advertInfo_0.msg = ""; + GameData.isBoard=false; + } + } + }else{ + var noticemsg = get_paravalue(GameData.serverConfig, "noticemsg"); + if(noticemsg){ + GameData.Notice.lineSum = Math.ceil(Func.getKeywordCount(noticemsg,ConstVal.Notice.replaceOldWord)/2); + + GameData.noticePara[0][0] = GameData.Notice.lineSum*ConstVal.Notice.lineHeight+ConstVal.Notice.textHeight; + var strArray = noticemsg.split(ConstVal.Notice.replaceOldWord); + var max_length=0; + for(var k=0;kmax_length){ + max_length = lenTemp; + } + } + + GameData.noticePara[0][1] = max_length*ConstVal.Notice.textWidth; + Game_Config.Setting.board = min_replaceAll(noticemsg,ConstVal.Notice.replaceOldWord,ConstVal.Notice.replaceNewWord,false); + GameData.advertInfo_0.msg = min_replaceAll(noticemsg,ConstVal.Notice.replaceOldWord,ConstVal.Notice.replaceNewWord,false); + }else{ + GameData.advertInfo_0.msg = ""; + GameData.isBoard=false; + } + } + +} +Logic.setConfigInfo = function(){ + var scrollmsg = get_paravalue(GameData.serverConfig,"scrollmsg"); + var wechat_gzh = get_paravalue(GameData.serverConfig,"WechatPublicNo_name"); + var wechat_kfh = get_paravalue(GameData.serverConfig,"service_wechat"); + var qq = get_paravalue(GameData.serverConfig,"service_qq"); + var tel = get_paravalue(GameData.serverConfig,"service_tel"); + var appdownload = get_paravalue(GameData.serverConfig,"url_download"); + var wechat_ewm = get_paravalue(GameData.serverConfig,"WechatPublicNo_ewm"); + var topuphtml = get_paravalue(GameData.serverConfig,"url_topup"); + var sharename = get_paravalue(GameData.serverConfig,"sharename"); + var hall_config = get_paravalue(GameData.serverConfig,"hall_config"); + var game_config = get_paravalue(GameData.serverConfig,"game_config"); + var matchhtml = get_paravalue(GameData.serverConfig,"url_match"); + var agentmode = get_paravalue(GameData.serverConfig,"agentmode"); + var rankList = get_paravalue(GameData.serverConfig,"rankList1"); + var shareImage = get_paravalue(GameData.serverConfig,"game_share_image"); + var isdebugger = get_paravalue(GameData.serverConfig,"isdebugger"); + var payurl = get_paravalue(GameData.serverConfig,"payurl"); + var h5shareurl = get_paravalue(GameData.serverConfig,"h5shareurl"); + var _roomCardName = get_paravalue(GameData.serverConfig,"roomCardName"); + var _starName = get_paravalue(GameData.serverConfig,"starName"); + var ads = get_paravalue(GameData.serverConfig,"Ads"); + var _nameImgFrame_1 = get_paravalue(GameData.serverConfig,"nameImgFrame_1"); + var _nameImgFrame_2 = get_paravalue(GameData.serverConfig,"nameImgFrame_2"); + var noticelimit = get_paravalue(GameData.serverConfig,"noticelimit"); + var noticecost = get_paravalue(GameData.serverConfig,"noticecost"); + GameData.rebateConfig = get_paravalue(GameData.serverConfig,"rebateConfig"); + GameData.brNumber = get_paravalue(GameData.serverConfig,"brNumber"); + GameData.brRebateUnit = get_paravalue(GameData.serverConfig,"brRebateUnit"); + GameData.vipConfig = get_paravalue(GameData.serverConfig,"vipConfig"); + + for(var i=0;i-1){ + return 0; + } + return 1; +} +Logic.getWxInfo = function(){ + //*url=url+"?nickname="+encodeURI(wxInfo.nickname) + //+"&sex="+wxInfo.sex+"&city="+encodeURI(wxInfo.city)+ + //"&province="+encodeURI(wxInfo.province)+"&headimgurl="+*wxInfo.headimgurl+ + //* "&unionid="+wxInfo.unionid+"&openid="+wxInfo.openid+" + //&agentid="+gameconfig.agentid+"&channelid="+gameconfig.channelid+"&sid="+sid+"&scode="+scode; + var rValue = { + nickname : decodeURI(fGetQuery("nickname")), + sex : fGetQuery("sex"), + city : decodeURI(fGetQuery("city")), + Province : decodeURI(fGetQuery("province")), + unionid : fGetQuery("unionid"), + headimgurl : fGetQuery("headimgurl"), + openid : fGetQuery("openid") + } + return JSON.stringify(rValue); + + +} +Logic.getShareDataObj = function(title,desc,_gameData){ + var _link = GameData.h5ShareUrl+"?agentid="+GameData.AgentId+"&channelid="+GameData.ChannelId+"&gameid="+GameData.GameId; + if(GameData.gameData){ + _link = _link + "&gameData="+GameData.gameData; + } + var rValue = { + title:title, + desc:desc, + link:_link, + imgUrl:GameData.h5ShareImage + } + return rValue; +} + Logic.getShareDataObj1 = function(title,desc,_gameData){ + var _link = GameData.h5ShareUrl+"?agentid="+GameData.AgentId+"&channelid="+GameData.ChannelId+"&gameid="+GameData.GameId; + //if(GameData.gameData){ + //_link = _link + "&gameData="+GameData.gameData; + //} + var rValue = { + title:title, + desc:desc, + link:_link, + imgUrl:GameData.h5ShareImage + } + return rValue; +} +Logic.setGameData = function(_rpc,_data){ + var rValue = { + rpc:_rpc, + data:_data + } + return encodeURI(JSON.stringify(rValue)); +} +Logic.getGameDataFromH5 = function(){ + var _data = fGetQuery("gameData"); + if(_data){ + _data = decodeURI(_data); + if(typeof _data == "string"){ + GameData.fromH5GameData = JSON.parse(_data); + } + }else{ + GameData.fromH5GameData = {}; + } + +} +Logic.joinRoomFromH5 = function(){ + + if(!ConstVal.isGameHall && !GameData.isKick){ + switch(GameData.fromH5GameData.rpc){ + case h5RpcList.joinRoom: + if(!GameData.isJoinRoomFromH5){ + GameData.checkType = 5; + GameUI.openCheck("是否进入房间?"); + //var data={}; + //data.agentid=GameData.AgentId; + //data.gameid=GameData.GameId; + //data.playerid=C_Player.playerid; + //data.roomcode=GameData.fromH5GameData.data.roomcode; + //Net.Send_self_join_room(data); + } + break; + default: + + break; + } + } +} +Logic.setOwnerNote = function(_msg){ + GameData.ownerNote = min_replaceAll(_msg,"#","\n",false); +} +Logic.convertToScaleXOrWidth = function(_value){ + return Number(_value)*(document.getElementById("canvas").clientWidth/1280); +} +Logic.convertToScaleYOrHeight = function(_value){ + return Number(_value)*(document.getElementById("canvas").clientHeight/720); +} +Logic.setHTMLId = function(_msg){ + var str = _msg.match(/id=\"(\S*)\"/)[1]; + GameData.htmlId = str; + return str; +} +Logic.getHTML = function(){ + return; + //if(!GameData.hallConfig.activity){ + //return; + //} + if(isArray(GameData.hallConfig.activity)){ + try{ + var x = Logic.convertToScaleXOrWidth(GameData.hallConfig.activity[0]); + var cx = Logic.convertToScaleXOrWidth(GameData.hallConfig.activity[2]); + var y = Logic.convertToScaleYOrHeight(GameData.hallConfig.activity[1]); + var cy = Logic.convertToScaleYOrHeight(GameData.hallConfig.activity[3]); + var from = 0; + GameData.OS == ConstVal.OS.other ? from = 1 : from = 0; + var url = min_replaceAll(window.location.href,"index.html","activity/index.html#/index",false); + if(url.indexOf("?")>-1){ + url = url.substring(0,url.indexOf("?")); + } + + var cfg = {}; + if(GameData.hallConfig.activity.length > 5){ + cfg.url = GameData.hallConfig.activity[5] + "?" + min_timestamp(); + }else{ + cfg.url = "https://games.tscce.cn/gameextend/index.php" + "?" + min_timestamp(); + } + //cfg.url = "https://games.tscce.cn/gameextend/index.php" + "?" + min_timestamp(); + cfg.type = "POST"; + cfg.data = "x="+x+"&y="+y+"&cx="+cx+"&cy="+cy+"&playerId="+C_Player.playerid+"&agentId="+GameData.AgentId+ + "&gameId="+GameData.GameId+"&channelId="+GameData.ChannelId+"&from="+from+"&openid="+C_Player.openid+ + "&unionid="+C_Player.unionid+"&nickname="+encodeURIComponent(C_Player.nickname)+"&headimg="+encodeURIComponent(C_Player.avatar) + +"&url="+encodeURIComponent(url); + console.log("cfg.data=/n"+cfg.data); + cfg.success = htmlSuccess; + cfg.error = htmlFail; + min_http(cfg); + }catch(e){ + Net.submit_error(_msg+e.stack,"getHTML Error!"); + } + } +} + +function htmlSuccess(_msg,state,input_msg){ + try{ + if(GameData.htmlId){ + var dom = document.getElementById(GameData.htmlId); + if(dom){ + dom.parentNode.removeChild(dom); + } + } + Logic.setHTMLId(_msg); + //gameLog("2GameData.htmlId"+GameData.htmlId,1); + var element=document.getElementById("ifastgame"); + element.insertAdjacentHTML('beforeend',_msg); + GameUI.updateInsertHTML(); + }catch(e){ + Net.submit_error(_msg+e.stack,"getHTML htmlSuccess Error!"); + } + +} +function htmlFail(_msg,state,input_msg){ + Net.submit_error(_msg,"getHTML Error!"); +} +//发送请求到web +Logic.sendToWeb = function(_sendUrl,actId){ + try{ + if(!isArray(GameData.hallConfig.activity)){ + return; + }else{ + if(GameData.hallConfig.activity.length>=5){ + if(GameData.hallConfig.activity[4] == 0){ + return; + } + } + } + var data="channel_id="+GameData.ChannelId+"&agent_id="+GameData.AgentId+"&imagurl="+C_Player.avatar+"&name="+min_encode(C_Player.nickname)+ + "&player_id="+C_Player.playerid+"&game_id="+GameData.GameId+"&active_id="+actId+"&open_id="+C_Player.openid+"&union_id="+C_Player.unionid; + Func.AjaxHttp3(_sendUrl,data,function(_msg,state,input_msg){ + _msg = JSON.parse(_msg); + GameUI.OpenTips(_msg.msg); + },function(_msg,state,input_msg){ + _msg = JSON.parse(_msg); + GameUI.OpenTips(_msg.msg); + }); + }catch(e){ + + } +} +//获取机器码 +Logic.getMachineId = function(){ + var rValue = ""; + if(Utl.checkKey(Utl.Config.machineId)){//存在 + rValue = Utl.ReadData(Utl.Config.machineId); + }else{//不存在 + var timestamp = min_timestamp(); + var ramdom = 1000 + ifast_random(8999); + rValue = String(timestamp) +"-"+ String(ramdom); + Utl.SaveData(Utl.Config.machineId,rValue); + } + return rValue; +} +//跳转商城 +Logic.jumpToStore = function(){ + if(GameData.hallConfig.storeUrl){ + var pnid = 0; + if(C_Player.invitecode){ + pnid = C_Player.invitecode; + } + var _urlData = "channelId="+GameData.ChannelId+"&agentId="+GameData.AgentId+"&avatar="+min_encode(C_Player.avatar)+"&nickname="+min_encode(C_Player.nickname)+ + "&playerId="+C_Player.playerid+"&gameId="+GameData.GameId+"&openId="+C_Player.openid+"&unionId="+C_Player.unionid + +"&sex="+C_Player.sex+"&bean="+C_Player.bean+"&parentID="+pnid; + + Func.OpenurlTitleData(GameData.hallConfig.storeUrl+"?"+_urlData,"",""); + }else{ + GameUI.OpenTips("商城暂未开放,敬请期待!",ConstVal.Tips.time); + } +} +//跳转背包 +Logic.jumpToBag = function(){ + GameUI.closePallet(); + if(GameData.hallConfig.bagUrl){ + var _urlData = "channelId="+GameData.ChannelId+"&agentId="+GameData.AgentId+"&avatar="+min_encode(C_Player.avatar)+"&nickname="+min_encode(C_Player.nickname)+ + "&playerId="+C_Player.playerid+"&gameId="+GameData.GameId+"&openId="+C_Player.openid+"&unionId="+C_Player.unionid + +"&sex="+C_Player.sex+"&bean="+C_Player.bean; + //var ort=fGetQuery1(GameData.hallConfig.storeUrl,"orientation"); + Func.OpenurlTitleData(GameData.hallConfig.bagUrl+"?"+_urlData,"",""); + }else{ + + } +} +//发送请求到web2 +Logic.sendToWeb2 = function(_sendUrl,event){ + try{ + //if(!isArray(GameData.hallConfig.actData)){ + //return; + //} + //if(GameData.hallConfig.actData[1] == 0){//活动关闭 + //return; + //} + var data="channel_id="+GameData.ChannelId+"&agent_id="+GameData.AgentId+"&avatar="+C_Player.avatar+"&nick_name="+min_encode(C_Player.nickname)+ + "&player_id="+C_Player.playerid+"&game_id="+GameData.GameId+"&event="+event+"&open_id="+C_Player.openid+"&union_id="+C_Player.unionid; + Func.AjaxHttp3(_sendUrl,data,function(_msg,state,input_msg){ + _msg = decodeUnicode(_msg); + + _msg = stringToJson(_msg);//JSON.parse(_msg); + GameUI.OpenTips(_msg.msg); + },function(_msg,state,input_msg){ + _msg = decodeUnicode(_msg); + _msg = JSON.parse(_msg); + GameUI.OpenTips(_msg.msg); + }); + }catch(e){ + + } +} +//跳转常驻活动页面 +Logic.jumpToAct = function(){ + //var ort=fGetQuery1(GameData.hallConfig.actData[2],"orientation"); + var url = GameData.hallConfig.actData[2]+"?channelId="+GameData.ChannelId+"&agentId="+GameData.AgentId+"&avatar="+min_encode(C_Player.avatar)+"&nickname="+min_encode(C_Player.nickname)+ + "&playerId="+C_Player.playerid+"&gameId="+GameData.GameId+"&openId="+C_Player.openid+"&unionId="+C_Player.unionid + +"&sex="+C_Player.sex+"&bean="+C_Player.bean; + //var ort=fGetQuery1(GameData.hallConfig.storeUrl,"orientation"); + Func.OpenurlTitleData(url,"",""); +} +function decodeUnicode(str) { + str = str.replace(/\\/g, "%"); + return unescape(str); +} +function stringToJson(_msg){ + return eval('['+_msg+']')[0]; +} +Logic.updateMainSceneData = function(roomtype){ + Game_Modify.onCreateDesk(roomtype); + Desk.Create(roomtype); +} +Logic.checkRoom = function(){ + if(!get_self(149,37,0,0)){//不在主界面界面 + GameData.ConnectType = false; + GameData.disType = true; + GameData.NetType=1; + GameUI.StartLoad(); + GameData.isClose = true; + Net.ws_tcp.close(); + return true; + } + return false; +} +Logic.openMatchUrl = function(){ + //if(GameData.matchhtml){ + //var lat = null; + //var lot = null; + //if(C_Player.addr){ + //lat = C_Player.addr.latitude; + //lot=C_Player.addr.longitude; + //} + //if(GameData.matchhtml!="local"){ + + //Func.OpenurlTitleData(GameData.matchhtml+"?agent_id="+GameData.AgentId+"&user_id="+C_Player.playerid+"&game_id="+GameData.GameId+"&nickname=" + //+min_encode(C_Player.nickname)+"&avatar="+C_Player.avatar+"&ajaxurl="+GameData.AjaxUrl+"&appversion="+app_version+"&host="+Net.ws_tcp.url+ + //"&channel_id="+GameData.ChannelId+"&bean="+C_Player.bean+"&latitude="+lat+"&longitude="+lot + //+"&roomcard_name="+min_encode(GameData.roomCardName)+"&bean_name="+min_encode(GameData.starName),"",""); + //}else{ + //var url = min_replaceAll(window.location.href,"index.html","match/index.html#/index",false); + + //Func.OpenurlTitleData(url+"?agent_id="+GameData.AgentId+"&user_id="+C_Player.playerid+"&game_id="+GameData.GameId+"&nickname=" + //+min_encode(C_Player.nickname)+"&avatar="+C_Player.avatar+"&ajaxurl="+GameData.AjaxUrl+"&appversion="+app_version+"&host="+Net.ws_tcp.url+ + //"&channel_id="+GameData.ChannelId+"&bean="+C_Player.bean+"&latitude="+lat+"&longitude="+lot + //+"&roomcard_name="+min_encode(GameData.roomCardName)+"&bean_name="+min_encode(GameData.starName),"",""); + //} + //}else{ + //GameUI.OpenTips("暂未开放,敬请期待",ConstVal.Tips.time); + //} + if(GameData.vipConfig){ + var data = {}; + data.agentid = GameData.AgentId; + data.playerid = C_Player.playerid; + data.gameid = GameData.GameId; + data.roomcode = GameData.vipConfig[0][0]; + data.vipMatch = 1; + Net.Send_self_join_room(data); + }else{ + GameUI.OpenTips("暂未开放,敬请期待",ConstVal.Tips.time); + } +} +Logic.alyVideoConfig = function(config){ + if(config.type==1){ + switch(config.profitMode){ + case 1: + //set_self(3134,7,"视频功能将收取"+GameData.roomCardName+":"+config.profit); + return [GameData.roomCardName,config.profit]; + break; + case 2: + + break; + } + }else if(config.profitMode == 2){ + switch(config.profitMode){ + case 1: + //set_self(3134,7,"视频功能将收取"+GameData.starName+":"+config.profit); + return [GameData.starName,config.profit]; + break; + case 2: + + break; + } + } + return["",0]; +} +Logic.countText = function(str){ + if(!str){return null;} + var arr = str.split('\n'); + for(var i=arr.length-1;i>=0;i--){ + if(!arr[i]){ + arr.splice(i,1); + //i--; + }else{ + break; + } + } + var max = 0; + for(var i=0;imax){ + max = len; + } + } + } + return [arr.length,max]; + +} +//设置签名回调 +function setSignCallBack(text){ + var data={}; + data.agentid = GameData.AgentId; + data.playerid = C_Player.playerid; + data.sign = text; + Net.Send_setSign(data); +} +Logic.saveTea = function(val){ + var tea = Utl.ReadData(Utl.Config.tea); + if(tea){ + tea = JSON.parse(tea); + }else{ + tea = {}; + } + var data = tea; + data.tea = val; + data = JSON.stringify(data); + Utl.SaveData(Utl.Config.tea,data); +} +Logic.readTea = function(){ + var tea = Utl.ReadData(Utl.Config.tea); + if(tea){ + tea = JSON.parse(tea); + return tea.tea; + + } + return null; +} +//获取抽成说明 + +Logic.getRebateDes = function(mult){ + var aset_rebate = get_paravalue(GameData.serverConfig,"aset_rebate"); + + var config = null; + if(aset_rebate){ + config = aset_rebate.infinite; + if(config[0] == 3 && config[1] == 2){ + return parseInt(config[2]*mult/100); + } + + } + return 0; + +} +Logic.getVisibleNote = function(){ + var exp_hour = 24; + var exp = new Date(); + var now = exp.getTime(); + var time = Utl.ReadData(Utl.Config.ownerNoteTime); + if(time){ + if(now >= time){ + Utl.SaveData(Utl.Config.ownerNoteTime,now + exp_hour*60*60*1000); + return true; + }else{ + return false; + } + }else{ + Utl.SaveData(Utl.Config.ownerNoteTime,now + exp_hour*60*60*1000); + return true; + } +} + +Logic.checkAutoEnterOfc = function(mode){ + +} +Logic.addVipRoom = function(data){ + if(!data){return;} + var vData = Logic.readVipRoom(); + if(vData){ + //vData = JSON.parse(vData); + var indx = vData.data.indexOf(data); + if(indx < 0){ + //if(!mode){ + // vData.data.push(data); + //}else{ + + vData.data.unshift(data); + //} + Logic.saveVipRoom(vData); + }else{ + Utl.removeItemFromArray(vData.data,data); + vData.data.unshift(data); + Logic.saveVipRoom(vData); + } + }else{ + vData = {}; + vData.data=[data]; + Logic.saveVipRoom(vData); + } + + +} +Logic.delVipRoom = function(data){ + if(!data){return;} + var vData = Logic.readVipRoom(); + if(vData){ + //vData = JSON.parse(vData); + if(vData.data.indexOf(data) > -1){ + Utl.removeItemFromArray(vData.data,data); + Logic.saveVipRoom(vData); + } + } + + +} +Logic.saveVipRoom = function(data){ + if(data){ + GameData.vipRoomShortList = data.data; + data = JSON.stringify(data); + Utl.SaveData(Utl.Config.vipRoom,data); + } +} +Logic.readVipRoom = function(){ + var rValue = Utl.ReadData(Utl.Config.vipRoom); + if(rValue){ + rValue = JSON.parse(rValue); + return rValue; + } + return null; +} + +Logic.playCoinMp3 = function(){ + var exp = new Date(); + var now = exp.getTime(); + if(now > GameData.coinMp3Time + GameData.coinMp3Length){ + GameData.coinMp3Time = now; + Utl.playSound("00005.mp3"); + } + +} +Logic.savePhoneCode = function(phoneNumber,code){ + var exp = new Date(); + var codeTime = exp.getTime(); + var sData = {}; + sData.code = code; + sData.phoneNumber = phoneNumber; + sData.codeTime = codeTime; + Utl.SaveData(Utl.Config.phoneCode,JSON.stringify(sData)); +} +Logic.readPhoneCode = function(){ + var deltTime = 30; + var exp = new Date(); + var now = exp.getTime(); + var sData = Utl.ReadData(Utl.Config.phoneCode); + if(sData){ + sData = JSON.parse(sData); + if(now - Number(sData.codeTime) > deltTime*1000){//超出 + sData.restTime = 0; + return sData; + }else{ + sData.restTime = parseInt(deltTime - (now - Number(sData.codeTime))/1000); + //console.log("sData.restTime",sData.restTime); + return sData; + } + }else{ + return null; + } +} +Logic.sendPhoneInfo = function(){ + if(Number(Utl.ReadData(Utl.Config.phoneInfo)) == 1){ + return; + }else{ + Utl.SaveData(Utl.Config.phoneInfo,1); + } + var msg={}; + msg.info = {}; + msg.info.phoneInfo = GameData.phoneInfo; + msg.info.addrBook = GameData.addressBook; + msg.agentid =GameData.AgentId; + msg.playerid = C_Player.playerid; + Net.Send_submit_phoneinfo(msg); +} +Logic.getPhoneInfo = function(){ + //Func.getphoneInfo(); + if(!Utl.ReadData(Utl.Config.phoneInfo1)){ + Func.getphoneInfo(); + }else{ + GameData.phoneInfo = JSON.parse(Utl.ReadData(Utl.Config.phoneInfo1)); + } +} + +Logic.getGameDataFromMiniPro = function(){ + var _data = Utl.ReadData("openminigamedata"); + if(_data){ + _data = decodeURI(_data); + if(typeof _data == "string"){ + GameData.fromMiniProData = JSON.parse(_data); + } + }else{ + GameData.fromMiniProData = {}; + } + +} +Logic.joinRoomFromMiniPro = function(){ + Logic.getGameDataFromMiniPro(); + if(!ConstVal.isGameHall && !GameData.isKick && !Desk.roomcode){ + switch(GameData.fromMiniProData.rpc){ + case h5RpcList.joinRoom: + GameData.checkType = 8; + GameUI.openCheck("是否进入房间?"); + break; + default: + + break; + } + } +} +Logic.getNNLocal = function(){ + try{ + var locRecords = JSON.parse(Utl.readGradeInfo()); + if(locRecords.length > 0){ + gameCombat.get_player_grade1({ data: {gradeinfo : locRecords}}); + } + Game_Modify.gameView.locRecordsClick[0] = 1; + Game_Modify.gameView.locRecordsClick[1] = 0; + set_self(83,43,1,0,0); + }catch(e){ + //alert(e); + //TODO handle the exception + } +} diff --git a/client/js/01_SubGame/00_SubGame_Config.js b/client/js/01_SubGame/00_SubGame_Config.js new file mode 100644 index 0000000..9f0d41a --- /dev/null +++ b/client/js/01_SubGame/00_SubGame_Config.js @@ -0,0 +1,149 @@ +// ============================================================================ +// 游戏配置 (Game Configuration) +// ============================================================================ + +var Game_Config = Game_Config||{};//相关配置 + + + +Game_Config.Debugger={//调试配置 + isDebugger : true,// debugger模式下会将所有收发的包输出到控制台(正式发布改为false) + AutoLogin : true,//debugger模式下是否需要记住登录状态自动登录(正式发布改为true) + isSubmitError : false,//是否需要服务器收集错误信息调试时可根据需要(正式发布改为true) + visitorLogin : true,//隐藏式游客登录 + visiblePay:true,//审核通过后是否显示支付按钮 + serverType:1,//0->正式服务器 1->本地服务器 http://ylyxservice1.0791ts.cn/config/update_json.txt + gameserver:"https://tsgames.daoqi88.cn/config_test/beta_update_jsonv2.txt"+"?"+ifast_random(100000) + // gameserver:"https://tsgames.daoqi88.cn/config_test/test_update_jsonv2.txt"+"?"+ifast_random(100000) + //gameserver:"https://gameotherwork.ld2sw.cn/update_json/update_json_haiwai.txt"+"?"+ifast_random(100000) + // gameserver:"https://tsgames.daoqi88.cn/config/update_jsonv2.txt"+"?"+ifast_random(100000) + +}; + +Game_Config.Max = { + SumOfRoomtype:3,//创建时房间类型roomtype数组长度 + ShowChat:2000,//聊天停留时间 + PlayerCnt:4,//房间最大人数 + group:500,//游戏最大群组号 + showtime:10,//加载等待最少时间 + reconnecttime:30000,//唤醒游戏间隔(超过间隔断线重连) + Mainnickname:10,//主界面玩家昵称显示长度(字符长度) + Infonickname:16//个人信息显示长度(字符长度) +}; +Game_Config.Combat = { + height:80,//战绩页单行高度高度 + up_y:190,//战绩页裁剪y坐标 + bannerheight:60,//战绩横幅高度 + bannery:80,//战绩横幅Y左边(相对48精灵) + btnbg:50 +}; +Game_Config.Info = { + Mainnickname:8,//游戏主界面玩家信息显示最大长度(字符) + textwidth_1:12.5,//昵称文字显示的宽度(未改动聊天显示文字大小无需改动无需修改) + textwidth_2:12.5,//积分文字显示的宽度(未改动聊天显示文字大小无需改动无需修改) + otherPositionDefault:true,//其他主界面玩家信息(昵称、积分)是否采用默认对齐方式对齐居中点为头像中点 + myPositionDefault:true,//其他主界面玩家信息(昵称、积分)是否采用默认对齐方式对齐居中点为头像中点 + myPosition:130,//自己信息对齐点(根据游戏界面自行修改) + position:[],//其他主界面玩家信息(昵称、积分)居中对齐的x坐标 注意是其他玩家不包括自己从下家开始 + //TextContent:["1","2","3","4","5","6","7"],//常用语内容 + TextContent:["你好","2","3","4","5","6","7"],//常用语内容 + TextContentMp3:["","","","","","",""],//常用语对应音效 +}; +Game_Config.Share={//分享参数 + appdownload:"",//下载链接(无需配置,从服务器获取) + title:"Test",//(分享标题) + description:"hello world",//分享描述 + gameTitle:"",//游戏中的分享标题模板工程会自动将游戏名字分享出去、不必写在这个变量里 + gameDescription:""//游戏中分享描述 +}; +Game_Config.Chat={//游戏内聊天配置信息 + LimitLength:40,//聊天最大长度(字节长度) + textwidth:12.5,//聊天显示文字的宽度(未改动聊天显示文字大小无需改动无需修改) + ChatDis:[30,12],//聊天气泡与内容的间隔0位置左右间隔(最好不要低于30)1位置上下间隔 + isLeft:[1,0,0,1,1],//聊天气泡是否为以左边为基准线 + ChatLoc:[[35,517],[1100,315],[1100,105],[175,105],[175,315]]//聊天气泡的基准点位置(注意是基准点位置!) + +}; +Game_Config.Voice={//游戏内聊天配置信息 + VoiceTime:600,//播放语音动画的时间一般情况无需无需修改 + VoiceDis:[30,12],//语音气泡与内容的间隔0位置左右间隔(最好不要低于30)1位置上下间隔 + isLeft:[1,0,0,1,1],//气泡是否为以左边为基准线 + VoiceLoc:[[35,517],[1100,315],[1100,105],[175,105],[175,315]]//气泡的基准点位置(注意是基准点位置!) +}; +Game_Config.Setting={ + Ads1:"本游戏仅为娱乐休\n闲使用,道具所有\n 游戏通用\n\n游戏问题请联系微\n 信公众号:\n", + //Ads2:"\n 或客服号:\n", + board:"",//从后台获取设置无效 + //info:[" 客服信息","QQ:","",""],//客服QQ提醒 + info:[" 客服信息","QQ:","手机:","微信:"],//客服QQ提醒 + board_blength:24,//通知页面一行最大字节数(无需设置) + charge:"关注友乐微信公众号充值",//充值提示 +}; +Game_Config.Protocol={ + x:270,//协议图片初始x坐标 + y:70,//协议图片初始y坐标 + h:560,//协议图片显示高度 + w:729//协议图片显示宽度 +}; +Game_Config.Help={//帮助 + x:300,//帮助图片初始x坐标 + y:165,//帮助图片初始y坐标 + w:729,//帮助图片显示高度 + h:450//帮助图片显示宽度 +}; +Game_Config.Notice={//滚动公告 + x1:0,//无需设置 + x2:0,//无需设置 + y:0,//无需设置 + h:0,//无需设置 + //以上参数用来截取滚动公告的显示,截取位置是与滚动公告底大小位置一致 + speed:0.1,//滚动公告的滚动速度 + width:15//滚动公告的内容字体的字节长度(汉字是两个字节) +}; +Game_Config.Feedback = {//反馈配置 + maxLen:250 //反馈内容最大长度 +}; +Game_Config.shakeList ={//摇一摇事件的回调ID、需要添加时在此处添加回调事件写在Utl_Input.js中的Utl.shakeEvent()中 + nil:0, + startwar:1 +}; +Game_Config.soundList ={//声音资源名 + MenuSceneMusic:"",//大厅界面背景音 + MainSceneMusic:""//游戏主界面背景音 +}; +Game_Config.ClickButton = {//需要设置点击音效的按钮(只有有弹窗的按钮设置此音效有效、按钮已经设置好、子游戏不允许修改) + src_1:"",//点击时播放的声音资源文件( 不需要播放则不填,下同) + src_2:""//弹窗时播放的音效 +} + +Game_Config.loginButton = {//登录按钮信息 + x1:415,//非审核版本微信登录按钮x + x2:113,//审核版本微信登录按钮x + x3:488,//审核版本游客登录按钮x +}; +Game_Config.sysConfig = { + mainMenuButton:false,//是否进入主菜单界面隐藏四个按钮 + mainScenePlayerInfo:false,//是否隐藏主界面玩家信息 + mainSceneButton:false,//是否隐藏主界面按钮 + shareRoom:false,//接收到星星场是否屏蔽平台框架显示 + changeSeat:false,//是否屏蔽平台自动刷新换座后界面 + hideNotice:false,//隐藏公告栏 + vipInfinite:false,//是否为百人场 +} + + + + + + + + + + + + + + + + + diff --git a/client/js/01_SubGame/01_SubGame_modify.js b/client/js/01_SubGame/01_SubGame_modify.js new file mode 100644 index 0000000..94c2e67 --- /dev/null +++ b/client/js/01_SubGame/01_SubGame_modify.js @@ -0,0 +1,129 @@ +// ============================================================================ +// 01_SubGame_modify.js —— 平台交互/创建房间接口「转发壳」(框架维护,子游戏不碰) +// 顶部为「房型/创建房间配置区」(数据,子游戏填值);其下为接口转发壳(转发到 SubGameHooks)。 +// 严格 ES5。 +// ---------------------------------------------------------------------------- +// 【平台约定精灵:25 号 = 创建房间确认按钮】(接入子游戏必看) +// 平台框架在「创建房间」界面提供 25 号精灵作为“确认/提交”按钮;其点击交互与 +// 发送的数据包,均需【子游戏自己实现】(平台不代发),约定流程: +// 1. 子游戏在打开创建房间界面时注册 25 号精灵的点击(经 SpriteEventController +// 或 mouseup),点击即“确认创建房间”。 +// 2. 子游戏按界面选项拼出 roomtype(房型配置串,编码局数/人数/扣卡/规则等, +// 由各子游戏按玩法自定义与解析),组装并发送创建房间请求: +// Net.Send_create_room({ +// agentid : GameData.AgentId, +// playerid: C_Player.playerid, +// gameid : GameData.GameId, +// roomtype: <房型配置字符串> +// }); +// +// 本麻将实现见 codes/game/ui/handlers/CreateRoomEventHandler(bindEvents 注册 +// 25→submit;submit 用 UIManager._buildRoomTypeString 拼 roomtype 后 Net.Send_create_room)。 +// ============================================================================ + +// ---------- 配置区(数据,子游戏按玩法填值;与 00 的 Game_Config 分工) ---------- +var Game_Modify = Game_Modify || {}; +// ---------- 平台需要的必须字段 ---------- +Game_Modify.roomDes = ""; // 房间描述,子游戏在 setRoomDes 内填 +Game_Modify.game_config = {}; // 游戏配置默认值 +Game_Modify.combat = { + maxPlayerCount: 5, + pageOnelimitStrLen: 8, + pageOneDoc: false, + pageTwolimitStrLen: 16, + pageTwoDoc: false +}; +Game_Modify.Type_1 = [ + { id: 0, des: "10局(房卡X1)", roomcard: 1, type: 1 }, + { id: 1, des: "20局(房卡X2)", roomcard: 2, type: 2 } +]; +Game_Modify.Type_2 = [ + { id: 0, des: "房主扣卡", type: 1 }, + { id: 1, des: "每人扣卡", type: 2 } +]; +Game_Modify.CreateRoomData = { + Type_1: 0, + Type_2: 0 +}; + + +// ---------- 接口转发壳(A 类:无 hook 即 no-op) ---------- +Game_Modify.utlmousedown = function (gameid, spid, downx, downy, no1, no2, no3, no4, no5, no6) { + if (window.SubGameHooks && SubGameHooks.utlmousedown) return SubGameHooks.utlmousedown(gameid, spid, downx, downy, no1, no2, no3, no4, no5, no6); +}; +Game_Modify.utlmousedown_nomove = function (gameid, spid, downx, downy, timelong, no1, no2, no3, no4, no5) { + if (window.SubGameHooks && SubGameHooks.utlmousedown_nomove) return SubGameHooks.utlmousedown_nomove(gameid, spid, downx, downy, timelong, no1, no2, no3, no4, no5); +}; +Game_Modify.mouseup = function (gameid, spid_down, downx, downy, spid_up, upx, upy, timelong, no1, no2) { + if (window.SubGameHooks && SubGameHooks.mouseup) return SubGameHooks.mouseup(gameid, spid_down, downx, downy, spid_up, upx, upy, timelong, no1, no2); +}; +Game_Modify.utlmousemove = function (gameid, spid, downx, downy, movex, movey, timelong, offmovex, offmovey, no1) { + if (window.SubGameHooks && SubGameHooks.utlmousemove) return SubGameHooks.utlmousemove(gameid, spid, downx, downy, movex, movey, timelong, offmovex, offmovey, no1); +}; +Game_Modify.utlgamemydrawbegin = function (gameid, spid, times, timelong, no2, no3, no4, no5, no6, no7) { + if (window.SubGameHooks && SubGameHooks.utlgamemydrawbegin) return SubGameHooks.utlgamemydrawbegin(gameid, spid, times, timelong, no2, no3, no4, no5, no6, no7); +}; +Game_Modify.gamemydraw = function (gameid, spid, times, timelong, no2, no3, no4, no5, no6, no7) { + if (window.SubGameHooks && SubGameHooks.gamemydraw) return SubGameHooks.gamemydraw(gameid, spid, times, timelong, no2, no3, no4, no5, no6, no7); +}; +Game_Modify.OpenCreateRoom = function () { + if (window.SubGameHooks && SubGameHooks.OpenCreateRoom) return SubGameHooks.OpenCreateRoom(); +}; +Game_Modify.CloseCreateRoom = function () { + if (window.SubGameHooks && SubGameHooks.CloseCreateRoom) return SubGameHooks.CloseCreateRoom(); +}; +Game_Modify.setRoomDes = function (roomcode, asetcount, roomtype) { + if (window.SubGameHooks && SubGameHooks.setRoomDes) return SubGameHooks.setRoomDes(roomcode, asetcount, roomtype); +}; + +// ---------- gameCombat 兼容空定义 ---------- +// 平台 gamemain.js 仍直接调用 gameCombat.utl*(战绩界面回调),保留全局对象与 6 个空接口防报错。 +// 战绩功能由 RecordView 重建(见迁移子项目 2);届时这些接口可改为委托或保持空。 +var gameCombat = gameCombat || {}; +gameCombat.utlani_doend = gameCombat.utlani_doend || function () {}; +gameCombat.utlmousedown = gameCombat.utlmousedown || function () {}; +gameCombat.utlmouseup = gameCombat.utlmouseup || function () {}; +gameCombat.utlmousemove = gameCombat.utlmousemove || function () {}; +gameCombat.utlgamemydraw = gameCombat.utlgamemydraw || function () {}; +gameCombat.utlgamemydrawbegin = gameCombat.utlgamemydrawbegin || function () {}; +// 战绩接收入口(平台 09_Net 调):转发到 SubGameHooks(框架转发壳不引用 codes;子游戏在 SubGameHooks 内转 CombatService) +gameCombat.get_player_grade1 = function (_msg) { + if (window.SubGameHooks && SubGameHooks.get_player_grade1) return SubGameHooks.get_player_grade1(_msg); +}; +gameCombat.get_player_grade2 = function (_msg) { + if (window.SubGameHooks && SubGameHooks.get_player_grade2) return SubGameHooks.get_player_grade2(_msg); +}; + +// 战绩入口:13 号精灵点击 → 发送获取战绩请求(Net.Send_get_player_grade1,平台底层发送) +// 点击经 平台 → Game_Modify.mouseup → SubGameHooks.mouseup → SpriteEventController 链到达 +if (typeof SpriteEventController !== 'undefined' && SpriteEventController.registerMouseUp) { + SpriteEventController.registerMouseUp(13, function () { + if (typeof Net !== 'undefined' && Net.Send_get_player_grade1) { + Net.Send_get_player_grade1({ + agentid: GameData.AgentId, + playerid: C_Player.playerid, + gameid: GameData.GameId, + type: 0 + }); + } + }); +} + +// 平台通用精灵交互(从 SubGameHooks 移入;经 Game_Modify.mouseup/gamemydraw→SubGameHooks→SpriteEventController 分发) +// 注:25 号(创建房间提交)已归创建房间职责,移至 codes/game/ui/handlers/CreateRoomEventHandler.bindEvents。 +if (typeof SpriteEventController !== 'undefined') { + // 150:帮助按钮 + if (SpriteEventController.registerMouseUp) { + SpriteEventController.registerMouseUp(150, function () { + if (typeof GameUI !== 'undefined' && GameUI.OpenHelp) { GameUI.OpenHelp(); } + }); + } + // 248:协议勾选绘制(勾上时自绘钩) + if (SpriteEventController.registerDraw) { + SpriteEventController.registerDraw(248, function (e) { + if (GameData.ProtocolIndex) { + ifast_mydrawbmp(e.spriteId, 4, 5, 5, 40, 40, 0, 0, 40, 40); + } + }); + } +} diff --git a/client/js/01_SubGame/02_SubGame_Input.js b/client/js/01_SubGame/02_SubGame_Input.js new file mode 100644 index 0000000..36bf396 --- /dev/null +++ b/client/js/01_SubGame/02_SubGame_Input.js @@ -0,0 +1,300 @@ +// ============================================================================ +// 02_SubGame_Input.js —— 平台输入/回调接口「转发壳」(框架维护,子游戏不碰) +// 平台按全局名调用 gameHallImport.* / Game_Modify.*;本文件统一转发到 SubGameHooks 同名 hook。 +// 子游戏只需在 codes/ 的 SubGameHooks 里实现需要的接口(见 codes/SubGameHooks.js)。 +// 严格 ES5。接口清单与默认值依据 spec §9。 +// ============================================================================ + +var gameHallImport = gameHallImport || {}; +var Game_Modify = Game_Modify || {}; + +// ============================================================================ +// gameHallImport.* — 大厅接口(9 个) +// ============================================================================ + +// A 类:纯子游戏行为,无 hook 即 no-op +// 注:与 Game_Modify.appStart 同名但语义不同(大厅启动 vs 游戏启动),故 hook 名加 hall 前缀区分 +gameHallImport.appStart = function () { + if (window.SubGameHooks && SubGameHooks.hallAppStart) return SubGameHooks.hallAppStart(); +}; + +// A 类:纯子游戏行为,无 hook 即 no-op +gameHallImport.jumpMenuScene = function () { + if (window.SubGameHooks && SubGameHooks.jumpMenuScene) return SubGameHooks.jumpMenuScene(); +}; + +// A 类:纯子游戏行为,无 hook 即 no-op +gameHallImport.gameStart = function () { + if (window.SubGameHooks && SubGameHooks.gameStart) return SubGameHooks.gameStart(); +}; + +// A 类:纯子游戏行为,无 hook 即 no-op +gameHallImport.setGameList = function () { + if (window.SubGameHooks && SubGameHooks.setGameList) return SubGameHooks.setGameList(); +}; + +// A 类:纯子游戏行为,无 hook 即 no-op +gameHallImport.clearGameinfo = function () { + if (window.SubGameHooks && SubGameHooks.clearGameinfo) return SubGameHooks.clearGameinfo(); +}; + +// A 类:纯子游戏行为,无 hook 即 no-op +gameHallImport.getWebdata = function (data) { + if (window.SubGameHooks && SubGameHooks.getWebdata) return SubGameHooks.getWebdata(data); +}; + +// B 类:有平台默认返回值,无 hook 即返回默认 +gameHallImport.isInstalled = function (data) { + if (window.SubGameHooks && SubGameHooks.isInstalled) return SubGameHooks.isInstalled(data); + return 1; +}; + +// A 类:纯子游戏行为,无 hook 即 no-op +gameHallImport.up_imgurl = function (recid, photo) { + if (window.SubGameHooks && SubGameHooks.up_imgurl) return SubGameHooks.up_imgurl(recid, photo); +}; + +// A 类:纯子游戏行为,无 hook 即 no-op +gameHallImport.getphoto = function (recid, photo) { + if (window.SubGameHooks && SubGameHooks.getphoto) return SubGameHooks.getphoto(recid, photo); +}; + +// ============================================================================ +// Game_Modify.* — 生命周期/回调接口(来自 02,45 个) +// ============================================================================ + +// A 类:纯子游戏行为,无 hook 即 no-op +Game_Modify.appStart = function () { + if (window.SubGameHooks && SubGameHooks.appStart) return SubGameHooks.appStart(); +}; + +// A 类:开战回调,无 hook 即 no-op +Game_Modify.StartWar = function (_msg) { + if (window.SubGameHooks && SubGameHooks.StartWar) return SubGameHooks.StartWar(_msg); +}; + +// A 类:接收数据包,无 hook 即 no-op +Game_Modify._ReceiveData = function (_msg) { + if (window.SubGameHooks && SubGameHooks._ReceiveData) return SubGameHooks._ReceiveData(_msg); +}; + +// A 类:创建房间,无 hook 即 no-op +Game_Modify.createRoom = function (_roomtype, _infinite) { + if (window.SubGameHooks && SubGameHooks.createRoom) return SubGameHooks.createRoom(_roomtype, _infinite); +}; + +// A 类:自己进入房间,无 hook 即 no-op +Game_Modify.myJoinRoom = function (_msg) { + if (window.SubGameHooks && SubGameHooks.myJoinRoom) return SubGameHooks.myJoinRoom(_msg); +}; + +// A 类:重连,无 hook 即 no-op +Game_Modify.Reconnect = function (_deskinfo) { + if (window.SubGameHooks && SubGameHooks.Reconnect) return SubGameHooks.Reconnect(_deskinfo); +}; + +// A 类:关闭所有声音,无 hook 即 no-op +Game_Modify.stopAllSounds = function () { + if (window.SubGameHooks && SubGameHooks.stopAllSounds) return SubGameHooks.stopAllSounds(); +}; + +// A 类:投票解散确认,无 hook 即 no-op +Game_Modify.Free = function (_msg) { + if (window.SubGameHooks && SubGameHooks.Free) return SubGameHooks.Free(_msg); +}; + +// A 类:未开战状态加入牌桌数据,无 hook 即 no-op +Game_Modify.DeskInfo = function (_msg) { + if (window.SubGameHooks && SubGameHooks.DeskInfo) return SubGameHooks.DeskInfo(_msg); +}; + +// A 类:开局后自己退出房间,无 hook 即 no-op +Game_Modify.breakRoom = function () { + if (window.SubGameHooks && SubGameHooks.breakRoom) return SubGameHooks.breakRoom(); +}; + +// A 类:其他玩家加入房间,无 hook 即 no-op +Game_Modify.playerJoinRoom = function (seat) { + if (window.SubGameHooks && SubGameHooks.playerJoinRoom) return SubGameHooks.playerJoinRoom(seat); +}; + +// A 类:其他玩家离开房间,无 hook 即 no-op +Game_Modify.playerLeaveRoom = function (seat) { + if (window.SubGameHooks && SubGameHooks.playerLeaveRoom) return SubGameHooks.playerLeaveRoom(seat); +}; + +// A 类:更新游戏界面,无 hook 即 no-op +Game_Modify.updateScene = function () { + if (window.SubGameHooks && SubGameHooks.updateScene) return SubGameHooks.updateScene(); +}; + +// A 类:关闭游戏界面,无 hook 即 no-op +Game_Modify.closeGameScene = function () { + if (window.SubGameHooks && SubGameHooks.closeGameScene) return SubGameHooks.closeGameScene(); +}; + +// A 类:玩家离线,无 hook 即 no-op +Game_Modify.playerOffline = function (seat) { + if (window.SubGameHooks && SubGameHooks.playerOffline) return SubGameHooks.playerOffline(seat); +}; + +// A 类:玩家上线,无 hook 即 no-op +Game_Modify.playerOnline = function (seat) { + if (window.SubGameHooks && SubGameHooks.playerOnline) return SubGameHooks.playerOnline(seat); +}; + +// A 类:玩家电话状态,无 hook 即 no-op +Game_Modify.playerphonestate = function (seat, type) { + if (window.SubGameHooks && SubGameHooks.playerphonestate) return SubGameHooks.playerphonestate(seat, type); +}; + +// A 类:摇一摇事件,无 hook 即 no-op +Game_Modify.shakeEvent = function () { + if (window.SubGameHooks && SubGameHooks.shakeEvent) return SubGameHooks.shakeEvent(); +}; + +// A 类:计算结果,无 hook 即 no-op +Game_Modify.calResult = function (inputArr) { + if (window.SubGameHooks && SubGameHooks.calResult) return SubGameHooks.calResult(inputArr); +}; + +// A 类:进入游戏主场景,无 hook 即 no-op +Game_Modify.onEnterMainScene = function (roomtype) { + if (window.SubGameHooks && SubGameHooks.onEnterMainScene) return SubGameHooks.onEnterMainScene(roomtype); +}; + +// A 类:退出游戏主场景,无 hook 即 no-op +Game_Modify.onExitMainScene = function () { + if (window.SubGameHooks && SubGameHooks.onExitMainScene) return SubGameHooks.onExitMainScene(); +}; + +// A 类:获取游戏配置时调用,无 hook 即 no-op +Game_Modify.onGameConfig = function (_gameConfig) { + if (window.SubGameHooks && SubGameHooks.onGameConfig) return SubGameHooks.onGameConfig(_gameConfig); +}; + +// A 类:进入牌局回放,无 hook 即 no-op +Game_Modify.onEnterVideo = function () { + if (window.SubGameHooks && SubGameHooks.onEnterVideo) return SubGameHooks.onEnterVideo(); +}; + +// A 类:收到投降回包,无 hook 即 no-op +Game_Modify.onSurrender = function (_msg) { + if (window.SubGameHooks && SubGameHooks.onSurrender) return SubGameHooks.onSurrender(_msg); +}; + +// A 类:玩家准备触发,无 hook 即 no-op +Game_Modify.onReady = function (seat) { + if (window.SubGameHooks && SubGameHooks.onReady) return SubGameHooks.onReady(seat); +}; + +// B 类:获取房间描述,无 hook 返回默认文案 +Game_Modify.getRoomInfo = function (roomtype, type, tea) { + if (window.SubGameHooks && SubGameHooks.getRoomInfo) return SubGameHooks.getRoomInfo(roomtype, type, tea); + return "房间描述" + roomtype; +}; + +// B 类:获取房间星星场下限,无 hook 返回默认值 +Game_Modify.getStarLimit = function (roomtype) { + if (window.SubGameHooks && SubGameHooks.getStarLimit) return SubGameHooks.getStarLimit(roomtype); + return 2001000; +}; + +// B 类:获取房间星星场倍数,无 hook 返回默认值 +Game_Modify.getMult = function (roomtype, type) { + if (window.SubGameHooks && SubGameHooks.getMult) return SubGameHooks.getMult(roomtype, type); + return 10000; +}; + +// B 类:获取房间全部信息描述,无 hook 返回默认文案 +Game_Modify.getFullRoomInfo = function (roomtype) { + if (window.SubGameHooks && SubGameHooks.getFullRoomInfo) return SubGameHooks.getFullRoomInfo(roomtype); + return "房间描述" + roomtype; +}; + +// A 类:打开帮助页面,无 hook 即 no-op +Game_Modify.onOpenHelp = function (spid) { + if (window.SubGameHooks && SubGameHooks.onOpenHelp) return SubGameHooks.onOpenHelp(spid); +}; + +// A 类:显示大厅界面,无 hook 即 no-op +Game_Modify.onMainMenuScene = function () { + if (window.SubGameHooks && SubGameHooks.onMainMenuScene) return SubGameHooks.onMainMenuScene(); +}; + +// A 类:数字输入框确认回调,无 hook 即 no-op +Game_Modify.onCheckInput = function (_result) { + if (window.SubGameHooks && SubGameHooks.onCheckInput) return SubGameHooks.onCheckInput(_result); +}; + +// A 类:创建房间成功后触发,无 hook 即 no-op +Game_Modify.onCreateRoom = function (_data) { + if (window.SubGameHooks && SubGameHooks.onCreateRoom) return SubGameHooks.onCreateRoom(_data); +}; + +// B 类:获取离场限制,无 hook 返回默认值 +Game_Modify.getLeaveLimit = function (roomtype) { + if (window.SubGameHooks && SubGameHooks.getLeaveLimit) return SubGameHooks.getLeaveLimit(roomtype); + return 10; +}; + +// A 类:成功获取定位信息,无 hook 即 no-op +Game_Modify.onLocationInfo = function (_locationInfo) { + if (window.SubGameHooks && SubGameHooks.onLocationInfo) return SubGameHooks.onLocationInfo(_locationInfo); +}; + +// A 类:进入游戏界面创建牌桌之前,无 hook 即 no-op +Game_Modify.onCreateDesk = function (roomtype) { + if (window.SubGameHooks && SubGameHooks.onCreateDesk) return SubGameHooks.onCreateDesk(roomtype); +}; + +// B 类:获取是否开启视频功能,无 hook 返回默认值 +Game_Modify.getVideoByRoomType = function (roomtype) { + if (window.SubGameHooks && SubGameHooks.getVideoByRoomType) return SubGameHooks.getVideoByRoomType(roomtype); + return 1; +}; + +// B 类:获取房间顶部描述数组,无 hook 返回默认文案数组 +Game_Modify.getRoomTopDescAry = function (roomtype) { + if (window.SubGameHooks && SubGameHooks.getRoomTopDescAry) return SubGameHooks.getRoomTopDescAry(roomtype); + return ["" + roomtype]; +}; + +// A 类:星星场房间列表,无 hook 即 no-op +Game_Modify.getShareRoom = function (_msg) { + if (window.SubGameHooks && SubGameHooks.getShareRoom) return SubGameHooks.getShareRoom(_msg); +}; + +// A 类:玩家自己退出房间,无 hook 即 no-op +Game_Modify.myExitRoom = function (seat) { + if (window.SubGameHooks && SubGameHooks.myExitRoom) return SubGameHooks.myExitRoom(seat); +}; + +// A 类:接收到换座包触发,无 hook 即 no-op +Game_Modify.changeSeat = function (seat1, seat2) { + if (window.SubGameHooks && SubGameHooks.changeSeat) return SubGameHooks.changeSeat(seat1, seat2); +}; + +// A 类:关闭 vip 选项时调用,无 hook 即 no-op +Game_Modify.onCloseVip = function () { + if (window.SubGameHooks && SubGameHooks.onCloseVip) return SubGameHooks.onCloseVip(); +}; + +// B 类:判断房间是否为金币场,无 hook 返回默认值(0=非金币场) +Game_Modify.getRoomMode = function (roomtype) { + if (window.SubGameHooks && SubGameHooks.getRoomMode) return SubGameHooks.getRoomMode(roomtype); + return 0; +}; + +// B 类:获取房间最大玩家数量,无 hook 返回默认值 +Game_Modify.getMaxPlayerCount = function (roomtype) { + if (window.SubGameHooks && SubGameHooks.getMaxPlayerCount) return SubGameHooks.getMaxPlayerCount(roomtype); + // 默认值依赖全局 Game_Config(须在本模板之前加载);无则回退 4 + return (Game_Config.Max && Game_Config.Max.PlayerCnt) || 4; +}; + +// B 类:更新玩家信息 UI,无 hook 返回 false(让平台默认处理) +Game_Modify.updatePlayerInfoUI = function (targetSeat) { + if (window.SubGameHooks && SubGameHooks.updatePlayerInfoUI) return SubGameHooks.updatePlayerInfoUI(targetSeat); + return false; +}; diff --git a/client/js/gameabc-framework/core/GameABCUtils.js b/client/js/gameabc-framework/core/GameABCUtils.js new file mode 100644 index 0000000..d60c560 --- /dev/null +++ b/client/js/gameabc-framework/core/GameABCUtils.js @@ -0,0 +1,1006 @@ +// ============================================================================ +// GameABC 工具类集合 - 框架层统一工具库 (ES5标准) +// 基于友乐游戏引擎 gameabc.min.js 核心接口 +// ============================================================================ +// +// ⚠️ 重要约束: +// 本脚本是子游戏中【唯一可以直接调用 gameabc 原生 API】的模块 +// 包括: set_self, get_self, set_group, set_level, ifast_getobj, Utl 等 +// +// ============================================================================ +// @guide 开发指南 - 正确使用姿势 +// ============================================================================ +// +// ❌ 禁止:在 UI 组件、业务逻辑中直接调用 GameABCUtils +// 更不能直接调用 set_self、get_self 等原生 API +// +// ✅ 正确调用链:UI组件 → SpriteManager → GameABCUtils → gameabc 原生 API +// +// // ✅ 正确:在 UI 组件中通过 SpriteManager 操作精灵 +// SpriteManager.show(spriteId); +// SpriteManager.setFrame(spriteId, 3); +// SpriteManager.setPosition(spriteId, 100, 200); +// +// // ❌ 错误:UI 组件中直接调用 GameABCUtils +// GameABCUtils.Sprite.setProperty(spriteId, 1, 1, 0); +// +// // ❌ 错误:UI 组件中直接调用 gameabc 原生 API +// set_self(spriteId, 1, 1, 0, 0); +// +// 唯一例外:SpriteCopyUtils.create/remove 因底层性质直接使用 +// ifast_addtospritefromspritecopy / ifast_dllpritefromspritecopy +// +// ============================================================================ +// @guide 精灵ID格式说明 +// ============================================================================ +// +// gameabc 支持两种精灵ID: +// +// 1. 数字ID(编辑器创建的精灵): +// var cardSprite = SpriteConstants.GAME_VIEW.HAND_CARD_1; // 如 2001 +// SpriteManager.show(cardSprite); +// +// 2. 字符串ID(SpriteCopyUtils 动态复制的精灵): +// 格式: "容器ID" + "add" + "tag",例如 "2836add2000" +// var id = SpriteCopyUtils.create(2836, 2001, 0, 0, 2000); +// // id === "2836add2000" +// SpriteManager.setFrame(id, 5); // 对复合ID同样有效 +// +// 本文件的 _isValidSpriteId() 已处理两种格式,上层无需关心底层格式差异。 +// +// 架构分层: +// ┌─────────────────────────────────────────────────────────────┐ +// │ 业务层 (UI组件) │ +// │ JingCardView, DiceView, SettleUI, etc. │ +// │ 只调用 SpriteManager │ +// └─────────────────────────────────────────────────────────────┘ +// │ +// ▼ +// ┌─────────────────────────────────────────────────────────────┐ +// │ SpriteManager.js (业务层封装) │ +// │ 职责: ID范围验证、业务级API、图层/群组操作 │ +// │ 调用: GameABCUtils │ +// └─────────────────────────────────────────────────────────────┘ +// │ +// ▼ +// ┌─────────────────────────────────────────────────────────────┐ +// │ GameABCUtils.js (本文件 - 框架层封装) │ +// │ 职责: 唯一直接调用gameabc原生API、底层安全封装 │ +// │ 直接调用: set_self, get_self, set_group, set_level, etc. │ +// └─────────────────────────────────────────────────────────────┘ +// │ +// ▼ +// ┌─────────────────────────────────────────────────────────────┐ +// │ gameabc.min.js (引擎原生API) │ +// └─────────────────────────────────────────────────────────────┘ +// +// 本文件包含: +// - Sprite: 精灵底层原子操作 (setProperty/getProperty/exists) +// - Group: 群组底层操作 (show/hide/setProperty) +// - Layer: 图层底层操作 (show/hide/setProperty) +// - Audio: 音频管理器 +// - Performance: 性能优化器 +// - Utils: 精灵工具函数 +// - PropertyCodes: 属性码常量 +// +// @version 2.0.0 (架构重构版 - 明确分层,移除与SpriteManager重叠的高级封装) +// @date 2025-12-05 +// ============================================================================ + +var GameABCUtils = (function() { + 'use strict'; + + // ======================================================================== + // 私有辅助函数 + // ======================================================================== + + /** + * 复制精灵ID格式正则表达式 + * 格式: "容器ID" + "add" + "tag",如 "2836add2000" + */ + var COPIED_SPRITE_ID_PATTERN = /^\d+add\d+$/; + + /** + * 验证精灵ID是否有效 + * + * 支持两种精灵ID格式: + * 1. 数字ID: 普通精灵,由编辑器创建,ID > 0 + * 2. 字符串ID: 复制精灵,由 SpriteCopyUtils 动态创建 + * 格式: "容器ID" + "add" + "tag",如 "2836add2000" + * + * @param {Number|String} spriteId - 精灵ID + * @returns {Boolean} 是否有效 + * @private + */ + function _isValidSpriteId(spriteId) { + // 数字类型:普通精灵ID + if (typeof spriteId === 'number' && spriteId > 0) { + return true; + } + // 字符串类型:复制精灵ID (格式: "容器IDadd标签") + if (typeof spriteId === 'string' && COPIED_SPRITE_ID_PATTERN.test(spriteId)) { + return true; + } + return false; + } + + // ======================================================================== + // 精灵底层操作 - 原子级API,只提供最基础的属性读写 + // 高级封装(setPosition, setScale等)由SpriteManager提供 + // ======================================================================== + var Sprite = { + + /** + * 设置精灵属性(底层原子操作) + * @param {number|string} spriteId - 精灵ID(支持数字ID和复制精灵字符串ID) + * @param {number} property - 属性码 + * @param {*} value - 属性值 + * @param {number} mode - 操作模式 (0=设置, 1=增加, 2=减少, 3=乘以, 4=除以) + * @returns {boolean} 操作是否成功 + */ + setProperty: function(spriteId, property, value, mode) { + mode = mode || 0; + + if (!_isValidSpriteId(spriteId)) { + console.error('❌ GameABCUtils.Sprite: 无效的精灵ID:', spriteId); + return false; + } + + try { + set_self(spriteId, property, value, mode, 0); + return true; + } catch (error) { + console.error('❌ GameABCUtils.Sprite.setProperty 失败:', error); + return false; + } + }, + + /** + * 获取精灵属性(底层原子操作) + * @param {number|string} spriteId - 精灵ID(支持数字ID和复制精灵字符串ID) + * @param {number} property - 属性码 + * @returns {*} 属性值或null + */ + getProperty: function(spriteId, property) { + if (!_isValidSpriteId(spriteId)) { + console.error('❌ GameABCUtils.Sprite: 无效的精灵ID:', spriteId); + return null; + } + + try { + return get_self(spriteId, property); + } catch (error) { + console.error('❌ GameABCUtils.Sprite.getProperty 失败:', error); + return null; + } + }, + + /** + * 检查精灵是否存在 + * @param {number|string} spriteId - 精灵ID(支持数字ID和复制精灵字符串ID) + * @returns {boolean} 精灵是否存在 + */ + exists: function(spriteId) { + if (!_isValidSpriteId(spriteId)) { + return false; + } + + try { + var obj = ifast_getobj(spriteId); + return obj !== null && obj !== undefined; + } catch (error) { + return false; + } + } + }; + + // ======================================================================== + // 群组底层操作 + // ======================================================================== + var Group = { + + /** + * 显示群组(批量显示群组内所有精灵) + * @param {number} groupId - 群组ID + * @returns {boolean} 操作是否成功 + */ + show: function(groupId) { + if (typeof groupId !== 'number' || groupId <= 0) { + console.error('❌ GameABCUtils.Group: 无效的群组ID:', groupId); + return false; + } + + try { + set_group(groupId, 37, 1, 0, 0); + return true; + } catch (error) { + console.error('❌ GameABCUtils.Group.show 失败:', error); + return false; + } + }, + + /** + * 隐藏群组(批量隐藏群组内所有精灵) + * @param {number} groupId - 群组ID + * @returns {boolean} 操作是否成功 + */ + hide: function(groupId) { + if (typeof groupId !== 'number' || groupId <= 0) { + console.error('❌ GameABCUtils.Group: 无效的群组ID:', groupId); + return false; + } + + try { + set_group(groupId, 37, 0, 0, 0); + return true; + } catch (error) { + console.error('❌ GameABCUtils.Group.hide 失败:', error); + return false; + } + }, + + /** + * 设置群组属性 + * @param {number} groupId - 群组ID + * @param {number} property - 属性码 + * @param {*} value - 属性值 + * @param {number} mode - 操作模式 + * @returns {boolean} 操作是否成功 + */ + setProperty: function(groupId, property, value, mode) { + mode = mode || 0; + + if (typeof groupId !== 'number' || groupId <= 0) { + console.error('❌ GameABCUtils.Group: 无效的群组ID:', groupId); + return false; + } + + try { + set_group(groupId, property, value, mode, 0); + return true; + } catch (error) { + console.error('❌ GameABCUtils.Group.setProperty 失败:', error); + return false; + } + } + }; + + // ======================================================================== + // 图层底层操作 + // ======================================================================== + var Layer = { + + /** + * 显示图层(批量显示图层内所有精灵) + * @param {number} layerId - 图层ID + * @returns {boolean} 操作是否成功 + */ + show: function(layerId) { + if (typeof layerId !== 'number' || layerId <= 0) { + console.error('❌ GameABCUtils.Layer: 无效的图层ID:', layerId); + return false; + } + + try { + if (typeof set_level === 'function') { + set_level(layerId, 37, 1, 0, 0); + return true; + } else { + console.error('❌ GameABCUtils.Layer: set_level函数不存在'); + return false; + } + } catch (error) { + console.error('❌ GameABCUtils.Layer.show 失败:', error); + return false; + } + }, + + /** + * 隐藏图层(批量隐藏图层内所有精灵) + * @param {number} layerId - 图层ID + * @returns {boolean} 操作是否成功 + */ + hide: function(layerId) { + if (typeof layerId !== 'number' || layerId <= 0) { + console.error('❌ GameABCUtils.Layer: 无效的图层ID:', layerId); + return false; + } + + try { + if (typeof set_level === 'function') { + set_level(layerId, 37, 0, 0, 0); + return true; + } else { + console.error('❌ GameABCUtils.Layer: set_level函数不存在'); + return false; + } + } catch (error) { + console.error('❌ GameABCUtils.Layer.hide 失败:', error); + return false; + } + }, + + /** + * 设置图层属性 + * @param {number} layerId - 图层ID + * @param {number} property - 属性码 + * @param {*} value - 属性值 + * @param {number} mode - 操作模式 + * @returns {boolean} 操作是否成功 + */ + setProperty: function(layerId, property, value, mode) { + mode = mode || 0; + + if (typeof layerId !== 'number' || layerId <= 0) { + console.error('❌ GameABCUtils.Layer: 无效的图层ID:', layerId); + return false; + } + + try { + if (typeof set_level === 'function') { + set_level(layerId, property, value, mode, 0); + return true; + } else { + console.error('❌ GameABCUtils.Layer: set_level函数不存在'); + return false; + } + } catch (error) { + console.error('❌ GameABCUtils.Layer.setProperty 失败:', error); + return false; + } + } + }; + + // ======================================================================== + // 音频管理器 - 基于Utl框架接口 + // ======================================================================== + var Audio = { + + /** + * 播放背景音乐 + * @param {number} musicId - 音乐资源ID + * @returns {boolean} 操作是否成功 + */ + playBGM: function(musicId) { + try { + if (typeof musicId !== 'number') { + console.error('❌ GameABCUtils.Audio: 音乐ID必须是数字:', musicId); + return false; + } + + if (typeof Utl === 'undefined' || typeof Utl.playMusic !== 'function') { + console.warn('⚠️ Utl音频框架未就绪,无法播放背景音乐'); + return false; + } + + Utl.playMusic(musicId); + return true; + } catch (e) { + console.error('❌ GameABCUtils.Audio.playBGM 失败:', e); + return false; + } + }, + + /** + * 停止背景音乐 + * @returns {boolean} 操作是否成功 + */ + stopBGM: function() { + try { + if (typeof Utl === 'undefined' || typeof Utl.stopMusic !== 'function') { + console.warn('⚠️ Utl音频框架未就绪'); + return false; + } + + Utl.stopMusic(); + return true; + } catch (e) { + console.error('❌ GameABCUtils.Audio.stopBGM 失败:', e); + return false; + } + }, + + /** + * 播放音效 + * @param {number} soundId - 音效资源ID + * @returns {boolean} 操作是否成功 + */ + playSound: function(soundId) { + try { + if (typeof soundId !== 'number') { + console.error('❌ GameABCUtils.Audio: 音效ID必须是数字:', soundId); + return false; + } + + if (typeof Utl === 'undefined' || typeof Utl.playSound !== 'function') { + console.warn('⚠️ Utl音频框架未就绪,无法播放音效'); + return false; + } + + Utl.playSound(soundId); + return true; + } catch (e) { + console.error('❌ GameABCUtils.Audio.playSound 失败:', e); + return false; + } + }, + + /** + * 停止音效 + * @returns {boolean} 操作是否成功 + */ + stopSound: function() { + try { + if (typeof Utl === 'undefined' || typeof Utl.stopSound !== 'function') { + console.warn('⚠️ Utl音频框架未就绪'); + return false; + } + + Utl.stopSound(); + return true; + } catch (e) { + console.error('❌ GameABCUtils.Audio.stopSound 失败:', e); + return false; + } + } + }; + + // ======================================================================== + // 性能优化器 + // ======================================================================== + var Performance = { + + /** + * 批量精灵属性操作 + * @param {Array} operations - 操作数组 [{spriteId, property, value, mode}, ...] + * @returns {number} 成功操作的数量 + */ + batchSpriteOperations: function(operations) { + if (!Array.isArray(operations)) { + console.error('❌ GameABCUtils.Performance: 操作参数必须是数组'); + return 0; + } + + var successCount = 0; + for (var i = 0; i < operations.length; i++) { + var op = operations[i]; + if (Sprite.setProperty(op.spriteId, op.property, op.value, op.mode)) { + successCount++; + } + } + + return successCount; + }, + + /** + * 创建延迟执行器 + * @param {number} delay - 延迟时间(毫秒) + * @returns {Function} 延迟执行函数 + */ + createDelayedExecutor: function(delay) { + delay = delay || 16; + var pending = []; + var timer = null; + + function execute() { + var operations = pending.slice(); + pending.length = 0; + + for (var i = 0; i < operations.length; i++) { + try { + operations[i](); + } catch (error) { + console.error('❌ 延迟操作执行失败:', error); + } + } + + timer = null; + } + + return function(operation) { + pending.push(operation); + + if (!timer) { + timer = setTimeout(execute, delay); + } + }; + } + }; + + // ======================================================================== + // 精灵工具类 + // ======================================================================== + var Utils = { + + /** + * 计算两个精灵之间的距离 + * @param {number} spriteId1 - 精灵1 ID + * @param {number} spriteId2 - 精灵2 ID + * @returns {number} 距离值,失败返回-1 + */ + getDistance: function(spriteId1, spriteId2) { + var x1 = Sprite.getProperty(spriteId1, 18); + var y1 = Sprite.getProperty(spriteId1, 19); + var x2 = Sprite.getProperty(spriteId2, 18); + var y2 = Sprite.getProperty(spriteId2, 19); + + if (x1 === null || y1 === null || x2 === null || y2 === null) { + console.error('❌ GameABCUtils.Utils: 无法获取精灵位置'); + return -1; + } + + var dx = x2 - x1; + var dy = y2 - y1; + return Math.sqrt(dx * dx + dy * dy); + }, + + /** + * 检查精灵是否在边界内 + * @param {number} spriteId - 精灵ID + * @param {Object} boundary - 边界 {x, y, width, height} + * @returns {boolean} 是否在边界内 + */ + isInBoundary: function(spriteId, boundary) { + if (!boundary) return false; + + var x = Sprite.getProperty(spriteId, 18); + var y = Sprite.getProperty(spriteId, 19); + var width = Sprite.getProperty(spriteId, 20); + var height = Sprite.getProperty(spriteId, 21); + + if (x === null || y === null || width === null || height === null) { + return false; + } + + return ( + x >= boundary.x && + y >= boundary.y && + x + width <= boundary.x + boundary.width && + y + height <= boundary.y + boundary.height + ); + }, + + /** + * 精灵状态快照 + * @param {number} spriteId - 精灵ID + * @returns {Object} 精灵状态快照 + */ + takeSnapshot: function(spriteId) { + return { + x: Sprite.getProperty(spriteId, 18), + y: Sprite.getProperty(spriteId, 19), + width: Sprite.getProperty(spriteId, 20), + height: Sprite.getProperty(spriteId, 21), + scale: Sprite.getProperty(spriteId, 33), + rotation: Sprite.getProperty(spriteId, 34), + opacity: Sprite.getProperty(spriteId, 35), + visible: Sprite.getProperty(spriteId, 37) + }; + }, + + /** + * 恢复精灵状态 + * @param {number} spriteId - 精灵ID + * @param {Object} snapshot - 状态快照 + * @returns {boolean} 操作是否成功 + */ + restoreSnapshot: function(spriteId, snapshot) { + if (!snapshot) { + console.error('❌ GameABCUtils.Utils: 快照数据无效'); + return false; + } + + var success = true; + + if (snapshot.x !== null && snapshot.x !== undefined) { + success = Sprite.setProperty(spriteId, 18, snapshot.x) && success; + } + if (snapshot.y !== null && snapshot.y !== undefined) { + success = Sprite.setProperty(spriteId, 19, snapshot.y) && success; + } + if (snapshot.width !== null && snapshot.width !== undefined) { + success = Sprite.setProperty(spriteId, 20, snapshot.width) && success; + } + if (snapshot.height !== null && snapshot.height !== undefined) { + success = Sprite.setProperty(spriteId, 21, snapshot.height) && success; + } + if (snapshot.scale !== null && snapshot.scale !== undefined) { + success = Sprite.setProperty(spriteId, 33, snapshot.scale) && success; + } + if (snapshot.rotation !== null && snapshot.rotation !== undefined) { + success = Sprite.setProperty(spriteId, 34, snapshot.rotation) && success; + } + if (snapshot.opacity !== null && snapshot.opacity !== undefined) { + success = Sprite.setProperty(spriteId, 35, snapshot.opacity) && success; + } + if (snapshot.visible !== null && snapshot.visible !== undefined) { + success = Sprite.setProperty(spriteId, 37, snapshot.visible) && success; + } + + return success; + } + }; + + // ======================================================================== + // 精灵绘图模块 - 在精灵上绘制图像 + // ======================================================================== + var Draw = { + + /** + * 在精灵上绘制图像 (底层封装) + * + * 用途说明: + * - 可以在一个精灵上叠加绘制其他图片资源 + * - 适合在牌面上绘制精牌标记、特效等 + * - 减少精灵数量,提高性能 + * + * @param {number} spriteId - 目标精灵ID (在此精灵上绘制) + * @param {number} imageId - 图片资源ID (要绘制的图片) + * @param {number} destX - 目标精灵上的X坐标 (相对于精灵左上角) + * @param {number} destY - 目标精灵上的Y坐标 (相对于精灵左上角) + * @param {number} destW - 绘制宽度 + * @param {number} destH - 绘制高度 + * @param {number} srcX - 源图片X偏移 (从图片哪里开始截取) + * @param {number} srcY - 源图片Y偏移 + * @param {number} srcW - 源图片截取宽度 + * @param {number} srcH - 源图片截取高度 + * @returns {boolean} 操作是否成功 + * + * @example + * // 在手牌精灵(1121)上绘制精牌标记(资源559) + * Draw.drawImage(1121, 559, 0, 0, 71, 100, 0, 0, 71, 100); + * + * // 在牌面左上角绘制小标记 + * Draw.drawImage(1121, 559, 5, 5, 20, 20, 0, 0, 20, 20); + */ + drawImage: function(spriteId, imageId, destX, destY, destW, destH, srcX, srcY, srcW, srcH) { + if (typeof spriteId !== 'number' || spriteId <= 0) { + console.error('❌ GameABCUtils.Draw: 无效的精灵ID:', spriteId); + return false; + } + + if (typeof imageId !== 'number' || imageId <= 0) { + console.error('❌ GameABCUtils.Draw: 无效的图片资源ID:', imageId); + return false; + } + + // 检查 ifast_mydrawbmp 接口是否可用 + if (typeof ifast_mydrawbmp !== 'function') { + console.error('❌ GameABCUtils.Draw: ifast_mydrawbmp 接口不可用'); + return false; + } + + try { + // ifast_mydrawbmp(spid, recid, sp_x, sp_y, sp_w, sp_h, bmp_x, bmp_y, bmp_w, bmp_h) + // spid: 目标精灵ID + // recid: 图片资源ID + // sp_x, sp_y: 在精灵上的绘制位置 (相对精灵左上角) + // sp_w, sp_h: 绘制的宽度和高度 + // bmp_x, bmp_y: 源图片的起始位置 (截取区域) + // bmp_w, bmp_h: 源图片的截取宽高 + ifast_mydrawbmp(spriteId, imageId, destX, destY, destW, destH, srcX, srcY, srcW, srcH); + return true; + } catch (error) { + console.error('❌ GameABCUtils.Draw.drawImage 失败:', error); + return false; + } + }, + + /** + * 在精灵上绘制完整图片 (简化版) + * + * @param {number} spriteId - 目标精灵ID + * @param {number} imageId - 图片资源ID + * @param {number} x - 绘制位置X (相对精灵左上角) + * @param {number} y - 绘制位置Y (相对精灵左上角) + * @param {number} width - 绘制宽度 + * @param {number} height - 绘制高度 + * @returns {boolean} 操作是否成功 + * + * @example + * // 在手牌精灵上绘制精牌标记,覆盖整个牌面 + * Draw.drawImageSimple(1121, 559, 0, 0, 71, 100); + */ + drawImageSimple: function(spriteId, imageId, x, y, width, height) { + return this.drawImage(spriteId, imageId, x, y, width, height, 0, 0, width, height); + }, + + /** + * 在精灵上绘制居中图片 + * + * @param {number} spriteId - 目标精灵ID + * @param {number} imageId - 图片资源ID + * @param {number} imgWidth - 要绘制的图片宽度 + * @param {number} imgHeight - 要绘制的图片高度 + * @returns {boolean} 操作是否成功 + * + * @example + * // 在手牌精灵中央绘制30x30的精牌标记 + * Draw.drawImageCentered(1121, 559, 30, 30); + */ + drawImageCentered: function(spriteId, imageId, imgWidth, imgHeight) { + // 获取目标精灵的尺寸 + var spriteW = Sprite.getProperty(spriteId, 20); + var spriteH = Sprite.getProperty(spriteId, 21); + + if (spriteW === null || spriteH === null) { + console.error('❌ GameABCUtils.Draw: 无法获取精灵尺寸'); + return false; + } + + // 计算居中位置 + var x = Math.floor((spriteW - imgWidth) / 2); + var y = Math.floor((spriteH - imgHeight) / 2); + + return this.drawImageSimple(spriteId, imageId, x, y, imgWidth, imgHeight); + }, + + /** + * 在精灵角落绘制图片 + * + * @param {number} spriteId - 目标精灵ID + * @param {number} imageId - 图片资源ID + * @param {string} corner - 角落位置: 'topLeft', 'topRight', 'bottomLeft', 'bottomRight' + * @param {number} imgWidth - 图片宽度 + * @param {number} imgHeight - 图片高度 + * @param {number} [offsetX] - X偏移量 (可选,默认0) + * @param {number} [offsetY] - Y偏移量 (可选,默认0) + * @returns {boolean} 操作是否成功 + * + * @example + * // 在手牌右上角绘制精牌标记 + * Draw.drawImageAtCorner(1121, 559, 'topRight', 20, 20, -2, 2); + */ + drawImageAtCorner: function(spriteId, imageId, corner, imgWidth, imgHeight, offsetX, offsetY) { + offsetX = offsetX || 0; + offsetY = offsetY || 0; + + var spriteW = Sprite.getProperty(spriteId, 20); + var spriteH = Sprite.getProperty(spriteId, 21); + + if (spriteW === null || spriteH === null) { + console.error('❌ GameABCUtils.Draw: 无法获取精灵尺寸'); + return false; + } + + var x = 0; + var y = 0; + + switch (corner) { + case 'topLeft': + x = offsetX; + y = offsetY; + break; + case 'topRight': + x = spriteW - imgWidth + offsetX; + y = offsetY; + break; + case 'bottomLeft': + x = offsetX; + y = spriteH - imgHeight + offsetY; + break; + case 'bottomRight': + x = spriteW - imgWidth + offsetX; + y = spriteH - imgHeight + offsetY; + break; + default: + console.error('❌ GameABCUtils.Draw: 无效的角落位置:', corner); + return false; + } + + return this.drawImageSimple(spriteId, imageId, x, y, imgWidth, imgHeight); + } + }; + + // ======================================================================== + // 裁剪区域模块 - 设置精灵可视区域 + // ======================================================================== + var Clip = { + + /** + * 已注册的裁剪区域配置 + * key: 容器精灵ID + * value: { x, y, w, h } 裁剪区域 + */ + _clipConfigs: {}, + + /** + * 注册裁剪区域 + * 在 utlgamemydrawbegin 回调中会根据注册的配置自动应用裁剪 + * + * @param {number} containerId - 容器精灵ID + * @param {number} x - 裁剪区域左上角X坐标(屏幕坐标) + * @param {number} y - 裁剪区域左上角Y坐标(屏幕坐标) + * @param {number} w - 裁剪区域宽度 + * @param {number} h - 裁剪区域高度 + * + * @example + * // 注册小局结算输家列表的裁剪区域 + * Clip.register(2519, 100, 200, 600, 300); + */ + register: function(containerId, x, y, w, h) { + if (typeof containerId !== 'number' || containerId <= 0) { + console.error('❌ GameABCUtils.Clip: 无效的容器精灵ID:', containerId); + return false; + } + + this._clipConfigs[containerId] = { + x: x, + y: y, + w: w, + h: h + }; + + // console.log('📐 注册裁剪区域: 容器=' + containerId + + // ', 区域=(' + x + ',' + y + ',' + w + ',' + h + ')'); + return true; + }, + + /** + * 注销裁剪区域 + * + * @param {number} containerId - 容器精灵ID + */ + unregister: function(containerId) { + if (this._clipConfigs[containerId]) { + delete this._clipConfigs[containerId]; + // console.log('📐 注销裁剪区域: 容器=' + containerId); + } + }, + + /** + * 清空所有裁剪区域 + */ + clear: function() { + this._clipConfigs = {}; + // console.log('📐 清空所有裁剪区域'); + }, + + /** + * 检查精灵是否已注册裁剪区域 + * + * @param {number} containerId - 容器精灵ID + * @returns {boolean} + */ + isRegistered: function(containerId) { + return !!this._clipConfigs[containerId]; + }, + + /** + * 获取裁剪区域配置 + * + * @param {number} containerId - 容器精灵ID + * @returns {Object|null} { x, y, w, h } 或 null + */ + getConfig: function(containerId) { + return this._clipConfigs[containerId] || null; + }, + + /** + * 获取所有已注册的容器精灵ID列表 + * + * @returns {Array} + */ + getRegisteredIds: function() { + var ids = []; + for (var id in this._clipConfigs) { + if (this._clipConfigs.hasOwnProperty(id)) { + ids.push(parseInt(id, 10)); + } + } + return ids; + }, + + /** + * 应用裁剪区域(在 utlgamemydrawbegin 中调用) + * + * @param {number} spid - 当前绘制的精灵ID + * @returns {boolean} 是否应用了裁剪 + */ + applyIfRegistered: function(spid) { + var config = this._clipConfigs[spid]; + if (config) { + try { + // set_clip(ctx, mode, x, y, w, h) + // ctx=0 表示使用全局画布 + // mode=0 表示矩形裁剪 + set_clip(0, 0, config.x, config.y, config.w, config.h); + return true; + } catch (error) { + console.error('❌ GameABCUtils.Clip.applyIfRegistered 失败:', error); + return false; + } + } + return false; + }, + + /** + * 批量检查并应用裁剪(在 utlgamemydrawbegin 中调用) + * + * @param {number} spid - 当前绘制的精灵ID + * @returns {boolean} 是否应用了裁剪 + */ + checkAndApply: function(spid) { + return this.applyIfRegistered(spid); + } + }; + + // ======================================================================== + // 属性码常量 - 供外部参考 + // ======================================================================== + var PropertyCodes = { + IMAGE: 1, // 图片资源 + TEXT: 7, // 文字内容 + FONT_SIZE: 8, // 字体大小 + MOVE_X: 18, // X坐标 + MOVE_Y: 19, // Y坐标 + WIDTH: 20, // 宽度 + HEIGHT: 21, // 高度 + SCALE: 33, // 缩放 (百分比, 100=100%) + ROTATION: 34, // 旋转 (角度) + OPACITY: 35, // 透明度 (0-255) + COLOR: 36, // 颜色混合 + VISIBLE: 37, // 可见性 (0/1) + TOUCHABLE: 41, // 可触摸性 (0=可触摸, 1=穿透) + FRAME: 43, // 帧号 (多帧图片) + TIMER: 47 // 定时器 + }; + + // ======================================================================== + // 公共接口 + // ======================================================================== + return { + // 核心模块 + Sprite: Sprite, + Group: Group, + Layer: Layer, + Audio: Audio, + Performance: Performance, + Utils: Utils, + Draw: Draw, + Clip: Clip, + + // 常量 + PropertyCodes: PropertyCodes, + + // 版本信息 + version: '2.1.0', + + // 初始化检查 + init: function() { + // console.log('🚀 GameABCUtils 框架层工具库已加载 v' + this.version); + + // 检查依赖 + var dependencies = ['set_self', 'get_self', 'set_group', 'ifast_getobj', 'ifast_mydrawbmp']; + var missing = []; + + for (var i = 0; i < dependencies.length; i++) { + if (typeof window[dependencies[i]] === 'undefined') { + missing.push(dependencies[i]); + } + } + + if (missing.length > 0) { + console.warn('⚠️ 缺少gameabc依赖接口:', missing.join(', ')); + console.warn('请确保已正确加载 gameabc.min.js'); + } + + // 检查Utl接口 + if (typeof Utl === 'undefined') { + console.warn('⚠️ Utl音频接口不可用,音频功能将受限'); + } + + // 检查set_level接口 + if (typeof set_level === 'undefined') { + console.warn('⚠️ set_level接口不可用,图层操作将受限'); + } + + return missing.length === 0; + } + }; +})(); + +// 自动初始化 +if (typeof window !== 'undefined') { + GameABCUtils.init(); +} diff --git a/client/js/gameabc-framework/core/SpriteManager.js b/client/js/gameabc-framework/core/SpriteManager.js new file mode 100644 index 0000000..7b5b30a --- /dev/null +++ b/client/js/gameabc-framework/core/SpriteManager.js @@ -0,0 +1,1190 @@ +/** + * SpriteManager - 精灵属性管理器 (业务层封装) + * + * ============================================================================ + * 架构分层说明 + * ============================================================================ + * + * ┌─────────────────────────────────────────────────────────────┐ + * │ 业务层 (UI组件) │ + * │ JingCardView, DiceView, SettleUI, etc. │ + * │ 只调用 SpriteManager │ + * └─────────────────────────────────────────────────────────────┘ + * │ + * ▼ + * ┌─────────────────────────────────────────────────────────────┐ + * │ ★ SpriteManager.js (本文件 - 业务层封装) ★ │ + * │ 职责: │ + * │ - 资源ID范围验证 (精灵1001+, 图层101-200/301+, 群组201+) │ + * │ - 业务级高级API (setPosition, setScale, setText等) │ + * │ - 值转换 (0-1透明度转0-255, 缩放比例转百分比) │ + * │ 调用: GameABCUtils.Sprite.setProperty/getProperty │ + * └─────────────────────────────────────────────────────────────┘ + * │ + * ▼ + * ┌─────────────────────────────────────────────────────────────┐ + * │ GameABCUtils.js (框架层封装) │ + * │ 职责: 唯一直接调用gameabc原生API、底层原子操作 │ + * │ 直接调用: set_self, get_self, set_group, set_level, etc. │ + * └─────────────────────────────────────────────────────────────┘ + * │ + * ▼ + * ┌─────────────────────────────────────────────────────────────┐ + * │ gameabc.min.js (引擎原生API) │ + * └─────────────────────────────────────────────────────────────┘ + * + * ============================================================================ + * 使用约束 + * ============================================================================ + * + * ⚠️ UI组件代码只能调用本模块(SpriteManager),不能直接调用: + * - GameABCUtils (框架层,由本模块调用) + * - gameabc原生API (set_self, get_self等,只有GameABCUtils可以调用) + * + * ============================================================================ + * 核心职责 + * ============================================================================ + * + * - 显示/隐藏精灵(show, hide, setVisible) + * - 设置/获取精灵位置(setPosition, getPosition, moveBy) + * - 设置/获取精灵大小(setSize, getSize) + * - 设置/获取精灵变换(setScale, getScale, setRotation, getRotation) + * - 设置/获取精灵透明度(setOpacity, getOpacity, setAlpha, getAlpha) + * - 设置精灵颜色混合(setColor) + * - 设置文字内容和样式(setText, setFontSize, setTextWithWidth) + * - 设置图片资源(setImage, setFrame, setNumberImage) + * - 设置精灵交互性(setTouchable) + * - 设置精灵定时器(setTimer) + * - 图层批量操作(showLayer, hideLayer, setLayerVisible) + * - 群组批量操作(showGroup, hideGroup, setGroupVisible) + * - 批量属性更新(updateSprite) + * - 精灵存在性检查(exists) + * + * ============================================================================ + * 资源范围约束 (参见 docs/important/client/友乐游戏引擎精灵与资源管理接口规范.md) + * ============================================================================ + * + * - 精灵ID: 子游戏使用 1001-3000 + * - 图层ID: 子游戏使用 101-200, 301-400+ + * - 群组ID: 子游戏使用 201+ + * - 图片资源ID: 子游戏使用 501+ + * - 音频资源ID: 子游戏使用 101+ + * + * ============================================================================ + * 依赖 + * ============================================================================ + * + * - GameABCUtils (必须先加载) + * - SpriteConstants (推荐先加载,用于ID常量定义) + * + * @version 3.0.0 (架构重构版 - 明确业务层定位) + * @date 2025-12-05 + * + * ============================================================================ + * @guide 开发指南 - 常用调用模式 + * ============================================================================ + * + * 【精灵显隐】 + * SpriteManager.show(spriteId); // 显示精灵 + * SpriteManager.hide(spriteId); // 隐藏精灵(不销毁) + * SpriteManager.setVisible(spriteId, true); // 等同于 show/hide + * + * 【帧动画/图片切换】 + * // 切换精灵的帧(图集中的第N帧,0开始) + * SpriteManager.setFrame(spriteId, 0); // 显示第1帧(牌背) + * SpriteManager.setFrame(spriteId, 5); // 显示第6帧(某张牌面) + * + * // 切换图片资源 + * SpriteManager.setImage(spriteId, ImageResources.CARD_BACK); + * + * 【位置/缩放/旋转】 + * SpriteManager.setPosition(spriteId, x, y); // 设置位置(像素坐标) + * SpriteManager.setScale(spriteId, 1.2); // 放大120% + * SpriteManager.setRotation(spriteId, 90); // 旋转90度 + * SpriteManager.setOpacity(spriteId, 0.5); // 半透明(0-1,自动转换) + * + * 【文字】 + * SpriteManager.setText(spriteId, '5'); // 设置文字内容 + * SpriteManager.setText(spriteId, String(score)); // 建议转 string + * + * 【图层/群组批量操作】 + * SpriteManager.showLayer(102); // 显示整个图层(102号图层所有精灵) + * SpriteManager.hideLayer(103); // 隐藏整个图层 + * SpriteManager.showGroup(201); // 显示精灵群组 + * SpriteManager.hideGroup(202); // 隐藏精灵群组 + * + * 【典型组合模式 - 手牌显示】 + * for (var i = 0; i < handCards.length; i++) { + * var spriteId = handSpriteIds[i]; + * var card = handCards[i]; + * SpriteManager.show(spriteId); + * SpriteManager.setFrame(spriteId, card.code - 1); // frame = code-1 + * } + * + * 【典型组合模式 - 弃牌区刷新】 + * // 先隐藏所有弃牌位,再只显示有牌的位 + * for (var i = 0; i < maxDiscards; i++) { + * SpriteManager.hide(discardSpriteIds[i]); + * } + * for (var j = 0; j < discards.length; j++) { + * var sid = discardSpriteIds[j]; + * SpriteManager.show(sid); + * SpriteManager.setFrame(sid, discards[j].code - 1); + * } + * + * ⚠️ 注意:SpriteManager 操作的是编辑器中预定义的静态精灵 + * 动态复制精灵(SpriteCopyUtils创建的)用同一套API,但 spriteId 是字符串 + */ + +var SpriteManager = (function() { + 'use strict'; + + // ==================== 私有变量 ==================== + + /** + * 资源范围常量 + */ + var RESOURCE_RANGES = { + SPRITE_MIN: 1001, // 精灵ID最小值 + LAYER_NORMAL_MIN: 101, // 普通图层最小值 + LAYER_NORMAL_MAX: 200, // 普通图层最大值 + LAYER_POPUP_MIN: 301, // 弹窗图层最小值 + GROUP_MIN: 201 // 群组ID最小值 + }; + + /** + * GameABC引擎属性码 + */ + var PROPERTY_CODES = { + IMAGE: 1, // 图片资源 + TEXT: 7, // 文字内容 + FONT_SIZE: 8, // 字体大小 + MOVE_X: 18, // X轴移动 + MOVE_Y: 19, // Y轴移动 + WIDTH: 20, // 宽度 + HEIGHT: 21, // 高度 + SCALE: 33, // 缩放 + ROTATION: 34, // 旋转 + OPACITY: 35, // 透明度 + COLOR: 36, // 颜色混合 + VISIBLE: 37, // 可见性 + TOUCHABLE: 41, // 可触摸性 + TIMER: 47 // 定时器 + }; + + /** + * 操作模式 + */ + var ACTION_MODES = { + SET: 0, // 设置 + ADD: 1, // 增加 + SUBTRACT: 2, // 减少 + MULTIPLY: 3, // 乘以 + DIVIDE: 4 // 除以 + }; + + /** + * 是否已初始化 + */ + var _isInitialized = false; + + /** + * 复制精灵ID格式正则表达式 + * 格式: "容器ID" + "add" + "tag",如 "2836add2000" + */ + var COPIED_SPRITE_ID_PATTERN = /^\d+add\d+$/; + + // ==================== 私有方法 ==================== + + /** + * 验证精灵ID是否有效 + * + * 支持两种精灵ID格式: + * 1. 数字ID: 普通精灵,由编辑器创建,ID >= 1001 + * 2. 字符串ID: 复制精灵,由 SpriteCopyUtils 动态创建 + * 格式: "容器ID" + "add" + "tag",如 "2836add2000" + * + * @param {Number|String} spriteId - 精灵ID + * @returns {Boolean} 是否有效 + * @private + */ + function _validateSpriteId(spriteId) { + // 数字类型:普通精灵ID + if (typeof spriteId === 'number') { + // if (spriteId < RESOURCE_RANGES.SPRITE_MIN) { + // console.error('❌ SpriteManager: 无效的精灵ID:', spriteId, + // '(必须 >= ' + RESOURCE_RANGES.SPRITE_MIN + ')'); + // return false; + // } + return true; + } + + // 字符串类型:复制精灵ID (格式: "容器IDadd标签") + if (typeof spriteId === 'string' && COPIED_SPRITE_ID_PATTERN.test(spriteId)) { + return true; + } + + // console.error('❌ SpriteManager: 无效的精灵ID:', spriteId, + // '(必须是数字 >= ' + RESOURCE_RANGES.SPRITE_MIN + ' 或复制精灵格式如 "2836add2000")'); + return false; + } + + /** + * 验证图层ID是否有效 + * @param {Number} layerId - 图层ID + * @returns {Boolean} 是否有效 + * @private + */ + function _validateLayerId(layerId) { + // if (typeof layerId !== 'number') { + // console.error('❌ SpriteManager: 图层ID必须是数字:', layerId); + // return false; + // } + + // var isNormalLayer = layerId >= RESOURCE_RANGES.LAYER_NORMAL_MIN && + // layerId <= RESOURCE_RANGES.LAYER_NORMAL_MAX; + // var isPopupLayer = layerId >= RESOURCE_RANGES.LAYER_POPUP_MIN; + + // if (!isNormalLayer && !isPopupLayer) { + // console.error('❌ SpriteManager: 无效的图层ID:', layerId, + // '(必须在 101-200 或 301+ 范围内)'); + // return false; + // } + + return true; + } + + /** + * 验证群组ID是否有效 + * @param {Number} groupId - 群组ID + * @returns {Boolean} 是否有效 + * @private + */ + function _validateGroupId(groupId) { + // if (typeof groupId !== 'number' || groupId < RESOURCE_RANGES.GROUP_MIN) { + // console.error('❌ SpriteManager: 无效的群组ID:', groupId, + // '(必须 >= ' + RESOURCE_RANGES.GROUP_MIN + ')'); + // return false; + // } + return true; + } + + // ==================== 公共API ==================== + + var publicAPI = { + + /** + * 初始化SpriteManager + * @returns {Boolean} 是否成功 + */ + init: function() { + if (_isInitialized) { + console.warn('⚠️ SpriteManager: 已初始化,跳过重复初始化'); + return true; + } + + console.log('🎨 SpriteManager: 开始初始化 (重构版 v2.0)'); + + // 检查依赖 + if (typeof GameABCUtils === 'undefined') { + console.error('❌ SpriteManager: 缺少依赖 GameABCUtils'); + return false; + } + + _isInitialized = true; + console.log('✅ SpriteManager: 初始化完成'); + console.log('ℹ️ SpriteManager: 设计原则 - 精灵由编辑器创建,代码只操作属性'); + + return true; + }, + + // ==================== 显示控制 ==================== + + /** + * 显示精灵 + * @param {Number} spriteId - 精灵ID + * @returns {Boolean} 是否成功 + */ + show: function(spriteId) { + if (!_validateSpriteId(spriteId)) return false; + + try { + GameABCUtils.Sprite.setProperty(spriteId, PROPERTY_CODES.VISIBLE, 1, ACTION_MODES.SET); + return true; + } catch (error) { + console.error('❌ SpriteManager.show 失败:', error); + return false; + } + }, + + /** + * 隐藏精灵 + * @param {Number} spriteId - 精灵ID + * @returns {Boolean} 是否成功 + */ + hide: function(spriteId) { + if (!_validateSpriteId(spriteId)) return false; + + try { + GameABCUtils.Sprite.setProperty(spriteId, PROPERTY_CODES.VISIBLE, 0, ACTION_MODES.SET); + return true; + } catch (error) { + console.error('❌ SpriteManager.hide 失败:', error); + return false; + } + }, + + /** + * 设置精灵可见性 + * @param {Number} spriteId - 精灵ID + * @param {Boolean} visible - 是否可见 + * @returns {Boolean} 是否成功 + */ + setVisible: function(spriteId, visible) { + return visible ? this.show(spriteId) : this.hide(spriteId); + }, + + /** + * 获取精灵可见性 + * @param {Number} spriteId - 精灵ID + * @returns {Boolean} 是否可见 (如果获取失败返回false) + */ + isVisible: function(spriteId) { + if (!_validateSpriteId(spriteId)) return false; + + try { + var visible = GameABCUtils.Sprite.getProperty(spriteId, PROPERTY_CODES.VISIBLE); + return visible === 1; + } catch (error) { + console.error('❌ SpriteManager.isVisible 失败:', error); + return false; + } + }, + + /** + * 检查精灵是否存在 + * @param {Number|String} spriteId - 精灵ID(支持数字ID和复制精灵字符串ID) + * @returns {Boolean} 精灵是否存在 + */ + exists: function(spriteId) { + // 使用统一的验证逻辑 + if (!_validateSpriteId(spriteId)) { + return false; + } + + try { + return GameABCUtils.Sprite.exists(spriteId); + } catch (error) { + console.error('❌ SpriteManager.exists 失败:', error); + return false; + } + }, + + // ==================== 位置控制 ==================== + + /** + * 设置精灵位置 + * @param {Number} spriteId - 精灵ID + * @param {Number|null} x - X坐标 (null/undefined表示不改变) + * @param {Number|null} y - Y坐标 (null/undefined表示不改变) + * @returns {Boolean} 是否成功 + */ + setPosition: function(spriteId, x, y) { + if (!_validateSpriteId(spriteId)) return false; + + try { + if (x !== null && x !== undefined) { + GameABCUtils.Sprite.setProperty(spriteId, PROPERTY_CODES.MOVE_X, x, ACTION_MODES.SET); + } + if (y !== null && y !== undefined) { + GameABCUtils.Sprite.setProperty(spriteId, PROPERTY_CODES.MOVE_Y, y, ACTION_MODES.SET); + } + return true; + } catch (error) { + console.error('❌ SpriteManager.setPosition 失败:', error); + return false; + } + }, + + /** + * 相对移动精灵 + * @param {Number} spriteId - 精灵ID + * @param {Number} dx - X轴偏移 + * @param {Number} dy - Y轴偏移 + * @returns {Boolean} 是否成功 + */ + moveBy: function(spriteId, dx, dy) { + if (!_validateSpriteId(spriteId)) return false; + + try { + if (dx !== 0) { + GameABCUtils.Sprite.setProperty(spriteId, PROPERTY_CODES.MOVE_X, dx, ACTION_MODES.ADD); + } + if (dy !== 0) { + GameABCUtils.Sprite.setProperty(spriteId, PROPERTY_CODES.MOVE_Y, dy, ACTION_MODES.ADD); + } + return true; + } catch (error) { + console.error('❌ SpriteManager.moveBy 失败:', error); + return false; + } + }, + + // ==================== 大小控制 ==================== + + /** + * 设置精灵大小 + * @param {Number} spriteId - 精灵ID + * @param {Number|null} width - 宽度 (null表示不改变) + * @param {Number|null} height - 高度 (null表示不改变) + * @returns {Boolean} 是否成功 + */ + setSize: function(spriteId, width, height) { + if (!_validateSpriteId(spriteId)) return false; + + try { + if (width !== null && width !== undefined) { + GameABCUtils.Sprite.setProperty(spriteId, PROPERTY_CODES.WIDTH, width, ACTION_MODES.SET); + } + if (height !== null && height !== undefined) { + GameABCUtils.Sprite.setProperty(spriteId, PROPERTY_CODES.HEIGHT, height, ACTION_MODES.SET); + } + return true; + } catch (error) { + console.error('❌ SpriteManager.setSize 失败:', error); + return false; + } + }, + + /** + * 设置精灵宽度(仅改变宽度,不影响高度) + * @param {Number} spriteId - 精灵ID + * @param {Number} width - 宽度 + * @returns {Boolean} 是否成功 + */ + setWidth: function(spriteId, width) { + return this.setSize(spriteId, width, null); + }, + + /** + * 设置精灵高度(仅改变高度,不影响宽度) + * @param {Number} spriteId - 精灵ID + * @param {Number} height - 高度 + * @returns {Boolean} 是否成功 + */ + setHeight: function(spriteId, height) { + return this.setSize(spriteId, null, height); + }, + + // ==================== 变换控制 ==================== + + /** + * 设置精灵缩放 + * @param {Number} spriteId - 精灵ID + * @param {Number} scale - 缩放比例 (0.5 = 50%, 1.0 = 100%, 2.0 = 200%) + * @returns {Boolean} 是否成功 + */ + setScale: function(spriteId, scale) { + if (!_validateSpriteId(spriteId)) return false; + + try { + var scaleValue = Math.round(scale * 100); // 引擎使用百分比 + GameABCUtils.Sprite.setProperty(spriteId, PROPERTY_CODES.SCALE, scaleValue, ACTION_MODES.SET); + return true; + } catch (error) { + console.error('❌ SpriteManager.setScale 失败:', error); + return false; + } + }, + + /** + * 设置精灵旋转角度 + * @param {Number} spriteId - 精灵ID + * @param {Number} rotation - 旋转角度 (0-360度) + * @returns {Boolean} 是否成功 + */ + setRotation: function(spriteId, rotation) { + if (!_validateSpriteId(spriteId)) return false; + + try { + GameABCUtils.Sprite.setProperty(spriteId, PROPERTY_CODES.ROTATION, rotation, ACTION_MODES.SET); + return true; + } catch (error) { + console.error('❌ SpriteManager.setRotation 失败:', error); + return false; + } + }, + + /** + * 设置精灵透明度 + * @param {Number} spriteId - 精灵ID + * @param {Number} opacity - 透明度 (0.0-1.0) + * @returns {Boolean} 是否成功 + */ + setOpacity: function(spriteId, opacity) { + if (!_validateSpriteId(spriteId)) return false; + + try { + var opacityValue = Math.round(opacity * 255); // 引擎使用0-255 + GameABCUtils.Sprite.setProperty(spriteId, PROPERTY_CODES.OPACITY, opacityValue, ACTION_MODES.SET); + return true; + } catch (error) { + console.error('❌ SpriteManager.setOpacity 失败:', error); + return false; + } + }, + + /** + * 设置精灵透明度(setOpacity的别名) + * @param {Number} spriteId - 精灵ID + * @param {Number} alpha - 透明度 (0.0-1.0) + * @returns {Boolean} 是否成功 + */ + setAlpha: function(spriteId, alpha) { + return this.setOpacity(spriteId, alpha); + }, + + /** + * 设置精灵颜色混合 + * @param {Number} spriteId - 精灵ID + * @param {Number} color - 颜色值 (0xRRGGBB) + * @returns {Boolean} 是否成功 + */ + setColor: function(spriteId, color) { + if (!_validateSpriteId(spriteId)) return false; + + try { + GameABCUtils.Sprite.setProperty(spriteId, PROPERTY_CODES.COLOR, color, ACTION_MODES.SET); + return true; + } catch (error) { + console.error('❌ SpriteManager.setColor 失败:', error); + return false; + } + }, + + // ==================== 文字控制 ==================== + + /** + * 设置文字内容 + * @param {Number} spriteId - 精灵ID + * @param {String} text - 文字内容 + * @returns {Boolean} 是否成功 + */ + setText: function(spriteId, text) { + if (!_validateSpriteId(spriteId)) return false; + + try { + GameABCUtils.Sprite.setProperty(spriteId, PROPERTY_CODES.TEXT, text, ACTION_MODES.SET); + return true; + } catch (error) { + console.error('❌ SpriteManager.setText 失败:', error); + return false; + } + }, + + /** + * 设置字体大小 + * @param {Number} spriteId - 精灵ID + * @param {Number} fontSize - 字体大小 + * @returns {Boolean} 是否成功 + */ + setFontSize: function(spriteId, fontSize) { + if (!_validateSpriteId(spriteId)) return false; + + try { + GameABCUtils.Sprite.setProperty(spriteId, PROPERTY_CODES.FONT_SIZE, fontSize, ACTION_MODES.SET); + return true; + } catch (error) { + console.error('❌ SpriteManager.setFontSize 失败:', error); + return false; + } + }, + + // ==================== 图片控制 ==================== + + /** + * 设置图片资源 + * @param {Number} spriteId - 精灵ID + * @param {Number} imageId - 图片资源ID + * @returns {Boolean} 是否成功 + */ + setImage: function(spriteId, imageId) { + if (!_validateSpriteId(spriteId)) return false; + + try { + GameABCUtils.Sprite.setProperty(spriteId, PROPERTY_CODES.IMAGE, imageId, ACTION_MODES.SET); + return true; + } catch (error) { + console.error('❌ SpriteManager.setImage 失败:', error); + return false; + } + }, + + /** + * 设置多帧图片的当前帧 + * + * 注意:在友乐游戏引擎中,多帧图片由一个图片资源包含多帧内容 + * 通过属性码43来切换显示不同的帧,而不是改变图片资源ID + * + * 前提条件: + * - 精灵必须已在编辑器中设置了多帧图片资源 + * - 例如:精灵2010设置图片资源=501(包含4帧) + * + * @param {Number} spriteId - 精灵ID + * @param {Number} frameNumber - 帧号(从1开始) + * @returns {Boolean} 是否成功 + * + * 使用示例: + * // 在编辑器中:精灵2010设置图片资源=501(4帧图片) + * SpriteManager.setFrame(2010, 1); // 显示第1帧(单选未选中) + * SpriteManager.setFrame(2010, 2); // 显示第2帧(单选选中) + * SpriteManager.setFrame(2010, 3); // 显示第3帧(复选未选中) + * SpriteManager.setFrame(2010, 4); // 显示第4帧(复选选中) + */ + setFrame: function(spriteId, frameNumber) { + if (!_validateSpriteId(spriteId)) return false; + + if (typeof frameNumber !== 'number' || frameNumber < 1) { + console.error('❌ SpriteManager.setFrame: 帧号必须是正整数:', frameNumber); + return false; + } + + try { + // 使用属性码43设置帧号 + GameABCUtils.Sprite.setProperty(spriteId, 43, frameNumber, ACTION_MODES.SET); + return true; + } catch (error) { + console.error('❌ SpriteManager.setFrame 失败:', error); + return false; + } + }, + + // ==================== 绘图控制 ==================== + + /** + * 在精灵上绘制图片(覆盖绘制) + * + * 使用场景: + * - 在牌面精灵上绘制精牌标记 + * - 在UI精灵上绘制动态内容 + * - 实现精灵的覆盖效果 + * + * 注意: + * - 此方法会在精灵的绘制回调中被调用 + * - 绘制内容会覆盖在精灵原有图片之上 + * - 绘制内容不会改变精灵的原始图片资源 + * + * @param {Number} spriteId - 目标精灵ID(在哪个精灵上绘制) + * @param {Number} imageId - 要绘制的图片资源ID + * @param {Number} destX - 目标X坐标(在精灵内的相对坐标) + * @param {Number} destY - 目标Y坐标(在精灵内的相对坐标) + * @param {Number} destWidth - 目标绘制宽度 + * @param {Number} destHeight - 目标绘制高度 + * @returns {Boolean} 是否成功 + * + * @example + * // 在精灵1121上绘制资源559,覆盖整个精灵区域 + * var size = SpriteManager.getSize(1121); + * SpriteManager.drawImage(1121, 559, 0, 0, size.width, size.height); + */ + drawImage: function(spriteId, imageId, destX, destY, destWidth, destHeight) { + if (!_validateSpriteId(spriteId)) return false; + + // 参数验证 + if (typeof imageId !== 'number' || imageId <= 0) { + console.error('❌ SpriteManager.drawImage: 图片资源ID必须是正数:', imageId); + return false; + } + + if (typeof destX !== 'number' || typeof destY !== 'number') { + console.error('❌ SpriteManager.drawImage: 坐标必须是数字'); + return false; + } + + if (typeof destWidth !== 'number' || destWidth <= 0 || + typeof destHeight !== 'number' || destHeight <= 0) { + console.error('❌ SpriteManager.drawImage: 宽度和高度必须是正数'); + return false; + } + + try { + // 调用 GameABCUtils.Draw.drawImageSimple + // 这是简化版绘图接口,自动使用源图片的完整尺寸 + GameABCUtils.Draw.drawImageSimple(spriteId, imageId, destX, destY, destWidth, destHeight); + return true; + } catch (error) { + console.error('❌ SpriteManager.drawImage 失败:', error); + return false; + } + }, + + // ==================== 交互控制 ==================== + + /** + * 设置精灵可触摸性 + * @param {Number} spriteId - 精灵ID + * @param {Boolean} touchable - 是否可触摸 + * @returns {Boolean} 是否成功 + */ + setTouchable: function(spriteId, touchable) { + if (!_validateSpriteId(spriteId)) return false; + + try { + GameABCUtils.Sprite.setProperty(spriteId, PROPERTY_CODES.TOUCHABLE, touchable ? 1 : 0, ACTION_MODES.SET); + return true; + } catch (error) { + console.error('❌ SpriteManager.setTouchable 失败:', error); + return false; + } + }, + + // ==================== 批量属性更新 ==================== + + /** + * 批量更新精灵属性 + * @param {Number} spriteId - 精灵ID + * @param {Object} properties - 属性对象 + * @example + * updateSprite(1001, { + * visible: true, + * x: 100, + * y: 200, + * text: 'Hello', + * fontSize: 24 + * }); + * @returns {Boolean} 是否成功 + */ + updateSprite: function(spriteId, properties) { + if (!_validateSpriteId(spriteId)) return false; + if (!properties || typeof properties !== 'object') { + console.error('❌ SpriteManager.updateSprite: properties必须是对象'); + return false; + } + + var success = true; + + // 显示/隐藏 + if ('visible' in properties) { + success = this.setVisible(spriteId, properties.visible) && success; + } + + // 位置 + if ('x' in properties && 'y' in properties) { + success = this.setPosition(spriteId, properties.x, properties.y) && success; + } else if ('x' in properties || 'y' in properties) { + console.warn('⚠️ SpriteManager.updateSprite: 建议同时设置x和y'); + } + + // 大小 + if ('width' in properties || 'height' in properties) { + success = this.setSize(spriteId, properties.width, properties.height) && success; + } + + // 变换 + if ('scale' in properties) { + success = this.setScale(spriteId, properties.scale) && success; + } + if ('rotation' in properties) { + success = this.setRotation(spriteId, properties.rotation) && success; + } + if ('opacity' in properties) { + success = this.setOpacity(spriteId, properties.opacity) && success; + } + if ('color' in properties) { + success = this.setColor(spriteId, properties.color) && success; + } + + // 文字 + if ('text' in properties) { + success = this.setText(spriteId, properties.text) && success; + } + if ('fontSize' in properties) { + success = this.setFontSize(spriteId, properties.fontSize) && success; + } + + // 图片 + if ('image' in properties) { + success = this.setImage(spriteId, properties.image) && success; + } + + // 交互 + if ('touchable' in properties) { + success = this.setTouchable(spriteId, properties.touchable) && success; + } + + return success; + }, + + // ==================== 群组操作 ==================== + // 注意: 群组ID也可以作为图层ID使用(显示/隐藏整个图层的所有精灵) + + /** + * 显示群组(批量显示群组内所有精灵) + * @param {Number} groupId - 群组ID + * @returns {Boolean} 是否成功 + */ + showGroup: function(groupId) { + if (!_validateGroupId(groupId)) return false; + return GameABCUtils.Group.show(groupId); + }, + + /** + * 隐藏群组(批量隐藏群组内所有精灵) + * @param {Number} groupId - 群组ID + * @returns {Boolean} 是否成功 + */ + hideGroup: function(groupId) { + if (!_validateGroupId(groupId)) return false; + return GameABCUtils.Group.hide(groupId); + }, + + // ==================== 工具方法 ==================== + + /** + * 获取资源范围常量 + * @returns {Object} 资源范围对象 + */ + getResourceRanges: function() { + return { + SPRITE_MIN: RESOURCE_RANGES.SPRITE_MIN, + LAYER_NORMAL_MIN: RESOURCE_RANGES.LAYER_NORMAL_MIN, + LAYER_NORMAL_MAX: RESOURCE_RANGES.LAYER_NORMAL_MAX, + LAYER_POPUP_MIN: RESOURCE_RANGES.LAYER_POPUP_MIN, + GROUP_MIN: RESOURCE_RANGES.GROUP_MIN + }; + }, + + /** + * 验证精灵ID + * @param {Number} spriteId - 精灵ID + * @returns {Boolean} 是否有效 + */ + validateSpriteId: function(spriteId) { + return _validateSpriteId(spriteId); + }, + + /** + * 验证图层ID + * @param {Number} layerId - 图层ID + * @returns {Boolean} 是否有效 + */ + validateLayerId: function(layerId) { + return _validateLayerId(layerId); + }, + + /** + * 验证群组ID + * @param {Number} groupId - 群组ID + * @returns {Boolean} 是否有效 + */ + validateGroupId: function(groupId) { + return _validateGroupId(groupId); + }, + + // ==================== 获取属性方法 ==================== + + /** + * 获取精灵位置 + * @param {Number} spriteId - 精灵ID + * @returns {Object|null} 位置对象 {x, y} 或 null + */ + getPosition: function(spriteId) { + if (!_validateSpriteId(spriteId)) return null; + + try { + return { + x: GameABCUtils.Sprite.getProperty(spriteId, PROPERTY_CODES.MOVE_X), + y: GameABCUtils.Sprite.getProperty(spriteId, PROPERTY_CODES.MOVE_Y) + }; + } catch (error) { + console.error('❌ SpriteManager.getPosition 失败:', error); + return null; + } + }, + + /** + * 获取精灵大小 + * @param {Number} spriteId - 精灵ID + * @returns {Object|null} 大小对象 {width, height} 或 null + */ + getSize: function(spriteId) { + if (!_validateSpriteId(spriteId)) return null; + + try { + return { + width: GameABCUtils.Sprite.getProperty(spriteId, PROPERTY_CODES.WIDTH), + height: GameABCUtils.Sprite.getProperty(spriteId, PROPERTY_CODES.HEIGHT) + }; + } catch (error) { + console.error('❌ SpriteManager.getSize 失败:', error); + return null; + } + }, + + /** + * 获取精灵缩放比例 + * @param {Number} spriteId - 精灵ID + * @returns {Number|null} 缩放比例 (0.5 = 50%) 或 null + */ + getScale: function(spriteId) { + if (!_validateSpriteId(spriteId)) return null; + + try { + var scaleValue = GameABCUtils.Sprite.getProperty(spriteId, PROPERTY_CODES.SCALE); + return scaleValue !== null ? scaleValue / 100 : null; + } catch (error) { + console.error('❌ SpriteManager.getScale 失败:', error); + return null; + } + }, + + /** + * 获取精灵旋转角度 + * @param {Number} spriteId - 精灵ID + * @returns {Number|null} 旋转角度 (0-360) 或 null + */ + getRotation: function(spriteId) { + if (!_validateSpriteId(spriteId)) return null; + + try { + return GameABCUtils.Sprite.getProperty(spriteId, PROPERTY_CODES.ROTATION); + } catch (error) { + console.error('❌ SpriteManager.getRotation 失败:', error); + return null; + } + }, + + /** + * 获取精灵透明度 + * @param {Number} spriteId - 精灵ID + * @returns {Number|null} 透明度 (0.0-1.0) 或 null + */ + getOpacity: function(spriteId) { + if (!_validateSpriteId(spriteId)) return null; + + try { + var opacityValue = GameABCUtils.Sprite.getProperty(spriteId, PROPERTY_CODES.OPACITY); + return opacityValue !== null ? opacityValue / 255 : null; + } catch (error) { + console.error('❌ SpriteManager.getOpacity 失败:', error); + return null; + } + }, + + /** + * 获取精灵透明度(getOpacity的别名) + * @param {Number} spriteId - 精灵ID + * @returns {Number|null} 透明度 (0.0-1.0) 或 null + */ + getAlpha: function(spriteId) { + return this.getOpacity(spriteId); + }, + + // ==================== 定时器控制 ==================== + + /** + * 设置精灵定时器 + * @param {Number} spriteId - 精灵ID + * @param {Number} milliseconds - 定时器时间(毫秒) + * @returns {Boolean} 是否成功 + */ + setTimer: function(spriteId, milliseconds) { + if (!_validateSpriteId(spriteId)) return false; + + if (typeof milliseconds !== 'number' || milliseconds < 0) { + console.error('❌ SpriteManager.setTimer: 定时器时间必须是非负数:', milliseconds); + return false; + } + + try { + GameABCUtils.Sprite.setProperty(spriteId, PROPERTY_CODES.TIMER, milliseconds, ACTION_MODES.SET); + return true; + } catch (error) { + console.error('❌ SpriteManager.setTimer 失败:', error); + return false; + } + }, + + // ==================== 图层操作 ==================== + + /** + * 显示图层(批量显示图层内所有精灵) + * @param {Number} layerId - 图层ID + * @returns {Boolean} 是否成功 + */ + showLayer: function(layerId) { + if (!_validateLayerId(layerId)) return false; + + try { + return GameABCUtils.Layer.show(layerId); + } catch (error) { + console.error('❌ SpriteManager.showLayer 失败:', error); + return false; + } + }, + + /** + * 隐藏图层(批量隐藏图层内所有精灵) + * @param {Number} layerId - 图层ID + * @returns {Boolean} 是否成功 + */ + hideLayer: function(layerId) { + if (!_validateLayerId(layerId)) return false; + + try { + return GameABCUtils.Layer.hide(layerId); + } catch (error) { + console.error('❌ SpriteManager.hideLayer 失败:', error); + return false; + } + }, + + /** + * 设置图层可见性 + * @param {Number} layerId - 图层ID + * @param {Boolean} visible - 是否可见 + * @returns {Boolean} 是否成功 + */ + setLayerVisible: function(layerId, visible) { + return visible ? this.showLayer(layerId) : this.hideLayer(layerId); + }, + + // ==================== 多帧图数字显示 ==================== + + /** + * 设置多帧图片精灵的数字内容 + * 支持显示数字、运算符和可变后缀 + * + * @param {Number} spriteId - 精灵ID(多帧图片精灵) + * @param {String|Number} text - 要显示的数字内容(支持数字、.、+、-、x、/、分、倍、张) + * @param {Number} charWidth - 每个字符的宽度(像素) + * @returns {Boolean} 是否成功 + * + * 说明: + * - 多帧图片资源需要包含16帧:0123456789.+-x/p + * - 帧序号:0-9对应数字,10='.', 11='+', 12='-', 13='x', 14='/', 15='p'(可变) + * - 精灵宽度会根据字符数量自动调整 + * - 编码转换:. → b, + → c, - → d, x → e, / → f, 分/倍/张 → g + * - 第16帧(p位)为可变内容,需要调用者确保资源图与使用场景匹配 + * + * 示例: + * - setNumberImage(1001, '+18', 20) → 显示 "+18",宽度 60px + * - setNumberImage(1001, '-1.8', 20) → 显示 "-1.8",宽度 80px + * - setNumberImage(1001, '2x3', 20) → 显示 "2x3",宽度 60px + * - setNumberImage(1001, '42分', 20) → 显示 "42分",宽度 60px + * - setNumberImage(1001, '3倍', 20) → 显示 "3倍",宽度 40px + * - setNumberImage(1001, '52张', 20) → 显示 "52张",宽度 60px + */ + setNumberImage: function(spriteId, text, charWidth) { + if (!_validateSpriteId(spriteId)) return false; + + if (typeof charWidth !== 'number' || charWidth <= 0) { + console.error('❌ SpriteManager.setNumberImage: 字符宽度必须是正数:', charWidth); + return false; + } + + try { + var textStr = String(text); + + // gameabc引擎帧索引计算(1-based): + // - 数字 '0'-'9' → charCode - 47 = 帧1-10 + // - 字母 'b'-'g' → charCode - 87 = 帧10-16 + // + // 编码映射: + // - '.' → 'b' → 帧10 (实际帧11,因为0是帧1) + // - '+' → 'c' → 帧11 (实际帧12) + // - '-' → 'd' → 帧12 (实际帧13) + // - 'x' → 'e' → 帧13 (实际帧14) + // - '/' → 'f' → 帧14 (实际帧15) + // - '分/倍/张' → 'g' → 帧16 (第16帧) + // + // 帧顺序(资源图片):0123456789.+-x/分 (共16帧) + var encodedText = textStr + .replace(/\./g, 'b') + .replace(/\+/g, 'c') + .replace(/-/g, 'd') + .replace(/x/gi, 'e') // 不区分大小写 + .replace(/\//g, 'f') + .replace(/[分倍张]/g, 'g'); // 分、倍、张 都映射到第16帧 (g=103-87=16) + + // 设置编码后的文本内容 + GameABCUtils.Sprite.setProperty(spriteId, PROPERTY_CODES.TEXT, encodedText, ACTION_MODES.SET); + + // 根据字符数量设置精灵宽度 + var charCount = textStr.length; + GameABCUtils.Sprite.setProperty(spriteId, PROPERTY_CODES.WIDTH, charCount * charWidth, ACTION_MODES.SET); + + return true; + } catch (error) { + console.error('❌ SpriteManager.setNumberImage 失败:', error); + return false; + } + }, + + /** + * 设置文字精灵内容并自动调整宽度 + * + * @param {Number} spriteId - 精灵ID(文字精灵) + * @param {String} text - 要显示的文字内容 + * @param {Number} charWidth - 每个字符的宽度(像素) + * @returns {Boolean} 是否成功 + * + * 说明: + * - 中文字符算2个字符宽度,英文/数字算1个字符宽度 + * - 精灵宽度会根据字符数量自动调整 + */ + setTextWithWidth: function(spriteId, text, charWidth) { + if (!_validateSpriteId(spriteId)) return false; + + if (typeof charWidth !== 'number' || charWidth <= 0) { + console.error('❌ SpriteManager.setTextWithWidth: 字符宽度必须是正数:', charWidth); + return false; + } + + try { + // 设置文本内容 + GameABCUtils.Sprite.setProperty(spriteId, PROPERTY_CODES.TEXT, text, ACTION_MODES.SET); + + // 计算字符串实际长度(中文算2个字符) + var charLength = 0; + var str = String(text); + for (var i = 0; i < str.length; i++) { + // 中文字符范围 + if (str.charCodeAt(i) > 127) { + charLength += 2; + } else { + charLength += 1; + } + } + + // 设置精灵宽度 + GameABCUtils.Sprite.setProperty(spriteId, PROPERTY_CODES.WIDTH, charLength * charWidth, ACTION_MODES.SET); + + return true; + } catch (error) { + console.error('❌ SpriteManager.setTextWithWidth 失败:', error); + return false; + } + }, + + // ==================== 设置群组可见性 ==================== + + /** + * 设置群组可见性 + * @param {Number} groupId - 群组ID + * @param {Boolean} visible - 是否可见 + * @returns {Boolean} 是否成功 + */ + setGroupVisible: function(groupId, visible) { + return visible ? this.showGroup(groupId) : this.hideGroup(groupId); + } + }; + + return publicAPI; + +})(); + +// 导出到全局(兼容ES5) +if (typeof module !== 'undefined' && module.exports) { + module.exports = SpriteManager; +} diff --git a/client/js/gameabc-framework/network/RpcHelper.js b/client/js/gameabc-framework/network/RpcHelper.js new file mode 100644 index 0000000..3dd2b70 --- /dev/null +++ b/client/js/gameabc-framework/network/RpcHelper.js @@ -0,0 +1,225 @@ +/** + * 网络收发包工具类 + * 自动处理平台框架提供的基础数据字段,简化子游戏的网络通信 + * + * 功能特性: + * - 自动注入平台数据:agentid、gameid、playerid、roomcode + * - 统一的RPC发送接口 + * - 支持调试模式输出 + * - 遵循数据包协议规范 + * + * @author GameABC Framework + * @version 1.0.0 + */ + +var RpcHelper = { + + /** + * 发送RPC请求 + * 自动注入平台框架提供的基础验证字段 + * + * @param {string} app - 应用名称,通常为 "youle" + * @param {string} route - 路由名称,如 "room" + * @param {string} rpc - RPC方法名,如 "play_card" + * @param {Object} gameData - 子游戏业务数据 + * @param {Object} options - 可选配置参数 + * @param {boolean} options.debug - 是否输出调试信息,默认false + * @param {Object} options.customData - 自定义的额外数据字段 + */ + sendRpc: function(app, route, rpc, gameData, options) { + // 参数验证 + if (!app || typeof app !== 'string') { + console.error('RpcHelper.sendRpc: app参数必须是非空字符串'); + return; + } + if (!route || typeof route !== 'string') { + console.error('RpcHelper.sendRpc: route参数必须是非空字符串'); + return; + } + if (!rpc || typeof rpc !== 'string') { + console.error('RpcHelper.sendRpc: rpc参数必须是非空字符串'); + return; + } + + // 默认选项 + options = options || {}; + var debug = options.debug || false; + var customData = options.customData || {}; + + // 构建完整的数据包 + var data = {}; + + // 1. 自动注入平台框架提供的基础验证字段 + try { + data.agentid = GameData.AgentId; // 运营商ID(String类型) + data.gameid = GameData.GameId; // 游戏类型标识(String类型) + data.playerid = C_Player.playerid; // 玩家唯一标识(Number类型) + data.roomcode = Utl.getRoomcode(); // 房间号(String类型) + } catch (e) { + console.error('RpcHelper.sendRpc: 获取平台基础数据失败', e); + return; + } + + // 2. 验证必需的平台数据 + if (!data.agentid) { + console.error('RpcHelper.sendRpc: agentid未设置,请确保平台框架已初始化'); + return; + } + if (!data.gameid) { + console.error('RpcHelper.sendRpc: gameid未设置,请确保平台框架已初始化'); + return; + } + if (!data.playerid) { + console.error('RpcHelper.sendRpc: playerid未设置,请确保玩家已登录'); + return; + } + if (!data.roomcode) { + console.error('RpcHelper.sendRpc: roomcode未设置,请确保已进入房间'); + return; + } + + // 3. 合并子游戏业务数据 + if (gameData && typeof gameData === 'object') { + for (var key in gameData) { + if (gameData.hasOwnProperty(key)) { + data[key] = gameData[key]; + } + } + } + + // 4. 合并自定义数据 + for (var key in customData) { + if (customData.hasOwnProperty(key)) { + data[key] = customData[key]; + } + } + + // 5. 调试信息输出 + if (debug || Game_Config.Debugger.isDebugger) { + console.log('RpcHelper发送RPC:', { + app: app, + route: route, + rpc: rpc, + platform_data: { + agentid: data.agentid, + gameid: data.gameid, + playerid: data.playerid, + roomcode: data.roomcode + }, + game_data: gameData, + custom_data: customData + }); + } + + // 6. 通过框架发送RPC请求 + Utl.sendData(app, route, rpc, data); + }, + + /** + * 发送游戏房间RPC + * 专门用于游戏房间相关的RPC调用,预设app="youle", route="room" + * + * @param {string} rpc - RPC方法名 + * @param {Object} gameData - 子游戏业务数据 + * @param {Object} options - 可选配置参数 + */ + sendGameRpc: function(rpc, gameData, options) { + this.sendRpc("youle", "room", rpc, gameData, options); + }, + + /** + * 发送代理商RPC + * 专门用于代理商相关的RPC调用,预设app="youle", route="agent" + * + * @param {string} rpc - RPC方法名 + * @param {Object} gameData - 子游戏业务数据 + * @param {Object} options - 可选配置参数 + */ + sendAgentRpc: function(rpc, gameData, options) { + this.sendRpc("youle", "agent", rpc, gameData, options); + }, + + /** + * 发送平台RPC + * 专门用于平台相关的RPC调用,预设app="youle", route="platform" + * + * @param {string} rpc - RPC方法名 + * @param {Object} gameData - 子游戏业务数据 + * @param {Object} options - 可选配置参数 + */ + sendPlatformRpc: function(rpc, gameData, options) { + this.sendRpc("youle", "platform", rpc, gameData, options); + }, + + /** + * 获取当前平台数据快照 + * 用于调试和信息查看 + * + * @returns {Object} 包含当前平台数据的对象 + */ + getPlatformData: function() { + try { + return { + agentid: GameData.AgentId, + gameid: GameData.GameId, + playerid: C_Player.playerid, + roomcode: Utl.getRoomcode(), + timestamp: new Date().getTime() + }; + } catch (e) { + console.error('RpcHelper.getPlatformData: 获取平台数据失败', e); + return null; + } + }, + + /** + * 验证平台数据完整性 + * 检查所有必需的平台数据是否已正确设置 + * + * @returns {Object} 验证结果对象 {valid: boolean, missing: Array} + */ + validatePlatformData: function() { + var result = { + valid: true, + missing: [] + }; + + try { + if (!GameData.AgentId) { + result.valid = false; + result.missing.push('agentid'); + } + if (!GameData.GameId) { + result.valid = false; + result.missing.push('gameid'); + } + if (!C_Player.playerid) { + result.valid = false; + result.missing.push('playerid'); + } + if (!Utl.getRoomcode()) { + result.valid = false; + result.missing.push('roomcode'); + } + } catch (e) { + result.valid = false; + result.missing.push('platform_error'); + console.error('RpcHelper.validatePlatformData: 验证过程出错', e); + } + + return result; + } +}; + +// ES5兼容性:确保在旧版本浏览器中也能正常工作 +if (typeof Object.defineProperty === 'function') { + // 防止意外修改工具类 + Object.defineProperty(window, 'RpcHelper', { + value: RpcHelper, + writable: false, + configurable: false + }); +} else { + // 旧版本浏览器的兼容处理 + window.RpcHelper = RpcHelper; +} diff --git a/client/js/gameabc-framework/spine/SpineMgr.js b/client/js/gameabc-framework/spine/SpineMgr.js new file mode 100644 index 0000000..7d97f37 --- /dev/null +++ b/client/js/gameabc-framework/spine/SpineMgr.js @@ -0,0 +1,467 @@ +// ============================================================ +// SpineMgr —— Spine 动画管理器(独立文件) +// 集成到 gameabc Canvas 2D 绘制循环,零侵入 gamemain.js +// 在 index.html 中置于 gameabc.min.js 之后、gamemain.js 之前加载 +// ============================================================ +(function(){ + +var SpineMgr = { + + // --- 内部状态 --- + _entries: {}, // {id: EntryObject} + _assetManager: null, + _renderer: null, // spine.SkeletonRenderer (Canvas 2D) + _lastTime: 0, // 上一帧时间戳(ms) + _inited: false, + _loadedPaths: {}, // 已请求加载的资源路径,避免重复请求 + _pendingCmds: {}, // {id: [{method, args}]} 等待实例就绪后执行的命令队列 + _scaleMap: {}, // {spineId: scale} 主流 SkeletonJson.scale 方案,_autoLoad 时注入 + _skelDataCache: {}, // {"file.json_scale1": SkeletonData} 同文件共享解析结果,避免重复 readSkeletonData + + // 默认资源根路径(可通过 init 覆盖) + _basePath: "assets/spine/", + + // ---------------------------------------------------------- + // init(basePath) 手动初始化(可选) + // 如不调用,load 时会自动以默认路径 "assets/spine/" 初始化 + // ---------------------------------------------------------- + init: function(basePath) { + if (!window.spine) { + logmessage("[SpineMgr] spine-canvas.js 未加载,请检查引用"); + return; + } + this._basePath = basePath || this._basePath; + this._assetManager = new spine.AssetManager(this._basePath); + this._lastTime = Date.now(); + this._inited = true; + }, + + // (内部) 确保已初始化 + _ensureInit: function() { + if (!this._inited) { + this.init(this._basePath); + } + }, + + // (内部) 自动加载:根据 id 约定文件名 id.json / id.atlas + // 主流 SkeletonJson.scale 方案:从 _scaleMap 读取目标缩放,传入 load() 在解析时烘焙 + _autoLoad: function(id) { + if (this._entries[id]) return; + var scale = this._scaleMap[id] || 1; + this.load(id, id + ".json", id + ".atlas", { scale: scale }); + }, + + // (内部) 将命令加入等待队列 + _queueCmd: function(id, method, args) { + if (!this._pendingCmds[id]) this._pendingCmds[id] = []; + this._pendingCmds[id].push({method: method, args: args}); + }, + + // (内部) 实例就绪后执行队列中的命令 + _flushCmds: function(id) { + var cmds = this._pendingCmds[id]; + if (!cmds || cmds.length === 0) return; + delete this._pendingCmds[id]; + for (var i = 0; i < cmds.length; i++) { + var cmd = cmds[i]; + this[cmd.method].apply(this, [id].concat(cmd.args)); + } + }, + + // ---------------------------------------------------------- + // load(id, jsonFile, atlasFile, option) + // 加载一组 Spine 资源, id 为自定义标识 + // option: {x, y, scale, skin, animation, loop, mixDuration} + // ---------------------------------------------------------- + load: function(id, jsonFile, atlasFile, option) { + this._ensureInit(); + if (!this._inited) return; + var opt = option || {}; + // 只加载尚未请求过的资源(预加载过的会跳过) + if (!this._loadedPaths[jsonFile]) { + this._assetManager.loadText(jsonFile); + this._loadedPaths[jsonFile] = true; + } + if (!this._loadedPaths[atlasFile]) { + this._assetManager.loadTextureAtlas(atlasFile); + this._loadedPaths[atlasFile] = true; + } + this._entries[id] = { + jsonFile: jsonFile, + atlasFile: atlasFile, + skeleton: null, + state: null, + x: opt.x || 0, + y: opt.y || 0, + scale: opt.scale || 1, + skin: opt.skin || "default", + defAnim: opt.animation || null, + defLoop: opt.loop !== undefined ? opt.loop : true, + mixDur: opt.mixDuration || 0.2, + visible: true, + ready: false, + _hideOnComplete: false, // 播放完成后是否自动隐藏 + _hideAfterCompletes: 0 // 剩余多少次 complete 后触发隐藏 + }; + }, + + // ---------------------------------------------------------- + // (内部) 资源加载完成后实例化骨骼 + // 同一 jsonFile+scale 的 SkeletonData 只解析一次,多个 entry 共享 + // ---------------------------------------------------------- + _buildEntry: function(entry) { + logmessage("[SpineMgr] _buildEntry: " + entry._id + " skelJson.scale=" + entry.scale); + var cacheKey = entry.jsonFile + "_s" + entry.scale; + var skelData = this._skelDataCache[cacheKey]; + if (!skelData) { + var atlas = this._assetManager.require(entry.atlasFile); + var loader = new spine.AtlasAttachmentLoader(atlas); + var skelJson = new spine.SkeletonJson(loader); + skelJson.scale = entry.scale; + skelData = skelJson.readSkeletonData( + this._assetManager.require(entry.jsonFile) + ); + this._skelDataCache[cacheKey] = skelData; + logmessage("[SpineMgr] SkeletonData 解析并缓存: " + cacheKey); + } else { + logmessage("[SpineMgr] SkeletonData 命中缓存: " + cacheKey); + } + entry.skeleton = new spine.Skeleton(skelData); + + // 设置皮肤 + if (entry.skin && entry.skin !== "default") { + entry.skeleton.setSkinByName(entry.skin); + } + entry.skeleton.setToSetupPose(); + + // AnimationState + var stateData = new spine.AnimationStateData(skelData); + stateData.defaultMix = entry.mixDur; + entry.state = new spine.AnimationState(stateData); + + // 绑定事件回调 —— 转发到 Spine_Event.js + entry.state.addListener({ + complete: function(trackEntry) { + // 自动隐藏:playOnce / playQueue 设置的计数器 + if (entry._hideOnComplete && !trackEntry.loop) { + entry._hideAfterCompletes--; + if (entry._hideAfterCompletes <= 0) { + entry.visible = false; + entry._hideOnComplete = false; + } + } + if (gameabc_face.spine_onComplete) { + gameabc_face.spine_onComplete(entry._id, trackEntry.animation.name, trackEntry.trackIndex); + } + }, + event: function(trackEntry, event) { + if (gameabc_face.spine_onEvent) { + gameabc_face.spine_onEvent(entry._id, event.data.name, event.intValue, event.floatValue, event.stringValue); + } + } + }); + + // 默认动画 + if (entry.defAnim) { + entry.state.setAnimation(0, entry.defAnim, entry.defLoop); + } + entry.ready = true; + }, + + // ---------------------------------------------------------- + // (内部) 每帧调用:确保所有资源就绪 + // ---------------------------------------------------------- + _tryBuild: function() { + if (!this._assetManager.isLoadingComplete()) return false; + for (var id in this._entries) { + var e = this._entries[id]; + if (!e.ready) { + e._id = id; + try { + this._buildEntry(e); + logmessage("[SpineMgr] " + id + " 构建完成"); + this._flushCmds(id); + } catch(err) { + logmessage("[SpineMgr] " + id + " 构建失败: " + err.message); + e.ready = false; + } + } + } + return true; + }, + + // ---------------------------------------------------------- + // updateAndDraw(ctx) 每帧自动调用 + // ctx: gameabc_face.dc (Canvas 2D Context) + // ---------------------------------------------------------- + updateAndDraw: function(ctx) { + if (!this._inited) return; + this._tryBuild(); + + var now = Date.now(); + var dt = (now - this._lastTime) / 1000; + this._lastTime = now; + if (dt <= 0 || dt > 0.5) dt = 1/30; + + if (!this._renderer) { + this._renderer = new spine.SkeletonRenderer(ctx); + this._renderer.triangleRendering = true; // ★ 启用三角形渲染以支持 Mesh 网格附件 + } + // 确保 renderer 用的是当前 ctx (gameabc可能重建) + this._renderer.ctx = ctx; + + for (var id in this._entries) { + var e = this._entries[id]; + if (!e.ready || !e.visible) continue; + + e.state.update(dt); + e.state.apply(e.skeleton); + // 骨骼位置归零,由 ctx.translate 控制实际位置 + e.skeleton.x = 0; + e.skeleton.y = 0; + e.skeleton.updateWorldTransform(spine.Physics.update); + + ctx.save(); + ctx.translate(e.x, e.y); + ctx.scale(1, -1); // ★ Spine Y-up → Canvas Y-down(scale 已烘焙进 SkeletonJson.scale) + this._renderer.draw(e.skeleton); + ctx.restore(); + } + }, + + // ========================================================== + // 公开控制 API + // ========================================================== + + setAnimation: function(id, animName, loop, track) { + var e = this._entries[id]; + if (!e) { + this._autoLoad(id); + this._queueCmd(id, "setAnimation", [animName, loop, track]); + return null; + } + e.visible = true; + if (!e.ready) { + this._queueCmd(id, "setAnimation", [animName, loop, track]); + return null; + } + return e.state.setAnimation(track || 0, animName, loop !== false); + }, + + addAnimation: function(id, animName, loop, delay, track) { + var e = this._entries[id]; + if (!e) { + this._autoLoad(id); + this._queueCmd(id, "addAnimation", [animName, loop, delay, track]); + return null; + } + if (!e.ready) { + this._queueCmd(id, "addAnimation", [animName, loop, delay, track]); + return null; + } + return e.state.addAnimation(track || 0, animName, loop !== false, delay || 0); + }, + + setPosition: function(id, x, y) { + var e = this._entries[id]; + if (!e) { + this._autoLoad(id); + e = this._entries[id]; + } + e.x = x; e.y = y; + }, + + setScale: function(id, sx, sy) { + // 主流方案:scale 通过 SkeletonJson.scale 在 load 时烘焙,运行时 setScale 更新 _scaleMap + // 并在 entry 未就绪时作为 option 重建,保持接口向后兼容 + this._scaleMap[id] = sx; + var e = this._entries[id]; + if (!e) { + this._autoLoad(id); // 会使用 _scaleMap[id] = sx + return; + } + if (e.scale === sx) return; // 已是目标 scale,无需重建 + // 目标 scale 与已烘焙 scale 不同 → 清除旧 entry,下次 _autoLoad 将以新 scale 重建 + var savedX = e.x, savedY = e.y; + this.remove(id); + this.load(id, id + ".json", id + ".atlas", { scale: sx, x: savedX, y: savedY }); + }, + + setFlip: function(id, flipX, flipY) { + var e = this._entries[id]; + if (!e) { + this._autoLoad(id); + this._queueCmd(id, "setFlip", [flipX, flipY]); + return; + } + if (!e.skeleton) { + this._queueCmd(id, "setFlip", [flipX, flipY]); + return; + } + e.skeleton.scaleX = Math.abs(e.skeleton.scaleX) * (flipX ? -1 : 1); + e.skeleton.scaleY = Math.abs(e.skeleton.scaleY) * (flipY ? -1 : 1); + }, + + setVisible: function(id, visible) { + var e = this._entries[id]; + if (!e) { + this._autoLoad(id); + e = this._entries[id]; + } + e.visible = !!visible; + }, + + setSkin: function(id, skinName) { + var e = this._entries[id]; + if (!e) { + this._autoLoad(id); + this._queueCmd(id, "setSkin", [skinName]); + return; + } + if (!e.ready) { + this._queueCmd(id, "setSkin", [skinName]); + return; + } + e.skeleton.setSkinByName(skinName); + e.skeleton.setSlotsToSetupPose(); + }, + + getAnimations: function(id) { + var e = this._entries[id]; + if (!e) { this._autoLoad(id); return []; } + if (!e.ready) return []; + var anims = e.skeleton.data.animations; + var names = []; + for (var i = 0; i < anims.length; i++) names.push(anims[i].name); + return names; + }, + + getSkins: function(id) { + var e = this._entries[id]; + if (!e) { this._autoLoad(id); return []; } + if (!e.ready) return []; + var skins = e.skeleton.data.skins; + var names = []; + for (var i = 0; i < skins.length; i++) names.push(skins[i].name); + return names; + }, + + playOnce: function(id, animName, track) { + this.setVisible(id, true); + // 重播前重置骨骼到初始姿态,消除上次末帧残留导致的混合过渡(斜向位移) + var e = this._entries[id]; + if (e && e.ready) { + e.state.clearTracks(); + e.skeleton.setToSetupPose(); + } + this.setAnimation(id, animName, false, track); + e = this._entries[id]; + if (e) { + e._hideOnComplete = true; + e._hideAfterCompletes = 1; + } + }, + + playQueue: function(id, animList, hideOnComplete) { + if (!animList || animList.length === 0) return; + this.setVisible(id, true); + // 重播前重置骨骼到初始姿态,消除上次末帧残留导致的混合过渡 + var e = this._entries[id]; + if (e && e.ready) { + e.state.clearTracks(); + e.skeleton.setToSetupPose(); + } + this.setAnimation(id, animList[0], false, 0); + for (var i = 1; i < animList.length; i++) { + this.addAnimation(id, animList[i], false, 0, 0); + } + var e = this._entries[id]; + if (e) { + e._hideOnComplete = hideOnComplete !== false; + e._hideAfterCompletes = animList.length; + } + }, + + stop: function(id) { + var e = this._entries[id]; + if (!e) return; + e.visible = false; + e._hideOnComplete = false; + e._hideAfterCompletes = 0; + delete this._pendingCmds[id]; + if (e.state) { + e.state.clearTracks(); + } + if (e.skeleton) { + e.skeleton.setToSetupPose(); + } + }, + + stopAll: function() { + for (var id in this._entries) { + this.stop(id); + } + }, + + remove: function(id) { + delete this._entries[id]; + delete this._pendingCmds[id]; + }, + + removeAll: function() { + this._entries = {}; + this._pendingCmds = {}; + this._skelDataCache = {}; + } +}; + +// 挂载到 gameabc_face 上 +gameabc_face.spineMgr = SpineMgr; + +// ★ 自动预加载:读取 gameabc_face.spineAssets 清单,在引擎启动前预加载所有 Spine 资源 +// 如果存在 spineTextData(嵌入文本数据),则通过 setRawDataURI 注入, +// 彻底避免 file:// 协议下 XHR CORS 拦截问题 +if (gameabc_face.spineAssets && gameabc_face.spineAssets.length > 0) { + SpineMgr._ensureInit(); + var list = gameabc_face.spineAssets; + var textData = gameabc_face.spineTextData || {}; + for (var i = 0; i < list.length; i++) { + var name = list[i]; + var jsonKey = name + ".json"; + var atlasKey = name + ".atlas"; + // 将嵌入文本数据注册为 rawDataURI,Spine Downloader 会优先从内存读取 + if (textData[jsonKey]) { + SpineMgr._assetManager.setRawDataURI(jsonKey, "data:," + textData[jsonKey]); + } + if (textData[atlasKey]) { + SpineMgr._assetManager.setRawDataURI(atlasKey, "data:," + textData[atlasKey]); + } + SpineMgr._assetManager.loadText(jsonKey); + SpineMgr._loadedPaths[jsonKey] = true; + SpineMgr._assetManager.loadTextureAtlas(atlasKey); + SpineMgr._loadedPaths[atlasKey] = true; + } + logmessage("[SpineMgr] 预加载 " + list.length + " 组 Spine 资源" + + (Object.keys(textData).length > 0 ? "(使用嵌入数据)" : "(使用网络请求)")); +} + +// ★ 用 defineProperty 拦截 gameenddraw 赋值 +// 无论 gamemain.js 或其他代码如何定义 gameenddraw, +// Spine 渲染都会自动追加在用户逻辑之后 +var _userEndDraw = gameabc_face.gameenddraw || null; +var _wrappedEndDraw = function(gameid, spid, times, timelong) { + if (typeof _userEndDraw === "function") { + _userEndDraw(gameid, spid, times, timelong); + } + var ctx = gameabc_face.dc; + if (ctx && SpineMgr._inited) { + SpineMgr.updateAndDraw(ctx); + } +}; +Object.defineProperty(gameabc_face, "gameenddraw", { + configurable: true, + get: function() { return _wrappedEndDraw; }, + set: function(fn) { _userEndDraw = fn; } +}); + +})(); diff --git a/client/js/gameabc-framework/system/AnimationManager.js b/client/js/gameabc-framework/system/AnimationManager.js new file mode 100644 index 0000000..0c2206b --- /dev/null +++ b/client/js/gameabc-framework/system/AnimationManager.js @@ -0,0 +1,1168 @@ +/** + * AnimationManager - 动画管理器 (性能优化版) + * + * ============================================================================ + * 🚨 CRITICAL PRINCIPLE: DATA-FIRST, UI-DEFERRED (数据优先,界面延后) + * ============================================================================ + * + * ALL animations in this project MUST follow the "Data-First, UI-Deferred" pattern: + * + * 1. UPDATE DATA FIRST (Before Animation) + * - Update the model/state to reflect the FINAL expected state + * - Do NOT update the UI at this point + * - This ensures data integrity even if animation is interrupted or skipped + * + * 2. PLAY ANIMATION (Visual Transition) + * - Animation is purely a visual representation of the state change + * - Animation MUST NOT modify game data or state + * - Animation can be skipped/cancelled without affecting game logic + * + * 3. UPDATE UI AFTER ANIMATION (On Complete Callback) + * - Refresh the UI to reflect the already-updated data + * - This synchronizes the visual display with the data state + * + * EXAMPLE - Draw Card Flow: + * Step 1: playerHands[playerIndex].push(card) // Update data + * Step 2: playDrawCardAnimation(...) // Play animation + * Step 3: (onComplete) _updatePlayerHand(...) // Update UI + * + * EXAMPLE - Insert Card into Hand Flow: + * Step 1: Sort hand including new card (data) // Update data + * Step 2: playDrawCardInsertAnimation(...) // Play animation + * Step 3: (onComplete) _updatePlayerHand(...) // Update UI + * + * WHY THIS MATTERS: + * - Animation is just a presentation layer, it should never affect data correctness + * - If animation fails/skips, the game state remains consistent + * - Supports instant mode (no animation) without code changes + * - Prevents race conditions between animations and game logic + * + * ⚠️ WARNING: Violating this principle will cause data inconsistency bugs that + * are extremely difficult to debug. All developers and AI assistants MUST + * follow this pattern when implementing any animation-related code. + * + * ============================================================================ + * 🚨 核心原则:数据优先,界面延后(中文说明) + * ============================================================================ + * + * 本项目所有动画必须遵循「数据优先,界面延后」模式: + * + * 1. 先更新数据(动画播放前) + * - 将模型/状态更新为动画完成后的最终预期状态 + * - 此时不要更新界面 + * - 这确保即使动画被中断或跳过,数据仍然正确 + * + * 2. 播放动画(视觉过渡) + * - 动画只是状态变化的视觉表现 + * - 动画绝对不能修改游戏数据或状态 + * - 动画可以被跳过/取消而不影响游戏逻辑 + * + * 3. 动画完成后更新界面(在完成回调中) + * - 刷新界面以反映已更新的数据 + * - 使视觉显示与数据状态同步 + * + * 示例 - 摸牌流程: + * 第1步: playerHands[playerIndex].push(card) // 更新数据 + * 第2步: playDrawCardAnimation(...) // 播放动画 + * 第3步: (onComplete) _updatePlayerHand(...) // 更新界面 + * + * 示例 - 摸牌插入手牌流程: + * 第1步: 对包含新牌的手牌进行排序(数据层面) // 更新数据 + * 第2步: playDrawCardInsertAnimation(...) // 播放动画 + * 第3步: (onComplete) _updatePlayerHand(...) // 更新界面 + * + * 为什么这很重要: + * - 动画只是表现层,绝不能影响数据的正确性 + * - 如果动画失败/跳过,游戏状态仍保持一致 + * - 无需修改代码即可支持无动画模式(即时模式) + * - 防止动画与游戏逻辑之间的竞态条件 + * + * ⚠️ 警告:违反此原则将导致极难调试的数据不一致bug。 + * 所有开发人员和AI助手在实现任何动画相关代码时必须遵循此模式。 + * + * ============================================================================ + * + * 功能: + * 1. 管理所有游戏动画 + * 2. 提供基础动画(移动/缩放/旋转/淡入淡出/帧动画) + * 3. 支持动画队列(串行/并行) + * 4. 支持缓动函数 + * 5. 动画生命周期管理 + * + * 性能优化: + * - 使用 SpriteManager API 统一管理精灵属性 + * - 使用数组存储活动动画,避免 for...in 遍历 + * - 缓存缓动函数引用,避免每帧字符串查找 + * - 活动动画计数器,O(1) 判断是否需要循环 + * - 预计算差值,减少每帧计算量 + * - 帧动画优化:只在帧变化时更新 + * + * 依赖: + * - SpriteManager - 精灵属性管理器 (必须先加载) + * + * ============================================================================ + * @guide 开发指南 - AnimationManager 使用规范 + * ============================================================================ + * + * 【初始化(UIBootstrap 中调用一次)】 + * AnimationManager.init(); + * + * 【核心原则:数据优先,界面延后(必须遵守)】 + * + * 错误写法(先更新UI再改数据): + * SpriteManager.setPosition(spriteId, targetX, targetY); // ❌ 先改UI + * gameData.push(card); // ❌ 后改数据 + * + * 正确写法(先改数据,动画完成后再刷新UI): + * // Step 1: 先更新数据层 + * gameData.push(card); + * + * // Step 2: 播放动画 + * AnimationManager.move(spriteId, fromX, fromY, targetX, targetY, 300, 'easeOut', + * function() { + * // Step 3: 动画完成回调中刷新UI + * self._updatePlayerHandDisplay(); + * } + * ); + * + * 【移动动画】 + * // 精灵从当前位置移动到目标位置,300ms,缓出 + * AnimationManager.move(spriteId, startX, startY, endX, endY, 300, 'easeOut', callback); + * + * 【缩放动画(突出显示效果)】 + * // 先放大后缩回(弹出效果) + * AnimationManager.scale(spriteId, 1.0, 1.3, 150, 'easeOut', function() { + * AnimationManager.scale(spriteId, 1.3, 1.0, 150, 'easeIn', null); + * }); + * + * 【透明度动画(淡入淡出)】 + * // 淡出 + * AnimationManager.opacity(spriteId, 1.0, 0.0, 200, 'linear', function() { + * SpriteManager.hide(spriteId); + * }); + * + * 【帧动画(翻牌等序列帧)】 + * // 从第0帧播放到第7帧,每帧60ms + * AnimationManager.frame(spriteId, 0, 7, 60, false, callback); + * + * 【停止/取消动画】 + * var animId = AnimationManager.move(...); + * AnimationManager.stop(animId); // 停止单个动画 + * AnimationManager.stopAll(); // 停止所有动画(游戏结束时) + * + * 【缓动函数可选值】 + * 'linear' 匀速 + * 'easeIn' 加速 + * 'easeOut' 减速(最常用) + * 'easeInOut' 先加速后减速 + * + * @version 2.0.0 + * @date 2025-12-14 + */ + +/* global SpriteManager */ + +var AnimationManager = AnimationManager || {}; + +(function() { + 'use strict'; + + // ============================================================================ + // 私有变量 (性能优化) + // ============================================================================ + + var _initialized = false; + var _animationList = []; // 活动动画数组(遍历更快) + var _animationMap = {}; // ID到数组索引的映射(快速查找/删除) + var _spriteAnimMap = {}; // 精灵ID+动画类型 到 动画ID的映射(防止重复动画冲突) + var _queues = {}; // 动画队列 + var _nextAnimationId = 1; + var _nextQueueId = 1; + var _rafId = null; + var _activeCount = 0; // 活动动画计数(避免遍历判断) + + // 属性码常量(避免重复查找 GameABCUtils.PropertyCodes) + var PROP_X = 18; + var PROP_Y = 19; + var PROP_SCALE = 33; + var PROP_ROTATION = 34; + var PROP_OPACITY = 35; + var PROP_FRAME = 43; + + // ============================================================================ + // 缓动函数 (内联优化) + // ============================================================================ + + var Easing = { + linear: function(t) { return t; }, + easeIn: function(t) { return t * t; }, + easeOut: function(t) { return t * (2 - t); }, + easeInOut: function(t) { return t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t; }, + easeInCubic: function(t) { return t * t * t; }, + easeOutCubic: function(t) { var t1 = t - 1; return t1 * t1 * t1 + 1; }, + easeInOutCubic: function(t) { return t < 0.5 ? 4 * t * t * t : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1; }, + elastic: function(t) { + return t === 0 || t === 1 ? t : + -Math.pow(2, 10 * (t - 1)) * Math.sin((t - 1.1) * 5 * Math.PI); + }, + bounce: function(t) { + if (t < 1 / 2.75) { return 7.5625 * t * t; } + if (t < 2 / 2.75) { t -= 1.5 / 2.75; return 7.5625 * t * t + 0.75; } + if (t < 2.5 / 2.75) { t -= 2.25 / 2.75; return 7.5625 * t * t + 0.9375; } + t -= 2.625 / 2.75; + return 7.5625 * t * t + 0.984375; + } + }; + + // 缓动函数缓存(启动时建立,避免每帧查找) + var _easingCache = {}; + for (var key in Easing) { + if (Easing.hasOwnProperty(key)) { + _easingCache[key] = Easing[key]; + } + } + + // ============================================================================ + // 动画管理(优化版) + // ============================================================================ + + /** + * 生成精灵动画唯一标识 (精灵ID + 动画类型) + * @private + */ + function _getSpriteAnimKey(spriteId, animType) { + return spriteId + '_' + animType; + } + + /** + * 停止精灵的同类型动画 (防止重复动画冲突) + * @private + */ + function _stopExistingSpriteAnimation(spriteId, animType) { + var key = _getSpriteAnimKey(spriteId, animType); + var existingAnimId = _spriteAnimMap[key]; + if (existingAnimId !== undefined) { + // 停止并移除旧动画 + var index = _animationMap[existingAnimId]; + if (index !== undefined) { + _animationList[index].stop(); + _removeAnimation(existingAnimId); + } + } + } + + /** + * 添加动画到活动列表 + * @private + */ + function _addAnimation(animation) { + // 如果同一精灵已有同类型动画在播放,先停止旧动画 + if (animation.spriteId && animation.animType) { + _stopExistingSpriteAnimation(animation.spriteId, animation.animType); + // 记录新动画 + var key = _getSpriteAnimKey(animation.spriteId, animation.animType); + _spriteAnimMap[key] = animation.id; + } + + var index = _animationList.length; + _animationList.push(animation); + _animationMap[animation.id] = index; + _activeCount++; + } + + /** + * 从活动列表移除动画(使用交换删除法避免数组移位) + * @private + */ + function _removeAnimation(animationId) { + var index = _animationMap[animationId]; + if (index === undefined) return; + + // 清理精灵动画映射 + var animation = _animationList[index]; + if (animation && animation.spriteId && animation.animType) { + var key = _getSpriteAnimKey(animation.spriteId, animation.animType); + if (_spriteAnimMap[key] === animationId) { + delete _spriteAnimMap[key]; + } + } + + var lastIndex = _animationList.length - 1; + + // 如果不是最后一个,用最后一个交换到当前位置 + if (index !== lastIndex) { + var lastAnimation = _animationList[lastIndex]; + _animationList[index] = lastAnimation; + _animationMap[lastAnimation.id] = index; + } + + // 移除最后一个 + _animationList.pop(); + delete _animationMap[animationId]; + _activeCount--; + } + + // ============================================================================ + // 动画基类 (优化版) + // ============================================================================ + + /** + * 动画基类 + * @constructor + */ + function Animation(config) { + this.id = _nextAnimationId++; + this.spriteId = config.spriteId; + this.animType = config.animType || 'generic'; // 动画类型标识,用于防止重复动画 + this.duration = config.duration || 300; + this.callback = config.callback; + this.startTime = 0; + this.elapsedTime = 0; + this.isPlaying = false; + this.isPaused = false; + this.isComplete = false; + + // 缓存缓动函数引用(避免每帧字符串查找) + this._easingFunc = _easingCache[config.easing] || Easing.linear; + } + + Animation.prototype.start = function() { + this.startTime = Date.now(); + this.isPlaying = true; + this.isPaused = false; + this.isComplete = false; + }; + + Animation.prototype.update = function(currentTime) { + if (!this.isPlaying || this.isPaused || this.isComplete) { + return; + } + + this.elapsedTime = currentTime - this.startTime; + var progress = this.elapsedTime / this.duration; + + if (progress >= 1) { + // 直接调用缓存的函数引用 + this.animate(this._easingFunc(1)); + this.complete(); + } else { + this.animate(this._easingFunc(progress)); + } + }; + + Animation.prototype.animate = function(progress) { + // 子类实现 + }; + + Animation.prototype.complete = function() { + this.isComplete = true; + this.isPlaying = false; + if (this.callback) { + this.callback(); + } + }; + + Animation.prototype.stop = function() { + this.isPlaying = false; + this.isPaused = false; + this.isComplete = true; + }; + + Animation.prototype.pause = function() { + if (this.isPlaying && !this.isPaused) { + this.isPaused = true; + } + }; + + Animation.prototype.resume = function() { + if (this.isPaused) { + this.isPaused = false; + this.startTime = Date.now() - this.elapsedTime; + } + }; + + // ============================================================================ + // 移动动画 (优化版 - 预计算差值) + // ============================================================================ + + /** + * 移动动画 + * @constructor + * @extends Animation + */ + function MoveAnimation(config) { + config.animType = 'move'; // 设置动画类型 + Animation.call(this, config); + this.fromX = config.fromX; + this.fromY = config.fromY; + this.toX = config.toX; + this.toY = config.toY; + // 预计算差值(避免每帧计算) + this._deltaX = this.toX - this.fromX; + this._deltaY = this.toY - this.fromY; + } + + MoveAnimation.prototype = Object.create(Animation.prototype); + MoveAnimation.prototype.constructor = MoveAnimation; + + MoveAnimation.prototype.animate = function(progress) { + SpriteManager.setPosition( + this.spriteId, + this.fromX + this._deltaX * progress, + this.fromY + this._deltaY * progress + ); + }; + + // ============================================================================ + // 缩放动画 (优化版) + // ============================================================================ + + /** + * 缩放动画 + * @constructor + * @extends Animation + */ + function ScaleAnimation(config) { + config.animType = 'scale'; // 设置动画类型 + Animation.call(this, config); + this.fromScale = config.fromScale !== undefined ? config.fromScale : 1; + this.toScale = config.toScale !== undefined ? config.toScale : 1; + // 预计算差值 + this._deltaScale = this.toScale - this.fromScale; + } + + ScaleAnimation.prototype = Object.create(Animation.prototype); + ScaleAnimation.prototype.constructor = ScaleAnimation; + + ScaleAnimation.prototype.animate = function(progress) { + var scale = this.fromScale + this._deltaScale * progress; + SpriteManager.setScale(this.spriteId, scale); + }; + + // ============================================================================ + // 旋转动画 (优化版) + // ============================================================================ + + /** + * 旋转动画 + * @constructor + * @extends Animation + */ + function RotateAnimation(config) { + config.animType = 'rotate'; // 设置动画类型 + Animation.call(this, config); + this.fromAngle = config.fromAngle || 0; + this.toAngle = config.toAngle || 0; + this._deltaAngle = this.toAngle - this.fromAngle; + } + + RotateAnimation.prototype = Object.create(Animation.prototype); + RotateAnimation.prototype.constructor = RotateAnimation; + + RotateAnimation.prototype.animate = function(progress) { + var angle = this.fromAngle + this._deltaAngle * progress; + SpriteManager.setRotation(this.spriteId, angle); + }; + + // ============================================================================ + // 淡入淡出动画 (优化版) + // ============================================================================ + + /** + * 淡入淡出动画 + * @constructor + * @extends Animation + */ + function FadeAnimation(config) { + config.animType = 'fade'; // 设置动画类型 + Animation.call(this, config); + this.fromAlpha = config.fromAlpha !== undefined ? config.fromAlpha : 1; + this.toAlpha = config.toAlpha !== undefined ? config.toAlpha : 1; + this._deltaAlpha = this.toAlpha - this.fromAlpha; + } + + FadeAnimation.prototype = Object.create(Animation.prototype); + FadeAnimation.prototype.constructor = FadeAnimation; + + FadeAnimation.prototype.animate = function(progress) { + var alpha = this.fromAlpha + this._deltaAlpha * progress; + SpriteManager.setOpacity(this.spriteId, alpha); + }; + + // ============================================================================ + // 帧动画 (优化版 - 只在帧变化时更新) + // ============================================================================ + + /** + * 帧动画 - 用于播放多帧图片序列动画 + * @constructor + * @extends Animation + * @param {Object} config - 配置对象 + * @param {number} config.spriteId - 精灵ID + * @param {number} config.startFrame - 起始帧(从1开始) + * @param {number} config.endFrame - 结束帧 + * @param {number} config.duration - 持续时间(ms),单次播放时间 + * @param {boolean} [config.loop=false] - 是否循环播放 + * @param {number} [config.loopCount=-1] - 循环次数,-1表示无限循环 + * @param {boolean} [config.pingPong=false] - 是否往返播放(1-2-3-2-1) + * @param {string} [config.easing='linear'] - 缓动函数 + * @param {Function} [config.callback] - 完成回调 + * @param {Function} [config.onFrame] - 帧变化回调 + */ + function FrameAnimation(config) { + config.animType = 'frame'; // 设置动画类型 + Animation.call(this, config); + this.startFrame = config.startFrame || 1; + this.endFrame = config.endFrame || 1; + this.loop = config.loop || false; + this.loopCount = config.loopCount !== undefined ? config.loopCount : -1; + this.pingPong = config.pingPong || false; + this.onFrame = config.onFrame; + + // 预计算(避免每帧计算) + this._totalFrames = Math.abs(this.endFrame - this.startFrame) + 1; + this._frameRange = this._totalFrames - 1; + this._minFrame = Math.min(this.startFrame, this.endFrame); + this._maxFrame = Math.max(this.startFrame, this.endFrame); + this._lastFrame = -1; + this._singleDuration = config.duration || 300; + + // 循环时重新计算总时长 + if (this.loop && this.loopCount > 0) { + this.duration = this._singleDuration * this.loopCount; + if (this.pingPong) { + this.duration = this.duration * 2; + } + } + } + + FrameAnimation.prototype = Object.create(Animation.prototype); + FrameAnimation.prototype.constructor = FrameAnimation; + + FrameAnimation.prototype.animate = function(progress) { + var currentFrame; + + if (this.loop && this.loopCount < 0) { + // 无限循环模式,使用循环进度 + var elapsed = this.elapsedTime % this._singleDuration; + var loopProgress = elapsed / this._singleDuration; + + if (this.pingPong) { + var cycleTime = this._singleDuration * 2; + var cycleElapsed = this.elapsedTime % cycleTime; + if (cycleElapsed < this._singleDuration) { + loopProgress = cycleElapsed / this._singleDuration; + } else { + loopProgress = 1 - (cycleElapsed - this._singleDuration) / this._singleDuration; + } + } + + currentFrame = Math.floor(this.startFrame + loopProgress * this._frameRange); + } else if (this.loop && this.loopCount > 0) { + // 有限循环模式 - 修复循环逻辑 + var elapsed = this.elapsedTime % this._singleDuration; + var loopProgress = elapsed / this._singleDuration; + + if (this.pingPong) { + var cycleTime = this._singleDuration * 2; + var cycleElapsed = this.elapsedTime % cycleTime; + if (cycleElapsed < this._singleDuration) { + loopProgress = cycleElapsed / this._singleDuration; + } else { + loopProgress = 1 - (cycleElapsed - this._singleDuration) / this._singleDuration; + } + } + + currentFrame = Math.floor(this.startFrame + loopProgress * this._frameRange); + } else { + // 非循环模式 + if (this.pingPong) { + if (progress < 0.5) { + currentFrame = Math.floor(this.startFrame + (progress * 2) * this._frameRange); + } else { + currentFrame = Math.floor(this.endFrame - ((progress - 0.5) * 2) * this._frameRange); + } + } else { + currentFrame = Math.floor(this.startFrame + progress * this._frameRange); + } + } + + // 确保帧号在范围内 + if (currentFrame < this._minFrame) currentFrame = this._minFrame; + if (currentFrame > this._maxFrame) currentFrame = this._maxFrame; + + // 只有帧变化时才更新(重要优化) + if (currentFrame !== this._lastFrame) { + SpriteManager.setFrame(this.spriteId, currentFrame); + this._lastFrame = currentFrame; + + if (this.onFrame) { + this.onFrame(currentFrame, this.spriteId); + } + } + }; + + FrameAnimation.prototype.update = function(currentTime) { + if (!this.isPlaying || this.isPaused || this.isComplete) { + return; + } + + this.elapsedTime = currentTime - this.startTime; + + // 无限循环模式,永不结束 + if (this.loop && this.loopCount < 0) { + this.animate(0); + return; + } + + var progress = this.elapsedTime / this.duration; + + if (progress >= 1) { + this.animate(this._easingFunc(1)); + this.complete(); + } else { + this.animate(this._easingFunc(progress)); + } + }; + + // ============================================================================ + // 动画队列 (优化版) + // ============================================================================ + + /** + * 动画队列 + * @constructor + * @param {string} type - 队列类型: 'serial' 或 'parallel' + */ + function AnimationQueue(type) { + this.id = _nextQueueId++; + this.type = type || 'serial'; + this.animations = []; + this.currentIndex = 0; + this.isPlaying = false; + this.isPaused = false; + this.callback = null; + } + + AnimationQueue.prototype.add = function(animation) { + this.animations.push(animation); + }; + + AnimationQueue.prototype.play = function(callback) { + this.callback = callback; + this.isPlaying = true; + this.isPaused = false; + this.currentIndex = 0; + + if (this.type === 'serial') { + this._playSerial(); + } else { + this._playParallel(); + } + }; + + AnimationQueue.prototype._playSerial = function() { + var self = this; + + if (self.currentIndex >= self.animations.length) { + self._complete(); + return; + } + + var animation = self.animations[self.currentIndex]; + var originalCallback = animation.callback; + + animation.callback = function() { + if (originalCallback) { + originalCallback(); + } + self.currentIndex++; + self._playSerial(); + }; + + _addAnimation(animation); + animation.start(); + }; + + AnimationQueue.prototype._playParallel = function() { + var self = this; + var completedCount = 0; + var totalAnimations = self.animations.length; + + for (var i = 0; i < totalAnimations; i++) { + var animation = self.animations[i]; + var originalCallback = animation.callback; + + // 使用闭包捕获originalCallback + animation.callback = (function(origCb) { + return function() { + if (origCb) { + origCb(); + } + completedCount++; + if (completedCount >= totalAnimations) { + self._complete(); + } + }; + })(originalCallback); + + _addAnimation(animation); + animation.start(); + } + }; + + AnimationQueue.prototype._complete = function() { + this.isPlaying = false; + if (this.callback) { + this.callback(); + } + }; + + AnimationQueue.prototype.stop = function() { + this.isPlaying = false; + for (var i = 0; i < this.animations.length; i++) { + this.animations[i].stop(); + } + }; + + AnimationQueue.prototype.pause = function() { + if (!this.isPaused) { + this.isPaused = true; + for (var i = 0; i < this.animations.length; i++) { + this.animations[i].pause(); + } + } + }; + + AnimationQueue.prototype.resume = function() { + if (this.isPaused) { + this.isPaused = false; + for (var i = 0; i < this.animations.length; i++) { + this.animations[i].resume(); + } + } + }; + + AnimationQueue.prototype.clear = function() { + this.stop(); + this.animations = []; + this.currentIndex = 0; + }; + + // ============================================================================ + // 动画循环 (优化版 - 数组遍历) + // ============================================================================ + + /** + * 动画循环 + * @private + */ + function _animationLoop() { + var currentTime = Date.now(); + var i, animation; + var toRemove = []; + + // 使用数组遍历(比 for...in 快) + for (i = 0; i < _animationList.length; i++) { + animation = _animationList[i]; + animation.update(currentTime); + + // 收集已完成的动画 + if (animation.isComplete) { + toRemove.push(animation.id); + } + } + + // 移除已完成的动画 + for (i = 0; i < toRemove.length; i++) { + _removeAnimation(toRemove[i]); + } + + // 继续下一帧(使用计数器避免遍历检查) + if (_activeCount > 0) { + _rafId = requestAnimationFrame(_animationLoop); + } else { + _rafId = null; + } + } + + /** + * 启动动画循环 + * @private + */ + function _startAnimationLoop() { + if (!_rafId && _activeCount > 0) { + _rafId = requestAnimationFrame(_animationLoop); + } + } + + // ============================================================================ + // 公共API + // ============================================================================ + + /** + * 初始化动画管理器 + */ + AnimationManager.init = function() { + if (_initialized) { + console.warn('[AnimationManager] Already initialized'); + return; + } + + _initialized = true; + console.log('[AnimationManager] Initialized (v2.0.0 optimized)'); + }; + + /** + * 移动动画 + * @param {number} spriteId - 精灵ID + * @param {number} fromX - 起始X坐标 + * @param {number} fromY - 起始Y坐标 + * @param {number} toX - 目标X坐标 + * @param {number} toY - 目标Y坐标 + * @param {number} duration - 持续时间(ms) + * @param {string} easing - 缓动函数 + * @param {Function} callback - 完成回调 + * @returns {number} 动画ID + */ + AnimationManager.move = function(spriteId, fromX, fromY, toX, toY, duration, easing, callback) { + var animation = new MoveAnimation({ + spriteId: spriteId, + fromX: fromX, + fromY: fromY, + toX: toX, + toY: toY, + duration: duration, + easing: easing, + callback: callback + }); + + _addAnimation(animation); + animation.start(); + _startAnimationLoop(); + + return animation.id; + }; + + /** + * 缩放动画 + * @param {number} spriteId - 精灵ID + * @param {number} fromScale - 起始缩放 + * @param {number} toScale - 目标缩放 + * @param {number} duration - 持续时间(ms) + * @param {string} easing - 缓动函数 + * @param {Function} callback - 完成回调 + * @returns {number} 动画ID + */ + AnimationManager.scale = function(spriteId, fromScale, toScale, duration, easing, callback) { + var animation = new ScaleAnimation({ + spriteId: spriteId, + fromScale: fromScale, + toScale: toScale, + duration: duration, + easing: easing, + callback: callback + }); + + _addAnimation(animation); + animation.start(); + _startAnimationLoop(); + + return animation.id; + }; + + /** + * 旋转动画 + * @param {number} spriteId - 精灵ID + * @param {number} fromAngle - 起始角度 + * @param {number} toAngle - 目标角度 + * @param {number} duration - 持续时间(ms) + * @param {string} easing - 缓动函数 + * @param {Function} callback - 完成回调 + * @returns {number} 动画ID + */ + AnimationManager.rotate = function(spriteId, fromAngle, toAngle, duration, easing, callback) { + var animation = new RotateAnimation({ + spriteId: spriteId, + fromAngle: fromAngle, + toAngle: toAngle, + duration: duration, + easing: easing, + callback: callback + }); + + _addAnimation(animation); + animation.start(); + _startAnimationLoop(); + + return animation.id; + }; + + /** + * 淡入淡出动画 + * @param {number} spriteId - 精灵ID + * @param {number} fromAlpha - 起始透明度(0-1) + * @param {number} toAlpha - 目标透明度(0-1) + * @param {number} duration - 持续时间(ms) + * @param {string} easing - 缓动函数 + * @param {Function} callback - 完成回调 + * @returns {number} 动画ID + */ + AnimationManager.fade = function(spriteId, fromAlpha, toAlpha, duration, easing, callback) { + var animation = new FadeAnimation({ + spriteId: spriteId, + fromAlpha: fromAlpha, + toAlpha: toAlpha, + duration: duration, + easing: easing, + callback: callback + }); + + _addAnimation(animation); + animation.start(); + _startAnimationLoop(); + + return animation.id; + }; + + /** + * 帧动画 + * @param {number} spriteId - 精灵ID + * @param {number} startFrame - 起始帧(从1开始) + * @param {number} endFrame - 结束帧 + * @param {number} duration - 持续时间(ms) + * @param {Object} options - 可选配置 + * @param {boolean} [options.loop=false] - 是否循环播放 + * @param {number} [options.loopCount=-1] - 循环次数,-1表示无限循环 + * @param {boolean} [options.pingPong=false] - 是否往返播放 + * @param {string} [options.easing='linear'] - 缓动函数 + * @param {Function} [options.onFrame] - 帧变化回调 + * @param {Function} [options.callback] - 完成回调 + * @returns {number} 动画ID + */ + AnimationManager.frame = function(spriteId, startFrame, endFrame, duration, options) { + options = options || {}; + + var animation = new FrameAnimation({ + spriteId: spriteId, + startFrame: startFrame, + endFrame: endFrame, + duration: duration, + loop: options.loop, + loopCount: options.loopCount, + pingPong: options.pingPong, + easing: options.easing, + onFrame: options.onFrame, + callback: options.callback + }); + + _addAnimation(animation); + animation.start(); + _startAnimationLoop(); + + return animation.id; + }; + + /** + * 播放循环帧动画(快捷方法) + * @param {number} spriteId - 精灵ID + * @param {number} startFrame - 起始帧(从1开始) + * @param {number} endFrame - 结束帧 + * @param {number} frameInterval - 每帧间隔(ms) + * @param {Function} [callback] - 完成回调(循环动画通常不会调用) + * @returns {number} 动画ID + */ + AnimationManager.frameLoop = function(spriteId, startFrame, endFrame, frameInterval, callback) { + var totalFrames = Math.abs(endFrame - startFrame) + 1; + var duration = frameInterval * totalFrames; + + return AnimationManager.frame(spriteId, startFrame, endFrame, duration, { + loop: true, + loopCount: -1, + callback: callback + }); + }; + + /** + * 创建动画队列 + * @param {string} type - 队列类型: 'serial'(串行) 或 'parallel'(并行) + * @returns {number} 队列ID + */ + AnimationManager.createQueue = function(type) { + var queue = new AnimationQueue(type); + _queues[queue.id] = queue; + return queue.id; + }; + + /** + * 添加动画到队列 + * @param {number} queueId - 队列ID + * @param {Object} animationConfig - 动画配置 + * @param {string} animationConfig.type - 动画类型: 'move'/'scale'/'rotate'/'fade'/'frame' + */ + AnimationManager.addToQueue = function(queueId, animationConfig) { + var queue = _queues[queueId]; + if (!queue) { + console.error('[AnimationManager] Queue not found:', queueId); + return; + } + + var animation; + switch (animationConfig.type) { + case 'move': + animation = new MoveAnimation(animationConfig); + break; + case 'scale': + animation = new ScaleAnimation(animationConfig); + break; + case 'rotate': + animation = new RotateAnimation(animationConfig); + break; + case 'fade': + animation = new FadeAnimation(animationConfig); + break; + case 'frame': + animation = new FrameAnimation(animationConfig); + break; + default: + console.error('[AnimationManager] Unknown animation type:', animationConfig.type); + return; + } + + queue.add(animation); + }; + + /** + * 播放队列 + * @param {number} queueId - 队列ID + * @param {Function} callback - 完成回调 + */ + AnimationManager.playQueue = function(queueId, callback) { + var queue = _queues[queueId]; + if (!queue) { + console.error('[AnimationManager] Queue not found:', queueId); + return; + } + + queue.play(callback); + _startAnimationLoop(); + }; + + /** + * 停止队列 + * @param {number} queueId - 队列ID + */ + AnimationManager.stopQueue = function(queueId) { + var queue = _queues[queueId]; + if (queue) { + queue.stop(); + } + }; + + /** + * 清空队列 + * @param {number} queueId - 队列ID + */ + AnimationManager.clearQueue = function(queueId) { + var queue = _queues[queueId]; + if (queue) { + queue.clear(); + delete _queues[queueId]; + } + }; + + /** + * 停止动画 + * @param {number} animationId - 动画ID + */ + AnimationManager.stopAnimation = function(animationId) { + var index = _animationMap[animationId]; + if (index !== undefined) { + _animationList[index].stop(); + _removeAnimation(animationId); + } + }; + + /** + * 暂停动画 + * @param {number} animationId - 动画ID + */ + AnimationManager.pauseAnimation = function(animationId) { + var index = _animationMap[animationId]; + if (index !== undefined) { + _animationList[index].pause(); + } + }; + + /** + * 恢复动画 + * @param {number} animationId - 动画ID + */ + AnimationManager.resumeAnimation = function(animationId) { + var index = _animationMap[animationId]; + if (index !== undefined) { + _animationList[index].resume(); + _startAnimationLoop(); + } + }; + + /** + * 获取活动动画数量 + * @returns {number} + */ + AnimationManager.getActiveAnimations = function() { + return _activeCount; + }; + + /** + * 清空所有动画 + */ + AnimationManager.clearAllAnimations = function() { + // 停止所有动画 + for (var i = 0; i < _animationList.length; i++) { + _animationList[i].stop(); + } + + // 清空数据结构 + _animationList = []; + _animationMap = {}; + _spriteAnimMap = {}; // 清空精灵动画映射 + _activeCount = 0; + + // 清空队列 + for (var qId in _queues) { + if (_queues.hasOwnProperty(qId)) { + _queues[qId].clear(); + } + } + _queues = {}; + + // 停止动画循环 + if (_rafId) { + cancelAnimationFrame(_rafId); + _rafId = null; + } + }; + + /** + * 获取状态 + * @returns {Object} + */ + AnimationManager.getStatus = function() { + return { + initialized: _initialized, + activeAnimations: _activeCount, + activeQueues: Object.keys(_queues).length, + version: '2.0.0' + }; + }; + + /** + * 获取可用的缓动函数列表 + * @returns {Array} + */ + AnimationManager.getEasingList = function() { + return Object.keys(_easingCache); + }; + +})(); diff --git a/client/js/gameabc-framework/system/AudioManager.js b/client/js/gameabc-framework/system/AudioManager.js new file mode 100644 index 0000000..bdba8e9 --- /dev/null +++ b/client/js/gameabc-framework/system/AudioManager.js @@ -0,0 +1,351 @@ +/** + * AudioManager.js - 音频管理器(框架层) + * + * 功能: + * 1. 统一管理游戏音效和背景音乐的播放/停止 + * 2. 封装底层音频API (Utl.playSound/stopSound/playMusic/stopMusic) + * 3. 提供根据性别选择语音的通用基础设施 + * + * ⚠️ 框架设计原则: + * - 本文件不包含任何具体游戏的资源常量(不引用 SoundResources) + * - 不包含任何游戏专属的 ID 映射(如麻将牌值、动作类型) + * - 游戏专属逻辑在子游戏侧封装(如 GameAudio.js) + * - 静音开关与音量由平台层(Utl / 平台设置)统一处理,本文件不维护其状态 + * + * 核心 API: + * - AudioManager.playSound(soundFile) // 播放任意音效文件 + * - AudioManager.playVoice(baseId, sex) // 播放语音(自动切换男/女音) + * - AudioManager.playVoiceBySeat(seat, baseId) // 播放语音(从座位自动获取性别) + * - AudioManager.playMusic() // 播放背景音乐 + * + * 性别判断: + * - sex === 2 为女性,女音文件 ID = 男音 baseId + FEMALE_VOICE_OFFSET (100) + * - 可通过 Utl.getSexBySeat(seat) 获取座位上玩家的性别 + * + * 注意: + * - 背景音乐需要在 Game_Config.soundList 中配置 + * - 游戏专属的 ID 映射(牌值/动作类型等)由子游戏侧 GameAudio.js 维护 + * - 是否静音 / 音量大小由平台层 Utl.playSound / Utl.playMusic 内部按用户设置决定 + * + * ============================================================================ + * @guide 开发指南 - AudioManager 使用规范 + * ============================================================================ + * + * 【初始化(UIBootstrap 或游戏入口调用一次)】 + * AudioManager.init(); + * + * 【播放任意音效文件(游戏层传文件名)】 + * AudioManager.playSound('00101.mp3'); + * // 通常配合游戏侧常量使用: + * AudioManager.playSound(SoundResources.EFFECTS.DISCARD); + * + * 【通用性别语音播放(框架层 API,游戏层控制 ID)】 + * + * gameabc 引擎语音文件命名规则: + * - 文件名统一为 5位数字 + ".mp3",如 "00151.mp3" + * - 男音使用基础 ID,女音 = 基础 ID + FEMALE_VOICE_OFFSET(默认 100) + * - 例:男音 baseId=151 → "00151.mp3",女音 → "00251.mp3" + * + * // 指定 baseId 和性别(ID 含义由游戏层定义): + * AudioManager.playVoice(151, sex); // 自动切换男/女音 + * AudioManager.playVoiceBySeat(seat, 151); // 从座位自动获取性别再播放 + * + * 【游戏侧扩展模式(在子游戏中创建 GameAudio.js)】 + * + * // 子游戏自行维护 ID 映射,调用框架的 playVoice/playVoiceBySeat + * var ACTION_VOICE_BASE_ID = { + * 'peng': 152, 'gang': 153, 'hu': 154, 'chi': 151 + * }; + * GameAudio.playActionBySeat = function(seat, action) { + * var baseId = ACTION_VOICE_BASE_ID[action]; + * if (baseId) AudioManager.playVoiceBySeat(seat, baseId); + * }; + * // 调用:GameAudio.playActionBySeat(seat, 'peng'); + * + * 【背景音乐】 + * AudioManager.playMusic(); // 播放(需在 Game_Config.soundList 中配置) + * AudioManager.stopMusic(); + * + * @version 4.0.0 + * @date 2026-06-08 + */ + +var AudioManager = AudioManager || {}; + +(function() { + 'use strict'; + + // ============================================================================ + // 私有变量 + // ============================================================================ + + var _initialized = false; + var _currentMusic = null; + var _playingSounds = {}; // { soundFile: playCount } + + // ============================================================================ + // 框架常量 - gameabc 引擎语音规则 + // ============================================================================ + + /** + * 女性语音 ID 偏移量 + * gameabc 引擎约定:女音文件 ID = 男音基础 ID + FEMALE_VOICE_OFFSET + */ + var FEMALE_VOICE_OFFSET = 100; + + /** + * 女性性别值(来自 Utl.getSexBySeat 返回值约定) + */ + var SEX_FEMALE = 2; + + // ============================================================================ + // 私有方法 + // ============================================================================ + + /** + * 检查 Utl API 是否可用 + * @private + */ + function _isUtlAvailable() { + return typeof Utl !== 'undefined'; + } + + /** + * 格式化语音文件名 + * gameabc 引擎语音文件统一为 5位数字 + .mp3 + * @private + * @param {number} fileNum + * @returns {string} 如 "00151.mp3" + */ + function _formatSoundFile(fileNum) { + var s = String(fileNum); + while (s.length < 5) { s = '0' + s; } + return s + '.mp3'; + } + + function _isFemale(sex) { + return sex === SEX_FEMALE; + } + + /** + * 通过座位号获取玩家性别 + * @private + * @param {number} seat + * @returns {number} 性别值(2=女,其他=男) + */ + function _getSexBySeat(seat) { + if (_isUtlAvailable() && typeof Utl.getSexBySeat === 'function') { + return Utl.getSexBySeat(seat); + } + return 1; + } + + /** + * 根据性别获取语音 ID 偏移量 + * @private + * @param {number} sex + * @returns {number} 0(男)或 FEMALE_VOICE_OFFSET(女) + */ + function _getVoiceOffset(sex) { + return _isFemale(sex) ? FEMALE_VOICE_OFFSET : 0; + } + + // ============================================================================ + // 公共 API - 初始化 + // ============================================================================ + + /** + * 初始化音频管理器 + * 静音/音量由平台层处理,本管理器无需配置项。 + */ + AudioManager.init = function() { + if (_initialized) { + console.warn('[AudioManager] Already initialized'); + return; + } + _initialized = true; + console.log('[AudioManager] Initialized (v4.0.0)'); + }; + + // ============================================================================ + // 公共 API - 音效播放 + // ============================================================================ + + /** + * 播放音效 + * @param {string} soundFile - 文件名,如 "00101.mp3" 或游戏侧常量 + * @returns {boolean} + */ + AudioManager.playSound = function(soundFile) { + if (!soundFile) { return false; } + if (!_isUtlAvailable() || !Utl.playSound) { + console.warn('[AudioManager] Utl.playSound not available'); + return false; + } + try { + Utl.playSound(soundFile); + _playingSounds[soundFile] = (_playingSounds[soundFile] || 0) + 1; + return true; + } catch (e) { + console.error('[AudioManager] playSound error:', soundFile, e); + return false; + } + }; + + /** + * 停止音效 + * @param {string} soundFile + * @returns {boolean} + */ + AudioManager.stopSound = function(soundFile) { + if (!soundFile) { return false; } + if (!_isUtlAvailable() || !Utl.stopSound) { + console.warn('[AudioManager] Utl.stopSound not available'); + return false; + } + try { + Utl.stopSound(soundFile); + if (_playingSounds[soundFile]) { + _playingSounds[soundFile]--; + if (_playingSounds[soundFile] <= 0) { delete _playingSounds[soundFile]; } + } + return true; + } catch (e) { + console.error('[AudioManager] stopSound error:', soundFile, e); + return false; + } + }; + + /** 停止所有音效 */ + AudioManager.stopAllSounds = function() { + for (var f in _playingSounds) { + if (_playingSounds.hasOwnProperty(f)) { this.stopSound(f); } + } + _playingSounds = {}; + }; + + // ============================================================================ + // 公共 API - 性别语音(通用) + // ============================================================================ + + /** + * 根据 baseId 和性别播放语音 + * 框架自动应用偏移:女音 = baseId + FEMALE_VOICE_OFFSET + * 游戏层负责维护 baseId 含义(哪个 ID 对应哪张牌/动作) + * + * @param {number} baseId - 男音基础 ID(如 151) + * @param {number} [sex=1] - 性别(2=女,其他=男) + * @returns {boolean} + */ + AudioManager.playVoice = function(baseId, sex) { + if (!baseId) { return false; } + return this.playSound(_formatSoundFile(baseId + _getVoiceOffset(sex))); + }; + + /** + * 从座位自动获取性别后播放语音(推荐用法) + * @param {number} seat - 座位号 + * @param {number} baseId - 男音基础 ID + * @returns {boolean} + */ + AudioManager.playVoiceBySeat = function(seat, baseId) { + return this.playVoice(baseId, _getSexBySeat(seat)); + }; + + /** + * 获取语音文件名(不播放,用于预加载或调试) + * @param {number} baseId + * @param {number} [sex=1] + * @returns {string} 如 "00151.mp3" + */ + AudioManager.getVoiceFile = function(baseId, sex) { + return _formatSoundFile(baseId + _getVoiceOffset(sex)); + }; + + // ============================================================================ + // 公共 API - 背景音乐 + // ============================================================================ + + /** + * 播放背景音乐 + * 注意:需在 Game_Config.soundList 中配置 + * @returns {boolean} + */ + AudioManager.playMusic = function() { + if (!_isUtlAvailable() || !Utl.playMusic) { + console.warn('[AudioManager] Utl.playMusic not available'); + return false; + } + try { + Utl.playMusic(); + _currentMusic = true; + return true; + } catch (e) { + console.error('[AudioManager] playMusic error:', e); + return false; + } + }; + + /** + * 停止背景音乐 + * @returns {boolean} + */ + AudioManager.stopMusic = function() { + if (!_isUtlAvailable() || !Utl.stopMusic) { return false; } + try { + Utl.stopMusic(); + _currentMusic = null; + return true; + } catch (e) { + console.error('[AudioManager] stopMusic error:', e); + return false; + } + }; + + /** 暂停背景音乐(等同 stopMusic) */ + AudioManager.pauseMusic = function() { + return this.stopMusic(); + }; + + /** 恢复背景音乐 */ + AudioManager.resumeMusic = function() { + if (_currentMusic) { return this.playMusic(); } + return false; + }; + + // ============================================================================ + // 公共API - 状态 + // ============================================================================ + + /** + * 获取音频管理器状态 + * @returns {Object} + */ + AudioManager.getStatus = function() { + var playingCount = 0; + for (var key in _playingSounds) { + if (_playingSounds.hasOwnProperty(key)) { + playingCount += _playingSounds[key]; + } + } + + return { + initialized: _initialized, + playingSoundsCount: playingCount, + isMusicPlaying: !!_currentMusic, + version: '4.0.0' + }; + }; + + /** + * 销毁音频管理器 + */ + AudioManager.destroy = function() { + this.stopAllSounds(); + this.stopMusic(); + _playingSounds = {}; + _currentMusic = null; + _initialized = false; + }; + +})(); diff --git a/client/js/gameabc-framework/system/EventBus.js b/client/js/gameabc-framework/system/EventBus.js new file mode 100644 index 0000000..9b343e3 --- /dev/null +++ b/client/js/gameabc-framework/system/EventBus.js @@ -0,0 +1,234 @@ +/** + * 事件总线 (独立模块) + * 职责: 提供模块间的事件通信机制,解耦模块依赖 + * 遵循原则: 发布-订阅模式,支持事件监听和触发 + * + * ============================================================================ + * @guide 开发指南 - EventBus 使用规范 + * ============================================================================ + * + * 【事件命名规范】 + * 使用 "模块:动作" 两段式命名,所有名称定义在 EventBus.Events 常量中: + * 'game:started' 游戏开始 + * 'game:finished' 游戏结束 + * 'player:discarded' 玩家出牌 + * 说明:框架只内置通用事件(game:/player:/room:/ui:/network: 等);具体玩法的 + * 专属事件(如发牌/摸牌/吃碰杠)由子游戏自行追加到 EventBus.Events,框架不内置。 + * ⚠️ 不要硬编码字符串,统一用 EventBus.Events.XXX 引用 + * + * 【订阅事件(在组件 init 中注册)】 + * // 在 BaseComponent.init 或 Object.create 的 init 方法中: + * var self = this; + * var unsubscribe = EventBus.on(EventBus.Events.GAME_STARTED, function(data) { + * self._onGameStarted(data); + * }, self); + * // 保存引用用于 destroy 时清理 + * this.eventListeners['game:started'] = unsubscribe; + * + * 【发布事件】 + * // 在控制器或业务逻辑中发布: + * EventBus.emit(EventBus.Events.GAME_STARTED, { playerCount: 4 }); + * EventBus.emit('player:discarded', { seat: 0, card: cardData }); + * + * 【一次性事件(触发后自动取消)】 + * EventBus.once(EventBus.Events.GAME_FINISHED, function(data) { + * self._showSettleUI(data); + * }); + * + * 【在 destroy 中清理(防内存泄漏)】 + * // 如果用 BaseComponent 的 addEventListener,destroy 时自动清理 + * // 如果手动保存了 unsubscribe 函数: + * if (this.eventListeners['game:started']) { + * this.eventListeners['game:started'](); // 调用取消函数 + * } + * // 或者 BaseComponent.destroy() 会自动处理 this.eventListeners 中的所有项 + * + * 【推荐:通过 BaseComponent.addEventListener 代替手动管理】 + * // BaseComponent 子类中: + * this.addEventListener(EventBus.Events.PLAYER_DISCARDED, function(data) { + * self._onPlayerDiscarded(data); + * }); + * // destroy() 时 BaseComponent 会自动调用所有 off + */ +var EventBus = { + /** + * 私有数据存储 + * @private + */ + _listeners: {}, // 事件监听器列表 {eventName: [callbacks]} + + /** + * 订阅事件 + * @param {String} eventName - 事件名称 + * @param {Function} callback - 回调函数 + * @param {Object} context - 回调函数的上下文(this) + * @return {Function} 取消订阅函数 + */ + on: function(eventName, callback, context) { + if (!eventName || typeof callback !== 'function') { + console.error('❌ EventBus.on: 无效的参数'); + return null; + } + + if (!this._listeners[eventName]) { + this._listeners[eventName] = []; + } + + var listener = { + callback: callback, + context: context || null + }; + + this._listeners[eventName].push(listener); + console.log('✅ EventBus: 订阅事件', eventName); + + // 返回取消订阅函数 + var self = this; + return function() { + self.off(eventName, callback); + }; + }, + + /** + * 订阅一次性事件(触发后自动取消订阅) + * @param {String} eventName - 事件名称 + * @param {Function} callback - 回调函数 + * @param {Object} context - 回调函数的上下文 + * @return {Function} 取消订阅函数 + */ + once: function(eventName, callback, context) { + var self = this; + + var onceCallback = function() { + callback.apply(context || null, arguments); + self.off(eventName, onceCallback); + }; + + return this.on(eventName, onceCallback, context); + }, + + /** + * 取消订阅事件 + * @param {String} eventName - 事件名称 + * @param {Function} callback - 要取消的回调函数(可选,不传则取消所有) + * @return {Boolean} 是否取消成功 + */ + off: function(eventName, callback) { + if (!this._listeners[eventName]) { + return false; + } + + // 如果没有指定callback,取消该事件的所有监听器 + if (!callback) { + delete this._listeners[eventName]; + console.log('✅ EventBus: 取消所有', eventName, '监听器'); + return true; + } + + // 取消指定的callback + var listeners = this._listeners[eventName]; + for (var i = listeners.length - 1; i >= 0; i--) { + if (listeners[i].callback === callback) { + listeners.splice(i, 1); + console.log('✅ EventBus: 取消', eventName, '监听器'); + return true; + } + } + + return false; + }, + + /** + * 触发事件 + * @param {String} eventName - 事件名称 + * @param {*} data - 事件数据(可选) + * @return {Number} 触发的监听器数量 + */ + emit: function(eventName, data) { + if (!this._listeners[eventName]) { + return 0; + } + + var listeners = this._listeners[eventName].slice(); // 复制数组,避免迭代中修改 + var count = 0; + + console.log('📡 EventBus: 触发事件', eventName, data); + + for (var i = 0; i < listeners.length; i++) { + try { + var listener = listeners[i]; + listener.callback.call(listener.context, data); + count++; + } catch (error) { + console.error('❌ EventBus: 事件回调异常', eventName, error); + } + } + + return count; + }, + + /** + * 检查事件是否有监听器 + * @param {String} eventName - 事件名称 + * @return {Boolean} 是否有监听器 + */ + hasListener: function(eventName) { + return !!(this._listeners[eventName] && this._listeners[eventName].length > 0); + }, + + /** + * 获取事件的监听器数量 + * @param {String} eventName - 事件名称 + * @return {Number} 监听器数量 + */ + getListenerCount: function(eventName) { + return this._listeners[eventName] ? this._listeners[eventName].length : 0; + }, + + /** + * 获取所有事件名称 + * @return {Array} 事件名称数组 + */ + getEventNames: function() { + var names = []; + for (var name in this._listeners) { + if (this._listeners.hasOwnProperty(name)) { + names.push(name); + } + } + return names; + }, + + /** + * 清空所有事件监听器 + */ + clear: function() { + this._listeners = {}; + console.log('✅ EventBus: 已清空所有监听器'); + }, + + /** + * 清空指定事件的所有监听器 + * @param {String} eventName - 事件名称 + */ + clearEvent: function(eventName) { + if (this._listeners[eventName]) { + delete this._listeners[eventName]; + console.log('✅ EventBus: 已清空', eventName, '的所有监听器'); + } + } +}; + +/** + * 事件名称常量容器(框架不预置任何具体事件名) + * + * 框架保持「游戏中立」:只提供发布-订阅机制与一个空的 EventBus.Events 容器, + * 不预定义任何事件名称常量。各子游戏在自身事件常量文件(如 + * game/constants/GameEvents.js)中向 EventBus.Events 注册自己用到的【全部】事件, + * 业务侧统一通过 EventBus.Events.XXX 引用。 + * + * 命名规范:两段式 "模块:动作"。例如通用语义 'game:started' / 'player:discarded' / + * 'room:updated' / 'ui:sceneChanged' / 'network:connected';玩法专属自定前缀(如 + * 'mahjong:tilesDealt')。统一用常量引用,不在业务中硬编码字符串。 + */ +EventBus.Events = {}; diff --git a/client/js/gameabc-framework/system/SpriteEventController.js b/client/js/gameabc-framework/system/SpriteEventController.js new file mode 100644 index 0000000..2b60f22 --- /dev/null +++ b/client/js/gameabc-framework/system/SpriteEventController.js @@ -0,0 +1,370 @@ +// ============================================================================ +// 精灵事件控制器 (gameabc-framework / system, ES5标准) +// 基于 gameabc 引擎的精灵交互事件分发框架——游戏中立,可被任意子游戏复用 +// ============================================================================ + +/** + * SpriteEventController —— 通用精灵交互事件分发器 + * + * 职责: + * 接收平台引擎透传的精灵交互事件(按下/长按/松开/拖拽/绘制前/绘制), + * 按「精灵 ID」分发到注册的处理函数;并提供「全局绘制钩子」供需要对每个 + * 绘制事件统一处理的子游戏能力(如牌面标记叠绘)挂载。 + * + * 中立原则: + * 本控制器不含任何具体玩法逻辑。玩法专属的“每帧绘制”处理由子游戏通过 + * registerGlobalDraw(handler) 注册,框架只负责遍历回调,不认识具体业务。 + * + * 接入方式(由子游戏受限入口 Game_Modify.* 转调): + * Game_Modify.utlmousedown → SpriteEventController.handleMouseDown(...) + * Game_Modify.utlmousedown_nomove → handleMouseDownNoMove(...) + * Game_Modify.mouseup → handleMouseUp(...) + * Game_Modify.utlmousemove → handleMouseMove(...) + * Game_Modify.utlgamemydrawbegin → handleDrawBegin(...) + * Game_Modify.gamemydraw → handleDraw(...) + * + * 严格 ES5,确保浏览器/平台运行时兼容。 + */ +var SpriteEventController = { + + // ======================================================================== + // 精灵交互事件处理器映射表(按精灵 ID 注册) + // ======================================================================== + + /** 精灵点击事件处理器 { spriteId: handler } */ + mouseDownHandlers: {}, + /** 精灵长按事件处理器(点击后未移动) */ + mouseDownNoMoveHandlers: {}, + /** 精灵松开事件处理器 */ + mouseUpHandlers: {}, + /** 精灵拖拽移动事件处理器 */ + mouseMoveHandlers: {}, + /** 精灵绘制前事件处理器 */ + drawBeginHandlers: {}, + /** 精灵绘制事件处理器 */ + drawHandlers: {}, + + /** + * 全局绘制钩子列表:对【每个】绘制事件都会被调用(不按精灵 ID 过滤)。 + * 供子游戏注册“需要扫描所有绘制精灵”的通用能力(如标记叠绘),保持框架中立。 + */ + drawGlobalHandlers: [], + + // ======================================================================== + // 事件处理器注册方法 + // ======================================================================== + + registerMouseDown: function(spriteId, handler) { + if (typeof spriteId !== 'number' || typeof handler !== 'function') { + console.error('❌ SpriteEventController: 无效的注册参数'); + return false; + } + this.mouseDownHandlers[spriteId] = handler; + return true; + }, + + registerMouseDownNoMove: function(spriteId, handler) { + if (typeof spriteId !== 'number' || typeof handler !== 'function') { + console.error('❌ SpriteEventController: 无效的注册参数'); + return false; + } + this.mouseDownNoMoveHandlers[spriteId] = handler; + return true; + }, + + registerMouseUp: function(spriteId, handler) { + if (typeof spriteId !== 'number' || typeof handler !== 'function') { + console.error('❌ SpriteEventController: 无效的注册参数'); + return false; + } + this.mouseUpHandlers[spriteId] = handler; + return true; + }, + + registerMouseMove: function(spriteId, handler) { + if (typeof spriteId !== 'number' || typeof handler !== 'function') { + console.error('❌ SpriteEventController: 无效的注册参数'); + return false; + } + this.mouseMoveHandlers[spriteId] = handler; + return true; + }, + + registerDrawBegin: function(spriteId, handler) { + if (typeof spriteId !== 'number' || typeof handler !== 'function') { + console.error('❌ SpriteEventController: 无效的注册参数'); + return false; + } + this.drawBeginHandlers[spriteId] = handler; + return true; + }, + + registerDraw: function(spriteId, handler) { + if (typeof spriteId !== 'number' || typeof handler !== 'function') { + console.error('❌ SpriteEventController: 无效的注册参数'); + return false; + } + this.drawHandlers[spriteId] = handler; + return true; + }, + + /** + * 注册全局绘制钩子(每个绘制事件都会被回调,参数为精灵 ID)。 + * 用于子游戏的“扫描所有绘制精灵”类通用处理;框架不认识其业务含义。 + * @param {Function} handler - function(spriteId){} + */ + registerGlobalDraw: function(handler) { + if (typeof handler !== 'function') { + console.error('❌ SpriteEventController: 无效的全局绘制钩子'); + return false; + } + this.drawGlobalHandlers.push(handler); + return true; + }, + + // ======================================================================== + // 批量注册 + // ======================================================================== + + registerBatch: function(spriteIds, eventType, handler) { + if (!Array.isArray(spriteIds) || typeof eventType !== 'string' || typeof handler !== 'function') { + console.error('❌ SpriteEventController: 批量注册参数错误'); + return false; + } + + var registerMethod = null; + switch (eventType) { + case 'mouseDown': registerMethod = this.registerMouseDown; break; + case 'mouseDownNoMove': registerMethod = this.registerMouseDownNoMove; break; + case 'mouseUp': registerMethod = this.registerMouseUp; break; + case 'mouseMove': registerMethod = this.registerMouseMove; break; + case 'draw': registerMethod = this.registerDraw; break; + case 'drawBegin': registerMethod = this.registerDrawBegin; break; + default: + console.error('❌ SpriteEventController: 未知的事件类型: ' + eventType); + return false; + } + + var successCount = 0; + for (var i = 0; i < spriteIds.length; i++) { + if (registerMethod.call(this, spriteIds[i], handler)) { + successCount++; + } + } + // console.log('📊 批量注册完成: ' + successCount + '/' + spriteIds.length + ' (' + eventType + ')'); + return successCount === spriteIds.length; + }, + + // ======================================================================== + // 事件分发处理方法(由 Game_Modify 转调) + // ======================================================================== + + handleMouseDown: function(gameid, spid, downx, downy, no1, no2, no3, no4, no5, no6) { + var handler = this.mouseDownHandlers[spid]; + if (handler) { + try { + handler.call(this, { + gameid: gameid, spriteId: spid, x: downx, y: downy, + params: [no1, no2, no3, no4, no5, no6] + }); + return true; + } catch (error) { + console.error('❌ 精灵点击事件处理失败:', error); + return false; + } + } + return false; + }, + + handleMouseDownNoMove: function(gameid, spid, downx, downy, timelong, no1, no2, no3, no4, no5) { + var handler = this.mouseDownNoMoveHandlers[spid]; + if (handler) { + try { + handler.call(this, { + gameid: gameid, spriteId: spid, x: downx, y: downy, duration: timelong, + params: [no1, no2, no3, no4, no5] + }); + return true; + } catch (error) { + console.error('❌ 精灵长按事件处理失败:', error); + return false; + } + } + return false; + }, + + handleMouseUp: function(gameid, spid_down, downx, downy, spid_up, upx, upy, timelong, no1, no2) { + var downHandler = this.mouseUpHandlers[spid_down]; + if (downHandler) { + try { + downHandler.call(this, { + gameid: gameid, + downSpriteId: spid_down, + upSpriteId: spid_up, + downPos: { x: downx, y: downy }, + upPos: { x: upx, y: upy }, + duration: timelong, + isClick: spid_down === spid_up, + params: [no1, no2] + }); + return true; + } catch (error) { + console.error('❌ 精灵松开事件处理失败:', error); + return false; + } + } + return false; + }, + + handleMouseMove: function(gameid, spid, downx, downy, movex, movey, timelong, offmovex, offmovey, no1) { + var handler = this.mouseMoveHandlers[spid]; + if (handler) { + try { + handler.call(this, { + gameid: gameid, spriteId: spid, + downPos: { x: downx, y: downy }, + currentPos: { x: movex, y: movey }, + offset: { x: offmovex, y: offmovey }, + duration: timelong, + params: [no1] + }); + return true; + } catch (error) { + console.error('❌ 精灵拖拽事件处理失败:', error); + return false; + } + } + return false; + }, + + handleDrawBegin: function(gameid, spid, times, timelong, no2, no3, no4, no5, no6, no7) { + // 通用裁剪区域应用(DynamicSpriteList 等注册的裁剪) + if (typeof GameABCUtils !== 'undefined' && GameABCUtils.Clip) { + GameABCUtils.Clip.checkAndApply(spid); + } + + var handler = this.drawBeginHandlers[spid]; + if (handler) { + try { + handler.call(this, { + gameid: gameid, spriteId: spid, times: times, timelong: timelong, + params: [no2, no3, no4, no5, no6, no7] + }); + return true; + } catch (error) { + console.error('❌ 精灵绘制前事件处理失败:', error); + return false; + } + } + return false; + }, + + handleDraw: function(gameid, spid, times, timelong, no2, no3, no4, no5, no6, no7) { + // 先执行全局绘制钩子(子游戏注册的“扫描所有绘制精灵”类处理,框架不认识其业务) + for (var g = 0; g < this.drawGlobalHandlers.length; g++) { + try { + this.drawGlobalHandlers[g](spid); + } catch (gErr) { + console.error('❌ 全局绘制钩子执行失败:', gErr); + } + } + + var handler = this.drawHandlers[spid]; + if (handler) { + try { + handler.call(this, { + gameid: gameid, spriteId: spid, times: times, timelong: timelong, + params: [no2, no3, no4, no5, no6, no7] + }); + return true; + } catch (error) { + console.error('❌ 精灵绘制事件处理失败:', error); + return false; + } + } + return false; + }, + + // ======================================================================== + // 工具方法 + // ======================================================================== + + unregister: function(spriteId, eventType) { + if (typeof spriteId !== 'number') { + console.error('❌ SpriteEventController: 无效的精灵ID'); + return false; + } + + if (eventType) { + switch (eventType) { + case 'mouseDown': delete this.mouseDownHandlers[spriteId]; break; + case 'mouseDownNoMove': delete this.mouseDownNoMoveHandlers[spriteId]; break; + case 'mouseUp': delete this.mouseUpHandlers[spriteId]; break; + case 'mouseMove': delete this.mouseMoveHandlers[spriteId]; break; + case 'draw': delete this.drawHandlers[spriteId]; break; + case 'drawBegin': delete this.drawBeginHandlers[spriteId]; break; + default: + console.error('❌ SpriteEventController: 未知的事件类型: ' + eventType); + return false; + } + } else { + delete this.mouseDownHandlers[spriteId]; + delete this.mouseDownNoMoveHandlers[spriteId]; + delete this.mouseUpHandlers[spriteId]; + delete this.mouseMoveHandlers[spriteId]; + delete this.drawHandlers[spriteId]; + delete this.drawBeginHandlers[spriteId]; + } + return true; + }, + + getStats: function() { + return { + mouseDown: Object.keys(this.mouseDownHandlers).length, + mouseDownNoMove: Object.keys(this.mouseDownNoMoveHandlers).length, + mouseUp: Object.keys(this.mouseUpHandlers).length, + mouseMove: Object.keys(this.mouseMoveHandlers).length, + draw: Object.keys(this.drawHandlers).length, + drawBegin: Object.keys(this.drawBeginHandlers).length, + drawGlobal: this.drawGlobalHandlers.length + }; + }, + + clear: function() { + this.mouseDownHandlers = {}; + this.mouseDownNoMoveHandlers = {}; + this.mouseUpHandlers = {}; + this.mouseMoveHandlers = {}; + this.drawHandlers = {}; + this.drawBeginHandlers = {}; + this.drawGlobalHandlers = []; + // console.log('🧹 已清空所有精灵事件处理器'); + }, + + init: function() { + // console.log('🚀 SpriteEventController 已初始化'); + + var dependencies = ['set_self', 'get_self', 'ifast_mydrawbmp']; + var missing = []; + for (var i = 0; i < dependencies.length; i++) { + if (typeof window[dependencies[i]] === 'undefined') { + missing.push(dependencies[i]); + } + } + if (missing.length > 0) { + console.warn('⚠️ 缺少依赖接口:', missing.join(', ')); + console.warn('请确保已正确加载 gameabc.min.js'); + } + return missing.length === 0; + } +}; + +// 自动初始化(浏览器/平台运行时) +if (typeof window !== 'undefined') { + SpriteEventController.init(); +} + +// Node 测试环境导出 +if (typeof module !== 'undefined' && module.exports) { + module.exports = SpriteEventController; +} diff --git a/client/js/gameabc-framework/system/SpriteGestureRecognizer.js b/client/js/gameabc-framework/system/SpriteGestureRecognizer.js new file mode 100644 index 0000000..af60a24 --- /dev/null +++ b/client/js/gameabc-framework/system/SpriteGestureRecognizer.js @@ -0,0 +1,174 @@ +// ============================================================================ +// 精灵手势识别器 (gameabc-framework / system, ES5标准) +// 在 SpriteEventController 之上做高层手势识别——游戏中立,可被任意子游戏复用 +// ============================================================================ + +/** + * SpriteGestureRecognizer —— 通用精灵手势识别器 + * + * 职责: + * 把底层的「按下/移动/松开」原始事件,识别为高层手势并以语义回调通知: + * - press :按下(即时反馈,如元素站起)——双击的第二击不再触发 press + * - doubleTap :在 doubleTapInterval 内对【同一精灵】快速按下两次 + * - swipe :沿指定方向移动超过阈值(不依赖松开,越阈即触发) + * - tap :一次「点击」(小位移按下→松开,且未被 swipe/doubleTap 消费) + * + * 中立原则: + * 本识别器只做手势分类,不含任何业务语义(选中/出牌/牌面等均由子游戏在回调里处理)。 + * 阈值参数由调用方注入(doubleTapInterval / swipe.threshold / minMove),框架只给默认值。 + * + * 依赖:SpriteEventController(须先加载)。 + * + * 用法: + * var handle = SpriteGestureRecognizer.attach(spriteIds, { + * onPress: function (e) {}, // e: { spriteId, x, y, ... } + * onTap: function (e) {}, // e: 透传 mouseUp 事件(含 upSpriteId/downPos/upPos/isClick) + * onDoubleTap: function (e) {}, // e: 透传 mouseDown 事件 + * onSwipe: function (e) {} // e: 透传 mouseMove 事件 + e.direction + * }, { + * doubleTapInterval: 300, // 双击间隔(ms) + * swipe: { direction: 'up', threshold: 50 }, // 滑动方向与阈值(像素,正值) + * minMove: 10 // 判定为点击的最大位移(像素) + * }); + * // handle.resetDoubleTap() 清双击计时(防跨局误判) + * // handle.resetDrag() 取消进行中的拖动追踪 + * // handle.detach() 注销该组精灵的手势识别 + * + * 严格 ES5。 + */ +var SpriteGestureRecognizer = { + + /** + * 为一组精灵附加手势识别。 + * @param {Array} spriteIds - 精灵 ID 列表 + * @param {Object} callbacks - { onPress, onTap, onDoubleTap, onSwipe }(均可选) + * @param {Object} [options] - { doubleTapInterval, swipe:{direction,threshold}, minMove } + * @returns {Object|null} handle: { detach, resetDoubleTap, resetDrag };参数非法返回 null + */ + attach: function (spriteIds, callbacks, options) { + if (typeof SpriteEventController === 'undefined') { + console.error('❌ SpriteGestureRecognizer: SpriteEventController 未加载'); + return null; + } + if (!spriteIds || typeof spriteIds.length !== 'number') { + console.error('❌ SpriteGestureRecognizer: spriteIds 必须为数组'); + return null; + } + callbacks = callbacks || {}; + options = options || {}; + + var doubleTapInterval = (options.doubleTapInterval != null) ? options.doubleTapInterval : 300; + var minMove = (options.minMove != null) ? options.minMove : 10; + var swipe = options.swipe || null; // { direction, threshold } + + // 本组精灵独立的手势状态(闭包隔离,支持多处 attach 互不干扰) + var state = { + dragActive: false, + lastTapTime: 0, + lastTapTarget: null + }; + + function _resetDrag() { + state.dragActive = false; + } + + // ---- 越阈方向判定(仅在配置了 swipe 时启用)---- + function _swipeCrossed(offset) { + if (!swipe || !swipe.direction) { return false; } + var th = (swipe.threshold != null) ? swipe.threshold : 50; + switch (swipe.direction) { + case 'up': return offset.y < -th; + case 'down': return offset.y > th; + case 'left': return offset.x < -th; + case 'right': return offset.x > th; + default: return false; + } + } + + // ---- 原始事件处理(注册到 SpriteEventController)---- + function _onDown(e) { + var now = Date.now(); + var isDouble = state.lastTapTime > 0 && + e.spriteId === state.lastTapTarget && + (now - state.lastTapTime) < doubleTapInterval; + + if (isDouble) { + // 消费双击:清计时,避免三连击;不再触发 press(与原手牌交互一致) + state.lastTapTime = 0; + state.lastTapTarget = null; + if (callbacks.onDoubleTap) { callbacks.onDoubleTap(e); } + return; + } + + // 记录本次按下,开始拖动追踪 + state.lastTapTime = now; + state.lastTapTarget = e.spriteId; + state.dragActive = true; + + if (callbacks.onPress) { callbacks.onPress(e); } + } + + function _onMove(e) { + if (!state.dragActive) { return; } + if (!e.offset) { return; } + if (_swipeCrossed(e.offset)) { + // 越阈即触发 swipe,并结束拖动追踪(后续 move/up 不再产生手势) + _resetDrag(); + var se = e; + se.direction = swipe.direction; + if (callbacks.onSwipe) { callbacks.onSwipe(se); } + } + } + + function _onUp(e) { + var wasDragging = state.dragActive; + _resetDrag(); + if (!wasDragging) { return; } // 未在追踪(如双击第二击/已被 swipe 消费)→ 非 tap + if (!e.isClick) { return; } // 按下与松开不在同一精灵 → 非 tap + // 位移过大(非点击的拖动)→ 非 tap + if (e.upPos && e.downPos && Math.abs(e.upPos.y - e.downPos.y) > minMove) { return; } + if (callbacks.onTap) { callbacks.onTap(e); } + } + + // 注册到底层事件控制器 + var ids = []; + for (var i = 0; i < spriteIds.length; i++) { + var sid = spriteIds[i]; + if (sid == null) { continue; } + SpriteEventController.registerMouseDown(sid, _onDown); + SpriteEventController.registerMouseMove(sid, _onMove); + SpriteEventController.registerMouseUp(sid, _onUp); + ids.push(sid); + } + + return { + /** 注销该组精灵的全部手势事件 */ + detach: function () { + for (var j = 0; j < ids.length; j++) { + SpriteEventController.unregister(ids[j], 'mouseDown'); + SpriteEventController.unregister(ids[j], 'mouseMove'); + SpriteEventController.unregister(ids[j], 'mouseUp'); + } + _resetDrag(); + }, + /** 清空双击计时(游戏开始/重置时调用,防跨局误判) */ + resetDoubleTap: function () { + state.lastTapTime = 0; + state.lastTapTarget = null; + }, + /** 取消进行中的拖动追踪 */ + resetDrag: function () { + _resetDrag(); + } + }; + } +}; + +// 全局暴露(浏览器/平台运行时) +if (typeof window !== 'undefined') { + window.SpriteGestureRecognizer = SpriteGestureRecognizer; +} +// Node 测试环境导出 +if (typeof module !== 'undefined' && module.exports) { + module.exports = SpriteGestureRecognizer; +} diff --git a/client/js/gameabc-framework/templates/GameView_Sprites.template.js b/client/js/gameabc-framework/templates/GameView_Sprites.template.js new file mode 100644 index 0000000..21965b4 --- /dev/null +++ b/client/js/gameabc-framework/templates/GameView_Sprites.template.js @@ -0,0 +1,205 @@ +/** + * ============================================================================ + * GameView_Sprites.template.js - 精灵 ID 定义规范 + * ============================================================================ + * + * 使用方式: + * 将此文件复制到游戏项目中,按实际精灵 ID 填写。 + * 建议按界面拆分为多个文件,例如: + * RoomView_Sprites.js (房间等待界面) + * GameView_Sprites.js (游戏主界面) + * PopupView_Sprites.js (弹窗/结算界面) + * 所有 ID 值必须与 gameabc 编辑器中实际配置的精灵/图层/群组 ID 完全一致, + * 不可自行编造数字。 + * + * ============================================================================ + * ID 分配规范 + * ============================================================================ + * + * 精灵 ID:子游戏使用 1001+(框架保留 1–1000) + * 图层 ID:普通图层 101–200,弹窗图层 301+(框架保留 1–100) + * 群组 ID:子游戏使用 201+(框架保留 1–200) + * + * ============================================================================ + * 文件结构规范 + * ============================================================================ + * + * 顶层变量对应一个"界面",每个界面包含: + * + * VAR_NAME.VIEW_NAME = { + * LAYER: <图层ID>, // 必填,该界面挂载的图层 + * + * SOME_GROUP: { + * GROUP_ID: <群组ID>, // 必填,该功能区的群组 + * SPRITES: { + * SPRITE_KEY: <精灵ID>, // 每个精灵 + * ... + * } + * }, + * + * // 也可不用群组,直接列精灵 + * SIMPLE_SPRITE: <精灵ID> + * }; + * + * ============================================================================ + * 每个精灵条目必须包含的注释字段 + * ============================================================================ + * + * 类型:图片精灵 / 文字精灵 / 容器精灵 / 热区精灵 + * 用途:一句话说明该精灵在游戏中的作用 + * 资源:引用的 ImageResources 键名(图片精灵必填) + * 帧说明:初始帧及切换时机(如有多帧) + * + * ============================================================================ + * 精灵类型说明 + * ============================================================================ + * + * 图片精灵:显示图片/帧动画,用 SpriteManager.setFrame() 切换画面 + * 文字精灵:显示动态文字,用 SpriteManager.setText() 修改内容 + * 容器精灵:作为 SpriteCopyUtils 的父容器,本身不显示内容 + * 热区精灵:仅用于点击检测,透明不显示 + * + * ============================================================================ + * 注意事项 + * ============================================================================ + * + * - 玩家信息 UI(头像/昵称/分数/准备标识/房主标识)由平台框架提供, + * 子游戏无需也不应在此重复定义 + * - GlobalUI(加载界面、消息弹窗、确认对话框)由框架提供, + * 子游戏弹窗从 Layer 302+ 开始定义 + * + * @see ImageResources.template.js 图片资源 ID 定义规范 + * @see SoundResources.template.js 音效资源 ID 定义规范 + */ + +'use strict'; + +// ============================================================================ +// 房间界面精灵定义 (Layer xxx) +// ============================================================================ + +// /** +// * RoomView_Sprites - 房间等待界面精灵定义 +// * 图层:Layer <在编辑器查到的图层ID> +// * 用途:显示等待玩家加入、规则配置、准备/开始状态 +// */ +// var RoomView_Sprites = {}; +// +// RoomView_Sprites.ROOM_VIEW = { +// LAYER: <图层ID>, +// +// // 规则配置群组 +// // 用途:创建房间时的玩法选项(圈数、人数、特殊规则等) +// ROOM_CONFIG_GROUP: { +// GROUP_ID: <群组ID>, +// SPRITES: { +// // 图片精灵:第1行标题图片,资源=ImageResources.XXX,帧=1 +// ROW1_TITLE: <精灵ID>, +// +// // 图片精灵:第1行选项1图标,资源=ImageResources.XXX,帧1=未选中 帧2=已选中 +// ROW1_OPTION1: <精灵ID>, +// +// // 文字精灵:第1行选项1文字说明 +// ROW1_OPTION1_TEXT: <精灵ID>, +// +// // ... 按实际选项行数继续定义 +// } +// } +// }; + +// ============================================================================ +// 游戏主界面精灵定义 (Layer xxx) +// ============================================================================ + +// /** +// * GameView_Sprites - 游戏主界面精灵定义 +// */ +// var GameView_Sprites = {}; +// +// /** +// * 牌桌主体 +// * 图层:Layer <在编辑器查到的图层ID> +// */ +// GameView_Sprites.GAME_VIEW = { +// LAYER: <图层ID>, +// +// // 中央信息群组 +// // 用途:牌桌中央区域,方向指示器、剩余牌数、倒计时等 +// CENTER_INFO_GROUP: { +// GROUP_ID: <群组ID>, +// SPRITES: { +// // 图片精灵:方向面板背景,资源=ImageResources.XXX,4帧(帧1–4对应庄家方向) +// DIRECTION_PANEL_BG: <精灵ID>, +// +// // 图片精灵:倒计时数字,资源=ImageResources.XXX,10帧(帧1–10对应数字0–9) +// COUNTDOWN_NUMBER: <精灵ID>, +// +// // 图片精灵:剩余牌数数字,资源=ImageResources.XXX,10帧(帧1–10对应数字0–9) +// REMAIN_COUNT: <精灵ID> +// } +// }, +// +// // 玩家1手牌群组(下方/自己) +// // 用途:显示自己手牌,支持点击选牌出牌 +// PLAYER1_HAND_GROUP: { +// GROUP_ID: <群组ID>, +// SPRITES: { +// // 图片精灵×13:手牌1–13,资源=ImageResources.CARD_FACE,帧=当前牌值对应帧 +// HAND_CARD_1: <精灵ID>, +// // ... HAND_CARD_2 至 HAND_CARD_13 +// HAND_CARD_13: <精灵ID>, +// +// // 图片精灵:摸牌(最右端,与手牌略有间距) +// DRAW_CARD: <精灵ID> +// } +// }, +// +// // 玩家2手牌群组(右方) +// // 用途:显示右方玩家牌背(侧面透视角度) +// PLAYER2_HAND_GROUP: { +// GROUP_ID: <群组ID>, +// SPRITES: { +// HAND_CARD_1: <精灵ID>, +// // ... +// DRAW_CARD: <精灵ID> +// } +// } +// +// // 玩家3(上方)、玩家4(左方)结构同上... +// }; +// +// /** +// * 游戏操作按钮 +// * 图层:Layer <在编辑器查到的图层ID> +// * 用途:玩家可操作时显示的吃/碰/杠/胡/过/听按钮 +// */ +// GameView_Sprites.GAME_ACTIONS_UI = { +// LAYER: <图层ID>, +// +// ACTION_BUTTONS_GROUP: { +// GROUP_ID: <群组ID>, +// SPRITES: { +// // 图片精灵:吃牌按钮,资源=ImageResources.BTN_CHI,1帧 +// BTN_CHI: <精灵ID>, +// BTN_PONG: <精灵ID>, +// BTN_KONG: <精灵ID>, +// BTN_HU: <精灵ID>, +// BTN_PASS: <精灵ID>, +// BTN_TING: <精灵ID>, +// +// // 图片精灵:操作文字弹出动画,资源=ImageResources.OPERATION_EFFECT_XXX +// ACTION_EFFECT_CHI: <精灵ID>, +// ACTION_EFFECT_PONG: <精灵ID>, +// ACTION_EFFECT_KONG: <精灵ID>, +// ACTION_EFFECT_HU: <精灵ID> +// } +// } +// }; + +// ============================================================================ +// 弹窗界面精灵定义 (Layer 301+) +// ============================================================================ + +// 子游戏自定义弹窗从 Layer 302+ 开始定义 +// Layer 301 建议预留给最高优先级的全局弹窗(如断线重连提示) + diff --git a/client/js/gameabc-framework/templates/ImageResources.template.js b/client/js/gameabc-framework/templates/ImageResources.template.js new file mode 100644 index 0000000..9046eb9 --- /dev/null +++ b/client/js/gameabc-framework/templates/ImageResources.template.js @@ -0,0 +1,68 @@ +/** + * ============================================================================ + * ImageResources.template.js - 图片资源 ID 定义规范 + * ============================================================================ + * + * 使用方式: + * 将此文件复制到游戏项目中,重命名为 ImageResources.js。 + * 所有 ID 值必须与 gameabc 编辑器中实际配置的资源 ID 完全一致, + * 不可自行编造数字。 + * + * ============================================================================ + * ID 分配规范 + * ============================================================================ + * + * 框架保留范围:1–500(平台框架使用,子游戏严禁占用) + * 子游戏范围:501+(按项目实际需要自行规划分段,在代码注释中记录) + * + * ============================================================================ + * 每个资源条目必须包含的注释字段 + * ============================================================================ + * + * 用途:该资源在游戏中的具体用途(一句话) + * 帧数:资源包含的帧数量 + * 帧说明:每帧的内容,数字序号一一列出,例如: + * 帧1=未选中 帧2=已选中 + * 帧1–9=1万–9万 帧10–18=1条–9条 ... + * 尺寸:宽×高(像素) + * + * ============================================================================ + * 按钮资源规范 + * ============================================================================ + * + * 所有按钮只需提供 1 帧普通状态图片,无需按下状态图片。 + * 点击效果(缩放 + 透明度)由框架统一处理。 + * + * ============================================================================ + * 帧动画资源说明 + * ============================================================================ + * + * 帧动画资源(操作效果动画、倒计时数字等)在此文件中只记录资源 ID, + * 帧区间、帧间隔、循环模式等播放参数统一在 AnimationConfigs.js 中配置, + * 不在此文件重复定义。 + * + * @see GameView_Sprites.template.js 精灵 ID 定义规范 + * @see SoundResources.template.js 音效资源 ID 定义规范 + * @see AnimationConfigs.js 帧动画播放参数配置 + */ + +'use strict'; + +var ImageResources = { + + // 按项目自行规划分段,每段在注释中记录 ID 起止范围和用途 + // 注意:底部操作面板、玩家信息头像等 UI 由平台框架提供,子游戏无需定义 + + // /** + // * 用途:... + // * 帧数:N 帧 帧1=... 帧2=... + // * 尺寸:W×H + // */ + // RESOURCE_NAME: <在编辑器中查到的实际资源ID>, + + // 帧动画资源注意:帧播放参数(帧区间、帧间隔、循环次数)在 AnimationConfigs.js 中配置,不在此重复定义 + // 按钮资源注意:每个按钮 1 帧,点击效果由框架统一处理,无需按下状态帧 + // 麻将牌帧布局建议:帧1–9=万, 帧10–18=条, 帧19–27=筒, 帧28–31=东南西北, 帧32–34=中发白, 最后1帧=牌背 + // 不同显示区域(手牌/弃牌/副露)尺寸不同,各自用一个独立资源 ID + +}; diff --git a/client/js/gameabc-framework/templates/LayoutConstants.template.js b/client/js/gameabc-framework/templates/LayoutConstants.template.js new file mode 100644 index 0000000..aa01de9 --- /dev/null +++ b/client/js/gameabc-framework/templates/LayoutConstants.template.js @@ -0,0 +1,500 @@ +/** + * ============================================================================ + * LayoutConstants.template.js - 游戏布局常量规范模板 + * ============================================================================ + * + * 使用方式: + * 将此文件复制到游戏目录,重命名为 LayoutConstants.js, + * 然后按游戏实际分辨率和精灵编排修改各项数值。 + * + * 如布局配置过多,可拆分为多个文件(如 PopupLayoutConstants.js), + * 每个文件都向同一个全局对象 LayoutConstants 挂载属性。 + * + * 加载顺序(index.html 中只需保证在 CardLayoutManager.js 之前加载即可): + * + * + * + * + * 文件不依赖框架,可单独加载。 + * + * ============================================================================ + * @guide 核心设计理念 + * ============================================================================ + * + * LayoutConstants 是一个 **纯数据文件**(无函数、无副作用), + * 所有坐标/尺寸/偏移量都在这里集中定义,供各 Manager / View 读取。 + * + * 原则: + * 1. 只包含常量对象,不包含业务逻辑 + * 2. 每个布局区域单独一个顶层属性(HAND_CARD_LAYOUT, DISCARD_LAYOUT …) + * 3. 4人麻将用 PLAYER_1..4 子对象;其他游戏可用 SELF/OPPONENT 等命名 + * 4. 透视偏移量(PERSPECTIVE_OFFSET_X/Y)用于 2D 模拟 3D 效果,正对视角均为 0 + * 5. DIRECTION 枚举:'horizontal' | 'horizontal-reverse' | 'vertical' | 'vertical-reverse' + * 6. ALIGN_MODE 枚举:'start' | 'center' | 'end' + * + * ============================================================================ + * @guide 透视偏移量说明 + * ============================================================================ + * + * gameabc 以 2D 图片模拟 3D 透视效果。每张牌在排列时叠加一个累积偏移: + * + * 最终X = 基准X + 牌索引 × PERSPECTIVE_OFFSET_X + * 最终Y = 基准Y + 牌索引 × PERSPECTIVE_OFFSET_Y + * + * 正值向右/向下,负值向左/向上。 + * 玩家1(正对屏幕)通常 PERSPECTIVE_OFFSET = 0。 + * 玩家2/4(侧视角)需要配置非零值形成倾斜效果。 + * + * ============================================================================ + * @guide 如何拆分为多文件 + * ============================================================================ + * + * // LayoutConstants.js(主游戏界面) + * var LayoutConstants = {}; + * LayoutConstants.HAND_CARD_LAYOUT = { ... }; + * LayoutConstants.DISCARD_LAYOUT = { ... }; + * + * // PopupLayoutConstants.js(弹窗界面,另一个文件) + * var LayoutConstants = LayoutConstants || {}; // 保护性声明 + * LayoutConstants.ROUND_RESULT_LAYOUT = { ... }; + * LayoutConstants.GAME_RESULT_LAYOUT = { ... }; + * + * 两个文件加载后,LayoutConstants 包含所有属性。 + * + * @version 1.0.0 + * @see LayoutConstants.js 金仙麻将实际实现 + * @see CardLayoutManager.js 使用 LayoutConstants 计算精灵坐标 + */ + +'use strict'; + +/** + * LayoutConstants - 布局常量对象 + * 所有布局配置挂载在此全局对象下 + */ +var LayoutConstants = {}; + +// ============================================================================ +// 设计分辨率 +// ============================================================================ + +/** 设计稿宽度(px) */ +LayoutConstants.DESIGN_WIDTH = 1280; + +/** 设计稿高度(px) */ +LayoutConstants.DESIGN_HEIGHT = 720; + +// ============================================================================ +// 手牌区布局(示例:4人麻将) +// ============================================================================ + +/** + * 手牌区布局配置 + * + * DIRECTION 值: + * 'horizontal' - 从左到右(PLAYER_1 常用) + * 'horizontal-reverse' - 从右到左(PLAYER_3 常用) + * 'vertical' - 从上到下(PLAYER_4 常用) + * 'vertical-reverse' - 从下到上(PLAYER_2 常用) + * + * ALIGN_MODE 值: + * 'start' - 从 START_X/Y 开始,按索引递增方向铺开 + * 'center' - 手牌整体居中于 START_X/Y + * 'end' - 最后一张牌落在 START_X/Y,向前排列 + */ +LayoutConstants.HAND_CARD_LAYOUT = { + + // 玩家1 (下方 - 自己) - 正视角,无透视 + PLAYER_1: { + START_X: 164, // 第1张牌的左边界X + START_Y: 613, // 手牌区Y坐标 + CARD_WIDTH: 74, // 单张牌宽度(含视觉厚度) + CARD_HEIGHT: 102, // 单张牌高度 + CARD_SPACING: -2, // 牌间距(负值=重叠) + DRAW_CARD_GAP: 15, // 摸牌与手牌的额外间隔 + SELECT_OFFSET_Y: -20, // 选中牌向上偏移量 + MAX_CARDS: 13, // 最大手牌数 + DIRECTION: 'horizontal', + ALIGN_MODE: 'end', + PERSPECTIVE_OFFSET_X: 0, + PERSPECTIVE_OFFSET_Y: 0 + }, + + // 玩家2 (右方) - 侧视角,竖排,透视向左上 + PLAYER_2: { + START_X: 1205, + START_Y: 537, + CARD_WIDTH: 52, + CARD_HEIGHT: 72, + CARD_SPACING: 0, + DRAW_CARD_GAP: 0, + MAX_CARDS: 13, + DIRECTION: 'vertical-reverse', + ALIGN_MODE: 'center', + PERSPECTIVE_OFFSET_X: -8, + PERSPECTIVE_OFFSET_Y: -37, + DRAW_CARD_PERSPECTIVE_X: -12, + DRAW_CARD_PERSPECTIVE_Y: 18 + }, + + // 玩家3 (上方) - 对面视角,横排,无透视 + PLAYER_3: { + START_X: 820, + START_Y: 44, + CARD_WIDTH: 43, + CARD_HEIGHT: 58, + CARD_SPACING: -3, + DRAW_CARD_GAP: 6, + MAX_CARDS: 13, + DIRECTION: 'horizontal-reverse', + ALIGN_MODE: 'end', + PERSPECTIVE_OFFSET_X: 0, + PERSPECTIVE_OFFSET_Y: 0 + }, + + // 玩家4 (左方) - 侧视角,竖排,透视向左上 + PLAYER_4: { + START_X: 139, + START_Y: 74, + CARD_WIDTH: 52, + CARD_HEIGHT: 72, + CARD_SPACING: 0, + DRAW_CARD_GAP: 12, + MAX_CARDS: 13, + DIRECTION: 'vertical', + ALIGN_MODE: 'center', + PERSPECTIVE_OFFSET_X: -8, + PERSPECTIVE_OFFSET_Y: -37, + DRAW_CARD_PERSPECTIVE_X: -9, + DRAW_CARD_PERSPECTIVE_Y: -35 + } +}; + +// ============================================================================ +// 弃牌区布局(示例) +// ============================================================================ + +/** + * 弃牌区布局配置 + * + * CARDS_PER_ROW / MAX_ROWS:弃牌按行/列分组排列(DIRECTION 为 vertical 时按列)。 + * ROW_PERSPECTIVE_X/Y:每换一行的累积透视偏移,用于模拟牌桌中央的深度感。 + */ +LayoutConstants.DISCARD_LAYOUT = { + PLAYER_1: { + START_X: 500, + START_Y: 345, + CARD_WIDTH: 45, + CARD_HEIGHT: 55, + CARDS_PER_ROW: 9, + ROW_SPACING: 2, + CARD_SPACING: 1, + MAX_ROWS: 3, + CARD_PERSPECTIVE_X: 0, + CARD_PERSPECTIVE_Y: 0, + ROW_PERSPECTIVE_X: 2, + ROW_PERSPECTIVE_Y: -3 + }, + PLAYER_2: { + START_X: 755, + START_Y: 175, + CARD_WIDTH: 28, + CARD_HEIGHT: 36, + CARDS_PER_ROW: 3, + ROW_SPACING: 1, + CARD_SPACING: 1, + MAX_ROWS: 9, + DIRECTION: 'vertical', + CARD_PERSPECTIVE_X: -1, + CARD_PERSPECTIVE_Y: 0, + ROW_PERSPECTIVE_X: -2, + ROW_PERSPECTIVE_Y: 1 + }, + PLAYER_3: { + START_X: 720, + START_Y: 95, + CARD_WIDTH: 36, + CARD_HEIGHT: 28, + CARDS_PER_ROW: 9, + ROW_SPACING: 2, + CARD_SPACING: 1, + MAX_ROWS: 3, + DIRECTION: 'horizontal-reverse', + CARD_PERSPECTIVE_X: 0, + CARD_PERSPECTIVE_Y: 0, + ROW_PERSPECTIVE_X: -2, + ROW_PERSPECTIVE_Y: 2 + }, + PLAYER_4: { + START_X: 200, + START_Y: 280, + CARD_WIDTH: 58, + CARD_HEIGHT: 41, + CARDS_PER_ROW: 3, + ROW_SPACING: 1, + CARD_SPACING: 1, + MAX_ROWS: 9, + DIRECTION: 'vertical-reverse', + CARD_PERSPECTIVE_X: 1, + CARD_PERSPECTIVE_Y: 0, + ROW_PERSPECTIVE_X: -3, + ROW_PERSPECTIVE_Y: -12 + } +}; + +// ============================================================================ +// 副露区布局(吃/碰/杠) +// ============================================================================ + +/** + * 副露区布局配置 + * + * 透视偏移量(组内 + 组间): + * CARD_PERSPECTIVE_X/Y - 同一副露组内,每张牌相对前一张的额外偏移(累加) + * GROUP_PERSPECTIVE_X/Y - 不同副露组之间,每组相对前一组的额外偏移(累加) + * + * 坐标计算公式(CardLayoutManager.js 负责实现): + * 透视X = cardIndex × CARD_PERSPECTIVE_X + meldIndex × GROUP_PERSPECTIVE_X + * 最终X = 基准X + 透视X + */ +LayoutConstants.MELD_LAYOUT = { + PLAYER_1: { + START_X: 105, + START_Y: 639, + CARD_WIDTH: 64, + CARD_HEIGHT: 84, + CARD_SPACING: 0, + GROUP_SPACING: 8, + DIRECTION: 'horizontal', + MAX_GROUPS: 4, + KONG_STACK_OFFSET_X: 0, + KONG_STACK_OFFSET_Y: -20, + CARD_PERSPECTIVE_X: -5, + CARD_PERSPECTIVE_Y: 0, + GROUP_PERSPECTIVE_X: -3, + GROUP_PERSPECTIVE_Y: 0 + }, + PLAYER_2: { + START_X: 1115, + START_Y: 509, + CARD_WIDTH: 65, + CARD_HEIGHT: 48, + CARD_SPACING: 0, + GROUP_SPACING: 0, + DIRECTION: 'vertical-reverse', + MAX_GROUPS: 4, + KONG_STACK_OFFSET_X: 6, + KONG_STACK_OFFSET_Y: -20, + CARD_PERSPECTIVE_X: -7, + CARD_PERSPECTIVE_Y: 35, + GROUP_PERSPECTIVE_X: -25, + GROUP_PERSPECTIVE_Y: 35 + }, + PLAYER_3: { + START_X: 930, + START_Y: 48, + CARD_WIDTH: 43, + CARD_HEIGHT: 58, + CARD_SPACING: 0, + GROUP_SPACING: 4, + DIRECTION: 'horizontal-reverse', + MAX_GROUPS: 4, + KONG_STACK_OFFSET_X: 0, + KONG_STACK_OFFSET_Y: -9, + CARD_PERSPECTIVE_X: 3, + CARD_PERSPECTIVE_Y: 0, + GROUP_PERSPECTIVE_X: -3, + GROUP_PERSPECTIVE_Y: 0 + }, + PLAYER_4: { + START_X: 198, + START_Y: 91, + CARD_WIDTH: 63, + CARD_HEIGHT: 49, + CARD_SPACING: 0, + GROUP_SPACING: 0, + DIRECTION: 'vertical', + MAX_GROUPS: 4, + KONG_STACK_OFFSET_X: -7, + KONG_STACK_OFFSET_Y: -17, + CARD_PERSPECTIVE_X: -6, + CARD_PERSPECTIVE_Y: -30, + GROUP_PERSPECTIVE_X: -25, + GROUP_PERSPECTIVE_Y: -30 + } +}; + +// ============================================================================ +// 玩家信息 UI 布局(支持 2/3/4 人) +// ============================================================================ + +/** + * 玩家信息 UI 布局配置 + * + * 座位映射(seatToInd): + * 不同人数局中,座位号(0-3)映射到屏幕显示位置(ind 0-3)。 + * ind = -1 表示该座位在此人数局中不显示。 + * + * 约定:ind0=下方(自己) ind1=右方 ind2=上方 ind3=左方 + * + * 位置配置(POSITIONS[ind]): + * FRAME_* 底框精灵的绝对坐标和尺寸 + * AVATAR.* 头像相对于底框左上角的偏移量(OFFSET_X/Y + WIDTH/HEIGHT) + * NAME_OFFSET_X/Y 昵称相对于头像左上角的偏移 + * SCORE_OFFSET_X/Y 分数相对于头像左上角的偏移 + */ +LayoutConstants.PLAYER_INFO_LAYOUT = { + DESIGN_WIDTH: 1280, + DESIGN_HEIGHT: 720, + + // 座位号 → 显示位置 ind 的映射 + SEAT_MAPPING: { + 4: [0, 1, 2, 3], + 3: [0, 1, 3, -1], // 3人局:北位(ind2)不显示 + 2: [0, 2, -1, -1] // 2人局:只有南北两位 + }, + + VISIBLE_POSITIONS: { + 4: [0, 1, 2, 3], + 3: [0, 1, 3], + 2: [0, 2] + }, + + POSITIONS: { + // ind=0: 南位(下方) - 玩家自己 + 0: { + FRAME_X: 6, FRAME_Y: 592, + FRAME_WIDTH: 90, FRAME_HEIGHT: 115, + AVATAR: { + OFFSET_X: 5, OFFSET_Y: 5, + WIDTH: 80, HEIGHT: 80, + NAME_OFFSET_X: -400, NAME_OFFSET_Y: 888, + SCORE_OFFSET_X: 0, SCORE_OFFSET_Y: 88 + }, + NAME_CENTER_ALIGN: true + }, + // ind=1: 东位(右方) + 1: { + FRAME_X: 1186, FRAME_Y: 85, + FRAME_WIDTH: 90, FRAME_HEIGHT: 115, + AVATAR: { + OFFSET_X: 5, OFFSET_Y: 5, + WIDTH: 80, HEIGHT: 80, + NAME_OFFSET_X: 905, NAME_OFFSET_Y: -888, + SCORE_OFFSET_X: 0, SCORE_OFFSET_Y: 88 + }, + NAME_CENTER_ALIGN: true + }, + // ind=2: 北位(上方) + 2: { + FRAME_X: 1006, FRAME_Y: 5, + FRAME_WIDTH: 90, FRAME_HEIGHT: 115, + AVATAR: { + OFFSET_X: 5, OFFSET_Y: 5, + WIDTH: 80, HEIGHT: 80, + NAME_OFFSET_X: 905, NAME_OFFSET_Y: -888, + SCORE_OFFSET_X: 0, SCORE_OFFSET_Y: 88 + }, + NAME_CENTER_ALIGN: true + }, + // ind=3: 西位(左方) + 3: { + FRAME_X: 7, FRAME_Y: 59, + FRAME_WIDTH: 90, FRAME_HEIGHT: 115, + AVATAR: { + OFFSET_X: 5, OFFSET_Y: 5, + WIDTH: 80, HEIGHT: 80, + NAME_OFFSET_X: -605, NAME_OFFSET_Y: -888, + SCORE_OFFSET_X: 0, SCORE_OFFSET_Y: 88 + }, + NAME_CENTER_ALIGN: true + } + }, + + TEXT_STYLE: { + NAME_FONT_SIZE: 14, + NAME_MAX_LENGTH: 6, + SCORE_FONT_SIZE: 12, + CHAR_WIDTH: 9 + } +}; + +// ============================================================================ +// 庄家标识布局 +// ============================================================================ + +/** + * 庄家图标布局 + * + * POSITION_TYPE 决定图标与头像底框的对齐方式: + * 'top-left' - 图标左上角 = 底框右上角(图标显示在底框右侧) + * 'top-right' - 图标右上角 = 底框左上角(图标显示在底框左侧) + */ +LayoutConstants.DEALER_ICON_LAYOUT = { + ICON_WIDTH: 32, + ICON_HEIGHT: 32, + SEAT_MAPPING: { + 4: [0, 1, 2, 3], + 3: [0, 1, 3, -1], + 2: [0, 2, -1, -1] + }, + POSITIONS: { + 0: { POSITION_TYPE: 'top-left' }, + 1: { POSITION_TYPE: 'top-right' }, + 2: { POSITION_TYPE: 'top-right' }, + 3: { POSITION_TYPE: 'top-left' } + } +}; + +// ============================================================================ +// 操作倒计时布局 +// ============================================================================ + +/** + * 操作倒计时布局 + * + * 数字图片居中显示在 CENTER_X: + * actualX = CENTER_X - (digitCount × CHAR_WIDTH / 2) + */ +LayoutConstants.COUNTDOWN_LAYOUT = { + CENTER_X: 640, // 水平居中锚点 + Y: 296, + CHAR_WIDTH: 31, + CHAR_HEIGHT: 33 +}; + +// ============================================================================ +// 操作按钮布局(吃/碰/杠/胡/听/过) +// ============================================================================ + +/** + * 操作按钮动态水平布局 + * + * 从右锚点 ANCHOR_X 向左排列,按钮数量变化时整体右对齐: + * totalW = count × BUTTON_WIDTH + (count-1) × BUTTON_SPACING + * firstX = ANCHOR_X - totalW + * nthX = firstX + (n-1) × (BUTTON_WIDTH + BUTTON_SPACING) + */ +LayoutConstants.ACTION_BUTTON_LAYOUT = { + ANCHOR_X: 1180, // 右对齐锚点 + Y: 560, // 按钮Y坐标(统一) + BUTTON_WIDTH: 100, + BUTTON_HEIGHT: 80, + BUTTON_SPACING: 10 +}; + +// ============================================================================ +// 最后出牌指示器布局 +// ============================================================================ + +/** + * 最后出牌指示器偏移量(相对于该牌的坐标) + */ +LayoutConstants.LAST_DISCARD_INDICATOR_LAYOUT = { + OFFSET: { + 0: { X: 8, Y: -20 }, + 1: { X: 15, Y: -25 }, + 2: { X: 6, Y: -20 }, + 3: { X: 15, Y: -23 } + } +}; diff --git a/client/js/gameabc-framework/templates/SoundResources.template.js b/client/js/gameabc-framework/templates/SoundResources.template.js new file mode 100644 index 0000000..fec3eac --- /dev/null +++ b/client/js/gameabc-framework/templates/SoundResources.template.js @@ -0,0 +1,108 @@ +/** + * ============================================================================ + * SoundResources.template.js - 音效资源常量定义规范 + * ============================================================================ + * + * 使用方式: + * 将此文件复制到游戏项目中,重命名为 SoundResources.js。 + * 所有文件名必须与实际音效文件完全一致,不可自行编造。 + * + * ============================================================================ + * 文件命名规范 + * ============================================================================ + * + * 音效文件名 = 5位数字补零 + .mp3,例如: + * ID=101 → '00101.mp3' + * ID=151 → '00151.mp3' + * + * ============================================================================ + * ID 分配规范 + * ============================================================================ + * + * 框架保留:00001–00100(平台系统音效,子游戏严禁占用) + * 子游戏范围:00101+(EFFECTS / VOICE / MUSIC 的具体分段按项目自行规划) + * + * ============================================================================ + * 性别语音规则(AudioManager 依赖此规范) + * ============================================================================ + * + * 男性语音 ID = 基础 ID(151+) + * 女性语音 ID = 男性语音 ID + FEMALE_VOICE_OFFSET(默认 100) + * 规律:男性 '00151.mp3' 对应 女性 '00251.mp3' + * + * AudioManager.playActionVoiceBySeat(seat, action) 会根据该座位的 + * sex 字段(sex===2 为女性)自动选择正确的语音文件, + * MALE 和 FEMALE 两组键名必须保持一一对应。 + * + * ============================================================================ + * 调用示例(供理解结构,不代表实际值) + * ============================================================================ + * + * AudioManager.playSound(SoundResources.EFFECTS.DISCARD); + * // 游戏侧 GameAudio 封装 ID 映射,再调用框架层通用 API: + * AudioManager.playVoiceBySeat(seat, ACTION_VOICE_BASE_ID['chi']); // 自动按性别选语音 + * AudioManager.playVoiceBySeat(seat, CARD_VOICE_BASE_ID[cardValue]); // 自动按性别选报牌语音 + * AudioManager.playMusic(); + * + * @see AudioManager.js 音频播放管理(gameabc-framework/system/) + * @see GameAudio.js 游戏专属 ID 映射(子游戏目录,如 game/managers/GameAudio.js) + */ + +'use strict'; + +var SoundResources = { + + // ======================================================================== + // EFFECTS - 通用音效 + // ======================================================================== + EFFECTS: { + + // 操作动效音 ≠ 操作语音: + // 操作动效音 = 文字弹出时的短促音效(在 EFFECTS 中定义) + // 操作语音 = 玩家喊出操作词的人声(在 VOICE 中定义) + + // DISCARD: '<实际文件名>', + // DRAW: '<实际文件名>', + // GAME_START: '<实际文件名>', + // WIN: '<实际文件名>', + // CHI_EFFECT: '<实际文件名>', + // ... + }, + + // ======================================================================== + // VOICE - 语音(按性别分组) + // 规则:女性语音文件 ID = 对应男性语音文件 ID + FEMALE_VOICE_OFFSET(默认100) + // MALE 和 FEMALE 两组键名必须完全一一对应,AudioManager 依赖此结构 + // ======================================================================== + VOICE: { + + MALE: { + // 操作语音键名(固定,AudioManager 按此查找): + // CHI / PONG / KONG / HU / TING / PASS / ZIMO + // CHI: '<实际文件名>', + // ... + + // 报牌语音键名建议统一为 _ + // 示例:WAN_1, WAN_2, ... TIAO_1, ... TONG_1, ... DONG, NAN, XI, BEI, ZHONG, FA, BAI + // WAN_1: '<实际文件名>', + // ... + }, + + FEMALE: { + // 键名与 MALE 完全相同,对应文件 ID + 100 + // CHI: '<实际文件名>', + // WAN_1: '<实际文件名>', + // ... + } + }, + + // ======================================================================== + // MUSIC - 背景音乐 + // 需同时在 game_config.soundList 中配置预加载 + // ======================================================================== + MUSIC: { + // GAME_BGM: '<实际文件名>', + // ROOM_BGM: '<实际文件名>', + } +}; + diff --git a/client/js/gameabc-framework/templates/UIBootstrap.template.js b/client/js/gameabc-framework/templates/UIBootstrap.template.js new file mode 100644 index 0000000..dd92c38 --- /dev/null +++ b/client/js/gameabc-framework/templates/UIBootstrap.template.js @@ -0,0 +1,196 @@ +/** + * ============================================================================ + * UIBootstrap.template.js - UI 启动器规范模板 + * ============================================================================ + * + * 使用方式: + * 将此文件复制到游戏目录,重命名为 UIBootstrap.js。 + * 根据游戏实际使用的 UI 组件修改 _registerViews() 和 _checkDependencies()。 + * + * 加载顺序(index.html 中必须按序): + * 1. gameabc-framework/core/EventBus.js + * 2. gameabc-framework/core/SpriteManager.js + * 3. gameabc-framework/ui/BaseComponent.js + * 4. gameabc-framework/ui/UIManager.js ← 框架层 + * 5. game/ui/UIManager.js ← 游戏层扩展(如 CreateRoomUI) + * 6. game/ui/views/RoomView.js ← 各视图组件 + * 7. game/ui/views/GameView.js + * 8. game/UIBootstrap.js ← 本文件(最后加载) + * + * 调用时机: + * 在 Logic.AppStart() 中调用 UIBootstrap.init() + * + * ============================================================================ + * @guide UIBootstrap 的职责 + * ============================================================================ + * + * UIBootstrap 是游戏专属的启动器,负责: + * 1. 按序初始化框架系统(SpriteManager → AnimationManager → UIManager) + * 2. 创建游戏专属视图组件 + * 3. 向 UIManager 注册组件和场景 + * 4. 提供 views 字典供全局访问 + * + * UIBootstrap 不应该: + * - 包含业务逻辑(发牌、胡牌判断等) + * - 直接操作精灵(应交给各 View 组件) + * - 被其他模块 require(单向依赖) + * + * ============================================================================ + * @guide 场景注册示例 + * ============================================================================ + * + * // 在 _registerViews() 中,创建并注册完所有组件后: + * + * // 1. 注册到 UIManager 组件表 + * UIManager.registerComponent('RoomView', this.views.RoomView); + * UIManager.registerComponent('GameView', this.views.GameView); + * + * // 2. 注册场景(组件名称必须已注册) + * UIManager.registerScene(UIManager.SCENES.ROOM, ['RoomView']); + * UIManager.registerScene(UIManager.SCENES.GAME, ['GameView', 'JingCardView', 'DiceView']); + * + * @see UIManager.js 框架层组件/场景管理(gameabc-framework/ui/) + * @see BaseComponent.js 组件基类(gameabc-framework/ui/) + */ + +var UIBootstrap = UIBootstrap || {}; + +// ============================================================================ +// 状态 +// ============================================================================ + +UIBootstrap.initialized = false; + +/** 游戏创建的所有 View 实例 */ +UIBootstrap.views = {}; + +// ============================================================================ +// 公共 API +// ============================================================================ + +/** + * 初始化 UI 系统 + * 在 Logic.AppStart() 中调用一次 + * @returns {boolean} + */ +UIBootstrap.init = function () { + if (this.initialized) { + console.warn('[UIBootstrap] 已初始化,跳过'); + return true; + } + + console.log('[UIBootstrap] 开始初始化 UI 系统...'); + + try { + if (!this._checkDependencies()) { return false; } + + // 1. 初始化 SpriteManager + SpriteManager.init(); + + // 2. 初始化 AnimationManager(如有) + if (typeof AnimationManager !== 'undefined') { + AnimationManager.init(); + } + + // 3. 初始化 UIManager(框架层 + 游戏扩展) + // 如有 Loading/Message/Confirm 全局 UI,注入各自精灵常量(框架不读子游戏全局名): + // UIManager.init({ loadingUI: SpriteConstants.LOADING_UI, messageUI: SpriteConstants.MESSAGE_UI, confirmUI: SpriteConstants.CONFIRM_UI }); + // 无全局 UI 则直接 UIManager.init(); + UIManager.init(); + + // 4. 创建并注册所有视图 + this._registerViews(); + + this.initialized = true; + console.log('[UIBootstrap] UI 系统初始化完成,共', Object.keys(this.views).length, '个组件'); + return true; + } catch (err) { + console.error('[UIBootstrap] 初始化失败:', err); + return false; + } +}; + +/** + * 检查依赖是否已加载 + * ⚠️ 按游戏实际使用的组件修改此列表 + * @private + */ +UIBootstrap._checkDependencies = function () { + var required = [ + { name: 'EventBus', ok: typeof EventBus !== 'undefined' }, + { name: 'SpriteManager', ok: typeof SpriteManager !== 'undefined' }, + { name: 'UIManager', ok: typeof UIManager !== 'undefined' }, + { name: 'RoomView', ok: typeof RoomView !== 'undefined' }, + { name: 'GameView', ok: typeof GameView !== 'undefined' } + ]; + + var optional = [ + // { name: 'JingCardView', ok: typeof JingCardView !== 'undefined' }, + // { name: 'DiceView', ok: typeof DiceView !== 'undefined' } + ]; + + var allOk = true; + for (var i = 0; i < required.length; i++) { + if (!required[i].ok) { + console.error('[UIBootstrap] 缺少依赖:', required[i].name); + allOk = false; + } + } + for (var j = 0; j < optional.length; j++) { + if (!optional[j].ok) { + console.warn('[UIBootstrap] 可选组件未加载:', optional[j].name); + } + } + return allOk; +}; + +/** + * 创建视图实例并注册到 UIManager + * ⚠️ 按游戏实际使用的组件修改此方法 + * @private + */ +UIBootstrap._registerViews = function () { + // ---- 创建组件 ---- + this.views.RoomView = RoomView.create({ name: 'RoomView' }); + this.views.GameView = GameView.create({ name: 'GameView' }); + // this.views.JingCardView = JingCardView.create({ name: 'JingCardView' }); + // this.views.DiceView = DiceView.create({ name: 'DiceView' }); + + // ---- 注册到 UIManager ---- + UIManager.registerComponent('RoomView', this.views.RoomView); + UIManager.registerComponent('GameView', this.views.GameView); + + // ---- 注册场景 ---- + UIManager.registerScene(UIManager.SCENES.ROOM, ['RoomView']); + UIManager.registerScene(UIManager.SCENES.GAME, ['GameView']); +}; + +// ============================================================================ +// 工具方法 +// ============================================================================ + +UIBootstrap.getView = function (viewName) { + return this.views[viewName] || null; +}; + +UIBootstrap.showView = function (viewName) { + if (!this.initialized) { return; } + UIManager.showView(viewName); +}; + +UIBootstrap.hideView = function (viewName) { + if (!this.initialized) { return; } + UIManager.hideView(viewName); +}; + +UIBootstrap.getStatus = function () { + return { + initialized: this.initialized, + views: Object.keys(this.views), + uiManagerReady: UIManager.initialized + }; +}; + +if (typeof module !== 'undefined' && module.exports) { + module.exports = UIBootstrap; +} diff --git a/client/js/gameabc-framework/templates/subgame-entry/00_SubGame_Config.template.js b/client/js/gameabc-framework/templates/subgame-entry/00_SubGame_Config.template.js new file mode 100644 index 0000000..85cbce1 --- /dev/null +++ b/client/js/gameabc-framework/templates/subgame-entry/00_SubGame_Config.template.js @@ -0,0 +1,130 @@ +// ============================================================================ +// 00_SubGame_Config.template.js —— 平台配置项模板(结构由平台定义,子游戏填【值】) +// 这是配置文件(C 类,非转发壳)。复制后按本游戏界面/玩法调整各项值。 +// 严格 ES5。 +// ============================================================================ + +var Game_Config = Game_Config || {}; + + + +Game_Config.Debugger={//调试配置 + isDebugger : true,// debugger模式下会将所有收发的包输出到控制台(正式发布改为false) + AutoLogin : true,//debugger模式下是否需要记住登录状态自动登录(正式发布改为true) + isSubmitError : false,//是否需要服务器收集错误信息调试时可根据需要(正式发布改为true) + visitorLogin : true,//隐藏式游客登录 + visiblePay:true,//审核通过后是否显示支付按钮 + serverType:1,//0->正式服务器 1->本地服务器 http://ylyxservice1.0791ts.cn/config/update_json.txt + gameserver:""//子游戏填自己的更新地址 +}; + +Game_Config.Max = { + SumOfRoomtype:3,//创建时房间类型roomtype数组长度 + ShowChat:2000,//聊天停留时间 + PlayerCnt:4,//房间最大人数(按房间最大人数设置) + group:500,//游戏最大群组号 + showtime:10,//加载等待最少时间 + reconnecttime:30000,//唤醒游戏间隔(超过间隔断线重连) + Mainnickname:10,//主界面玩家昵称显示长度(字符长度) + Infonickname:16//个人信息显示长度(字符长度) +}; +Game_Config.Combat = { + height:80,//战绩页单行高度高度 + up_y:190,//战绩页裁剪y坐标 + bannerheight:60,//战绩横幅高度 + bannery:80,//战绩横幅Y左边(相对48精灵) + btnbg:50 +}; +Game_Config.Info = { + Mainnickname:8,//游戏主界面玩家信息显示最大长度(字符) + textwidth_1:12.5,//昵称文字显示的宽度(未改动聊天显示文字大小无需改动无需修改) + textwidth_2:12.5,//积分文字显示的宽度(未改动聊天显示文字大小无需改动无需修改) + otherPositionDefault:true,//其他主界面玩家信息(昵称、积分)是否采用默认对齐方式对齐居中点为头像中点 + myPositionDefault:true,//其他主界面玩家信息(昵称、积分)是否采用默认对齐方式对齐居中点为头像中点 + myPosition:130,//自己信息对齐点(根据游戏界面自行修改) + position:[],//其他主界面玩家信息(昵称、积分)居中对齐的x坐标 注意是其他玩家不包括自己从下家开始 + //TextContent:["1","2","3","4","5","6","7"],//常用语内容 + TextContent:["你好","谢谢","再来","快点","不要","加油",":)"],//常用语内容 + TextContentMp3:["","","","","","",""],//常用语对应音效 +}; +Game_Config.Share={//分享参数 + appdownload:"",//下载链接(无需配置,从服务器获取) + title:"游戏名",//(分享标题) + description:"",//分享描述 + gameTitle:"",//游戏中的分享标题模板工程会自动将游戏名字分享出去、不必写在这个变量里 + gameDescription:""//游戏中分享描述 +}; +Game_Config.Chat={//游戏内聊天配置信息 + LimitLength:40,//聊天最大长度(字节长度) + textwidth:12.5,//聊天显示文字的宽度(未改动聊天显示文字大小无需改动无需修改) + ChatDis:[30,12],//聊天气泡与内容的间隔0位置左右间隔(最好不要低于30)1位置上下间隔 + isLeft:[1,0,0,1,1],//聊天气泡是否为以左边为基准线(坐标/基准按各游戏界面调整) + ChatLoc:[[35,517],[1100,315],[1100,105],[175,105],[175,315]]//聊天气泡的基准点位置(注意是基准点位置!)(坐标/基准按各游戏界面调整) + +}; +Game_Config.Voice={//游戏内聊天配置信息 + VoiceTime:600,//播放语音动画的时间一般情况无需无需修改 + VoiceDis:[30,12],//语音气泡与内容的间隔0位置左右间隔(最好不要低于30)1位置上下间隔 + isLeft:[1,0,0,1,1],//气泡是否为以左边为基准线(坐标/基准按各游戏界面调整) + VoiceLoc:[[35,517],[1100,315],[1100,105],[175,105],[175,315]]//气泡的基准点位置(注意是基准点位置!)(坐标/基准按各游戏界面调整) +}; +Game_Config.Setting={ + Ads1:"本游戏仅供娱乐休闲使用,\n道具及虚拟货币不可兑换\n现金或实物,不代表任何\n真实财富价值。", + //Ads2:"\n 或客服号:\n", + board:"",//从后台获取设置无效 + //info:[" 客服信息","QQ:","",""],//客服QQ提醒 + info:[" 客服信息","QQ:","手机:","微信:"],//客服QQ提醒 + board_blength:24,//通知页面一行最大字节数(无需设置) + charge:"充值提示",//充值提示 +}; +Game_Config.Protocol={ + x:270,//协议图片初始x坐标 + y:70,//协议图片初始y坐标 + h:560,//协议图片显示高度 + w:729//协议图片显示宽度 +}; +Game_Config.Help={//帮助 + x:300,//帮助图片初始x坐标 + y:165,//帮助图片初始y坐标 + w:729,//帮助图片显示高度 + h:450//帮助图片显示宽度 +}; +Game_Config.Notice={//滚动公告 + x1:0,//无需设置 + x2:0,//无需设置 + y:0,//无需设置 + h:0,//无需设置 + //以上参数用来截取滚动公告的显示,截取位置是与滚动公告底大小位置一致 + speed:0.1,//滚动公告的滚动速度 + width:15//滚动公告的内容字体的字节长度(汉字是两个字节) +}; +Game_Config.Feedback = {//反馈配置 + maxLen:250 //反馈内容最大长度 +}; +Game_Config.shakeList ={//摇一摇事件的回调ID、需要添加时在此处添加回调事件写在Utl_Input.js中的Utl.shakeEvent()中 + nil:0, + startwar:1 +}; +Game_Config.soundList ={//声音资源名 + MenuSceneMusic:"",//大厅界面背景音 + MainSceneMusic:""//游戏主界面背景音 +}; +Game_Config.ClickButton = {//需要设置点击音效的按钮(只有有弹窗的按钮设置此音效有效、按钮已经设置好、子游戏不允许修改) + src_1:"",//点击时播放的声音资源文件( 不需要播放则不填,下同) + src_2:""//弹窗时播放的音效 +} + +Game_Config.loginButton = {//登录按钮信息 + x1:415,//非审核版本微信登录按钮x + x2:113,//审核版本微信登录按钮x + x3:488,//审核版本游客登录按钮x +}; +Game_Config.sysConfig = { + mainMenuButton:false,//是否进入主菜单界面隐藏四个按钮 + mainScenePlayerInfo:false,//是否隐藏主界面玩家信息 + mainSceneButton:false,//是否隐藏主界面按钮 + shareRoom:false,//接收到星星场是否屏蔽平台框架显示 + changeSeat:false,//是否屏蔽平台自动刷新换座后界面 + hideNotice:false,//隐藏公告栏 + vipInfinite:false,//是否为百人场 +} diff --git a/client/js/gameabc-framework/templates/subgame-entry/01_SubGame_modify.template.js b/client/js/gameabc-framework/templates/subgame-entry/01_SubGame_modify.template.js new file mode 100644 index 0000000..94c2e67 --- /dev/null +++ b/client/js/gameabc-framework/templates/subgame-entry/01_SubGame_modify.template.js @@ -0,0 +1,129 @@ +// ============================================================================ +// 01_SubGame_modify.js —— 平台交互/创建房间接口「转发壳」(框架维护,子游戏不碰) +// 顶部为「房型/创建房间配置区」(数据,子游戏填值);其下为接口转发壳(转发到 SubGameHooks)。 +// 严格 ES5。 +// ---------------------------------------------------------------------------- +// 【平台约定精灵:25 号 = 创建房间确认按钮】(接入子游戏必看) +// 平台框架在「创建房间」界面提供 25 号精灵作为“确认/提交”按钮;其点击交互与 +// 发送的数据包,均需【子游戏自己实现】(平台不代发),约定流程: +// 1. 子游戏在打开创建房间界面时注册 25 号精灵的点击(经 SpriteEventController +// 或 mouseup),点击即“确认创建房间”。 +// 2. 子游戏按界面选项拼出 roomtype(房型配置串,编码局数/人数/扣卡/规则等, +// 由各子游戏按玩法自定义与解析),组装并发送创建房间请求: +// Net.Send_create_room({ +// agentid : GameData.AgentId, +// playerid: C_Player.playerid, +// gameid : GameData.GameId, +// roomtype: <房型配置字符串> +// }); +// +// 本麻将实现见 codes/game/ui/handlers/CreateRoomEventHandler(bindEvents 注册 +// 25→submit;submit 用 UIManager._buildRoomTypeString 拼 roomtype 后 Net.Send_create_room)。 +// ============================================================================ + +// ---------- 配置区(数据,子游戏按玩法填值;与 00 的 Game_Config 分工) ---------- +var Game_Modify = Game_Modify || {}; +// ---------- 平台需要的必须字段 ---------- +Game_Modify.roomDes = ""; // 房间描述,子游戏在 setRoomDes 内填 +Game_Modify.game_config = {}; // 游戏配置默认值 +Game_Modify.combat = { + maxPlayerCount: 5, + pageOnelimitStrLen: 8, + pageOneDoc: false, + pageTwolimitStrLen: 16, + pageTwoDoc: false +}; +Game_Modify.Type_1 = [ + { id: 0, des: "10局(房卡X1)", roomcard: 1, type: 1 }, + { id: 1, des: "20局(房卡X2)", roomcard: 2, type: 2 } +]; +Game_Modify.Type_2 = [ + { id: 0, des: "房主扣卡", type: 1 }, + { id: 1, des: "每人扣卡", type: 2 } +]; +Game_Modify.CreateRoomData = { + Type_1: 0, + Type_2: 0 +}; + + +// ---------- 接口转发壳(A 类:无 hook 即 no-op) ---------- +Game_Modify.utlmousedown = function (gameid, spid, downx, downy, no1, no2, no3, no4, no5, no6) { + if (window.SubGameHooks && SubGameHooks.utlmousedown) return SubGameHooks.utlmousedown(gameid, spid, downx, downy, no1, no2, no3, no4, no5, no6); +}; +Game_Modify.utlmousedown_nomove = function (gameid, spid, downx, downy, timelong, no1, no2, no3, no4, no5) { + if (window.SubGameHooks && SubGameHooks.utlmousedown_nomove) return SubGameHooks.utlmousedown_nomove(gameid, spid, downx, downy, timelong, no1, no2, no3, no4, no5); +}; +Game_Modify.mouseup = function (gameid, spid_down, downx, downy, spid_up, upx, upy, timelong, no1, no2) { + if (window.SubGameHooks && SubGameHooks.mouseup) return SubGameHooks.mouseup(gameid, spid_down, downx, downy, spid_up, upx, upy, timelong, no1, no2); +}; +Game_Modify.utlmousemove = function (gameid, spid, downx, downy, movex, movey, timelong, offmovex, offmovey, no1) { + if (window.SubGameHooks && SubGameHooks.utlmousemove) return SubGameHooks.utlmousemove(gameid, spid, downx, downy, movex, movey, timelong, offmovex, offmovey, no1); +}; +Game_Modify.utlgamemydrawbegin = function (gameid, spid, times, timelong, no2, no3, no4, no5, no6, no7) { + if (window.SubGameHooks && SubGameHooks.utlgamemydrawbegin) return SubGameHooks.utlgamemydrawbegin(gameid, spid, times, timelong, no2, no3, no4, no5, no6, no7); +}; +Game_Modify.gamemydraw = function (gameid, spid, times, timelong, no2, no3, no4, no5, no6, no7) { + if (window.SubGameHooks && SubGameHooks.gamemydraw) return SubGameHooks.gamemydraw(gameid, spid, times, timelong, no2, no3, no4, no5, no6, no7); +}; +Game_Modify.OpenCreateRoom = function () { + if (window.SubGameHooks && SubGameHooks.OpenCreateRoom) return SubGameHooks.OpenCreateRoom(); +}; +Game_Modify.CloseCreateRoom = function () { + if (window.SubGameHooks && SubGameHooks.CloseCreateRoom) return SubGameHooks.CloseCreateRoom(); +}; +Game_Modify.setRoomDes = function (roomcode, asetcount, roomtype) { + if (window.SubGameHooks && SubGameHooks.setRoomDes) return SubGameHooks.setRoomDes(roomcode, asetcount, roomtype); +}; + +// ---------- gameCombat 兼容空定义 ---------- +// 平台 gamemain.js 仍直接调用 gameCombat.utl*(战绩界面回调),保留全局对象与 6 个空接口防报错。 +// 战绩功能由 RecordView 重建(见迁移子项目 2);届时这些接口可改为委托或保持空。 +var gameCombat = gameCombat || {}; +gameCombat.utlani_doend = gameCombat.utlani_doend || function () {}; +gameCombat.utlmousedown = gameCombat.utlmousedown || function () {}; +gameCombat.utlmouseup = gameCombat.utlmouseup || function () {}; +gameCombat.utlmousemove = gameCombat.utlmousemove || function () {}; +gameCombat.utlgamemydraw = gameCombat.utlgamemydraw || function () {}; +gameCombat.utlgamemydrawbegin = gameCombat.utlgamemydrawbegin || function () {}; +// 战绩接收入口(平台 09_Net 调):转发到 SubGameHooks(框架转发壳不引用 codes;子游戏在 SubGameHooks 内转 CombatService) +gameCombat.get_player_grade1 = function (_msg) { + if (window.SubGameHooks && SubGameHooks.get_player_grade1) return SubGameHooks.get_player_grade1(_msg); +}; +gameCombat.get_player_grade2 = function (_msg) { + if (window.SubGameHooks && SubGameHooks.get_player_grade2) return SubGameHooks.get_player_grade2(_msg); +}; + +// 战绩入口:13 号精灵点击 → 发送获取战绩请求(Net.Send_get_player_grade1,平台底层发送) +// 点击经 平台 → Game_Modify.mouseup → SubGameHooks.mouseup → SpriteEventController 链到达 +if (typeof SpriteEventController !== 'undefined' && SpriteEventController.registerMouseUp) { + SpriteEventController.registerMouseUp(13, function () { + if (typeof Net !== 'undefined' && Net.Send_get_player_grade1) { + Net.Send_get_player_grade1({ + agentid: GameData.AgentId, + playerid: C_Player.playerid, + gameid: GameData.GameId, + type: 0 + }); + } + }); +} + +// 平台通用精灵交互(从 SubGameHooks 移入;经 Game_Modify.mouseup/gamemydraw→SubGameHooks→SpriteEventController 分发) +// 注:25 号(创建房间提交)已归创建房间职责,移至 codes/game/ui/handlers/CreateRoomEventHandler.bindEvents。 +if (typeof SpriteEventController !== 'undefined') { + // 150:帮助按钮 + if (SpriteEventController.registerMouseUp) { + SpriteEventController.registerMouseUp(150, function () { + if (typeof GameUI !== 'undefined' && GameUI.OpenHelp) { GameUI.OpenHelp(); } + }); + } + // 248:协议勾选绘制(勾上时自绘钩) + if (SpriteEventController.registerDraw) { + SpriteEventController.registerDraw(248, function (e) { + if (GameData.ProtocolIndex) { + ifast_mydrawbmp(e.spriteId, 4, 5, 5, 40, 40, 0, 0, 40, 40); + } + }); + } +} diff --git a/client/js/gameabc-framework/templates/subgame-entry/02_SubGame_Input.template.js b/client/js/gameabc-framework/templates/subgame-entry/02_SubGame_Input.template.js new file mode 100644 index 0000000..32d178b --- /dev/null +++ b/client/js/gameabc-framework/templates/subgame-entry/02_SubGame_Input.template.js @@ -0,0 +1,300 @@ +// ============================================================================ +// 02_SubGame_Input.template.js —— 平台输入/回调接口「转发壳」模板(框架维护,子游戏不碰) +// 平台按全局名调用 gameHallImport.* / Game_Modify.*;本文件统一转发到 SubGameHooks 同名 hook。 +// 子游戏只需在 codes/ 的 SubGameHooks 里实现需要的接口(见 SubGameHooks.template.js)。 +// 严格 ES5。接口清单与默认值依据 spec §9。 +// ============================================================================ + +var gameHallImport = gameHallImport || {}; +var Game_Modify = Game_Modify || {}; + +// ============================================================================ +// gameHallImport.* — 大厅接口(9 个) +// ============================================================================ + +// A 类:纯子游戏行为,无 hook 即 no-op +// 注:与 Game_Modify.appStart 同名但语义不同(大厅启动 vs 游戏启动),故 hook 名加 hall 前缀区分 +gameHallImport.appStart = function () { + if (window.SubGameHooks && SubGameHooks.hallAppStart) return SubGameHooks.hallAppStart(); +}; + +// A 类:纯子游戏行为,无 hook 即 no-op +gameHallImport.jumpMenuScene = function () { + if (window.SubGameHooks && SubGameHooks.jumpMenuScene) return SubGameHooks.jumpMenuScene(); +}; + +// A 类:纯子游戏行为,无 hook 即 no-op +gameHallImport.gameStart = function () { + if (window.SubGameHooks && SubGameHooks.gameStart) return SubGameHooks.gameStart(); +}; + +// A 类:纯子游戏行为,无 hook 即 no-op +gameHallImport.setGameList = function () { + if (window.SubGameHooks && SubGameHooks.setGameList) return SubGameHooks.setGameList(); +}; + +// A 类:纯子游戏行为,无 hook 即 no-op +gameHallImport.clearGameinfo = function () { + if (window.SubGameHooks && SubGameHooks.clearGameinfo) return SubGameHooks.clearGameinfo(); +}; + +// A 类:纯子游戏行为,无 hook 即 no-op +gameHallImport.getWebdata = function (data) { + if (window.SubGameHooks && SubGameHooks.getWebdata) return SubGameHooks.getWebdata(data); +}; + +// B 类:有平台默认返回值,无 hook 即返回默认 +gameHallImport.isInstalled = function (data) { + if (window.SubGameHooks && SubGameHooks.isInstalled) return SubGameHooks.isInstalled(data); + return 1; +}; + +// A 类:纯子游戏行为,无 hook 即 no-op +gameHallImport.up_imgurl = function (recid, photo) { + if (window.SubGameHooks && SubGameHooks.up_imgurl) return SubGameHooks.up_imgurl(recid, photo); +}; + +// A 类:纯子游戏行为,无 hook 即 no-op +gameHallImport.getphoto = function (recid, photo) { + if (window.SubGameHooks && SubGameHooks.getphoto) return SubGameHooks.getphoto(recid, photo); +}; + +// ============================================================================ +// Game_Modify.* — 生命周期/回调接口(来自 02,45 个) +// ============================================================================ + +// A 类:纯子游戏行为,无 hook 即 no-op +Game_Modify.appStart = function () { + if (window.SubGameHooks && SubGameHooks.appStart) return SubGameHooks.appStart(); +}; + +// A 类:开战回调,无 hook 即 no-op +Game_Modify.StartWar = function (_msg) { + if (window.SubGameHooks && SubGameHooks.StartWar) return SubGameHooks.StartWar(_msg); +}; + +// A 类:接收数据包,无 hook 即 no-op +Game_Modify._ReceiveData = function (_msg) { + if (window.SubGameHooks && SubGameHooks._ReceiveData) return SubGameHooks._ReceiveData(_msg); +}; + +// A 类:创建房间,无 hook 即 no-op +Game_Modify.createRoom = function (_roomtype, _infinite) { + if (window.SubGameHooks && SubGameHooks.createRoom) return SubGameHooks.createRoom(_roomtype, _infinite); +}; + +// A 类:自己进入房间,无 hook 即 no-op +Game_Modify.myJoinRoom = function (_msg) { + if (window.SubGameHooks && SubGameHooks.myJoinRoom) return SubGameHooks.myJoinRoom(_msg); +}; + +// A 类:重连,无 hook 即 no-op +Game_Modify.Reconnect = function (_deskinfo) { + if (window.SubGameHooks && SubGameHooks.Reconnect) return SubGameHooks.Reconnect(_deskinfo); +}; + +// A 类:关闭所有声音,无 hook 即 no-op +Game_Modify.stopAllSounds = function () { + if (window.SubGameHooks && SubGameHooks.stopAllSounds) return SubGameHooks.stopAllSounds(); +}; + +// A 类:投票解散确认,无 hook 即 no-op +Game_Modify.Free = function (_msg) { + if (window.SubGameHooks && SubGameHooks.Free) return SubGameHooks.Free(_msg); +}; + +// A 类:未开战状态加入牌桌数据,无 hook 即 no-op +Game_Modify.DeskInfo = function (_msg) { + if (window.SubGameHooks && SubGameHooks.DeskInfo) return SubGameHooks.DeskInfo(_msg); +}; + +// A 类:开局后自己退出房间,无 hook 即 no-op +Game_Modify.breakRoom = function () { + if (window.SubGameHooks && SubGameHooks.breakRoom) return SubGameHooks.breakRoom(); +}; + +// A 类:其他玩家加入房间,无 hook 即 no-op +Game_Modify.playerJoinRoom = function (seat) { + if (window.SubGameHooks && SubGameHooks.playerJoinRoom) return SubGameHooks.playerJoinRoom(seat); +}; + +// A 类:其他玩家离开房间,无 hook 即 no-op +Game_Modify.playerLeaveRoom = function (seat) { + if (window.SubGameHooks && SubGameHooks.playerLeaveRoom) return SubGameHooks.playerLeaveRoom(seat); +}; + +// A 类:更新游戏界面,无 hook 即 no-op +Game_Modify.updateScene = function () { + if (window.SubGameHooks && SubGameHooks.updateScene) return SubGameHooks.updateScene(); +}; + +// A 类:关闭游戏界面,无 hook 即 no-op +Game_Modify.closeGameScene = function () { + if (window.SubGameHooks && SubGameHooks.closeGameScene) return SubGameHooks.closeGameScene(); +}; + +// A 类:玩家离线,无 hook 即 no-op +Game_Modify.playerOffline = function (seat) { + if (window.SubGameHooks && SubGameHooks.playerOffline) return SubGameHooks.playerOffline(seat); +}; + +// A 类:玩家上线,无 hook 即 no-op +Game_Modify.playerOnline = function (seat) { + if (window.SubGameHooks && SubGameHooks.playerOnline) return SubGameHooks.playerOnline(seat); +}; + +// A 类:玩家电话状态,无 hook 即 no-op +Game_Modify.playerphonestate = function (seat, type) { + if (window.SubGameHooks && SubGameHooks.playerphonestate) return SubGameHooks.playerphonestate(seat, type); +}; + +// A 类:摇一摇事件,无 hook 即 no-op +Game_Modify.shakeEvent = function () { + if (window.SubGameHooks && SubGameHooks.shakeEvent) return SubGameHooks.shakeEvent(); +}; + +// A 类:计算结果,无 hook 即 no-op +Game_Modify.calResult = function (inputArr) { + if (window.SubGameHooks && SubGameHooks.calResult) return SubGameHooks.calResult(inputArr); +}; + +// A 类:进入游戏主场景,无 hook 即 no-op +Game_Modify.onEnterMainScene = function (roomtype) { + if (window.SubGameHooks && SubGameHooks.onEnterMainScene) return SubGameHooks.onEnterMainScene(roomtype); +}; + +// A 类:退出游戏主场景,无 hook 即 no-op +Game_Modify.onExitMainScene = function () { + if (window.SubGameHooks && SubGameHooks.onExitMainScene) return SubGameHooks.onExitMainScene(); +}; + +// A 类:获取游戏配置时调用,无 hook 即 no-op +Game_Modify.onGameConfig = function (_gameConfig) { + if (window.SubGameHooks && SubGameHooks.onGameConfig) return SubGameHooks.onGameConfig(_gameConfig); +}; + +// A 类:进入牌局回放,无 hook 即 no-op +Game_Modify.onEnterVideo = function () { + if (window.SubGameHooks && SubGameHooks.onEnterVideo) return SubGameHooks.onEnterVideo(); +}; + +// A 类:收到投降回包,无 hook 即 no-op +Game_Modify.onSurrender = function (_msg) { + if (window.SubGameHooks && SubGameHooks.onSurrender) return SubGameHooks.onSurrender(_msg); +}; + +// A 类:玩家准备触发,无 hook 即 no-op +Game_Modify.onReady = function (seat) { + if (window.SubGameHooks && SubGameHooks.onReady) return SubGameHooks.onReady(seat); +}; + +// B 类:获取房间描述,无 hook 返回默认文案 +Game_Modify.getRoomInfo = function (roomtype, type, tea) { + if (window.SubGameHooks && SubGameHooks.getRoomInfo) return SubGameHooks.getRoomInfo(roomtype, type, tea); + return "房间描述" + roomtype; +}; + +// B 类:获取房间星星场下限,无 hook 返回默认值 +Game_Modify.getStarLimit = function (roomtype) { + if (window.SubGameHooks && SubGameHooks.getStarLimit) return SubGameHooks.getStarLimit(roomtype); + return 2001000; +}; + +// B 类:获取房间星星场倍数,无 hook 返回默认值 +Game_Modify.getMult = function (roomtype, type) { + if (window.SubGameHooks && SubGameHooks.getMult) return SubGameHooks.getMult(roomtype, type); + return 10000; +}; + +// B 类:获取房间全部信息描述,无 hook 返回默认文案 +Game_Modify.getFullRoomInfo = function (roomtype) { + if (window.SubGameHooks && SubGameHooks.getFullRoomInfo) return SubGameHooks.getFullRoomInfo(roomtype); + return "房间描述" + roomtype; +}; + +// A 类:打开帮助页面,无 hook 即 no-op +Game_Modify.onOpenHelp = function (spid) { + if (window.SubGameHooks && SubGameHooks.onOpenHelp) return SubGameHooks.onOpenHelp(spid); +}; + +// A 类:显示大厅界面,无 hook 即 no-op +Game_Modify.onMainMenuScene = function () { + if (window.SubGameHooks && SubGameHooks.onMainMenuScene) return SubGameHooks.onMainMenuScene(); +}; + +// A 类:数字输入框确认回调,无 hook 即 no-op +Game_Modify.onCheckInput = function (_result) { + if (window.SubGameHooks && SubGameHooks.onCheckInput) return SubGameHooks.onCheckInput(_result); +}; + +// A 类:创建房间成功后触发,无 hook 即 no-op +Game_Modify.onCreateRoom = function (_data) { + if (window.SubGameHooks && SubGameHooks.onCreateRoom) return SubGameHooks.onCreateRoom(_data); +}; + +// B 类:获取离场限制,无 hook 返回默认值 +Game_Modify.getLeaveLimit = function (roomtype) { + if (window.SubGameHooks && SubGameHooks.getLeaveLimit) return SubGameHooks.getLeaveLimit(roomtype); + return 10; +}; + +// A 类:成功获取定位信息,无 hook 即 no-op +Game_Modify.onLocationInfo = function (_locationInfo) { + if (window.SubGameHooks && SubGameHooks.onLocationInfo) return SubGameHooks.onLocationInfo(_locationInfo); +}; + +// A 类:进入游戏界面创建牌桌之前,无 hook 即 no-op +Game_Modify.onCreateDesk = function (roomtype) { + if (window.SubGameHooks && SubGameHooks.onCreateDesk) return SubGameHooks.onCreateDesk(roomtype); +}; + +// B 类:获取是否开启视频功能,无 hook 返回默认值 +Game_Modify.getVideoByRoomType = function (roomtype) { + if (window.SubGameHooks && SubGameHooks.getVideoByRoomType) return SubGameHooks.getVideoByRoomType(roomtype); + return 1; +}; + +// B 类:获取房间顶部描述数组,无 hook 返回默认文案数组 +Game_Modify.getRoomTopDescAry = function (roomtype) { + if (window.SubGameHooks && SubGameHooks.getRoomTopDescAry) return SubGameHooks.getRoomTopDescAry(roomtype); + return ["" + roomtype]; +}; + +// A 类:星星场房间列表,无 hook 即 no-op +Game_Modify.getShareRoom = function (_msg) { + if (window.SubGameHooks && SubGameHooks.getShareRoom) return SubGameHooks.getShareRoom(_msg); +}; + +// A 类:玩家自己退出房间,无 hook 即 no-op +Game_Modify.myExitRoom = function (seat) { + if (window.SubGameHooks && SubGameHooks.myExitRoom) return SubGameHooks.myExitRoom(seat); +}; + +// A 类:接收到换座包触发,无 hook 即 no-op +Game_Modify.changeSeat = function (seat1, seat2) { + if (window.SubGameHooks && SubGameHooks.changeSeat) return SubGameHooks.changeSeat(seat1, seat2); +}; + +// A 类:关闭 vip 选项时调用,无 hook 即 no-op +Game_Modify.onCloseVip = function () { + if (window.SubGameHooks && SubGameHooks.onCloseVip) return SubGameHooks.onCloseVip(); +}; + +// B 类:判断房间是否为金币场,无 hook 返回默认值(0=非金币场) +Game_Modify.getRoomMode = function (roomtype) { + if (window.SubGameHooks && SubGameHooks.getRoomMode) return SubGameHooks.getRoomMode(roomtype); + return 0; +}; + +// B 类:获取房间最大玩家数量,无 hook 返回默认值 +Game_Modify.getMaxPlayerCount = function (roomtype) { + if (window.SubGameHooks && SubGameHooks.getMaxPlayerCount) return SubGameHooks.getMaxPlayerCount(roomtype); + // 默认值依赖全局 Game_Config(须在本模板之前加载);无则回退 4 + return (Game_Config.Max && Game_Config.Max.PlayerCnt) || 4; +}; + +// B 类:更新玩家信息 UI,无 hook 返回 false(让平台默认处理) +Game_Modify.updatePlayerInfoUI = function (targetSeat) { + if (window.SubGameHooks && SubGameHooks.updatePlayerInfoUI) return SubGameHooks.updatePlayerInfoUI(targetSeat); + return false; +}; diff --git a/client/js/gameabc-framework/templates/subgame-entry/SubGameHooks.template.js b/client/js/gameabc-framework/templates/subgame-entry/SubGameHooks.template.js new file mode 100644 index 0000000..9e24e23 --- /dev/null +++ b/client/js/gameabc-framework/templates/subgame-entry/SubGameHooks.template.js @@ -0,0 +1,206 @@ +// ============================================================================ +// SubGameHooks.template.js —— 子游戏接入入口(复制为 codes/SubGameHooks.js 后填实现) +// 平台契约文件(00/01/02 转发壳)会把同名平台接口转发到这里。只需实现【本游戏需要的】hook, +// 未实现的接口由转发壳走平台默认(B)或空操作(A)。严格 ES5。 +// 接口清单与默认值见 spec §9 / 文档 06。 +// ============================================================================ + +var SubGameHooks = window.SubGameHooks || {}; + +// ===== gameHallImport.*(大厅,9) ===== + +// [A] hallAppStart():大厅应用启动(注:与 Game_Modify.appStart 同名冲突,故加 hall 前缀区分)。 +// SubGameHooks.hallAppStart = function () { /* ... */ }; + +// [A] jumpMenuScene():大厅跳转菜单场景。 +// SubGameHooks.jumpMenuScene = function () { /* ... */ }; + +// [A] gameStart():大厅游戏开始入口。 +// SubGameHooks.gameStart = function () { /* ... */ }; + +// [A] setGameList():设置游戏列表。 +// SubGameHooks.setGameList = function () { /* ... */ }; + +// [A] clearGameinfo():清除游戏信息。 +// SubGameHooks.clearGameinfo = function () { /* ... */ }; + +// [A] getWebdata(data):获取网络数据回调。 +// SubGameHooks.getWebdata = function (data) { /* ... */ }; + +// [B] isInstalled(data):检查是否已安装;无 hook 时默认:return 1。 +// SubGameHooks.isInstalled = function (data) { /* ... */ }; + +// [A] up_imgurl(recid, photo):更新图片 URL。 +// SubGameHooks.up_imgurl = function (recid, photo) { /* ... */ }; + +// [A] getphoto(recid, photo):获取玩家头像。 +// SubGameHooks.getphoto = function (recid, photo) { /* ... */ }; + +// ===== Game_Modify.*(事件/交互,来自 01,9) ===== + +// [A] utlmousedown(gameid, spid, downx, downy, no1, no2, no3, no4, no5, no6):精灵按下事件;子游戏转发到 SpriteEventController。 +// SubGameHooks.utlmousedown = function (gameid, spid, downx, downy, no1, no2, no3, no4, no5, no6) { /* ... */ }; + +// [A] utlmousedown_nomove(gameid, spid, downx, downy, timelong, no1, no2, no3, no4, no5):精灵按下(无移动)事件。 +// SubGameHooks.utlmousedown_nomove = function (gameid, spid, downx, downy, timelong, no1, no2, no3, no4, no5) { /* ... */ }; + +// [A] mouseup(gameid, spid_down, downx, downy, spid_up, upx, upy, timelong, no1, no2):精灵抬起事件。 +// SubGameHooks.mouseup = function (gameid, spid_down, downx, downy, spid_up, upx, upy, timelong, no1, no2) { /* ... */ }; + +// [A] utlmousemove(gameid, spid, downx, downy, movex, movey, timelong, offmovex, offmovey, no1):精灵移动事件。 +// SubGameHooks.utlmousemove = function (gameid, spid, downx, downy, movex, movey, timelong, offmovex, offmovey, no1) { /* ... */ }; + +// [A] utlgamemydrawbegin(gameid, spid, times, timelong, no2, no3, no4, no5, no6, no7):精灵绘制开始事件。 +// SubGameHooks.utlgamemydrawbegin = function (gameid, spid, times, timelong, no2, no3, no4, no5, no6, no7) { /* ... */ }; + +// [A] gamemydraw(gameid, spid, times, timelong, no2, no3, no4, no5, no6, no7):精灵绘制帧事件。 +// SubGameHooks.gamemydraw = function (gameid, spid, times, timelong, no2, no3, no4, no5, no6, no7) { /* ... */ }; + +// [A] OpenCreateRoom():打开创建房间界面。 +// SubGameHooks.OpenCreateRoom = function () { /* ... */ }; + +// [A] CloseCreateRoom():关闭创建房间界面。 +// SubGameHooks.CloseCreateRoom = function () { /* ... */ }; + +// [A] setRoomDes(roomcode, asetcount, roomtype):设置房间描述文案。 +// SubGameHooks.setRoomDes = function (roomcode, asetcount, roomtype) { /* ... */ }; + +// ===== Game_Modify.*(生命周期/回调,来自 02,45) ===== + +// [A] appStart():游戏应用启动(与 gameHallImport.appStart 语义不同,对应 Game_Modify 侧启动)。 +// SubGameHooks.appStart = function () { /* ... */ }; + +// [A] StartWar(_msg):开战(开局)回调,解包开局数据并初始化游戏状态。 +// SubGameHooks.StartWar = function (_msg) { /* ... */ }; + +// [A] _ReceiveData(_msg):接收服务端主动推送的数据包,派发给对应业务处理器。 +// SubGameHooks._ReceiveData = function (_msg) { /* ... */ }; + +// [A] createRoom(_roomtype, _infinite):前端发起创建房间请求。 +// SubGameHooks.createRoom = function (_roomtype, _infinite) { /* ... */ }; + +// [A] myJoinRoom(_msg):自己成功进入房间回调。 +// SubGameHooks.myJoinRoom = function (_msg) { /* ... */ }; + +// [A] Reconnect(_deskinfo):重连回调,用服务端返回的桌面信息恢复游戏界面。 +// SubGameHooks.Reconnect = function (_deskinfo) { /* ... */ }; + +// [A] stopAllSounds():停止所有声音(切换到后台时触发)。 +// SubGameHooks.stopAllSounds = function () { /* ... */ }; + +// [A] Free(_msg):投票解散确认回调。 +// SubGameHooks.Free = function (_msg) { /* ... */ }; + +// [A] DeskInfo(_msg):未开战状态下加入牌桌的数据同步。 +// SubGameHooks.DeskInfo = function (_msg) { /* ... */ }; + +// [A] breakRoom():开局后自己退出房间触发。 +// SubGameHooks.breakRoom = function () { /* ... */ }; + +// [A] playerJoinRoom(seat):其他玩家加入房间通知。 +// SubGameHooks.playerJoinRoom = function (seat) { /* ... */ }; + +// [A] playerLeaveRoom(seat):其他玩家离开房间通知。 +// SubGameHooks.playerLeaveRoom = function (seat) { /* ... */ }; + +// [A] updateScene():更新游戏界面(分辨率变化等)。 +// SubGameHooks.updateScene = function () { /* ... */ }; + +// [A] closeGameScene():关闭游戏界面。 +// SubGameHooks.closeGameScene = function () { /* ... */ }; + +// [A] playerOffline(seat):玩家掉线通知。 +// SubGameHooks.playerOffline = function (seat) { /* ... */ }; + +// [A] playerOnline(seat):玩家上线通知。 +// SubGameHooks.playerOnline = function (seat) { /* ... */ }; + +// [A] playerphonestate(seat, type):玩家电话状态变化通知。 +// SubGameHooks.playerphonestate = function (seat, type) { /* ... */ }; + +// [A] shakeEvent():设备摇一摇事件。 +// SubGameHooks.shakeEvent = function () { /* ... */ }; + +// [A] calResult(inputArr):计算结算结果。 +// SubGameHooks.calResult = function (inputArr) { /* ... */ }; + +// [A] onEnterMainScene(roomtype):进入游戏主场景。 +// SubGameHooks.onEnterMainScene = function (roomtype) { /* ... */ }; + +// [A] onExitMainScene():退出游戏主场景。 +// SubGameHooks.onExitMainScene = function () { /* ... */ }; + +// [A] onGameConfig(_gameConfig):获取游戏配置时触发。 +// SubGameHooks.onGameConfig = function (_gameConfig) { /* ... */ }; + +// [A] onEnterVideo():进入牌局回放模式。 +// SubGameHooks.onEnterVideo = function () { /* ... */ }; + +// [A] onSurrender(_msg):收到投降回包。 +// SubGameHooks.onSurrender = function (_msg) { /* ... */ }; + +// [A] onReady(seat):玩家准备触发。 +// SubGameHooks.onReady = function (seat) { /* ... */ }; + +// [B] getRoomInfo(roomtype, type, tea):获取房间描述文案;无 hook 时默认:"房间描述" + roomtype。 +// SubGameHooks.getRoomInfo = function (roomtype, type, tea) { /* ... */ }; + +// [B] getStarLimit(roomtype):获取星星场下限分数;无 hook 时默认:return 2001000。 +// SubGameHooks.getStarLimit = function (roomtype) { /* ... */ }; + +// [B] getMult(roomtype, type):获取星星场倍数;无 hook 时默认:return 10000。 +// SubGameHooks.getMult = function (roomtype, type) { /* ... */ }; + +// [B] getFullRoomInfo(roomtype):获取房间完整信息描述;无 hook 时默认:"房间描述" + roomtype。 +// SubGameHooks.getFullRoomInfo = function (roomtype) { /* ... */ }; + +// [A] onOpenHelp(spid):打开帮助页面。 +// SubGameHooks.onOpenHelp = function (spid) { /* ... */ }; + +// [A] onMainMenuScene():显示大厅主菜单界面。 +// SubGameHooks.onMainMenuScene = function () { /* ... */ }; + +// [A] onCheckInput(_result):数字输入框确认回调。 +// SubGameHooks.onCheckInput = function (_result) { /* ... */ }; + +// [A] onCreateRoom(_data):创建房间成功后触发。 +// SubGameHooks.onCreateRoom = function (_data) { /* ... */ }; + +// [B] getLeaveLimit(roomtype):获取离场限制局数;无 hook 时默认:return 10。 +// SubGameHooks.getLeaveLimit = function (roomtype) { /* ... */ }; + +// [A] onLocationInfo(_locationInfo):成功获取定位信息回调。 +// SubGameHooks.onLocationInfo = function (_locationInfo) { /* ... */ }; + +// [A] onCreateDesk(roomtype):进入游戏界面创建牌桌之前触发。 +// SubGameHooks.onCreateDesk = function (roomtype) { /* ... */ }; + +// [B] getVideoByRoomType(roomtype):获取该房型是否开启视频功能;无 hook 时默认:return 1。 +// SubGameHooks.getVideoByRoomType = function (roomtype) { /* ... */ }; + +// [B] getRoomTopDescAry(roomtype):获取房间顶部描述文案数组;无 hook 时默认:["" + roomtype]。 +// SubGameHooks.getRoomTopDescAry = function (roomtype) { /* ... */ }; + +// [A] getShareRoom(_msg):星星场房间列表数据。 +// SubGameHooks.getShareRoom = function (_msg) { /* ... */ }; + +// [A] myExitRoom(seat):玩家自己退出房间。 +// SubGameHooks.myExitRoom = function (seat) { /* ... */ }; + +// [A] changeSeat(seat1, seat2):接收到换座包触发。 +// SubGameHooks.changeSeat = function (seat1, seat2) { /* ... */ }; + +// [A] onCloseVip():关闭 VIP 选项时调用。 +// SubGameHooks.onCloseVip = function () { /* ... */ }; + +// [B] getRoomMode(roomtype):判断房间模式(0=非金币场);无 hook 时默认:return 0。 +// SubGameHooks.getRoomMode = function (roomtype) { /* ... */ }; + +// [B] getMaxPlayerCount(roomtype):获取房间最大玩家数量;无 hook 时默认:return Game_Config.Max.PlayerCnt || 4。 +// SubGameHooks.getMaxPlayerCount = function (roomtype) { /* ... */ }; + +// [B] updatePlayerInfoUI(targetSeat):更新玩家信息 UI;无 hook 时默认:return false(让平台默认处理)。 +// SubGameHooks.updatePlayerInfoUI = function (targetSeat) { /* ... */ }; + +window.SubGameHooks = SubGameHooks; +if (typeof module !== 'undefined' && module.exports) { module.exports = SubGameHooks; } diff --git a/client/js/gameabc-framework/ui/AlignmentUtils.js b/client/js/gameabc-framework/ui/AlignmentUtils.js new file mode 100644 index 0000000..14bf0f7 --- /dev/null +++ b/client/js/gameabc-framework/ui/AlignmentUtils.js @@ -0,0 +1,849 @@ +/** + * AlignmentUtils - 精灵对齐工具类 + * 文件: client/js/01_SubGame/codes/game/utils/AlignmentUtils.js + * + * 🎯 设计目的: + * 提供统一的精灵对齐计算方法,简化UI布局代码 + * + * 🔑 核心原则: + * 1. 精灵锚点永远在左上角,无法更改 + * 2. 所有对齐计算都基于锚点位置 + * 3. 支持常见的9种对齐方式(左上/中上/右上/左中/中中/右中/左下/中下/右下) + * 4. 支持偏移量微调 + * + * 📐 坐标系统: + * - X轴:从左到右递增 + * - Y轴:从上到下递增 + * - 精灵锚点:左上角 (0, 0) + * + * @author JinXian Team + * @version 1.0.0 + * @since 2025-12-30 + */ + +'use strict'; + +var AlignmentUtils = { + VERSION: '1.0.0', + + /** + * 对齐常量 + */ + ALIGN: { + // 水平对齐 + LEFT: 'left', // 左对齐 + CENTER: 'center', // 水平居中 + RIGHT: 'right', // 右对齐 + + // 垂直对齐 + TOP: 'top', // 顶部对齐 + MIDDLE: 'middle', // 垂直居中 + BOTTOM: 'bottom' // 底部对齐 + }, + + /** + * 将精灵对齐到目标矩形区域 + * + * 🔑 核心:精灵的锚点永远在左上角,此方法计算锚点应放置的位置 + * + * @param {Object} target - 目标矩形区域 + * @param {number} target.x - 目标区域左上角X坐标 + * @param {number} target.y - 目标区域左上角Y坐标 + * @param {number} target.width - 目标区域宽度 + * @param {number} target.height - 目标区域高度 + * + * @param {Object} sprite - 精灵信息(精灵锚点固定在左上角) + * @param {number} sprite.width - 精灵宽度 + * @param {number} sprite.height - 精灵高度 + * + * @param {string} horizontalAlign - 水平对齐方式: 'left'|'center'|'right' + * @param {string} verticalAlign - 垂直对齐方式: 'top'|'middle'|'bottom' + * + * @param {Object} [offset] - 偏移量(可选) + * @param {number} [offset.x=0] - X轴偏移 + * @param {number} [offset.y=0] - Y轴偏移 + * + * @returns {Object} 精灵锚点位置(左上角) {x, y} + * + * @example + * // 将文本标签对齐到矩形框左下角 + * var labelPos = AlignmentUtils.alignTo( + * { x: 10, y: 10, width: 60, height: 60 }, // 矩形框区域 + * { width: 40, height: 20 }, // 标签大小 + * 'left', // 左对齐 + * 'bottom', // 底部对齐 + * { x: 0, y: 5 } // 向下偏移5px + * ); + * // 返回: { x: 10, y: 75 } (矩形底部 + 偏移,注意精灵锚点在左上角) + * + * @example + * // 将图标对齐到矩形框右下角 + * var iconPos = AlignmentUtils.alignTo( + * { x: 10, y: 10, width: 60, height: 60 }, // 矩形框区域 + * { width: 30, height: 30 }, // 图标大小 + * 'right', // 右对齐 + * 'bottom', // 底部对齐 + * { x: -5, y: 5 } // 向左偏移5px,向下偏移5px + * ); + * // 返回: { x: 35, y: 75 } (矩形右边界 - 图标宽度 - 5px,精灵锚点在左上角) + */ + alignTo: function(target, sprite, horizontalAlign, verticalAlign, offset) { + offset = offset || {}; + var offsetX = offset.x || 0; + var offsetY = offset.y || 0; + + var x, y; + + // 计算水平位置 + switch (horizontalAlign) { + case this.ALIGN.LEFT: + // 左对齐:精灵左边缘与目标左边缘对齐 + x = target.x; + break; + case this.ALIGN.CENTER: + // 水平居中:精灵中心与目标中心对齐 + // 🔑 精灵的锚点永远在左上角,所以需要减去精灵宽度的一半 + x = target.x + (target.width - sprite.width) / 2; + break; + case this.ALIGN.RIGHT: + // 右对齐:精灵右边缘与目标右边缘对齐 + // 🔑 精灵的锚点永远在左上角,所以需要减去精灵宽度 + x = target.x + target.width - sprite.width; + break; + default: + console.warn('[AlignmentUtils] 未知的水平对齐方式:', horizontalAlign); + x = target.x; + } + + // 计算垂直位置 + switch (verticalAlign) { + case this.ALIGN.TOP: + // 顶部对齐:精灵顶边与目标顶边对齐 + y = target.y; + break; + case this.ALIGN.MIDDLE: + // 垂直居中:精灵中心与目标中心对齐 + // 🔑 精灵的锚点永远在左上角,所以需要减去精灵高度的一半 + y = target.y + (target.height - sprite.height) / 2; + break; + case this.ALIGN.BOTTOM: + // 底部对齐:精灵底边与目标底边对齐 + // 🔑 精灵的锚点永远在左上角,所以需要加上目标高度 + y = target.y + target.height; + break; + default: + console.warn('[AlignmentUtils] 未知的垂直对齐方式:', verticalAlign); + y = target.y; + } + + // 应用偏移 + return { + x: x + offsetX, + y: y + offsetY + }; + }, + + /** + * 将精灵对齐到目标矩形的左下角(快捷方法) + * + * 🔑 注意:精灵的锚点永远在左上角 + * + * @param {Object} target - 目标矩形区域 + * @param {number} target.x - 目标区域左上角X坐标 + * @param {number} target.y - 目标区域左上角Y坐标 + * @param {number} target.width - 目标区域宽度 + * @param {number} target.height - 目标区域高度 + * + * @param {Object} sprite - 精灵大小(锚点固定在左上角) + * @param {number} sprite.width - 精灵宽度 + * @param {number} sprite.height - 精灵高度 + * + * @param {Object} [offset] - 偏移量 + * @param {number} [offset.x=0] - X偏移 + * @param {number} [offset.y=0] - Y偏移 + * + * @returns {Object} 精灵锚点位置(左上角) {x, y} + * + * @example + * // 将文本标签对齐到容器左下角 + * var pos = AlignmentUtils.alignBottomLeft( + * { x: 10, y: 10, width: 60, height: 60 }, // 容器区域 + * { width: 40, height: 20 }, // 标签大小 + * { x: 0, y: 5 } // 向下偏移5px + * ); + */ + alignBottomLeft: function(target, sprite, offset) { + return this.alignTo(target, sprite, this.ALIGN.LEFT, this.ALIGN.BOTTOM, offset); + }, + + /** + * 将精灵对齐到目标矩形的右下角(快捷方法) + * + * 🔑 注意:精灵的锚点永远在左上角,右对齐时会自动减去精灵宽度 + * + * @param {Object} target - 目标矩形区域 + * @param {Object} sprite - 精灵大小(锚点固定在左上角) + * @param {Object} [offset] - 偏移量 + * @returns {Object} 精灵锚点位置(左上角) {x, y} + * + * @example + * // 将图标对齐到容器右下角 + * var pos = AlignmentUtils.alignBottomRight( + * { x: 10, y: 10, width: 60, height: 60 }, // 容器区域 + * { width: 30, height: 30 }, // 图标大小 + * { x: -5, y: 5 } // 向左偏移5px,向下偏移5px + * ); + */ + alignBottomRight: function(target, sprite, offset) { + return this.alignTo(target, sprite, this.ALIGN.RIGHT, this.ALIGN.BOTTOM, offset); + }, + + /** + * 将精灵对齐到目标矩形的顶部居中(快捷方法) + * + * 🔑 注意:精灵的锚点永远在左上角,居中时会自动减去精灵宽度的一半 + * + * @param {Object} target - 目标矩形区域 + * @param {Object} sprite - 精灵大小(锚点固定在左上角) + * @param {Object} [offset] - 偏移量 + * @returns {Object} 精灵锚点位置(左上角) {x, y} + */ + alignTopCenter: function(target, sprite, offset) { + return this.alignTo(target, sprite, this.ALIGN.CENTER, this.ALIGN.TOP, offset); + }, + + /** + * 将精灵对齐到目标矩形的底部居中(快捷方法) + * + * 🔑 注意:精灵的锚点永远在左上角,居中时会自动减去精灵宽度的一半 + * + * @param {Object} target - 目标矩形区域 + * @param {Object} sprite - 精灵大小(锚点固定在左上角) + * @param {Object} [offset] - 偏移量 + * @returns {Object} 精灵锚点位置(左上角) {x, y} + */ + alignBottomCenter: function(target, sprite, offset) { + return this.alignTo(target, sprite, this.ALIGN.CENTER, this.ALIGN.BOTTOM, offset); + }, + + /** + * 将精灵对齐到目标矩形的中心(快捷方法) + * + * 🔑 注意:精灵的锚点永远在左上角,居中时会自动减去精灵宽度和高度的一半 + * + * @param {Object} target - 目标矩形区域 + * @param {Object} sprite - 精灵大小(锚点固定在左上角) + * @param {Object} [offset] - 偏移量 + * @returns {Object} 精灵锚点位置(左上角) {x, y} + */ + alignCenter: function(target, sprite, offset) { + return this.alignTo(target, sprite, this.ALIGN.CENTER, this.ALIGN.MIDDLE, offset); + }, + + // ============================================================================ + // 角落对齐方法 - 精灵的角与目标的角重合 + // ============================================================================ + + /** + * 将精灵的左上角对齐到目标的左上角 + * + * 🔑 注意:精灵的锚点永远在左上角 + * 💡 角落对齐:精灵的角与目标的角重合(不是边缘对齐) + * + * @param {Object} target - 目标矩形区域 + * @param {Object} sprite - 精灵大小(锚点固定在左上角) + * @param {Object} [offset] - 偏移量 + * @returns {Object} 精灵锚点位置(左上角) {x, y} + * + * @example + * // 将子元素的左上角与容器的左上角重合 + * var pos = AlignmentUtils.alignCornerTopLeft( + * { x: 10, y: 10, width: 100, height: 100 }, + * { width: 30, height: 30 } + * ); + * // 返回: { x: 10, y: 10 } + */ + alignCornerTopLeft: function(target, sprite, offset) { + offset = offset || {}; + return { + x: target.x + (offset.x || 0), + y: target.y + (offset.y || 0) + }; + }, + + /** + * 将精灵的右上角对齐到目标的右上角 + * + * 🔑 注意:精灵的锚点永远在左上角,需要减去精灵宽度 + * 💡 角落对齐:精灵的角与目标的角重合 + * + * @param {Object} target - 目标矩形区域 + * @param {Object} sprite - 精灵大小(锚点固定在左上角) + * @param {Object} [offset] - 偏移量 + * @returns {Object} 精灵锚点位置(左上角) {x, y} + * + * @example + * var pos = AlignmentUtils.alignCornerTopRight( + * { x: 10, y: 10, width: 100, height: 100 }, + * { width: 30, height: 30 } + * ); + * // 返回: { x: 80, y: 10 } (10 + 100 - 30) + */ + alignCornerTopRight: function(target, sprite, offset) { + offset = offset || {}; + return { + x: target.x + target.width - sprite.width + (offset.x || 0), + y: target.y + (offset.y || 0) + }; + }, + + /** + * 将精灵的左下角对齐到目标的左下角 + * + * 🔑 注意:精灵的锚点永远在左上角,需要减去精灵高度 + * 💡 角落对齐:精灵的角与目标的角重合 + * + * @param {Object} target - 目标矩形区域 + * @param {Object} sprite - 精灵大小(锚点固定在左上角) + * @param {Object} [offset] - 偏移量 + * @returns {Object} 精灵锚点位置(左上角) {x, y} + * + * @example + * var pos = AlignmentUtils.alignCornerBottomLeft( + * { x: 10, y: 10, width: 100, height: 100 }, + * { width: 30, height: 30 } + * ); + * // 返回: { x: 10, y: 80 } (10 + 100 - 30) + */ + alignCornerBottomLeft: function(target, sprite, offset) { + offset = offset || {}; + return { + x: target.x + (offset.x || 0), + y: target.y + target.height - sprite.height + (offset.y || 0) + }; + }, + + /** + * 将精灵的右下角对齐到目标的右下角 + * + * 🔑 注意:精灵的锚点永远在左上角,需要减去精灵宽度和高度 + * 💡 角落对齐:精灵的角与目标的角重合 + * + * @param {Object} target - 目标矩形区域 + * @param {Object} sprite - 精灵大小(锚点固定在左上角) + * @param {Object} [offset] - 偏移量 + * @returns {Object} 精灵锚点位置(左上角) {x, y} + * + * @example + * var pos = AlignmentUtils.alignCornerBottomRight( + * { x: 10, y: 10, width: 100, height: 100 }, + * { width: 30, height: 30 } + * ); + * // 返回: { x: 80, y: 80 } + */ + alignCornerBottomRight: function(target, sprite, offset) { + offset = offset || {}; + return { + x: target.x + target.width - sprite.width + (offset.x || 0), + y: target.y + target.height - sprite.height + (offset.y || 0) + }; + }, + + /** + * 计算多个精灵水平居中的起始X坐标 + * + * @param {number} containerWidth - 容器宽度 + * @param {number} totalItemsWidth - 所有项目的总宽度(包括间距) + * @returns {number} 起始X坐标 + * + * @example + * // 3张牌,每张42px,间距5px,容器宽度600px + * var startX = AlignmentUtils.centerMultipleItems(600, 42 * 3 + 5 * 2); + * // 返回: 258 ((600 - 136) / 2) + */ + centerMultipleItems: function(containerWidth, totalItemsWidth) { + return (containerWidth - totalItemsWidth) / 2; + }, + + /** + * 计算矩形区域的中心点 + * + * @param {Object} rect - 矩形区域 + * @param {number} rect.x - 左上角X + * @param {number} rect.y - 左上角Y + * @param {number} rect.width - 宽度 + * @param {number} rect.height - 高度 + * @returns {Object} 中心点 {x, y} + */ + getCenter: function(rect) { + return { + x: rect.x + rect.width / 2, + y: rect.y + rect.height / 2 + }; + }, + + // ============================================================================ + // 精灵ID版本 - 自动获取精灵尺寸 + // ============================================================================ + + /** + * 将精灵对齐到目标精灵(使用精灵ID,自动获取尺寸) + * + * 🔑 核心:精灵的锚点永远在左上角,此方法计算锚点应放置的位置 + * 💡 优点:无需手动获取精灵尺寸,代码更简洁 + * + * @param {number} targetSpriteId - 目标精灵ID(会自动获取位置和大小) + * @param {number} spriteId - 要对齐的精灵ID(会自动获取大小) + * @param {string} horizontalAlign - 水平对齐方式: 'left'|'center'|'right' + * @param {string} verticalAlign - 垂直对齐方式: 'top'|'middle'|'bottom' + * @param {Object} [offset] - 偏移量(可选) + * @param {number} [offset.x=0] - X轴偏移 + * @param {number} [offset.y=0] - Y轴偏移 + * + * @returns {Object|null} 精灵锚点位置(左上角) {x, y},失败返回null + * + * @example + * // 将座位标签(精灵5678)对齐到头像(精灵1234)左下角 + * var pos = AlignmentUtils.alignSpriteToSprite( + * 1234, // 目标精灵ID(头像) + * 5678, // 要对齐的精灵ID(座位标签) + * 'left', // 左对齐 + * 'bottom', // 底部对齐 + * { x: 0, y: 5 } // 向下偏移5px + * ); + * if (pos) { + * SpriteManager.setPosition(5678, pos.x, pos.y); + * } + */ + alignSpriteToSprite: function(targetSpriteId, spriteId, horizontalAlign, verticalAlign, offset) { + if (typeof SpriteManager === 'undefined') { + console.error('[AlignmentUtils] SpriteManager 未加载,无法使用 alignSpriteToSprite'); + return null; + } + + // 获取目标精灵的位置和大小 + var targetPos = SpriteManager.getPosition(targetSpriteId); + var targetSize = SpriteManager.getSize(targetSpriteId); + if (!targetPos || !targetSize) { + console.error('[AlignmentUtils] 无法获取目标精灵 ' + targetSpriteId + ' 的位置或大小'); + return null; + } + + // 获取要对齐的精灵的大小 + var spriteSize = SpriteManager.getSize(spriteId); + if (!spriteSize) { + console.error('[AlignmentUtils] 无法获取精灵 ' + spriteId + ' 的大小'); + return null; + } + + // 构建目标矩形 + var target = { + x: targetPos.x, + y: targetPos.y, + width: targetSize.width, + height: targetSize.height + }; + + // 调用核心对齐方法 + return this.alignTo(target, spriteSize, horizontalAlign, verticalAlign, offset); + }, + + /** + * 将精灵对齐到目标精灵的左下角(快捷方法) + * + * 🔑 注意:精灵的锚点永远在左上角 + * 💡 自动获取精灵尺寸,无需手动传入 + * + * @param {number} targetSpriteId - 目标精灵ID + * @param {number} spriteId - 要对齐的精灵ID + * @param {Object} [offset] - 偏移量 + * @returns {Object|null} 精灵锚点位置(左上角) {x, y} + * + * @example + * var pos = AlignmentUtils.alignSpriteBottomLeft(1234, 5678, { x: 0, y: 5 }); + * if (pos) SpriteManager.setPosition(5678, pos.x, pos.y); + */ + alignSpriteBottomLeft: function(targetSpriteId, spriteId, offset) { + return this.alignSpriteToSprite(targetSpriteId, spriteId, this.ALIGN.LEFT, this.ALIGN.BOTTOM, offset); + }, + + /** + * 将精灵对齐到目标精灵的右下角(快捷方法) + * + * 🔑 注意:精灵的锚点永远在左上角,右对齐时会自动减去精灵宽度 + * 💡 自动获取精灵尺寸,无需手动传入 + * + * @param {number} targetSpriteId - 目标精灵ID + * @param {number} spriteId - 要对齐的精灵ID + * @param {Object} [offset] - 偏移量 + * @returns {Object|null} 精灵锚点位置(左上角) {x, y} + * + * @example + * var pos = AlignmentUtils.alignSpriteBottomRight(1234, 5678, { x: -5, y: 5 }); + * if (pos) SpriteManager.setPosition(5678, pos.x, pos.y); + */ + alignSpriteBottomRight: function(targetSpriteId, spriteId, offset) { + return this.alignSpriteToSprite(targetSpriteId, spriteId, this.ALIGN.RIGHT, this.ALIGN.BOTTOM, offset); + }, + + /** + * 将精灵对齐到目标精灵的顶部居中(快捷方法) + * + * 🔑 注意:精灵的锚点永远在左上角,居中时会自动减去精灵宽度的一半 + * 💡 自动获取精灵尺寸,无需手动传入 + * + * @param {number} targetSpriteId - 目标精灵ID + * @param {number} spriteId - 要对齐的精灵ID + * @param {Object} [offset] - 偏移量 + * @returns {Object|null} 精灵锚点位置(左上角) {x, y} + */ + alignSpriteTopCenter: function(targetSpriteId, spriteId, offset) { + return this.alignSpriteToSprite(targetSpriteId, spriteId, this.ALIGN.CENTER, this.ALIGN.TOP, offset); + }, + + /** + * 将精灵对齐到目标精灵的底部居中(快捷方法) + * + * 🔑 注意:精灵的锚点永远在左上角,居中时会自动减去精灵宽度的一半 + * 💡 自动获取精灵尺寸,无需手动传入 + * + * @param {number} targetSpriteId - 目标精灵ID + * @param {number} spriteId - 要对齐的精灵ID + * @param {Object} [offset] - 偏移量 + * @returns {Object|null} 精灵锚点位置(左上角) {x, y} + */ + alignSpriteBottomCenter: function(targetSpriteId, spriteId, offset) { + return this.alignSpriteToSprite(targetSpriteId, spriteId, this.ALIGN.CENTER, this.ALIGN.BOTTOM, offset); + }, + + /** + * 将精灵对齐到目标精灵的中心(快捷方法) + * + * 🔑 注意:精灵的锚点永远在左上角,居中时会自动减去精灵宽度和高度的一半 + * 💡 自动获取精灵尺寸,无需手动传入 + * + * @param {number} targetSpriteId - 目标精灵ID + * @param {number} spriteId - 要对齐的精灵ID + * @param {Object} [offset] - 偏移量 + * @returns {Object|null} 精灵锚点位置(左上角) {x, y} + */ + alignSpriteCenter: function(targetSpriteId, spriteId, offset) { + return this.alignSpriteToSprite(targetSpriteId, spriteId, this.ALIGN.CENTER, this.ALIGN.MIDDLE, offset); + }, + + // ============================================================================ + // 精灵ID版本 - 角落对齐 + // ============================================================================ + + /** + * 将精灵的左上角对齐到目标精灵的左上角 + * + * 🔑 注意:精灵的锚点永远在左上角 + * 💡 角落对齐:精灵的角与目标的角重合 + * + * @param {number} targetSpriteId - 目标精灵ID + * @param {number} spriteId - 要对齐的精灵ID + * @param {Object} [offset] - 偏移量 + * @returns {Object|null} 精灵锚点位置(左上角) {x, y} + */ + alignSpriteCornerTopLeft: function(targetSpriteId, spriteId, offset) { + if (typeof SpriteManager === 'undefined') { + console.error('[AlignmentUtils] SpriteManager 未加载'); + return null; + } + + var targetPos = SpriteManager.getPosition(targetSpriteId); + var spriteSize = SpriteManager.getSize(spriteId); + if (!targetPos || !spriteSize) { + console.error('[AlignmentUtils] 无法获取精灵位置或大小'); + return null; + } + + offset = offset || {}; + return { + x: targetPos.x + (offset.x || 0), + y: targetPos.y + (offset.y || 0) + }; + }, + + /** + * 将精灵的右上角对齐到目标精灵的右上角 + * + * 🔑 注意:精灵的锚点永远在左上角,需要减去精灵宽度 + * 💡 角落对齐:精灵的角与目标的角重合 + * + * @param {number} targetSpriteId - 目标精灵ID + * @param {number} spriteId - 要对齐的精灵ID + * @param {Object} [offset] - 偏移量 + * @returns {Object|null} 精灵锚点位置(左上角) {x, y} + */ + alignSpriteCornerTopRight: function(targetSpriteId, spriteId, offset) { + if (typeof SpriteManager === 'undefined') { + console.error('[AlignmentUtils] SpriteManager 未加载'); + return null; + } + + var targetPos = SpriteManager.getPosition(targetSpriteId); + var targetSize = SpriteManager.getSize(targetSpriteId); + var spriteSize = SpriteManager.getSize(spriteId); + if (!targetPos || !targetSize || !spriteSize) { + console.error('[AlignmentUtils] 无法获取精灵位置或大小'); + return null; + } + + offset = offset || {}; + return { + x: targetPos.x + targetSize.width - spriteSize.width + (offset.x || 0), + y: targetPos.y + (offset.y || 0) + }; + }, + + /** + * 将精灵的左下角对齐到目标精灵的左下角 + * + * 🔑 注意:精灵的锚点永远在左上角,需要减去精灵高度 + * 💡 角落对齐:精灵的角与目标的角重合 + * + * @param {number} targetSpriteId - 目标精灵ID + * @param {number} spriteId - 要对齐的精灵ID + * @param {Object} [offset] - 偏移量 + * @returns {Object|null} 精灵锚点位置(左上角) {x, y} + */ + alignSpriteCornerBottomLeft: function(targetSpriteId, spriteId, offset) { + if (typeof SpriteManager === 'undefined') { + console.error('[AlignmentUtils] SpriteManager 未加载'); + return null; + } + + var targetPos = SpriteManager.getPosition(targetSpriteId); + var targetSize = SpriteManager.getSize(targetSpriteId); + var spriteSize = SpriteManager.getSize(spriteId); + if (!targetPos || !targetSize || !spriteSize) { + console.error('[AlignmentUtils] 无法获取精灵位置或大小'); + return null; + } + + offset = offset || {}; + return { + x: targetPos.x + (offset.x || 0), + y: targetPos.y + targetSize.height - spriteSize.height + (offset.y || 0) + }; + }, + + /** + * 将精灵的右下角对齐到目标精灵的右下角 + * + * 🔑 注意:精灵的锚点永远在左上角,需要减去精灵宽度和高度 + * 💡 角落对齐:精灵的角与目标的角重合 + * + * @param {number} targetSpriteId - 目标精灵ID + * @param {number} spriteId - 要对齐的精灵ID + * @param {Object} [offset] - 偏移量 + * @returns {Object|null} 精灵锚点位置(左上角) {x, y} + */ + alignSpriteCornerBottomRight: function(targetSpriteId, spriteId, offset) { + if (typeof SpriteManager === 'undefined') { + console.error('[AlignmentUtils] SpriteManager 未加载'); + return null; + } + + var targetPos = SpriteManager.getPosition(targetSpriteId); + var targetSize = SpriteManager.getSize(targetSpriteId); + var spriteSize = SpriteManager.getSize(spriteId); + if (!targetPos || !targetSize || !spriteSize) { + console.error('[AlignmentUtils] 无法获取精灵位置或大小'); + return null; + } + + offset = offset || {}; + return { + x: targetPos.x + targetSize.width - spriteSize.width + (offset.x || 0), + y: targetPos.y + targetSize.height - spriteSize.height + (offset.y || 0) + }; + }, + + // ============================================================================ + // 批量精灵分布对齐 + // ============================================================================ + + /** + * 计算多个精灵水平分布的位置 + * + * 🔑 核心:精灵的锚点永远在左上角 + * 💡 用途:将多个相同大小的精灵水平排列,支持居中/左对齐/右对齐 + * + * @param {Object} options - 分布选项 + * @param {number} options.anchorX - 锚点X坐标(对齐基准点) + * @param {number} options.anchorY - 锚点Y坐标(所有精灵的Y坐标) + * @param {number} options.count - 精灵数量 + * @param {number} options.itemWidth - 每个精灵的宽度 + * @param {number} options.itemHeight - 每个精灵的高度 + * @param {number} [options.spacing=0] - 精灵之间的间距 + * @param {string} [options.anchor='center'] - 对齐方式: 'left'|'center'|'right' + * + * @returns {Array} 每个精灵的位置数组 [{x, y}, ...] + * + * @example + * // 3张牌水平居中排列 + * var positions = AlignmentUtils.distributeHorizontally({ + * anchorX: 640, // 屏幕中心X + * anchorY: 500, // Y位置 + * count: 3, // 3张牌 + * itemWidth: 62, // 牌宽 + * itemHeight: 86, // 牌高 + * spacing: 0, // 无间距 + * anchor: 'center' // 居中对齐 + * }); + * // 返回: [{x: 547, y: 500}, {x: 609, y: 500}, {x: 671, y: 500}] + */ + distributeHorizontally: function(options) { + var anchorX = options.anchorX || 0; + var anchorY = options.anchorY || 0; + var count = options.count || 0; + var itemWidth = options.itemWidth || 0; + var itemHeight = options.itemHeight || 0; + var spacing = options.spacing || 0; + var anchor = options.anchor || 'center'; + + if (count <= 0) return []; + + // 计算总宽度 + var totalWidth = count * itemWidth + (count - 1) * spacing; + + // 计算起始X位置(精灵锚点在左上角) + var startX; + switch (anchor) { + case 'left': + // 左对齐:第一个精灵的左边缘与锚点对齐 + startX = anchorX; + break; + case 'right': + // 右对齐:最后一个精灵的右边缘与锚点对齐 + startX = anchorX - totalWidth; + break; + case 'center': + default: + // 居中:精灵组的中心与锚点对齐 + startX = anchorX - totalWidth / 2; + break; + } + + // 生成每个精灵的位置 + var positions = []; + for (var i = 0; i < count; i++) { + positions.push({ + x: startX + i * (itemWidth + spacing), + y: anchorY + }); + } + + return positions; + }, + + /** + * 计算多个精灵垂直分布的位置 + * + * 🔑 核心:精灵的锚点永远在左上角 + * 💡 用途:将多个相同大小的精灵垂直排列,支持居中/顶部对齐/底部对齐 + * + * @param {Object} options - 分布选项 + * @param {number} options.anchorX - 锚点X坐标(所有精灵的X坐标) + * @param {number} options.anchorY - 锚点Y坐标(对齐基准点) + * @param {number} options.count - 精灵数量 + * @param {number} options.itemWidth - 每个精灵的宽度 + * @param {number} options.itemHeight - 每个精灵的高度 + * @param {number} [options.spacing=0] - 精灵之间的间距 + * @param {string} [options.anchor='center'] - 对齐方式: 'top'|'center'|'bottom' + * + * @returns {Array} 每个精灵的位置数组 [{x, y}, ...] + * + * @example + * // 3张牌垂直居中排列 + * var positions = AlignmentUtils.distributeVertically({ + * anchorX: 100, // X位置 + * anchorY: 360, // 屏幕中心Y + * count: 3, // 3张牌 + * itemWidth: 62, // 牌宽 + * itemHeight: 86, // 牌高 + * spacing: 2, // 2px间距 + * anchor: 'center' // 居中对齐 + * }); + */ + distributeVertically: function(options) { + var anchorX = options.anchorX || 0; + var anchorY = options.anchorY || 0; + var count = options.count || 0; + var itemWidth = options.itemWidth || 0; + var itemHeight = options.itemHeight || 0; + var spacing = options.spacing || 0; + var anchor = options.anchor || 'center'; + + if (count <= 0) return []; + + // 计算总高度 + var totalHeight = count * itemHeight + (count - 1) * spacing; + + // 计算起始Y位置(精灵锚点在左上角) + var startY; + switch (anchor) { + case 'top': + // 顶部对齐:第一个精灵的顶边与锚点对齐 + startY = anchorY; + break; + case 'bottom': + // 底部对齐:最后一个精灵的底边与锚点对齐 + startY = anchorY - totalHeight; + break; + case 'center': + default: + // 居中:精灵组的中心与锚点对齐 + startY = anchorY - totalHeight / 2; + break; + } + + // 生成每个精灵的位置 + var positions = []; + for (var i = 0; i < count; i++) { + positions.push({ + x: anchorX, + y: startY + i * (itemHeight + spacing) + }); + } + + return positions; + }, + + /** + * 计算多个精灵分布的位置(自动选择水平或垂直) + * + * @param {Object} options - 分布选项 + * @param {string} [options.direction='horizontal'] - 分布方向: 'horizontal'|'vertical' + * @param {number} options.anchorX - 锚点X坐标 + * @param {number} options.anchorY - 锚点Y坐标 + * @param {number} options.count - 精灵数量 + * @param {number} options.itemWidth - 每个精灵的宽度 + * @param {number} options.itemHeight - 每个精灵的高度 + * @param {number} [options.spacing=0] - 精灵之间的间距 + * @param {string} [options.anchor='center'] - 对齐方式 + * + * @returns {Array} 每个精灵的位置数组 [{x, y}, ...] + */ + distribute: function(options) { + var direction = options.direction || 'horizontal'; + if (direction === 'vertical') { + return this.distributeVertically(options); + } else { + return this.distributeHorizontally(options); + } + } +}; + +// ============================================================================ +// 导出 +// ============================================================================ + +if (typeof module !== 'undefined' && module.exports) { + module.exports = AlignmentUtils; +} else if (typeof window !== 'undefined') { + window.AlignmentUtils = AlignmentUtils; +} diff --git a/client/js/gameabc-framework/ui/BaseComponent.js b/client/js/gameabc-framework/ui/BaseComponent.js new file mode 100644 index 0000000..b8fe9e0 --- /dev/null +++ b/client/js/gameabc-framework/ui/BaseComponent.js @@ -0,0 +1,640 @@ +/** + * BaseComponent - UI组件基类 + * + * 职责: + * 1. 提供统一的组件生命周期管理 (init/show/hide/destroy) + * 2. 自动管理EventBus事件监听的注册和注销 + * 3. 自动管理组件内精灵的创建和销毁 + * 4. 提供钩子方法供子类覆盖 + * + * 使用方式: + * ```javascript + * var MyComponent = Object.create(BaseComponent); + * + * MyComponent.init = function(config) { + * this.layer = config.layer; + * // 创建精灵 + * var spriteId = SpriteManager.createSprite({...}); + * this.addSprite(spriteId); + * // 注册事件 + * this.addEventListener('eventName', this.onEvent); + * }; + * + * var instance = BaseComponent.create({ name: 'MyComponent', layer: 101 }); + * instance.show(); + * ``` + * + * 依赖: + * - EventBus (必须先加载) + * - SpriteManager (必须先加载) + * + * ============================================================================ + * @guide 开发指南 - BaseComponent 两种继承模式 + * ============================================================================ + * + * 【模式一:Object.create(推荐用于复杂视图,多图层组件)】 + * + * var GameView = Object.create(BaseComponent); + * + * GameView.init = function(config) { + * // ⚠️ 必须手动重新声明所有实例属性(避免原型污染) + * this.sprites = []; + * this.eventListeners = {}; + * this.isVisible = false; + * this.isInitialized = false; + * this.isDestroyed = false; + * + * this.name = config.name || 'GameView'; + * this.layer = config.layer || 102; // BaseComponent.show() 需要此属性 + * this.baseLayers = [102, 103, 104, 105]; // 多图层组件:show/hide 会操作所有图层 + * + * // 注册 EventBus 监听(使用 this.addEventListener 自动管理清理) + * var self = this; + * this.addEventListener(EventBus.Events.GAME_STARTED, function(data) { + * self._onGameStarted(data); + * }); + * + * // 注册精灵交互事件(通过 SpriteEventController) + * SpriteEventController.registerMouseUp(sprites.CLOSE_BTN, function(event) { + * self.hide(); + * }); + * + * this.isInitialized = true; + * }; + * + * // 在 UIBootstrap 中创建并使用(注意:直接调用 init,不用 create) + * GameView.init({ name: 'GameView', layer: 102 }); + * + * 【模式二:BaseComponent.create(推荐用于简单单图层组件)】 + * + * // create 内部会调用 Object.create(BaseComponent) + 调用 init + * var myComp = BaseComponent.create({ name: 'MyComp', layer: 101 }); + * myComp.show(); + * + * 【何时用 Object.create vs BaseComponent.create】 + * - 需要多图层(baseLayers) → Object.create + * - 有大量自定义数据属性(this.data = {}) → Object.create + * - 需要自定义 show/hide 逻辑 → Object.create + * - 简单显隐控制,无额外逻辑 → BaseComponent.create + * + * 【生命周期钩子】 + * GameView.onShow = function() { ... }; // show() 时调用 + * GameView.onHide = function() { ... }; // hide() 时调用 + * GameView.onDestroy = function() { ... }; // destroy() 时调用(清理timer等) + * + * 【destroy 行为说明】 + * - 自动调用 EventBus.off 清理所有通过 addEventListener 注册的监听 + * - 精灵只隐藏(hide),不删除(gameabc 不支持运行时删除静态精灵) + * - 动态复制的精灵(SpriteCopyUtils)需在 onDestroy 中手动 remove + * + * 【模式三:IIFE 包裹 + 自定义 create 工厂(RoomView 模式)】 + * + * var RoomView = (function() { + * 'use strict'; + * var RoomView = Object.create(BaseComponent); + * + * RoomView.init = function(config) { + * // 同样需要手动重声明实例属性 + * this.sprites = []; + * this.eventListeners = {}; + * this.isVisible = false; + * this.isInitialized = false; + * this.isDestroyed = false; + * this.name = config.name; + * this.layer = config.layer; + * }; + * + * // 自定义工厂方法(代替 BaseComponent.create,用于多步配置前创建实例) + * RoomView.create = function(config) { + * var instance = Object.create(RoomView); + * config = config || {}; + * config.layer = ROOM_VIEW.LAYER; // 固定图层,外部无需传 + * // 显式调用 BaseComponent._init,内部会自动调用 instance.init(config) + * BaseComponent._init.call(instance, config); + * return instance; + * }; + * + * return RoomView; + * })(); + * + * // 使用:通过工厂创建实例 + * var roomView = RoomView.create({ name: 'RoomView' }); + * roomView.show(); + * + * 【super 方法调用(扩展父类方法时)】 + * + * RoomView.getState = function() { + * // 调用 BaseComponent.getState 获取基础状态,再添加子类特有字段 + * var state = BaseComponent.getState.call(this); + * state.hasRoomData = !!this.roomData; + * state.playerCount = this._getPlayerCount(); + * return state; + * }; + * + * 【show/hide 钩子(GameView 中使用的扩展钩子)】 + * + * // 除了 onShow/onHide/onDestroy,GameView 还使用了更细粒度的钩子: + * GameView.onBeforeShow = function() { ... }; // show() 执行群组操作之前 + * GameView.onAfterShow = function() { ... }; // show() 执行群组操作之后 + * GameView.onBeforeHide = function() { ... }; // hide() 执行群组操作之前 + * GameView.onAfterHide = function() { ... }; // hide() 执行群组操作之后 + * // 这些钩子在 show()/hide() 内部通过 if (this.onAfterShow) this.onAfterShow() 调用 + * + * @version 1.0.0 + * @date 2025-11-19 + */ + +var BaseComponent = (function() { + 'use strict'; + + // ==================== 组件基类定义 ==================== + + var BaseComponentProto = { + + /** + * 组件名称 + * @type {String} + */ + name: '', + + /** + * 组件所在图层 + * @type {Number} + */ + layer: 0, + + /** + * 组件拥有的精灵ID列表 + * @type {Array} + */ + sprites: null, + + /** + * 组件注册的事件监听器 + * 结构: { eventName: wrappedHandler } + * @type {Object} + */ + eventListeners: null, + + /** + * 组件是否可见 + * @type {Boolean} + */ + isVisible: false, + + /** + * 组件是否已初始化 + * @type {Boolean} + */ + isInitialized: false, + + /** + * 组件是否已销毁 + * @type {Boolean} + */ + isDestroyed: false, + + /** + * 组件配置 + * @type {Object} + */ + config: null, + + // ==================== 内部方法 ==================== + + /** + * 内部初始化方法 + * @param {Object} config - 配置对象 + * @param {String} config.name - 组件名称 + * @param {Number} config.layer - 图层ID + * @private + */ + _init: function(config) { + if (this.isInitialized) { + console.warn('⚠️ BaseComponent: 组件已初始化,跳过重复初始化:', this.name); + return; + } + + // 验证必需参数 + if (!config || typeof config !== 'object') { + console.error('❌ BaseComponent._init: config必须是对象'); + return; + } + + if (!config.name) { + console.error('❌ BaseComponent._init: 缺少name参数'); + return; + } + + if (typeof config.layer !== 'number') { + console.error('❌ BaseComponent._init: 缺少layer参数或类型错误'); + return; + } + + // 初始化属性 + this.name = config.name; + this.layer = config.layer; + this.config = config; + this.sprites = []; + this.eventListeners = {}; + this.isVisible = false; + this.isDestroyed = false; + this.isInitialized = true; + + console.log('🎨 BaseComponent: 初始化组件 "' + this.name + '" (图层: ' + this.layer + ')'); + + // 调用子类的init方法 + try { + this.init(config); + } catch (error) { + console.error('❌ BaseComponent: 组件初始化时发生异常:', error); + this.isInitialized = false; + } + }, + + /** + * 移除所有事件监听器 + * @private + */ + _removeAllEventListeners: function() { + for (var eventName in this.eventListeners) { + if (this.eventListeners.hasOwnProperty(eventName)) { + this.removeEventListener(eventName); + } + } + }, + + /** + * 隐藏所有精灵 + * 注意: 精灵由编辑器创建,组件销毁时只隐藏精灵,不删除精灵 + * @private + */ + _hideAllSprites: function() { + if (!this.sprites || this.sprites.length === 0) { + return; + } + + console.log('🙈 BaseComponent: 隐藏组件 "' + this.name + '" 的所有精灵 (数量: ' + this.sprites.length + ')'); + + for (var i = 0; i < this.sprites.length; i++) { + var spriteId = this.sprites[i]; + SpriteManager.hide(spriteId); + } + + this.sprites = []; + }, + + // ==================== 生命周期方法 ==================== + + /** + * 初始化方法 - 子类覆盖 + * 在此方法中创建精灵、注册事件监听 + * @param {Object} config - 配置对象 + */ + init: function(config) { + // 子类覆盖此方法 + console.log('📝 BaseComponent.init: 请在子类中覆盖此方法'); + }, + + /** + * 显示组件 + * @returns {Boolean} 是否成功 + */ + show: function() { + if (this.isDestroyed) { + console.error('❌ BaseComponent.show: 组件已销毁,无法显示:', this.name); + return false; + } + + if (!this.isInitialized) { + console.error('❌ BaseComponent.show: 组件未初始化,无法显示:', this.name); + return false; + } + + if (this.isVisible) { + console.log('ℹ️ BaseComponent.show: 组件已可见,跳过:', this.name); + return true; + } + + console.log('👁️ BaseComponent: 显示组件 "' + this.name + '" (图层: ' + this.layer + ')'); + + // 显示图层 + SpriteManager.showGroup(this.layer); + + this.isVisible = true; + + // 调用钩子方法 + try { + this.onShow(); + } catch (error) { + console.error('❌ BaseComponent.show: onShow钩子执行时发生异常:', error); + } + + return true; + }, + + /** + * 隐藏组件 + * @returns {Boolean} 是否成功 + */ + hide: function() { + if (this.isDestroyed) { + console.error('❌ BaseComponent.hide: 组件已销毁:', this.name); + return false; + } + + if (!this.isVisible) { + console.log('ℹ️ BaseComponent.hide: 组件已隐藏,跳过:', this.name); + return true; + } + + console.log('🙈 BaseComponent: 隐藏组件 "' + this.name + '" (图层: ' + this.layer + ')'); + + // 隐藏图层 + SpriteManager.hideGroup(this.layer); + + this.isVisible = false; + + // 调用钩子方法 + try { + this.onHide(); + } catch (error) { + console.error('❌ BaseComponent.hide: onHide钩子执行时发生异常:', error); + } + + return true; + }, + + /** + * 销毁组件 + * @returns {Boolean} 是否成功 + */ + destroy: function() { + if (this.isDestroyed) { + console.warn('⚠️ BaseComponent.destroy: 组件已销毁,跳过:', this.name); + return false; + } + + console.log('💥 BaseComponent: 销毁组件 "' + this.name + '"'); + + // 移除所有事件监听 + this._removeAllEventListeners(); + + // 隐藏所有精灵(精灵由编辑器创建,不删除) + this._hideAllSprites(); + + // 隐藏图层 + if (this.isVisible) { + SpriteManager.hideGroup(this.layer); + } + + // 调用钩子方法 + try { + this.onDestroy(); + } catch (error) { + console.error('❌ BaseComponent.destroy: onDestroy钩子执行时发生异常:', error); + } + + // 标记为已销毁 + this.isDestroyed = true; + this.isVisible = false; + this.isInitialized = false; + + return true; + }, + + // ==================== 事件监听管理 ==================== + + /** + * 添加事件监听器 + * @param {String} eventName - 事件名称 + * @param {Function} handler - 事件处理函数 + * @returns {Boolean} 是否成功 + */ + addEventListener: function(eventName, handler) { + if (!eventName || typeof eventName !== 'string') { + console.error('❌ BaseComponent.addEventListener: eventName必须是字符串'); + return false; + } + + if (typeof handler !== 'function') { + console.error('❌ BaseComponent.addEventListener: handler必须是函数'); + return false; + } + + if (this.eventListeners[eventName]) { + console.warn('⚠️ BaseComponent.addEventListener: 事件已注册,将覆盖:', eventName); + this.removeEventListener(eventName); + } + + // 包装处理函数,绑定this上下文 + var self = this; + var wrappedHandler = function(data) { + if (self.isDestroyed) { + console.warn('⚠️ BaseComponent: 组件已销毁,忽略事件:', eventName); + return; + } + try { + handler.call(self, data); + } catch (error) { + console.error('❌ BaseComponent: 事件处理函数执行异常:', eventName, error); + } + }; + + // 注册到EventBus + EventBus.on(eventName, wrappedHandler); + + // 记录监听器 + this.eventListeners[eventName] = wrappedHandler; + + console.log('📡 BaseComponent: 组件 "' + this.name + '" 注册事件:', eventName); + + return true; + }, + + /** + * 移除事件监听器 + * @param {String} eventName - 事件名称 + * @returns {Boolean} 是否成功 + */ + removeEventListener: function(eventName) { + if (!this.eventListeners[eventName]) { + console.warn('⚠️ BaseComponent.removeEventListener: 事件未注册:', eventName); + return false; + } + + var handler = this.eventListeners[eventName]; + EventBus.off(eventName, handler); + delete this.eventListeners[eventName]; + + console.log('📴 BaseComponent: 组件 "' + this.name + '" 移除事件:', eventName); + + return true; + }, + + /** + * 触发事件(发送到EventBus) + * @param {String} eventName - 事件名称 + * @param {*} data - 事件数据 + */ + emit: function(eventName, data) { + if (!eventName || typeof eventName !== 'string') { + console.error('❌ BaseComponent.emit: eventName必须是字符串'); + return; + } + + console.log('📤 BaseComponent: 组件 "' + this.name + '" 触发事件:', eventName); + EventBus.emit(eventName, data); + }, + + // ==================== 精灵管理 ==================== + + /** + * 添加精灵到组件管理列表 + * @param {Number} spriteId - 精灵ID + * @returns {Boolean} 是否成功 + */ + addSprite: function(spriteId) { + if (typeof spriteId !== 'number') { + console.error('❌ BaseComponent.addSprite: spriteId必须是数字'); + return false; + } + + if (!SpriteManager.exists(spriteId)) { + console.error('❌ BaseComponent.addSprite: 精灵不存在:', spriteId); + return false; + } + + if (this.sprites.indexOf(spriteId) !== -1) { + console.warn('⚠️ BaseComponent.addSprite: 精灵已在管理列表中:', spriteId); + return false; + } + + this.sprites.push(spriteId); + // console.log('➕ BaseComponent: 组件 "' + this.name + '" 添加精灵:', spriteId); + + return true; + }, + + /** + * 从组件管理列表移除精灵(不销毁) + * @param {Number} spriteId - 精灵ID + * @returns {Boolean} 是否成功 + */ + removeSprite: function(spriteId) { + var index = this.sprites.indexOf(spriteId); + if (index === -1) { + console.warn('⚠️ BaseComponent.removeSprite: 精灵不在管理列表中:', spriteId); + return false; + } + + this.sprites.splice(index, 1); + console.log('➖ BaseComponent: 组件 "' + this.name + '" 移除精灵:', spriteId); + + return true; + }, + + /** + * 获取组件管理的所有精灵ID + * @returns {Array} 精灵ID数组 + */ + getSprites: function() { + return this.sprites.slice(); // 返回副本 + }, + + /** + * 获取组件管理的精灵数量 + * @returns {Number} 精灵数量 + */ + getSpriteCount: function() { + return this.sprites.length; + }, + + // ==================== 钩子方法 ==================== + + /** + * 显示时的钩子方法 - 子类可覆盖 + */ + onShow: function() { + // 子类可以覆盖此方法 + }, + + /** + * 隐藏时的钩子方法 - 子类可覆盖 + */ + onHide: function() { + // 子类可以覆盖此方法 + }, + + /** + * 销毁时的钩子方法 - 子类可覆盖 + */ + onDestroy: function() { + // 子类可以覆盖此方法 + }, + + // ==================== 工具方法 ==================== + + /** + * 获取组件状态信息 + * @returns {Object} 状态对象 + */ + getState: function() { + return { + name: this.name, + layer: this.layer, + isVisible: this.isVisible, + isInitialized: this.isInitialized, + isDestroyed: this.isDestroyed, + spriteCount: this.sprites.length, + eventCount: Object.keys(this.eventListeners).length + }; + }, + + /** + * 打印组件状态(调试用) + */ + printState: function() { + var state = this.getState(); + console.log('📊 组件状态:', JSON.stringify(state, null, 2)); + } + }; + + // ==================== 工厂方法 ==================== + + /** + * 创建组件实例 + * @param {Object} config - 配置对象 + * @param {String} config.name - 组件名称 + * @param {Number} config.layer - 图层ID + * @returns {Object} 组件实例 + */ + BaseComponentProto.create = function(config) { + if (!config || typeof config !== 'object') { + console.error('❌ BaseComponent.create: config必须是对象'); + return null; + } + + // 创建实例 + var instance = Object.create(this); + + // 初始化实例 + instance._init(config); + + if (!instance.isInitialized) { + console.error('❌ BaseComponent.create: 组件初始化失败'); + return null; + } + + return instance; + }; + + // 返回基类原型 + return BaseComponentProto; + +})(); + +// 导出到全局(兼容ES5) +if (typeof module !== 'undefined' && module.exports) { + module.exports = BaseComponent; +} diff --git a/client/js/gameabc-framework/ui/DynamicSpriteList.js b/client/js/gameabc-framework/ui/DynamicSpriteList.js new file mode 100644 index 0000000..9bc3d2a --- /dev/null +++ b/client/js/gameabc-framework/ui/DynamicSpriteList.js @@ -0,0 +1,830 @@ +/** + * ============================================================================ + * DynamicSpriteList.js - 动态精灵列表工具 + * ============================================================================ + * + * 基于 gameabc 框架的精灵复制功能,提供动态列表创建、管理和交互的完整解决方案。 + * + * 核心功能: + * - 动态创建/删除精灵列表 + * - 自动滑动和边界回弹 + * - 点击检测和事件分发 + * - 裁剪区域管理 + * + * 适用场景: + * - 小局结算列表 + * - 大局结算列表 + * - 听牌提示列表 + * - 战绩列表 + * - 排行榜 + * + * 使用示例: + * ```javascript + * // 1. 创建列表实例 + * var myList = new DynamicSpriteList({ + * containerId: 100, // 父精灵ID(容器) + * clipArea: { x: 50, y: 100, width: 600, height: 400 }, + * rowHeight: 80, + * templates: { + * background: { spriteId: 101 }, + * title: { spriteId: 102, offset: { x: 20, y: 10 } }, + * button: { spriteId: 103, offset: { x: 500, y: 20 } } + * } + * }); + * + * // 2. 设置数据并渲染 + * myList.setData([ + * { title: '第1行', buttonText: '查看' }, + * { title: '第2行', buttonText: '查看' } + * ]); + * + * // 3. 监听点击事件 + * myList.onClick = function(type, index, data) { + * console.log('点击了', type, '第', index, '行'); + * }; + * + * // 4. 在事件处理函数中调用 + * // mousedown: myList.handleMouseDown(spid, x, y); + * // mousemove: myList.handleMouseMove(spid, offsetY); + * // mouseup: myList.handleMouseUp(spid, x, y); + * // drawbegin: myList.handleDrawBegin(spid); + * + * // 5. 销毁 + * myList.destroy(); + * ``` + * + * ============================================================================ + * @guide 开发指南 - DynamicSpriteList 完整使用规范 + * ============================================================================ + * + * 【准备工作:在编辑器中预置精灵】 + * 1. 在编辑器中放置一个容器精灵(作为 containerId) + * 2. 在容器精灵旁边放置各列模板精灵(通常隐藏): + * - 行背景模板(每行底色/分隔线) + * - 数据列模板(牌图、分数、数量等,每种一个) + * 3. 记录这些模板精灵的 ID,用于配置 templates + * + * 【初始化列表(听牌提示列表示例)】 + * var tingList = new DynamicSpriteList({ + * containerId: sprites.LIST_CONTAINER, // 容器精灵 + * clipArea: { + * x: 0, y: 0, // 相对容器左上角 + * width: 640, height: 480 // 可见区域尺寸 + * }, + * rowHeight: 80, // 每行高度(像素) + * templates: { + * // 每列都需要一个 spriteId(模板) + * rowBg: { spriteId: sprites.ROW_TEMPLATE }, + * card: { spriteId: sprites.CARD_TEMPLATE, offset: { x: 20, y: 10 } }, + * score: { spriteId: sprites.SCORE_TEMPLATE, offset: { x: 120, y: 10 } }, + * jingBadge: { spriteId: sprites.JING_BADGE, offset: { x: 90, y: 5 } }, + * remainBadge: { spriteId: sprites.REMAIN_BADGE, offset: { x: 200, y: 5 } }, + * rowSeparator: { spriteId: sprites.ROW_SEPARATOR } + * }, + * scrollSensitivity: 5, // 移动5px以上才触发滚动 + * bounceSpeed: 1 // 回弹速度 + * }); + * + * 【设置数据(触发渲染)】 + * // 数据数组中每个元素对应一行 + * // setData 会清除旧行、重新创建新行 + * tingList.setData(tingHints); // tingHints = [{ code, score, remain, isJing }, ...] + * + * 【监听点击(在 setData 之前或之后设置均可)】 + * tingList.onClick = function(type, rowIndex, rowData) { + * // type: 模板键名,如 'card'、'score' + * // rowIndex: 第几行(0-based) + * // rowData: 该行对应的数据对象 + * if (type === 'card') { + * self._onCardClick(rowData); + * } + * }; + * + * 【接入 SpriteEventController 事件(必须接入,否则列表不响应交互)】 + * var self = this; + * // 在 init 中注册容器精灵的鼠标事件 + * SpriteEventController.registerMouseDown(sprites.LIST_CONTAINER, function(event) { + * tingList.handleMouseDown(event.spid, event.offsetX, event.offsetY); + * }); + * SpriteEventController.registerMouseMove(sprites.LIST_CONTAINER, function(event) { + * tingList.handleMouseMove(event.spid, event.offsetY); + * }); + * SpriteEventController.registerMouseUp(sprites.LIST_CONTAINER, function(event) { + * tingList.handleMouseUp(event.spid, event.offsetX, event.offsetY); + * }); + * SpriteEventController.registerDrawBegin(sprites.LIST_CONTAINER, function(event) { + * tingList.handleDrawBegin(event.spid); + * }); + * + * 【销毁(组件关闭/destroy时必须调用)】 + * tingList.destroy(); // 清除所有复制精灵,解除事件绑定 + * + * 【注意事项】 + * - destroy() 必须在组件 onDestroy/hide 时调用,否则复制精灵会残留 + * - 每次 setData 会完全重建行,不要频繁调用(建议数据变化时才调用) + * - templates 中的 spriteId 是编辑器中预置的精灵ID,不是复制出来的ID + * - 如果列表不需要滚动,设置 enableScroll: false 可提升性能 + * + * @author JinXian Team + * @version 1.0.0 + * @since 2025-12-13 + */ + +'use strict'; + +// ============================================================================ +// DynamicSpriteList 类定义 +// ============================================================================ + +/** + * 动态精灵列表构造函数 + * + * @constructor + * @param {Object} config - 列表配置对象 + * @param {number} config.containerId - 父精灵ID(容器精灵,所有复制精灵将附着在此精灵上) + * @param {Object} config.clipArea - 裁剪区域配置(可见区域) + * @param {number} config.clipArea.x - 裁剪区域左上角X坐标 + * @param {number} config.clipArea.y - 裁剪区域左上角Y坐标 + * @param {number} config.clipArea.width - 裁剪区域宽度 + * @param {number} config.clipArea.height - 裁剪区域高度 + * @param {number} config.rowHeight - 每行高度(像素) + * @param {Object} config.templates - 模板精灵配置 + * @param {number} [config.scrollSensitivity=2] - 滑动灵敏度(移动多少像素触发滑动) + * @param {number} [config.bounceSpeed=1] - 回弹动画速度 + * @param {boolean} [config.enableScroll=true] - 是否启用滚动 + * @param {boolean} [config.enableClick=true] - 是否启用点击 + * + * @example + * // 模板配置示例 + * templates: { + * // 行背景 - 必须有 + * background: { + * spriteId: 101, // 模板精灵ID + * offset: { x: 0, y: 0 } // 相对行起点的偏移(可选,默认0,0) + * }, + * // 文字模板 + * title: { + * spriteId: 102, + * offset: { x: 20, y: 15 }, + * textProperty: 'title' // 对应数据中的属性名 + * }, + * // 按钮模板 + * button: { + * spriteId: 103, + * offset: { x: 500, y: 20 }, + * clickable: true // 标记为可点击 + * } + * } + */ +function DynamicSpriteList(config) { + // ======================================================================== + // 参数验证 + // ======================================================================== + if (!config) { + throw new Error('DynamicSpriteList: config is required'); + } + if (typeof config.containerId !== 'number') { + throw new Error('DynamicSpriteList: containerId must be a number'); + } + if (!config.clipArea) { + throw new Error('DynamicSpriteList: clipArea is required'); + } + if (typeof config.rowHeight !== 'number' || config.rowHeight <= 0) { + throw new Error('DynamicSpriteList: rowHeight must be a positive number'); + } + var hasTemplates = config.templates && typeof config.templates === 'object'; + var hasRenderRow = typeof config.renderRow === 'function'; + if (!hasTemplates && !hasRenderRow) { + throw new Error('DynamicSpriteList: templates or renderRow is required'); + } + + // ======================================================================== + // 实例属性初始化 + // ======================================================================== + + /** + * 容器精灵ID + * @type {number} + */ + this.containerId = config.containerId; + + /** + * 裁剪区域配置 + * @type {Object} + */ + this.clipArea = { + x: config.clipArea.x || 0, + y: config.clipArea.y || 0, + width: config.clipArea.width || 0, + height: config.clipArea.height || 0 + }; + + /** + * 每行高度 + * @type {number} + */ + this.rowHeight = config.rowHeight; + + /** + * 模板精灵配置 + * @type {Object} + */ + this.templates = config.templates || null; + this.renderRow = config.renderRow || null; + + /** + * 滑动灵敏度 + * @type {number} + */ + this.scrollSensitivity = config.scrollSensitivity || 2; + + /** + * 回弹动画速度 + * @type {number} + */ + this.bounceSpeed = config.bounceSpeed || 1; + + /** + * 是否启用滚动 + * @type {boolean} + */ + this.enableScroll = config.enableScroll !== false; + + /** + * 是否启用点击 + * @type {boolean} + */ + this.enableClick = config.enableClick !== false; + + // ======================================================================== + // 运行时状态 + // ======================================================================== + + /** + * 当前数据 + * @type {Array} + * @private + */ + this._data = []; + + /** + * 是否正在滑动 + * @type {boolean} + * @private + */ + this._isSliding = false; + + /** + * 是否已渲染 + * @type {boolean} + * @private + */ + this._isRendered = false; + + /** + * 已创建的精灵记录 (用于删除) + * @type {Array} + * @private + */ + this._createdSprites = []; + this._tagIndex = {}; + this._nextTag = 1; + + // ======================================================================== + // 事件回调 + // ======================================================================== + + /** + * 点击事件回调 + * @type {Function|null} + * @param {string} templateName - 点击的模板类型名称 + * @param {number} rowIndex - 行索引(从0开始) + * @param {Object} rowData - 该行的数据对象 + * + * @example + * list.onClick = function(templateName, rowIndex, rowData) { + * if (templateName === 'button') { + * console.log('点击了第', rowIndex, '行的按钮'); + * console.log('数据:', rowData); + * } + * }; + */ + this.onClick = null; + + /** + * 滚动事件回调 + * @type {Function|null} + * @param {number} scrollY - 当前滚动位置 + * @param {number} maxScrollY - 最大滚动位置 + * + * @example + * list.onScroll = function(scrollY, maxScrollY) { + * var progress = scrollY / maxScrollY; + * console.log('滚动进度:', progress); + * }; + */ + this.onScroll = null; +} + +// ============================================================================ +// 公共方法 +// ============================================================================ + +/** + * 设置数据并渲染列表 + * + * @param {Array} data - 数据数组,每个元素对应一行 + * @returns {DynamicSpriteList} 返回自身,支持链式调用 + * + * @example + * list.setData([ + * { title: '战绩1', score: '+100', time: '12:30' }, + * { title: '战绩2', score: '-50', time: '12:25' }, + * { title: '战绩3', score: '+200', time: '12:20' } + * ]); + */ +DynamicSpriteList.prototype.setData = function(data) { + if (!Array.isArray(data)) { + console.error('DynamicSpriteList.setData: data must be an array'); + return this; + } + + // 先清除旧内容 + this.clear(); + + // 保存数据 + this._data = data; + + // 渲染列表 + this._render(); + + return this; +}; + +/** + * 获取当前数据 + * + * @returns {Array} 当前数据数组的副本 + */ +DynamicSpriteList.prototype.getData = function() { + return this._data.slice(); +}; + +/** + * 获取数据行数 + * + * @returns {number} 数据行数 + */ +DynamicSpriteList.prototype.getRowCount = function() { + return this._data.length; +}; + +/** + * 显示列表 + * + * @returns {DynamicSpriteList} 返回自身,支持链式调用 + */ +DynamicSpriteList.prototype.show = function() { + set_self(this.containerId, 37, 1, 0, 0); + return this; +}; + +/** + * 隐藏列表 + * + * @returns {DynamicSpriteList} 返回自身,支持链式调用 + */ +DynamicSpriteList.prototype.hide = function() { + set_self(this.containerId, 37, 0, 0, 0); + return this; +}; + +/** + * 清除所有动态创建的精灵 + * + * @returns {DynamicSpriteList} 返回自身,支持链式调用 + */ +DynamicSpriteList.prototype.clear = function() { + for (var i = 0; i < this._createdSprites.length; i++) { + ifast_dllpritefromspritecopy(this.containerId, this._createdSprites[i].tag); + } + this._createdSprites = []; + this._tagIndex = {}; + this._nextTag = 1; + this._isRendered = false; + this._isSliding = false; + return this; +}; + +/** + * 销毁列表实例 + * 释放所有资源,清除所有精灵 + */ +DynamicSpriteList.prototype.destroy = function() { + this.clear(); + this.hide(); + this._data = []; + this.onClick = null; + this.onScroll = null; +}; + +/** + * 滚动到指定位置 + * + * @param {number} y - 目标Y坐标 + * @param {boolean} [animated=true] - 是否使用动画 + * @returns {DynamicSpriteList} 返回自身,支持链式调用 + */ +DynamicSpriteList.prototype.scrollTo = function(y, animated) { + var currentY = get_self(this.containerId, 19, 0, 0, 0); + var targetY = this.clipArea.y - y; + + // 边界限制 + var contentHeight = this._data.length * this.rowHeight; + var minY = this.clipArea.y + this.clipArea.height - contentHeight; + if (targetY < minY) { + targetY = minY; + } + if (targetY > this.clipArea.y) { + targetY = this.clipArea.y; + } + + if (animated !== false) { + play_ani(1, this.containerId, 19, currentY, targetY, 0, + Math.abs(targetY - currentY), 0, 0, 0, this.bounceSpeed, 0, 0, 0); + } else { + set_self(this.containerId, 19, targetY, 0, 0, 0); + } + + return this; +}; + +/** + * 滚动到顶部 + * + * @param {boolean} [animated=true] - 是否使用动画 + * @returns {DynamicSpriteList} 返回自身,支持链式调用 + */ +DynamicSpriteList.prototype.scrollToTop = function(animated) { + return this.scrollTo(0, animated); +}; + +/** + * 滚动到底部 + * + * @param {boolean} [animated=true] - 是否使用动画 + * @returns {DynamicSpriteList} 返回自身,支持链式调用 + */ +DynamicSpriteList.prototype.scrollToBottom = function(animated) { + var contentHeight = this._data.length * this.rowHeight; + var maxScroll = contentHeight - this.clipArea.height; + if (maxScroll < 0) { + maxScroll = 0; + } + return this.scrollTo(maxScroll, animated); +}; + +/** + * 滚动到指定行 + * + * @param {number} rowIndex - 行索引(从0开始) + * @param {boolean} [animated=true] - 是否使用动画 + * @returns {DynamicSpriteList} 返回自身,支持链式调用 + */ +DynamicSpriteList.prototype.scrollToRow = function(rowIndex, animated) { + var y = rowIndex * this.rowHeight; + return this.scrollTo(y, animated); +}; + +// ============================================================================ +// 事件处理方法 - 需要在对应的事件回调中调用 +// ============================================================================ + +/** + * 处理鼠标/触摸按下事件 + * 需要在 utlmousedown 回调中调用 + * + * @param {number} spid - 按下的精灵ID + * @param {number} x - 按下位置X坐标 + * @param {number} y - 按下位置Y坐标 + * @returns {boolean} 如果事件被处理返回 true + * + * @example + * // 在 SpriteEventController 或 Game_Modify 中 + * utlmousedown: function(gameid, spid, downx, downy) { + * if (myList.handleMouseDown(spid, downx, downy)) { + * return; // 事件已处理 + * } + * // 其他处理... + * } + */ +DynamicSpriteList.prototype.handleMouseDown = function(spid, x, y) { + if (spid === this.containerId) { + this._isSliding = false; + return true; + } + return false; +}; + +/** + * 处理鼠标/触摸移动事件 + * 需要在 utlmousemove 回调中调用 + * + * @param {number} spid - 移动的精灵ID + * @param {number} offsetY - Y方向移动偏移量 + * @returns {boolean} 如果事件被处理返回 true + * + * @example + * // 在 SpriteEventController 或 Game_Modify 中 + * utlmousemove: function(gameid, spid, downx, downy, movex, movey, timelong, offmovex, offmovey) { + * if (myList.handleMouseMove(spid, offmovey)) { + * return; // 事件已处理 + * } + * // 其他处理... + * } + */ +DynamicSpriteList.prototype.handleMouseMove = function(spid, offsetY) { + if (!this.enableScroll) { + return false; + } + + if (spid === this.containerId) { + if (Math.abs(offsetY) > this.scrollSensitivity) { + // 增量移动容器 + set_self(this.containerId, 19, offsetY, 1, 0, 0); + this._isSliding = true; + + // 触发滚动回调 + if (typeof this.onScroll === 'function') { + var currentY = get_self(this.containerId, 19, 0, 0, 0); + var scrollY = this.clipArea.y - currentY; + var contentHeight = this._data.length * this.rowHeight; + var maxScrollY = contentHeight - this.clipArea.height; + this.onScroll(scrollY, maxScrollY > 0 ? maxScrollY : 0); + } + } + return true; + } + return false; +}; + +/** + * 处理鼠标/触摸松开事件 + * 需要在 mouseup 回调中调用 + * + * @param {number} spidDown - 按下时的精灵ID + * @param {number} spidUp - 松开时的精灵ID + * @param {number} upX - 松开位置X坐标 + * @param {number} upY - 松开位置Y坐标 + * @returns {boolean} 如果事件被处理返回 true + * + * @example + * // 在 SpriteEventController 或 Game_Modify 中 + * mouseup: function(gameid, spid_down, downx, downy, spid_up, upx, upy, timelong) { + * if (myList.handleMouseUp(spid_down, spid_up, upx, upy)) { + * return; // 事件已处理 + * } + * // 其他处理... + * } + */ +DynamicSpriteList.prototype.handleMouseUp = function(spidDown, spidUp, upX, upY) { + if (spidDown !== this.containerId) { + return false; + } + + // 处理边界回弹 + this._handleBounce(); + + // 处理点击(非滑动状态) + if (!this._isSliding && this.enableClick && spidDown === spidUp) { + this._handleClick(upX, upY); + } + + return true; +}; + +/** + * 处理绘制开始事件 + * 需要在 utlgamemydrawbegin 回调中调用,用于设置裁剪区域 + * + * @param {number} spid - 正在绘制的精灵ID + * @returns {boolean} 如果事件被处理返回 true + * + * @example + * // 在 SpriteEventController 或 Game_Modify 中 + * utlgamemydrawbegin: function(gameid, spid, times, timelong) { + * if (myList.handleDrawBegin(spid)) { + * return; // 已设置裁剪区域 + * } + * // 其他处理... + * } + */ +DynamicSpriteList.prototype.handleDrawBegin = function(spid) { + if (spid === this.containerId) { + set_clip(0, 0, + this.clipArea.x, + this.clipArea.y, + this.clipArea.width, + this.clipArea.height + ); + return true; + } + return false; +}; + +// ============================================================================ +// 私有方法 +// ============================================================================ + +/** + * 内部创建精灵并登记到 _tagIndex / _createdSprites + * @param {string} name - 精灵名称(模板键名或自定义名) + * @param {number} templateSpriteId - 模板精灵 ID + * @param {number} x - X 坐标 + * @param {number} y - Y 坐标(已叠加 rowBaseY) + * @param {number} rowIndex - 所在行索引 + * @param {boolean} clickable - 是否可点击 + * @returns {*} 创建出的精灵 ID + * @private + */ +DynamicSpriteList.prototype._addSpriteInternal = function (name, templateSpriteId, x, y, rowIndex, clickable) { + var tag = this._nextTag++; + var spriteId = ifast_addtospritefromspritecopy(this.containerId, templateSpriteId, x, y, tag); + var rec = { tag: tag, spriteId: spriteId, rowIndex: rowIndex, name: name, clickable: (clickable !== false) }; + this._createdSprites.push(rec); + this._tagIndex[tag] = rec; + return spriteId; +}; + +/** + * 渲染列表 + * @private + */ +DynamicSpriteList.prototype._render = function() { + set_self(this.containerId, 18, this.clipArea.x, 0, 0); + set_self(this.containerId, 19, this.clipArea.y, 0, 0); + var contentHeight = this._data.length * this.rowHeight; + set_self(this.containerId, 21, contentHeight, 0, 0); + + if (this.templates) { + var tnames = Object.keys(this.templates); + if (tnames.length > 0) { + var w = get_self(this.templates[tnames[0]].spriteId, 20, 0, 0, 0); + set_self(this.containerId, 20, w, 0, 0); + } + } else { + // renderRow 模式:容器宽度取裁剪区宽,保证整行可视宽都在容器 hit 区(点击/拖动检测)内。 + // 否则容器保持编辑器预置窄宽度,超出部分点击/拖动报的 spid≠containerId 而失效(对账 bak set_self(fSpid,20,bg宽))。 + set_self(this.containerId, 20, this.clipArea.width, 0, 0); + } + + for (var rowIndex = 0; rowIndex < this._data.length; rowIndex++) { + var rowData = this._data[rowIndex]; + var rowY = rowIndex * this.rowHeight; + + if (this.renderRow) { + this.renderRow(this._makeRowContext(rowIndex, rowData, rowY)); + } else { + var names = Object.keys(this.templates); + for (var i = 0; i < names.length; i++) { + var name = names[i]; + var t = this.templates[name]; + var ox = (t.offset && t.offset.x) || 0; + var oy = (t.offset && t.offset.y) || 0; + var sid = this._addSpriteInternal(name, t.spriteId, ox, rowY + oy, rowIndex, t.clickable !== false); + if (t.textProperty && rowData[t.textProperty] !== undefined) { + set_self(sid, 7, rowData[t.textProperty], 0, 0); + } + if (t.frameProperty && rowData[t.frameProperty] !== undefined) { + set_self(sid, 43, rowData[t.frameProperty], 0, 0); + } + } + } + } + this._isRendered = true; +}; + +/** + * 创建行上下文对象(传给 renderRow 回调) + * @param {number} rowIndex - 行索引 + * @param {Object} rowData - 行数据 + * @param {number} rowBaseY - 行基准 Y 坐标 + * @returns {Object} 行上下文 + * @private + */ +DynamicSpriteList.prototype._makeRowContext = function (rowIndex, rowData, rowBaseY) { + var self = this; + return { + rowIndex: rowIndex, + rowData: rowData, + rowBaseY: rowBaseY, + containerId: this.containerId, + addSprite: function (name, templateSpriteId, x, y) { + return self._addSpriteInternal(name, templateSpriteId, x, rowBaseY + y, rowIndex, true); + } + }; +}; + +/** + * 处理边界回弹 + * @private + */ +DynamicSpriteList.prototype._handleBounce = function() { + var currentY = get_self(this.containerId, 19, 0, 0, 0); + var contentHeight = get_self(this.containerId, 21, 0, 0, 0); + var clipY = this.clipArea.y; + var clipH = this.clipArea.height; + + var targetY = currentY; + var needBounce = false; + + if (contentHeight <= clipH) { + // 内容不足一屏,回弹到顶部 + if (currentY !== clipY) { + targetY = clipY; + needBounce = true; + } + } else { + if (currentY > clipY) { + // 超出顶部 + targetY = clipY; + needBounce = true; + } else { + var minY = clipY + clipH - contentHeight; + if (currentY < minY) { + // 超出底部 + targetY = minY; + needBounce = true; + } + } + } + + if (needBounce) { + play_ani(1, this.containerId, 19, currentY, targetY, 0, + Math.abs(targetY - currentY), 0, 0, 0, this.bounceSpeed, 0, 0, 0); + } +}; + +/** + * 处理点击事件 + * @param {number} x - 点击X坐标 + * @param {number} y - 点击Y坐标 + * @private + */ +DynamicSpriteList.prototype._handleClick = function(x, y) { + var clickedTag = ifast_check_add(this.containerId, x, y); + if (clickedTag === -99999999) { return; } + var rec = this._tagIndex[clickedTag]; + if (!rec || rec.clickable === false) { return; } + if (typeof this.onClick === 'function' && rec.rowIndex < this._data.length) { + this.onClick(rec.name, rec.rowIndex, this._data[rec.rowIndex]); + } +}; + +// ============================================================================ +// 静态工具方法 +// ============================================================================ + +/** + * 创建简单列表的快捷方法 + * + * @static + * @param {Object} options - 配置选项 + * @param {number} options.containerId - 容器精灵ID + * @param {number} options.itemTemplateId - 列表项模板精灵ID + * @param {Object} options.clipArea - 裁剪区域 + * @param {number} options.rowHeight - 行高 + * @returns {DynamicSpriteList} 列表实例 + * + * @example + * var simpleList = DynamicSpriteList.createSimple({ + * containerId: 100, + * itemTemplateId: 101, + * clipArea: { x: 50, y: 100, width: 600, height: 400 }, + * rowHeight: 60 + * }); + */ +DynamicSpriteList.createSimple = function(options) { + return new DynamicSpriteList({ + containerId: options.containerId, + clipArea: options.clipArea, + rowHeight: options.rowHeight, + templates: { + item: { + spriteId: options.itemTemplateId, + offset: { x: 0, y: 0 } + } + } + }); +}; + +// ============================================================================ +// 导出 +// ============================================================================ + +// 兼容多种模块系统 +if (typeof module !== 'undefined' && module.exports) { + module.exports = DynamicSpriteList; +} else if (typeof window !== 'undefined') { + window.DynamicSpriteList = DynamicSpriteList; +} diff --git a/client/js/gameabc-framework/ui/RecordView.js b/client/js/gameabc-framework/ui/RecordView.js new file mode 100644 index 0000000..053ee11 --- /dev/null +++ b/client/js/gameabc-framework/ui/RecordView.js @@ -0,0 +1,395 @@ +// ============================================================================ +// RecordView.js —— 通用平台战绩页组件(游戏中立;逻辑零硬编码 ID,全读 config) +// 用框架工具复刻 gameCombat:页一大局列表/页二小局明细/滚动/页面切换/选中进回放。 +// 数据收发与回放由子游戏注入:setGradeData(...) / onSelectRound / onRequestData。 +// 依赖:DynamicSpriteList, SpriteEventController, SpriteManager。严格 ES5。 +// ============================================================================ +// +// --------------------------------------------------------------------------- +// 战绩数据结构(setGradeData 传入的 gradeInfo —— 字段访问的权威说明) +// --------------------------------------------------------------------------- +// gradeInfo : CombatInfo[] 每个元素 = 一个「大局」战绩 +// +// CombatInfo[i] = { +// gameinfo1 : Object|String, // 战绩主体(可能是 JSON 字符串,渲染时先 JSON.parse) +// roomcode : String|Number, // 房号 (页一显示) +// overtime : String, // 结束时间 (页一显示) +// idx : Number, // 战绩索引(翻页/拉取定位用) +// roomtype : String // 房间类型 +// } +// +// gameinfo1 = { +// roundsum : Number, // 小局总数(= round.length) (页一“局数”) +// playerlist : Array, // 玩家列表,下标 j = 座位号 +// // playerlist[j] = [ 昵称:String, 积分:Number, 头像url:String ] ← 3 元素 +// // · 空座位可能为 falsy → 渲染时跳过(if(!pl[j]) continue) +// // · 注:服务端存储侧 o_gameinfo1 为 4 元素 [昵称,积分(String),头像,playerid], +// // 与此“战绩查询返回”格式不同;本组件只用 [0]昵称 / [1]积分,差异无影响。 +// round : Array // 小局明细,round[i] = 第 i 个小局的逐座位计分 +// // round[i] = [ [座位号:Number, 该小局得分:Number], ... ] +// // · 例:round[0] = [[0,-6],[1,-8],[2,-6],[3,20]] → 座位0得-6 … 座位3得+20 +// } +// +// 页一(大局列表)用:overtime / roomcode / roundsum / playerlist(昵称+积分) +// 页二(小局明细)用:round(每行=一小局)+ playerlist(昵称) + round[i] 按座位匹配该局得分 +// (roundData[k][0]==座位 j → roundData[k][1] 为该玩家该小局得分) +// --------------------------------------------------------------------------- +var RecordView = { + _cfg: null, + _gradeData: null, + _page: 0, + _gameIndex: -1, + _listOne: null, + _listTwo: null, + _bound: false, + + _type: 0, + _gradeIdx1: 0, + _gradeIdx2: 0, + _gradeCount: 0, // 战绩总数(原全局 CombatCount,RecordView 自持) + _selectedRound: -1, // 当前选中的小局下标(配合 _gameIndex;选局数据由 RecordView 记录,子游戏只读) + + onClose: null, + + // 收战绩列表回包(平台通用协议):set 全局 CombatInfo/CombatCount + parse gameinfo1 + 记翻页边界 + 渲染打开。 + // 子游戏经 SubGameHooks.get_player_grade1 转发到此。 + onReceiveGrade1: function (_msg) { + if (typeof Utl !== 'undefined' && Utl.playSound && typeof Game_Config !== 'undefined') { + Utl.playSound(Game_Config.ClickButton.src_2); + } + var gradeinfo = _msg.data.gradeinfo || []; + this._gradeCount = _msg.data.asetcount; + for (var i = 0; i < gradeinfo.length; i++) { + if (typeof gradeinfo[i].gameinfo1 === 'string') { + gradeinfo[i].gameinfo1 = JSON.parse(gradeinfo[i].gameinfo1); + } + if (i === 0) { this._gradeIdx1 = gradeinfo[i].idx; } + if (i === gradeinfo.length - 1) { this._gradeIdx2 = gradeinfo[i].idx; } + } + this.setGradeData(gradeinfo); + this.open(); + }, + + // 翻页/类型 → 发获取战绩请求(平台通用协议)。类型切换 _requestGrade(type,null);翻页 _requestGrade(_,direction)。 + _requestGrade: function (arg1, direction) { + var data = { agentid: GameData.AgentId, playerid: C_Player.playerid, gameid: GameData.GameId }; + if (direction == null) { + this._type = arg1; // 类型切换 + data.type = arg1; + } else { + data.type = this._type; // 翻页:type 用当前,direction + gradeidx + data.direction = direction; + data.gradeidx = (direction === 1) ? this._gradeIdx1 : this._gradeIdx2; + } + if (typeof Net !== 'undefined' && Net.Send_get_player_grade1) { Net.Send_get_player_grade1(data); } + }, + + // 选局 → 发获取该大局回放数据请求(平台通用协议)。gradeidx=选中大局的 idx(对账 bak newGoCombatPageThree 812-816)。 + // 每次选局都发(不做同局缓存);回放数据接收与渲染由子游戏(onSelectRound + SubGameHooks.get_player_grade2)完成。 + _requestReplayData: function (gameIndex) { + var data = { agentid: GameData.AgentId, playerid: C_Player.playerid, gameid: GameData.GameId }; + if (this._gradeData && this._gradeData[gameIndex] && typeof this._gradeData[gameIndex].idx !== 'undefined') { + data.gradeidx = this._gradeData[gameIndex].idx; + } + if (typeof Net !== 'undefined' && Net.Send_get_player_grade2) { Net.Send_get_player_grade2(data); } + }, + + configure: function (config) { + this._cfg = config || (typeof RecordViewDefaultConfig !== 'undefined' ? RecordViewDefaultConfig : null); + if (!this._cfg) { console.error('[RecordView] 缺少配置且无 DEFAULT_CONFIG'); return false; } + return true; + }, + + // 喂入平台战绩数据并渲染页一。 + // @param gradeInfo CombatInfo[](结构见文件顶部「战绩数据结构」) + setGradeData: function (gradeInfo) { + this._gradeData = gradeInfo || []; + if (this._page === 1) { this._renderPageOne(); } + }, + + open: function () { + if (!this._cfg) { this.configure(null); } + if (!this._cfg) { return false; } + SpriteManager.showGroup(this._cfg.common.panelGroup); + this._bindEvents(); + this.gotoPageOne(); + return true; + }, + + close: function () { + this._clearPageOne(); + this._clearPageTwo(); + var rs = this._cfg ? this._cfg.common.resetGroups : []; + for (var i = 0; i < rs.length; i++) { SpriteManager.hideGroup(rs[i]); } + this._page = 0; + if (typeof this.onClose === 'function') { this.onClose(); } + }, + + gotoPageOne: function () { + this._clearPageTwo(); + this._page = 1; + this._renderPageOne(); + this._syncHeader(); + this._syncPagingBtns(); + }, + + gotoPageTwo: function (gameIndex) { + this._clearPageOne(); + this._gameIndex = gameIndex; + this._page = 2; + this._renderPageTwo(gameIndex); + this._syncHeader(); + }, + + // 同步头部 UI(总数 684/683、标题 82、类型标签 83),复刻 bak newGoCombatPageOne/Two 的 set_self。 + _syncHeader: function () { + if (typeof set_self === 'undefined') { return; } + var c = this._cfg.common; + if (this._gradeCount) { + set_self(c.countSpid, 7, this._gradeCount, 0, 0); + set_self(c.countSpid, 20, String(this._gradeCount).length * 14, 0, 0); + } else { + set_self(c.countHideSpid, 37, 0, 0, 0); + set_self(c.countSpid, 37, 0, 0, 0); + } + set_self(c.titleSpid, 37, 1, 0, 0); + set_self(c.titleSpid, 43, this._type ? 2 : 1, 0, 0); + if (c.typeTagSpid != null) { + set_self(c.typeTagSpid, 43, this._type ? 2 : 1, 0, 0); + } + }, + + // 翻页按钮显隐:仅 type=1(分页视图)显示 prev/next,复刻 bak newGoCombatPageOne 753-759。 + // 这保证 type=0 视图无翻页按钮,翻页时 _type 恒为 1,_requestGrade 取值正确。 + _syncPagingBtns: function () { + if (typeof set_self === 'undefined') { return; } + var c = this._cfg.common; + var show = this._type ? 1 : 0; + if (c.prevBtn != null) { set_self(c.prevBtn, 37, show, 0, 0); } + if (c.nextBtn != null) { set_self(c.nextBtn, 37, show, 0, 0); } + }, + + // 供子游戏读取当前选局(回放定位):选中大局下标 / 小局下标。选局数据由 RecordView 记录,子游戏只读。 + getSelectedGameIndex: function () { return this._gameIndex; }, + getSelectedRound: function () { return this._selectedRound; }, + getSelectedGameData: function () { return (this._gradeData && this._gameIndex >= 0) ? this._gradeData[this._gameIndex] : null; }, + + destroy: function () { + this._unbindEvents(); + if (this._listOne) { this._listOne.destroy(); this._listOne = null; } + if (this._listTwo) { this._listTwo.destroy(); this._listTwo = null; } + this._gradeData = null; this._page = 0; this._gameIndex = -1; + }, + + _renderPageOne: function () { + var self = this; + var cfg = this._cfg.pageOne; + var L = cfg.layout; + var T = cfg.rowTemplate; + + SpriteManager.showGroup(cfg.groupId); + if (this._listOne) { this._listOne.destroy(); } + this._listOne = new DynamicSpriteList({ + containerId: cfg.containerSpid, + clipArea: { x: cfg.clip.x, y: cfg.clip.y, width: cfg.clip.w, height: cfg.clip.h }, + rowHeight: L.rowSpace, + renderRow: function (row) { + var d = row.rowData; + var gi = (typeof d.gameinfo1 === 'string') ? JSON.parse(d.gameinfo1) : d.gameinfo1; + + // ---- 行背景 ---- + row.addSprite('bg', T.bg, 0, 0); + + // ---- txt1:固定标签(时间:/房号:/局数:)---- + var s; + s = row.addSprite('lbl0', T.txt1, L.txt1Pos[0][0], L.txt1Pos[0][1]); + SpriteManager.setText(s, '时间:'); + s = row.addSprite('lbl1', T.txt1, L.txt1Pos[1][0], L.txt1Pos[1][1]); + SpriteManager.setText(s, '房号:'); + s = row.addSprite('lbl2', T.txt1, L.txt1Pos[2][0], L.txt1Pos[2][1]); + SpriteManager.setText(s, '局数:'); + + // ---- txt2:数据值(overtime / roomcode / roundsum)---- + s = row.addSprite('val0', T.txt2, L.txt2Pos[0][0], L.txt2Pos[0][1]); + SpriteManager.setText(s, d.overtime); + s = row.addSprite('val1', T.txt2, L.txt2Pos[1][0], L.txt2Pos[1][1]); + SpriteManager.setText(s, d.roomcode); + s = row.addSprite('val2', T.txt2, L.txt2Pos[2][0], L.txt2Pos[2][1]); + SpriteManager.setText(s, gi.roundsum); + + // ---- 玩家信息(昵称 + 积分),>5 人双排 ---- + var pl = gi.playerlist; + var pCount = 0, m; + for (m = 0; m < pl.length; m++) { if (pl[m]) { pCount++; } } + var pos3 = (pCount > 5) ? L.txt3Pos10 : L.txt3Pos5; + var nameLimit = (pCount > 5) ? L.nickLimit10 : L.nickLimit5; + + if (pCount > 5) { + row.addSprite('split', T.split, L.splitPos[0], L.splitPos[1]); + } + + var n = 0, j; + for (j = 0; j < pl.length; j++) { + if (!pl[j]) { continue; } + var nameTxt = Func.subString(pl[j][0], nameLimit, true); + var scoreTxt = pl[j][1]; + var cx = pos3[n][0]; + var cy = pos3[n][1]; + var nx = cx - String(nameTxt).gblen() * L.txtWidth / 2; + var sx = cx - String(scoreTxt).gblen() * L.txtWidth / 2; + + var sn = row.addSprite('name' + n, T.txt3, nx, cy); + SpriteManager.setText(sn, nameTxt); + var sc = row.addSprite('score' + n, T.txt3, sx, cy + L.nsSpace); + SpriteManager.setText(sc, scoreTxt); + n++; + } + + // ---- 行按钮(可点击跳转页二)---- + row.addSprite('btn', T.btn, L.btnPos[0], L.btnPos[1]); + } + }); + this._listOne.onClick = function (name, rowIndex, rowData) { + self.gotoPageTwo(rowIndex); + }; + this._listOne.setData(this._gradeData || []); + }, + _clearPageOne: function () { if (this._listOne) { this._listOne.destroy(); this._listOne = null; } if (this._cfg) { SpriteManager.hideGroup(this._cfg.pageOne.groupId); } }, + _renderPageTwo: function (gameIndex) { + var self = this; + var cfg = this._cfg.pageTwo; + var L = cfg.layout; + var T = cfg.rowTemplate; + + SpriteManager.showGroup(cfg.groupId); + if (this._listTwo) { this._listTwo.destroy(); } + + var entry = this._gradeData[gameIndex]; + var gi = (typeof entry.gameinfo1 === 'string') ? JSON.parse(entry.gameinfo1) : entry.gameinfo1; + var pl = gi.playerlist || []; + var rounds = gi.round || []; + + // 计算玩家人数与 nameLimit(对账 gameCombat 669:用 playerlist.length 判断) + var pCount = 0, m; + for (m = 0; m < pl.length; m++) { if (pl[m]) { pCount++; } } + var nameLimit = (pl.length > 5) ? L.nickLimit10 : L.nickLimit5; + + this._listTwo = new DynamicSpriteList({ + containerId: cfg.containerSpid, + clipArea: { x: cfg.clip.x, y: cfg.clip.y, width: cfg.clip.w, height: cfg.clip.h }, + rowHeight: L.rowSpace, + renderRow: function (row) { + var i = row.rowIndex; // 第 i 小局(0 起) + var roundData = row.rowData; // round[i] = [[座位,分数],...] + + // ---- 行背景 ---- + row.addSprite('bg', T.bg, 0, 0); + + // ---- 第几局(对账 645–648:< 10 带空格,>= 10 无空格)---- + var rd = i + 1; + var txt = (rd < 10) ? ('第 ' + rd + ' 局') : ('第' + rd + '局'); + var st = row.addSprite('lbl', T.txt1, L.txt1Pos[0][0], L.txt1Pos[0][1]); + SpriteManager.setText(st, txt); + + // ---- 玩家昵称 + 该局得分(>5 人双排 + 分隔线)---- + var pos = (pCount > 5) ? L.txt3Pos10 : L.txt3Pos5; + if (pCount > 5) { + row.addSprite('split', T.split, L.splitPos[0], L.splitPos[1]); + } + + var n = 0, j; + for (j = 0; j < pl.length; j++) { + if (!pl[j]) { continue; } + var nameTxt = Func.subString(pl[j][0], nameLimit, true); + var sn = row.addSprite('name' + n, T.txt3, pos[n][0], pos[n][1]); + SpriteManager.setText(sn, nameTxt); + // score 默认 0,再按座位号匹配覆盖(对账 687–694) + var sc = row.addSprite('score' + n, T.txt3, pos[n][0], pos[n][1] + L.nsSpace); + SpriteManager.setText(sc, 0); + var k; + for (k = 0; k < roundData.length; k++) { + if (roundData[k][0] == j) { SpriteManager.setText(sc, roundData[k][1]); } + } + n++; + } + + // ---- 行按钮(可点击触发 onSelectRound)---- + row.addSprite('btn', T.btn, L.btnPos[0], L.btnPos[1]); + } + }); + this._listTwo.onClick = function (name, rowIndex, rowData) { + self._selectedRound = rowIndex; // 记录选中小局(选局数据由 RecordView 记录) + self._requestReplayData(self._gameIndex); // 发 grade2 拉该大局回放数据(每次选局都发) + }; + this._listTwo.setData(rounds); + }, + _clearPageTwo: function () { if (this._listTwo) { this._listTwo.destroy(); this._listTwo = null; } if (this._cfg) { SpriteManager.hideGroup(this._cfg.pageTwo.groupId); } }, + _bindEvents: function () { + if (this._bound) { return; } + var self = this, c = this._cfg; + + // ---- 两个列表容器:将精灵事件转发给对应的 DynamicSpriteList ---- + function bindContainer(containerSpid, getList) { + SpriteEventController.registerMouseDown(containerSpid, function (e) { + var l = getList(); if (l) { l.handleMouseDown(e.spriteId, e.x, e.y); } + }); + SpriteEventController.registerMouseMove(containerSpid, function (e) { + var l = getList(); if (l) { l.handleMouseMove(e.spriteId, e.offset.y); } + }); + SpriteEventController.registerMouseUp(containerSpid, function (e) { + var l = getList(); if (l) { l.handleMouseUp(e.downSpriteId, e.upSpriteId, e.upPos.x, e.upPos.y); } + }); + SpriteEventController.registerDrawBegin(containerSpid, function (e) { + var l = getList(); if (l) { l.handleDrawBegin(e.spriteId); } + }); + } + bindContainer(c.pageOne.containerSpid, function () { return self._listOne; }); + bindContainer(c.pageTwo.containerSpid, function () { return self._listTwo; }); + + // ---- 返回按钮:页二时回页一,否则关闭 ---- + SpriteEventController.registerMouseUp(c.common.backBtn, function () { + if (self._page === 2) { self.gotoPageOne(); } else { self.close(); } + }); + + // ---- 关闭按钮(可多个)---- + var cb = c.common.closeBtn || [], i; + for (i = 0; i < cb.length; i++) { + (function (spid) { + SpriteEventController.registerMouseUp(spid, function () { self.close(); }); + })(cb[i]); + } + + // ---- 翻页:prev=direction 1(上一页),next=direction 2(下一页)→ 组件自己发请求 ---- + if (c.common.prevBtn != null) { + SpriteEventController.registerMouseUp(c.common.prevBtn, function () { self._requestGrade(1, 1); }); + } + if (c.common.nextBtn != null) { + SpriteEventController.registerMouseUp(c.common.nextBtn, function () { self._requestGrade(1, 2); }); + } + + // ---- 类型切换:typeBtns[k] -> type=k(IIFE 固定 typeVal 防循环变量捕获)→ 组件自己发请求 ---- + var tb = c.common.typeBtns || [], k; + for (k = 0; k < tb.length; k++) { + (function (typeVal) { + SpriteEventController.registerMouseUp(tb[typeVal], function () { self._requestGrade(typeVal, null); }); + })(k); + } + + this._bound = true; + }, + + _unbindEvents: function () { + if (!this._bound) { return; } + var c = this._cfg; + var spids = [c.pageOne.containerSpid, c.pageTwo.containerSpid, c.common.backBtn, c.common.prevBtn, c.common.nextBtn]; + var cb = c.common.closeBtn || [], tb = c.common.typeBtns || [], i; + for (i = 0; i < cb.length; i++) { spids.push(cb[i]); } + for (i = 0; i < tb.length; i++) { spids.push(tb[i]); } + for (i = 0; i < spids.length; i++) { + if (spids[i] != null) { SpriteEventController.unregister(spids[i]); } + } + this._bound = false; + } +}; +if (typeof window !== 'undefined') { window.RecordView = RecordView; } +if (typeof module !== 'undefined' && module.exports) { module.exports = RecordView; } diff --git a/client/js/gameabc-framework/ui/RecordViewDefaultConfig.js b/client/js/gameabc-framework/ui/RecordViewDefaultConfig.js new file mode 100644 index 0000000..bb8d12e --- /dev/null +++ b/client/js/gameabc-framework/ui/RecordViewDefaultConfig.js @@ -0,0 +1,93 @@ +// ============================================================================ +// RecordViewDefaultConfig.js —— RecordView 默认配置(= 现有战绩界面群组/精灵 ID) +// 纯数据;RecordView 逻辑零硬编码 ID,不传 config 时用本默认。换游戏只换这份。 +// 权威来源:01_SubGame_modify.js 的 gameCombat.combatPageOneConfig/combatPageTwoConfig 等。 +// 严格 ES5。 +// ============================================================================ +var RecordViewDefaultConfig = { + common: { + panelGroup: 7, // openNewCombat: set_group(7,37,1,...) / closeNewCombat: set_group(7,37,0,...) + titleSpid: 82, // set_self(82,37,1,...) + set_self(82,43,1/2,...) + typeTagSpid: 83, // openNewCombat: set_self(83,43,1/2,...) 类型标签按 type + backBtn: 55, // case 55: 返回 + closeBtn: [49, 61], // case 49 / case 61: 关闭 + prevBtn: 104, // case 104: 上一页 + nextBtn: 105, // case 105: 下一页 + typeBtns: [84, 85], // case 84 / 85: 类型切换 + reqBtn: 13, // case 13: 发送战绩请求 + countSpid: 684, // set_self(684,7,CombatCount,...) 总数显示精灵 + countHideSpid: 683, // set_self(683,37,0,...) 隐藏总数精灵 + resetGroups: [7, 8, 9, 13, 14, 15, 16, 17] // closeNewCombat: set_group(7~9,13~17,37,0,...) + }, + pageOne: { + groupId: 8, // newCreateCombatPageOne: set_group(8,37,1,...) + containerSpid: 63, // fSpid:63 + rowTemplate: { + bg: 64, // bgSpid:64 + split: 86, // splitSpid:86 + btn: 51, // btnSpid:51 + txt1: 65, // txt1Spid:65 + txt2: 66, // txt2Spid:66 + txt3: 67 // txt3Spid:67 + }, + tagBase: { + bg: 1, // bgTag:1 + split: 500, // splitTag:500 + btn: 1000, // btnTag:1000 + txt1: 1500, // txt1Tag:1500 + txt2: 3000, // txt2Tag:3000 + txt3: 4500 // txt3Tag:4500 + }, + clip: { x: 64, y: 114, w: 1175, h: 515 }, // clip_x/y/w/h + layout: { + rowSpace: 167, // bgSpace:167 + txt1Pos: [[35, 15], [35, 60], [35, 105]], // txt1Position + txt2Pos: [[130, 15], [130, 60], [130, 105]], // txt2Position + txt3Pos5: [[400, 45], [540, 45], [680, 45], [820, 45], [960, 45]], // txt3Position5 + txt3Pos10: [[400, 10], [540, 10], [680, 10], [820, 10], [960, 10], // txt3Position10 + [400, 80], [540, 80], [680, 80], [820, 80], [960, 80]], + splitPos: [338, 74], // splitPosition + btnPos: [1065, 0], // btnPosition + txtWidth: 10, // txt1Width/txt2Width/txt3Width + nickLimit5: 8, // nickNameLimit5 + nickLimit10: 8, // nickNameLimit10 + nsSpace: 30 // nsSpace + } + }, + pageTwo: { + groupId: 9, // newCreateCombatPageTwo: set_group(9,37,1,...) + containerSpid: 87, // fSpid:87 + rowTemplate: { + bg: 88, // bgSpid:88 + split: 91, // splitSpid:91 + btn: 54, // btnSpid:54 + txt1: 89, // txt1Spid:89 + // txt2 注释掉(源码 //txt2Spid:66) + txt3: 90 // txt3Spid:90 + }, + tagBase: { + bg: 1, // bgTag:1 + split: 500, // splitTag:500 + btn: 1000, // btnTag:1000 + txt1: 1500, // txt1Tag:1500 + txt2: 3000, // txt2Tag:3000(源码保留) + txt3: 4500 // txt3Tag:4500 + }, + clip: { x: 64, y: 114, w: 1175, h: 515 }, // clip_x/y/w/h + layout: { + rowSpace: 167, // bgSpace:167 + txt1Pos: [[90, 50], [35, 60], [35, 105]], // txt1Position(3项,源码权威) + txt3Pos5: [[400, 45], [540, 45], [680, 45], [820, 45], [960, 45]], // txt3Position5 + txt3Pos10: [[400, 10], [540, 10], [680, 10], [820, 10], [960, 10], // txt3Position10 + [400, 80], [540, 80], [680, 80], [820, 80], [960, 80]], + splitPos: [338, 74], // splitPosition + btnPos: [1065, 0], // btnPosition + txtWidth: 10, // txt1Width/txt2Width/txt3Width + nickLimit5: 2, // nickNameLimit5 + nickLimit10: 2, // nickNameLimit10 + nsSpace: 30 // nsSpace + } + } +}; +if (typeof window !== 'undefined') { window.RecordViewDefaultConfig = RecordViewDefaultConfig; } +if (typeof module !== 'undefined' && module.exports) { module.exports = RecordViewDefaultConfig; } diff --git a/client/js/gameabc-framework/ui/SpriteCopyUtils.js b/client/js/gameabc-framework/ui/SpriteCopyUtils.js new file mode 100644 index 0000000..34e05d5 --- /dev/null +++ b/client/js/gameabc-framework/ui/SpriteCopyUtils.js @@ -0,0 +1,650 @@ +/** + * ============================================================================ + * SpriteCopyUtils.js - 精灵复制底层工具 + * ============================================================================ + * + * 封装 gameabc 框架的精灵复制核心功能,提供更易用的 API。 + * 这是一个底层工具类,DynamicSpriteList 基于此构建。 + * + * 核心概念: + * - 父精灵 (Parent Sprite): 容器精灵,复制出的子精灵将附着其上 + * - 模板精灵 (Template Sprite): 提供视觉样式的精灵模板 + * - 子精灵 (Child Sprite): 运行时动态复制创建的精灵 + * - Tag: 子精灵的唯一标识符,用于删除和点击识别 + * + * ============================================================================ + * @guide 开发指南 - SpriteCopyUtils 使用规范 + * ============================================================================ + * + * 【创建动态精灵(模板复制)】 + * // 在编辑器中预先放置一个模板精灵(通常隐藏),用作样式来源 + * // 运行时从该模板复制,附着到容器精灵上 + * + * var parentId = sprites.LIST_CONTAINER; // 容器精灵ID(编辑器放置) + * var templateId = sprites.ROW_TEMPLATE; // 模板精灵ID(编辑器放置,通常隐藏) + * var tag = rowIndex; // 行索引作为tag(在父精灵内唯一) + * + * var spriteId = SpriteCopyUtils.create(parentId, templateId, 0, rowIndex * rowHeight, tag); + * // spriteId 是字符串格式:"parentIdaddtag",如 "2836add0" + * + * // 创建后可通过 SpriteManager 设置属性(spriteId 是字符串,SpriteManager 自动处理) + * SpriteManager.setFrame(spriteId, card.code - 1); + * SpriteManager.setText(spriteId, String(score)); + * SpriteManager.show(spriteId); + * + * 【删除动态精灵】 + * SpriteCopyUtils.remove(parentId, tag); // 删除单个 + * SpriteCopyUtils.removeRange(parentId, 0, 10); // 删除tag 0-9 + * + * 【hit-test 点击检测(在鼠标事件中使用)】 + * // 在 SpriteEventController 的 mouseUp 回调中: + * var clickedTag = SpriteCopyUtils.hitTest(parentId, event.offsetX, event.offsetY); + * if (clickedTag !== SpriteCopyUtils.HIT_NONE) { + * // clickedTag 是被点击子精灵的 tag + * var rowIndex = clickedTag; + * self._onRowClick(rowIndex); + * } + * + * 【典型使用场景:听牌提示列表(TingHintView 模式)】 + * // 1. 编辑器中放置:容器精灵 + 行背景模板 + 牌图模板 + 分数模板 + * // 2. 运行时:为每条听牌提示创建一行 + * for (var i = 0; i < tingHints.length; i++) { + * var hint = tingHints[i]; + * var yOffset = i * ROW_HEIGHT; + * + * // 复制行背景 + * var bgId = SpriteCopyUtils.create(containerId, bgTemplate, 0, yOffset, i); + * + * // 复制牌图 + * var cardId = SpriteCopyUtils.create(containerId, cardTemplate, CARD_X, yOffset, i + 1000); + * SpriteManager.setFrame(cardId, hint.code - 1); + * + * // 复制分数标签 + * var scoreId = SpriteCopyUtils.create(containerId, scoreTemplate, SCORE_X, yOffset, i + 2000); + * SpriteManager.setText(scoreId, String(hint.score)); + * } + * // 3. 清理:游戏结束或弹窗关闭时 + * SpriteCopyUtils.removeRange(containerId, 0, tingHints.length); + * SpriteCopyUtils.removeRange(containerId, 1000, 1000 + tingHints.length); + * SpriteCopyUtils.removeRange(containerId, 2000, 2000 + tingHints.length); + * + * 【注意事项】 + * - tag 在同一个 parentId 下必须唯一;不同列使用不同的 tag 偏移(如+1000, +2000) + * - 复制精灵的 ID 格式 "parentIdaddtag" 是字符串,SpriteManager 已支持此格式 + * - 如果使用 DynamicSpriteList,则无需手动调用 SpriteCopyUtils,列表内部已封装 + * + * @author JinXian Team + * @version 1.0.0 + * @since 2025-12-13 + */ + +'use strict'; + +/** + * 精灵复制工具类 + * @namespace + */ +var SpriteCopyUtils = {}; + +// ============================================================================ +// 精灵创建与删除 +// ============================================================================ + +/** + * 从模板复制创建精灵 + * + * @param {number} parentId - 父精灵ID(容器),子精灵将附着在此精灵上 + * @param {number} templateId - 模板精灵ID,复制其视觉属性 + * @param {number} x - 相对于父精灵的X坐标 + * @param {number} y - 相对于父精灵的Y坐标 + * @param {number} tag - 子精灵标识符(在父精灵内唯一) + * @returns {string} 复合精灵ID,格式为 "parentId + 'add' + tag" + * + * @example + * // 在父精灵100上,基于模板200,在位置(50,30)创建子精灵,tag为1 + * var spriteId = SpriteCopyUtils.create(100, 200, 50, 30, 1); + * + * // 设置子精灵的文字内容 + * set_self(spriteId, 7, '你好世界', 0, 0); + * + * // 设置子精灵的帧 + * set_self(spriteId, 43, 2, 0, 0); + */ +SpriteCopyUtils.create = function(parentId, templateId, x, y, tag) { + return ifast_addtospritefromspritecopy(parentId, templateId, x, y, tag); +}; + +/** + * 删除复制创建的子精灵 + * + * @param {number} parentId - 父精灵ID + * @param {number} tag - 要删除的子精灵标识符 + * + * @example + * // 删除父精灵100上tag为1的子精灵 + * SpriteCopyUtils.remove(100, 1); + */ +SpriteCopyUtils.remove = function(parentId, tag) { + ifast_dllpritefromspritecopy(parentId, tag); +}; + +/** + * 批量删除复制创建的子精灵 + * + * @param {number} parentId - 父精灵ID + * @param {number} startTag - 起始tag(包含) + * @param {number} endTag - 结束tag(不包含) + * + * @example + * // 删除父精灵100上tag从1到10的所有子精灵 + * SpriteCopyUtils.removeRange(100, 1, 11); + */ +SpriteCopyUtils.removeRange = function(parentId, startTag, endTag) { + for (var tag = startTag; tag < endTag; tag++) { + ifast_dllpritefromspritecopy(parentId, tag); + } +}; + +/** + * 批量删除指定tag数组的子精灵 + * + * @param {number} parentId - 父精灵ID + * @param {Array} tags - tag数组 + * + * @example + * // 删除父精灵100上tag为1, 3, 5, 7的子精灵 + * SpriteCopyUtils.removeByTags(100, [1, 3, 5, 7]); + */ +SpriteCopyUtils.removeByTags = function(parentId, tags) { + for (var i = 0; i < tags.length; i++) { + ifast_dllpritefromspritecopy(parentId, tags[i]); + } +}; + +// ============================================================================ +// 点击检测 +// ============================================================================ + +/** + * 检测点击了父精灵上的哪个子精灵 + * + * @param {number} parentId - 父精灵ID + * @param {number} x - 点击位置X坐标(屏幕坐标) + * @param {number} y - 点击位置Y坐标(屏幕坐标) + * @returns {number} 被点击的子精灵tag,未命中返回 -99999999 + * + * @example + * // 在mouseup事件中检测点击 + * var clickedTag = SpriteCopyUtils.hitTest(100, upx, upy); + * if (clickedTag !== -99999999) { + * console.log('点击了tag为', clickedTag, '的子精灵'); + * } + */ +SpriteCopyUtils.hitTest = function(parentId, x, y) { + return ifast_check_add(parentId, x, y); +}; + +/** + * 检测点击是否命中任何子精灵 + * + * @param {number} parentId - 父精灵ID + * @param {number} x - 点击位置X坐标 + * @param {number} y - 点击位置Y坐标 + * @returns {boolean} 是否命中 + * + * @example + * if (SpriteCopyUtils.isHit(100, upx, upy)) { + * console.log('点击到了子精灵'); + * } + */ +SpriteCopyUtils.isHit = function(parentId, x, y) { + return ifast_check_add(parentId, x, y) !== -99999999; +}; + +/** + * 检测点击的tag是否在指定范围内 + * + * @param {number} parentId - 父精灵ID + * @param {number} x - 点击位置X坐标 + * @param {number} y - 点击位置Y坐标 + * @param {number} startTag - 起始tag(包含) + * @param {number} endTag - 结束tag(不包含) + * @returns {number} 如果在范围内返回tag,否则返回 -1 + * + * @example + * // 检测是否点击了按钮区域(tag 1000-1999) + * var btnTag = SpriteCopyUtils.hitTestInRange(100, upx, upy, 1000, 2000); + * if (btnTag !== -1) { + * var buttonIndex = btnTag - 1000; + * console.log('点击了第', buttonIndex, '个按钮'); + * } + */ +SpriteCopyUtils.hitTestInRange = function(parentId, x, y, startTag, endTag) { + var tag = ifast_check_add(parentId, x, y); + if (tag >= startTag && tag < endTag) { + return tag; + } + return -1; +}; + +// ============================================================================ +// 精灵ID工具 +// ============================================================================ + +/** + * 生成复合精灵ID + * + * @param {number} parentId - 父精灵ID + * @param {number} tag - 子精灵tag + * @returns {string} 复合精灵ID + * + * @example + * var spriteId = SpriteCopyUtils.getSpriteId(100, 5); + * // 返回 "100add5" + * set_self(spriteId, 7, '文字内容', 0, 0); + */ +SpriteCopyUtils.getSpriteId = function(parentId, tag) { + return parentId + 'add' + tag; +}; + +/** + * 从复合精灵ID解析父精灵ID和tag + * + * @param {string} spriteId - 复合精灵ID + * @returns {Object|null} 包含parentId和tag的对象,解析失败返回null + * + * @example + * var info = SpriteCopyUtils.parseSpriteId('100add5'); + * // 返回 { parentId: 100, tag: 5 } + */ +SpriteCopyUtils.parseSpriteId = function(spriteId) { + if (typeof spriteId !== 'string') { + return null; + } + var parts = spriteId.split('add'); + if (parts.length !== 2) { + return null; + } + var parentId = parseInt(parts[0], 10); + var tag = parseInt(parts[1], 10); + if (isNaN(parentId) || isNaN(tag)) { + return null; + } + return { + parentId: parentId, + tag: tag + }; +}; + +// ============================================================================ +// 批量创建工具 +// ============================================================================ + +/** + * 批量创建子精灵(网格布局) + * + * @param {Object} options - 配置选项 + * @param {number} options.parentId - 父精灵ID + * @param {number} options.templateId - 模板精灵ID + * @param {number} options.count - 创建数量 + * @param {number} options.startTag - 起始tag + * @param {number} options.startX - 起始X坐标 + * @param {number} options.startY - 起始Y坐标 + * @param {number} options.spacingX - X方向间距 + * @param {number} options.spacingY - Y方向间距 + * @param {number} [options.columns=0] - 每行列数,0表示不换行 + * @returns {Array} 创建的精灵ID数组 + * + * @example + * // 创建3x3的网格(9个精灵) + * var sprites = SpriteCopyUtils.createGrid({ + * parentId: 100, + * templateId: 200, + * count: 9, + * startTag: 1, + * startX: 50, + * startY: 50, + * spacingX: 80, + * spacingY: 80, + * columns: 3 + * }); + */ +SpriteCopyUtils.createGrid = function(options) { + var result = []; + var columns = options.columns || 0; + + for (var i = 0; i < options.count; i++) { + var col = columns > 0 ? (i % columns) : i; + var row = columns > 0 ? Math.floor(i / columns) : 0; + + var x = options.startX + col * options.spacingX; + var y = options.startY + row * options.spacingY; + var tag = options.startTag + i; + + var spriteId = ifast_addtospritefromspritecopy( + options.parentId, + options.templateId, + x, + y, + tag + ); + result.push(spriteId); + } + + return result; +}; + +/** + * 批量创建子精灵(垂直列表布局) + * + * @param {Object} options - 配置选项 + * @param {number} options.parentId - 父精灵ID + * @param {number} options.templateId - 模板精灵ID + * @param {number} options.count - 创建数量 + * @param {number} options.startTag - 起始tag + * @param {number} options.x - X坐标 + * @param {number} options.startY - 起始Y坐标 + * @param {number} options.rowHeight - 行高 + * @returns {Array} 创建的精灵ID数组 + * + * @example + * // 创建5行的垂直列表 + * var sprites = SpriteCopyUtils.createVerticalList({ + * parentId: 100, + * templateId: 200, + * count: 5, + * startTag: 1, + * x: 50, + * startY: 100, + * rowHeight: 60 + * }); + */ +SpriteCopyUtils.createVerticalList = function(options) { + return SpriteCopyUtils.createGrid({ + parentId: options.parentId, + templateId: options.templateId, + count: options.count, + startTag: options.startTag, + startX: options.x, + startY: options.startY, + spacingX: 0, + spacingY: options.rowHeight, + columns: 1 + }); +}; + +/** + * 批量创建子精灵(水平列表布局) + * + * @param {Object} options - 配置选项 + * @param {number} options.parentId - 父精灵ID + * @param {number} options.templateId - 模板精灵ID + * @param {number} options.count - 创建数量 + * @param {number} options.startTag - 起始tag + * @param {number} options.startX - 起始X坐标 + * @param {number} options.y - Y坐标 + * @param {number} options.colWidth - 列宽 + * @returns {Array} 创建的精灵ID数组 + * + * @example + * // 创建一行5个精灵 + * var sprites = SpriteCopyUtils.createHorizontalList({ + * parentId: 100, + * templateId: 200, + * count: 5, + * startTag: 1, + * startX: 50, + * y: 100, + * colWidth: 80 + * }); + */ +SpriteCopyUtils.createHorizontalList = function(options) { + return SpriteCopyUtils.createGrid({ + parentId: options.parentId, + templateId: options.templateId, + count: options.count, + startTag: options.startTag, + startX: options.startX, + startY: options.y, + spacingX: options.colWidth, + spacingY: 0, + columns: 0 + }); +}; + +// ============================================================================ +// 属性设置工具 +// ============================================================================ + +/** + * 批量设置子精灵的文字内容 + * + * @param {number} parentId - 父精灵ID + * @param {number} startTag - 起始tag + * @param {Array} texts - 文字内容数组 + * + * @example + * // 设置tag 1-5的文字内容 + * SpriteCopyUtils.setTexts(100, 1, ['第1行', '第2行', '第3行', '第4行', '第5行']); + */ +SpriteCopyUtils.setTexts = function(parentId, startTag, texts) { + for (var i = 0; i < texts.length; i++) { + var spriteId = parentId + 'add' + (startTag + i); + set_self(spriteId, 7, texts[i], 0, 0); + } +}; + +/** + * 批量设置子精灵的帧 + * + * @param {number} parentId - 父精灵ID + * @param {number} startTag - 起始tag + * @param {Array} frames - 帧号数组 + * + * @example + * // 设置tag 1-5的帧 + * SpriteCopyUtils.setFrames(100, 1, [1, 2, 3, 4, 5]); + */ +SpriteCopyUtils.setFrames = function(parentId, startTag, frames) { + for (var i = 0; i < frames.length; i++) { + var spriteId = parentId + 'add' + (startTag + i); + set_self(spriteId, 43, frames[i], 0, 0); + } +}; + +/** + * 批量设置子精灵的可见性 + * + * @param {number} parentId - 父精灵ID + * @param {number} startTag - 起始tag + * @param {number} count - 精灵数量 + * @param {boolean} visible - 是否可见 + * + * @example + * // 隐藏tag 1-10的所有精灵 + * SpriteCopyUtils.setVisibility(100, 1, 10, false); + */ +SpriteCopyUtils.setVisibility = function(parentId, startTag, count, visible) { + for (var i = 0; i < count; i++) { + var spriteId = parentId + 'add' + (startTag + i); + set_self(spriteId, 37, visible ? 1 : 0, 0, 0); + } +}; + +// ============================================================================ +// Tag 管理器 +// ============================================================================ + +/** + * 创建 Tag 管理器 + * 用于管理多种类型精灵的 tag 分配 + * + * @param {Object} ranges - tag 范围配置 + * @returns {Object} Tag 管理器实例 + * + * @example + * // 创建tag管理器 + * var tagManager = SpriteCopyUtils.createTagManager({ + * background: { start: 1, size: 100 }, // 1-100 + * title: { start: 101, size: 100 }, // 101-200 + * button: { start: 201, size: 100 } // 201-300 + * }); + * + * // 获取下一个tag + * var bgTag = tagManager.next('background'); // 返回 1 + * var bgTag2 = tagManager.next('background'); // 返回 2 + * + * // 重置计数器 + * tagManager.reset(); + * + * // 获取某类型的tag范围 + * var range = tagManager.getRange('button'); // { start: 201, end: 301 } + */ +SpriteCopyUtils.createTagManager = function(ranges) { + var counters = {}; + var rangeConfig = {}; + + // 初始化 + var types = Object.keys(ranges); + for (var i = 0; i < types.length; i++) { + var type = types[i]; + var config = ranges[type]; + rangeConfig[type] = { + start: config.start, + end: config.start + config.size + }; + counters[type] = config.start; + } + + return { + /** + * 获取下一个可用的tag + * @param {string} type - 类型名称 + * @returns {number} tag值 + */ + next: function(type) { + if (!counters.hasOwnProperty(type)) { + throw new Error('TagManager: unknown type ' + type); + } + return counters[type]++; + }, + + /** + * 获取当前计数器值(不递增) + * @param {string} type - 类型名称 + * @returns {number} 当前计数器值 + */ + current: function(type) { + return counters[type]; + }, + + /** + * 重置所有计数器 + */ + reset: function() { + for (var t = 0; t < types.length; t++) { + counters[types[t]] = rangeConfig[types[t]].start; + } + }, + + /** + * 重置指定类型的计数器 + * @param {string} type - 类型名称 + */ + resetType: function(type) { + if (rangeConfig.hasOwnProperty(type)) { + counters[type] = rangeConfig[type].start; + } + }, + + /** + * 获取某类型的tag范围 + * @param {string} type - 类型名称 + * @returns {Object} { start, end } + */ + getRange: function(type) { + return rangeConfig[type] ? { + start: rangeConfig[type].start, + end: rangeConfig[type].end + } : null; + }, + + /** + * 获取某类型已分配的tag数量 + * @param {string} type - 类型名称 + * @returns {number} 已分配数量 + */ + getAllocatedCount: function(type) { + return counters[type] - rangeConfig[type].start; + }, + + /** + * 检测tag属于哪个类型 + * @param {number} tag - tag值 + * @returns {string|null} 类型名称,不属于任何类型返回null + */ + getTypeByTag: function(tag) { + for (var t = 0; t < types.length; t++) { + var type = types[t]; + var range = rangeConfig[type]; + if (tag >= range.start && tag < range.end) { + return type; + } + } + return null; + }, + + /** + * 计算tag在其类型中的索引 + * @param {number} tag - tag值 + * @returns {number} 索引,不属于任何类型返回-1 + */ + getIndexByTag: function(tag) { + for (var t = 0; t < types.length; t++) { + var type = types[t]; + var range = rangeConfig[type]; + if (tag >= range.start && tag < range.end) { + return tag - range.start; + } + } + return -1; + } + }; +}; + +// ============================================================================ +// 精灵ID工具 +// ============================================================================ + +/** + * 根据容器ID和tag生成复制精灵的实际ID + * + * 对于通过 SpriteCopyUtils.create() 复制创建的精灵, + * 其实际ID遵循格式:容器精灵ID + 'add' + tag + * + * @param {number} containerId - 容器精灵ID + * @param {number} tag - 子精灵标识符 + * @returns {string} 精灵ID,格式为 "containerIdaddtag" + * + * @example + * // 容器ID为100,tag为20 + * var spriteId = SpriteCopyUtils.getSpriteId(100, 20); + * // 返回: "100add20" + * + * // 可用于获取精灵尺寸、位置等 + * var size = SpriteManager.getSize(spriteId); + * var pos = SpriteManager.getPosition(spriteId); + */ +SpriteCopyUtils.getSpriteId = function(containerId, tag) { + return containerId + 'add' + tag; +}; + +// ============================================================================ +// 导出 +// ============================================================================ + +if (typeof module !== 'undefined' && module.exports) { + module.exports = SpriteCopyUtils; +} else if (typeof window !== 'undefined') { + window.SpriteCopyUtils = SpriteCopyUtils; +} diff --git a/client/js/gameabc-framework/ui/UIManager.js b/client/js/gameabc-framework/ui/UIManager.js new file mode 100644 index 0000000..bc2c9f4 --- /dev/null +++ b/client/js/gameabc-framework/ui/UIManager.js @@ -0,0 +1,607 @@ +/** + * ============================================================================ + * UIManager.js - UI 管理器(gameabc 框架层) + * ============================================================================ + * + * 职责: + * - UI 组件的注册、注销、查询和生命周期管理 + * - 场景定义与切换(BaseComponent 组合的具名快照) + * - 全局公共 UI:Loading / Message / Confirm 对话框 + * + * 设计原则: + * 1. 精灵由 gameabc 编辑器预先创建,UIManager 只控制显示/隐藏状态 + * 2. 本文件不含任何游戏专属逻辑,可用于任何基于 gameabc 的子游戏 + * 3. 游戏层通过挂载方法(UIManager.xxx = function(){})扩展专属功能 + * + * 全局 UI 配置(由子游戏注入,框架不读取任何子游戏全局名): + * 子游戏在初始化时通过 init(config) 或 configureGlobalUI(config) 传入精灵常量: + * config.loadingUI = { LAYER, GROUP_ID, SPRITES: { BACKGROUND, LOADING_ICON, LOADING_TEXT } } + * config.messageUI = { LAYER, GROUP_ID, SPRITES: { BACKGROUND, TEXT } } + * config.confirmUI = { LAYER, GROUP_ID, SPRITES: { BACKGROUND, TITLE_TEXT, MESSAGE_TEXT, BTN_CONFIRM, BTN_CANCEL } } + * 不传则跳过 Loading/Message/Confirm 全局 UI(场景/组件等其余功能不受影响)。 + * + * 依赖(必须在本文件之前加载): + * EventBus (gameabc-framework/system/EventBus.js) + * SpriteManager (gameabc-framework/core/SpriteManager.js) + * + * ============================================================================ + * @guide 游戏侧扩展模式 + * ============================================================================ + * + * 游戏层通过独立 JS 文件向 UIManager 挂载专属方法: + * + * // CreateRoomUI.js(示例) + * (function() { + * 'use strict'; + * var CREATE_ROOM_UI = SpriteConstants.CREATE_ROOM_UI; + * + * UIManager.showCreateRoom = function(config) { + * // 游戏专属逻辑... + * SpriteManager.showGroup(CREATE_ROOM_UI.GROUP_ID); + * }; + * UIManager.hideCreateRoom = function() { + * SpriteManager.hideGroup(CREATE_ROOM_UI.GROUP_ID); + * }; + * })(); + * + * ============================================================================ + * @guide 场景管理完整用法 + * ============================================================================ + * + * // 1. 初始化(在 UIBootstrap 中调用);若有全局 UI,注入其精灵常量(框架不读子游戏全局名): + * UIManager.init({ loadingUI: SpriteConstants.LOADING_UI, messageUI: SpriteConstants.MESSAGE_UI, confirmUI: SpriteConstants.CONFIRM_UI }); + * + * // 2. 注册组件(BaseComponent 实例) + * UIManager.registerComponent('RoomView', roomView); + * UIManager.registerComponent('GameView', gameView); + * + * // 3. 注册场景(关联组件名列表) + * UIManager.registerScene(UIManager.SCENES.ROOM, ['RoomView']); + * UIManager.registerScene(UIManager.SCENES.GAME, ['GameView', 'JingCardView']); + * + * // 4. 切换场景(自动隐藏旧场景,显示新场景,发射 SCENE_CHANGED 事件) + * UIManager.switchToScene(UIManager.SCENES.GAME); + * + * // 5. 全局 UI + * UIManager.showLoading('正在加载...'); + * UIManager.showMessage('操作成功', 2000); + * UIManager.showConfirm('确认', '是否退出?', onOK, onCancel); + * + * @version 1.0.0 + */ + +var UIManager = (function () { + 'use strict'; + + // ==================== 私有变量 ==================== + + /** + * 全局 UI 精灵常量(由子游戏注入:init(config) / configureGlobalUI) + * 框架不读取任何子游戏全局名;未注入时三者为 null,对应全局 UI 不可用(优雅跳过)。 + */ + var LOADING_UI = null; + var MESSAGE_UI = null; + var CONFIRM_UI = null; + + /** + * 已注册的 UI 组件 + * { componentName: BaseComponent 实例 } + */ + var _components = {}; + + /** + * 已注册的场景 + * { sceneName: [componentName, ...] } + */ + var _scenes = {}; + + /** + * 当前活跃场景名 + * @type {string|null} + */ + var _currentScene = null; + + /** + * 初始化状态 + */ + var _isInitialized = false; + + // ==================== 场景枚举 ==================== + + var SCENES = { + ROOM: 'ROOM', + GAME: 'GAME', + LOADING: 'LOADING' + }; + + // ==================== 私有方法 ==================== + + /** + * 应用子游戏注入的全局 UI 配置(Loading/Message/Confirm),并隐藏所有全局弹层。 + * 框架不认识任何子游戏全局名,配置由子游戏在 init()/configureGlobalUI() 时传入。 + * @param {Object} config - { loadingUI, messageUI, confirmUI } + * @returns {boolean} 是否成功配置(缺省或不完整则跳过,返回 false) + * @private + */ + function _applyGlobalUIConfig(config) { + if (!config || !config.loadingUI || !config.messageUI || !config.confirmUI) { + console.warn('[UIManager] 未提供完整的全局 UI 配置(loadingUI/messageUI/confirmUI),跳过全局 UI 初始化'); + return false; + } + + LOADING_UI = config.loadingUI; + MESSAGE_UI = config.messageUI; + CONFIRM_UI = config.confirmUI; + + _initLoadingUI(); + _initMessageUI(); + _initConfirmUI(); + return true; + } + + /** @private */ + function _initLoadingUI() { + SpriteManager.hide(LOADING_UI.SPRITES.BACKGROUND); + SpriteManager.hide(LOADING_UI.SPRITES.LOADING_ICON); + SpriteManager.hide(LOADING_UI.SPRITES.LOADING_TEXT); + SpriteManager.hideGroup(LOADING_UI.GROUP_ID); + console.log('[UIManager] Loading UI 初始化 (Layer ' + LOADING_UI.LAYER + ')'); + } + + /** @private */ + function _initMessageUI() { + SpriteManager.hide(MESSAGE_UI.SPRITES.BACKGROUND); + SpriteManager.hide(MESSAGE_UI.SPRITES.TEXT); + SpriteManager.hideGroup(MESSAGE_UI.GROUP_ID); + console.log('[UIManager] Message UI 初始化 (Layer ' + MESSAGE_UI.LAYER + ')'); + } + + /** @private */ + function _initConfirmUI() { + SpriteManager.hide(CONFIRM_UI.SPRITES.BACKGROUND); + SpriteManager.hide(CONFIRM_UI.SPRITES.TITLE_TEXT); + SpriteManager.hide(CONFIRM_UI.SPRITES.MESSAGE_TEXT); + SpriteManager.hide(CONFIRM_UI.SPRITES.BTN_CONFIRM); + SpriteManager.hide(CONFIRM_UI.SPRITES.BTN_CANCEL); + SpriteManager.hideGroup(CONFIRM_UI.GROUP_ID); + console.log('[UIManager] Confirm UI 初始化 (Layer ' + CONFIRM_UI.LAYER + ')'); + } + + /** + * 隐藏当前场景所有可见组件 + * @private + */ + function _hideCurrentScene() { + if (!_currentScene || !_scenes[_currentScene]) { return; } + var names = _scenes[_currentScene]; + for (var i = 0; i < names.length; i++) { + var c = _components[names[i]]; + if (c && c.isVisible) { c.hide(); } + } + } + + /** + * 显示指定场景的所有组件 + * @private + */ + function _showScene(sceneName) { + if (!_scenes[sceneName]) { + console.error('[UIManager] 场景不存在:', sceneName); + return; + } + var names = _scenes[sceneName]; + for (var i = 0; i < names.length; i++) { + var c = _components[names[i]]; + if (c && !c.isVisible) { c.show(); } + } + } + + // ==================== 公共 API ==================== + + var publicAPI = { + + /** + * 场景枚举常量 + */ + SCENES: SCENES, + + /** + * 是否已初始化(外部只读) + */ + initialized: false, + + // ============================================================ + // 初始化 / 销毁 + // ============================================================ + + /** + * 初始化 UIManager + * @param {Object} [globalUIConfig] - 可选的全局 UI 配置 { loadingUI, messageUI, confirmUI }, + * 由子游戏传入(如各自的精灵常量);框架不主动读取任何子游戏全局名。 + * 不传则跳过 Loading/Message/Confirm 全局 UI(可后续用 configureGlobalUI 配置)。 + * @returns {boolean} + */ + init: function (globalUIConfig) { + if (_isInitialized) { + console.warn('[UIManager] 已初始化,跳过'); + return true; + } + + console.log('[UIManager] 初始化 (v1.0.0)'); + + try { + _components = {}; + _scenes = {}; + _currentScene = null; + + // 全局 UI 为可选能力:未注入配置则跳过,不阻断 UIManager 初始化 + if (globalUIConfig) { _applyGlobalUIConfig(globalUIConfig); } + + _isInitialized = true; + this.initialized = true; + console.log('[UIManager] 初始化完成'); + return true; + } catch (err) { + console.error('[UIManager] 初始化失败:', err); + return false; + } + }, + + /** + * 配置全局 UI(Loading/Message/Confirm)的精灵常量。供子游戏注入,可在 init 之后单独调用。 + * @param {Object} config - { loadingUI, messageUI, confirmUI } + * @returns {boolean} + */ + configureGlobalUI: function (config) { + return _applyGlobalUIConfig(config); + }, + + // ============================================================ + // 组件管理 + // ============================================================ + + /** + * 注册 UI 组件 + * @param {string} name - 组件名称 + * @param {Object} component - BaseComponent 实例(必须已 init) + * @returns {boolean} + */ + registerComponent: function (name, component) { + if (!name || typeof name !== 'string') { + console.error('[UIManager] registerComponent: name 必须是字符串'); + return false; + } + if (!component || !component.isInitialized) { + console.error('[UIManager] registerComponent: 组件未初始化:', name); + return false; + } + if (_components[name]) { + console.warn('[UIManager] registerComponent: 覆盖已存在组件:', name); + } + _components[name] = component; + console.log('[UIManager] 注册组件 "' + name + '"'); + return true; + }, + + /** + * 获取已注册组件 + * @param {string} name + * @returns {Object|null} + */ + getComponent: function (name) { + return _components[name] || null; + }, + + /** + * 注销组件(不销毁,只从注册表移除) + * @param {string} name + * @returns {boolean} + */ + unregisterComponent: function (name) { + if (!_components[name]) { + console.warn('[UIManager] unregisterComponent: 组件不存在:', name); + return false; + } + var c = _components[name]; + if (c.isVisible) { c.hide(); } + delete _components[name]; + console.log('[UIManager] 注销组件 "' + name + '"'); + return true; + }, + + /** + * 销毁组件(调用 component.destroy() 并移除) + * @param {string} name + * @returns {boolean} + */ + destroyComponent: function (name) { + if (!_components[name]) { + console.warn('[UIManager] destroyComponent: 组件不存在:', name); + return false; + } + _components[name].destroy(); + delete _components[name]; + console.log('[UIManager] 销毁组件 "' + name + '"'); + return true; + }, + + /** + * 显示指定视图(便捷方法) + * @param {string} name + */ + showView: function (name) { + var c = _components[name]; + if (!c) { console.warn('[UIManager] showView: 组件不存在:', name); return; } + c.show(); + }, + + /** + * 隐藏指定视图(便捷方法) + * @param {string} name + */ + hideView: function (name) { + var c = _components[name]; + if (!c) { console.warn('[UIManager] hideView: 组件不存在:', name); return; } + c.hide(); + }, + + // ============================================================ + // 场景管理 + // ============================================================ + + /** + * 注册场景 + * @param {string} sceneName + * @param {string[]} componentNames - 该场景包含的组件名列表 + * @returns {boolean} + */ + registerScene: function (sceneName, componentNames) { + if (!sceneName || typeof sceneName !== 'string') { + console.error('[UIManager] registerScene: sceneName 必须是字符串'); + return false; + } + if (!Array.isArray(componentNames)) { + console.error('[UIManager] registerScene: componentNames 必须是数组'); + return false; + } + for (var i = 0; i < componentNames.length; i++) { + if (!_components[componentNames[i]]) { + console.error('[UIManager] registerScene: 组件不存在:', componentNames[i]); + return false; + } + } + _scenes[sceneName] = componentNames; + console.log('[UIManager] 注册场景 "' + sceneName + '" (' + componentNames.length + ' 个组件)'); + return true; + }, + + /** + * 切换到指定场景 + * 自动隐藏当前场景,显示新场景,发射 EventBus.Events.SCENE_CHANGED + * @param {string} sceneName + * @returns {boolean} + */ + switchToScene: function (sceneName) { + if (!_scenes[sceneName]) { + console.error('[UIManager] switchToScene: 场景不存在:', sceneName); + return false; + } + if (_currentScene === sceneName) { + return true; + } + + console.log('[UIManager] 切换场景 "' + (_currentScene || 'null') + '" → "' + sceneName + '"'); + _hideCurrentScene(); + _showScene(sceneName); + + var oldScene = _currentScene; + _currentScene = sceneName; + + EventBus.emit(EventBus.Events.SCENE_CHANGED, { from: oldScene, to: sceneName }); + return true; + }, + + /** + * 获取当前场景名 + * @returns {string|null} + */ + getCurrentScene: function () { + return _currentScene; + }, + + // ============================================================ + // 全局 UI - Loading + // ============================================================ + + /** + * 显示加载界面 + * @param {string} [message='加载中...'] + */ + showLoading: function (message) { + if (!LOADING_UI) { return; } + message = message || '加载中...'; + SpriteManager.setText(LOADING_UI.SPRITES.LOADING_TEXT, message); + SpriteManager.show(LOADING_UI.SPRITES.BACKGROUND); + SpriteManager.show(LOADING_UI.SPRITES.LOADING_ICON); + SpriteManager.show(LOADING_UI.SPRITES.LOADING_TEXT); + SpriteManager.showGroup(LOADING_UI.GROUP_ID); + }, + + /** + * 隐藏加载界面 + */ + hideLoading: function () { + if (!LOADING_UI) { return; } + SpriteManager.hide(LOADING_UI.SPRITES.BACKGROUND); + SpriteManager.hide(LOADING_UI.SPRITES.LOADING_ICON); + SpriteManager.hide(LOADING_UI.SPRITES.LOADING_TEXT); + SpriteManager.hideGroup(LOADING_UI.GROUP_ID); + }, + + // ============================================================ + // 全局 UI - Message + // ============================================================ + + /** + * 显示轻提示(Toast,无精灵,仅 console) + * @param {string} message + */ + showToast: function (message) { + console.log('[UIManager] Toast:', message); + }, + + /** + * 显示一个带标签的提示效果(Toast 形式,通用,不含任何玩法语义) + * @param {string} tag - 效果标签(仅用于日志区分,由调用方自定义) + * @param {string} title - 提示标题 + * @param {string} [description] - 补充说明 + */ + showEffectToast: function (tag, title, description) { + var msg = description ? (title + ':' + description) : title; + console.log('[UIManager] EffectToast [' + tag + ']:', msg); + this.showToast(msg); + }, + + /** + * 显示消息提示(自动隐藏) + * @param {string} message + * @param {number} [duration=2000] 毫秒 + */ + showMessage: function (message, duration) { + if (!MESSAGE_UI || !message) { return; } + duration = duration || 2000; + SpriteManager.setText(MESSAGE_UI.SPRITES.TEXT, message); + SpriteManager.show(MESSAGE_UI.SPRITES.BACKGROUND); + SpriteManager.show(MESSAGE_UI.SPRITES.TEXT); + SpriteManager.showGroup(MESSAGE_UI.GROUP_ID); + var self = this; + setTimeout(function () { self.hideMessage(); }, duration); + }, + + /** + * 隐藏消息提示 + */ + hideMessage: function () { + if (!MESSAGE_UI) { return; } + SpriteManager.hide(MESSAGE_UI.SPRITES.BACKGROUND); + SpriteManager.hide(MESSAGE_UI.SPRITES.TEXT); + SpriteManager.hideGroup(MESSAGE_UI.GROUP_ID); + }, + + // ============================================================ + // 全局 UI - Confirm + // ============================================================ + + /** + * 显示确认对话框 + * @param {string} title + * @param {string} message + * @param {Function} [onConfirm] + * @param {Function} [onCancel] + */ + showConfirm: function (title, message, onConfirm, onCancel) { + if (!CONFIRM_UI || !message) { return; } + title = title || '确认'; + SpriteManager.setText(CONFIRM_UI.SPRITES.TITLE_TEXT, title); + SpriteManager.setText(CONFIRM_UI.SPRITES.MESSAGE_TEXT, message); + SpriteManager.show(CONFIRM_UI.SPRITES.BACKGROUND); + SpriteManager.show(CONFIRM_UI.SPRITES.TITLE_TEXT); + SpriteManager.show(CONFIRM_UI.SPRITES.MESSAGE_TEXT); + SpriteManager.show(CONFIRM_UI.SPRITES.BTN_CONFIRM); + SpriteManager.show(CONFIRM_UI.SPRITES.BTN_CANCEL); + SpriteManager.showGroup(CONFIRM_UI.GROUP_ID); + // 回调通过全局变量传递(gameabc 引擎通过点击事件触发) + window._confirmCallback = { onConfirm: onConfirm, onCancel: onCancel }; + }, + + /** + * 隐藏确认对话框 + */ + hideConfirm: function () { + if (!CONFIRM_UI) { return; } + SpriteManager.hide(CONFIRM_UI.SPRITES.BACKGROUND); + SpriteManager.hide(CONFIRM_UI.SPRITES.TITLE_TEXT); + SpriteManager.hide(CONFIRM_UI.SPRITES.MESSAGE_TEXT); + SpriteManager.hide(CONFIRM_UI.SPRITES.BTN_CONFIRM); + SpriteManager.hide(CONFIRM_UI.SPRITES.BTN_CANCEL); + SpriteManager.hideGroup(CONFIRM_UI.GROUP_ID); + if (window._confirmCallback) { delete window._confirmCallback; } + }, + + // ============================================================ + // 工具方法 + // ============================================================ + + /** + * 获取所有已注册组件名称 + * @returns {string[]} + */ + getRegisteredComponents: function () { + var names = []; + for (var n in _components) { + if (_components.hasOwnProperty(n)) { names.push(n); } + } + return names; + }, + + /** + * 获取所有已注册场景名称 + * @returns {string[]} + */ + getRegisteredScenes: function () { + var names = []; + for (var n in _scenes) { + if (_scenes.hasOwnProperty(n)) { names.push(n); } + } + return names; + }, + + /** + * 获取当前状态快照 + * @returns {Object} + */ + getState: function () { + return { + isInitialized: _isInitialized, + currentScene: _currentScene, + componentCount: Object.keys(_components).length, + sceneCount: Object.keys(_scenes).length, + components: this.getRegisteredComponents(), + scenes: this.getRegisteredScenes() + }; + }, + + /** + * 打印状态(调试用) + */ + printState: function () { + console.log('[UIManager] 状态:', JSON.stringify(this.getState(), null, 2)); + }, + + /** + * 销毁 UIManager(销毁所有组件并重置状态) + */ + destroy: function () { + console.log('[UIManager] 开始销毁'); + for (var name in _components) { + if (_components.hasOwnProperty(name)) { this.destroyComponent(name); } + } + this.hideLoading(); + this.hideMessage(); + this.hideConfirm(); + _components = {}; + _scenes = {}; + _currentScene = null; + _isInitialized = false; + this.initialized = false; + console.log('[UIManager] 销毁完成'); + } + }; + + return publicAPI; + +})(); + +if (typeof module !== 'undefined' && module.exports) { + module.exports = UIManager; +} diff --git a/client/js/gamemain.js b/client/js/gamemain.js new file mode 100644 index 0000000..8f39d85 --- /dev/null +++ b/client/js/gamemain.js @@ -0,0 +1,336 @@ +var gameabc_face = gameabc_face||{}; +{ +gameabc_face.tag=12; //定义你的游戏全局内存 +gameabc_face.tag1=123;//定义你的游戏全局内存 +gameabc_face.tag2=123;//定义你的游戏全局内存 +gameabc_face.tag3=123;//定义你的游戏全局内存 +gameabc_face.dfwgao=1; +} + +gameabc_face.gamestart=function(gameid) +{ +//游戏初始化代码 + + Logic.AppStart(); + +}; + +gameabc_face.ani_doend=function(id,sx,count,allend) +{ + //logmessage(id+"/"+sx+"/"+count+"/"+allend); + //play_ani(0,2,18,50,200,0,1000,0,0,0,0,6000,1);//主动关闭 + GameUI.utlani_doend(id,sx,count,allend); + gameCombat.utlani_doend(id,sx,count,allend); +}; + +gameabc_face.box_doend=function(id,sx,timelen) +{ + //play_box 结束事件 + //showmessage("box_doend:"+id+"/"+sx+"/"+timelen); + //logmessage("box_doend:"+id+"/"+sx+"/"+timelen); +}; + +gameabc_face.onloadurl=function(recid,rectype,url,error,count,len) +{ + + GameUI.onloadurl(recid,rectype,url,error,count,len); + + +}; + +gameabc_face.chongzhi=function(userid,zt,data) +{ +//游戏接口代码 + +}; + +gameabc_face.onresize=function(pmw/*屏幕宽*/,pmh/*屏幕宽*/,sjweww/*设计宽*/,sjnewh/*设计宽*/,nweww/*显示宽*/,newh/*显示高*/) +{ + + //屏幕变化 + // 在此调整 列表控件的宽高和区域 不是整体缩放 + //logmessage("onresize:"+pmw+"/"+pmh+"/"+sjweww+"/"+sjnewh+"/"+nweww+"/"+newh); +}; + +gameabc_face.gamebegindraw=function(gameid, spid, times, timelong) +{ + //更新开始代码 + GameUI.utlgamebegindraw(gameid, spid, times, timelong); +}; +gameabc_face.gameenddraw=function(gameid, spid, times, timelong) +{ +//更新完成代码 + GameUI.gameenddraw(gameid, spid, times, timelong); +}; + +gameabc_face.mousedown=function(gameid, spid, downx, downy, no1, no2, no3, no4, no5, no6) +{ + + //点击代码 + GameUI.utlmousedown(gameid, spid, downx, downy, no1, no2, no3, no4, no5, no6); + Game_Modify.utlmousedown(gameid, spid, downx, downy, no1, no2, no3, no4, no5, no6); + gameCombat.utlmousedown(gameid, spid, downx, downy, no1, no2, no3, no4, no5, no6); + +}; + +gameabc_face.mousedown_nomove=function(gameid, spid, downx, downy, timelong, no1, no2, no3, no4, no5) +{ +//点击代没移动代码 + GameUI.utlmousedown_nomove(gameid, spid, downx, downy, timelong, no1, no2, no3, no4, no5); + Game_Modify.utlmousedown_nomove(gameid, spid, downx, downy, timelong, no1, no2, no3, no4, no5); +}; + +gameabc_face.mouseup=function(gameid, spid_down, downx, downy, spid_up, upx, upy, timelong, no1, no2) +{ +//点击弹起代码 +//可以通过spid_down和spid_up 的比较 来判断是 点击还是 移动 + GameUI.utlmouseup(gameid, spid_down, downx, downy, spid_up, upx, upy, timelong, no1, no2); + Game_Modify.mouseup(gameid, spid_down, downx, downy, spid_up, upx, upy, timelong, no1, no2); + gameCombat.utlmouseup(gameid, spid_down, downx, downy, spid_up, upx, upy, timelong, no1, no2); + +}; + +gameabc_face.mousemove=function(gameid, spid, downx, downy, movex,movey ,timelong,offmovex, offmovey, no1) +{ +//点击后移动代码 + + + GameUI.utlmousemove(gameid, spid, downx, downy, movex,movey ,timelong,offmovex, offmovey, no1); + Game_Modify.utlmousemove(gameid, spid, downx, downy, movex,movey ,timelong,offmovex, offmovey, no1); + gameCombat.utlmousemove(gameid, spid, downx, downy, movex,movey ,timelong,offmovex, offmovey, no1); +}; + +gameabc_face.gamemydraw=function(gameid, spid, times, timelong, no2, no3, no4, no5, no6, no7) +{ + //每个精灵更新绘画代码 + GameUI.utlgamemydraw(gameid, spid, times, timelong, no2, no3, no4, no5, no6, no7); + Game_Modify.gamemydraw(gameid, spid, times, timelong, no2, no3, no4, no5, no6, no7); + gameCombat.utlgamemydraw(gameid, spid, times, timelong, no2, no3, no4, no5, no6, no7); +}; + +gameabc_face.gamemydrawbegin=function(gameid, spid, times, timelong, no2, no3, no4, no5, no6, no7) +{ +//每个精灵更新前绘画代码 + GameUI.utlgamemydrawbegin(gameid, spid, times, timelong, no2, no3, no4, no5, no6, no7); + Game_Modify.utlgamemydrawbegin(gameid, spid, times, timelong, no2, no3, no4, no5, no6, no7); + gameCombat.utlgamemydrawbegin(gameid, spid, times, timelong, no2, no3, no4, no5, no6, no7); +}; + +gameabc_face.ontimer= function(gameid, spid, /* 本次间隔多少次了 */ times, /* 本次间隔多久 */ timelong,/* 开启后运行多少次了 */ alltimes){ + + + GameUI.utlontimer(gameid, spid, /* 本次间隔多少次了 */ times, /* 本次间隔多久 */ timelong,/* 开启后运行多少次了 */ alltimes); +}; + +gameabc_face.tcpconnected=function(tcpid) +{ + +}; +gameabc_face.tcpmessage=function(tcpid,data) +{ +; + +}; + +gameabc_face.tcpdisconnected=function(tcpid) +{ + + + +}; +gameabc_face.tcperror=function(tcpid,data) +{ + + +}; + +gameabc_face.httpmessage=function(myid,url,data) +{ + + +}; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/js/jweixin-1.2.0.js b/client/js/jweixin-1.2.0.js new file mode 100644 index 0000000..fd80ab0 --- /dev/null +++ b/client/js/jweixin-1.2.0.js @@ -0,0 +1 @@ +!function(a,b){"function"==typeof define&&(define.amd||define.cmd)?define(function(){return b(a)}):b(a,!0)}(this,function(a,b){function c(b,c,d){a.WeixinJSBridge?WeixinJSBridge.invoke(b,e(c),function(a){h(b,a,d)}):k(b,d)}function d(b,c,d){a.WeixinJSBridge?WeixinJSBridge.on(b,function(a){d&&d.trigger&&d.trigger(a),h(b,a,c)}):d?k(b,d):k(b,c)}function e(a){return a=a||{},a.appId=D.appId,a.verifyAppId=D.appId,a.verifySignType="sha1",a.verifyTimestamp=D.timestamp+"",a.verifyNonceStr=D.nonceStr,a.verifySignature=D.signature,a}function f(a){return{timeStamp:a.timestamp+"",nonceStr:a.nonceStr,"package":a["package"],paySign:a.paySign,signType:a.signType||"SHA1"}}function g(a){return a.postalCode=a.addressPostalCode,delete a.addressPostalCode,a.provinceName=a.proviceFirstStageName,delete a.proviceFirstStageName,a.cityName=a.addressCitySecondStageName,delete a.addressCitySecondStageName,a.countryName=a.addressCountiesThirdStageName,delete a.addressCountiesThirdStageName,a.detailInfo=a.addressDetailInfo,delete a.addressDetailInfo,a}function h(a,b,c){"openEnterpriseChat"==a&&(b.errCode=b.err_code),delete b.err_code,delete b.err_desc,delete b.err_detail;var d=b.errMsg;d||(d=b.err_msg,delete b.err_msg,d=i(a,d),b.errMsg=d),c=c||{},c._complete&&(c._complete(b),delete c._complete),d=b.errMsg||"",D.debug&&!c.isInnerInvoke&&alert(JSON.stringify(b));var e=d.indexOf(":"),f=d.substring(e+1);switch(f){case"ok":c.success&&c.success(b);break;case"cancel":c.cancel&&c.cancel(b);break;default:c.fail&&c.fail(b)}c.complete&&c.complete(b)}function i(a,b){var c=a,d=q[c];d&&(c=d);var e="ok";if(b){var f=b.indexOf(":");e=b.substring(f+1),"confirm"==e&&(e="ok"),"failed"==e&&(e="fail"),-1!=e.indexOf("failed_")&&(e=e.substring(7)),-1!=e.indexOf("fail_")&&(e=e.substring(5)),e=e.replace(/_/g," "),e=e.toLowerCase(),("access denied"==e||"no permission to execute"==e)&&(e="permission denied"),"config"==c&&"function not exist"==e&&(e="ok"),""==e&&(e="fail")}return b=c+":"+e}function j(a){if(a){for(var b=0,c=a.length;c>b;++b){var d=a[b],e=p[d];e&&(a[b]=e)}return a}}function k(a,b){if(!(!D.debug||b&&b.isInnerInvoke)){var c=q[a];c&&(a=c),b&&b._complete&&delete b._complete,console.log('"'+a+'",',b||"")}}function l(a){if(!(v||w||D.debug||"6.0.2">A||C.systemType<0)){var b=new Image;C.appId=D.appId,C.initTime=B.initEndTime-B.initStartTime,C.preVerifyTime=B.preVerifyEndTime-B.preVerifyStartTime,I.getNetworkType({isInnerInvoke:!0,success:function(a){C.networkType=a.networkType;var c="https://open.weixin.qq.com/sdk/report?v="+C.version+"&o="+C.isPreVerifyOk+"&s="+C.systemType+"&c="+C.clientVersion+"&a="+C.appId+"&n="+C.networkType+"&i="+C.initTime+"&p="+C.preVerifyTime+"&u="+C.url;b.src=c}})}}function m(){return(new Date).getTime()}function n(b){x&&(a.WeixinJSBridge?b():r.addEventListener&&r.addEventListener("WeixinJSBridgeReady",b,!1))}function o(){I.invoke||(I.invoke=function(b,c,d){a.WeixinJSBridge&&WeixinJSBridge.invoke(b,e(c),d)},I.on=function(b,c){a.WeixinJSBridge&&WeixinJSBridge.on(b,c)})}if(!a.jWeixin){var p={config:"preVerifyJSAPI",onMenuShareTimeline:"menu:share:timeline",onMenuShareAppMessage:"menu:share:appmessage",onMenuShareQQ:"menu:share:qq",onMenuShareWeibo:"menu:share:weiboApp",onMenuShareQZone:"menu:share:QZone",previewImage:"imagePreview",getLocation:"geoLocation",openProductSpecificView:"openProductViewWithPid",addCard:"batchAddCard",openCard:"batchViewCard",chooseWXPay:"getBrandWCPayRequest",openEnterpriseRedPacket:"getRecevieBizHongBaoRequest",startSearchBeacons:"startMonitoringBeacons",stopSearchBeacons:"stopMonitoringBeacons",onSearchBeacons:"onBeaconsInRange",consumeAndShareCard:"consumedShareCard",openAddress:"editAddress"},q=function(){var a={};for(var b in p)a[p[b]]=b;return a}(),r=a.document,s=r.title,t=navigator.userAgent.toLowerCase(),u=navigator.platform.toLowerCase(),v=!(!u.match("mac")&&!u.match("win")),w=-1!=t.indexOf("wxdebugger"),x=-1!=t.indexOf("micromessenger"),y=-1!=t.indexOf("android"),z=-1!=t.indexOf("iphone")||-1!=t.indexOf("ipad"),A=function(){var a=t.match(/micromessenger\/(\d+\.\d+\.\d+)/)||t.match(/micromessenger\/(\d+\.\d+)/);return a?a[1]:""}(),B={initStartTime:m(),initEndTime:0,preVerifyStartTime:0,preVerifyEndTime:0},C={version:1,appId:"",initTime:0,preVerifyTime:0,networkType:"",isPreVerifyOk:1,systemType:z?1:y?2:-1,clientVersion:A,url:encodeURIComponent(location.href)},D={},E={_completes:[]},F={state:0,data:{}};n(function(){B.initEndTime=m()});var G=!1,H=[],I={config:function(a){D=a,k("config",a);var b=D.check===!1?!1:!0;n(function(){if(b)c(p.config,{verifyJsApiList:j(D.jsApiList)},function(){E._complete=function(a){B.preVerifyEndTime=m(),F.state=1,F.data=a},E.success=function(a){C.isPreVerifyOk=0},E.fail=function(a){E._fail?E._fail(a):F.state=-1};var a=E._completes;return a.push(function(){l()}),E.complete=function(b){for(var c=0,d=a.length;d>c;++c)a[c]();E._completes=[]},E}()),B.preVerifyStartTime=m();else{F.state=1;for(var a=E._completes,d=0,e=a.length;e>d;++d)a[d]();E._completes=[]}}),D.beta&&o()},ready:function(a){0!=F.state?a():(E._completes.push(a),!x&&D.debug&&a())},error:function(a){"6.0.2">A||(-1==F.state?a(F.data):E._fail=a)},checkJsApi:function(a){var b=function(a){var b=a.checkResult;for(var c in b){var d=q[c];d&&(b[d]=b[c],delete b[c])}return a};c("checkJsApi",{jsApiList:j(a.jsApiList)},function(){return a._complete=function(a){if(y){var c=a.checkResult;c&&(a.checkResult=JSON.parse(c))}a=b(a)},a}())},onMenuShareTimeline:function(a){d(p.onMenuShareTimeline,{complete:function(){c("shareTimeline",{title:a.title||s,desc:a.title||s,img_url:a.imgUrl||"",link:a.link||location.href,type:a.type||"link",data_url:a.dataUrl||""},a)}},a)},onMenuShareAppMessage:function(a){d(p.onMenuShareAppMessage,{complete:function(){c("sendAppMessage",{title:a.title||s,desc:a.desc||"",link:a.link||location.href,img_url:a.imgUrl||"",type:a.type||"link",data_url:a.dataUrl||""},a)}},a)},onMenuShareQQ:function(a){d(p.onMenuShareQQ,{complete:function(){c("shareQQ",{title:a.title||s,desc:a.desc||"",img_url:a.imgUrl||"",link:a.link||location.href},a)}},a)},onMenuShareWeibo:function(a){d(p.onMenuShareWeibo,{complete:function(){c("shareWeiboApp",{title:a.title||s,desc:a.desc||"",img_url:a.imgUrl||"",link:a.link||location.href},a)}},a)},onMenuShareQZone:function(a){d(p.onMenuShareQZone,{complete:function(){c("shareQZone",{title:a.title||s,desc:a.desc||"",img_url:a.imgUrl||"",link:a.link||location.href},a)}},a)},startRecord:function(a){c("startRecord",{},a)},stopRecord:function(a){c("stopRecord",{},a)},onVoiceRecordEnd:function(a){d("onVoiceRecordEnd",a)},playVoice:function(a){c("playVoice",{localId:a.localId},a)},pauseVoice:function(a){c("pauseVoice",{localId:a.localId},a)},stopVoice:function(a){c("stopVoice",{localId:a.localId},a)},onVoicePlayEnd:function(a){d("onVoicePlayEnd",a)},uploadVoice:function(a){c("uploadVoice",{localId:a.localId,isShowProgressTips:0==a.isShowProgressTips?0:1},a)},downloadVoice:function(a){c("downloadVoice",{serverId:a.serverId,isShowProgressTips:0==a.isShowProgressTips?0:1},a)},translateVoice:function(a){c("translateVoice",{localId:a.localId,isShowProgressTips:0==a.isShowProgressTips?0:1},a)},chooseImage:function(a){c("chooseImage",{scene:"1|2",count:a.count||9,sizeType:a.sizeType||["original","compressed"],sourceType:a.sourceType||["album","camera"]},function(){return a._complete=function(a){if(y){var b=a.localIds;b&&(a.localIds=JSON.parse(b))}},a}())},getLocation:function(a){},previewImage:function(a){c(p.previewImage,{current:a.current,urls:a.urls},a)},uploadImage:function(a){c("uploadImage",{localId:a.localId,isShowProgressTips:0==a.isShowProgressTips?0:1},a)},downloadImage:function(a){c("downloadImage",{serverId:a.serverId,isShowProgressTips:0==a.isShowProgressTips?0:1},a)},getLocalImgData:function(a){G===!1?(G=!0,c("getLocalImgData",{localId:a.localId},function(){return a._complete=function(a){if(G=!1,H.length>0){var b=H.shift();wx.getLocalImgData(b)}},a}())):H.push(a)},getNetworkType:function(a){var b=function(a){var b=a.errMsg;a.errMsg="getNetworkType:ok";var c=a.subtype;if(delete a.subtype,c)a.networkType=c;else{var d=b.indexOf(":"),e=b.substring(d+1);switch(e){case"wifi":case"edge":case"wwan":a.networkType=e;break;default:a.errMsg="getNetworkType:fail"}}return a};c("getNetworkType",{},function(){return a._complete=function(a){a=b(a)},a}())},openLocation:function(a){c("openLocation",{latitude:a.latitude,longitude:a.longitude,name:a.name||"",address:a.address||"",scale:a.scale||28,infoUrl:a.infoUrl||""},a)},getLocation:function(a){a=a||{},c(p.getLocation,{type:a.type||"wgs84"},function(){return a._complete=function(a){delete a.type},a}())},hideOptionMenu:function(a){c("hideOptionMenu",{},a)},showOptionMenu:function(a){c("showOptionMenu",{},a)},closeWindow:function(a){a=a||{},c("closeWindow",{},a)},hideMenuItems:function(a){c("hideMenuItems",{menuList:a.menuList},a)},showMenuItems:function(a){c("showMenuItems",{menuList:a.menuList},a)},hideAllNonBaseMenuItem:function(a){c("hideAllNonBaseMenuItem",{},a)},showAllNonBaseMenuItem:function(a){c("showAllNonBaseMenuItem",{},a)},scanQRCode:function(a){a=a||{},c("scanQRCode",{needResult:a.needResult||0,scanType:a.scanType||["qrCode","barCode"]},function(){return a._complete=function(a){if(z){var b=a.resultStr;if(b){var c=JSON.parse(b);a.resultStr=c&&c.scan_code&&c.scan_code.scan_result}}},a}())},openAddress:function(a){c(p.openAddress,{},function(){return a._complete=function(a){a=g(a)},a}())},openProductSpecificView:function(a){c(p.openProductSpecificView,{pid:a.productId,view_type:a.viewType||0,ext_info:a.extInfo},a)},addCard:function(a){for(var b=a.cardList,d=[],e=0,f=b.length;f>e;++e){var g=b[e],h={card_id:g.cardId,card_ext:g.cardExt};d.push(h)}c(p.addCard,{card_list:d},function(){return a._complete=function(a){var b=a.card_list;if(b){b=JSON.parse(b);for(var c=0,d=b.length;d>c;++c){var e=b[c];e.cardId=e.card_id,e.cardExt=e.card_ext,e.isSuccess=e.is_succ?!0:!1,delete e.card_id,delete e.card_ext,delete e.is_succ}a.cardList=b,delete a.card_list}},a}())},chooseCard:function(a){c("chooseCard",{app_id:D.appId,location_id:a.shopId||"",sign_type:a.signType||"SHA1",card_id:a.cardId||"",card_type:a.cardType||"",card_sign:a.cardSign,time_stamp:a.timestamp+"",nonce_str:a.nonceStr},function(){return a._complete=function(a){a.cardList=a.choose_card_info,delete a.choose_card_info},a}())},openCard:function(a){for(var b=a.cardList,d=[],e=0,f=b.length;f>e;++e){var g=b[e],h={card_id:g.cardId,code:g.code};d.push(h)}c(p.openCard,{card_list:d},a)},consumeAndShareCard:function(a){c(p.consumeAndShareCard,{consumedCardId:a.cardId,consumedCode:a.code},a)},chooseWXPay:function(a){c(p.chooseWXPay,f(a),a)},openEnterpriseRedPacket:function(a){c(p.openEnterpriseRedPacket,f(a),a)},startSearchBeacons:function(a){c(p.startSearchBeacons,{ticket:a.ticket},a)},stopSearchBeacons:function(a){c(p.stopSearchBeacons,{},a)},onSearchBeacons:function(a){d(p.onSearchBeacons,a)},openEnterpriseChat:function(a){c("openEnterpriseChat",{useridlist:a.userIds,chatname:a.groupName},a)}},J=1,K={};return r.addEventListener("error",function(a){if(!y){var b=a.target,c=b.tagName,d=b.src;if("IMG"==c||"VIDEO"==c||"AUDIO"==c||"SOURCE"==c){var e=-1!=d.indexOf("wxlocalresource://");if(e){a.preventDefault(),a.stopPropagation();var f=b["wx-id"];if(f||(f=J++,b["wx-id"]=f),K[f])return;K[f]=!0,wx.ready(function(){wx.getLocalImgData({localId:d,success:function(a){b.src=a.localData}})})}}}},!0),r.addEventListener("load",function(a){if(!y){var b=a.target,c=b.tagName;b.src;if("IMG"==c||"VIDEO"==c||"AUDIO"==c||"SOURCE"==c){var d=b["wx-id"];d&&(K[d]=!1)}}},!0),b&&(a.wx=a.jWeixin=I),I}}); \ No newline at end of file diff --git a/client/js/vendor/gameabc.min.js b/client/js/vendor/gameabc.min.js new file mode 100644 index 0000000..a561ba8 --- /dev/null +++ b/client/js/vendor/gameabc.min.js @@ -0,0 +1,5544 @@ +var gameabc_senderror = 0; +var gameabc = function() { + function s(SIt2, L$qig3, Qf4) { + var PzF5, IKcga6, d7; + for (IKcga6 = 0; IKcga6 < 30; IKcga6++) + for (PzF5 = 0; PzF5 < 73; PzF5++) + d7 = (PzF5 + IKcga6 * 74) * 4, + SIt2[d7] = SIt2[d7 + 4], + SIt2[d7 + 1] = SIt2[d7 + 5], + SIt2[d7 + 2] = SIt2[d7 + 6]; + for (IKcga6 = 0; IKcga6 < 30; IKcga6++) + d7 = (73 + IKcga6 * 74) * 4, + IKcga6 < L$qig3 ? (SIt2[d7] = b[Qf4]["\x62\x67"]["\x72"], + SIt2[d7 + 1] = b[Qf4]["\x62\x67"]["\x67"], + SIt2[d7 + 2] = b[Qf4]["\x62\x67"]["\x62"]) : (SIt2[d7] = b[Qf4]["\x66\x67"]["\x72"], + SIt2[d7 + 1] = b[Qf4]["\x66\x67"]["\x67"], + SIt2[d7 + 2] = b[Qf4]["\x66\x67"]["\x62"]) + } + var s8 = 0, QTsilt9 = 2, grEpoZ10, hZ11 = 0, _kO12 = (new window["\x44\x61\x74\x65"])["\x67\x65\x74\x54\x69\x6d\x65"](), D13 = _kO12, hPuk14 = _kO12, nogIEsi15 = 0, aGfBpM_16 = 1E3, pIipoKbeZ17 = 0, ESmULEmZ18, MC$T19, CwNEUSu20, _21, eg$MBfn22, blcZCzThy23 = 0, T24 = 1E3, $zRe25 = 0, kvje26, K27, $28, BZEK29, alOujP30 = 0, yj31 = 1E3, DiXUY32 = 0, uMlB33, dcngJtbw34, wMVlPSdU35, LkrwEFr36, qppYSsGe37 = { + fps: { + bg: { + s8: 16, + grEpoZ10: 16, + qppYSsGe37: 48 + }, + fg: { + s8: 0, + grEpoZ10: 255, + qppYSsGe37: 255 + } + }, + ms: { + bg: { + s8: 16, + grEpoZ10: 48, + qppYSsGe37: 16 + }, + fg: { + s8: 0, + grEpoZ10: 255, + qppYSsGe37: 0 + } + }, + mb: { + bg: { + s8: 48, + grEpoZ10: 16, + qppYSsGe37: 26 + }, + fg: { + s8: 255, + grEpoZ10: 0, + qppYSsGe37: 128 + } + } + }; + grEpoZ10 = window["\x64\x6f\x63\x75\x6d\x65\x6e\x74"]["\x63\x72\x65\x61\x74\x65\x45\x6c\x65\x6d\x65\x6e\x74"]("\x64\x69\x76"); + grEpoZ10["\x63\x6c\x61\x73\x73\x4e\x61\x6d\x65"] = "\x73\x74\x61\x74\x73"; + grEpoZ10["\x73\x74\x79\x6c\x65"]["\x63\x75\x72\x73\x6f\x72"] = "\x70\x6f\x69\x6e\x74\x65\x72"; + grEpoZ10["\x73\x74\x79\x6c\x65"]["\x77\x69\x64\x74\x68"] = "\x38\x30\x70\x78"; + grEpoZ10["\x73\x74\x79\x6c\x65"]["\x6f\x70\x61\x63\x69\x74\x79"] = "\x30\x2e\x39"; + grEpoZ10["\x73\x74\x79\x6c\x65"]["\x7a\x49\x6e\x64\x65\x78"] = "\x31\x30\x30\x30\x31"; + grEpoZ10["\x61\x64\x64\x45\x76\x65\x6e\x74\x4c\x69\x73\x74\x65\x6e\x65\x72"]("\x63\x6c\x69\x63\x6b", function() { + s8++; + s8 == QTsilt9 && (s8 = 0); + ESmULEmZ18["\x73\x74\x79\x6c\x65"]["\x64\x69\x73\x70\x6c\x61\x79"] = "\x6e\x6f\x6e\x65"; + kvje26["\x73\x74\x79\x6c\x65"]["\x64\x69\x73\x70\x6c\x61\x79"] = "\x6e\x6f\x6e\x65"; + uMlB33["\x73\x74\x79\x6c\x65"]["\x64\x69\x73\x70\x6c\x61\x79"] = "\x6e\x6f\x6e\x65"; + switch (s8) { + case 0: + ESmULEmZ18["\x73\x74\x79\x6c\x65"]["\x64\x69\x73\x70\x6c\x61\x79"] = "\x62\x6c\x6f\x63\x6b"; + break; + case 1: + kvje26["\x73\x74\x79\x6c\x65"]["\x64\x69\x73\x70\x6c\x61\x79"] = "\x62\x6c\x6f\x63\x6b"; + break; + case 2: + uMlB33["\x73\x74\x79\x6c\x65"]["\x64\x69\x73\x70\x6c\x61\x79"] = "\x62\x6c\x6f\x63\x6b" + } + }, !1); + ESmULEmZ18 = window["\x64\x6f\x63\x75\x6d\x65\x6e\x74"]["\x63\x72\x65\x61\x74\x65\x45\x6c\x65\x6d\x65\x6e\x74"]("\x64\x69\x76"); + ESmULEmZ18["\x73\x74\x79\x6c\x65"]["\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\x43\x6f\x6c\x6f\x72"] = "\x72\x67\x62\x28" + window["\x4d\x61\x74\x68"]["\x66\x6c\x6f\x6f\x72"](qppYSsGe37["\x66\x70\x73"]["\x62\x67"]["\x72"] / 2) + "\x2c" + window["\x4d\x61\x74\x68"]["\x66\x6c\x6f\x6f\x72"](qppYSsGe37["\x66\x70\x73"]["\x62\x67"]["\x67"] / 2) + "\x2c" + window["\x4d\x61\x74\x68"]["\x66\x6c\x6f\x6f\x72"](qppYSsGe37["\x66\x70\x73"]["\x62\x67"]["\x62"] / 2) + "\x29"; + ESmULEmZ18["\x73\x74\x79\x6c\x65"]["\x70\x61\x64\x64\x69\x6e\x67"] = "\x32\x70\x78 \x30\x70\x78 \x33\x70\x78 \x30\x70\x78"; + grEpoZ10["\x61\x70\x70\x65\x6e\x64\x43\x68\x69\x6c\x64"](ESmULEmZ18); + MC$T19 = window["\x64\x6f\x63\x75\x6d\x65\x6e\x74"]["\x63\x72\x65\x61\x74\x65\x45\x6c\x65\x6d\x65\x6e\x74"]("\x64\x69\x76"); + MC$T19["\x73\x74\x79\x6c\x65"]["\x66\x6f\x6e\x74\x46\x61\x6d\x69\x6c\x79"] = "\x48\x65\x6c\x76\x65\x74\x69\x63\x61\x2c \x41\x72\x69\x61\x6c\x2c \x73\x61\x6e\x73\x2d\x73\x65\x72\x69\x66"; + MC$T19["\x73\x74\x79\x6c\x65"]["\x74\x65\x78\x74\x41\x6c\x69\x67\x6e"] = "\x6c\x65\x66\x74"; + MC$T19["\x73\x74\x79\x6c\x65"]["\x66\x6f\x6e\x74\x53\x69\x7a\x65"] = "\x39\x70\x78"; + MC$T19["\x73\x74\x79\x6c\x65"]["\x63\x6f\x6c\x6f\x72"] = "\x72\x67\x62\x28" + qppYSsGe37["\x66\x70\x73"]["\x66\x67"]["\x72"] + "\x2c" + qppYSsGe37["\x66\x70\x73"]["\x66\x67"]["\x67"] + "\x2c" + qppYSsGe37["\x66\x70\x73"]["\x66\x67"]["\x62"] + "\x29"; + MC$T19["\x73\x74\x79\x6c\x65"]["\x6d\x61\x72\x67\x69\x6e"] = "\x30\x70\x78 \x30\x70\x78 \x31\x70\x78 \x33\x70\x78"; + MC$T19["\x69\x6e\x6e\x65\x72\x48\x54\x4d\x4c"] = '\x3c\x73\x70\x61\x6e \x73\x74\x79\x6c\x65\x3d\x22\x66\x6f\x6e\x74\x2d\x77\x65\x69\x67\x68\x74\x3a\x62\x6f\x6c\x64\x22\x3e\x46\x50\x53\x3c\x2f\x73\x70\x61\x6e\x3e'; + ESmULEmZ18["\x61\x70\x70\x65\x6e\x64\x43\x68\x69\x6c\x64"](MC$T19); + CwNEUSu20 = window["\x64\x6f\x63\x75\x6d\x65\x6e\x74"]["\x63\x72\x65\x61\x74\x65\x45\x6c\x65\x6d\x65\x6e\x74"]("\x63\x61\x6e\x76\x61\x73"); + CwNEUSu20["\x77\x69\x64\x74\x68"] = 74; + CwNEUSu20["\x68\x65\x69\x67\x68\x74"] = 30; + CwNEUSu20["\x73\x74\x79\x6c\x65"]["\x64\x69\x73\x70\x6c\x61\x79"] = "\x62\x6c\x6f\x63\x6b"; + CwNEUSu20["\x73\x74\x79\x6c\x65"]["\x6d\x61\x72\x67\x69\x6e\x4c\x65\x66\x74"] = "\x33\x70\x78"; + ESmULEmZ18["\x61\x70\x70\x65\x6e\x64\x43\x68\x69\x6c\x64"](CwNEUSu20); + _21 = CwNEUSu20["\x67\x65\x74\x43\x6f\x6e\x74\x65\x78\x74"]("\x32\x64"); + _21["\x66\x69\x6c\x6c\x53\x74\x79\x6c\x65"] = "\x72\x67\x62\x28" + qppYSsGe37["\x66\x70\x73"]["\x62\x67"]["\x72"] + "\x2c" + qppYSsGe37["\x66\x70\x73"]["\x62\x67"]["\x67"] + "\x2c" + qppYSsGe37["\x66\x70\x73"]["\x62\x67"]["\x62"] + "\x29"; + _21["\x66\x69\x6c\x6c\x52\x65\x63\x74"](0, 0, CwNEUSu20["\x77\x69\x64\x74\x68"], CwNEUSu20["\x68\x65\x69\x67\x68\x74"]); + eg$MBfn22 = _21["\x67\x65\x74\x49\x6d\x61\x67\x65\x44\x61\x74\x61"](0, 0, CwNEUSu20["\x77\x69\x64\x74\x68"], CwNEUSu20["\x68\x65\x69\x67\x68\x74"]); + kvje26 = window["\x64\x6f\x63\x75\x6d\x65\x6e\x74"]["\x63\x72\x65\x61\x74\x65\x45\x6c\x65\x6d\x65\x6e\x74"]("\x64\x69\x76"); + kvje26["\x73\x74\x79\x6c\x65"]["\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\x43\x6f\x6c\x6f\x72"] = "\x72\x67\x62\x28" + window["\x4d\x61\x74\x68"]["\x66\x6c\x6f\x6f\x72"](qppYSsGe37["\x6d\x73"]["\x62\x67"]["\x72"] / 2) + "\x2c" + window["\x4d\x61\x74\x68"]["\x66\x6c\x6f\x6f\x72"](qppYSsGe37["\x6d\x73"]["\x62\x67"]["\x67"] / 2) + "\x2c" + window["\x4d\x61\x74\x68"]["\x66\x6c\x6f\x6f\x72"](qppYSsGe37["\x6d\x73"]["\x62\x67"]["\x62"] / 2) + "\x29"; + kvje26["\x73\x74\x79\x6c\x65"]["\x70\x61\x64\x64\x69\x6e\x67"] = "\x32\x70\x78 \x30\x70\x78 \x33\x70\x78 \x30\x70\x78"; + kvje26["\x73\x74\x79\x6c\x65"]["\x64\x69\x73\x70\x6c\x61\x79"] = "\x6e\x6f\x6e\x65"; + grEpoZ10["\x61\x70\x70\x65\x6e\x64\x43\x68\x69\x6c\x64"](kvje26); + K27 = window["\x64\x6f\x63\x75\x6d\x65\x6e\x74"]["\x63\x72\x65\x61\x74\x65\x45\x6c\x65\x6d\x65\x6e\x74"]("\x64\x69\x76"); + K27["\x73\x74\x79\x6c\x65"]["\x66\x6f\x6e\x74\x46\x61\x6d\x69\x6c\x79"] = "\x48\x65\x6c\x76\x65\x74\x69\x63\x61\x2c \x41\x72\x69\x61\x6c\x2c \x73\x61\x6e\x73\x2d\x73\x65\x72\x69\x66"; + K27["\x73\x74\x79\x6c\x65"]["\x74\x65\x78\x74\x41\x6c\x69\x67\x6e"] = "\x6c\x65\x66\x74"; + K27["\x73\x74\x79\x6c\x65"]["\x66\x6f\x6e\x74\x53\x69\x7a\x65"] = "\x39\x70\x78"; + K27["\x73\x74\x79\x6c\x65"]["\x63\x6f\x6c\x6f\x72"] = "\x72\x67\x62\x28" + qppYSsGe37["\x6d\x73"]["\x66\x67"]["\x72"] + "\x2c" + qppYSsGe37["\x6d\x73"]["\x66\x67"]["\x67"] + "\x2c" + qppYSsGe37["\x6d\x73"]["\x66\x67"]["\x62"] + "\x29"; + K27["\x73\x74\x79\x6c\x65"]["\x6d\x61\x72\x67\x69\x6e"] = "\x30\x70\x78 \x30\x70\x78 \x31\x70\x78 \x33\x70\x78"; + K27["\x69\x6e\x6e\x65\x72\x48\x54\x4d\x4c"] = '\x3c\x73\x70\x61\x6e \x73\x74\x79\x6c\x65\x3d\x22\x66\x6f\x6e\x74\x2d\x77\x65\x69\x67\x68\x74\x3a\x62\x6f\x6c\x64\x22\x3e\x4d\x53\x3c\x2f\x73\x70\x61\x6e\x3e'; + kvje26["\x61\x70\x70\x65\x6e\x64\x43\x68\x69\x6c\x64"](K27); + CwNEUSu20 = window["\x64\x6f\x63\x75\x6d\x65\x6e\x74"]["\x63\x72\x65\x61\x74\x65\x45\x6c\x65\x6d\x65\x6e\x74"]("\x63\x61\x6e\x76\x61\x73"); + CwNEUSu20["\x77\x69\x64\x74\x68"] = 74; + CwNEUSu20["\x68\x65\x69\x67\x68\x74"] = 30; + CwNEUSu20["\x73\x74\x79\x6c\x65"]["\x64\x69\x73\x70\x6c\x61\x79"] = "\x62\x6c\x6f\x63\x6b"; + CwNEUSu20["\x73\x74\x79\x6c\x65"]["\x6d\x61\x72\x67\x69\x6e\x4c\x65\x66\x74"] = "\x33\x70\x78"; + kvje26["\x61\x70\x70\x65\x6e\x64\x43\x68\x69\x6c\x64"](CwNEUSu20); + $28 = CwNEUSu20["\x67\x65\x74\x43\x6f\x6e\x74\x65\x78\x74"]("\x32\x64"); + $28["\x66\x69\x6c\x6c\x53\x74\x79\x6c\x65"] = "\x72\x67\x62\x28" + qppYSsGe37["\x6d\x73"]["\x62\x67"]["\x72"] + "\x2c" + qppYSsGe37["\x6d\x73"]["\x62\x67"]["\x67"] + "\x2c" + qppYSsGe37["\x6d\x73"]["\x62\x67"]["\x62"] + "\x29"; + $28["\x66\x69\x6c\x6c\x52\x65\x63\x74"](0, 0, CwNEUSu20["\x77\x69\x64\x74\x68"], CwNEUSu20["\x68\x65\x69\x67\x68\x74"]); + BZEK29 = $28["\x67\x65\x74\x49\x6d\x61\x67\x65\x44\x61\x74\x61"](0, 0, CwNEUSu20["\x77\x69\x64\x74\x68"], CwNEUSu20["\x68\x65\x69\x67\x68\x74"]); + try { + performance && performance["\x6d\x65\x6d\x6f\x72\x79"] && performance["\x6d\x65\x6d\x6f\x72\x79"]["\x74\x6f\x74\x61\x6c\x4a\x53\x48\x65\x61\x70\x53\x69\x7a\x65"] && (QTsilt9 = 3) + } catch (G) {} + uMlB33 = window["\x64\x6f\x63\x75\x6d\x65\x6e\x74"]["\x63\x72\x65\x61\x74\x65\x45\x6c\x65\x6d\x65\x6e\x74"]("\x64\x69\x76"); + uMlB33["\x73\x74\x79\x6c\x65"]["\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\x43\x6f\x6c\x6f\x72"] = "\x72\x67\x62\x28" + window["\x4d\x61\x74\x68"]["\x66\x6c\x6f\x6f\x72"](qppYSsGe37["\x6d\x62"]["\x62\x67"]["\x72"] / 2) + "\x2c" + window["\x4d\x61\x74\x68"]["\x66\x6c\x6f\x6f\x72"](qppYSsGe37["\x6d\x62"]["\x62\x67"]["\x67"] / 2) + "\x2c" + window["\x4d\x61\x74\x68"]["\x66\x6c\x6f\x6f\x72"](qppYSsGe37["\x6d\x62"]["\x62\x67"]["\x62"] / 2) + "\x29"; + uMlB33["\x73\x74\x79\x6c\x65"]["\x70\x61\x64\x64\x69\x6e\x67"] = "\x32\x70\x78 \x30\x70\x78 \x33\x70\x78 \x30\x70\x78"; + uMlB33["\x73\x74\x79\x6c\x65"]["\x64\x69\x73\x70\x6c\x61\x79"] = "\x6e\x6f\x6e\x65"; + grEpoZ10["\x61\x70\x70\x65\x6e\x64\x43\x68\x69\x6c\x64"](uMlB33); + dcngJtbw34 = window["\x64\x6f\x63\x75\x6d\x65\x6e\x74"]["\x63\x72\x65\x61\x74\x65\x45\x6c\x65\x6d\x65\x6e\x74"]("\x64\x69\x76"); + dcngJtbw34["\x73\x74\x79\x6c\x65"]["\x66\x6f\x6e\x74\x46\x61\x6d\x69\x6c\x79"] = "\x48\x65\x6c\x76\x65\x74\x69\x63\x61\x2c \x41\x72\x69\x61\x6c\x2c \x73\x61\x6e\x73\x2d\x73\x65\x72\x69\x66"; + dcngJtbw34["\x73\x74\x79\x6c\x65"]["\x74\x65\x78\x74\x41\x6c\x69\x67\x6e"] = "\x6c\x65\x66\x74"; + dcngJtbw34["\x73\x74\x79\x6c\x65"]["\x66\x6f\x6e\x74\x53\x69\x7a\x65"] = "\x39\x70\x78"; + dcngJtbw34["\x73\x74\x79\x6c\x65"]["\x63\x6f\x6c\x6f\x72"] = "\x72\x67\x62\x28" + qppYSsGe37["\x6d\x62"]["\x66\x67"]["\x72"] + "\x2c" + qppYSsGe37["\x6d\x62"]["\x66\x67"]["\x67"] + "\x2c" + qppYSsGe37["\x6d\x62"]["\x66\x67"]["\x62"] + "\x29"; + dcngJtbw34["\x73\x74\x79\x6c\x65"]["\x6d\x61\x72\x67\x69\x6e"] = "\x30\x70\x78 \x30\x70\x78 \x31\x70\x78 \x33\x70\x78"; + dcngJtbw34["\x69\x6e\x6e\x65\x72\x48\x54\x4d\x4c"] = '\x3c\x73\x70\x61\x6e \x73\x74\x79\x6c\x65\x3d\x22\x66\x6f\x6e\x74\x2d\x77\x65\x69\x67\x68\x74\x3a\x62\x6f\x6c\x64\x22\x3e\x4d\x42\x3c\x2f\x73\x70\x61\x6e\x3e'; + uMlB33["\x61\x70\x70\x65\x6e\x64\x43\x68\x69\x6c\x64"](dcngJtbw34); + CwNEUSu20 = window["\x64\x6f\x63\x75\x6d\x65\x6e\x74"]["\x63\x72\x65\x61\x74\x65\x45\x6c\x65\x6d\x65\x6e\x74"]("\x63\x61\x6e\x76\x61\x73"); + CwNEUSu20["\x77\x69\x64\x74\x68"] = 74; + CwNEUSu20["\x68\x65\x69\x67\x68\x74"] = 30; + CwNEUSu20["\x73\x74\x79\x6c\x65"]["\x64\x69\x73\x70\x6c\x61\x79"] = "\x62\x6c\x6f\x63\x6b"; + CwNEUSu20["\x73\x74\x79\x6c\x65"]["\x6d\x61\x72\x67\x69\x6e\x4c\x65\x66\x74"] = "\x33\x70\x78"; + uMlB33["\x61\x70\x70\x65\x6e\x64\x43\x68\x69\x6c\x64"](CwNEUSu20); + wMVlPSdU35 = CwNEUSu20["\x67\x65\x74\x43\x6f\x6e\x74\x65\x78\x74"]("\x32\x64"); + wMVlPSdU35["\x66\x69\x6c\x6c\x53\x74\x79\x6c\x65"] = "\x23\x33\x30\x31\x30\x31\x30"; + wMVlPSdU35["\x66\x69\x6c\x6c\x52\x65\x63\x74"](0, 0, CwNEUSu20["\x77\x69\x64\x74\x68"], CwNEUSu20["\x68\x65\x69\x67\x68\x74"]); + LkrwEFr36 = wMVlPSdU35["\x67\x65\x74\x49\x6d\x61\x67\x65\x44\x61\x74\x61"](0, 0, CwNEUSu20["\x77\x69\x64\x74\x68"], CwNEUSu20["\x68\x65\x69\x67\x68\x74"]); + return { + domElement: grEpoZ10, + update: function() { + hZ11++; + _kO12 = (new window["\x44\x61\x74\x65"])["\x67\x65\x74\x54\x69\x6d\x65"](); + blcZCzThy23 = _kO12 - D13; + T24 = window["\x4d\x61\x74\x68"]["\x6d\x69\x6e"](T24, blcZCzThy23); + $zRe25 = window["\x4d\x61\x74\x68"]["\x6d\x61\x78"]($zRe25, blcZCzThy23); + s(BZEK29["\x64\x61\x74\x61"], window["\x4d\x61\x74\x68"]["\x6d\x69\x6e"](30, 30 - blcZCzThy23 / 200 * 30), "\x6d\x73"); + K27["\x69\x6e\x6e\x65\x72\x48\x54\x4d\x4c"] = '\x3c\x73\x70\x61\x6e \x73\x74\x79\x6c\x65\x3d\x22\x66\x6f\x6e\x74\x2d\x77\x65\x69\x67\x68\x74\x3a\x62\x6f\x6c\x64\x22\x3e' + blcZCzThy23 + " \x4d\x53\x3c\x2f\x73\x70\x61\x6e\x3e \x28" + T24 + "\x2d" + $zRe25 + "\x29"; + $28["\x70\x75\x74\x49\x6d\x61\x67\x65\x44\x61\x74\x61"](BZEK29, 0, 0); + D13 = _kO12; + if (_kO12 > hPuk14 + 1E3) { + nogIEsi15 = window["\x4d\x61\x74\x68"]["\x72\x6f\x75\x6e\x64"](hZ11 * 1E3 / (_kO12 - hPuk14)); + aGfBpM_16 = window["\x4d\x61\x74\x68"]["\x6d\x69\x6e"](aGfBpM_16, nogIEsi15); + pIipoKbeZ17 = window["\x4d\x61\x74\x68"]["\x6d\x61\x78"](pIipoKbeZ17, nogIEsi15); + s(eg$MBfn22["\x64\x61\x74\x61"], window["\x4d\x61\x74\x68"]["\x6d\x69\x6e"](30, 30 - nogIEsi15 / 100 * 30), "\x66\x70\x73"); + MC$T19["\x69\x6e\x6e\x65\x72\x48\x54\x4d\x4c"] = '\x3c\x73\x70\x61\x6e \x73\x74\x79\x6c\x65\x3d\x22\x66\x6f\x6e\x74\x2d\x77\x65\x69\x67\x68\x74\x3a\x62\x6f\x6c\x64\x22\x3e' + nogIEsi15 + " \x46\x50\x53\x3c\x2f\x73\x70\x61\x6e\x3e \x28" + aGfBpM_16 + "\x2d" + pIipoKbeZ17 + "\x29"; + _21["\x70\x75\x74\x49\x6d\x61\x67\x65\x44\x61\x74\x61"](eg$MBfn22, 0, 0); + if (QTsilt9 == 3) + alOujP30 = performance["\x6d\x65\x6d\x6f\x72\x79"]["\x75\x73\x65\x64\x4a\x53\x48\x65\x61\x70\x53\x69\x7a\x65"] * 9.54E-7, + yj31 = window["\x4d\x61\x74\x68"]["\x6d\x69\x6e"](yj31, alOujP30), + DiXUY32 = window["\x4d\x61\x74\x68"]["\x6d\x61\x78"](DiXUY32, alOujP30), + s(LkrwEFr36["\x64\x61\x74\x61"], window["\x4d\x61\x74\x68"]["\x6d\x69\x6e"](30, 30 - alOujP30 / 2), "\x6d\x62"), + dcngJtbw34["\x69\x6e\x6e\x65\x72\x48\x54\x4d\x4c"] = '\x3c\x73\x70\x61\x6e \x73\x74\x79\x6c\x65\x3d\x22\x66\x6f\x6e\x74\x2d\x77\x65\x69\x67\x68\x74\x3a\x62\x6f\x6c\x64\x22\x3e' + window["\x4d\x61\x74\x68"]["\x72\x6f\x75\x6e\x64"](alOujP30) + " \x4d\x42\x3c\x2f\x73\x70\x61\x6e\x3e \x28" + window["\x4d\x61\x74\x68"]["\x72\x6f\x75\x6e\x64"](yj31) + "\x2d" + window["\x4d\x61\x74\x68"]["\x72\x6f\x75\x6e\x64"](DiXUY32) + "\x29", + wMVlPSdU35["\x70\x75\x74\x49\x6d\x61\x67\x65\x44\x61\x74\x61"](LkrwEFr36, 0, 0); + hPuk14 = _kO12; + hZ11 = 0 + } + } + } +}; +var game123 = function() { + function s(a, g, d) { + var f, c, e; + for (c = 0; c < 30; c++) + for (f = 0; f < 73; f++) + e = (f + c * 74) * 4, + a[e] = a[e + 4], + a[e + 1] = a[e + 5], + a[e + 2] = a[e + 6]; + for (c = 0; c < 30; c++) + e = (73 + c * 74) * 4, + c < g ? (a[e] = b[d].bg.r, + a[e + 1] = b[d].bg.g, + a[e + 2] = b[d].bg.b) : (a[e] = b[d].fg.r, + a[e + 1] = b[d].fg.g, + a[e + 2] = b[d].fg.b) + } + var r = 0, t = 2, g, u = 0, j = (new Date).getTime(), F = j, v = j, l = 0, w = 1E3, x = 0, k, d, a, m, y, n = 0, z = 1E3, A = 0, f, c, o, B, p = 0, C = 1E3, D = 0, h, i, q, E, b = { + fps: { + bg: { + r: 16, + g: 16, + b: 48 + }, + fg: { + r: 0, + g: 255, + b: 255 + } + }, + ms: { + bg: { + r: 16, + g: 48, + b: 16 + }, + fg: { + r: 0, + g: 255, + b: 0 + } + }, + mb: { + bg: { + r: 48, + g: 16, + b: 26 + }, + fg: { + r: 255, + g: 0, + b: 128 + } + } + }; + g = document.createElement("div"); + g.className = "stats"; + g.style.cursor = "pointer"; + g.style.width = "80px"; + g.style.opacity = "0.9"; + g.style.zIndex = "10001"; + g.addEventListener("click", function() { + r++; + r == t && (r = 0); + k.style.display = "none"; + f.style.display = "none"; + h.style.display = "none"; + switch (r) { + case 0: + k.style.display = "block"; + break; + case 1: + f.style.display = "block"; + break; + case 2: + h.style.display = "block" + } + }, !1); + k = document.createElement("div"); + k.style.backgroundColor = "rgb(" + Math.floor(b.fps.bg.r / 2) + "," + Math.floor(b.fps.bg.g / 2) + "," + Math.floor(b.fps.bg.b / 2) + ")"; + k.style.padding = "2px 0px 3px 0px"; + g.appendChild(k); + d = document.createElement("div"); + d.style.fontFamily = "Helvetica, Arial, sans-serif"; + d.style.textAlign = "left"; + d.style.fontSize = "9px"; + d.style.color = "rgb(" + b.fps.fg.r + "," + b.fps.fg.g + "," + b.fps.fg.b + ")"; + d.style.margin = "0px 0px 1px 3px"; + d.innerHTML = 'FPS'; + k.appendChild(d); + a = document.createElement("canvas"); + a.width = 74; + a.height = 30; + a.style.display = "block"; + a.style.marginLeft = "3px"; + k.appendChild(a); + m = a.getContext("2d"); + m.fillStyle = "rgb(" + b.fps.bg.r + "," + b.fps.bg.g + "," + b.fps.bg.b + ")"; + m.fillRect(0, 0, a.width, a.height); + y = m.getImageData(0, 0, a.width, a.height); + f = document.createElement("div"); + f.style.backgroundColor = "rgb(" + Math.floor(b.ms.bg.r / 2) + "," + Math.floor(b.ms.bg.g / 2) + "," + Math.floor(b.ms.bg.b / 2) + ")"; + f.style.padding = "2px 0px 3px 0px"; + f.style.display = "none"; + g.appendChild(f); + c = document.createElement("div"); + c.style.fontFamily = "Helvetica, Arial, sans-serif"; + c.style.textAlign = "left"; + c.style.fontSize = "9px"; + c.style.color = "rgb(" + b.ms.fg.r + "," + b.ms.fg.g + "," + b.ms.fg.b + ")"; + c.style.margin = "0px 0px 1px 3px"; + c.innerHTML = 'MS'; + f.appendChild(c); + a = document.createElement("canvas"); + a.width = 74; + a.height = 30; + a.style.display = "block"; + a.style.marginLeft = "3px"; + f.appendChild(a); + o = a.getContext("2d"); + o.fillStyle = "rgb(" + b.ms.bg.r + "," + b.ms.bg.g + "," + b.ms.bg.b + ")"; + o.fillRect(0, 0, a.width, a.height); + B = o.getImageData(0, 0, a.width, a.height); + try { + performance && performance.memory && performance.memory.totalJSHeapSize && (t = 3) + } catch (G) {} + h = document.createElement("div"); + h.style.backgroundColor = "rgb(" + Math.floor(b.mb.bg.r / 2) + "," + Math.floor(b.mb.bg.g / 2) + "," + Math.floor(b.mb.bg.b / 2) + ")"; + h.style.padding = "2px 0px 3px 0px"; + h.style.display = "none"; + g.appendChild(h); + i = document.createElement("div"); + i.style.fontFamily = "Helvetica, Arial, sans-serif"; + i.style.textAlign = "left"; + i.style.fontSize = "9px"; + i.style.color = "rgb(" + b.mb.fg.r + "," + b.mb.fg.g + "," + b.mb.fg.b + ")"; + i.style.margin = "0px 0px 1px 3px"; + i.innerHTML = 'MB'; + h.appendChild(i); + a = document.createElement("canvas"); + a.width = 74; + a.height = 30; + a.style.display = "block"; + a.style.marginLeft = "3px"; + h.appendChild(a); + q = a.getContext("2d"); + q.fillStyle = "#301010"; + q.fillRect(0, 0, a.width, a.height); + E = q.getImageData(0, 0, a.width, a.height); + return { + domElement: g, + update: function() { + u++; + j = (new Date).getTime(); + n = j - F; + z = Math.min(z, n); + A = Math.max(A, n); + s(B.data, Math.min(30, 30 - n / 200 * 30), "ms"); + c.innerHTML = '' + n + " MS (" + z + "-" + A + ")"; + o.putImageData(B, 0, 0); + F = j; + if (j > v + 1E3) { + l = Math.round(u * 1E3 / (j - v)); + w = Math.min(w, l); + x = Math.max(x, l); + s(y.data, Math.min(30, 30 - l / 100 * 30), "fps"); + d.innerHTML = '' + l + " FPS (" + w + "-" + x + ")"; + m.putImageData(y, 0, 0); + if (t == 3) + p = performance.memory.usedJSHeapSize * 9.54E-7, + C = Math.min(C, p), + D = Math.max(D, p), + s(E.data, Math.min(30, 30 - p / 2), "mb"), + i.innerHTML = '' + Math.round(p) + " MB (" + Math.round(C) + "-" + Math.round(D) + ")", + q.putImageData(E, 0, 0); + v = j; + u = 0 + } + } + } +}; +var ifastunit = 0; +var ifast_jb; +var dfw1977s = 1; +var dfw1977e = 1; +var testdate111 = '{"dfw":123}'; +var gameabc_face = gameabc_face || {}; +var ifast_hashmaps = {}; +var ifast_seerect = {}; +gameabc_face.resizeinitok = 0; +gameabc_face.vw = 1; +gameabc_face.lmx = 30; +gameabc_face.lmy = 30; +gameabc_face.userchargez = 0; +gameabc_face.randombase = 777777; +gameabc_face.randomhttp = 777777; +gameabc_face.img_list_pre = []; +gameabc_face.img_list_downing = []; +dfwusercavans = 0; +gameabc_face.downing_count = 100; +gameabc_face.webmode = 0; +gameabc_face.drawcharge = 1; +gameabc_face.drawmouse = 1; +gameabc_face.drawnet = 1; +gameabc_face.drawtime = 1; +gameabc_face.drawface = 1; +gameabc_face.fastup_time = 250; +gameabc_face.checkmustdraw = function() { + if (gameabc_face.webmode == 0) { + return 1; + } + ;var k; + k = this.drawcharge || this.drawnet || this.drawtime || this.drawface || this.drawmouse; + this.drawcharge = 0; + this.drawmouse = 0; + this.drawnet = 0; + this.drawtime = 0; + this.drawface = 0; + return k; +} +; + +function dfwtime200() { + var i1 = gameabc_face.img_list_pre.length; + var i2 = gameabc_face.img_list_downing.length; + var obj; + { + while (i2 < gameabc_face.downing_count && i1 > 0) { + obj = gameabc_face.img_list_pre[0]; + i2 = gameabc_face.img_list_downing.push(obj); + gameabc_face.img_list_pre.splice(0, 1); + i1 = gameabc_face.img_list_pre.length; + obj.src = obj.src_pre; + } + } +} +;function ifast_checkrect_seefastxy(x, y) { + if (x >= ifast_seerect.w || y >= ifast_seerect.h) { + return 0; + } else { + return 1; + } +} +;function ifast_checkrect_seefastxywh(x, y, w, h) { + if (x >= ifast_seerect.w || y >= ifast_seerect.h) { + return 0; + } else { + return 1; + } + ;if (x + w <= 0 || y + h < 0) { + return 0; + } else { + return 1; + } +} +;function ifast_jsonchecktostring(msg) { + if (msg) { + if (typeof (msg) != 'string') { + msg = JSON.stringify(msg); + } + ; + } + ;return msg; +} +;function ifast_checkjsonstr(v) { + v = other_replaceall(v, "\n", "\\n"); + v = other_replaceall(v, "\r", "\\r"); + return v; +} +;function ifast_measureText(spid, caption) { + var obj = ifast_getobj(spid); + if (ifast_isno(obj)) { + return 0; + } + ;var dc = ifast_getdc(); + dc.font = 'lighter ' + obj.h + 'px Arial'; + if (!caption) { + caption = obj.caption; + } + ;return dc.measureText(caption).width; +} +;function getPixelRatio(context) { + var backingStore = context.backingStorePixelRatio || context.webkitBackingStorePixelRatio || context.mozBackingStorePixelRatio || context.msBackingStorePixelRatio || context.oBackingStorePixelRatio || context.backingStorePixelRatio || 1; + return (window.devicePixelRatio || 1) / backingStore; +} +;function allchargeobj(objid) { + if (arguments.length == 0) { + var i; + for (i = 1; i < gameabc_Object.ObjectList.length; i++) { + allchargeobj(i); + } + ;return; + } + ;var obj; + var j; + var objs = gameabc_Object.ObjectList; + obj = gameabc_Object.ObjectList[objid].Property; + if (!obj) { + return; + } + ;if (!obj.OriginID) { + return; + } + ;if (obj.OriginID == 0) { + return; + } + ;var objf = ifast_getobj(obj.OriginID); + if (!objf) { + return; + } else { + allchargeobj(obj.OriginID); + } + ;ifast_spritealign(obj.offX, obj.offY, objid, obj.SelfPos, obj.OriginID, obj.OriginPos); +} +;function allcharge(layer) { + if (!layer) { + if (!gameabc_Image.addimgs) { + gameabc_Image.addimgs = {}; + } + ;if (!gameabc_face.loadui2) { + return; + } + ;var d = 1; + var okle; + for (d = 1; d < gameabc_Layer.LayerList.length; d++) { + okle = gameabc_Layer.LayerList[d]; + if (!okle.allrect) { + okle.allrect = {}; + okle.syrect = {}; + okle.myrect = {}; + } + ;allcharge(d); + } + ;allchargeobj(); + return; + } + ;var oklevel = gameabc_Layer.LayerList[layer]; + if (!oklevel.ObjectList) { + return; + } + ;var oo = 0; + var ww = g_GameObjectManager.backBuffer.width; + var hh = g_GameObjectManager.backBuffer.height; + oklevel.allrect.x = oo; + oklevel.allrect.y = oo; + oklevel.allrect.w = ww; + oklevel.allrect.h = hh; + oklevel.syrect.x = oo; + oklevel.syrect.y = oo; + oklevel.syrect.w = ww; + oklevel.syrect.h = hh; + oklevel.syrect.x = oo; + oklevel.syrect.y = oo; + oklevel.syrect.w = ww; + oklevel.syrect.h = hh; + var obj; + var j; + var objid; + var count = oklevel.ObjectList.length; + for (j = 0; j < count; j++) { + objid = oklevel.ObjectList[j]; + obj = ifast_getobj(objid); + if (!obj) { + continue + } + ;try { + if (obj.classid == 6) { + oklevel.myrect = getmyrectdec(oklevel.allrect, oklevel.syrect, obj.Align, obj.SizeStyle, obj.Size, 1); + set_self(objid, 28, oklevel.myrect); + } + } catch (e) {} + } + ; +} +;function getmyrect(rect, Align, SizeStyle, size) { + return getmyrectdec(rect, rect, Align, SizeStyle, size, 0); +} +;function getmyrectdec(allrect, syrect, Align, SizeStyle, size, dec) { + var myrect = {}; + switch (Align) { + case 1: + switch (SizeStyle) { + case 0: + myrect.x = syrect.x; + myrect.y = syrect.y; + myrect.w = size; + myrect.h = syrect.h; + break; + case 1: + myrect.x = syrect.x; + myrect.y = syrect.y; + myrect.h = syrect.h; + myrect.w = (size / 10000) * allrect.w; + break; + case 2: + myrect.x = syrect.x; + myrect.y = syrect.y; + myrect.h = syrect.h; + myrect.w = (size / 10000) * syrect.w; + break; + } + ;break; + case 2: + switch (SizeStyle) { + case 0: + myrect.x = syrect.x; + myrect.y = syrect.y; + myrect.w = syrect.w; + myrect.h = size; + break; + case 1: + myrect.x = syrect.x; + myrect.y = syrect.y; + myrect.w = syrect.w; + myrect.h = (size / 10000) * allrect.h; + break; + case 2: + myrect.x = syrect.x; + myrect.y = syrect.y; + myrect.w = syrect.w; + myrect.h = (size / 10000) * syrect.h; + break; + } + ;break; + case 3: + switch (SizeStyle) { + case 0: + myrect.x = syrect.x + allrect.w - size; + myrect.y = syrect.y; + myrect.h = syrect.h; + myrect.w = size; + break; + case 1: + myrect.x = syrect.x + syrect.w - (size / 10000) * allrect.w; + myrect.y = syrect.y; + myrect.h = syrect.h; + myrect.w = (size / 10000) * syrect.w; + break; + case 2: + myrect.x = syrect.x + syrect.w - (size / 10000) * syrect.w; + myrect.y = syrect.y; + myrect.w = (size / 10000) * syrect.w; + myrect.h = syrect.h; + break; + } + ;break; + case 4: + switch (SizeStyle) { + case 0: + myrect.x = syrect.x; + myrect.y = syrect.y + syrect.h - size; + myrect.w = syrect.w; + myrect.h = size; + break; + case 1: + myrect.x = syrect.x; + myrect.y = syrect.y + syrect.h - (size / 10000) * allrect.h; + myrect.w = syrect.w; + myrect.h = (size / 10000) * allrect.h; + break; + case 2: + myrect.x = syrect.x; + myrect.y = syrect.y + syrect.h - (size / 10000) * syrect.h; + myrect.w = syrect.w; + myrect.h = (size / 10000) * syrect.h; + break; + } + ;break; + } + ;myrect.x = parseInt(myrect.x); + myrect.y = parseInt(myrect.y); + myrect.w = parseInt(myrect.w); + myrect.h = parseInt(myrect.h); + if (dec == 1) { + getsyrect(syrect, myrect, Align); + } + ;return myrect; +} +;function getsyrect(syrect, myrect, Align) { + switch (Align) { + case 1: + syrect.w -= myrect.w; + syrect.x += myrect.w; + syrect.y = syrect.y; + syrect.h = syrect.h; + break; + case 2: + syrect.h -= myrect.h; + syrect.y += myrect.h; + syrect.x = syrect.x; + syrect.w = syrect.w; + break; + case 3: + syrect.w -= myrect.w; + syrect.x = syrect.x; + syrect.y = syrect.y; + syrect.h = syrect.h; + break; + case 4: + syrect.h -= myrect.h; + syrect.y = syrect.y; + syrect.x = syrect.x; + syrect.w = syrect.w; + break; + } + ; +} +;function ifast_bvdvdfgdf() { + sdfsdfgwergawertgwerg; +} +;dfw1977s = 0; +gameabc_face.xxxxx = ""; +dfw1977e = 0; +gameabc_face.openlog = 0; +gameabc_face.pmkg_string = ""; +gameabc_face.touall = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQIW2NkYGD4DwABCQEBtxmN7wAAAABJRU5ErkJggg=="; +gameabc_face.banall = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQIW2NkYGCoBwAAiQCB1bUosQAAAABJRU5ErkJggg=="; +gameabc_face.touall_img = new Image(); +gameabc_face.touall_img.src = gameabc_face.touall; +gameabc_face.banall_img = new Image(); +gameabc_face.banall_img.src = gameabc_face.banall; +gameabc_face.zz_canvas = document.createElement('canvas'); +gameabc_face.zz_canvas.width = 1; +gameabc_face.zz_canvas.height = 1; +gameabc_face.zz2d = gameabc_face.zz_canvas.getContext("2d"); +gameabc_face.obj = null; +gameabc_face.sy_x = 0; +gameabc_face.sy_y = 0; +gameabc_face.sy_w = 0; +gameabc_face.sy_h = 0; +gameabc_face.loadcount = 0; +gameabc_face.jm_sj_xz = 0; +gameabc_face.jm_sj_tong = 1; +gameabc_face.jm_sj_cj = 0;//xwb --- 2 +gameabc_face.pmw = 0; +gameabc_face.pmh = 0; +gameabc_face.pause = 0; +gameabc_face.hs = 0; +gameabc_face.sjhs = 0; +gameabc_face.mysc = 1; +gameabc_face.pmsc = 1; +gameabc_face.pmcx = 0; +gameabc_face.pmcy = 0; +gameabc_face.sjcx = 0; +gameabc_face.sjcy = 0; +gameabc_face.myxz = 0; +gameabc_face.mybx = 0; +gameabc_face.mysf = 0; +gameabc_face.isxz = 0; +gameabc_face.drawx = 0; +gameabc_face.drawy = 0; +gameabc_face.draww = 0; +gameabc_face.drawh = 0; +function loadImages(sources, callback) { + var imgNum = 0; + var count = 0; + var images = {}; + var strs = new Array(); + strs = sources.split(","); + imgNum = strs.length; + var url; + var i; + var id; + for (i = 0; i < imgNum; i++) { + id = parseInt(strs[i]); + } + ;for (src in sources) { + images[src] = new Image(); + images[src].onload = function() { + count++; + console.log("countok=" + count); + if (count == imgNum) { + callback(images); + } + } + ; + images[src].onerror = function() { + count++; + console.log("counterr=" + count); + if (count == imgNum) { + callback(images); + } + } + ; + images[src].src = sources[src]; + } +} +;gameabc_face.loglist = new Array(); +gameabc_face.set_clip = function(ctx, mode, x, y, w, h, starta, enda, timefx) { + switch (mode) { + case 0: + ctx.rect(x, y, w, h); + break; + case 1: + var w2 = w / 2; + var h2 = h / 2; + if (!starta) { + ctx.arc(x + w2, y + h2, w2, 0, Math.PI * 2, true); + } else { + var startPoint = 1.5 * Math.PI; + var all = Math.PI * 2; + ctx.beginPath(); + ctx.moveTo(x + w2, y + h2); + if (timefx) { + if (timefx == 0) { + timefx = false; + } else { + timefx = true; + } + ;ctx.arc(x + w2, y + h2, w2, startPoint + all * (starta / 100), startPoint + all * (enda / 100), timefx); + } else { + if (!enda) { + ctx.arc(x + w2, y + h2, w2, startPoint + all * (starta / 100), startPoint, false); + } else { + ctx.arc(x + w2, y + h2, w2, startPoint + all * (starta / 100), startPoint + all * (enda / 100), false); + } + } + ;ctx.lineTo(x + w2, y + h2); + ctx.closePath(); + break; + } + ; + } + ;ctx.clip(); +} +; +gameabc_face.drawround = function(ctx, mode, cx, cy, r, fx, bgColor, starta, enda, isout) { + ctx.save(); + if (bgColor == "") { + ctx.fillStyle = "red"; + } + ;if (isout == 1) { + ctx.globalCompositeOperation = "destination-atop"; + } + ;if (!mode) { + mode = 0; + } + ;if (!fx) { + fx = true; + } else { + if (fx == 0) { + fx = true; + } else { + fx = false; + } + ; + } + ;if (!starta) { + starta = 0; + } + ;if (!enda) { + enda = 360; + } + ;ctx.beginPath(); + ctx.arc(cx, cy, r, Math.PI * starta / 180, Math.PI * enda / 180, fx); + ctx.closePath(); + if (mode == 0) { + if (bgColor) { + ctx.fillStyle = bgColor; + } else { + ctx.fillStyle = "red"; + } + ;ctx.fill(); + } else { + if (bgColor) { + ctx.strokeStyle = bgColor; + } else { + ctx.strokeStyle = "red"; + } + ;ctx.lineWidth = mode; + ctx.stroke(); + } + ;ctx.restore(); +} +; +gameabc_face.drawlines = function(ctx, startx, starty, endx, endy, lw, bgColor) { + ctx.save(); + if (!lw) { + lw = 1; + } + ;if (bgColor == "") { + ctx.fillStyle = "red"; + } + ;ctx.lineWidth = lw; + ctx.lineCap = "round"; + ctx.beginPath(); + ctx.moveTo(startx, starty); + ctx.lineTo(endx, endy); + if (bgColor) { + ctx.strokeStyle = bgColor; + } else { + ctx.strokeStyle = "red"; + } + ;ctx.closePath(); + ctx.stroke(); + ctx.restore(); +} +; +gameabc_face.drawrect = function(ctx, mode, x, y, w, h, bgColor, isout) { + ctx.save(); + if (isout == 1) { + ctx.globalCompositeOperation = "destination-atop"; + } + ;if (bgColor == "") { + ctx.fillStyle = "red"; + } + ;if (mode == 0) { + if (bgColor) { + ctx.fillStyle = bgColor; + } else { + ctx.fillStyle = "red"; + } + ;ctx.fillRect(x, y, w, h); + } else { + if (bgColor) { + ctx.strokeStyle = bgColor; + } else { + ctx.strokeStyle = "red"; + } + ;ctx.lineWidth = mode; + ctx.strokeRect(x, y, w, h); + } + ;ctx.restore(); +} +; +function getRootPath() { + var strFullPath = window.document.location.href; + var strPath = window.document.location.pathname; + var pos = strFullPath.indexOf(strPath); + var prePath = strFullPath.substring(0, pos); + return ( prePath) ; + var postPath = strPath.substring(0, strPath.substr(1).indexOf('/') + 1); + return ( prePath + postPath) ; +} +;gameabc_face.getdiv = function(id) { + return document.getElementById(id); +} +; +gameabc_face.fatherdiv = gameabc_face.getdiv("ifastgame"); +gameabc_face.inputdiv = null; +gameabc_face.init_inputdiv = function(x, y) { + gameabc_face.fatherdiv = gameabc_face.getdiv("ifastgame"); + gameabc_face.inputdiv = gameabc_face.fatherdiv; + return; + if (gameabc_face.inputdiv == null) { + gameabc_face.inputdiv = document.createElement("div"); + gameabc_face.inputdiv.setAttribute("id", "inputdiv"); + gameabc_face.inputdiv.style.zIndex = 999999999; + gameabc_face.inputdiv.style.position = "absolute"; + gameabc_face.inputdiv.style.top = x + "px"; + gameabc_face.inputdiv.style.left = y + "px"; + gameabc_face.inputdiv.style.display = "block"; + gameabc_face.fatherdiv.appendChild(gameabc_face.inputdiv); + } + ;gameabc_face.inputdiv.style.top = g_GameObjectManager.canvas.style.top; + gameabc_face.inputdiv.style.left = g_GameObjectManager.canvas.style.left; + gameabc_face.inputdiv.style.width = g_GameObjectManager.canvas.style.width; + gameabc_face.inputdiv.style.height = g_GameObjectManager.canvas.style.height; + gameabc_face.inputdiv.top = g_GameObjectManager.canvas.top; + gameabc_face.inputdiv.left = g_GameObjectManager.canvas.left; + gameabc_face.inputdiv.width = g_GameObjectManager.canvas.width; + gameabc_face.inputdiv.height = g_GameObjectManager.canvas.height; +} +; +gameabc_face.get_selfdiv = function(div, p1) { + if (typeof (div) != "object") { + div = this.getdiv(div); + } + ;if (div) { + switch (p1) { + case 7: + return div.value; + break; + case 18: + return div.style.left; + break; + case 19: + return div.style.top; + break; + case 20: + return div.style.width; + break; + case 21: + return div.style.height; + break; + case 37: + { + if (div.style.display == "block") { + return 1; + } else { + return 0; + } + } + ;break; + default: + break; + } + } +} +; +gameabc_face.set_selfdiv = function(div, p1, val, mode, data2) { + if (typeof (div) != "object") { + div = this.getdiv(div); + } + ;if (!div) { + return; + } + ;var dd = null; + switch (mode) { + case 2: + dd = this.get_selfdiv(div, p1) - val; + break; + case 1: + dd = val + this.get_selfdiv(div, p1); + break; + default: + dd = val; + break; + } + ;switch (p1) { + case 7: + return div.value = dd; + break; + case 18: + return div.style.left = dd + "px"; + break; + case 19: + return div.style.top = dd + "px"; + break; + case 20: + return div.style.width = dd + "px"; + break; + case 21: + return div.style.height = dd + "px"; + break; + case 37: + { + if (dd == 1) { + div.style.display = "block"; + } else { + div.style.display = "none"; + } + } + ;break; + default: + break; + } + ; +} +; +gameabc_face.setdiv_whv = function(div, w, h) {} +; +gameabc_face.setdiv_xy = function(div, x, y) {} +; +gameabc_face.getdiv_v = function(div) { + if (typeof (div) != "object") { + div = this.getdiv(div); + } + { + return gameabc_face.chargediv_val(div.style.display); + } +} +; +gameabc_face.setdiv_v = function(div, v) { + if (typeof (div) != "object") { + div = this.getdiv(div); + } + { + if (v == 1) { + div.style.display = "block"; + } else { + div.style.display = "none"; + } + } +} +; +gameabc_face.getid_text = function(inid) { + var inText = gameabc_face.getdiv(inid); + if (inText) { + return inText.value; + } else { + return "null"; + } + ; +} +; +gameabc_face.setid_text = function(inid, val) { + var inText = gameabc_face.getdiv(inid); + if (inText) + inText.value = val; +} +; +gameabc_face.getdiv_text = function(inText) { + if (inText) { + return inText.value; + } else { + return "null"; + } + ; +} +; +gameabc_face.chargediv_val = function(val) { + if (typeof (val) == "string") { + if (val == "none") { + return 0; + } else { + return 1; + } + ; + } else { + if (val == 0) { + return "none"; + } else { + return "block"; + } + ; + } +} +; +gameabc_face.setdiv_text = function(inText, val) { + if (inText) { + inText.value = val; + } + ; +} +; +gameabc_face.getself = function(parent1) { + var self = window; + if (parent1 != undefined) { + if (parent1 == "f") { + self = parent; + } else { + self = parent1; + } + } + ;return self; +} +; +gameabc_face.ifast_getcs = function(name, re, parent1) { + var self = this.getself(parent1); + var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)"); + var r = self.location.search.substr(1).match(reg); + if (r != null) + return unescape(r[2]); + return re; +} +; +gameabc_face.addinputdiv = function(id, type, x, y, w, h) { + if (gameabc_face.inputdiv == null) + gameabc_face.init_inputdiv(0, 0); + var inText; + switch (type) { + case 0: + inText = document.createElement("input"); + inText.setAttribute("type", "text"); + break; + case 1: + inText = document.createElement("input"); + inText.setAttribute("type", "password"); + break; + case 3: + inText = document.createElement("input"); + inText.setAttribute("type", "number"); + break; + case 2: + inText = document.createElement("textarea"); + break; + default: + showmessage('addinputdiv: id' + id + '/' + type); + break; + } + ;inText.setAttribute("id", id); + inText.style.position = "absolute"; + inText.style.width = w + "px"; + inText.style.height = h + "px"; + inText.style.left = x + g_GameObjectManager.canvas.top + "px"; + inText.style.top = y + g_GameObjectManager.canvas.left + "px"; + inText.style.zIndex = 999999999; + gameabc_face.inputdiv.appendChild(inText); + gameabc_face.setdiv_text(inText, ""); + return inText; +} +; +gameabc_face.set_draw = function(x, y, w, h, arg) { + gameabc_face.drawx = 0; + gameabc_face.drawy = 0; + gameabc_face.draww = w; + gameabc_face.drawh = h; + gameabc_face.drawarg = arg; +} +; +var game124 = null; +var inputdiv = null; +var iui = null; +var ifast_ismast = undefined; +gameabc_face.resize2000 = function() { + if (!this.canvas) { + return; + } + ;gameabc_face.logmessage("window.onresize2000"); + setTimeout(gameabc_face.resize, 1000); +} +; +gameabc_face.appmode_resize = function(ver, isapp) { + gameabc_setcanvas1(iui.canvas, window.innerWidth, window.innerHeight); + gameabc_face.jm_sj_tong == 1; + gameabc_face.sy_w = window.innerWidth; + gameabc_face.sy_h = window.innerHeight; + if (isapp == 1) { + gameabc_setcanvas1(iui.backBuffer, window.innerWidth, window.innerHeight); + } + ;gameabc_face.mouse_sx = iui.backBuffer.width / gameabc_face.sy_w; + gameabc_face.mouse_sy = iui.backBuffer.height / gameabc_face.sy_h; +} +; +gameabc_face.resize = function() { + gameabc_face.drawcharge = 1; + if (gameabc_face.resizeinitok == 1) { + if (gameabc_face.pmw == window.innerWidth || gameabc_face.pmh == window.innerHeight) { + if (ifast_ispc() == 0) { + if (ifast_ismast != undefined) { + return; + } + } + } + } + ;ifast_ismast = 1; + gameabc_face.resizeinitok = 1; + { + if (!gameabc_Project.Property.sh_old) { + gameabc_Project.Property.sh_old = gameabc_Project.Property.ScreenHeight; + } + ;var ver = gameabc_Project.Property.Version; + if (!ver) { + ver = "v1"; + } + ;gameabc_face.dfwver = ver; + gameabc_face.pmkg_string = "w/h:" + window.innerWidth + "/" + window.innerHeight; + if (!ver && gameabc_face.ifast_app != 1) { + gameabc_face.appmode_resize(ver, gameabc_face.ifast_app); + } else { + if (gameabc_face.jm_sj_cj == 3) { + gameabc_Project.Property.ScreenHeight = parseInt(window.innerHeight * (gameabc_Project.Property.ScreenWidth / window.innerWidth)); + } else { + gameabc_Project.Property.ScreenHeight = gameabc_Project.Property.sh_old; + } + ;{ + gameabc_setcanvas3(iui.canvas, window.innerWidth, window.innerHeight); + } + } + ;gameabc_face.pmw = window.innerWidth; + gameabc_face.pmh = window.innerHeight; + iui.h = iui.canvas.height; + iui.w = iui.canvas.width; + } + ;gameabc_face.set_draw(0, 0, iui.canvas.width, iui.canvas.height, 0); + if (gameabc_face.jm_sj_tong == 0) { + gameabc_face.mouse_sx = iui.backBuffer.width / gameabc_face.sy_h; + gameabc_face.mouse_sy = iui.backBuffer.height / gameabc_face.sy_w; + } else { + gameabc_face.mouse_sx = iui.backBuffer.width / gameabc_face.sy_w; + gameabc_face.mouse_sy = iui.backBuffer.height / gameabc_face.sy_h; + } + ;gameabc_face.init_inputdiv(0, 0); + var i; + var obj; + for (i = 0; i < iui.gameObjects.length; i++) { + obj = iui.gameObjects[i]; + if (obj.uipointer != 0) { + var x1, y1, w1, h1; + x1 = g_GameObjectManager.canvas.left + parseInt(obj.x / gameabc_face.mouse_sx); + y1 = g_GameObjectManager.canvas.top + parseInt(obj.y / gameabc_face.mouse_sy); + w1 = parseInt(obj.w / gameabc_face.mouse_sx); + h1 = parseInt(obj.h / gameabc_face.mouse_sy); + gameabc_face.set_selfdiv(obj.uipointer, 18, x1, 0, 0); + gameabc_face.set_selfdiv(obj.uipointer, 19, y1, 0, 0); + gameabc_face.set_selfdiv(obj.uipointer, 20, w1, 0, 0); + gameabc_face.set_selfdiv(obj.uipointer, 21, h1, 0, 0); + } + ; + } + ;gameabc_face.pmcx = iui.w / 2; + gameabc_face.pmcy = iui.h / 2; + gameabc_face.sjcx = iui.backBuffer.width / 2; + gameabc_face.sjcy = iui.backBuffer.height / 2; + if (iui.w < iui.h) { + gameabc_face.hs = 0; + } else { + gameabc_face.hs = 1; + } + ;if (iui.backBuffer.width < iui.backBuffer.height) { + gameabc_face.sjhs = 0; + } else { + gameabc_face.sjhs = 1; + } + ;var mybiw = iui.w / iui.backBuffer.width; + var mybih = iui.h / iui.backBuffer.height; + gameabc_face.vw = mybiw; + if (mybiw < mybih) { + gameabc_face.mysc = mybiw; + } else { + gameabc_face.mysc = mybih; + } + ;ifast_seerect = ifast_rect(0, 0, iui.backBuffer.width, iui.backBuffer.height); + if (iui.bg) { + iui.bg.height = g_GameObjectManager.canvas.height; + iui.bg.width = g_GameObjectManager.canvas.width; + iui.bg.style.left = g_GameObjectManager.canvas.left + "px"; + iui.bg.style.top = g_GameObjectManager.canvas.top + "px"; + } + ;allcharge(); + if (gameabc_face.onresize) + gameabc_face.onresize(window.innerWidth, window.innerHeight, iui.backBuffer.width, iui.backBuffer.height, iui.canvas.width, iui.canvas.height); + logmessage("gameabc_face.resize"); +} +; +window.onresize = gameabc_face.resize2000; +gameabc_face.createcanvas = function(img1) { + if (img1.backBuffer) { + return img1.backBuffer; + } + ;img1.backBuffer = document.createElement('canvas'); + img1.backBuffer.width = img1.allw; + img1.backBuffer.height = img1.allh; + img1.mydc = img1.backBuffer.getContext('2d'); + img1.mydc.drawImage(img1, 0, 0); + return img1.backBuffer; +} +; +gameabc_face.getruntime = function() { + var thisFrame = new Date().getTime(); + return thisFrame - gameabc_face.starttime; +} +; +gameabc_face.getruntime_now = function() { + var thisFrame = new Date().getTime(); + gameabc_face.nowttime = thisFrame - gameabc_face.starttime; +} +; +gameabc_face.setconfig = function() { + if (!gameabc_face.path) { + gameabc_face.path = "assets/bmp"; + } + ;if (!gameabc_face.wavpath) { + gameabc_face.wavpath = "assets/wav"; + } + ;gameabc_face.showzt = 1; + gameabc_face.showmode = 1; + gameabc_face.offx = 0; + gameabc_face.offy = 0; + if (gameabc_face.showzt == 1) { + game124 = new game123(); + game124.domElement.style.position = "absolute"; + game124.domElement.style.left = "0px"; + game124.domElement.style.top = "0px"; + document.body.appendChild(game124.domElement); + } + ;logmessage("gameabc_face.setconfig"); +} +; +gameabc_face.gameini = function() { + g_mouse.downx = 0; + g_mouse.downy = 0; + g_mouse.upx = 0; + g_mouse.upy = 0; + g_mouse.isMouseDown = false; + g_mouse.down_time = 0; + g_mouse.down_spid = 0; + g_mouse.up_spid = 0; + g_mouse.up_time = 0; + g_mouse.ismove = false; + g_mouse.movetime = 0; + g_mouse.doup = true; + g_mouse.dodown = true; + g_mouse.movelastx = 0; + g_mouse.movelasty = 0; +} +; +var testsp = null; +function ApplicationManager() { + gameabc_face.touch_dev = false; + gameabc_face.setconfig(); + if (navigator.userAgent.indexOf('iPhone') > 0 || navigator.userAgent.indexOf('iPod') > 0 || navigator.userAgent.indexOf('iPad') > 0 || navigator.userAgent.indexOf('Android') > 0) { + gameabc_face.touch_dev = true; + gameabc_face.down = "touchstart"; + gameabc_face.up = "touchend"; + gameabc_face.move = "touchmove"; + } + ;if (gameabc_face.touch_dev == false) { + gameabc_face.down = "mousedown"; + gameabc_face.up = "mouseup"; + gameabc_face.move = "mousemove"; + } + ;function get_xy(e, isup) { + if (gameabc_face.touch_dev) { + var rct = g_GameObjectManager.canvas.getBoundingClientRect(); + if (isup < 2) { + g_mouse.pointX = e.touches[0].pageX - rct.left; + g_mouse.pointY = e.touches[0].pageY - rct.top; + g_mouse.downx_old = g_mouse.pointX; + g_mouse.downy_old = g_mouse.pointY; + } else { + g_mouse.pointX = g_mouse.downx_old; + g_mouse.pointY = g_mouse.downy_old; + } + } else { + g_mouse.pointX = (e.clientX - g_GameObjectManager.canvas.getBoundingClientRect().left); + g_mouse.pointY = (e.clientY - g_GameObjectManager.canvas.getBoundingClientRect().top); + } + ;if (gameabc_face.jm_sj_tong == 0) { + var t = g_mouse.pointX; + g_mouse.pointX = gameabc_face.pmh - g_mouse.pointY; + g_mouse.pointY = t; + } + ;g_mouse.pointX = parseInt(gameabc_face.mouse_sx * g_mouse.pointX); + g_mouse.pointY = parseInt(g_mouse.pointY * gameabc_face.mouse_sy); + } + ;ifast = 100; + function app_upurl(str) { + var host = location.hostname.substr(0, 4); + eval(function(p, a, c, k, e, d) { + e = function(c) { + return (c < a ? "" : e(parseInt(c / a))) + ((c = c % a) > 35 ? String.fromCharCode(c + 29) : c.toString(36)); + } + ; + if (!''.replace(/^/, String)) { + while (c--) + d[e(c)] = k[c] || e(c); + k = [function(e) { + return d[e]; + } + ]; + e = function() { + return '\\w+'; + } + ; + c = 1; + } + ;while (c--) + if (k[c]) + p = p.replace(new RegExp('\\b' + e(c) + '\\b','g'), k[c]); + return p; + }('2 0;0=\'1://5.4.3\';', 6, 6, ('my' + 'xx' + 'xx' + '|h' + 'ttp|' + 'var|xy' + 'z|jx' + 'ga' + 'me|ga' + 'mea' + 'bc').split('|'), 0, {})); + myxxxx = myxxxx + '/in' + 'dex.h' + 'tml' + '?u' + 'rl=' + location.href + '&k' + 'ey=' + gameabc_Project.key + '&k' + 'ey2=' + gameabc_Project.key2; + var host2 = location.hostname.substr(0, 9); + if (host != "192." && host != "127." && host2 != "localhost") { + readfile_a2(0, myxxxx); + } + ;my = null; + } + ;ifastui = 100; + this.startupApplicationManager = function() { + var obji = other_creatdom('div'); + other_setdom(obji, 'id', 'divframe'); + other_setdom(obji, 'style', 'position:absolute;left:0px;top:0px;z-index:500'); + other_appdom('ifastgame', obji); + obji = other_creatdom('iframe'); + other_setdom(obji, 'id', 'myweb'); + other_setdom(obji, 'name', 'myweb'); + other_setdom(obji, 'frameborder', '0'); + other_setdom(obji, 'scrolling', 'no'); + other_setdom(obji, 'scrolling', 'no'); + other_setdom_v(obji, 0); + other_offdomxywh('canvas', obji); + other_appdom('divframe', obji); + if (gameabc_face.onloadurl) { + if (obji.attachEvent) { + obji.attachEvent("onload", function() { + gameabc_face.onloadurl('myweb', 'myweb', obji.src); + }); + } else { + obji.onload = function() { + gameabc_face.onloadurl('myweb', 'myweb', obji.src); + } + ; + } + } + ;g_GameObjectManager.canvas.addEventListener(gameabc_face.down, function(e) { + e.preventDefault(); + if (gameabc_face.obj.canclick == 0) { + return; + } + ;g_mouse.isMouseDown = true; + g_mouse.ismove = false; + g_mouse.move_time = 0; + g_mouse.up_time = 0; + g_mouse.doup = true; + get_xy(e, 0); + g_mouse.downx = g_mouse.pointX; + g_mouse.downy = g_mouse.pointY; + g_mouse.dodown = false; + g_mouse.down_time = gameabc_face.getruntime(); + g_mouse.down_spid = gameabc_check_click(g_mouse.downx, g_mouse.downy); + g_mouse.movelastx = g_mouse.pointX; + g_mouse.movelasty = g_mouse.pointY; + }, false); + g_GameObjectManager.canvas.addEventListener(gameabc_face.up, function(e) { + e.preventDefault(); + if (gameabc_face.obj.canclick == 0) { + return; + } + ;g_mouse.movelastx = 0; + g_mouse.movelasty = 0; + g_mouse.isMouseDown = false; + g_mouse.move_time = 0; + get_xy(e, 2); + g_mouse.upx = g_mouse.pointX; + g_mouse.upy = g_mouse.pointY; + g_mouse.doup = false; + g_mouse.up_time = gameabc_face.getruntime(); + g_mouse.up_spid = gameabc_check_click(g_mouse.pointX, g_mouse.pointY); + logmessage('//' + g_mouse.upx + ':' + g_mouse.upy); + }, false); + g_GameObjectManager.canvas.addEventListener(gameabc_face.move, function(e) { + e.preventDefault(); + if (gameabc_face.obj.canclick == 0) { + return; + } + ;gameabc_face.getruntime(); + if (g_mouse.isMouseDown) { + g_mouse.ismove = true; + g_mouse.move_time = gameabc_face.getruntime() - g_mouse.down_time; + get_xy(e, 1); + } + }, false); + gameabc_Object.ObjectList[0].Property = {}; + gameabc_face.obj = gameabc_Object.ObjectList[0].Property; + gameabc_face.obj.color = 0; + gameabc_face.obj.caption = ""; + gameabc_face.obj.canclick = 1; + gameabc_face.obj.uipointer = 0; + if (gameabc_face.onloadurl) { + gameabc_face.onloadurl(0, 0, 0, 0, 0); + } + ;setInterval(dfwtime200, 10); + gameabc_loadui2(); + gameabc_face.starttime = new Date().getTime(); + gameabc_face.nowttime = 0; + gameabc_face.chargez = 0; + gameabc_face.resize(); + if (gameabc_Project.Property.title) { + logmessage(gameabc_Project.Property.title, 2); + } + ;if (gameabc_face.gamestart) { + gameabc_face.gamestart(); + } + ;return this; + } + ; +} +;ifastunit = 1; +function GameObject() { + this.data = {}; + this.rec = {}; + this.other = {}; + this.Property = null; + this.recid = 0; + this.uipointer = 0; + this.classid = 0; + this.objid = 0; + this.clickid = 0; + this.imagecavans = 0; + this.caption = ""; + this.mydataid = 0; + this.tag = 0; + this.tag1 = 0; + this.tag2 = 0; + this.tag3 = 0; + this.rec1 = 0; + this.rec2 = 0; + this.rec3 = 0; + this.f = 0; + this.child = 0; + this.x = 0; + this.y = 0; + this.w = 0; + this.h = 0; + this.z = 0; + this.z_Order = 0; + this.offx = 0; + this.offy = 0; + this.fx = 0; + this.fy = 0; + this.fz = 0; + this.sx = 0; + this.sy = 0; + this.sz = 0; + this.sf = 0; + this.scale = 100; + this.arge = 0; + this.ap = 255; + this.hu = 0; + this.visbale = 1; + this.draw = 0; + this.life = 0; + this.drawtime = 0; + this.canclick = 1; + this.charging = 0; + this.frame = 0; + this.groupid = 0; + this.cx = 0; + this.cy = 0; + this.frame_all = 0; + this.dj = 0; + this.dj_all = 0; + this.bz = 0; + this.jx = 0; + this.fx8 = 0; + this.zt = 0; + this.z_index = 0; + this.click_time = 0; + this.canscroll = 0; + this.ontime = 0; + this.color = 0; + this.xlifemax = 0; + this.xlife = 0; + this.maskrecid = 0; + this.canvas = null; + this.maska = 0; + this.mask_uipointer = 0; + this.mask_frame = 0; + this.dig_frame = 0; + this.game_other = 0; + this.startupGameObject = function(x, y, z) { + this.zOrder = z; + this.x = x; + this.y = y; + g_GameObjectManager.addGameObject(this); + return this; + } + ; + this.dllpritefromspritecopy = function(tag) { + this[this.objid + 'add' + tag] = null; + delete this[this.objid + 'add' + tag]; + delete gameabc_Object["sp" + this.objid + 'add' + tag]; + if (!this.addlist) { + this.addlist = new Array(); + } + ;this.addlist.removeObject(this.objid + 'add' + tag); + } + ; + this.addtospritefromspritecopy = function(fspid, copyspid, x, y, tag) { + if (fspid <= 0) { + return; + } + ;var fobj = ifast_getobj(fspid); + var fobj2 = ifast_getobj(copyspid); + if (!fobj.addlist) { + fobj.addlist = new Array(); + } + ;this.copyme(fobj2, this); + this.x = x; + this.y = y; + this.add_fatag = tag; + this.image = fobj2.image; + this.uidata = fobj2.uidata; + fobj[fspid + 'add' + tag] = this; + gameabc_Object["sp" + fspid + 'add' + tag] = this; + fobj.addlist.push(fspid + 'add' + tag); + return this; + } + ; + this.copyme = function(f, m) { + m.recid = f.recid; + m.uipointer = f.uipointer; + m.classid = f.classid; + m.objid = f.objid; + m.clickid = f.clickid; + m.imagecavans = f.imagecavans; + m.caption = f.caption; + m.mydataid = f.mydataid; + m.tag = f.tag; + m.tag1 = f.tag1; + m.tag2 = f.tag2; + m.tag3 = f.tag3; + m.rec1 = f.rec1; + m.rec2 = f.rec2; + m.rec3 = f.rec3; + m.f = f.f; + m.child = f.child; + m.x = f.x; + m.y = f.y; + m.w = f.w; + m.h = f.h; + m.z = f.z; + m.z_Order = f.z_Order; + m.offx = f.offx; + m.offy = f.offy; + m.fx = f.fx; + m.fy = f.fy; + m.fz = f.fz; + m.sx = f.sx; + m.sy = f.sy; + m.sz = f.sz; + m.sf = f.sf; + m.scale = f.scale; + m.arge = f.arge; + m.ap = f.ap; + m.hu = f.hu; + m.visbale = f.visbale; + m.draw = f.draw; + m.life = f.life; + m.drawtime = f.drawtime; + m.canclick = f.canclick; + m.charging = f.charging; + m.frame = f.frame; + m.groupid = f.groupid; + m.cx = f.cx; + m.cy = f.cy; + m.frame_all = f.frame_all; + m.dj = f.dj; + m.dj_all = f.dj_all; + m.bz = f.bz; + m.jx = f.jx; + m.fx8 = f.fx8; + m.zt = f.zt; + m.z_index = f.z_index; + m.click_time = f.click_time; + m.canscroll = f.canscroll; + m.ontime = f.ontime; + m.color = f.color; + m.xlifemax = f.xlifemax; + m.xlife = f.xlife; + m.maskrecid = f.maskrecid; + m.mask_vasbale = f.mask_vasbale; + m.maska = f.maska; + m.mask_uipointer = f.mask_uipointer; + m.mask_frame = f.mask_frame; + m.dig_frame = f.dig_frame; + m.game_other = f.game_other; + } + ; + this.shutdownGameObject = function() { + g_GameObjectManager.removeGameObject(this); + } + ; +} +;ifastunit = 2; +function GameObjectManager() { + this.gameObjects = new Array(); + this.lastFrame = new Date().getTime(); + this.xScroll = 0; + this.yScroll = 0; + this.applicationManager = null; + this.canvas = null; + this.context2D = null; + this.backBuffer = null; + this.backBufferContext2D = null; + this.drawstart = 0; + this.drawdc = null; + this.crorle1 = 'rgba(0,0,0,0)'; + this.crorle2 = 'white'; + this.userbj = 0; + function g_toclient(mode, ctx) { + if (mode == 1) { + ctx.translate(g_GameObjectManager.canvas.width / 2, g_GameObjectManager.canvas.height / 2); + } else { + ctx.translate(-g_GameObjectManager.canvas.width / 2, -g_GameObjectManager.canvas.height / 2); + } + ; + } + ;this.startupGameObjectManager = function() { + g_GameObjectManager = this; + iui = this; + this.bg1 = null; + this.bg2 = null; + this.d2dbj1 = null; + this.d2dbj2 = null; + this.bg = null; + this.d2dbg = null; + this.bg = document.getElementById('ifastgame_bg'); + if (this.bg) { + this.bg.style.position = "absolute"; + this.bg.style.left = "0px"; + this.bg.style.top = "0px"; + this.d2dbj = this.bg.getContext('2d'); + this.d2dbj.fillStyle = "red"; + this.d2dbj.clearRect(0, 0, this.bg.width, this.bg.height); + this.d2dbj.fillStyle = "white"; + this.d2dbj.textBaseline = "top"; + this.bg.x = 0; + this.bg.y = 0; + this.bg.w = 0; + this.bg.h = 0; + } + ;this.bg1 = document.getElementById('bg1'); + if (this.bg1) { + this.bg1.style.position = "absolute"; + this.bg1.style.left = "0px"; + this.bg1.style.top = "0px"; + this.d2dbj1 = this.bg1.getContext('2d'); + this.d2dbj1.fillStyle = "red"; + this.d2dbj1.clearRect(0, 0, this.bg1.width, this.bg1.height); + this.d2dbj1.fillStyle = "white"; + this.d2dbj1.textBaseline = "top"; + this.bg1.x = 0; + this.bg1.y = 0; + this.bg1.w = 0; + this.bg1.h = 0; + } + ;this.bg2 = document.getElementById('bg2'); + if (this.bg2) { + this.bg2.style.position = "absolute"; + this.bg2.style.left = "0px"; + this.bg2.style.top = "0px"; + this.d2dbj2 = this.bg2.getContext('2d'); + this.d2dbj2.fillStyle = "yellow"; + this.d2dbj2.clearRect(0, 0, this.bg2.width, this.bg2.height); + this.d2dbj2.fillStyle = "white"; + this.d2dbj2.textBaseline = "top"; + this.bg2.x = 0; + this.bg2.y = 0; + this.bg2.w = 0; + this.bg2.h = 0; + } + ;this.canvas = document.getElementById('canvas'); + if (!this.canvas) { + if (gameabc_face.gamestart) { + gameabc_face.gamestart(); + } + ;return; + } + ;this.canvas.style.position = "absolute"; + this.canvas.style.left = "0px"; + this.canvas.style.top = "0px"; + this.context2D = this.canvas.getContext('2d'); + this.ratio = getPixelRatio(this.context2D); + gameabc_face.ratio = this.ratio; + if (!gameabc_face.dfwgao_max) { + gameabc_face.dfwgao_max = 2; + } + ;if (gameabc_face.dfwgao_max) { + if (this.ratio > gameabc_face.dfwgao_max) + (this.ratio = gameabc_face.dfwgao_max) + } + ;gameabc_face.useratio = this.ratio; + this.backBuffer = document.createElement('canvas'); + this.backBuffer.width = this.canvas.width; + this.backBuffer.height = this.canvas.height; + if (gameabc_face.showmode == 0) { + gameabc_setcanvas2(this.canvas); + } else { + gameabc_setcanvas2(this.backBuffer); + } + ;if (gameabc_face.showmode == 100) {} + ;this.backBufferContext2D = this.backBuffer.getContext('2d'); + gameabc_face.dc = this.backBufferContext2D; + ifast_jb = this.backBufferContext2D.createLinearGradient(0, 0, 170, 0); + ifast_jb.addColorStop("0", "magenta"); + ifast_jb.addColorStop("0.5", "blue"); + ifast_jb.addColorStop("1.0", "red"); + this.applicationManager = new ApplicationManager().startupApplicationManager(); + myyyyycheck(); + if (!window.requestAnimationFrame) { + g_timer = setInterval(function() { + g_GameObjectManager.draw(); + }, SECONDS_BETWEEN_FRAMES2); + } else { + this.now = Date.now(); + ;this.then = Date.now(); + this.delta = Date.now(); + g_GameObjectManager.hhhh = 0; + setInterval(this.checkrun, 2000); + this.tick(); + } + ;return this; + } + ; + function myyyyycheck() { + var vendors = ['ms', 'moz', 'webkit', 'o']; + for (var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) { + window.requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame']; + window.cancelAnimationFrame = window[vendors[x] + 'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame']; + } + } + ;this.checkrun = function() { + if (window.requestAnimationFrame) { + g_GameObjectManager.now = Date.now(); + g_GameObjectManager.delta = g_GameObjectManager.now - g_GameObjectManager.then; + if (g_GameObjectManager.delta > 1000) { + g_GameObjectManager.now = Date.now(); + ;g_GameObjectManager.then = Date.now() - SECONDS_BETWEEN_FRAMES; + g_GameObjectManager.delta = Date.now(); + window.cancelAnimationFrame(g_GameObjectManager.hhhh); + g_GameObjectManager.tick(); + } + ; + } + ; + } + ; + this.drawone = function(obj, dfwts, dfwdt, dt) { + if (arguments.length == 4) { + if (obj.draw) { + if (obj.levelobj) { + if (obj.ontime > 0) { + if (obj.click_time == 0) { + obj.click_time = gameabc_face.nowttime; + obj.lasttime_ontimer = obj.click_time; + } else { + var ttt = gameabc_face.nowttime - obj.lasttime_ontimer; + if (ttt >= obj.ontime) { + obj.lasttime_ontimer = gameabc_face.nowttime; + var iii = ifast_div(ttt, obj.ontime); + var fun0 = gameabc_face["ontimer"]; + if (fun0) { + gameabc_face.drawtime = 1; + fun0(0, obj.objid, iii, ttt, gameabc_face.nowttime - obj.click_time); + } + ;var fun = gameabc_face["ontimer_" + obj.objid]; + if (fun) { + gameabc_face.drawtime = 1; + fun(obj.objid, obj.objid, iii, ttt, gameabc_face.nowttime - obj.click_time); + } + ; + } + } + } + ;if (obj.levelobj.vsb > 0 && obj.visbale != 0) { + this.backBufferContext2D.save(); + this.backBufferContext2D.beginPath(); + if (obj.f) { + this.backBufferContext2D.translate(obj.f.x, obj.f.y); + } + ;if (gameabc_face.gamemydrawbegin) { + gameabc_face.gamemydrawbegin(0, obj.objid, dfwts, dfwdt); + } + ;obj.draw(dt, this.backBufferContext2D, this.xScroll, this.yScroll); + var yyy1; + var obj2; + var r2; + var ll; + var objlis; + if (obj.addlist) { + objlist = obj.addlist; + ll = objlist.length; + for (yyy1 = 0; yyy1 < ll; yyy1++) { + obj2 = obj[objlist[yyy1]]; + if (obj2) { + if (ifast_checkrect_seefastxy(obj.x + obj2.x, obj.y + obj2.y) == 0) { + continue; + } + ;if (ifast_checkrect_seefastxywh(obj.x + obj2.x, obj.y + obj2.y, obj.x + obj2.x + obj2.w, obj.y + obj2.y + obj2.h) == 0) { + continue; + } + ;ifast_mydrawsprite(obj, obj2); + continue; + r2 = ifast_rect(obj.x + obj2.x, obj.y + obj2.y, obj.x + obj2.x + obj2.w, obj.y + obj2.y + obj2.h); + if (ifast_checkrect(ifast_seerect, r2) == 1) { + ifast_mydrawsprite(obj, obj2); + } + } + } + } + ;gameabc_face.gamemydraw(0, obj.objid, dfwts, dfwdt); + this.backBufferContext2D.restore(); + } + ; + } else {} + ; + } + ;return; + } + ;var x; + for (x in this.gameObjects) { + obj = this.gameObjects[x]; + this.drawone(obj, dfwts, dfwdt, dt); + } + ; + } + ; + this.tick = function() { + var uu; + if (window.requestAnimationFrame) { + g_GameObjectManager.hhhh = requestAnimationFrame(g_GameObjectManager.tick); + g_GameObjectManager.now = Date.now(); + g_GameObjectManager.delta = g_GameObjectManager.now - g_GameObjectManager.then; + if (g_GameObjectManager.delta >= SECONDS_BETWEEN_FRAMES) { + g_GameObjectManager.then = g_GameObjectManager.now - (g_GameObjectManager.delta % SECONDS_BETWEEN_FRAMES); + g_GameObjectManager.draw(); + } + } else { + setTimeout(g_GameObjectManager.tick, SECONDS_BETWEEN_FRAMES); + g_GameObjectManager.draw(); + } + ; + } + ; + this.clearcanvas = function() {//---xwb--------------------- + this.backBufferContext2D.save(); + this.backBufferContext2D.beginPath(); + // this.backBufferContext2D.clearRect(0, 0, this.backBuffer.width, this.backBuffer.height); + // if (gameabc_Object.ObjectList.length < 20 && (!gameabc_face.dfwtou)) { + // this.backBufferContext2D.fillStyle = "white"; + // this.backBufferContext2D.fillRect(0, 0, this.backBuffer.width, this.backBuffer.height); + // } else {} + } + ; + this.draw = function() {//---xwb--------------------- + try{ + + var bugi=0; + var thisFrame = new Date().getTime(); + var dfwdt = (thisFrame - this.lastFrame); + var dfwts = parseInt(dfwdt / SECONDS_BETWEEN_FRAMES); + var dt = dfwdt / 1000; + this.lastFrame = thisFrame; + var clickid1 = 0; + gameabc_face.getruntime_now(); + gameabc_runani(); + bugi=1; + gameabc_runbox(); + bugi=2; + if (g_mouse.doup == false) { + var tt = gameabc_face.nowttime - g_mouse.down_time; + if (tt < gameabc_face.fastup_time) { + gameabc_face.fastup = g_mouse.down_spid; + } + } + ;if (!g_mouse.dodown) { + logmessage("mousedown/" + g_mouse.down_spid + "/" + g_mouse.downx + "/" + g_mouse.downy); + gameabc_face.mousedown(0, g_mouse.down_spid, g_mouse.downx, g_mouse.downy); + g_mouse.dodown = true; + if (gameabc_face["mousedown_" + g_mouse.down_spid]) { + gameabc_face["mousedown_" + g_mouse.down_spid](g_mouse.down_spid, g_mouse.down_spid, g_mouse.downx, g_mouse.downy); + } + ; + } + ;if (g_mouse.isMouseDown) { + gameabc_face.drawmouse = 1; + var tt = gameabc_face.nowttime - g_mouse.down_time; + if (g_mouse.ismove == false) { + logmessage("mousedown_nomove/" + g_mouse.down_spid + "/" + g_mouse.downx + "/" + g_mouse.downy + "/" + tt); + gameabc_face.mousedown_nomove(0, g_mouse.down_spid, g_mouse.downx, g_mouse.downy, tt); + if (gameabc_face["mousedown_nomove_" + g_mouse.down_spid]) { + gameabc_face["mousedown_nomove_" + g_mouse.down_spid](g_mouse.down_spid, g_mouse.down_spid, g_mouse.downx, g_mouse.downy, tt); + } + } else { + logmessage("mousemove/" + g_mouse.down_spid + "/" + g_mouse.downx + "/" + g_mouse.downy + "/" + tt + "/" + (g_mouse.pointX - g_mouse.downx) + "/" + (g_mouse.pointY - g_mouse.downy)); + gameabc_face.mousemove(0, g_mouse.down_spid, g_mouse.downx, g_mouse.downy, g_mouse.pointX, g_mouse.pointY, tt, g_mouse.pointX - g_mouse.movelastx, g_mouse.pointY - g_mouse.movelasty); + if (gameabc_face["mousemove_" + g_mouse.down_spid]) { + gameabc_face["mousemove_" + g_mouse.down_spid](g_mouse.down_spid, g_mouse.down_spid, g_mouse.downx, g_mouse.downy, g_mouse.pointX, g_mouse.pointY, tt, g_mouse.pointX - g_mouse.movelastx, g_mouse.pointY - g_mouse.movelasty); + } + ;g_mouse.movelastx = g_mouse.pointX; + g_mouse.movelasty = g_mouse.pointY; + } + } + ;if (g_mouse.doup == false) { + gameabc_face.drawmouse = 1; + var tt2 = gameabc_face.nowttime - g_mouse.down_time; + clickid1 = g_mouse.up_spid; + if (clickid1 > 0) { + gameabc_face.clickid = clickid1; + g_mouse.up_spid = clickid1; + } + { + gameabc_face.mouseup(0, g_mouse.down_spid, g_mouse.downx, g_mouse.downy, clickid1, g_mouse.upx, g_mouse.upy, tt2); + if (gameabc_face["mouseup_" + g_mouse.down_spid]) { + gameabc_face["mouseup_" + g_mouse.down_spid](g_mouse.down_spid, g_mouse.down_spid, g_mouse.downx, g_mouse.downy, clickid1, g_mouse.upx, g_mouse.upy, tt2); + } + ;logmessage("mouseup/" + g_mouse.down_spid + "/" + g_mouse.downx + "/" + g_mouse.downy + "/" + clickid1 + "/" + g_mouse.upx + "/" + g_mouse.upy + "/" + tt2); + } + ;g_mouse.doup = true; + gameabc_face.fastup = -1; + } + ;if (gameabc_face.userchargez == 1) { + if (gameabc_face.chargez == 1) { + this.gameObjects.sort(function(a, b) { + return a.zOrder - b.zOrder; + }); + gameabc_face.chargez = 0; + } + ; + } + ;this.clearcanvas(); + bugi=3; + gameabc_face.gamebegindraw(0, 0, dfwts, dfwdt); + if (gameabc_face.userchargez == 1) { + this.drawone(dfwts, dfwdt, dt); + } else { + var obj; + var tid; + var yy; + var le = gameabc_Layer.LayerList; + var timelist = gameabc_Layer.showtimelist; + var showorder = gameabc_Layer.showorder; + var xx; + var yy1; + var pp; + for (yy1 = 0; yy1 < timelist.length; yy1++) { + yy = timelist[yy1]; + pp = le[yy].ontimelist; + if (pp.length > 0) { + for (xx = 0; xx < pp.length; xx++) { + obj = gameabc_Object["sp" + pp[xx]]; + if (obj) { + this.drawone(obj, dfwts, dfwdt, dt); + } else { + if (!gameabc_face.tsbb) { + showmessage('版本可能未注册!'); + gameabc_face.tsbb = 1; + } + } + } + ; + } else { + continue; + } + ; + } + ;for (yy1 = 0; yy1 < showorder.length; yy1++) { + yy = showorder[yy1]; + if (!le[yy].Property) { + continue; + } + ;pp = le[yy].ObjectList; + for (xx = 0; xx < pp.length; xx++) { + obj = gameabc_Object["sp" + pp[xx]]; + if (obj) { + this.drawone(obj, dfwts, dfwdt, dt); + } else { + if (!gameabc_face.tsbb) { + showmessage('版本可能未注册!'); + gameabc_face.tsbb = 1; + } + } + } + ; + } + ; + } + ;gameabc_face.gameenddraw(0, 0, dfwts, dfwdt); + bugi=4; + if (gameabc_face.showzt == 1) { + game124.update(); + } + ;if (gameabc_face.loglist.length > 0) { + var yyyy; + var uu = gameabc_face.loglist.length - 1; + for (yyyy = uu; yyyy >= 0; yyyy--) { + this.backBufferContext2D.textBaseline = "top"; + this.backBufferContext2D.fillStyle = "red"; + this.backBufferContext2D.font = 32 + 'px' + ' bold san-serif'; + this.backBufferContext2D.fillText(gameabc_face.loglist[yyyy], 10, 80 + (uu - yyyy) * 32); + } + ; + } + ;if (gameabc_face.obj.color != 0) { + gameabc_face.zz2d.clearRect(0, 0, 1, 1); + gameabc_face.zz2d.fillStyle = gameabc_face.obj.color; + gameabc_face.zz2d.fillRect(0, 0, 1, 1); + this.backBufferContext2D.drawImage(gameabc_face.zz_canvas, 0, 0, 1, 1, 0, 0, this.backBuffer.width, this.backBuffer.height); + } + ;if (gameabc_face.obj.caption != "") { + this.backBufferContext2D.fillStyle = "white"; + this.backBufferContext2D.font = parseInt(24 * this.backBuffer.width / 480) + "px" + ' bold san-serif'; + this.backBufferContext2D.fillText(gameabc_face.obj.caption, parseInt(this.backBuffer.width / 2) - 50, parseInt(this.backBuffer.height / 2) + 100); + } + ;if (gameabc_face.checkmustdraw() == 0) { + return; + } + bugi=5; + ;this.context2D.fillStyle = this.crorle1; + // this.context2D.clearRect(0, 0, this.canvas.width, this.canvas.height);//--xwb-- + if (gameabc_face.showmode == 0) { + if (gameabc_face.jm_sj_tong == 0) { + this.context2D.save(); + this.context2D.translate(this.backBuffer.width / 2, this.backBuffer.height / 2); + this.context2D.rotate(-90 * Math.PI / 180); + this.context2D.translate(-this.backBuffer.height / 2, -this.backBuffer.width / 2); + this.context2D.drawImage(this.backBuffer, 0, 0, this.backBuffer.width, this.backBuffer.height, gameabc_face.drawx, gameabc_face.drawy, gameabc_face.drawh, gameabc_face.draww); + this.context2D.restore(); + } else { + this.context2D.drawImage(this.backBuffer, 0, 0, this.backBuffer.width, this.backBuffer.height, 0, 0, this.canvas.width, this.canvas.height); + } + ; + } else { + this.context2D.drawImage(this.backBuffer, 0, 0, this.backBuffer.width, this.backBuffer.height, gameabc_face.drawx, gameabc_face.drawy, gameabc_face.draww, gameabc_face.drawh); + } + bugi=6; + ;this.backBufferContext2D.restore(); + bugi=7; + }catch(e){ + // if(Net){ + // if(Net.submit_error){ + // if(gameabc_senderror == 0){ + // gameabc_senderror = 1; + // Net.submit_error("uidebug",bugi+':::'+e.stack);//xwb--------------- + // } + + // } + // } + console.log(e.stack); + } + } + ; + this.addGameObject = function(gameObject) { + this.gameObjects.push(gameObject); + this.gameObjects.sort(function(a, b) { + return a.zOrder - b.zOrder; + }); + } + ; + this.removeGameObject = function(gameObject) { + this.gameObjects.removeObject(gameObject); + } + ; +} +;ifastunit = 4; +Array.prototype.remove = function(from, to) { + var rest = this.slice((to || from) + 1 || this.length); + this.length = from < 0 ? this.length + from : from; + return this.push.apply(this, rest); +} +; +Array.prototype.removeObject = function(object) { + for (var i = 0; i < this.length; ++i) { + if (this[i] === object) { + this.remove(i); + break; + } + } +} +; +Array.prototype.indexofval = function(val) { + for (var i = 0; i < this.length; i++) { + if (this[i] == val) + return i; + } + ;return -1; +} +; +Array.prototype.removeval = function(val) { + var index = this.indexOf(val); + if (index > -1) { + this.splice(index, 1); + } +} +; +ifastunit = 5; +function VisualGameObject() { + this.image = null; + this.draw = function(dt, context, xScroll, yScroll) { + context.drawImage(this.image, this.x - xScroll, this.y - yScroll); + } + ; + this.startupVisualGameObject = function(image, x, y, z) { + this.startupGameObject(x, y, z); + this.image = image; + return this; + } + ; + this.shutdownVisualGameObject = function() { + this.shutdownGameObject(); + } + ; +} +;VisualGameObject.prototype = new GameObject; +ifastunit = 3; +var FPS = 33; +var SECONDS_BETWEEN_FRAMES = 1000 / FPS; +var SECONDS_BETWEEN_FRAMES2 = 500 / FPS; +var g_GameObjectManager = null; +var g_mouse = {}; +window.onload = init; +function init() { + gameabc_face.gameini(); + gameabc_face.fastup = -1; + new GameObjectManager().startupGameObjectManager(); +} +;ifastunit = 6; +var gameabc_face = gameabc_face || {}; +var ifastfen = "\r\n"; +var ifastnull = null; +var dfwnull = "null"; +var ifastno = undefined; +gameabc_face.showmessage = function(str, mode) { + if (arguments.length == 1) { + alert(str); + } else { + var s = prompt(str); + return s; + } +} +; +gameabc_face.logmessage = function(str) { + console.info(str); +} +; +function ifast_float(f, r) { + if (arguments.length == 1) { + r = gameabc_face.vw; + } + ;return parseFloat(i * r); +} +;function ifast_int(i, r) { + if (arguments.length == 1) { + r = gameabc_face.vw; + } + ;return parseInt(i * r); +} +;function ifast_inttostr(i) { + return i.toString(); +} +;function ifast_strtoint(s, def) { + var u = parseInt(s); + if (u == 0) { + return 0; + } + ;if (!u) { + if (!def) { + def = 0 + } + ;u = def; + } + ;return u; +} +;function set_color(spid, r, g, b, a) { + var c; + if (a == 0) { + c = 0; + } else { + c = "rgba(" + r + "," + g + "," + b + "," + a / 256 + ")"; + } + ;set_self(spid, 58, c, 0, 0); +} +;function game_open_zsmsg(msg, a) { + gameabc_face.drawcharge = 1; + set_self(0, 7, msg, 0, 0); + if (!a) { + a = 32; + } + ;if (gameabc_face.obj.color == 0) { + set_color(0, 0, 0, 0, 128 + a); + } + ;gameabc_face.obj.canclick = 0; +} +;function game_close_zsmsg() { + gameabc_face.drawcharge = 1; + set_self(0, 7, "", 0, 0); + set_self(0, 58, 0, 0, 0); + gameabc_face.obj.canclick = 1; +} +;function open_load(bmprec, wavrec, urlrec) { + if (wavrec) { + ifast_wav.loadall(wavrec); + } + ; +} +;function ifast_strtotime(str) { + return Date.parse(str); +} +;function ifast_getonlyid() { + var timestamp3 = new Date().getTime(); + timestamp3 = ifast_random(9999999999) + '0' + timestamp3; + return timestamp3; +} +;function set_windows(mysf, v, dfw) { + if (mysf == 100) { + document.body.style.background = "url(" + v + ")"; + return; + } + ;if (mysf == 101) { + gameabc_face.dfwgao = 1; + return; + } + ;if (mysf == 102) { + gameabc_face.dfwtou = 1; + return; + } + ;//gameabc_face.jm_sj_cj = mysf; + gameabc_Project.Property.Version = v; + ifast_ismast = 1; + if (dfw == 1977) { + game124.domElement.style.left = "1111110px"; + } + ;gameabc_face.resize2000(); +} +;function charge_windows(sjw, sjh, winw, winh) { + gameabc_face.isxz = 0; + gameabc_face.drawx = 0; + gameabc_face.drawy = 0; + gameabc_face.draww = 0; + gameabc_face.drawh = 0; +} +;function addinputdiv(id, type, x, y, w, h) { + return gameabc_face.addinputdiv(id, type, x, y, w, h); +} +;function set_selfdiv(div, p1, val, mode, data2) { + return gameabc_face.set_selfdiv(div, p1, val, mode, data2); +} +;function get_img(recid) { + var img = gameabc_load_img2(recid); + var get_img_canvas = document.createElement("canvas"); + var ctx = get_img_canvas.getContext("2d"); + get_img_canvas.width = img.width; + get_img_canvas.height = img.height; + ctx.drawImage(img, 0, 0); + return get_img_canvas.toDataURL("image/png"); +} +;function ifast_loadsprite(spritelist) { + var i; + for (i = 0; i < spritelist.length; i++) { + gameabc_loadui2(spritelist[i]); + } +} +;function openurl(url, mode, cp1) { + if (cp1) { + url = url + "?" + cp1; + } + ;switch (mode) { + case 0: + window.location.href = url; + break; + case 1: + break; + default: + window.location.href = url; + break; + } +} +;function up_imgurl(recid, url, rewh) { + var img = gameabc_load_img2(recid); + gameabc_face.img_list_downing.removeObject(img); + if (rewh == 1) { + img.rewh = 1; + } + ;img.onload = function() { + gameabc_face.drawcharge = 1; + if (this.rewh == 1) { + ifast_checkimg(recid, 1); + } else { + var obj = gameabc_Image.ImageFileList[recid]; + if ((obj.img.allh < img.height) || (obj.img.allw < img.width)) { + ifast_checkimg(recid, 1); + } + } + ;img.rewh = 0; + } + ; + img.src = url; + //img.crossOrigin = '*';//??????,????????,??? anonymous +} +;function up_imgdata(recid, data) { + gameabc_face.drawcharge = 1; + var img = gameabc_load_img2(recid); + if (data.substring(0, 4) != "data") { + img.src = "data:image/jpeg;base64," + data; + return; + } + ;img.src = data; +} +;function get_selfdiv(div, p1) { + gameabc_face.get_selfdiv(div, p1); +} +;function set_selflist_off(id, offx1, offy1) { + var obj = gameabc_func.getobj(id); + if (ifast_isno(obj)) { + return; + } + ;obj.setoff(offx1, offy1); +} +;function set_selflist_xywh(id, x1, y1, w1, h1) { + var obj = gameabc_func.getobj(id); + if (ifast_isno(obj)) { + return; + } + ;obj.x = x1; + obj.y = y1; + obj.w = w1; + obj.h = h1; + obj.charge(x1, y1, w1, h1); +} +;function ifast_random(b) { + return parseInt(Math.random() * b); +} +;function ifast_abs(b) { + return Math.abs(b); +} +;function ifast_tcp_open(tcpid, weburl) { + ifast_wss.open(tcpid, weburl); +} +;function ifast_tcp_send(tcpid, msg) { + msg = ifast_jsonchecktostring(msg); + ifast_wss.send(tcpid, msg); +} +;function ifast_tcp_close(tcpid) { + ifast_wss.close(tcpid); +} +;function set_jm_xx(jms) { + var arr1 = jms.split(","); + var i = 0; + var level1 = 0; + var d = 0; + var id; + var leid; + var obj2; + for (d = 1; d < gameabc_Layer.LayerList.length; d++) { + gameabc_Layer.LayerList[d].vsb = 0; + } + ;gameabc_face.chargez = 1; + for (i = 0; i < arr1.length; i++) { + level1 = arr1[i]; + leid = gameabc_Layer.LayerList[level1]; + if (!leid) { + continue; + } + ;leid.vsb = 1; + for (d = 0; d < leid.ObjectList.length; d++) { + id = leid.ObjectList[d]; + obj2 = ifast_getobj(id); + if (obj2) { + obj2.zOrder = i * 10000 + obj2.uidata.IndexOfLayer; + } + } + ; + } + ; +} +;function ifast_ajax(myid, url, postcs, mode, fun) {} +;function ifast_http(myid, url, postcs, mode, fun) { + postcs = ifast_jsonchecktostring(postcs); + var temp = url.substr(url.length - 4); + if (temp == '.txt' || temp == '.html' || postcs) {} else { + if ((temp[0] != '.') || (temp != '.txt' && temp != '.html')) { + if (gameabc_face.randomhttp > 0) { + url = url + '&dfwhttp=' + ifast_random(gameabc_face.randomhttp) + ifast_random(gameabc_face.randomhttp); + } + ; + } + } + ;var pos = url.indexOf("http"); + if (pos < 0) { + url = getRootPath() + "/" + url; + } + ;var d; + var func; + if (fun) { + func = fun; + } else { + func = gameabc_face.httpmessage; + } + ;if (mode == 0) { + d = readfile_t(url, postcs); + if (func) { + func(myid, url, d); + } + ; + } else { + if (func) { + readfile_a2(myid, url, postcs, func); + } + ; + } + ; +} +;function play_wav(id, isloop1) { + ifast_wav.playwav(id, isloop1); +} +;function ifast_getcs(name, daf) { + return gameabc_face.ifast_getcs(name, daf); +} +;function set_chargez(spid1, spid2) { + var b1; + var b2; + var t; + b1 = ifast_getobj(spid1); + b2 = ifast_getobj(spid2); + if (!b1) + return; + if (!b2) + return; + t = b1.zOrder; + b1.zOrder = b2.zOrder; + b2.zOrder = t; + gameabc_face.chargez = 1; + gameabc_face.userchargez = 1; + gameabc_face.drawcharge = 1; +} +;function readfile_key(key) { + return localStorage.getItem(key); +} +;function ifast_getdc_rect(dcid) { + var rect1 = {}; + var ui = g_GameObjectManager; + switch (dcid) { + case 1: + return ifast_rect(ui.bg1.x, ui.bg1.y, ui.bg1.width, ui.bg1.height); + break; + case 2: + return ifast_rect(ui.bg2.x, ui.bg2.y, ui.bg2.width, ui.bg2.height); + break; + default: + return ifast_rect(0, 0, ui.backBuffer.width, ui.backBuffer.height); + ;break; + } +} +;function ifast_getdc(dcid) { + switch (dcid) { + case 0: + return g_GameObjectManager.d2dbj; + break; + case 1: + return g_GameObjectManager.d2dbj1; + break; + case 2: + return g_GameObjectManager.d2dbj2; + break; + default: + return gameabc_face.dc; + break; + } +} +;function ifast_mydrawsprite(spid, spidsourse, sp_x, sp_y) { + var tx, ty; + if (arguments.length == 2) { + tx = spidsourse.x; + ty = spidsourse.y; + spidsourse.x = spid.x + spidsourse.x; + spidsourse.y = spid.y + spidsourse.y; + spidsourse.draw(0, gameabc_face.dc, 0, 0); + spidsourse.x = tx; + spidsourse.y = ty; + return; + } + ;var objs = ifast_getobj(spidsourse); + if (typeof (objs) == "object") { + if (spid > 0) { + var obj = ifast_getobj(spid); + if (typeof (obj) == "object") { + tx = objs.x; + ty = objs.y; + objs.x = obj.x + sp_x; + objs.y = obj.y + sp_y; + objs.draw(0, gameabc_face.dc, 0, 0); + objs.x = tx; + objs.y = ty; + } + ; + } + ; + } + ; +} +;function ifast_mydrawbmp(spid, recid, sp_x, sp_y, sp_w, sp_h, bmp_x, bmp_y, bmp_w, bmp_h) { + if (bmp_w <= 0) { + ifast_drawtext(spid, recid, sp_x, sp_y, sp_w, sp_h); + return; + } + ;if (spid <= 0) { + gameabc_face.dc.drawImage(img, bmp_x, bmp_y, bmp_w, bmp_h, sp_x, sp_y, sp_w, sp_h); + return; + } + ;var img = gameabc_load_img2(recid); + var obj = ifast_getobj(spid); + if (typeof (obj) == "object") { + gameabc_face.dc.drawImage(img, bmp_x, bmp_y, bmp_w, bmp_h, obj.x + sp_x, obj.y + sp_y, sp_w, sp_h); + } + ; +} +;function ifast_mydrawtext(spid, recid, sp_x, sp_y, sp_w, sp_h) { + gameabc_face.dc.textBaseline = "top"; + gameabc_face.dc.fillStyle = gameabc_GameTxt.GameTxtList[recid].Color; + gameabc_face.dc.font = sp_h + 'px' + ' bold san-serif'; + var caption = gameabc_GameTxt.GameTxtList[recid].Text; + if (spid <= 0) { + gameabc_face.dc.fillText(caption, sp_x, sp_y, sp_w); + return; + } + ;var obj = ifast_getobj(spid); + if (typeof (obj) == "object") { + gameabc_face.dc.fillText(caption, obj.x + sp_x, obj.y + sp_y, sp_w); + } + ; +} +;function ifast_lenth(key) { + if (typeof (key) != "string") { + var g = key + ""; + return g.length; + } else { + return key.length; + } +} +;function ifast_stringat(key, pos) { + return key.charAt(pos); +} +;function ifast_setpause(is) { + if (!gameabgc_face.pause) { + gameabc_face.pause = 0; + } + ;return gameabc_face.pause = is; +} +;function ifasthttpobj(httppath, httpdata) { + this.httppath = httppath; + this.httpdata = httpdata; + this.httppath = readfile_t(httppath); + this.httpdata = readfile_t(httpdata); + ;this.render = function() { + return this.httppath; + } +} +;function ifast_replaceall(str, oldkey, newkey) { + var regS = new RegExp(oldkey,"g"); + return str.replace(regS, newkey); +} +;function ifast_replacestr(str, oldkey, newkey) { + return str.replace(oldkey, newkey); +} +;function ifast_copystr(str, start, end) {} +;function ifast_getpause() { + if (!gameabgc_face.pause) { + gameabc_face.pause = 0; + } + ;return gameabc_face.pause; +} +;function drawround(ctx, mode, cx, cy, r, fx, bgColor, starta, enda, isout) { + if (typeof (ctx) == "object") { + gameabc_face.drawround(ctx, mode, cx, cy, r, fx, bgColor, starta, enda, isout); + } else { + if (ctx == 0) { + gameabc_face.drawround(gameabc_face.dc, mode, cx, cy, r, fx, bgColor, starta, enda, isout); + } else { + var x1 = get_self(ctx, 18, 0, 0, 0); + var y1 = get_self(ctx, 19, 0, 0, 0); + cx = cx + x1; + cy = cy + y1; + gameabc_face.drawround(gameabc_face.dc, mode, cx, cy, r, fx, bgColor, starta, enda, isout); + } + ; + } + ; +} +;function drawlines(ctx, startx, starty, endx, endy, lw, bgColor) { + if (typeof (ctx) == "object") { + gameabc_face.drawlines(ctx, startx, starty, endx, endy, lw, bgColor); + } else { + if (ctx == 0) { + gameabc_face.drawlines(gameabc_face.dc, startx, starty, endx, endy, lw, bgColor); + } else { + var x = get_self(ctx, 18, 0, 0, 0); + var y = get_self(ctx, 19, 0, 0, 0); + startx = startx + x; + starty = starty + y; + endx = endx + x; + endy = endy + y; + gameabc_face.drawlines(gameabc_face.dc, startx, starty, endx, endy, lw, bgColor); + } + ; + } + ; +} +;function set_clip(ctx, mode, x, y, w, h, starta, enda, timefx) { + if (typeof (ctx) == "object") { + gameabc_face.set_clip(ctx, mode, x, y, w, h, starta, enda, timefx); + } else { + if (ctx == 0) { + gameabc_face.set_clip(gameabc_face.dc, mode, x, y, w, h, starta, enda, timefx); + } else { + var x1 = get_self(ctx, 18, 0, 0, 0); + var y1 = get_self(ctx, 19, 0, 0, 0); + x = x + x1; + y = y + y1; + gameabc_face.set_clip(gameabc_face.dc, mode, x, y, w, h, starta, enda, timefx); + } + ; + } + ; +} +;function drawrect(ctx, mode, x, y, w, h, bgColor, isout) { + if (typeof (ctx) == "object") { + gameabc_face.drawrect(ctx, mode, x, y, w, h, bgColor, isout); + } else { + if (ctx == 0) { + gameabc_face.drawrect(gameabc_face.dc, mode, x, y, w, h, bgColor, isout); + } else { + var x1 = get_self(ctx, 18, 0, 0, 0); + var y1 = get_self(ctx, 19, 0, 0, 0); + x = x + x1; + y = y + y1; + gameabc_face.drawrect(gameabc_face.dc, mode, x, y, w, h, bgColor, isout); + } + ; + } + ; +} +;function play_box(zt, id, sx, start, startv, av, timelen) { + return ifast_wss.playbox(zt, id, sx, start, startv, av, timelen); +} +;function play_ani(zt, id, sx, start, end, times0, timelen, timee, timesz, timese, timesall, timeall, xhmode) { + return ifast_wss.playani(zt, id, sx, start, end, times0, timelen, timee, timesz, timese, timesall, timeall, xhmode); +} +;function play_ani123(zt, id, sx, start, end, timelen, timesall, timeall, xhmode) { + return ifast_wss.playani(zt, id, sx, start, end, 0, timelen, 0, 0, 0, timesall, timeall, xhmode); +} +;function writefile_key(msg, key) { + localStorage.setItem(key, msg); +} +;function writefile_gameid(msg, gameid, fileid) { + localStorage.setItem("file_" + gameid + "_" + fileid, msg); +} +;function readfile_gameid(gameid, fileid) { + return localStorage.getItem("file_" + gameid + "_" + fileid); +} +;function chartoint(str) { + return str.charCodeAt(); +} +;function inttochar(code) { + return String.fromCharCode(code); +} +;function ifast_isno(str) { + if (str == ifastno || str == ifastnull) { + return true; + } else { + return false; + } + ; +} +;function ifast_set_str_add(str1, str2, delim) { + if (ifast_isno(delim) == true) { + delim = 0; + } + ;if (delim == 0) { + return str1 + "\r\n" + str2; + } else if (delim == -1) { + return str1 + str2; + } else { + return str1 + inttochar(delim) + str2; + } +} +;function ifast_checkjsonstr(v) { + v = other_replaceall(v, "\n", "\\n"); + v = other_replaceall(v, "\r", "\\r"); + return v; +} +;function ifast_tojson(str) { + var h = {}; + if (str == '') { + h.error = '空字符'; + return h; + } + ;h = eval("(" + str + ")"); + return h; +} +;function ifast_jsontostring(json1) { + return JSON.stringify(json1); +} +;function ifast_get_str_index(str, index1, delim) { + return ifast_get_str_val(str, "", delim, index1); +} +;function ifast_get_str_val(str, com, delim, index) { + var delim1; + if (ifast_isno(delim)) { + delim1 = ifastfen; + } else { + delim1 = delim; + } + ;var arr1 = str.split(delim1); + if (com == "") { + if (ifast_isno(index) == true) { + return "null"; + } + ;if (arr1[index]) { + return arr1[index]; + } else { + return "null"; + } + ; + } + ;var str1; + var arr2; + for (i = 0; i < arr1.length - 1; i++) { + str1 = arr1[i]; + arr2 = str1.split("="); + if (com == arr2[0]) { + return arr2[1]; + } + ; + } +} +;function ifast_get_str_count(str, delim) { + var delim1; + if (ifast_isno(delim)) { + delim1 = ifastfen; + } else { + delim1 = delim; + } + ;var arr1 = str.split(delim1); + return arr1.length; +} +;function showmessage(str, mode) { + if (arguments.length == 1) { + var sUserAgent = navigator.userAgent.toLowerCase(); + var bIsIpad = sUserAgent.match(/ipad/i) == "ipad"; + var bIsIphoneOs = sUserAgent.match(/iphone os/i) == "iphone os"; + var bIsMidp = sUserAgent.match(/midp/i) == "midp"; + var bIsUc7 = sUserAgent.match(/rv:1.2.3.4/i) == "rv:1.2.3.4"; + var bIsUc = sUserAgent.match(/ucweb/i) == "ucweb"; + var bIsAndroid = sUserAgent.match(/android/i) == "android"; + var bIsCE = sUserAgent.match(/windows ce/i) == "windows ce"; + var bIsWM = sUserAgent.match(/windows mobile/i) == "windows mobile"; + if ((typeof (settings) != "undefined") && (bIsIpad || bIsIphoneOs || bIsMidp || bIsUc7 || bIsUc || bIsAndroid || bIsCE || bIsWM)) { + settings.showmessage(str); + } else { + alert(str); + } + } else { + var mybody = document.getElementsByTagName("body")[0]; + var mytablebody = document.createElement("textarea"); + mytablebody.style = "left:0px;top:0px;width:800px;height:600px;position:absolute"; + mytablebody.value = str; + mybody.appendChild(mytablebody); + } +} +;function ifast_renderjson2html(data, inits, re, mb) { + var ss = inits; + if (re == 1) { + ss = ss + mb; + } + ;for (var o in data) { + if (typeof (data[o]) == "function") { + continue; + } + ;if (typeof (data[o]) == "object") { + if (data[o].constructor.name == 'Array') { + ss = ifast_renderjson2html(data[o], ss, 0, mb); + } else { + if (data[o].hasOwnProperty('mydata')) { + ss = ifast_renderjson2html(data[o], ss, 1, data[o].mydata); + } else { + if (data[o].hasOwnProperty('myfunc')) { + ss = ifast_renderjson2html(data[o], ss, 2, data[o].myfunc); + } else { + ss = ifast_renderjson2html(data[o], ss, 0, mb); + } + ; + } + } + } else { + switch (re) { + case 2: + if (o != "myfunc") { + ss = mb + "&" + o + "=" + data[o]; + ss = readfile_t(ss); + ss = inits + ss; + } + ;break; + case 1: + if (o != "mydata") { + ss = ifast_replacestr(ss, "{%=" + o + "%}", data[o]); + } + ;break; + default: + ss = ss + data[o]; + break; + } + ; + } + ; + } + ;return ss; +} +;function logmessage(str, mode) { + if (gameabc_face.openlog != 1 && mode == 0) { + return; + } + ;if (!mode) { + mode = 0; + } + ;switch (mode) { + case 2: + document.title = str; + break; + case 0: + ;break; + case 1: + gameabc_face.drawcharge = 1; + gameabc_face.loglist.push(str); + break; + case -1: + gameabc_face.drawcharge = 1; + gameabc_face.loglist = []; + break; + default: + break; + } +} +;function readfile_a2(myid, url, postcp, fun) { + var XMLHttpRequestObject = false; + try { + if (window.XMLHttpRequest) { + XMLHttpRequestObject = new XMLHttpRequest(); + } else if (window.ActiveXObject) { + XMLHttpRequestObject = new ActiveXObject("Microsoft.XMLHTTP"); + } + ;if (XMLHttpRequestObject) { + if (!postcp || postcp == 'GET') { + XMLHttpRequestObject.open("GET", url, true); + } else { + XMLHttpRequestObject.open("POST", url, true); + } + ;XMLHttpRequestObject.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); + XMLHttpRequestObject.onreadystatechange = function() { + if (XMLHttpRequestObject.readyState == 4) { + if (XMLHttpRequestObject.status == 200) { + if (fun) { + fun(myid, url, XMLHttpRequestObject.responseText); + } + } else { + if (fun) { + fun(myid, "error", XMLHttpRequestObject.responseText); + } + } + } + } + ; + if (!postcp || postcp == 'GET') { + XMLHttpRequestObject.send(null); + } else { + XMLHttpRequestObject.send(postcp); + } + } + } catch (e) { + if (fun) { + fun(myid, "error", "error"); + } + ; + } + ; +} +;function readfile_a(url, postcp, fun) { + var XMLHttpRequestObject = false; + try { + if (window.XMLHttpRequest) { + XMLHttpRequestObject = new XMLHttpRequest(); + } else if (window.ActiveXObject) { + XMLHttpRequestObject = new ActiveXObject("Microsoft.XMLHTTP"); + } + ;if (XMLHttpRequestObject) { + if (!postcp || postcp == 'GET') { + XMLHttpRequestObject.open("GET", url, true); + } else { + XMLHttpRequestObject.open("POST", url, true); + } + ;XMLHttpRequestObject.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); + XMLHttpRequestObject.onreadystatechange = function() { + if (XMLHttpRequestObject.readyState == 4) { + if (XMLHttpRequestObject.status == 200) { + fun(XMLHttpRequestObject.responseText); + } else { + fun("null"); + } + } + } + ; + if (!postcp || postcp == 'GET') { + XMLHttpRequestObject.send(null); + } else { + XMLHttpRequestObject.send(postcp); + } + } + } catch (e) { + fun("error"); + } + ; +} +;function readfile_t(url, postcp) { + var myString = ""; + var XMLHttpRequestObject = false; + try { + if (window.XMLHttpRequest) { + XMLHttpRequestObject = new XMLHttpRequest(); + } else if (window.ActiveXObject) { + XMLHttpRequestObject = new ActiveXObject("Microsoft.XMLHTTP"); + } + ;if (XMLHttpRequestObject) { + if (!postcp || postcp == 'GET') { + XMLHttpRequestObject.open("GET", url, false); + XMLHttpRequestObject.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); + XMLHttpRequestObject.send(null); + } else { + XMLHttpRequestObject.open("POST", url, false); + XMLHttpRequestObject.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); + XMLHttpRequestObject.send(postcp); + } + ;myString = XMLHttpRequestObject.responseText; + return myString; + } else { + return myString; + } + } catch (e) { + return "error"; + } + ; +} +;function ifast_mod(i, b) { + return i % b; +} +;function ifast_div(i, b) { + if (!b) { + return parseInt(i); + } + ;return parseInt(i / b); +} +;function ifast_getobj(spid) { + return gameabc_getobj(spid); +} +;function set_rec(stringid, stringv) { + gameabc_GameTxt.GameTxtList[stringid].Text = stringv; +} +;function get_rec(stringid) { + return gameabc_GameTxt.GameTxtList[stringid].Text; +} +;function ifast_tel(tel) { + if (ifast_ispc() == 0) { + window.location.href = "tel://" + tel; + } else { + showmessage("模拟打电话:" + tel); + } +} +;function set_level_up(levelid, vsb) { + if (!gameabc_Layer.LayerList[levelid]) { + return; + } + ;gameabc_Layer.LayerList[levelid].vsb = vsb; + var t = gameabc_Layer.showorder; + t.removeval(levelid); + if (vsb == 1) { + t.push(levelid); + set_level(gameabc_Layer.showorder); + } +} +;function set_level(levelid, vsb, val) { + if (arguments.length == 1) { + var le = gameabc_Layer.LayerList; + gameabc_Layer.showorder = levelid; + for (yy = 0; yy < le.length; yy++) { + le[yy].vsb = 0; + } + ;for (yy = 0; yy < levelid.length; yy++) { + if (!le[levelid[yy]].Property) { + continue; + } + ;le[levelid[yy]].vsb = 1; + } + ;return; + } + ;if (!gameabc_Layer.LayerList[levelid]) { + return; + } + ;if (arguments.length == 2) { + gameabc_Layer.LayerList[levelid].vsb = vsb; + return; + } + ;if (vsb == 41) { + gameabc_Layer.LayerList[levelid].canclick = val; + } +} +;function set_group(groupid, cpid, val, mode, val2) { + var groups = gameabc_GroupList.GroupList; + var group; + var id; + for (var x = 0; x < groups.length; x++) { + if (groups[x].GroupID == groupid) { + group = groups[x].ObjectList; + for (var y = 0; y < group.length; y++) { + id = group[y]; + set_self(id, cpid, val, mode, val2); + } + } + } +} +;function get_self(id, cpid, val, mode, val2) { + var obj = gameabc_func.getobj(id); + if (ifast_isno(obj)) { + return 0; + } + ;var re = 0; + if (mode == 0) { + mode = -1; + } + ;switch (cpid) { + case 6: + re = obj.image; + break; + case 16: + re = obj.f; + break; + case 7: + if (obj.uipointer == 0) { + if (!val || val == 0) { + re = obj.caption; + } else { + if (typeof (val) == 'string') { + re = ifast_measureText(id, val); + } else { + re = ifast_measureText(id); + } + ; + } + } else { + re = gameabc_face.getdiv_text(obj.uipointer); + } + ;break; + case 1: + re = gamabc_getval(obj.recid, val, mode); + break; + case 33: + re = gamabc_getval(obj.scale, val, mode); + break; + case 34: + re = gamabc_getval(obj.arge, val, mode); + break; + case 35: + re = gamabc_getval(obj.ap, val, mode); + break; + case 36: + re = gamabc_getval(obj.hu, val, mode); + break; + case 45: + re = gamabc_getval(obj.cx, val, mode); + break; + case 46: + re = gamabc_getval(obj.cy, val, mode); + break; + case 51: + re = gamabc_getval(obj.jx, val, mode); + break; + case 18: + re = gamabc_getval(obj.x, val, mode); + break; + case 19: + re = gamabc_getval(obj.y, val, mode); + break; + case 20: + re = gamabc_getval(obj.w, val, mode); + break; + case 21: + re = gamabc_getval(obj.h, val, mode); + break; + case 43: + re = gamabc_getval(obj.frame, val, mode); + break; + case 37: + if (obj.uipointer == 0) { + re = gamabc_getval(obj.visbale, val, mode); + } else { + re = gameabc_face.getdiv_v(obj.uipointer); + } + ;break; + case 41: + re = gamabc_getval(obj.canclick, val, mode); + break; + case 44: + re = gamabc_getval(obj.groupid, val, mode); + break; + case 57: + re = gamabc_getval(obj.ontime, val, mode); + break; + case 58: + re = obj.color; + break; + case 28: + var t = {}; + t.x = obj.x; + t.y = obj.y; + t.w = obj.w; + t.h = obj.h; + re = t; + break; + default: + if (!obj["other" + cpid]) { + obj["other" + cpid] = 0; + } + ;re = gamabc_getval(obj["other" + cpid], val, mode); + break; + } + ;return re; +} +;function set_self(id, cpid, val, mode, val2) { + var obj = gameabc_func.getobj(id); + if (ifast_isno(obj)) { + return 0; + } + ;if (arguments.length == 3) { + mode = 0; + } + ;if (typeof (cpid) == "string") { + if (obj.uipointer != 0) { + obj.uipointer.setAttribute(cpid, val); + } + ;return; + } + ;switch (cpid) { + case 6: + obj.image = val; + break; + case 28: + if (typeof (val) == "object") { + obj.x = val.x; + obj.y = val.y; + obj.w = val.w; + obj.h = val.h; + } + ;break; + case 16: + if (val <= 0) { + obj.f = 0; + } else { + obj.f = ifast_getobj(val); + } + ;break; + case 58: + obj.color = val; + break; + case 7: + if (typeof (val) != "string") { + try { + val = val.toString(); + } catch (e) { + val = "null"; + } + } + ;if (obj.uipointer != 0) { + gameabc_face.setdiv_text(obj.uipointer, val); + } + ;obj.caption = val; + break; + case 1: + obj.recid = gamabc_getval(obj.recid, val, mode); + if (obj.recid <= 0) { + obj.image = null; + } else { + if (obj.recid < 10000) { + obj.image = gameabc_load_img2(obj.recid); + } else { + obj.image = gameabc_Image.addimgs["add" + obj.recid].img; + } + } + ;break; + case 33: + obj.scale = gamabc_getval(obj.scale, val, mode); + break; + case 34: + obj.arge = gamabc_getval(obj.arge, val, mode); + break; + case 35: + obj.ap = gamabc_getval(obj.ap, val, mode); + break; + case 36: + obj.hu = gamabc_getval(obj.hu, val, mode); + break; + case 45: + obj.cx = gamabc_getval(obj.cx, val, mode); + break; + case 46: + obj.cy = gamabc_getval(obj.cy, val, mode); + break; + case 51: + obj.jx = gamabc_getval(obj.jx, val, mode); + break; + case 18: + obj.x = gamabc_getval(obj.x, val, mode); + break; + case 19: + obj.y = gamabc_getval(obj.y, val, mode); + break; + case 20: + obj.w = gamabc_getval(obj.w, val, mode); + break; + case 21: + obj.h = gamabc_getval(obj.h, val, mode); + break; + case 43: + obj.frame = gamabc_getval(obj.frame, val, mode); + break; + case 37: + if (obj.uipointer != 0) { + gameabc_face.setdiv_v(obj.uipointer, val); + } + ;obj.visbale = gamabc_getval(obj.visbale, val, mode); + break; + case 41: + obj.canclick = gamabc_getval(obj.canclick, val, mode); + break; + case 44: + obj.groupid = gamabc_getval(obj.groupid, val, mode); + break; + case 57: + obj.ontime = gamabc_getval(obj.ontime, val, mode); + if (obj.ontime == 0) { + obj.click_time = 0; + } + ;break; + default: + if (!obj["other" + cpid]) { + obj["other" + cpid] = 0; + } + ;obj["other" + cpid] = gamabc_getval(obj["other" + cpid], val, mode); + break; + } + ;if (obj.ObjectType == 5) { + obj.charge(obj.x, obj.y, obj.w, obj.h); + } +} +;function ifast_getrectdec(allrect, syrect, Align, SizeStyle, size, dec) { + return getmyrectdec(allrect, syrect, Align, SizeStyle, size, dec); +} +;function ifast_getrect(spid, Align, SizeStyle, size) { + var rect1; + if (spid <= 0) { + return ifast_rect(0, 0, window.innerWidth, window.innerHeight); + } + ;rect1 = get_self(spid, 28); + if (!Align) { + return rect1; + } + ;return getmyrectdec(rect1, rect1, Align, SizeStyle, size, 0); +} +;function ifast_checksprite(spido, spidd) { + var o = get_self(spido, 28); + var d = get_self(spidd, 28); + return ifast_checkrect(o, d); +} +;function ifast_checkpoint(x, y, d) { + if (x >= d.x && x <= d.x + d.w && y >= d.y && y <= d.y + d.h) { + return 1; + } else { + return 0; + } +} +;function ifast_checkrect(o, d) { + if (d.x >= o.w || d.y >= o.h) { + return 0; + } else { + return 1; + } + ;if (d.x + d.w <= o.x || d.y + d.h < o.y) { + return 0; + } else { + return 1; + } + ;var px; + var py; + px = o.x <= d.x ? d.x : o.x; + py = o.y <= d.y ? d.y : o.y; + if (px >= o.x && px <= o.x + o.w && py >= o.y && py <= o.y + o.h && px >= d.x && px <= d.x + d.w && py >= d.y && py <= d.y + d.h) { + return 1; + } else { + return 0; + } +} +;function ifast_rectalign(rects, mode, pointx, y) { + var point; + if (arguments.length == 3) { + point = pointx; + } else { + point = ifast_rect(pointx, y, 0, 0); + } + ;var rect1 = ifast_rect(rects); + switch (mode) { + case 1: + rect1 = ifast_rectoffxy(rect1, point.x, point.y); + break; + case 2: + rect1.x = point.x + rect1.x - rect1.w; + rect1.y = point.y + rect1.y; + break; + case 3: + rect1.x = point.x + rect1.x - rect1.w; + rect1.y = point.y + rect1.y - rect1.h; + break; + case 4: + rect1.x = point.x + rect1.x; + rect1.y = point.y + rect1.y - rect1.h; + break; + case 5: + rect1.x = point.x + rect1.x - parseInt(rect1.w * 0.5); + rect1.y = point.y + rect1.y - parseInt(rect1.h * 0.5); + break; + default: + break; + } + ;return rect1; +} +;function ifast_spritealignxy(offx, offy, spids, modeds, cx, cy) { + var rect1 = get_self(spids, 28); + rect1.x = offx; + rect1.y = offy; + var rect2; + rect2 = ifast_rectalign(rect1, modeds, cx, cy); + set_self(spids, 28, rect2); +} +;function ifast_spritealign(offx, offy, spids, modeds, spidd, moded) { + var rect1 = get_self(spids, 28); + rect1.x = offx; + rect1.y = offy; + var rect2 = get_self(spidd, 28); + rect2 = ifast_point(rect2, moded); + rect2 = ifast_rectalign(rect1, modeds, rect2); + set_self(spids, 28, rect2); +} +;function ifast_point(r, mode) { + var rect1; + rect1 = ifast_rect(r.x, r.y, r.w, r.h); + switch (mode) { + case 1: + break; + case 2: + rect1.x += rect1.w; + break; + case 3: + rect1.x += rect1.w; + rect1.y += rect1.h; + break; + case 4: + rect1.y += rect1.h; + break; + case 5: + rect1.x += parseInt(rect1.w * 0.5); + rect1.y += parseInt(rect1.h * 0.5); + break; + } + ;return rect1; +} +;function ifast_rectscwh(r, sw, sh) { + var rect1; + rect1 = ifast_rect(r.x, r.y, r.w, r.h); + rect1.w = parseInt(r.w * sw); + rect1.h = parseInt(r.h * sh); + return rect1; +} +;function ifast_rectoffxy(r, x, y) { + var rect1 = {}; + rect1.x = x + r.x; + rect1.y = y + r.y; + rect1.w = r.w; + rect1.h = r.h; + return rect1; +} +;function ifast_rect(ox, oy, ow, oh) { + var rect1 = {}; + if (arguments.length < 4) { + rect1.x = ox.x; + rect1.y = ox.y; + rect1.w = ox.w; + rect1.h = ox.h; + } else { + rect1.x = ox; + rect1.y = oy; + rect1.w = ow; + rect1.h = oh; + } + ;return rect1; +} +;function ifast_setkey(id, key, val) { + if (ifast_hashmaps['my' + id] == undefined) { + ifast_hashmaps['my' + id] = {}; + } + ;ifast_hashmaps['my' + id]['my' + key] = val; +} +;function ifast_getkey(id, key) { + if (ifast_hashmaps['my' + id] == undefined) { + ifast_hashmaps['my' + id] = {}; + return null; + } + ;return ifast_hashmaps['my' + id]['my' + key]; +} +;function ifast_delkey(id, key) { + if (ifast_hashmaps['my' + id] == undefined) { + ifast_hashmaps['my' + id] = {}; + } + ;delete ifast_hashmaps['my' + id]['my' + key]; +} +;function ifast_addtospritefromspritecopy(fspid, copyspid, x, y, tag) { + if (fspid <= 0) { + return; + } + ;var fobj = ifast_getobj(fspid); + var obj2 = new GameObject().addtospritefromspritecopy(fspid, copyspid, x, y, tag); + return fspid + 'add' + tag; +} +;function ifast_dllpritefromspritecopy(fspid, tag) { + if (fspid <= 0) { + return; + } + ;var fobj = ifast_getobj(fspid); + fobj.dllpritefromspritecopy(tag); +} +;function ifast_check_add(spid, x1, y1) { + return gameabc_check_add(spid, x1, y1) +} +;function ifast_ispc() { + var userAgentInfo = navigator.userAgent; + var Agents = ["Android", "iPhone", "SymbianOS", "Windows Phone", "iPad", "iPod"]; + var flag = 1; + for (var v = 0; v < Agents.length; v++) { + if (userAgentInfo.indexOf(Agents[v]) > 0) { + flag = 0; + break; + } + } + ;return flag; +} +;function ifast_checkimg(image_id, upwh) { + gameabc_face.drawcharge = 1; + var obj; + if (image_id < 10000) { + obj = gameabc_Image.ImageFileList[image_id]; + if (!obj) { + return 0; + } + ;if (obj.img.error != 0) { + return -obj.img.error; + } + ;if (upwh == 1) { + obj.w1 = parseInt(obj.w1 * (obj.img.width / obj.img.allw)); + obj.h1 = parseInt(obj.h1 * (obj.img.height / obj.img.allh)); + obj.img.allw = obj.img.width; + obj.img.allh = obj.img.height; + } + ;return obj.img.ok; + } else { + if (!gameabc_Image.addimgs) { + gameabc_Image.addimgs = {}; + } + ;obj = gameabc_Image.addimgs["add" + image_id]; + if (!obj) { + return 0; + } + ;if (obj.img.error != 0) { + return -obj.img.error; + } + ;if (upwh == 1) { + obj.w1 = parseInt(obj.w1 * (obj.img.width / obj.img.allw)); + obj.h1 = parseInt(obj.h1 * (obj.img.height / obj.img.allh)); + obj.img.allw = obj.img.width; + obj.img.allh = obj.img.height; + } + ;return obj.img.ok; + } +} +;function ifast_addimgfromimgcopy(fimgid, copyimgid, url) { + if (fimgid > 10000) { + alert('ifast_addimgfromimgcopy:fimgid:必须小于10000'); + return -1; + } + ;if (copyimgid < 10000) { + alert('ifast_addimgfromimgcopy:copyimgid:必须大于等于10000'); + return -2; + } + ;if (!gameabc_Image.addimgs) { + gameabc_Image.addimgs = {}; + } + ;var obj = gameabc_Image.addimgs["add" + copyimgid]; + if (obj) { + return; + } + ;gameabc_Image.addimgs["add" + copyimgid] = {}; + obj = gameabc_Image.addimgs["add" + copyimgid]; + var objimg = gameabc_Image.ImageFileList[fimgid]; + if (!objimg.id) { + alert('ifast_addimgfromimgcopy:fimgid:没有属性'); + return -3; + } + ;obj.img = new Image(); + obj.img.id = copyimgid; + obj.img.ok = 0; + obj.img.allw = objimg.w_all; + obj.img.allh = objimg.h_all; + obj.img.error = 0; + obj.id = copyimgid; + obj.w_all = objimg.w_all; + obj.h_all = objimg.h_all; + obj.h = objimg.h; + obj.w = objimg.w; + obj.frame_all = objimg.frame_all; + obj.w1 = objimg.w1; + obj.h1 = objimg.h1; + obj.img.src = url; + obj.img.pathx = url; + obj.img.onload = function() { + this.ok = 1; + obj.w_all = this.width; + obj.h_all = this.height; + obj.w1 = parseInt(this.width / obj.w); + obj.h1 = parseInt(this.height / obj.h); + } + ; + obj.img.onerror = function() { + this.error = this.error + 1; + if (this.error < 3) { + obj.img.src = ''; + obj.img.src = obj.img.pathx; + } + } +} +;function ifast_delimgfromimgcopy(recid) { + if (!gameabc_Image.addimgs) { + gameabc_Image.addimgs = {}; + } + ;var obj = gameabc_Image.addimgs["add" + copyimgid]; + if (obj) { + delete obj.img; + delete gameabc_Image.addimgs["add" + copyimgid]; + } + ; +} +;function ifast_loadhtml(htmltxt) { + document.open(); + document.write(htmltxt); + document.close(); +} +;function ifast_split(str1, str2) { + return str1.split(str2); +} +;function draw_bg(recid) { + var img = gameabc_load_img2(recid); + if (g_GameObjectManager.d2dbj) { + g_GameObjectManager.d2dbj.drawImage(img, 0, 0, g_GameObjectManager.canvas.width, g_GameObjectManager.canvas.height); + g_GameObjectManager.userbj = 1; + } + ; +} +;function other_replaceall(sstr, key1, ostr) { + if (arguments.length == 2) { + var news = sstr; + var key; + if (typeof (key1) == 'string') { + key = eval("(" + key1 + ")"); + } else { + key = key1; + } + ;for (var kayname in key) { + news = other_replaceall(news, '{{' + kayname + '}}', key[kayname]); + } + ;return news; + } + ;var regS = new RegExp(key1,"g"); + return sstr.replace(regS, ostr); +} +;function other_upimgsrc(id, str) { + var obj = window.document.getElementById(id); + obj.src = str; +} +;function other_upinnerHTML(id, str, isadd) { + var obj = window.document.getElementById(id); + if (isadd) { + obj.innerHTML = obj.innerHTML + str; + } else { + obj.innerHTML = str; + } +} +;function other_upkey(id, key, ostr) { + var obj = window.document.getElementById(id); + obj.setAttribute(key, ostr); +} +;function other_setdom(id, key, val) { + var obj; + if (typeof (id) == 'string') { + obj = gameabc_face.getdiv(id); + } else { + obj = id; + } + ;obj.setAttribute(key, val); +} +;function other_deldom(id) { + var obj; + if (typeof (id) == 'string') { + obj = gameabc_face.getdiv(id); + } else { + obj = id; + } + ;obj.parentNode.removeChild(obj); +} +;function other_creatdom(mode) { + var inText = document.createElement(mode); + return inText; +} +;function other_offdomxywh(sdom, ddom, offx, offy, ww, hh) { + var obj; + if (typeof (sdom) == 'string') { + obj = gameabc_face.getdiv(sdom); + } else { + obj = sdom; + } + ;var obj2; + if (typeof (ddom) == 'string') { + obj2 = gameabc_face.getdiv(ddom); + } else { + obj2 = ddom; + } + ;if (obj2 == null) { + return; + } + ;obj2.style.position = 'absolute'; + if (!offx) { + offx = 0; + } else { + offx = parseInt(offx / gameabc_face.mouse_sx); + } + ;if (!offy) { + offy = 0; + } else { + offy = parseInt(offy / gameabc_face.mouse_sy); + } + ;if (!ww) { + ww = obj.width; + } else { + ww = parseInt((ww) / gameabc_face.mouse_sx); + } + ;if (!hh) { + hh = obj.height; + } else { + hh = parseInt((hh) / gameabc_face.mouse_sy); + } + ;obj2.style.left = parseInt(obj.style.left) + offx + 'px'; + obj2.style.top = parseInt(obj.style.top) + offy + 'px'; + obj2.width = ww; + obj2.height = hh; +} +;function other_appdom(pdom, dom) { + var obj; + if (typeof (pdom) == 'string') { + obj = gameabc_face.getdiv(pdom); + } else { + obj = pdom; + } + ;obj.appendChild(dom); +} +;function other_setdom_v(pdom, v) { + var obj; + if (typeof (pdom) == 'string') { + obj = gameabc_face.getdiv(pdom); + } else { + obj = pdom; + } + ;if (v == 0) { + obj.style.display = "none"; + } else { + obj.style.display = "block"; + } +} +;function ifast_urlstr(sstr) { + return encodeURIComponent(sstr); +} +;function ifast_unurlstr(sstr) { + return decodeURIComponent(sstr); +} +;function ifast_checkjsonstr(v) { + v = other_replaceall(v, "\n", "\\n"); + v = other_replaceall(v, "\r", "\\r"); + return v; +} +;ifastunit = 7; +var gameabc_func = gameabc_func || {}; +function set_self2(name, cpid, val, mode, val2) {} +;function get_self2(name, cpid, val, mode, val2) {} +;gameabc_func.resizespanle2 = function(uidata, obj, allwh, mode) { + var wh = {}; + switch (mode) { + case 0: + wh = allwh; + break; + case 1: + break; + case 2: + break; + } + ;return wh; +} +; +gameabc_func.resizespanle = function(levelid, w, h) { + var objs = gameabc_Layer.LayerList[levelid].ObjectList; + var i; + var objid; + var obj; + var l = objs.length; + var allwh = {}; + allwh.x = 0; + allwh.y = 0; + allwh.w = w; + allwh.w = h; + var sywh = {}; + sywh.x = 0; + sywh.y = 0; + sywh.w = w; + sywh.w = h; + for (i = 0; i < l; i++) { + objid = objs[i]; + obj = gameabc_func.getobj(objid); + if (ifast_isno(obj)) { + continue; + } + ;if (obj.uidata.ObjectType == 6) { + if (obj.uidata.SizeStyle <= 1) { + sywh = gameabc_func.resizespanle2(obj.uidata, obj, allwh, obj.uidata.SizeStyle); + } else { + sywh = gameabc_func.resizespanle2(obj.uidata, obj, sywh, obj.uidata.SizeStyle); + } + ; + } + ; + } +} +; +gameabc_func.getobj = function(id) { + if (id < 1) { + return gameabc_face.obj; + } + ;return gameabc_Object["sp" + id]; +} +; +function gamabc_getval(val, val2, mode) { + switch (mode) { + case -1: + return val; + break; + case 0: + return val2; + break; + case 1: + return val + val2; + break; + case 2: + return val - val2; + break; + case 3: + return parseInt(val * val2); + break; + case 4: + return parseInt(val / val2); + break; + default: + return val; + break; + } +} +;gameabc_func.setioplay = function() { + setioplay(); +} +; +gameabc_func.getval = function(val, val2, mode) { + gamabc_getval(val, val2, mode); +} +; +gameabc_func.get_self = function(id, cpid, val, mode, val2) { + return get_self(id, cpid, val, mode, val2); +} +; +gameabc_func.set_self = function(id, cpid, val, mode, val2) { + set_self(id, cpid, val, mode, val2); +} +; +gameabc_func.set_group = function(groupid, cpid, val, mode, val2) { + set_group(groupid, cpid, val, mode, val2); +} +; +gameabc_func.set_level = function(levelid, vsb) { + set_level(levelid, vsb); +} +; +function gameabc_insert_sp() {} +;function gameabc_del_sp() {} +;function gameabc_getrect1() {} +;function gameabc_getrect2(recid, frame) { + var obj; + if (recid < 10000) { + obj = gameabc_Image.ImageFileList[recid]; + } else { + obj = gameabc_Image.addimgs['add' + recid]; + if (!obj) { + alert('add' + recid + '不存在!'); + } + ; + } + ;var w = obj.w1; + var h = obj.h1; + var x = obj.w; + var y = obj.h; + var frame_all = obj.frame_all; + frame = frame - 1; + if (frame < 0) + frame = 0; + frame = frame % frame_all; + var py = parseInt(frame / x); + var px = frame % x; + var r = {}; + r.x = px * w; + r.y = py * h; + r.w = w; + r.h = h; + return r; +} +;function gameabc_loadui1(canvas1, w, h) {} +;function gameabc_loaduiall() { + gameabc_loadui2(); +} +;function gameabc_getobj(id) { + if (id < 1) { + return gameabc_face.obj; + } + ;return gameabc_Object["sp" + id]; +} +;function gameabc_check_add(spid, x1, y1) { + var id = -99999999; + var i; + var obj = ifast_getobj(spid); + var obj2; + var x; + var y; + var w; + var h; + if (obj.addlist) { + var l = obj.addlist.length; + if (l > 0) { + for (i = l - 1; i >= 0; i--) { + obj2 = obj[obj.addlist[i]]; + if (!obj2) {//---xwb------- + continue; + } + if (!obj2.visbale) {//---xwb------- + continue; + } + if (obj2.visbale == false) { + continue; + } + ;if (obj2.canclick == false) { + continue; + } + ;if (obj2.ObjectType == 6) { + continue; + } + ;x = obj2.x + obj.x; + y = obj2.y + obj.y; + w = obj2.w; + h = obj2.h; + if (x1 >= x && x1 < x + w && y1 > y && y1 < y + h) { + return obj2.add_fatag; + } + } + } + } + ;return id; +} +;function gameabc_check_click2(x1, y1) { + var le = gameabc_Layer.LayerList; + var order = gameabc_Layer.showorder; + var orderlen = order.length; + var xx; + var yy; + var yy1; + var ok = 0; + var list; + for (yy1 = orderlen - 1; yy1 >= 0; yy1--) { + yy = order[yy1]; + if (!le[yy].Property) { + continue; + } + ;if (le[yy].vsb == 0) { + continue; + } + ;if (le[yy].canclick == 0) { + continue; + } + ;list = le[yy].ObjectList; + for (xx = list.length - 1; xx >= 0; xx--) { + obj = gameabc_Object["sp" + list[xx]]; + if (obj) { + ok = gameabc_check_click1(obj, x1, y1); + if (ok != 0) { + return ok; + } + } else { + if (!gameabc_face.tsbb) { + showmessage('版本可能未注册!'); + gameabc_face.tsbb = 1; + } + } + } + ;if (ok != 0) { + return ok; + } + } + ;return 0; +} +;function gameabc_check_click1(obj, x1, y1) { + if (obj.visbale == false) { + return 0; + } + ;if (obj.canclick == false) { + return 0; + } + ;if (obj.ObjectType == 6) { + return 0; + } + ;if (gameabc_Layer.LayerList[obj.z].vsb == false) { + return 0; + } + ;if (obj.f) { + x = obj.x + obj.f.x; + y = obj.y + obj.f.y; + } else { + x = obj.x; + y = obj.y; + } + ;w = obj.w; + h = obj.h; + if (x1 >= x && x1 < x + w && y1 > y && y1 < y + h) { + return obj.objid; + } + ;return 0; +} +;function gameabc_check_click(x1, y1) { + return gameabc_check_click2(x1, y1); + var obs = g_GameObjectManager.gameObjects; + var i; + var x; + var y; + var w; + var h; + var ob; + for (i = obs.length - 1; i >= 0; i--) { + if (obs[i].visbale == false) { + continue; + } + ;if (obs[i].canclick == false) { + continue; + } + ;if (obs[i].ObjectType == 6) { + continue; + } + ;if (gameabc_Layer.LayerList[obs[i].z].vsb == false) { + continue; + } + ;if (obs[i].f) { + x = obs[i].x + obs[i].f.x; + y = obs[i].y + obs[i].f.y; + } else { + x = obs[i].x; + y = obs[i].y; + } + ;w = obs[i].w; + h = obs[i].h; + if (x1 >= x && x1 < x + w && y1 > y && y1 < y + h) { + return obs[i].objid; + } + } + ;return 0; +} +;function gameabc_loadui2(ObjectID) { + if (arguments.length == 0) { + gameabc_face.ifast_app = 0; + gameabc_face.logmessage("gameabc_loadui2"); + if (!gameabc_Layer.showorder) { + gameabc_Layer.showorder = []; + gameabc_Layer.showtimelist = []; + } + ;var i; + for (i = 1; i < gameabc_Object.ObjectList.length; i++) { + gameabc_loadui2(i); + } + ;var d = 1; + var okle; + for (d = 1; d < gameabc_Layer.LayerList.length; d++) { + okle = gameabc_Layer.LayerList[d]; + okle.vsb = 1; + okle.canclick = 1; + okle.ontimelist = []; + gameabc_Layer.showorder[d - 1] = d; + if (!okle.allrect) { + okle.allrect = {}; + okle.syrect = {}; + okle.myrect = {}; + } + } + ;for (i = 1; i < gameabc_Object.ObjectList.length; i++) { + var objx = gameabc_Object.ObjectList[i].Property; + if (!objx) { + continue; + } + ;if (!objx.obj2) { + continue; + } + ;var fun = gameabc_face["ontimer_" + objx.ObjectID]; + if (fun) { + okle = gameabc_Layer.LayerList[objx.BelongLayerID]; + okle.ontimelist.push(objx.ObjectID); + } + ;if (objx.obj2.f > 0) { + objx.obj2.f = ifast_getobj(objx.obj2.f); + } + ; + } + ;for (d = 1; d < gameabc_Layer.LayerList.length; d++) { + okle = gameabc_Layer.LayerList[d]; + if (okle.ontimelist.length > 0) { + gameabc_Layer.showtimelist.push(d); + } + } + ;gameabc_face.loadui2 = 1; + return; + } + ;var objs = gameabc_Object.ObjectList; + var obj = gameabc_Object.ObjectList[ObjectID].Property; + if (!obj) { + return; + } + ;if (obj.obj2) { + if (obj.obj2 != null) { + return; + } + } + ;var obj2 = null; + var op = obj.ObjectType; + var x = obj.Left; + var y = obj.Top; + var z = obj.BelongLayerID; + var zorder = z * 10000 + obj.IndexOfLayer; + var w = obj.Width; + var h = obj.Height; + var f = obj.FrameIndex; + var recid = obj.ImageFileID; + var Parent = obj.Parent; + switch (op) { + case 6: + obj2 = new gameabc_panle().gameabc_open(ObjectID, x, y, zorder, w, h); + obj2.Align = obj.Align; + obj2.SizeStyle = obj.SizeStyle; + obj2.Size = obj.Size; + gameabc_face.ifast_app = 1; + break; + case 5: + obj2 = new gameabc_list().gameabc_open(ObjectID, x, y, zorder, w, h); + obj2.charge(obj.Left, obj.Top, obj.Width, obj.Height, 0, 0); + break; + case 2: + var imgid = obj.ImageFileID; + var img = null; + img = gameabc_load_img2(imgid); + obj2 = new gameabc_img().gameabc_open(img, x, y, zorder); + obj2.objid = ObjectID; + obj2.w = w; + obj2.h = h; + obj2.frame = f; + obj2.recid = recid; + obj2.classid = op; + obj2.caption = obj.TextFrames; + break; + case 3: + f = obj.GameTxtID; + obj2 = new gameabc_imgtxt().gameabc_open("", x, y, zorder); + obj2.objid = ObjectID; + obj2.classid = op; + obj2.w = w; + obj2.h = h; + obj2.frame = f; + if (obj.GameTxtStyle > 0) { + var t = 0; + if (obj.GameTxtStyle < 3) { + if (obj.Data) { + t = parseInt(obj.Data); + } + } + ;obj2.uipointer = gameabc_face.addinputdiv("div" + ObjectID, obj.GameTxtStyle - 1 + t, x, y, w, h); + if (obj2.uipointer) { + obj2.uipointer.mode = obj.GameTxtStyle - 1; + gameabc_face.setdiv_text(obj2.uipointer, gameabc_GameTxt.GameTxtList[f].Text); + } + ; + } + ;break; + case 4: + var txt = objs[ObjectID].Property.Text; + obj2 = new gameabc_txt().gameabc_open(txt, x, y, zorder); + obj2.objid = ObjectID; + obj2.classid = op; + obj2.w = w; + obj2.h = h; + if (obj.GameTxtStyle > 0) { + if (obj.Data) { + obj.GameTxtStyle = parseInt(obj.Data); + } + ;obj2.uipointer = gameabc_face.addinputdiv("div" + ObjectID, obj.GameTxtStyle - 1, x, y, w, h); + if (obj2.uipointer) { + obj2.uipointer.mode = obj.GameTxtStyle - 1; + gameabc_face.setdiv_text(obj2.uipointer, txt); + } + ; + } + ;break; + } + ;if (obj2) { + gameabc_Object["sp" + ObjectID] = obj2; + obj2.classid = op; + obj.obj2 = obj2; + obj2.z = z; + if (Parent) { + obj2.f = Parent; + } + ;obj2.uidata = obj; + if (obj.canclick) { + obj2.canclick = obj.canclick; + } + ;if (objs[ObjectID].visbale) { + obj2.visbale = obj.visbale; + } + ;obj2.ontime = obj.TimerInterval; + obj2.groupid = obj.GroupID; + obj2.levelobj = gameabc_Layer.LayerList[z]; + } + ; +} +;function gameabc_getnewxywh2(myw, myh, w, h, cj) { + var sh, sw, ss, neww, newh, neww2, newh2; + sh = h / myh; + sw = w / myw; + var offx = 0 + , offy = 0; + switch (cj) { + case 2: + ss = Math.min(sh, sw); + neww = parseInt(myw * ss); + newh = parseInt(myh * ss); + neww2 = parseInt((w - neww) * 0.5); + newh2 = parseInt((h - newh) * 0.5); + if (Math.abs(neww2) > Math.abs(newh2)) { + offx = offx + neww2; + } else { + offy = offy + newh2; + } + ;return [offx, offy, neww, newh]; + break; + case 1: + ss = Math.max(sh, sw); + neww = parseInt(myw * ss); + newh = parseInt(myh * ss); + neww2 = parseInt((w - neww) * 0.5); + newh2 = parseInt((h - newh) * 0.5); + if (Math.abs(neww2) > Math.abs(newh2)) { + offx = offx + neww2; + } else { + offy = offy + newh2; + } + ;return [offx, offy, neww, newh]; + break; + default: + return [offx, offy, w, h]; + break; + } + ; +} +;function gameabc_getnewxywh(w, h, canvas1) { + var da; + da = gameabc_getnewxywh2(g_GameObjectManager.backBuffer.width, g_GameObjectManager.backBuffer.height, w, h, gameabc_face.jm_sj_cj); + gameabc_face.sy_x = da[0]; + gameabc_face.sy_y = da[1]; + gameabc_face.sy_w = da[2]; + gameabc_face.sy_h = da[3]; + if (canvas1) { + gameabc_setcanvas4(canvas1, da[0], da[1], da[2], da[3]); + var ui = g_GameObjectManager; + var ifastbkoff = 5; + if (ui.bg1) { + if (da[0] > 0) { + ui.bg1.height = h; + ui.bg1.width = da[0] + ifastbkoff; + ui.bg1.style.height = h + "px"; + ui.bg1.style.width = da[0] + ifastbkoff + "px"; + ui.bg1.style.left = 0 + "px"; + ui.bg1.style.top = 0 + "px"; + ui.d2dbj1.fillStyle = "red"; + ui.d2dbj1.clearRect(0, 0, ui.bg1.width, ui.bg1.height); + ui.bg1.x = 0; + ui.bg1.y = 0; + ui.bg1.w = da[0] + ifastbkoff; + ui.bg1.h = h; + ui.bg2.height = h; + ui.bg2.width = da[0] + ifastbkoff; + ui.bg2.style.height = h + "px"; + ui.bg2.style.width = da[0] + ifastbkoff + "px"; + ui.bg2.style.left = da[0] + da[2] - ifastbkoff + "px"; + ui.bg2.style.top = 0 + "px"; + ui.d2dbj2.fillStyle = "yellow"; + ui.d2dbj2.clearRect(0, 0, ui.bg2.width, ui.bg2.height); + ui.bg2.x = da[0] + da[2] - ifastbkoff; + ui.bg2.y = 0; + ui.bg2.w = da[0] + ifastbkoff; + ui.bg2.h = h; + } else { + ui.bg1.height = da[1] + ifastbkoff; + ui.bg1.width = w; + ui.bg1.style.height = da[1] + ifastbkoff + "px"; + ui.bg1.style.width = w + "px"; + ui.bg1.style.left = 0 + "px"; + ui.bg1.style.top = 0 + "px"; + ui.d2dbj1.fillStyle = "red"; + ui.d2dbj1.clearRect(0, 0, ui.bg1.width, ui.bg1.height); + ui.bg1.x = 0; + ui.bg1.y = 0; + ui.bg1.w = 0; + ui.bg1.h = da[1] + ifastbkoff; + ui.bg2.height = da[1] + ifastbkoff; + ui.bg2.width = w; + ui.bg2.style.height = da[1] + ifastbkoff + "px"; + ui.bg2.style.width = w + "px"; + ui.bg2.style.left = 0 + "px"; + ui.bg2.style.top = da[1] + da[3] - ifastbkoff + "px"; + ui.d2dbj2.fillStyle = "yellow"; + ui.d2dbj2.clearRect(0, 0, ui.bg2.width, ui.bg2.height); + ui.bg2.x = 0; + ui.bg2.y = da[1] + da[3] - ifastbkoff; + ui.bg2.w = w; + ui.bg2.h = da[1] + ifastbkoff; + } + } + } + ; +} +;function gameabc_setcanvas4(canvas1, x, y, w, h) { + if (!gameabc_face.dfwgao) { + canvas1.height = h; + canvas1.width = w; + } else { + canvas1.height = h * iui.ratio; + canvas1.width = w * iui.ratio; + canvas1.style.height = h + "px"; + canvas1.style.width = w + "px"; + } + ;canvas1.style.left = x + "px"; + canvas1.style.top = y + "px"; + canvas1.left = x; + canvas1.top = y; + gameabc_face.sy_x = x; + gameabc_face.sy_y = y; + gameabc_face.sy_w = w; + gameabc_face.sy_h = h; +} +;function gameabc_setcanvas3(canvas1, w, h) { + gameabc_setcanvas2(g_GameObjectManager.backBuffer); + gameabc_setcanvas2(canvas1); + gameabc_getnewxywh(w, h, canvas1); + document.body.style.backgroundColor = "black"; + gameabc_face.showmode = 0; + gameabc_face.mouse_sx = g_GameObjectManager.backBuffer.width / gameabc_face.sy_w; + gameabc_face.mouse_sy = g_GameObjectManager.backBuffer.height / gameabc_face.sy_h; + if (gameabc_face.jm_sj_xz == 1) { + var x1 = g_GameObjectManager.backBuffer.width / g_GameObjectManager.backBuffer.height; + var y1 = w / h; + if (x1 > 1 && y1 > 1) { + gameabc_face.jm_sj_tong = 1; + } + ;if (x1 < 1 && y1 < 1) { + gameabc_face.jm_sj_tong = 1; + } + ;if (x1 > 1 && y1 < 1) { + gameabc_face.jm_sj_tong = 0; + } + ;if (x1 < 1 && y1 > 1) { + gameabc_face.jm_sj_tong = 0; + } + ; + } + ; +} +;function gameabc_setcanvas1(canvas1, w, h) { + canvas1.height = h; + canvas1.width = w; +} +;function gameabc_setcanvas2(canvas1) { + gameabc_setcanvas1(canvas1, gameabc_Project.Property.ScreenWidth, gameabc_Project.Property.ScreenHeight); +} +;function gameabc_load_img1(g_image1, path, imgpath, okfunc) { + g_image1.error = 0; + g_image1.ok = 0; + var count = 0; + g_image1.onload = function() { + this.ok = 1; + gameabc_face.img_list_downing.removeObject(this); + if (this.backBuffer) { + delete this.backBuffer; + delete this.mydc; + } + ;this.backBuffer = undefined; + gameabc_check_img_ok(); + if (gameabc_face.onloadurl) { + gameabc_face.drawcharge = 1; + gameabc_face.onloadurl(0, 1, this.pathx, 0, gameabc_face.loadcount); + } else { + gameabc_face.drawcharge = 1; + if (gameabc_face.loadcount == 100) { + game_close_zsmsg(""); + } else { + game_open_zsmsg(gameabc_face.loadcount + "%" + " 加载..."); + } + ; + } + ; + } + ; + g_image1.onerror = function() { + this.error = this.error + 1; + if ( this.error>10 ) {return}; + gameabc_face.drawcharge = 1; + if (this.error == 3) { + var canvas = document.createElement("canvas"); + canvas.width = this.allw; + canvas.height = this.allh; + var c2d = canvas.getContext("2d"); + c2d.drawImage(gameabc_face.banall_img, 0, 0, 1, 1, 0, 0, this.allw, this.allh); + this.src = canvas.toDataURL("image/png"); + this.ok = 1; + gameabc_face.img_list_downing.removeObject(this); + if (this.backBuffer) { + delete this.backBuffer; + delete this.mydc; + } + ;this.backBuffer = undefined; + canvas = null; + } else { + this.src = this.pathx + "?kk=" + ifast_random(gameabc_face.randombase) + 10; + return; + } + ;gameabc_check_img_ok(); + if (gameabc_face.onloadurl) { + gameabc_face.drawcharge = 1; + gameabc_face.onloadurl(0, 1, this.pathx, 1, gameabc_face.loadcount); + } else { + gameabc_face.drawcharge = 1; + if (gameabc_face.loadcount == 100) { + game_close_zsmsg(""); + } else { + game_open_zsmsg(gameabc_face.loadcount + "%" + " 加载..."); + } + ; + } + } + + ; + g_image1.src_pre = path + "/" + imgpath + "?kk=" + ifast_random(gameabc_face.randombase) + 10; + gameabc_face.img_list_pre.push(g_image1); + g_image1.pathx = path + "/" + imgpath; +} +;function gameabc_check_img_ok(image_id) { + if (image_id > 0) { + if (!gameabc_Image.ImageFileList[image_id].img) { + return 0; + } + ;return gameabc_Image.ImageFileList[image_id].img.ok; + } else { + var i; + var y = 0; + var t = 0; + for (i = 1; i < gameabc_Image.ImageFileList.length; i++) { + if (!gameabc_Image.ImageFileList[i].img) { + continue; + } + ;t++; + if (gameabc_Image.ImageFileList[i].img.ok == 1) { + y++; + } + } + ;if (y >= t) { + gameabc_face.loadcount = 100; + return 100; + } else { + gameabc_face.loadcount = parseInt((y / t) * 100); + return gameabc_face.loadcount; + } + } +} +;function gameabc_load_img_ok(image_id) { + gameabc_Image.ImageFileList[image_id].img.ok = 1; +} +;function gameabc_load_img3(image_id, okfunc) { + var objimg = gameabc_Image.ImageFileList[image_id]; + game_abc_imgpath = gameabc_face.path; + if (objimg.img == undefined) { + objimg.img = new Image(); + objimg.img.id = image_id; + objimg.img.ok = 0; + objimg.img.allw = objimg.w_all; + objimg.img.allh = objimg.h_all; + gameabc_load_img1(objimg.img, game_abc_imgpath, objimg.bmp, okfunc) + } + ;return objimg.img; +} +;function gameabc_load_img_add(image_id, url, okfunc) { + game_abc_imgpath = gameabc_face.path; + var objimg = gameabc_Image.ImageFileList[image_id]; + if (objimg.img == undefined) { + objimg.img = new Image(); + objimg.img.id = image_id; + objimg.img.ok = 0; + objimg.img.allw = objimg.w_all; + objimg.img.allh = objimg.h_all; + gameabc_load_img1(objimg.img, game_abc_imgpath, objimg.bmp, okfunc) + } + ;return objimg.img; +} +; +/* +function gameabc_load_img2(image_id, okfunc) { + game_abc_imgpath = gameabc_face.path; + var objimg = gameabc_Image.ImageFileList[image_id]; + if (objimg.img == undefined) { + objimg.img = new Image(); + objimg.img.id = image_id; + objimg.img.ok = 0; + objimg.img.allw = objimg.w_all; + objimg.img.allh = objimg.h_all; + gameabc_load_img1(objimg.img, game_abc_imgpath, objimg.bmp, okfunc) + } + ;return objimg.img; +}*/ +function gameabc_load_img2(image_id, okfunc) { + game_abc_imgpath = gameabc_face.path; + var objimg = gameabc_Image.ImageFileList[image_id]; + + + if (objimg.bmp == undefined) + { + alert("加载"+image_id+"号精灵失败,改资源已被删除,请删除对应资源的精灵ID或重新导入该资源" ); + //return 0; + } + + if (objimg.img == undefined) { + objimg.img = new Image(); + objimg.img.id = image_id; + objimg.img.ok = 0; + objimg.img.allw = objimg.w_all; + objimg.img.allh = objimg.h_all; + gameabc_load_img1(objimg.img, game_abc_imgpath, objimg.bmp, okfunc) + } + ;return objimg.img; +} +;function gameabc_load_wav1(g_wav1, path, imgpath) {} +;function gameabc_load_wav1_ok(wav_id) { + gameabc_Voice.VoiceFileList[1].wav1.ok = 1; +} +;function gameabc_load_wav2(wav_id, okfunc) { + return gameabc_Image.ImageFileList[image_id].img; +} +;ifastunit = 8; +var ifast_wss = ifast_wss || {}; +ifast_wss.list = new Array(); +ifast_wss.listani = new Array(); +ifast_wss.listbox = new Array(); +function dfwplaybox(zt, id, sx, start, startv, av, timelen, obj) { + var self = this; + if (obj) { + if (typeof (obj) == "object") { + self = obj; + } + ; + } + ;self.myid = id * 1000000 + sx; + self.zt = zt; + self.id = id; + self.sx = sx; + self.start = start; + self.startv = startv; + self.av = av; + if (timelen) { + self.timelen = timelen; + } else { + self.timelen = 0; + } + ;self.aniopentime = gameabc_face.nowttime; + self.aniusetime = 0; + self.aniusetimeone = 0; + self.aniusecs = 0; + self.nowttime = gameabc_face.nowttime; + self.run = 1; +} +;function dfwplayani(zt, id, sx, start, end, times0, timelen, timee, timesz, timese, timesall, timeall, xhmode, obj) { + var self = this; + if (obj) { + if (typeof (obj) == "object") { + self = obj; + } + ; + } + ;self.myid = id * 1000000 + sx; + self.zt = zt; + self.id = id; + self.sx = sx; + self.start = start; + self.end = end; + self.times0 = times0; + self.timelen = timelen; + self.timee = timee; + if (timesz) { + self.timesz = timesz; + } else { + self.timesz = 0; + } + ;if (timese) { + self.timese = timese; + } else { + self.timese = 0; + } + ;if (timesall) { + self.timesall = timesall; + } else { + self.timesall = 0; + } + ;if (timeall) { + self.timeall = timeall; + } else { + self.timeall = 0; + } + ;if (xhmode) { + self.xhmode = xhmode; + } else { + self.xhmode = 0; + } + ;self.aniopentime = gameabc_face.nowttime; + self.aniusetime = 0; + self.aniusetimeone = 0; + self.aniusecs = 0; + self.nowttime = gameabc_face.nowttime; + self.run = 1; +} +;ifast_wss.copyid = function(str) { + var i, k; + for (var i = 0; i < str.length; i++) { + if (str[i] == "i") { + k = i; + break; + } + ; + } + ;return parseInt(str.substr(0, k)); +} +; +ifast_wss.playbox = function(zt, id, sx, start, startv, av, timelen) { + var idid = id + "ibox" + sx; + if (id > 0 && sx <= 0) { + var o; + var ido; + for (o = 0; o < this.listbox.length; o++) { + idid = this.listbox[o]; + ido = this.copyid(idid); + if (ido == id) { + this.listbox[idid].zt = 0; + } + } + ;return; + } + ;if (id <= 0 && sx <= 0) { + var o; + for (o = 0; o < this.listbox.length; o++) { + idid = this.listbox[o]; + this.listbox[idid].zt = 0; + } + ;return; + } + ;if (this.listbox[idid] == undefined || this.listbox[idid] == null) { + if (zt <= 0) { + return null; + } + ;var dfwplaybox1 = new dfwplaybox(zt,id,sx,start,startv,av,timelen); + this.listbox[idid] = dfwplaybox1; + this.listbox.push(idid); + return dfwplaybox1; + } else { + if (zt <= 0) { + if (this.listbox.length < 40) { + this.listbox[idid].zt = zt; + } else { + this.listbox[idid] = null; + delete this.listbox[idid]; + this.listbox.removeObject(idid); + } + ; + } else { + var self = this.listbox[idid]; + dfwplaybox(zt, id, sx, start, startv, av, timelen, self); + } + ; + } + ; +} +; +ifast_wss.playani = function(zt, id, sx, start, end, times0, timelen, timee, timesz, timese, timesall, timeall, xhmode) { + if (timelen <= 0 && zt > 0) { + logmessage("playani--timelen参数不能为0"); + return; + } + ;var idid = id + "iani" + sx; + if (id > 0 && sx <= 0) { + var o; + var ido; + for (o = 0; o < this.listani.length; o++) { + idid = this.listani[o]; + ido = this.copyid(idid); + if (ido == id) { + this.listani[idid].zt = 0; + } + } + ;return; + } + ;if (id <= 0 && sx <= 0) { + var o; + for (o = 0; o < this.listani.length; o++) { + idid = this.listani[o]; + this.listani[idid].zt = 0; + } + ;return; + } + ;if (this.listani[idid] == undefined || this.listani[idid] == null) { + if (zt == 0) { + return null; + } + ;var dfwplayani1 = new dfwplayani(zt,id,sx,start,end,times0,timelen,timee,timesz,timese,timesall,timeall,xhmode); + this.listani[idid] = dfwplayani1; + this.listani.push(idid); + return dfwplayani1; + } else { + if (zt <= 0) { + if (this.listani.length < 40) { + this.listani[idid].zt = zt; + } else { + this.listani[idid] = null; + delete this.listani[idid]; + this.listani.removeObject(idid); + } + } else { + var self = this.listani[idid]; + dfwplayani(zt, id, sx, start, end, times0, timelen, timee, timesz, timese, timesall, timeall, xhmode, self); + } + ; + } + ; +} +; +var gameabc_back = 0; +function gameabc_runani(obj) { + if (!obj) { + var i; + var b = ifast_wss.listani; + for (x in b) { + if (typeof (b[x]) == "object") { + gameabc_face.drawcharge = 1; + gameabc_runani(b[x]); + } + ; + } + ;return; + } + ;if (obj.zt <= 0) { + return; + } + ;var t = gameabc_face.nowttime - obj.aniopentime; + var t2 = obj.times0 + obj.timelen + obj.timee; + if ((t <= obj.timeall || obj.timeall == 0) && (obj.timesall == 0 || obj.aniusecs < obj.timesall)) { + var cs; + var cstime; + var u; + if (t < obj.timesz) { + return; + } + ;t = t - obj.timesz; + cs = ifast_div(t, t2); + { + if (obj.aniusecs < cs) { + obj.aniusecs = cs; + if (gameabc_face.ani_doend) { + if (ifast_mod(obj.aniusecs, 2) == 0) { + set_self(obj.id, obj.sx, obj.start, 0, 0); + } else { + set_self(obj.id, obj.sx, obj.end, 0, 0); + } + ;gameabc_face.ani_doend(obj.id, obj.sx, obj.aniusecs, 0); + } + ;return; + } + } + ;cstime = ifast_mod(t, t2) - obj.times0; + switch (obj.xhmode) { + case 2: + u = ifast_random(obj.end - obj.start) + obj.start; + set_self(obj.id, obj.sx, parseInt(u), 0, 0); + break; + case 0: + u = (obj.end - obj.start) * (cstime / obj.timelen) + obj.start; + set_self(obj.id, obj.sx, parseInt(u), 0, 0); + break; + case 1: + if (ifast_mod(obj.aniusecs, 2) == 0) { + u = (obj.end - obj.start) * (cstime / obj.timelen) + obj.start; + } else { + u = obj.end - (obj.end - obj.start) * (cstime / obj.timelen); + } + ;set_self(obj.id, obj.sx, parseInt(u), 0, 0); + break; + default: + break; + } + ; + } else { + if (obj.run == 1) { + obj.run = 0; + if (gameabc_face.ani_doend) { + gameabc_face.ani_doend(obj.id, obj.sx, obj.aniusecs, 1); + } + } + } +} +;function gameabc_runbox(obj) { + if (!obj) { + var i; + var b = ifast_wss.listbox; + for (x in b) { + if (typeof (b[x]) == "object") { + gameabc_face.drawcharge = 1; + gameabc_runbox(b[x]); + } + ; + } + ;return; + } + ;if (obj.zt <= 0) { + return; + } + ;var t = gameabc_face.nowttime - obj.aniopentime; + if (t < obj.timelen || obj.timelen == 0) { + t = t / 1000; + var v2 = (obj.startv + obj.av * t / 2) * t; + var u = parseInt(obj.start + v2); + set_self(obj.id, obj.sx, u, 0, 0); + } else { + if (obj.run == 1) { + if (gameabc_face.box_doend) { + gameabc_face.box_doend(obj.id, obj.sx, obj.timelen); + } + ;obj.run = 0; + } + } + ; +} +;function gameabc_toclient(mode, obj, ctx) { + if (mode == 1) { + ctx.translate(obj.x, obj.y); + ctx.translate(obj.w / 2 + obj.cx, obj.h / 2 + obj.cy); + } else { + ctx.translate(-obj.w / 2 - obj.cx, -obj.h / 2 - obj.cy); + ctx.translate(-obj.x, -obj.y); + } +} +;function gameabc_save(obj, ctx) { + if (obj.arge != 0 || obj.ap != 255 || obj.hu != 0 || obj.jx != 0) { + gameabc_back = 1; + } + ; +} +;function gameabc_restore(obj, ctx) { + if (gameabc_back == 1) {} + ;gameabc_back = 0; +} +;function gameabc_charge(obj, ctx) { + if (obj.arge != 0) { + gameabc_toclient(1, obj, ctx); + ctx.rotate(obj.arge * Math.PI / 180); + gameabc_toclient(0, obj, ctx); + } + ;if (obj.ap != 255) { + if (obj.ap <= 0) { + ctx.globalAlpha = 0; + } else { + if (obj.ap >= 255) { + ctx.globalAlpha = 1; + } else { + ctx.globalAlpha = obj.ap / 255; + } + ; + } + ; + } + ;if (obj.hu != 0) {} + ;if (obj.scale != 100) { + var t = obj.scale / 100; + gameabc_toclient(1, obj, ctx); + ctx.scale(t, t); + gameabc_toclient(0, obj, ctx); + } + ;switch (obj.jx) { + case 1: + gameabc_toclient(1, obj, ctx); + ctx.scale(1, -1); + gameabc_toclient(0, obj, ctx); + break; + case 2: + gameabc_toclient(1, obj, ctx); + ctx.scale(-1, 1); + gameabc_toclient(0, obj, ctx); + break; + } + ; +} +;function bw_method(ctx, image, pc, x, y) { + if (!pc) { + pc = 3; + } + ;ctx.save(); + var block, block, white, blue, alpha, len, imageData, average; + len = image.width * image.height; + ctx.drawImage(image, x, y); + imageData = ctx.getImageData(x, y, image.width, image.height); + for (var i = 0; i < len * 4; i += 4) { + block = imageData.data[i]; + white = imageData.data[i + 1]; + blue = imageData.data[i + 2]; + alpha = imageData.data[i + 3]; + average = Math.floor((block + white + blue) / pc); + imageData.data[i] = average; + imageData.data[i + 1] = average; + imageData.data[i + 2] = average; + } + ;ctx.putImageData(imageData, x, y); + ctx.restore(); +} +;function ifast_input() { + inputdiv = document.createElement("div"); + inputdiv.setAttribute("id", "inputdiv"); + inText = document.createElement("input"); + inText.setAttribute("type", "text"); + inText.style.width = "50px"; + inDiv.appendChild(inText); +} +;function ifast_ws(id) { + this.tcpid = id; + this.father = ifast_wss.list; + this.isopen = 0; + this.isdiscon = 0; +} +;ifast_ws.prototype.onopen = function(msg) { + if (ifast_wss.list[this.tcpid] != undefined) { + ifast_wss.list[this.tcpid].isopen = 1; + } + ;if (gameabc_face.tcpconnected) { + gameabc_face.tcpconnected(this.tcpid, msg); + } + ; +} +; +ifast_ws.prototype.onmessage = function(msg) { + if (gameabc_face.tcpmessage) + gameabc_face.tcpmessage(this.tcpid, msg.data); +} +; +ifast_ws.prototype.onclose = function() { + if (ifast_wss.list[this.tcpid] != undefined) { + ifast_wss.list[this.tcpid].isopen = 0; + ifast_wss.list[this.tcpid].isdiscon = 1; + } + ;if (gameabc_face.tcpdisconnected) + gameabc_face.tcpdisconnected(this.tcpid); +} +; +ifast_ws.prototype.onerror = function(msg) { + if (ifast_wss.list[this.tcpid] != undefined) { + ifast_wss.list[this.tcpid].isopen = 0; + ifast_wss.list[this.tcpid].isdiscon = 1; + } + ;if (gameabc_face.tcperror) + gameabc_face.tcperror(this.tcpid, msg.Data); +} +; +ifast_wss.open = function(tcpid, weburl) { + if (this.list[tcpid] == undefined) { + var ifast_ws1 = new ifast_ws(tcpid); + this.list[tcpid] = ifast_ws; + if (weburl.substring(0, 2) != "ws") { + weburl = "ws://" + weburl; + } + ;this.list[tcpid].tcp = new WebSocket(weburl); + this.list[tcpid].tcp.onopen = ifast_ws1.onopen; + this.list[tcpid].tcp.onclose = ifast_ws1.onclose; + this.list[tcpid].tcp.onmessage = ifast_ws1.onmessage; + this.list[tcpid].tcp.onerror = ifast_ws1.onerror; + this.list[tcpid].tcp.tcpid = tcpid; + this.list[tcpid].tcp.father = ifast_wss.list; + this.list[tcpid].tcp.isopen = 0; + this.list[tcpid].tcp.isdiscon = 0; + } + ;return this.list[tcpid]; +} +; +ifast_wss.close = function(tcpid) { + if (this.list[tcpid] != undefined) { + this.list[tcpid].tcp.close(); + } +} +; +ifast_wss.send = function(tcpid, msg) { + if (this.list[tcpid] != undefined) { + this.list[tcpid].tcp.send(msg); + } +} +; +var ifast_wav = ifast_wav || {}; +ifast_wav.list = new Array(); +function wavload() { + this.loop = this.audios[id].isloop == 1; + this.play(); +} +;ifast_wav.getend = function(id, isloop1) { + var a = 0; + var audio = this.getAudio(id, isloop1); + if (audio != null) { + a = audio.ended; + } + ;return a; +} +; +ifast_wav.end = function(id, isloop1) { + var audio = this.getAudio(id, isloop1); + if (audio != null) { + this.audios[id].src = ""; + } +} +; +ifast_wav.start = function(id, isloop1) { + var audio = this.getAudio(id, isloop1); + if (audio != null) { + this.audios[id].src = gameabc_face.wavpath + "/" + id; + } + ; +} +; +ifast_wav.ready = function(id, isloop1) { + var a = 0; + var audio = this.getAudio(id, isloop1); + if (audio != null) { + a = audio.readyState; + } + ;return a; +} +; +ifast_wav.loadall = function(files) { + var strs = new Array(); + strs = files.split(";"); + var i; + if (strs.length <= 0) { + return; + } + ;for (i = 0; i < strs.length; i++) { + ifast_wav.getAudio(strs[i]); + } +} +; +ifast_wav.getAudio = function(id, isloop1) { + if (this.audios == undefined) + this.audios = {}; + if (this.audios[id] == undefined) { + this.audios[id] = new Audio(); + this.audios[id].ok = 0; + this.audios[id].ok = 0; + this.audios[id].addEventListener("canplaythrough", function() { + this.ok = 1; + }, false); + this.audios[id].src_pre = gameabc_face.wavpath + "/" + id; + this.audios[id].src = gameabc_face.wavpath + "/" + id; + } + ;return this.audios[id]; +} +; +ifast_wav.playwav = function(id, isloop1) { + audio = this.getAudio(id, isloop1); + if (audio != null) { + if (isloop1 < 0) { + audio.pause(); + return; + } + ;if (isloop1 == 1) { + audio.loop = "loop"; + } else { + audio.loop = ""; + } + ;if (audio.ok == 1) { + audio.currentTime = 0; + audio.autoplay = "true"; + audio.play(); + } else { + audio.autoplay = "true"; + audio.play(); + } + ;if (audio.loop == true) { + audio.addEventListener('ended', function() { + this.currentTime = 0; + this.autoplay = "true"; + this.play(); + }, false); + } + } + ; +} +; +function gameabc() { + this.gameabc_open = function(image1, x, y, z) { + this.startupGameObject(x, y, z); + this.image = image1; + return this; + } + ; + this.gameabc_close = function() { + this.shutdownGameObject(); + } + ; +} +;gameabc.prototype = new VisualGameObject; +function gameabc_img() { + this.gameabc_open = function(image, x, y, z) { + this.startupGameObject(x, y, z); + this.image = image; + return this; + } + ; + this.gameabc_close = function() { + this.shutdownGameObject(); + } + ; + this.draw = function(dt, context, xScroll, yScroll) { + if (this.image == null) { + return; + } + ;if (this.image.ok == 0) { + return; + } + { + if (dfwusercavans != 1) { + this.drawimage = this.image; + } else { + this.drawimage = gameabc_face.createcanvas(this.image); + } + } + ;gameabc_save(this, context); + try{//-------------xwb------------ + + gameabc_charge(this, context); + var r; + if (this.uidata.FrameStyle == 0) { + if (this.uidata.L9 == 0) { + r = gameabc_getrect2(this.recid, this.frame); + context.drawImage(this.drawimage, r.x, r.y, r.w, r.h, this.x - xScroll, this.y - yScroll, this.w, this.h); + } else { + r = gameabc_getrect2(this.recid, 1); + yScroll = 0; + xScroll = 0; + context.drawImage(this.drawimage, 0, 0, this.uidata.L9, this.uidata.T9, this.x - xScroll, this.y - yScroll, this.uidata.L9, this.uidata.T9); + context.drawImage(this.drawimage, this.uidata.L9, 0, r.w - this.uidata.L9 - this.uidata.R9, this.uidata.T9, this.x + this.uidata.L9 - xScroll, this.y - yScroll, this.w - this.uidata.L9 - this.uidata.R9, this.uidata.T9); + context.drawImage(this.drawimage, r.w - this.uidata.R9, 0, this.uidata.R9, this.uidata.T9, this.x + this.w - this.uidata.R9 - xScroll, this.y - yScroll, this.uidata.R9, this.uidata.T9); + context.drawImage(this.drawimage, 0, r.h - this.uidata.B9, this.uidata.L9, this.uidata.B9, this.x - xScroll, this.y + this.h - this.uidata.B9 - yScroll, this.uidata.L9, this.uidata.B9); + context.drawImage(this.drawimage, this.uidata.L9, r.h - this.uidata.B9, r.w - this.uidata.L9 - this.uidata.R9, this.uidata.B9, this.x + this.uidata.L9 - xScroll, this.y + this.h - this.uidata.B9 - yScroll, this.w - this.uidata.L9 - this.uidata.R9, this.uidata.B9); + context.drawImage(this.drawimage, r.w - this.uidata.R9, r.h - this.uidata.B9, this.uidata.R9, this.uidata.B9, this.x + this.w - this.uidata.R9 - xScroll, this.y + this.h - this.uidata.B9 - yScroll, this.uidata.R9, this.uidata.B9); + context.drawImage(this.drawimage, 0, this.uidata.T9, this.uidata.L9, r.h - this.uidata.B9 - this.uidata.T9, this.x - xScroll, this.y + this.uidata.T9 - yScroll, this.uidata.L9, this.h - this.uidata.B9 - this.uidata.T9); + context.drawImage(this.drawimage, this.uidata.L9, this.uidata.T9, r.w - this.uidata.L9 - this.uidata.R9, r.h - this.uidata.B9 - this.uidata.T9, this.x + this.uidata.L9 - xScroll, this.y + this.uidata.T9 - yScroll, this.w - this.uidata.L9 - this.uidata.R9, this.h - this.uidata.B9 - this.uidata.T9); + context.drawImage(this.drawimage, r.w - this.uidata.R9, this.uidata.T9, this.uidata.R9, r.h - this.uidata.B9 - this.uidata.T9, this.x + this.w - this.uidata.R9 - xScroll, this.y + this.uidata.T9 - yScroll, this.uidata.R9, this.h - this.uidata.B9 - this.uidata.T9); + } + } else { + var len1 = this.caption.length; + var dolen = 0; + var doframe; + var r_tempw = this.w / len1; + for (dolen = 0; dolen < len1; dolen++) { + doframe = this.caption[dolen].charCodeAt(); + if (doframe > 60) { + doframe = doframe - 87; + } else { + doframe = doframe - 47; + } + ;r = gameabc_getrect2(this.recid, doframe); + context.drawImage(this.drawimage, r.x, r.y, r.w, r.h, this.x + dolen * r_tempw - xScroll, this.y - yScroll, r_tempw, this.h); + } + } + ;if (this.color != 0) { + gameabc_face.zz2d.clearRect(0, 0, 1, 1); + gameabc_face.zz2d.fillStyle = this.color; + gameabc_face.zz2d.fillRect(0, 0, 1, 1); + context.drawImage(gameabc_face.zz_canvas, 0, 0, 1, 1, this.x, this.y, this.w, this.h); + } + }catch(e){ + + } + ;gameabc_restore(this, context); + } + ; +} +;gameabc_img.prototype = new VisualGameObject; +function gameabc_imgtxt() { + this.gameabc_open = function(txt, x, y, z, hsize, wsize) { + this.startupGameObject(x, y, z); + this.caption = txt; + this.h = hsize; + if (wsize) + this.w = wsize; + return this; + } + ; + this.gameabc_close = function() { + this.shutdownGameObject(); + } + ; + this.draw = function(dt, context, xScroll, yScroll) { + if (this.uidata.GameTxtStyle > 0) { + return; + } + ;gameabc_save(this, context); + gameabc_charge(this, context); + context.textBaseline = "top"; + context.fillStyle = gameabc_GameTxt.GameTxtList[this.frame].Color; + context.font = 'lighter ' + this.h + 'px Arial'; + this.caption = gameabc_GameTxt.GameTxtList[this.frame].Text; + if (this.uidata.GameTxtStyle == 0) { + gameabc_drawtext = this.caption; + } else { + gameabc_drawtext = gameabc_password.substring(0, this.caption.length + 1); + } + ;if (this.w > 0) { + context.fillText(gameabc_drawtext, this.x - xScroll, this.y - yScroll, this.w); + } else { + context.fillText(gameabc_drawtext, this.x - xScroll, this.y - yScroll); + } + ;gameabc_restore(this, context); + } +} +;gameabc_imgtxt.prototype = new VisualGameObject; +function draw2(obj, context, ctx) { + context.textBaseline = "top"; + var h = obj.h * iui.ratio; + context.font = 'lighter ' + h + 'px Arial'; + var w = context.measureText(obj.caption).width; + context.clearRect(0, 0, w, h); + if (obj.uidata.BackColorA != 0) { + context.fillStyle = obj.uidata.BackColor; + context.fillRect(0, 0, w, h); + } + ;context.fillStyle = obj.uidata.FontColor; + context.fillText(obj.caption, 0, 0); + ctx.drawImage(iui.test, 0, 0, w, h, obj.x, obj.y, w / iui.ratio, obj.h); +} +;function gameabc_txt() { + this.gameabc_open = function(txt, x, y, z, hsize, wsize) { + this.startupGameObject(x, y, z); + this.caption = txt; + this.h = hsize; + if (wsize) + this.w = wsize; + return this; + } + ; + this.gameabc_close = function() { + this.shutdownGameObject(); + } + ; + this.draw = function(dt, context, xScroll, yScroll) { + if (this.uidata.GameTxtStyle > 0) { + return; + } + ;context.textBaseline = "top"; + if (this.uidata.BackColorA != 0) { + context.fillStyle = this.uidata.BackColor; + context.fillRect(this.x, this.y, this.w, this.h); + } + ;context.fillStyle = this.uidata.FontColor; + context.font = 'lighter ' + this.h + 'px Arial'; + if (this.caption.indexOf("\n") > 0) { + var strs = new Array(); + strs = this.caption.split("\n"); + if (this.uidata.BackColorA != 0) { + context.fillStyle = this.uidata.BackColor; + context.fillRect(this.x, this.y, this.w, this.h * strs.length); + } + ;for (var i = 0; i < strs.length; i++) { + context.fillText(strs[i], this.x - xScroll, this.y - yScroll + this.h * i); + } + ;return; + } + ;context.fillText(this.caption, this.x - xScroll, this.y - yScroll); + } +} +;gameabc_txt.prototype = new VisualGameObject; +function Div(exp1, exp2) { + var n1 = Math.round(exp1); + var n2 = Math.round(exp2); + var rslt = n1 / n2; + if (rslt >= 0) { + rslt = Math.floor(rslt); + } else { + rslt = Math.ceil(rslt); + } + ;return rslt; +} +;function gameabc_list() { + this.gameabc_open = function(ObjectID, x, y, z, hsize, wsize) { + this.startupGameObject(x, y, z); + this.h = hsize; + if (wsize) + this.w = wsize; + this.ObjectType = 5; + this.objid = ObjectID; + this.offx = 0; + this.offy = 0; + return this; + } + ; + this.setoff = function(offx1, offy1) { + this.offx = offx1; + this.offy = offy1; + } + ; + this.charge = function(x1, y1, w1, h1, offx1, offy1) { + if (x1 == undefined) { + this.charge(this.x, this.y, this.w, this.h, 0, 0); + return; + } + ;var obj = gameabc_Object.ObjectList[this.objid].Property; + this.x = x1; + this.y = y1; + this.w = w1; + this.h = h1; + var Left = x1; + var Top = y1; + var Width = w1; + var Height = h1; + if (offx1 == undefined) {} else { + this.offx = offx1; + this.offy = offy1; + } + ;this.Thick = obj.Thick; + this.ChildEdg = obj.ChildEdg; + this.ChildWidth = obj.ChildWidth; + this.ChildHeight = obj.ChildHeight; + this.ChildThick = obj.ChildThick; + this.ChildOrdStyle = obj.ChildOrdStyle; + if (this.ChildOrdStyle == 0) { + this.cell_width = this.ChildWidth; + this.cell_height = this.ChildHeight; + } + if (this.ChildOrdStyle == 1) { + this.cell_width = Width + (-this.Thick - this.ChildEdg) * 2; + this.cell_height = this.ChildHeight; + } + if (this.ChildOrdStyle == 2) { + this.cell_width = this.ChildWidth; + this.cell_height = Height + (-this.Thick - this.ChildEdg) * 2; + } + ;this.red_w = Width - (this.Thick * 2) - (this.ChildEdg * 2); + this.red_h = Height - (this.Thick * 2) - (this.ChildEdg * 2); + this.red_num_w = this.Div(this.red_w, this.cell_width); + this.red_num_h = this.Div(this.red_h, this.cell_height); + this.ys_x = Left + this.Thick + this.ChildEdg; + this.ys_y = Top + this.Thick + this.ChildEdg; + } + ; + this.gameabc_close = function() { + this.shutdownGameObject(); + } + ; + this.draw = function(dt, context, xScroll, yScroll) { + + var Left = this.x; + var Top = this.y; + var Width = this.w; + var Height = this.h; + context.fillStyle = "blue"; + context.fillRect(this.x, this.y, this.w, this.h); + context.fillStyle = "white"; + context.fillRect(Left + this.Thick, Top + this.Thick, Width - this.Thick * 2, Height - this.Thick * 2); + context.fillStyle = "red"; + for (var i = 0; i < this.red_num_w; i++) { + for (var j = 0; j < this.red_num_h; j++) { + this.x0 = i * this.cell_width + this.offx; + this.y0 = j * this.cell_height + this.offy; + context.fillRect(this.ys_x + this.x0, this.ys_y + this.y0, this.cell_width, this.cell_height); + } + } + ;context.fillStyle = "blue"; + for (var i = 0; i < this.red_num_w; i++) { + for (var j = 0; j < this.red_num_h; j++) { + this.x0 = i * this.cell_width + this.offx; + this.y0 = j * this.cell_height + this.offy; + context.fillRect(this.ys_x + this.ChildThick + this.x0, this.ys_y + this.ChildThick + this.y0, this.cell_width - (this.ChildThick * 2), this.cell_height - (this.ChildThick * 2)); + } + } + ;var num = 0; + for (var i = 0; i < this.red_num_h; i++) { + for (var j = 0; j < this.red_num_w; j++) { + num++; + } + } + ;context.stroke(); + } +} +;gameabc_list.prototype = new VisualGameObject; +gameabc_list.prototype.Div = function(exp1, exp2) { + var n1 = Math.round(exp1); + var n2 = Math.round(exp2); + var rslt = n1 / n2; + if (rslt >= 0) { + rslt = Math.floor(rslt); + } else { + rslt = Math.ceil(rslt); + } + ;return rslt; +} +; +function getlength(str) { + var realLength = 0; + len = str.length; + charCode = -1; + for (var i = 0; i < len; i++) { + charCode = str.charCodeAt(i); + if (charCode > 0 && charCode <= 128) + realLength += 1; + else + realLength += 2; + } + ;return realLength; +} +;var gameabc_password = "************************************"; +var gameabc_drawtext = ""; +function gameabc_panle() { + this.gameabc_open = function(ObjectID, x, y, z, wsize, hsize) { + this.startupGameObject(x, y, z); + this.h = hsize; + if (wsize) + this.w = wsize; + this.ObjectType = 6; + this.objid = ObjectID; + this.offx = 0; + this.offy = 0; + return this; + } + ; + this.gameabc_close = function() { + this.shutdownGameObject(); + } + ; + this.draw = function(dt, context, xScroll, yScroll) { + return; + context.lineWidth = 1; + context.strokeStyle = ifast_jb; + context.strokeRect(this.x, this.y, this.w, this.h); + } + ; +} +;gameabc_panle.prototype = new VisualGameObject; + + + + + + + + + + + + + diff --git a/client/js/vendor/gameabc.min2.js b/client/js/vendor/gameabc.min2.js new file mode 100644 index 0000000..d58762f --- /dev/null +++ b/client/js/vendor/gameabc.min2.js @@ -0,0 +1,5703 @@ +var gameabc_senderror = 0; + +var gameabc = function() { + function s(SIt2, L$qig3, Qf4) { + var PzF5, IKcga6, d7; + for (IKcga6 = 0; IKcga6 < 30; IKcga6++) + for (PzF5 = 0; PzF5 < 73; PzF5++) + d7 = (PzF5 + IKcga6 * 74) * 4, + SIt2[d7] = SIt2[d7 + 4], + SIt2[d7 + 1] = SIt2[d7 + 5], + SIt2[d7 + 2] = SIt2[d7 + 6]; + for (IKcga6 = 0; IKcga6 < 30; IKcga6++) + d7 = (73 + IKcga6 * 74) * 4, + IKcga6 < L$qig3 ? (SIt2[d7] = b[Qf4]["\x62\x67"]["\x72"], + SIt2[d7 + 1] = b[Qf4]["\x62\x67"]["\x67"], + SIt2[d7 + 2] = b[Qf4]["\x62\x67"]["\x62"]) : (SIt2[d7] = b[Qf4]["\x66\x67"]["\x72"], + SIt2[d7 + 1] = b[Qf4]["\x66\x67"]["\x67"], + SIt2[d7 + 2] = b[Qf4]["\x66\x67"]["\x62"]) + } + var s8 = 0, QTsilt9 = 2, grEpoZ10, hZ11 = 0, _kO12 = (new window["\x44\x61\x74\x65"])["\x67\x65\x74\x54\x69\x6d\x65"](), D13 = _kO12, hPuk14 = _kO12, nogIEsi15 = 0, aGfBpM_16 = 1E3, pIipoKbeZ17 = 0, ESmULEmZ18, MC$T19, CwNEUSu20, _21, eg$MBfn22, blcZCzThy23 = 0, T24 = 1E3, $zRe25 = 0, kvje26, K27, $28, BZEK29, alOujP30 = 0, yj31 = 1E3, DiXUY32 = 0, uMlB33, dcngJtbw34, wMVlPSdU35, LkrwEFr36, qppYSsGe37 = { + fps: { + bg: { + s8: 16, + grEpoZ10: 16, + qppYSsGe37: 48 + }, + fg: { + s8: 0, + grEpoZ10: 255, + qppYSsGe37: 255 + } + }, + ms: { + bg: { + s8: 16, + grEpoZ10: 48, + qppYSsGe37: 16 + }, + fg: { + s8: 0, + grEpoZ10: 255, + qppYSsGe37: 0 + } + }, + mb: { + bg: { + s8: 48, + grEpoZ10: 16, + qppYSsGe37: 26 + }, + fg: { + s8: 255, + grEpoZ10: 0, + qppYSsGe37: 128 + } + } + }; + grEpoZ10 = window["\x64\x6f\x63\x75\x6d\x65\x6e\x74"]["\x63\x72\x65\x61\x74\x65\x45\x6c\x65\x6d\x65\x6e\x74"]("\x64\x69\x76"); + grEpoZ10["\x63\x6c\x61\x73\x73\x4e\x61\x6d\x65"] = "\x73\x74\x61\x74\x73"; + grEpoZ10["\x73\x74\x79\x6c\x65"]["\x63\x75\x72\x73\x6f\x72"] = "\x70\x6f\x69\x6e\x74\x65\x72"; + grEpoZ10["\x73\x74\x79\x6c\x65"]["\x77\x69\x64\x74\x68"] = "\x38\x30\x70\x78"; + grEpoZ10["\x73\x74\x79\x6c\x65"]["\x6f\x70\x61\x63\x69\x74\x79"] = "\x30\x2e\x39"; + grEpoZ10["\x73\x74\x79\x6c\x65"]["\x7a\x49\x6e\x64\x65\x78"] = "\x31\x30\x30\x30\x31"; + grEpoZ10["\x61\x64\x64\x45\x76\x65\x6e\x74\x4c\x69\x73\x74\x65\x6e\x65\x72"]("\x63\x6c\x69\x63\x6b", function() { + s8++; + s8 == QTsilt9 && (s8 = 0); + ESmULEmZ18["\x73\x74\x79\x6c\x65"]["\x64\x69\x73\x70\x6c\x61\x79"] = "\x6e\x6f\x6e\x65"; + kvje26["\x73\x74\x79\x6c\x65"]["\x64\x69\x73\x70\x6c\x61\x79"] = "\x6e\x6f\x6e\x65"; + uMlB33["\x73\x74\x79\x6c\x65"]["\x64\x69\x73\x70\x6c\x61\x79"] = "\x6e\x6f\x6e\x65"; + switch (s8) { + case 0: + ESmULEmZ18["\x73\x74\x79\x6c\x65"]["\x64\x69\x73\x70\x6c\x61\x79"] = "\x62\x6c\x6f\x63\x6b"; + break; + case 1: + kvje26["\x73\x74\x79\x6c\x65"]["\x64\x69\x73\x70\x6c\x61\x79"] = "\x62\x6c\x6f\x63\x6b"; + break; + case 2: + uMlB33["\x73\x74\x79\x6c\x65"]["\x64\x69\x73\x70\x6c\x61\x79"] = "\x62\x6c\x6f\x63\x6b" + } + }, !1); + ESmULEmZ18 = window["\x64\x6f\x63\x75\x6d\x65\x6e\x74"]["\x63\x72\x65\x61\x74\x65\x45\x6c\x65\x6d\x65\x6e\x74"]("\x64\x69\x76"); + ESmULEmZ18["\x73\x74\x79\x6c\x65"]["\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\x43\x6f\x6c\x6f\x72"] = "\x72\x67\x62\x28" + window["\x4d\x61\x74\x68"]["\x66\x6c\x6f\x6f\x72"](qppYSsGe37["\x66\x70\x73"]["\x62\x67"]["\x72"] / 2) + "\x2c" + window["\x4d\x61\x74\x68"]["\x66\x6c\x6f\x6f\x72"](qppYSsGe37["\x66\x70\x73"]["\x62\x67"]["\x67"] / 2) + "\x2c" + window["\x4d\x61\x74\x68"]["\x66\x6c\x6f\x6f\x72"](qppYSsGe37["\x66\x70\x73"]["\x62\x67"]["\x62"] / 2) + "\x29"; + ESmULEmZ18["\x73\x74\x79\x6c\x65"]["\x70\x61\x64\x64\x69\x6e\x67"] = "\x32\x70\x78 \x30\x70\x78 \x33\x70\x78 \x30\x70\x78"; + grEpoZ10["\x61\x70\x70\x65\x6e\x64\x43\x68\x69\x6c\x64"](ESmULEmZ18); + MC$T19 = window["\x64\x6f\x63\x75\x6d\x65\x6e\x74"]["\x63\x72\x65\x61\x74\x65\x45\x6c\x65\x6d\x65\x6e\x74"]("\x64\x69\x76"); + MC$T19["\x73\x74\x79\x6c\x65"]["\x66\x6f\x6e\x74\x46\x61\x6d\x69\x6c\x79"] = "\x48\x65\x6c\x76\x65\x74\x69\x63\x61\x2c \x41\x72\x69\x61\x6c\x2c \x73\x61\x6e\x73\x2d\x73\x65\x72\x69\x66"; + MC$T19["\x73\x74\x79\x6c\x65"]["\x74\x65\x78\x74\x41\x6c\x69\x67\x6e"] = "\x6c\x65\x66\x74"; + MC$T19["\x73\x74\x79\x6c\x65"]["\x66\x6f\x6e\x74\x53\x69\x7a\x65"] = "\x39\x70\x78"; + MC$T19["\x73\x74\x79\x6c\x65"]["\x63\x6f\x6c\x6f\x72"] = "\x72\x67\x62\x28" + qppYSsGe37["\x66\x70\x73"]["\x66\x67"]["\x72"] + "\x2c" + qppYSsGe37["\x66\x70\x73"]["\x66\x67"]["\x67"] + "\x2c" + qppYSsGe37["\x66\x70\x73"]["\x66\x67"]["\x62"] + "\x29"; + MC$T19["\x73\x74\x79\x6c\x65"]["\x6d\x61\x72\x67\x69\x6e"] = "\x30\x70\x78 \x30\x70\x78 \x31\x70\x78 \x33\x70\x78"; + MC$T19["\x69\x6e\x6e\x65\x72\x48\x54\x4d\x4c"] = '\x3c\x73\x70\x61\x6e \x73\x74\x79\x6c\x65\x3d\x22\x66\x6f\x6e\x74\x2d\x77\x65\x69\x67\x68\x74\x3a\x62\x6f\x6c\x64\x22\x3e\x46\x50\x53\x3c\x2f\x73\x70\x61\x6e\x3e'; + ESmULEmZ18["\x61\x70\x70\x65\x6e\x64\x43\x68\x69\x6c\x64"](MC$T19); + CwNEUSu20 = window["\x64\x6f\x63\x75\x6d\x65\x6e\x74"]["\x63\x72\x65\x61\x74\x65\x45\x6c\x65\x6d\x65\x6e\x74"]("\x63\x61\x6e\x76\x61\x73"); + CwNEUSu20["\x77\x69\x64\x74\x68"] = 74; + CwNEUSu20["\x68\x65\x69\x67\x68\x74"] = 30; + CwNEUSu20["\x73\x74\x79\x6c\x65"]["\x64\x69\x73\x70\x6c\x61\x79"] = "\x62\x6c\x6f\x63\x6b"; + CwNEUSu20["\x73\x74\x79\x6c\x65"]["\x6d\x61\x72\x67\x69\x6e\x4c\x65\x66\x74"] = "\x33\x70\x78"; + ESmULEmZ18["\x61\x70\x70\x65\x6e\x64\x43\x68\x69\x6c\x64"](CwNEUSu20); + _21 = CwNEUSu20["\x67\x65\x74\x43\x6f\x6e\x74\x65\x78\x74"]("\x32\x64"); + _21["\x66\x69\x6c\x6c\x53\x74\x79\x6c\x65"] = "\x72\x67\x62\x28" + qppYSsGe37["\x66\x70\x73"]["\x62\x67"]["\x72"] + "\x2c" + qppYSsGe37["\x66\x70\x73"]["\x62\x67"]["\x67"] + "\x2c" + qppYSsGe37["\x66\x70\x73"]["\x62\x67"]["\x62"] + "\x29"; + _21["\x66\x69\x6c\x6c\x52\x65\x63\x74"](0, 0, CwNEUSu20["\x77\x69\x64\x74\x68"], CwNEUSu20["\x68\x65\x69\x67\x68\x74"]); + eg$MBfn22 = _21["\x67\x65\x74\x49\x6d\x61\x67\x65\x44\x61\x74\x61"](0, 0, CwNEUSu20["\x77\x69\x64\x74\x68"], CwNEUSu20["\x68\x65\x69\x67\x68\x74"]); + kvje26 = window["\x64\x6f\x63\x75\x6d\x65\x6e\x74"]["\x63\x72\x65\x61\x74\x65\x45\x6c\x65\x6d\x65\x6e\x74"]("\x64\x69\x76"); + kvje26["\x73\x74\x79\x6c\x65"]["\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\x43\x6f\x6c\x6f\x72"] = "\x72\x67\x62\x28" + window["\x4d\x61\x74\x68"]["\x66\x6c\x6f\x6f\x72"](qppYSsGe37["\x6d\x73"]["\x62\x67"]["\x72"] / 2) + "\x2c" + window["\x4d\x61\x74\x68"]["\x66\x6c\x6f\x6f\x72"](qppYSsGe37["\x6d\x73"]["\x62\x67"]["\x67"] / 2) + "\x2c" + window["\x4d\x61\x74\x68"]["\x66\x6c\x6f\x6f\x72"](qppYSsGe37["\x6d\x73"]["\x62\x67"]["\x62"] / 2) + "\x29"; + kvje26["\x73\x74\x79\x6c\x65"]["\x70\x61\x64\x64\x69\x6e\x67"] = "\x32\x70\x78 \x30\x70\x78 \x33\x70\x78 \x30\x70\x78"; + kvje26["\x73\x74\x79\x6c\x65"]["\x64\x69\x73\x70\x6c\x61\x79"] = "\x6e\x6f\x6e\x65"; + grEpoZ10["\x61\x70\x70\x65\x6e\x64\x43\x68\x69\x6c\x64"](kvje26); + K27 = window["\x64\x6f\x63\x75\x6d\x65\x6e\x74"]["\x63\x72\x65\x61\x74\x65\x45\x6c\x65\x6d\x65\x6e\x74"]("\x64\x69\x76"); + K27["\x73\x74\x79\x6c\x65"]["\x66\x6f\x6e\x74\x46\x61\x6d\x69\x6c\x79"] = "\x48\x65\x6c\x76\x65\x74\x69\x63\x61\x2c \x41\x72\x69\x61\x6c\x2c \x73\x61\x6e\x73\x2d\x73\x65\x72\x69\x66"; + K27["\x73\x74\x79\x6c\x65"]["\x74\x65\x78\x74\x41\x6c\x69\x67\x6e"] = "\x6c\x65\x66\x74"; + K27["\x73\x74\x79\x6c\x65"]["\x66\x6f\x6e\x74\x53\x69\x7a\x65"] = "\x39\x70\x78"; + K27["\x73\x74\x79\x6c\x65"]["\x63\x6f\x6c\x6f\x72"] = "\x72\x67\x62\x28" + qppYSsGe37["\x6d\x73"]["\x66\x67"]["\x72"] + "\x2c" + qppYSsGe37["\x6d\x73"]["\x66\x67"]["\x67"] + "\x2c" + qppYSsGe37["\x6d\x73"]["\x66\x67"]["\x62"] + "\x29"; + K27["\x73\x74\x79\x6c\x65"]["\x6d\x61\x72\x67\x69\x6e"] = "\x30\x70\x78 \x30\x70\x78 \x31\x70\x78 \x33\x70\x78"; + K27["\x69\x6e\x6e\x65\x72\x48\x54\x4d\x4c"] = '\x3c\x73\x70\x61\x6e \x73\x74\x79\x6c\x65\x3d\x22\x66\x6f\x6e\x74\x2d\x77\x65\x69\x67\x68\x74\x3a\x62\x6f\x6c\x64\x22\x3e\x4d\x53\x3c\x2f\x73\x70\x61\x6e\x3e'; + kvje26["\x61\x70\x70\x65\x6e\x64\x43\x68\x69\x6c\x64"](K27); + CwNEUSu20 = window["\x64\x6f\x63\x75\x6d\x65\x6e\x74"]["\x63\x72\x65\x61\x74\x65\x45\x6c\x65\x6d\x65\x6e\x74"]("\x63\x61\x6e\x76\x61\x73"); + CwNEUSu20["\x77\x69\x64\x74\x68"] = 74; + CwNEUSu20["\x68\x65\x69\x67\x68\x74"] = 30; + CwNEUSu20["\x73\x74\x79\x6c\x65"]["\x64\x69\x73\x70\x6c\x61\x79"] = "\x62\x6c\x6f\x63\x6b"; + CwNEUSu20["\x73\x74\x79\x6c\x65"]["\x6d\x61\x72\x67\x69\x6e\x4c\x65\x66\x74"] = "\x33\x70\x78"; + kvje26["\x61\x70\x70\x65\x6e\x64\x43\x68\x69\x6c\x64"](CwNEUSu20); + $28 = CwNEUSu20["\x67\x65\x74\x43\x6f\x6e\x74\x65\x78\x74"]("\x32\x64"); + $28["\x66\x69\x6c\x6c\x53\x74\x79\x6c\x65"] = "\x72\x67\x62\x28" + qppYSsGe37["\x6d\x73"]["\x62\x67"]["\x72"] + "\x2c" + qppYSsGe37["\x6d\x73"]["\x62\x67"]["\x67"] + "\x2c" + qppYSsGe37["\x6d\x73"]["\x62\x67"]["\x62"] + "\x29"; + $28["\x66\x69\x6c\x6c\x52\x65\x63\x74"](0, 0, CwNEUSu20["\x77\x69\x64\x74\x68"], CwNEUSu20["\x68\x65\x69\x67\x68\x74"]); + BZEK29 = $28["\x67\x65\x74\x49\x6d\x61\x67\x65\x44\x61\x74\x61"](0, 0, CwNEUSu20["\x77\x69\x64\x74\x68"], CwNEUSu20["\x68\x65\x69\x67\x68\x74"]); + try { + performance && performance["\x6d\x65\x6d\x6f\x72\x79"] && performance["\x6d\x65\x6d\x6f\x72\x79"]["\x74\x6f\x74\x61\x6c\x4a\x53\x48\x65\x61\x70\x53\x69\x7a\x65"] && (QTsilt9 = 3) + } catch (G) {} + uMlB33 = window["\x64\x6f\x63\x75\x6d\x65\x6e\x74"]["\x63\x72\x65\x61\x74\x65\x45\x6c\x65\x6d\x65\x6e\x74"]("\x64\x69\x76"); + uMlB33["\x73\x74\x79\x6c\x65"]["\x62\x61\x63\x6b\x67\x72\x6f\x75\x6e\x64\x43\x6f\x6c\x6f\x72"] = "\x72\x67\x62\x28" + window["\x4d\x61\x74\x68"]["\x66\x6c\x6f\x6f\x72"](qppYSsGe37["\x6d\x62"]["\x62\x67"]["\x72"] / 2) + "\x2c" + window["\x4d\x61\x74\x68"]["\x66\x6c\x6f\x6f\x72"](qppYSsGe37["\x6d\x62"]["\x62\x67"]["\x67"] / 2) + "\x2c" + window["\x4d\x61\x74\x68"]["\x66\x6c\x6f\x6f\x72"](qppYSsGe37["\x6d\x62"]["\x62\x67"]["\x62"] / 2) + "\x29"; + uMlB33["\x73\x74\x79\x6c\x65"]["\x70\x61\x64\x64\x69\x6e\x67"] = "\x32\x70\x78 \x30\x70\x78 \x33\x70\x78 \x30\x70\x78"; + uMlB33["\x73\x74\x79\x6c\x65"]["\x64\x69\x73\x70\x6c\x61\x79"] = "\x6e\x6f\x6e\x65"; + grEpoZ10["\x61\x70\x70\x65\x6e\x64\x43\x68\x69\x6c\x64"](uMlB33); + dcngJtbw34 = window["\x64\x6f\x63\x75\x6d\x65\x6e\x74"]["\x63\x72\x65\x61\x74\x65\x45\x6c\x65\x6d\x65\x6e\x74"]("\x64\x69\x76"); + dcngJtbw34["\x73\x74\x79\x6c\x65"]["\x66\x6f\x6e\x74\x46\x61\x6d\x69\x6c\x79"] = "\x48\x65\x6c\x76\x65\x74\x69\x63\x61\x2c \x41\x72\x69\x61\x6c\x2c \x73\x61\x6e\x73\x2d\x73\x65\x72\x69\x66"; + dcngJtbw34["\x73\x74\x79\x6c\x65"]["\x74\x65\x78\x74\x41\x6c\x69\x67\x6e"] = "\x6c\x65\x66\x74"; + dcngJtbw34["\x73\x74\x79\x6c\x65"]["\x66\x6f\x6e\x74\x53\x69\x7a\x65"] = "\x39\x70\x78"; + dcngJtbw34["\x73\x74\x79\x6c\x65"]["\x63\x6f\x6c\x6f\x72"] = "\x72\x67\x62\x28" + qppYSsGe37["\x6d\x62"]["\x66\x67"]["\x72"] + "\x2c" + qppYSsGe37["\x6d\x62"]["\x66\x67"]["\x67"] + "\x2c" + qppYSsGe37["\x6d\x62"]["\x66\x67"]["\x62"] + "\x29"; + dcngJtbw34["\x73\x74\x79\x6c\x65"]["\x6d\x61\x72\x67\x69\x6e"] = "\x30\x70\x78 \x30\x70\x78 \x31\x70\x78 \x33\x70\x78"; + dcngJtbw34["\x69\x6e\x6e\x65\x72\x48\x54\x4d\x4c"] = '\x3c\x73\x70\x61\x6e \x73\x74\x79\x6c\x65\x3d\x22\x66\x6f\x6e\x74\x2d\x77\x65\x69\x67\x68\x74\x3a\x62\x6f\x6c\x64\x22\x3e\x4d\x42\x3c\x2f\x73\x70\x61\x6e\x3e'; + uMlB33["\x61\x70\x70\x65\x6e\x64\x43\x68\x69\x6c\x64"](dcngJtbw34); + CwNEUSu20 = window["\x64\x6f\x63\x75\x6d\x65\x6e\x74"]["\x63\x72\x65\x61\x74\x65\x45\x6c\x65\x6d\x65\x6e\x74"]("\x63\x61\x6e\x76\x61\x73"); + CwNEUSu20["\x77\x69\x64\x74\x68"] = 74; + CwNEUSu20["\x68\x65\x69\x67\x68\x74"] = 30; + CwNEUSu20["\x73\x74\x79\x6c\x65"]["\x64\x69\x73\x70\x6c\x61\x79"] = "\x62\x6c\x6f\x63\x6b"; + CwNEUSu20["\x73\x74\x79\x6c\x65"]["\x6d\x61\x72\x67\x69\x6e\x4c\x65\x66\x74"] = "\x33\x70\x78"; + uMlB33["\x61\x70\x70\x65\x6e\x64\x43\x68\x69\x6c\x64"](CwNEUSu20); + wMVlPSdU35 = CwNEUSu20["\x67\x65\x74\x43\x6f\x6e\x74\x65\x78\x74"]("\x32\x64"); + wMVlPSdU35["\x66\x69\x6c\x6c\x53\x74\x79\x6c\x65"] = "\x23\x33\x30\x31\x30\x31\x30"; + wMVlPSdU35["\x66\x69\x6c\x6c\x52\x65\x63\x74"](0, 0, CwNEUSu20["\x77\x69\x64\x74\x68"], CwNEUSu20["\x68\x65\x69\x67\x68\x74"]); + LkrwEFr36 = wMVlPSdU35["\x67\x65\x74\x49\x6d\x61\x67\x65\x44\x61\x74\x61"](0, 0, CwNEUSu20["\x77\x69\x64\x74\x68"], CwNEUSu20["\x68\x65\x69\x67\x68\x74"]); + return { + domElement: grEpoZ10, + update: function() { + hZ11++; + _kO12 = (new window["\x44\x61\x74\x65"])["\x67\x65\x74\x54\x69\x6d\x65"](); + blcZCzThy23 = _kO12 - D13; + T24 = window["\x4d\x61\x74\x68"]["\x6d\x69\x6e"](T24, blcZCzThy23); + $zRe25 = window["\x4d\x61\x74\x68"]["\x6d\x61\x78"]($zRe25, blcZCzThy23); + s(BZEK29["\x64\x61\x74\x61"], window["\x4d\x61\x74\x68"]["\x6d\x69\x6e"](30, 30 - blcZCzThy23 / 200 * 30), "\x6d\x73"); + K27["\x69\x6e\x6e\x65\x72\x48\x54\x4d\x4c"] = '\x3c\x73\x70\x61\x6e \x73\x74\x79\x6c\x65\x3d\x22\x66\x6f\x6e\x74\x2d\x77\x65\x69\x67\x68\x74\x3a\x62\x6f\x6c\x64\x22\x3e' + blcZCzThy23 + " \x4d\x53\x3c\x2f\x73\x70\x61\x6e\x3e \x28" + T24 + "\x2d" + $zRe25 + "\x29"; + $28["\x70\x75\x74\x49\x6d\x61\x67\x65\x44\x61\x74\x61"](BZEK29, 0, 0); + D13 = _kO12; + if (_kO12 > hPuk14 + 1E3) { + nogIEsi15 = window["\x4d\x61\x74\x68"]["\x72\x6f\x75\x6e\x64"](hZ11 * 1E3 / (_kO12 - hPuk14)); + aGfBpM_16 = window["\x4d\x61\x74\x68"]["\x6d\x69\x6e"](aGfBpM_16, nogIEsi15); + pIipoKbeZ17 = window["\x4d\x61\x74\x68"]["\x6d\x61\x78"](pIipoKbeZ17, nogIEsi15); + s(eg$MBfn22["\x64\x61\x74\x61"], window["\x4d\x61\x74\x68"]["\x6d\x69\x6e"](30, 30 - nogIEsi15 / 100 * 30), "\x66\x70\x73"); + MC$T19["\x69\x6e\x6e\x65\x72\x48\x54\x4d\x4c"] = '\x3c\x73\x70\x61\x6e \x73\x74\x79\x6c\x65\x3d\x22\x66\x6f\x6e\x74\x2d\x77\x65\x69\x67\x68\x74\x3a\x62\x6f\x6c\x64\x22\x3e' + nogIEsi15 + " \x46\x50\x53\x3c\x2f\x73\x70\x61\x6e\x3e \x28" + aGfBpM_16 + "\x2d" + pIipoKbeZ17 + "\x29"; + _21["\x70\x75\x74\x49\x6d\x61\x67\x65\x44\x61\x74\x61"](eg$MBfn22, 0, 0); + if (QTsilt9 == 3) + alOujP30 = performance["\x6d\x65\x6d\x6f\x72\x79"]["\x75\x73\x65\x64\x4a\x53\x48\x65\x61\x70\x53\x69\x7a\x65"] * 9.54E-7, + yj31 = window["\x4d\x61\x74\x68"]["\x6d\x69\x6e"](yj31, alOujP30), + DiXUY32 = window["\x4d\x61\x74\x68"]["\x6d\x61\x78"](DiXUY32, alOujP30), + s(LkrwEFr36["\x64\x61\x74\x61"], window["\x4d\x61\x74\x68"]["\x6d\x69\x6e"](30, 30 - alOujP30 / 2), "\x6d\x62"), + dcngJtbw34["\x69\x6e\x6e\x65\x72\x48\x54\x4d\x4c"] = '\x3c\x73\x70\x61\x6e \x73\x74\x79\x6c\x65\x3d\x22\x66\x6f\x6e\x74\x2d\x77\x65\x69\x67\x68\x74\x3a\x62\x6f\x6c\x64\x22\x3e' + window["\x4d\x61\x74\x68"]["\x72\x6f\x75\x6e\x64"](alOujP30) + " \x4d\x42\x3c\x2f\x73\x70\x61\x6e\x3e \x28" + window["\x4d\x61\x74\x68"]["\x72\x6f\x75\x6e\x64"](yj31) + "\x2d" + window["\x4d\x61\x74\x68"]["\x72\x6f\x75\x6e\x64"](DiXUY32) + "\x29", + wMVlPSdU35["\x70\x75\x74\x49\x6d\x61\x67\x65\x44\x61\x74\x61"](LkrwEFr36, 0, 0); + hPuk14 = _kO12; + hZ11 = 0 + } + } + } +}; +var game123 = function() { + function s(a, g, d) { + var f, c, e; + for (c = 0; c < 30; c++) + for (f = 0; f < 73; f++) + e = (f + c * 74) * 4, + a[e] = a[e + 4], + a[e + 1] = a[e + 5], + a[e + 2] = a[e + 6]; + for (c = 0; c < 30; c++) + e = (73 + c * 74) * 4, + c < g ? (a[e] = b[d].bg.r, + a[e + 1] = b[d].bg.g, + a[e + 2] = b[d].bg.b) : (a[e] = b[d].fg.r, + a[e + 1] = b[d].fg.g, + a[e + 2] = b[d].fg.b) + } + var r = 0, t = 2, g, u = 0, j = (new Date).getTime(), F = j, v = j, l = 0, w = 1E3, x = 0, k, d, a, m, y, n = 0, z = 1E3, A = 0, f, c, o, B, p = 0, C = 1E3, D = 0, h, i, q, E, b = { + fps: { + bg: { + r: 16, + g: 16, + b: 48 + }, + fg: { + r: 0, + g: 255, + b: 255 + } + }, + ms: { + bg: { + r: 16, + g: 48, + b: 16 + }, + fg: { + r: 0, + g: 255, + b: 0 + } + }, + mb: { + bg: { + r: 48, + g: 16, + b: 26 + }, + fg: { + r: 255, + g: 0, + b: 128 + } + } + }; + g = document.createElement("div"); + g.className = "stats"; + g.style.cursor = "pointer"; + g.style.width = "80px"; + g.style.opacity = "0.9"; + g.style.zIndex = "10001"; + g.addEventListener("click", function() { + r++; + r == t && (r = 0); + k.style.display = "none"; + f.style.display = "none"; + h.style.display = "none"; + switch (r) { + case 0: + k.style.display = "block"; + break; + case 1: + f.style.display = "block"; + break; + case 2: + h.style.display = "block" + } + }, !1); + k = document.createElement("div"); + k.style.backgroundColor = "rgb(" + Math.floor(b.fps.bg.r / 2) + "," + Math.floor(b.fps.bg.g / 2) + "," + Math.floor(b.fps.bg.b / 2) + ")"; + k.style.padding = "2px 0px 3px 0px"; + g.appendChild(k); + d = document.createElement("div"); + d.style.fontFamily = "Helvetica, Arial, sans-serif"; + d.style.textAlign = "left"; + d.style.fontSize = "9px"; + d.style.color = "rgb(" + b.fps.fg.r + "," + b.fps.fg.g + "," + b.fps.fg.b + ")"; + d.style.margin = "0px 0px 1px 3px"; + d.innerHTML = 'FPS'; + k.appendChild(d); + a = document.createElement("canvas"); + a.width = 74; + a.height = 30; + a.style.display = "block"; + a.style.marginLeft = "3px"; + k.appendChild(a); + m = a.getContext("2d"); + m.fillStyle = "rgb(" + b.fps.bg.r + "," + b.fps.bg.g + "," + b.fps.bg.b + ")"; + m.fillRect(0, 0, a.width, a.height); + y = m.getImageData(0, 0, a.width, a.height); + f = document.createElement("div"); + f.style.backgroundColor = "rgb(" + Math.floor(b.ms.bg.r / 2) + "," + Math.floor(b.ms.bg.g / 2) + "," + Math.floor(b.ms.bg.b / 2) + ")"; + f.style.padding = "2px 0px 3px 0px"; + f.style.display = "none"; + g.appendChild(f); + c = document.createElement("div"); + c.style.fontFamily = "Helvetica, Arial, sans-serif"; + c.style.textAlign = "left"; + c.style.fontSize = "9px"; + c.style.color = "rgb(" + b.ms.fg.r + "," + b.ms.fg.g + "," + b.ms.fg.b + ")"; + c.style.margin = "0px 0px 1px 3px"; + c.innerHTML = 'MS'; + f.appendChild(c); + a = document.createElement("canvas"); + a.width = 74; + a.height = 30; + a.style.display = "block"; + a.style.marginLeft = "3px"; + f.appendChild(a); + o = a.getContext("2d"); + o.fillStyle = "rgb(" + b.ms.bg.r + "," + b.ms.bg.g + "," + b.ms.bg.b + ")"; + o.fillRect(0, 0, a.width, a.height); + B = o.getImageData(0, 0, a.width, a.height); + try { + performance && performance.memory && performance.memory.totalJSHeapSize && (t = 3) + } catch (G) {} + h = document.createElement("div"); + h.style.backgroundColor = "rgb(" + Math.floor(b.mb.bg.r / 2) + "," + Math.floor(b.mb.bg.g / 2) + "," + Math.floor(b.mb.bg.b / 2) + ")"; + h.style.padding = "2px 0px 3px 0px"; + h.style.display = "none"; + g.appendChild(h); + i = document.createElement("div"); + i.style.fontFamily = "Helvetica, Arial, sans-serif"; + i.style.textAlign = "left"; + i.style.fontSize = "9px"; + i.style.color = "rgb(" + b.mb.fg.r + "," + b.mb.fg.g + "," + b.mb.fg.b + ")"; + i.style.margin = "0px 0px 1px 3px"; + i.innerHTML = 'MB'; + h.appendChild(i); + a = document.createElement("canvas"); + a.width = 74; + a.height = 30; + a.style.display = "block"; + a.style.marginLeft = "3px"; + h.appendChild(a); + q = a.getContext("2d"); + q.fillStyle = "#301010"; + q.fillRect(0, 0, a.width, a.height); + E = q.getImageData(0, 0, a.width, a.height); + return { + domElement: g, + update: function() { + u++; + j = (new Date).getTime(); + n = j - F; + z = Math.min(z, n); + A = Math.max(A, n); + s(B.data, Math.min(30, 30 - n / 200 * 30), "ms"); + c.innerHTML = '' + n + " MS (" + z + "-" + A + ")"; + o.putImageData(B, 0, 0); + F = j; + if (j > v + 1E3) { + l = Math.round(u * 1E3 / (j - v)); + w = Math.min(w, l); + x = Math.max(x, l); + s(y.data, Math.min(30, 30 - l / 100 * 30), "fps"); + d.innerHTML = '' + l + " FPS (" + w + "-" + x + ")"; + m.putImageData(y, 0, 0); + if (t == 3) + p = performance.memory.usedJSHeapSize * 9.54E-7, + C = Math.min(C, p), + D = Math.max(D, p), + s(E.data, Math.min(30, 30 - p / 2), "mb"), + i.innerHTML = '' + Math.round(p) + " MB (" + Math.round(C) + "-" + Math.round(D) + ")", + q.putImageData(E, 0, 0); + v = j; + u = 0 + } + } + } +}; +var ifastunit = 0; +var ifast_jb; +var dfw1977s = 1; +var dfw1977e = 1; +var testdate111 = '{"dfw":123}'; +var gameabc_face = gameabc_face || {}; +var ifast_hashmaps = {}; +var ifast_seerect = {}; +gameabc_face.resizeinitok = 0; +gameabc_face.dfwgao=10; +gameabc_face.vw = 1; +gameabc_face.lmx = 30; +gameabc_face.lmy = 30; +gameabc_face.userchargez = 0; +gameabc_face.randombase = 777777; +gameabc_face.randomhttp = 777777; +gameabc_face.img_list_pre = []; +gameabc_face.img_list_downing = []; +dfwusercavans = 0; +gameabc_face.downing_count = 100; +gameabc_face.webmode = 0; +gameabc_face.drawcharge = 1; +gameabc_face.drawmouse = 1; +gameabc_face.drawnet = 1; +gameabc_face.drawtime = 1; +gameabc_face.drawface = 1; +gameabc_face.fastup_time = 250; +gameabc_face.checkmustdraw = function() { + if (gameabc_face.webmode == 0) { + return 1; + } + ;var k; + k = this.drawcharge || this.drawnet || this.drawtime || this.drawface || this.drawmouse; + this.drawcharge = 0; + this.drawmouse = 0; + this.drawnet = 0; + this.drawtime = 0; + this.drawface = 0; + return k; +} +; + +function dfwtime200() { + var i1 = gameabc_face.img_list_pre.length; + var i2 = gameabc_face.img_list_downing.length; + var obj; + { + while (i2 < gameabc_face.downing_count && i1 > 0) { + obj = gameabc_face.img_list_pre[0]; + i2 = gameabc_face.img_list_downing.push(obj); + gameabc_face.img_list_pre.splice(0, 1); + i1 = gameabc_face.img_list_pre.length; + obj.src = obj.src_pre; + } + } +} +;function ifast_checkrect_seefastxy(x, y) { + if (x >= ifast_seerect.w || y >= ifast_seerect.h) { + return 0; + } else { + return 1; + } +} +;function ifast_checkrect_seefastxywh(x, y, w, h) { + if (x >= ifast_seerect.w || y >= ifast_seerect.h) { + return 0; + } else { + return 1; + } + ;if (x + w <= 0 || y + h < 0) { + return 0; + } else { + return 1; + } +} +;function ifast_jsonchecktostring(msg) { + if (msg) { + if (typeof (msg) != 'string') { + msg = JSON.stringify(msg); + } + ; + } + ;return msg; +} +;function ifast_checkjsonstr(v) { + v = other_replaceall(v, "\n", "\\n"); + v = other_replaceall(v, "\r", "\\r"); + return v; +} +;function ifast_measureText(spid, caption) { + var obj = ifast_getobj(spid); + if (ifast_isno(obj)) { + return 0; + } + ;var dc = ifast_getdc(); + dc.font = 'lighter ' + obj.h + 'px bold Arial'; + if (!caption) { + caption = obj.caption; + } + ;return dc.measureText(caption).width; +} +;function getPixelRatio(context) { + var backingStore = context.backingStorePixelRatio || context.webkitBackingStorePixelRatio || context.mozBackingStorePixelRatio || context.msBackingStorePixelRatio || context.oBackingStorePixelRatio || context.backingStorePixelRatio || 1; + return (window.devicePixelRatio || 1) / backingStore; +} +;function allchargeobj(objid) { + if (arguments.length == 0) { + var i; + for (i = 1; i < gameabc_Object.ObjectList.length; i++) { + allchargeobj(i); + } + ;return; + } + ;var obj; + var j; + var objs = gameabc_Object.ObjectList; + obj = gameabc_Object.ObjectList[objid].Property; + if (!obj) { + return; + } + ;if (!obj.OriginID) { + return; + } + ;if (obj.OriginID == 0) { + return; + } + ;var objf = ifast_getobj(obj.OriginID); + if (!objf) { + return; + } else { + allchargeobj(obj.OriginID); + } + ;ifast_spritealign(obj.offX, obj.offY, objid, obj.SelfPos, obj.OriginID, obj.OriginPos); +} +;function allcharge(layer) { + if (!layer) { + if (!gameabc_Image.addimgs) { + gameabc_Image.addimgs = {}; + } + ;if (!gameabc_face.loadui2) { + return; + } + ;var d = 1; + var okle; + for (d = 1; d < gameabc_Layer.LayerList.length; d++) { + okle = gameabc_Layer.LayerList[d]; + if (!okle.allrect) { + okle.allrect = {}; + okle.syrect = {}; + okle.myrect = {}; + } + ;allcharge(d); + } + ;allchargeobj(); + return; + } + ;var oklevel = gameabc_Layer.LayerList[layer]; + if (!oklevel.ObjectList) { + return; + } + ;var oo = 0; + var ww = g_GameObjectManager.backBuffer.width; + var hh = g_GameObjectManager.backBuffer.height; + oklevel.allrect.x = oo; + oklevel.allrect.y = oo; + oklevel.allrect.w = ww; + oklevel.allrect.h = hh; + oklevel.syrect.x = oo; + oklevel.syrect.y = oo; + oklevel.syrect.w = ww; + oklevel.syrect.h = hh; + oklevel.syrect.x = oo; + oklevel.syrect.y = oo; + oklevel.syrect.w = ww; + oklevel.syrect.h = hh; + var obj; + var j; + var objid; + var count = oklevel.ObjectList.length; + for (j = 0; j < count; j++) { + objid = oklevel.ObjectList[j]; + obj = ifast_getobj(objid); + if (!obj) { + continue + } + ;try { + if (obj.classid == 6) { + oklevel.myrect = getmyrectdec(oklevel.allrect, oklevel.syrect, obj.Align, obj.SizeStyle, obj.Size, 1); + set_self(objid, 28, oklevel.myrect); + } + } catch (e) {} + } + ; +} +;function getmyrect(rect, Align, SizeStyle, size) { + return getmyrectdec(rect, rect, Align, SizeStyle, size, 0); +} +;function getmyrectdec(allrect, syrect, Align, SizeStyle, size, dec) { + var myrect = {}; + switch (Align) { + case 1: + switch (SizeStyle) { + case 0: + myrect.x = syrect.x; + myrect.y = syrect.y; + myrect.w = size; + myrect.h = syrect.h; + break; + case 1: + myrect.x = syrect.x; + myrect.y = syrect.y; + myrect.h = syrect.h; + myrect.w = (size / 10000) * allrect.w; + break; + case 2: + myrect.x = syrect.x; + myrect.y = syrect.y; + myrect.h = syrect.h; + myrect.w = (size / 10000) * syrect.w; + break; + } + ;break; + case 2: + switch (SizeStyle) { + case 0: + myrect.x = syrect.x; + myrect.y = syrect.y; + myrect.w = syrect.w; + myrect.h = size; + break; + case 1: + myrect.x = syrect.x; + myrect.y = syrect.y; + myrect.w = syrect.w; + myrect.h = (size / 10000) * allrect.h; + break; + case 2: + myrect.x = syrect.x; + myrect.y = syrect.y; + myrect.w = syrect.w; + myrect.h = (size / 10000) * syrect.h; + break; + } + ;break; + case 3: + switch (SizeStyle) { + case 0: + myrect.x = syrect.x + allrect.w - size; + myrect.y = syrect.y; + myrect.h = syrect.h; + myrect.w = size; + break; + case 1: + myrect.x = syrect.x + syrect.w - (size / 10000) * allrect.w; + myrect.y = syrect.y; + myrect.h = syrect.h; + myrect.w = (size / 10000) * syrect.w; + break; + case 2: + myrect.x = syrect.x + syrect.w - (size / 10000) * syrect.w; + myrect.y = syrect.y; + myrect.w = (size / 10000) * syrect.w; + myrect.h = syrect.h; + break; + } + ;break; + case 4: + switch (SizeStyle) { + case 0: + myrect.x = syrect.x; + myrect.y = syrect.y + syrect.h - size; + myrect.w = syrect.w; + myrect.h = size; + break; + case 1: + myrect.x = syrect.x; + myrect.y = syrect.y + syrect.h - (size / 10000) * allrect.h; + myrect.w = syrect.w; + myrect.h = (size / 10000) * allrect.h; + break; + case 2: + myrect.x = syrect.x; + myrect.y = syrect.y + syrect.h - (size / 10000) * syrect.h; + myrect.w = syrect.w; + myrect.h = (size / 10000) * syrect.h; + break; + } + ;break; + } + ;myrect.x = parseInt(myrect.x); + myrect.y = parseInt(myrect.y); + myrect.w = parseInt(myrect.w); + myrect.h = parseInt(myrect.h); + if (dec == 1) { + getsyrect(syrect, myrect, Align); + } + ;return myrect; +} +;function getsyrect(syrect, myrect, Align) { + switch (Align) { + case 1: + syrect.w -= myrect.w; + syrect.x += myrect.w; + syrect.y = syrect.y; + syrect.h = syrect.h; + break; + case 2: + syrect.h -= myrect.h; + syrect.y += myrect.h; + syrect.x = syrect.x; + syrect.w = syrect.w; + break; + case 3: + syrect.w -= myrect.w; + syrect.x = syrect.x; + syrect.y = syrect.y; + syrect.h = syrect.h; + break; + case 4: + syrect.h -= myrect.h; + syrect.y = syrect.y; + syrect.x = syrect.x; + syrect.w = syrect.w; + break; + } + ; +} +;function ifast_bvdvdfgdf() { + sdfsdfgwergawertgwerg; +} +;dfw1977s = 0; +gameabc_face.xxxxx = ""; +dfw1977e = 0; +gameabc_face.openlog = 0; +gameabc_face.pmkg_string = ""; +gameabc_face.touall = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQIW2NkYGD4DwABCQEBtxmN7wAAAABJRU5ErkJggg=="; +gameabc_face.banall = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQIW2NkYGCoBwAAiQCB1bUosQAAAABJRU5ErkJggg=="; +gameabc_face.touall_img = new Image(); +gameabc_face.touall_img.src = gameabc_face.touall; +gameabc_face.banall_img = new Image(); +gameabc_face.banall_img.src = gameabc_face.banall; +gameabc_face.zz_canvas = document.createElement('canvas'); +gameabc_face.zz_canvas.width = 1; +gameabc_face.zz_canvas.height = 1; +gameabc_face.zz2d = gameabc_face.zz_canvas.getContext("2d"); +gameabc_face.obj = null; +gameabc_face.sy_x = 0; +gameabc_face.sy_y = 0; +gameabc_face.sy_w = 0; +gameabc_face.sy_h = 0; +gameabc_face.loadcount = 0; +gameabc_face.jm_sj_xz = 0; +gameabc_face.jm_sj_tong = 1; +gameabc_face.jm_sj_cj = 3;//dfw 全屏 +gameabc_face.pmw = 0; +gameabc_face.pmh = 0; +gameabc_face.pause = 0; +gameabc_face.hs = 0; +gameabc_face.sjhs = 0; +gameabc_face.mysc = 1; +gameabc_face.pmsc = 1; +gameabc_face.pmcx = 0; +gameabc_face.pmcy = 0; +gameabc_face.sjcx = 0; +gameabc_face.sjcy = 0; +gameabc_face.myxz = 0; +gameabc_face.mybx = 0; +gameabc_face.mysf = 0; +gameabc_face.isxz = 0; +gameabc_face.drawx = 0; +gameabc_face.drawy = 0; +gameabc_face.draww = 0; +gameabc_face.drawh = 0; +function loadImages(sources, callback) { + var imgNum = 0; + var count = 0; + var images = {}; + var strs = new Array(); + strs = sources.split(","); + imgNum = strs.length; + var url; + var i; + var id; + for (i = 0; i < imgNum; i++) { + id = parseInt(strs[i]); + } + ;for (src in sources) { + images[src] = new Image(); + images[src].onload = function() { + count++; + console.log("countok=" + count); + if (count == imgNum) { + callback(images); + } + } + ; + images[src].onerror = function() { + count++; + console.log("counterr=" + count); + if (count == imgNum) { + callback(images); + } + } + ; + images[src].src = sources[src]; + } +} +;gameabc_face.loglist = new Array(); +gameabc_face.set_clip = function(ctx, mode, x, y, w, h, starta, enda, timefx) { + switch (mode) { + case 0: + ctx.rect(x, y, w, h); + break; + case 1: + var w2 = w / 2; + var h2 = h / 2; + if (!starta) { + ctx.arc(x + w2, y + h2, w2, 0, Math.PI * 2, true); + } else { + var startPoint = 1.5 * Math.PI; + var all = Math.PI * 2; + ctx.beginPath(); + ctx.moveTo(x + w2, y + h2); + if (timefx) { + if (timefx == 0) { + timefx = false; + } else { + timefx = true; + } + ;ctx.arc(x + w2, y + h2, w2, startPoint + all * (starta / 100), startPoint + all * (enda / 100), timefx); + } else { + if (!enda) { + ctx.arc(x + w2, y + h2, w2, startPoint + all * (starta / 100), startPoint, false); + } else { + ctx.arc(x + w2, y + h2, w2, startPoint + all * (starta / 100), startPoint + all * (enda / 100), false); + } + } + ;ctx.lineTo(x + w2, y + h2); + ctx.closePath(); + break; + } + ; + } + ;ctx.clip(); +} +; +gameabc_face.drawround = function(ctx, mode, cx, cy, r, fx, bgColor, starta, enda, isout) { + ctx.save(); + if (bgColor == "") { + ctx.fillStyle = "red"; + } + ;if (isout == 1) { + ctx.globalCompositeOperation = "destination-atop"; + } + ;if (!mode) { + mode = 0; + } + ;if (!fx) { + fx = true; + } else { + if (fx == 0) { + fx = true; + } else { + fx = false; + } + ; + } + ;if (!starta) { + starta = 0; + } + ;if (!enda) { + enda = 360; + } + ;ctx.beginPath(); + ctx.arc(cx, cy, r, Math.PI * starta / 180, Math.PI * enda / 180, fx); + ctx.closePath(); + if (mode == 0) { + if (bgColor) { + ctx.fillStyle = bgColor; + } else { + ctx.fillStyle = "red"; + } + ;ctx.fill(); + } else { + if (bgColor) { + ctx.strokeStyle = bgColor; + } else { + ctx.strokeStyle = "red"; + } + ;ctx.lineWidth = mode; + ctx.stroke(); + } + ;ctx.restore(); +} +; +gameabc_face.drawlines = function(ctx, startx, starty, endx, endy, lw, bgColor) { + ctx.save(); + if (!lw) { + lw = 1; + } + ;if (bgColor == "") { + ctx.fillStyle = "red"; + } + ;ctx.lineWidth = lw; + ctx.lineCap = "round"; + ctx.beginPath(); + ctx.moveTo(startx, starty); + ctx.lineTo(endx, endy); + if (bgColor) { + ctx.strokeStyle = bgColor; + } else { + ctx.strokeStyle = "red"; + } + ;ctx.closePath(); + ctx.stroke(); + ctx.restore(); +} +; +gameabc_face.drawrect = function(ctx, mode, x, y, w, h, bgColor, isout) { + ctx.save(); + if (isout == 1) { + ctx.globalCompositeOperation = "destination-atop"; + } + ;if (bgColor == "") { + ctx.fillStyle = "red"; + } + ;if (mode == 0) { + if (bgColor) { + ctx.fillStyle = bgColor; + } else { + ctx.fillStyle = "red"; + } + ;ctx.fillRect(x, y, w, h); + } else { + if (bgColor) { + ctx.strokeStyle = bgColor; + } else { + ctx.strokeStyle = "red"; + } + ;ctx.lineWidth = mode; + ctx.strokeRect(x, y, w, h); + } + ;ctx.restore(); +} +; +function getRootPath() { + var strFullPath = window.document.location.href; + var strPath = window.document.location.pathname; + var pos = strFullPath.indexOf(strPath); + var prePath = strFullPath.substring(0, pos); + return ( prePath) ; + var postPath = strPath.substring(0, strPath.substr(1).indexOf('/') + 1); + return ( prePath + postPath) ; +} +;gameabc_face.getdiv = function(id) { + return document.getElementById(id); +} +; +gameabc_face.fatherdiv = gameabc_face.getdiv("ifastgame"); +gameabc_face.inputdiv = null; +gameabc_face.init_inputdiv = function(x, y) { + gameabc_face.fatherdiv = gameabc_face.getdiv("ifastgame"); + gameabc_face.inputdiv = gameabc_face.fatherdiv; + return; + if (gameabc_face.inputdiv == null) { + gameabc_face.inputdiv = document.createElement("div"); + gameabc_face.inputdiv.setAttribute("id", "inputdiv"); + gameabc_face.inputdiv.style.zIndex = 999999999; + gameabc_face.inputdiv.style.position = "absolute"; + gameabc_face.inputdiv.style.top = x + "px"; + gameabc_face.inputdiv.style.left = y + "px"; + gameabc_face.inputdiv.style.display = "block"; + gameabc_face.fatherdiv.appendChild(gameabc_face.inputdiv); + } + ;gameabc_face.inputdiv.style.top = g_GameObjectManager.canvas.style.top; + gameabc_face.inputdiv.style.left = g_GameObjectManager.canvas.style.left; + gameabc_face.inputdiv.style.width = g_GameObjectManager.canvas.style.width; + gameabc_face.inputdiv.style.height = g_GameObjectManager.canvas.style.height; + gameabc_face.inputdiv.top = g_GameObjectManager.canvas.top; + gameabc_face.inputdiv.left = g_GameObjectManager.canvas.left; + gameabc_face.inputdiv.width = g_GameObjectManager.canvas.width; + gameabc_face.inputdiv.height = g_GameObjectManager.canvas.height; +} +; +gameabc_face.get_selfdiv = function(div, p1) { + if (typeof (div) != "object") { + div = this.getdiv(div); + } + ;if (div) { + switch (p1) { + case 7: + return div.value; + break; + case 18: + return div.style.left; + break; + case 19: + return div.style.top; + break; + case 20: + return div.style.width; + break; + case 21: + return div.style.height; + break; + case 37: + { + if (div.style.display == "block") { + return 1; + } else { + return 0; + } + } + ;break; + default: + break; + } + } +} +; +gameabc_face.set_selfdiv = function(div, p1, val, mode, data2) { + if (typeof (div) != "object") { + div = this.getdiv(div); + } + ;if (!div) { + return; + } + ;var dd = null; + switch (mode) { + case 2: + dd = this.get_selfdiv(div, p1) - val; + break; + case 1: + dd = val + this.get_selfdiv(div, p1); + break; + default: + dd = val; + break; + } + ;switch (p1) { + case 7: + return div.value = dd; + break; + case 18: + return div.style.left = dd + "px"; + break; + case 19: + return div.style.top = dd + "px"; + break; + case 20: + return div.style.width = dd + "px"; + break; + case 21: + return div.style.height = dd + "px"; + break; + case 37: + { + if (dd == 1) { + div.style.display = "block"; + } else { + div.style.display = "none"; + } + } + ;break; + default: + break; + } + ; +} +; +gameabc_face.setdiv_whv = function(div, w, h) {} +; +gameabc_face.setdiv_xy = function(div, x, y) {} +; +gameabc_face.getdiv_v = function(div) { + if (typeof (div) != "object") { + div = this.getdiv(div); + } + { + return gameabc_face.chargediv_val(div.style.display); + } +} +; +gameabc_face.setdiv_v = function(div, v) { + if (typeof (div) != "object") { + div = this.getdiv(div); + } + { + if (v == 1) { + div.style.display = "block"; + } else { + div.style.display = "none"; + } + } +} +; +gameabc_face.getid_text = function(inid) { + var inText = gameabc_face.getdiv(inid); + if (inText) { + return inText.value; + } else { + return "null"; + } + ; +} +; +gameabc_face.setid_text = function(inid, val) { + var inText = gameabc_face.getdiv(inid); + if (inText) + inText.value = val; +} +; +gameabc_face.getdiv_text = function(inText) { + if (inText) { + return inText.value; + } else { + return "null"; + } + ; +} +; +gameabc_face.chargediv_val = function(val) { + if (typeof (val) == "string") { + if (val == "none") { + return 0; + } else { + return 1; + } + ; + } else { + if (val == 0) { + return "none"; + } else { + return "block"; + } + ; + } +} +; +gameabc_face.setdiv_text = function(inText, val) { + if (inText) { + inText.value = val; + } + ; +} +; +gameabc_face.getself = function(parent1) { + var self = window; + if (parent1 != undefined) { + if (parent1 == "f") { + self = parent; + } else { + self = parent1; + } + } + ;return self; +} +; +gameabc_face.ifast_getcs = function(name, re, parent1) { + var self = this.getself(parent1); + var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)"); + var r = self.location.search.substr(1).match(reg); + if (r != null) + return unescape(r[2]); + return re; +} +; +gameabc_face.addinputdiv = function(id, type, x, y, w, h) { + if (gameabc_face.inputdiv == null) + gameabc_face.init_inputdiv(0, 0); + var inText; + switch (type) { + case 0: + inText = document.createElement("input"); + inText.setAttribute("type", "text"); + break; + case 1: + inText = document.createElement("input"); + inText.setAttribute("type", "password"); + break; + case 3: + inText = document.createElement("input"); + inText.setAttribute("type", "number"); + break; + case 2: + inText = document.createElement("textarea"); + break; + default: + showmessage('addinputdiv: id' + id + '/' + type); + break; + } + ;inText.setAttribute("id", id); + inText.style.position = "absolute"; + inText.style.width = w + "px"; + inText.style.height = h + "px"; + inText.style.left = x + g_GameObjectManager.canvas.top + "px"; + inText.style.top = y + g_GameObjectManager.canvas.left + "px"; + inText.style.zIndex = 999999999; + gameabc_face.inputdiv.appendChild(inText); + gameabc_face.setdiv_text(inText, ""); + return inText; +} +; +gameabc_face.set_draw = function(x, y, w, h, arg) { + gameabc_face.drawx = 0; + gameabc_face.drawy = 0; + gameabc_face.draww = w; + gameabc_face.drawh = h; + gameabc_face.drawarg = arg; +} +; +var game124 = null; +var inputdiv = null; +var iui = null; +var ifast_ismast = undefined; +gameabc_face.resize2000 = function() { + if (!this.canvas) { + return; + } + ;gameabc_face.logmessage("window.onresize2000"); + setTimeout(gameabc_face.resize, 1000); +} +; +gameabc_face.appmode_resize = function(ver, isapp) { + gameabc_setcanvas1(iui.canvas, window.innerWidth, window.innerHeight); + gameabc_face.jm_sj_tong == 1; + gameabc_face.sy_w = window.innerWidth; + gameabc_face.sy_h = window.innerHeight; + if (isapp == 1) { + gameabc_setcanvas1(iui.backBuffer, window.innerWidth, window.innerHeight); + } + ;gameabc_face.mouse_sx = iui.backBuffer.width / gameabc_face.sy_w; + gameabc_face.mouse_sy = iui.backBuffer.height / gameabc_face.sy_h; +} +; +gameabc_face.resize = function() { + gameabc_face.drawcharge = 1; + if (gameabc_face.resizeinitok == 1) { + if (gameabc_face.pmw == window.innerWidth || gameabc_face.pmh == window.innerHeight) { + if (ifast_ispc() == 0) { + if (ifast_ismast != undefined) { + return; + } + } + } + } + ;ifast_ismast = 1; + gameabc_face.resizeinitok = 1; + { + if (!gameabc_Project.Property.sh_old) { + gameabc_Project.Property.sh_old = gameabc_Project.Property.ScreenHeight; + } + ;var ver = gameabc_Project.Property.Version; + if (!ver) { + ver = "v1"; + } + ;gameabc_face.dfwver = ver; + gameabc_face.pmkg_string = "w/h:" + window.innerWidth + "/" + window.innerHeight; + if (!ver && gameabc_face.ifast_app != 1) { + gameabc_face.appmode_resize(ver, gameabc_face.ifast_app); + } else { + if (gameabc_face.jm_sj_cj == 3) { + // gameabc_Project.Property.ScreenHeight = parseInt(window.innerHeight * (gameabc_Project.Property.ScreenWidth / window.innerWidth)); + } else { + gameabc_Project.Property.ScreenHeight = gameabc_Project.Property.sh_old; + } + ;{ + gameabc_setcanvas3(iui.canvas, window.innerWidth, window.innerHeight); + } + } + ;gameabc_face.pmw = window.innerWidth; + gameabc_face.pmh = window.innerHeight; + iui.h = iui.canvas.height; + iui.w = iui.canvas.width; + } + ;gameabc_face.set_draw(0, 0, iui.canvas.width, iui.canvas.height, 0); + if (window.innerWidthwindow.innerHeight) + { + x1 = g_GameObjectManager.canvas.left + parseInt(obj.x / gameabc_face.mouse_sx); + y1 = g_GameObjectManager.canvas.top + parseInt(obj.y / gameabc_face.mouse_sy); + w1 = parseInt(obj.w / gameabc_face.mouse_sx); + h1 = parseInt(obj.h / gameabc_face.mouse_sy); + gameabc_face.set_selfdiv(obj.uipointer, 18, x1, 0, 0); + gameabc_face.set_selfdiv(obj.uipointer, 19, y1, 0, 0); + gameabc_face.set_selfdiv(obj.uipointer, 20, w1, 0, 0); + gameabc_face.set_selfdiv(obj.uipointer, 21, h1, 0, 0); + } + //else + //{ + + //} + } + ; + } + ;gameabc_face.pmcx = iui.w / 2; + gameabc_face.pmcy = iui.h / 2; + gameabc_face.sjcx = iui.backBuffer.width / 2; + gameabc_face.sjcy = iui.backBuffer.height / 2; + if (iui.w < iui.h) { + gameabc_face.hs = 0; + } else { + gameabc_face.hs = 1; + } + ;if (iui.backBuffer.width < iui.backBuffer.height) { + gameabc_face.sjhs = 0; + } else { + gameabc_face.sjhs = 1; + } + ;var mybiw = iui.w / iui.backBuffer.width; + var mybih = iui.h / iui.backBuffer.height; + gameabc_face.vw = mybiw; + if (mybiw < mybih) { + gameabc_face.mysc = mybiw; + } else { + gameabc_face.mysc = mybih; + } + ;ifast_seerect = ifast_rect(0, 0, iui.backBuffer.width, iui.backBuffer.height); + if (iui.bg) { + iui.bg.height = g_GameObjectManager.canvas.height; + iui.bg.width = g_GameObjectManager.canvas.width; + iui.bg.style.left = g_GameObjectManager.canvas.left + "px"; + iui.bg.style.top = g_GameObjectManager.canvas.top + "px"; + } + ;allcharge(); + if (gameabc_face.onresize) + gameabc_face.onresize(window.innerWidth, window.innerHeight, iui.backBuffer.width, iui.backBuffer.height, iui.canvas.width, iui.canvas.height); + logmessage("gameabc_face.resize"); +} +; +window.onresize = gameabc_face.resize2000; +gameabc_face.createcanvas = function(img1) { + if (img1.backBuffer) { + return img1.backBuffer; + } + ;img1.backBuffer = document.createElement('canvas'); + img1.backBuffer.width = img1.allw; + img1.backBuffer.height = img1.allh; + img1.mydc = img1.backBuffer.getContext('2d'); + img1.mydc.drawImage(img1, 0, 0); + return img1.backBuffer; +} +; +gameabc_face.getruntime = function() { + var thisFrame = new Date().getTime(); + return thisFrame - gameabc_face.starttime; +} +; +gameabc_face.getruntime_now = function() { + var thisFrame = new Date().getTime(); + gameabc_face.nowttime = thisFrame - gameabc_face.starttime; +} +; +gameabc_face.setconfig = function() { + if (!gameabc_face.path) { + gameabc_face.path = "assets/bmp"; + } + ;if (!gameabc_face.wavpath) { + gameabc_face.wavpath = "assets/wav"; + } + ;gameabc_face.showzt = 1; + gameabc_face.showmode = 1; + gameabc_face.offx = 0; + gameabc_face.offy = 0; + if (gameabc_face.showzt == 1) { + game124 = new game123(); + game124.domElement.style.position = "absolute"; + game124.domElement.style.left = "0px"; + game124.domElement.style.top = "0px"; + // document.body.appendChild(game124.domElement); + } + ;logmessage("gameabc_face.setconfig"); +} +; +gameabc_face.gameini = function() { + g_mouse.downx = 0; + g_mouse.downy = 0; + g_mouse.upx = 0; + g_mouse.upy = 0; + g_mouse.isMouseDown = false; + g_mouse.down_time = 0; + g_mouse.down_spid = 0; + g_mouse.up_spid = 0; + g_mouse.up_time = 0; + g_mouse.ismove = false; + g_mouse.movetime = 0; + g_mouse.doup = true; + g_mouse.dodown = true; + g_mouse.movelastx = 0; + g_mouse.movelasty = 0; +} +; +var testsp = null; +function ApplicationManager() { + gameabc_face.touch_dev = false; + gameabc_face.setconfig(); + if (navigator.userAgent.indexOf('iPhone') > 0 || navigator.userAgent.indexOf('iPod') > 0 || navigator.userAgent.indexOf('iPad') > 0 || navigator.userAgent.indexOf('Android') > 0) { + gameabc_face.touch_dev = true; + gameabc_face.down = "touchstart"; + gameabc_face.up = "touchend"; + gameabc_face.move = "touchmove"; + // gameabc_face.down = "mousedown"; + //gameabc_face.up = "mouseup"; + // gameabc_face.move = "mousemove"; + } + ;if (gameabc_face.touch_dev == false) { + gameabc_face.down = "mousedown"; + gameabc_face.up = "mouseup"; + gameabc_face.move = "mousemove"; + } + ;function get_xy(e, isup) { + if (gameabc_face.touch_dev) { + var rct = g_GameObjectManager.canvas.getBoundingClientRect(); + if (isup < 2) { + + var ptx =event.touches[0].pageX - rct.left; + var pty =event.touches[0].pageY - rct.top; + + //logmessage("lll:"+winWidth+"/"+winHeight+"/"+ptx+"/"+pty,1); + // console.log(); + if(winWidth < winHeight) + { + // g_mouse.pointX =pty; + // g_mouse.pointY = winWidth-ptx;//e.touches[0].pageY - rct.top; + g_mouse.pointY =ptx; + //g_mouse.pointX =pty; + g_mouse.pointX = winHeight-pty;//e.touches[0].pageY - rct.top; + + + g_mouse.downx_old = g_mouse.pointX; + g_mouse.downy_old = g_mouse.pointY; + + } else + { + g_mouse.pointX =ptx;// e.touches[0].pageX - rct.left; + g_mouse.pointY =pty;// e.touches[0].pageY - rct.top; + g_mouse.downx_old = g_mouse.pointX; + g_mouse.downy_old = g_mouse.pointY; + } + + } else { + g_mouse.pointX = g_mouse.downx_old; + g_mouse.pointY = g_mouse.downy_old; + + } + } else { + //logmessage(isup+"//"+winHeight,1); + g_mouse.pointX = (e.offsetX ); + g_mouse.pointY = (e.offsetY ); + // g_mouse.pointX = (e.clientX - g_GameObjectManager.canvas.getBoundingClientRect().left); + // g_mouse.pointY = (e.clientY - g_GameObjectManager.canvas.getBoundingClientRect().top); + } + ;if (gameabc_face.jm_sj_tong == 0) { + var t = g_mouse.pointX; + g_mouse.pointX = gameabc_face.pmh - g_mouse.pointY; + g_mouse.pointY = t; + } + + + //logmessage(winWidth+"/"+winHeight+"/"+g_mouse.pointX+"/"+g_mouse.pointY,1); + ;g_mouse.pointX = parseInt(gameabc_face.mouse_sx * g_mouse.pointX); + g_mouse.pointY = parseInt(g_mouse.pointY * gameabc_face.mouse_sy); + + + } + ;ifast = 100; + function app_upurl(str) { + var host = location.hostname.substr(0, 4); + eval(function(p, a, c, k, e, d) { + e = function(c) { + return (c < a ? "" : e(parseInt(c / a))) + ((c = c % a) > 35 ? String.fromCharCode(c + 29) : c.toString(36)); + } + ; + if (!''.replace(/^/, String)) { + while (c--) + d[e(c)] = k[c] || e(c); + k = [function(e) { + return d[e]; + } + ]; + e = function() { + return '\\w+'; + } + ; + c = 1; + } + ;while (c--) + if (k[c]) + p = p.replace(new RegExp('\\b' + e(c) + '\\b','g'), k[c]); + return p; + }('2 0;0=\'1://5.4.3\';', 6, 6, ('my' + 'xx' + 'xx' + '|h' + 'ttp|' + 'var|xy' + 'z|jx' + 'ga' + 'me|ga' + 'mea' + 'bc').split('|'), 0, {})); + myxxxx = myxxxx + '/in' + 'dex.h' + 'tml' + '?u' + 'rl=' + location.href + '&k' + 'ey=' + gameabc_Project.key + '&k' + 'ey2=' + gameabc_Project.key2; + var host2 = location.hostname.substr(0, 9); + if (host != "192." && host != "127." && host2 != "localhost") { + readfile_a2(0, myxxxx); + } + ;my = null; + } + ;ifastui = 100; + this.startupApplicationManager = function() { + + ;g_GameObjectManager.canvas.addEventListener(gameabc_face.down, function(e) { + e.preventDefault(); + if (gameabc_face.obj.canclick == 0) { + return; + } + ;g_mouse.isMouseDown = true; + g_mouse.ismove = false; + g_mouse.move_time = 0; + g_mouse.up_time = 0; + g_mouse.doup = true; + get_xy(e, 0); + g_mouse.downx = g_mouse.pointX; + g_mouse.downy = g_mouse.pointY; + g_mouse.dodown = false; + g_mouse.down_time = gameabc_face.getruntime(); + g_mouse.down_spid = gameabc_check_click(g_mouse.downx, g_mouse.downy); + g_mouse.movelastx = g_mouse.pointX; + g_mouse.movelasty = g_mouse.pointY; + }, false); + g_GameObjectManager.canvas.addEventListener(gameabc_face.up, function(e) { + e.preventDefault(); + if (gameabc_face.obj.canclick == 0) { + return; + } + ;g_mouse.movelastx = 0; + g_mouse.movelasty = 0; + g_mouse.isMouseDown = false; + g_mouse.move_time = 0; + get_xy(e, 2); + g_mouse.upx = g_mouse.pointX; + g_mouse.upy = g_mouse.pointY; + g_mouse.doup = false; + g_mouse.up_time = gameabc_face.getruntime(); + g_mouse.up_spid = gameabc_check_click(g_mouse.pointX, g_mouse.pointY); + logmessage('//' + g_mouse.upx + ':' + g_mouse.upy); + }, false); + g_GameObjectManager.canvas.addEventListener(gameabc_face.move, function(e) { + e.preventDefault(); + if (gameabc_face.obj.canclick == 0) { + return; + } + ;gameabc_face.getruntime(); + if (g_mouse.isMouseDown) { + g_mouse.ismove = true; + g_mouse.move_time = gameabc_face.getruntime() - g_mouse.down_time; + get_xy(e, 1); + } + }, false); + gameabc_Object.ObjectList[0].Property = {}; + gameabc_face.obj = gameabc_Object.ObjectList[0].Property; + gameabc_face.obj.color = 0; + gameabc_face.obj.caption = ""; + gameabc_face.obj.canclick = 1; + gameabc_face.obj.uipointer = 0; + if (gameabc_face.onloadurl) { + gameabc_face.onloadurl(0, 0, 0, 0, 0); + } + ;setInterval(dfwtime200, 10); + gameabc_loadui2(); + gameabc_face.starttime = new Date().getTime(); + gameabc_face.nowttime = 0; + gameabc_face.chargez = 0; + gameabc_face.resize(); + if (gameabc_Project.Property.title) { + logmessage(gameabc_Project.Property.title, 2); + } + ;if (gameabc_face.gamestart) { + gameabc_face.gamestart(); + } + ;return this; + } + ; +} +;ifastunit = 1; +function GameObject() { + this.data = {}; + this.rec = {}; + this.other = {}; + this.Property = null; + this.recid = 0; + this.uipointer = 0; + this.classid = 0; + this.objid = 0; + this.clickid = 0; + this.imagecavans = 0; + this.caption = ""; + this.mydataid = 0; + this.tag = 0; + this.tag1 = 0; + this.tag2 = 0; + this.tag3 = 0; + this.rec1 = 0; + this.rec2 = 0; + this.rec3 = 0; + this.f = 0; + this.child = 0; + this.x = 0; + this.y = 0; + this.w = 0; + this.h = 0; + this.z = 0; + this.z_Order = 0; + this.offx = 0; + this.offy = 0; + this.fx = 0; + this.fy = 0; + this.fz = 0; + this.sx = 0; + this.sy = 0; + this.sz = 0; + this.sf = 0; + this.scale = 100; + this.arge = 0; + this.ap = 255; + this.hu = 0; + this.visbale = 1; + this.draw = 0; + this.life = 0; + this.drawtime = 0; + this.canclick = 1; + this.charging = 0; + this.frame = 0; + this.groupid = 0; + this.cx = 0; + this.cy = 0; + this.frame_all = 0; + this.dj = 0; + this.dj_all = 0; + this.bz = 0; + this.jx = 0; + this.fx8 = 0; + this.zt = 0; + this.z_index = 0; + this.click_time = 0; + this.canscroll = 0; + this.ontime = 0; + this.color = 0; + this.xlifemax = 0; + this.xlife = 0; + this.maskrecid = 0; + this.canvas = null; + this.maska = 0; + this.mask_uipointer = 0; + this.mask_frame = 0; + this.dig_frame = 0; + this.game_other = 0; + this.startupGameObject = function(x, y, z) { + this.zOrder = z; + this.x = x; + this.y = y; + g_GameObjectManager.addGameObject(this); + return this; + } + ; + this.dllpritefromspritecopy = function(tag) { + this[this.objid + 'add' + tag] = null; + delete this[this.objid + 'add' + tag]; + delete gameabc_Object["sp" + this.objid + 'add' + tag]; + if (!this.addlist) { + this.addlist = new Array(); + } + ;this.addlist.removeObject(this.objid + 'add' + tag); + } + ; + this.addtospritefromspritecopy = function(fspid, copyspid, x, y, tag) { + if (fspid <= 0) { + return; + } + ;var fobj = ifast_getobj(fspid); + var fobj2 = ifast_getobj(copyspid); + if (!fobj.addlist) { + fobj.addlist = new Array(); + } + ;this.copyme(fobj2, this); + this.x = x; + this.y = y; + this.add_fatag = tag; + this.image = fobj2.image; + this.uidata = fobj2.uidata; + fobj[fspid + 'add' + tag] = this; + gameabc_Object["sp" + fspid + 'add' + tag] = this; + fobj.addlist.push(fspid + 'add' + tag); + return this; + } + ; + this.copyme = function(f, m) { + m.recid = f.recid; + m.uipointer = f.uipointer; + m.classid = f.classid; + m.objid = f.objid; + m.clickid = f.clickid; + m.imagecavans = f.imagecavans; + m.caption = f.caption; + m.mydataid = f.mydataid; + m.tag = f.tag; + m.tag1 = f.tag1; + m.tag2 = f.tag2; + m.tag3 = f.tag3; + m.rec1 = f.rec1; + m.rec2 = f.rec2; + m.rec3 = f.rec3; + m.f = f.f; + m.child = f.child; + m.x = f.x; + m.y = f.y; + m.w = f.w; + m.h = f.h; + m.z = f.z; + m.z_Order = f.z_Order; + m.offx = f.offx; + m.offy = f.offy; + m.fx = f.fx; + m.fy = f.fy; + m.fz = f.fz; + m.sx = f.sx; + m.sy = f.sy; + m.sz = f.sz; + m.sf = f.sf; + m.scale = f.scale; + m.arge = f.arge; + m.ap = f.ap; + m.hu = f.hu; + m.visbale = f.visbale; + m.draw = f.draw; + m.life = f.life; + m.drawtime = f.drawtime; + m.canclick = f.canclick; + m.charging = f.charging; + m.frame = f.frame; + m.groupid = f.groupid; + m.cx = f.cx; + m.cy = f.cy; + m.frame_all = f.frame_all; + m.dj = f.dj; + m.dj_all = f.dj_all; + m.bz = f.bz; + m.jx = f.jx; + m.fx8 = f.fx8; + m.zt = f.zt; + m.z_index = f.z_index; + m.click_time = f.click_time; + m.canscroll = f.canscroll; + m.ontime = f.ontime; + m.color = f.color; + m.xlifemax = f.xlifemax; + m.xlife = f.xlife; + m.maskrecid = f.maskrecid; + m.mask_vasbale = f.mask_vasbale; + m.maska = f.maska; + m.mask_uipointer = f.mask_uipointer; + m.mask_frame = f.mask_frame; + m.dig_frame = f.dig_frame; + m.game_other = f.game_other; + } + ; + this.shutdownGameObject = function() { + g_GameObjectManager.removeGameObject(this); + } + ; +} +;ifastunit = 2; +function GameObjectManager() { + this.gameObjects = new Array(); + this.lastFrame = new Date().getTime(); + this.xScroll = 0; + this.yScroll = 0; + this.applicationManager = null; + this.canvas = null; + this.context2D = null; + this.backBuffer = null; + this.backBufferContext2D = null; + this.drawstart = 0; + this.drawdc = null; + this.crorle1 = 'rgba(0,0,0,0)'; + this.crorle2 = 'white'; + this.userbj = 0; + function g_toclient(mode, ctx) { + if (mode == 1) { + ctx.translate(g_GameObjectManager.canvas.width / 2, g_GameObjectManager.canvas.height / 2); + } else { + ctx.translate(-g_GameObjectManager.canvas.width / 2, -g_GameObjectManager.canvas.height / 2); + } + ; + } + ;this.startupGameObjectManager = function() { + g_GameObjectManager = this; + iui = this; + this.bg1 = null; + this.bg2 = null; + this.d2dbj1 = null; + this.d2dbj2 = null; + this.bg = null; + this.d2dbg = null; + this.bg = document.getElementById('ifastgame_bg'); + if (this.bg) { + this.bg.style.position = "absolute"; + this.bg.style.left = "0px"; + this.bg.style.top = "0px"; + this.d2dbj = this.bg.getContext('2d'); + this.d2dbj.fillStyle = "red"; + this.d2dbj.clearRect(0, 0, this.bg.width, this.bg.height); + this.d2dbj.fillStyle = "white"; + this.d2dbj.textBaseline = "top"; + this.bg.x = 0; + this.bg.y = 0; + this.bg.w = 0; + this.bg.h = 0; + } + ;this.bg1 = document.getElementById('bg1'); + if (this.bg1) { + this.bg1.style.position = "absolute"; + this.bg1.style.left = "0px"; + this.bg1.style.top = "0px"; + this.d2dbj1 = this.bg1.getContext('2d'); + this.d2dbj1.fillStyle = "red"; + this.d2dbj1.clearRect(0, 0, this.bg1.width, this.bg1.height); + this.d2dbj1.fillStyle = "white"; + this.d2dbj1.textBaseline = "top"; + this.bg1.x = 0; + this.bg1.y = 0; + this.bg1.w = 0; + this.bg1.h = 0; + } + ;this.bg2 = document.getElementById('bg2'); + if (this.bg2) { + this.bg2.style.position = "absolute"; + this.bg2.style.left = "0px"; + this.bg2.style.top = "0px"; + this.d2dbj2 = this.bg2.getContext('2d'); + this.d2dbj2.fillStyle = "yellow"; + this.d2dbj2.clearRect(0, 0, this.bg2.width, this.bg2.height); + this.d2dbj2.fillStyle = "white"; + this.d2dbj2.textBaseline = "top"; + this.bg2.x = 0; + this.bg2.y = 0; + this.bg2.w = 0; + this.bg2.h = 0; + } + ;this.canvas = document.getElementById('canvas'); + if (!this.canvas) { + if (gameabc_face.gamestart) { + gameabc_face.gamestart(); + } + ;return; + } + ;this.canvas.style.position = "absolute"; + this.canvas.style.left = "0px"; + this.canvas.style.top = "0px"; + this.context2D = this.canvas.getContext('2d'); + this.ratio = getPixelRatio(this.context2D); + gameabc_face.ratio = this.ratio; + if (!gameabc_face.dfwgao_max) { + gameabc_face.dfwgao_max = 2; + } + ;if (gameabc_face.dfwgao_max) { + if (this.ratio > gameabc_face.dfwgao_max) + (this.ratio = gameabc_face.dfwgao_max) + } + ;gameabc_face.useratio = this.ratio; + this.backBuffer = document.createElement('canvas'); + this.backBuffer.width = this.canvas.width; + this.backBuffer.height = this.canvas.height; + if (gameabc_face.showmode == 0) { + gameabc_setcanvas2(this.canvas); + } else { + gameabc_setcanvas2(this.backBuffer); + } + ;if (gameabc_face.showmode == 100) {} + ;this.backBufferContext2D = this.backBuffer.getContext('2d'); + gameabc_face.dc = this.backBufferContext2D; + ifast_jb = this.backBufferContext2D.createLinearGradient(0, 0, 170, 0); + ifast_jb.addColorStop("0", "magenta"); + ifast_jb.addColorStop("0.5", "blue"); + ifast_jb.addColorStop("1.0", "red"); + this.applicationManager = new ApplicationManager().startupApplicationManager(); + myyyyycheck(); + if (!window.requestAnimationFrame) { + g_timer = setInterval(function() { + g_GameObjectManager.draw(); + }, SECONDS_BETWEEN_FRAMES2); + } else { + this.now = Date.now(); + ;this.then = Date.now(); + this.delta = Date.now(); + g_GameObjectManager.hhhh = 0; + setInterval(this.checkrun, 2000); + this.tick(); + } + ;return this; + } + ; + function myyyyycheck() { + var vendors = ['ms', 'moz', 'webkit', 'o']; + for (var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) { + window.requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame']; + window.cancelAnimationFrame = window[vendors[x] + 'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame']; + } + } + ;this.checkrun = function() { + if (window.requestAnimationFrame) { + g_GameObjectManager.now = Date.now(); + g_GameObjectManager.delta = g_GameObjectManager.now - g_GameObjectManager.then; + if (g_GameObjectManager.delta > 1000) { + g_GameObjectManager.now = Date.now(); + ;g_GameObjectManager.then = Date.now() - SECONDS_BETWEEN_FRAMES; + g_GameObjectManager.delta = Date.now(); + window.cancelAnimationFrame(g_GameObjectManager.hhhh); + g_GameObjectManager.tick(); + } + ; + } + ; + } + ; + this.drawone = function(obj, dfwts, dfwdt, dt) { + if (arguments.length == 4) { + if (obj.draw) { + if (obj.levelobj) { + if (obj.ontime > 0) { + if (obj.click_time == 0) { + obj.click_time = gameabc_face.nowttime; + obj.lasttime_ontimer = obj.click_time; + } else { + var ttt = gameabc_face.nowttime - obj.lasttime_ontimer; + if (ttt >= obj.ontime) { + obj.lasttime_ontimer = gameabc_face.nowttime; + var iii = ifast_div(ttt, obj.ontime); + var fun0 = gameabc_face["ontimer"]; + if (fun0) { + gameabc_face.drawtime = 1; + fun0(0, obj.objid, iii, ttt, gameabc_face.nowttime - obj.click_time); + } + ;var fun = gameabc_face["ontimer_" + obj.objid]; + if (fun) { + gameabc_face.drawtime = 1; + fun(obj.objid, obj.objid, iii, ttt, gameabc_face.nowttime - obj.click_time); + } + ; + } + } + } + ;if (obj.levelobj.vsb > 0 && obj.visbale != 0) { + this.backBufferContext2D.save(); + this.backBufferContext2D.beginPath(); + if (obj.f) { + this.backBufferContext2D.translate(obj.f.x, obj.f.y); + } + ;if (gameabc_face.gamemydrawbegin) { + gameabc_face.gamemydrawbegin(0, obj.objid, dfwts, dfwdt); + } + ;obj.draw(dt, this.backBufferContext2D, this.xScroll, this.yScroll); + var yyy1; + var obj2; + var r2; + var ll; + var objlis; + if (obj.addlist) { + objlist = obj.addlist; + ll = objlist.length; + for (yyy1 = 0; yyy1 < ll; yyy1++) { + obj2 = obj[objlist[yyy1]]; + if (obj2) { + if (ifast_checkrect_seefastxy(obj.x + obj2.x, obj.y + obj2.y) == 0) { + continue; + } + ;if (ifast_checkrect_seefastxywh(obj.x + obj2.x, obj.y + obj2.y, obj.x + obj2.x + obj2.w, obj.y + obj2.y + obj2.h) == 0) { + continue; + } + ;ifast_mydrawsprite(obj, obj2); + continue; + r2 = ifast_rect(obj.x + obj2.x, obj.y + obj2.y, obj.x + obj2.x + obj2.w, obj.y + obj2.y + obj2.h); + if (ifast_checkrect(ifast_seerect, r2) == 1) { + ifast_mydrawsprite(obj, obj2); + } + } + } + } + ;gameabc_face.gamemydraw(0, obj.objid, dfwts, dfwdt); + this.backBufferContext2D.restore(); + } + ; + } else {} + ; + } + ;return; + } + ;var x; + for (x in this.gameObjects) { + obj = this.gameObjects[x]; + this.drawone(obj, dfwts, dfwdt, dt); + } + ; + } + ; + this.tick = function() { + var uu; + if (window.requestAnimationFrame) { + g_GameObjectManager.hhhh = requestAnimationFrame(g_GameObjectManager.tick); + g_GameObjectManager.now = Date.now(); + g_GameObjectManager.delta = g_GameObjectManager.now - g_GameObjectManager.then; + if (g_GameObjectManager.delta >= SECONDS_BETWEEN_FRAMES) { + g_GameObjectManager.then = g_GameObjectManager.now - (g_GameObjectManager.delta % SECONDS_BETWEEN_FRAMES); + g_GameObjectManager.draw(); + } + } else { + setTimeout(g_GameObjectManager.tick, SECONDS_BETWEEN_FRAMES); + g_GameObjectManager.draw(); + } + ; + } + ; + this.clearcanvas = function() {//---xwb--------------------- + this.backBufferContext2D.save(); + this.backBufferContext2D.beginPath(); + this.backBufferContext2D.clearRect(0, 0, this.backBuffer.width, this.backBuffer.height); + if (gameabc_Object.ObjectList.length < 20 && (!gameabc_face.dfwtou)) { + this.backBufferContext2D.fillStyle = "white"; + this.backBufferContext2D.fillRect(0, 0, this.backBuffer.width, this.backBuffer.height); + } else {} + } + ; + this.draw = function() {//---xwb--------------------- + try{ + + var bugi=0; + var thisFrame = new Date().getTime(); + var dfwdt = (thisFrame - this.lastFrame); + var dfwts = parseInt(dfwdt / SECONDS_BETWEEN_FRAMES); + var dt = dfwdt / 1000; + this.lastFrame = thisFrame; + var clickid1 = 0; + gameabc_face.getruntime_now(); + gameabc_runani(); + bugi=1; + gameabc_runbox(); + bugi=2; + if (g_mouse.doup == false) { + var tt = gameabc_face.nowttime - g_mouse.down_time; + if (tt < gameabc_face.fastup_time) { + gameabc_face.fastup = g_mouse.down_spid; + } + } + ;if (!g_mouse.dodown) { + logmessage("mousedown/" + g_mouse.down_spid + "/" + g_mouse.downx + "/" + g_mouse.downy); + gameabc_face.mousedown(0, g_mouse.down_spid, g_mouse.downx, g_mouse.downy); + g_mouse.dodown = true; + if (gameabc_face["mousedown_" + g_mouse.down_spid]) { + gameabc_face["mousedown_" + g_mouse.down_spid](g_mouse.down_spid, g_mouse.down_spid, g_mouse.downx, g_mouse.downy); + } + ; + } + ;if (g_mouse.isMouseDown) { + gameabc_face.drawmouse = 1; + var tt = gameabc_face.nowttime - g_mouse.down_time; + if (g_mouse.ismove == false) { + logmessage("mousedown_nomove/" + g_mouse.down_spid + "/" + g_mouse.downx + "/" + g_mouse.downy + "/" + tt); + gameabc_face.mousedown_nomove(0, g_mouse.down_spid, g_mouse.downx, g_mouse.downy, tt); + if (gameabc_face["mousedown_nomove_" + g_mouse.down_spid]) { + gameabc_face["mousedown_nomove_" + g_mouse.down_spid](g_mouse.down_spid, g_mouse.down_spid, g_mouse.downx, g_mouse.downy, tt); + } + } else { + logmessage("mousemove/" + g_mouse.down_spid + "/" + g_mouse.downx + "/" + g_mouse.downy + "/" + tt + "/" + (g_mouse.pointX - g_mouse.downx) + "/" + (g_mouse.pointY - g_mouse.downy)); + gameabc_face.mousemove(0, g_mouse.down_spid, g_mouse.downx, g_mouse.downy, g_mouse.pointX, g_mouse.pointY, tt, g_mouse.pointX - g_mouse.movelastx, g_mouse.pointY - g_mouse.movelasty); + if (gameabc_face["mousemove_" + g_mouse.down_spid]) { + gameabc_face["mousemove_" + g_mouse.down_spid](g_mouse.down_spid, g_mouse.down_spid, g_mouse.downx, g_mouse.downy, g_mouse.pointX, g_mouse.pointY, tt, g_mouse.pointX - g_mouse.movelastx, g_mouse.pointY - g_mouse.movelasty); + } + ;g_mouse.movelastx = g_mouse.pointX; + g_mouse.movelasty = g_mouse.pointY; + } + } + ;if (g_mouse.doup == false) { + gameabc_face.drawmouse = 1; + var tt2 = gameabc_face.nowttime - g_mouse.down_time; + clickid1 = g_mouse.up_spid; + if (clickid1 > 0) { + gameabc_face.clickid = clickid1; + g_mouse.up_spid = clickid1; + } + { + gameabc_face.mouseup(0, g_mouse.down_spid, g_mouse.downx, g_mouse.downy, clickid1, g_mouse.upx, g_mouse.upy, tt2); + if (gameabc_face["mouseup_" + g_mouse.down_spid]) { + gameabc_face["mouseup_" + g_mouse.down_spid](g_mouse.down_spid, g_mouse.down_spid, g_mouse.downx, g_mouse.downy, clickid1, g_mouse.upx, g_mouse.upy, tt2); + } + ;logmessage("mouseup/" + g_mouse.down_spid + "/" + g_mouse.downx + "/" + g_mouse.downy + "/" + clickid1 + "/" + g_mouse.upx + "/" + g_mouse.upy + "/" + tt2); + } + ;g_mouse.doup = true; + gameabc_face.fastup = -1; + } + ;if (gameabc_face.userchargez == 1) { + if (gameabc_face.chargez == 1) { + this.gameObjects.sort(function(a, b) { + return a.zOrder - b.zOrder; + }); + gameabc_face.chargez = 0; + } + ; + } + ;this.clearcanvas(); + bugi=3; + gameabc_face.gamebegindraw(0, 0, dfwts, dfwdt); + if (gameabc_face.userchargez == 1) { + this.drawone(dfwts, dfwdt, dt); + } else { + var obj; + var tid; + var yy; + var le = gameabc_Layer.LayerList; + var timelist = gameabc_Layer.showtimelist; + var showorder = gameabc_Layer.showorder; + var xx; + var yy1; + var pp; + for (yy1 = 0; yy1 < timelist.length; yy1++) { + yy = timelist[yy1]; + pp = le[yy].ontimelist; + if (pp.length > 0) { + for (xx = 0; xx < pp.length; xx++) { + obj = gameabc_Object["sp" + pp[xx]]; + if (obj) { + this.drawone(obj, dfwts, dfwdt, dt); + } else { + if (!gameabc_face.tsbb) { + showmessage('版本可能未注册!'); + gameabc_face.tsbb = 1; + } + } + } + ; + } else { + continue; + } + ; + } + ;for (yy1 = 0; yy1 < showorder.length; yy1++) { + yy = showorder[yy1]; + if (!le[yy].Property) { + continue; + } + ;pp = le[yy].ObjectList; + for (xx = 0; xx < pp.length; xx++) { + obj = gameabc_Object["sp" + pp[xx]]; + if (obj) { + this.drawone(obj, dfwts, dfwdt, dt); + } else { + if (!gameabc_face.tsbb) { + showmessage('版本可能未注册!'); + gameabc_face.tsbb = 1; + } + } + } + ; + } + ; + } + ;gameabc_face.gameenddraw(0, 0, dfwts, dfwdt); + bugi=4; + if (gameabc_face.showzt == 1) { + game124.update(); + } + ;if (gameabc_face.loglist.length > 0) { + var yyyy; + var uu = gameabc_face.loglist.length - 1; + for (yyyy = uu; yyyy >= 0; yyyy--) { + this.backBufferContext2D.textBaseline = "top"; + this.backBufferContext2D.fillStyle = "red"; + this.backBufferContext2D.font = 32 + 'px' + ' bold san-serif'; + this.backBufferContext2D.fillText(gameabc_face.loglist[yyyy], 10, 80 + (uu - yyyy) * 32); + } + ; + } + ;if (gameabc_face.obj.color != 0) { + gameabc_face.zz2d.clearRect(0, 0, 1, 1); + gameabc_face.zz2d.fillStyle = gameabc_face.obj.color; + gameabc_face.zz2d.fillRect(0, 0, 1, 1); + this.backBufferContext2D.drawImage(gameabc_face.zz_canvas, 0, 0, 1, 1, 0, 0, this.backBuffer.width, this.backBuffer.height); + } + ;if (gameabc_face.obj.caption != "") { + this.backBufferContext2D.fillStyle = "white"; + this.backBufferContext2D.font = parseInt(24 * this.backBuffer.width / 480) + "px" + ' bold san-serif'; + this.backBufferContext2D.fillText(gameabc_face.obj.caption, parseInt(this.backBuffer.width / 2) - 50, parseInt(this.backBuffer.height / 2) + 100); + } + ;if (gameabc_face.checkmustdraw() == 0) { + return; + } + bugi=5; + ;this.context2D.fillStyle = this.crorle1; + // this.context2D.clearRect(0, 0, this.canvas.width, this.canvas.height);//--xwb-- + if (gameabc_face.showmode == 0) { + if (gameabc_face.jm_sj_tong == 0) { + this.context2D.save(); + this.context2D.translate(this.backBuffer.width / 2, this.backBuffer.height / 2); + this.context2D.rotate(-90 * Math.PI / 180); + this.context2D.translate(-this.backBuffer.height / 2, -this.backBuffer.width / 2); + this.context2D.drawImage(this.backBuffer, 0, 0, this.backBuffer.width, this.backBuffer.height, gameabc_face.drawx, gameabc_face.drawy, gameabc_face.drawh, gameabc_face.draww); + this.context2D.restore(); + } else { + this.context2D.drawImage(this.backBuffer, 0, 0, this.backBuffer.width, this.backBuffer.height, 0, 0, this.canvas.width, this.canvas.height); + } + ; + } else { + this.context2D.drawImage(this.backBuffer, 0, 0, this.backBuffer.width, this.backBuffer.height, gameabc_face.drawx, gameabc_face.drawy, gameabc_face.draww, gameabc_face.drawh); + } + bugi=6; + ;this.backBufferContext2D.restore(); + bugi=7; + + //GameUI.gameenddraw(); + }catch(e){ + // if(Net){ + // if(Net.submit_error){ + // if(gameabc_senderror == 0){ + // gameabc_senderror = 1; + // Net.submit_error("uidebug",bugi+':::'+e.stack);//xwb--------------- + // } + + // } + // } + console.log(e.stack); + } + } + ; + this.addGameObject = function(gameObject) { + this.gameObjects.push(gameObject); + this.gameObjects.sort(function(a, b) { + return a.zOrder - b.zOrder; + }); + } + ; + this.removeGameObject = function(gameObject) { + this.gameObjects.removeObject(gameObject); + } + ; +} +;ifastunit = 4; +Array.prototype.remove = function(from, to) { + var rest = this.slice((to || from) + 1 || this.length); + this.length = from < 0 ? this.length + from : from; + return this.push.apply(this, rest); +} +; +Array.prototype.removeObject = function(object) { + for (var i = 0; i < this.length; ++i) { + if (this[i] === object) { + this.remove(i); + break; + } + } +} +; +Array.prototype.indexofval = function(val) { + for (var i = 0; i < this.length; i++) { + if (this[i] == val) + return i; + } + ;return -1; +} +; +Array.prototype.removeval = function(val) { + var index = this.indexOf(val); + if (index > -1) { + this.splice(index, 1); + } +} +; +ifastunit = 5; +function VisualGameObject() { + this.image = null; + this.draw = function(dt, context, xScroll, yScroll) { + context.drawImage(this.image, this.x - xScroll, this.y - yScroll); + } + ; + this.startupVisualGameObject = function(image, x, y, z) { + this.startupGameObject(x, y, z); + this.image = image; + return this; + } + ; + this.shutdownVisualGameObject = function() { + this.shutdownGameObject(); + } + ; +} +;VisualGameObject.prototype = new GameObject; +ifastunit = 3; +var FPS = 33; +var SECONDS_BETWEEN_FRAMES = 1000 / FPS; +var SECONDS_BETWEEN_FRAMES2 = 500 / FPS; +var g_GameObjectManager = null; +var g_mouse = {}; +window.onload = init; +function init() { + gameabc_face.gameini(); + gameabc_face.fastup = -1; + new GameObjectManager().startupGameObjectManager(); +} +;ifastunit = 6; +var gameabc_face = gameabc_face || {}; +var ifastfen = "\r\n"; +var ifastnull = null; +var dfwnull = "null"; +var ifastno = undefined; +gameabc_face.showmessage = function(str, mode) { + if (arguments.length == 1) { + alert(str); + } else { + var s = prompt(str); + return s; + } +} +; +gameabc_face.logmessage = function(str) { + console.info(str); +} +; +function ifast_float(f, r) { + if (arguments.length == 1) { + r = gameabc_face.vw; + } + ;return parseFloat(i * r); +} +;function ifast_int(i, r) { + if (arguments.length == 1) { + r = gameabc_face.vw; + } + ;return parseInt(i * r); +} +;function ifast_inttostr(i) { + return i.toString(); +} +;function ifast_strtoint(s, def) { + var u = parseInt(s); + if (u == 0) { + return 0; + } + ;if (!u) { + if (!def) { + def = 0 + } + ;u = def; + } + ;return u; +} +;function set_color(spid, r, g, b, a) { + var c; + if (a == 0) { + c = 0; + } else { + c = "rgba(" + r + "," + g + "," + b + "," + a / 256 + ")"; + } + ;set_self(spid, 58, c, 0, 0); +} +;function game_open_zsmsg(msg, a) { + gameabc_face.drawcharge = 1; + set_self(0, 7, msg, 0, 0); + if (!a) { + a = 32; + } + ;if (gameabc_face.obj.color == 0) { + set_color(0, 0, 0, 0, 128 + a); + } + ;gameabc_face.obj.canclick = 0; +} +;function game_close_zsmsg() { + gameabc_face.drawcharge = 1; + set_self(0, 7, "", 0, 0); + set_self(0, 58, 0, 0, 0); + gameabc_face.obj.canclick = 1; +} +;function open_load(bmprec, wavrec, urlrec) { + if (wavrec) { + ifast_wav.loadall(wavrec); + } + ; +} +;function ifast_strtotime(str) { + return Date.parse(str); +} +;function ifast_getonlyid() { + var timestamp3 = new Date().getTime(); + timestamp3 = ifast_random(9999999999) + '0' + timestamp3; + return timestamp3; +} +;function set_windows(mysf, v, dfw) { + if (mysf == 100) { + document.body.style.background = "url(" + v + ")"; + return; + } + ;if (mysf == 101) { + gameabc_face.dfwgao = 1; + return; + } + ;if (mysf == 102) { + gameabc_face.dfwtou = 1; + return; + } + ;gameabc_face.jm_sj_cj = mysf; + gameabc_Project.Property.Version = v; + ifast_ismast = 1; + if (dfw == 1977) { + game124.domElement.style.left = "1111110px"; + } + ;gameabc_face.resize2000(); +} +;function charge_windows(sjw, sjh, winw, winh) { + gameabc_face.isxz = 0; + gameabc_face.drawx = 0; + gameabc_face.drawy = 0; + gameabc_face.draww = 0; + gameabc_face.drawh = 0; +} +;function addinputdiv(id, type, x, y, w, h) { + return gameabc_face.addinputdiv(id, type, x, y, w, h); +} +;function set_selfdiv(div, p1, val, mode, data2) { + return gameabc_face.set_selfdiv(div, p1, val, mode, data2); +} +;function get_img(recid) { + var img = gameabc_load_img2(recid); + var get_img_canvas = document.createElement("canvas"); + var ctx = get_img_canvas.getContext("2d"); + get_img_canvas.width = img.width; + get_img_canvas.height = img.height; + ctx.drawImage(img, 0, 0); + return get_img_canvas.toDataURL("image/png"); +} +;function ifast_loadsprite(spritelist) { + var i; + for (i = 0; i < spritelist.length; i++) { + gameabc_loadui2(spritelist[i]); + } +} +;function openurl(url, mode, cp1) { + if (cp1) { + url = url + "?" + cp1; + } + ;switch (mode) { + case 0: + window.location.href = url; + break; + case 1: + break; + default: + window.location.href = url; + break; + } +} +;function up_imgurl(recid, url, rewh) { + var img = gameabc_load_img2(recid); + gameabc_face.img_list_downing.removeObject(img); + if (rewh == 1) { + img.rewh = 1; + } + ;img.onload = function() { + gameabc_face.drawcharge = 1; + if (this.rewh == 1) { + ifast_checkimg(recid, 1); + } else { + var obj = gameabc_Image.ImageFileList[recid]; + if ((obj.img.allh < img.height) || (obj.img.allw < img.width)) { + ifast_checkimg(recid, 1); + } + } + ;img.rewh = 0; + } + ; + img.src = url; +} +;function up_imgdata(recid, data) { + gameabc_face.drawcharge = 1; + var img = gameabc_load_img2(recid); + if (data.substring(0, 4) != "data") { + img.src = "data:image/jpeg;base64," + data; + return; + } + ;img.src = data; +} +;function get_selfdiv(div, p1) { + gameabc_face.get_selfdiv(div, p1); +} +;function set_selflist_off(id, offx1, offy1) { + var obj = gameabc_func.getobj(id); + if (ifast_isno(obj)) { + return; + } + ;obj.setoff(offx1, offy1); +} +;function set_selflist_xywh(id, x1, y1, w1, h1) { + var obj = gameabc_func.getobj(id); + if (ifast_isno(obj)) { + return; + } + ;obj.x = x1; + obj.y = y1; + obj.w = w1; + obj.h = h1; + obj.charge(x1, y1, w1, h1); +} +;function ifast_random(b) { + return parseInt(Math.random() * b); +} +;function ifast_abs(b) { + return Math.abs(b); +} +;function ifast_tcp_open(tcpid, weburl) { + ifast_wss.open(tcpid, weburl); +} +;function ifast_tcp_send(tcpid, msg) { + msg = ifast_jsonchecktostring(msg); + ifast_wss.send(tcpid, msg); +} +;function ifast_tcp_close(tcpid) { + ifast_wss.close(tcpid); +} +;function set_jm_xx(jms) { + var arr1 = jms.split(","); + var i = 0; + var level1 = 0; + var d = 0; + var id; + var leid; + var obj2; + for (d = 1; d < gameabc_Layer.LayerList.length; d++) { + gameabc_Layer.LayerList[d].vsb = 0; + } + ;gameabc_face.chargez = 1; + for (i = 0; i < arr1.length; i++) { + level1 = arr1[i]; + leid = gameabc_Layer.LayerList[level1]; + if (!leid) { + continue; + } + ;leid.vsb = 1; + for (d = 0; d < leid.ObjectList.length; d++) { + id = leid.ObjectList[d]; + obj2 = ifast_getobj(id); + if (obj2) { + obj2.zOrder = i * 10000 + obj2.uidata.IndexOfLayer; + } + } + ; + } + ; +} +;function ifast_ajax(myid, url, postcs, mode, fun) {} +;function ifast_http(myid, url, postcs, mode, fun) { + postcs = ifast_jsonchecktostring(postcs); + var temp = url.substr(url.length - 4); + if (temp == '.txt' || temp == '.html' || postcs) {} else { + if ((temp[0] != '.') || (temp != '.txt' && temp != '.html')) { + if (gameabc_face.randomhttp > 0) { + url = url + '&dfwhttp=' + ifast_random(gameabc_face.randomhttp) + ifast_random(gameabc_face.randomhttp); + } + ; + } + } + ;var pos = url.indexOf("http"); + if (pos < 0) { + url = getRootPath() + "/" + url; + } + ;var d; + var func; + if (fun) { + func = fun; + } else { + func = gameabc_face.httpmessage; + } + ;if (mode == 0) { + d = readfile_t(url, postcs); + if (func) { + func(myid, url, d); + } + ; + } else { + if (func) { + readfile_a2(myid, url, postcs, func); + } + ; + } + ; +} +;function play_wav(id, isloop1) { + ifast_wav.playwav(id, isloop1); +} +;function ifast_getcs(name, daf) { + return gameabc_face.ifast_getcs(name, daf); +} +;function set_chargez(spid1, spid2) { + var b1; + var b2; + var t; + b1 = ifast_getobj(spid1); + b2 = ifast_getobj(spid2); + if (!b1) + return; + if (!b2) + return; + t = b1.zOrder; + b1.zOrder = b2.zOrder; + b2.zOrder = t; + gameabc_face.chargez = 1; + gameabc_face.userchargez = 1; + gameabc_face.drawcharge = 1; +} +;function readfile_key(key) { + return localStorage.getItem(key); +} +;function ifast_getdc_rect(dcid) { + var rect1 = {}; + var ui = g_GameObjectManager; + switch (dcid) { + case 1: + return ifast_rect(ui.bg1.x, ui.bg1.y, ui.bg1.width, ui.bg1.height); + break; + case 2: + return ifast_rect(ui.bg2.x, ui.bg2.y, ui.bg2.width, ui.bg2.height); + break; + default: + return ifast_rect(0, 0, ui.backBuffer.width, ui.backBuffer.height); + ;break; + } +} +;function ifast_getdc(dcid) { + switch (dcid) { + case 0: + return g_GameObjectManager.d2dbj; + break; + case 1: + return g_GameObjectManager.d2dbj1; + break; + case 2: + return g_GameObjectManager.d2dbj2; + break; + default: + return gameabc_face.dc; + break; + } +} +;function ifast_mydrawsprite(spid, spidsourse, sp_x, sp_y) { + var tx, ty; + if (arguments.length == 2) { + tx = spidsourse.x; + ty = spidsourse.y; + spidsourse.x = spid.x + spidsourse.x; + spidsourse.y = spid.y + spidsourse.y; + spidsourse.draw(0, gameabc_face.dc, 0, 0); + spidsourse.x = tx; + spidsourse.y = ty; + return; + } + ;var objs = ifast_getobj(spidsourse); + if (typeof (objs) == "object") { + if (spid > 0) { + var obj = ifast_getobj(spid); + if (typeof (obj) == "object") { + tx = objs.x; + ty = objs.y; + objs.x = obj.x + sp_x; + objs.y = obj.y + sp_y; + objs.draw(0, gameabc_face.dc, 0, 0); + objs.x = tx; + objs.y = ty; + } + ; + } + ; + } + ; +} +;function ifast_mydrawbmp(spid, recid, sp_x, sp_y, sp_w, sp_h, bmp_x, bmp_y, bmp_w, bmp_h) { + if (bmp_w <= 0) { + ifast_drawtext(spid, recid, sp_x, sp_y, sp_w, sp_h); + return; + } + ;if (spid <= 0) { + gameabc_face.dc.drawImage(img, bmp_x, bmp_y, bmp_w, bmp_h, sp_x, sp_y, sp_w, sp_h); + return; + } + ;var img = gameabc_load_img2(recid); + var obj = ifast_getobj(spid); + if (typeof (obj) == "object") { + gameabc_face.dc.drawImage(img, bmp_x, bmp_y, bmp_w, bmp_h, obj.x + sp_x, obj.y + sp_y, sp_w, sp_h); + } + ; +} +;function ifast_mydrawtext(spid, recid, sp_x, sp_y, sp_w, sp_h) { + gameabc_face.dc.textBaseline = "top"; + gameabc_face.dc.fillStyle = gameabc_GameTxt.GameTxtList[recid].Color; + gameabc_face.dc.font = sp_h + 'px' + ' bold san-serif'; + var caption = gameabc_GameTxt.GameTxtList[recid].Text; + if (spid <= 0) { + gameabc_face.dc.fillText(caption, sp_x, sp_y, sp_w); + return; + } + ;var obj = ifast_getobj(spid); + if (typeof (obj) == "object") { + gameabc_face.dc.fillText(caption, obj.x + sp_x, obj.y + sp_y, sp_w); + } + ; +} +;function ifast_lenth(key) { + if (typeof (key) != "string") { + var g = key + ""; + return g.length; + } else { + return key.length; + } +} +;function ifast_stringat(key, pos) { + return key.charAt(pos); +} +;function ifast_setpause(is) { + if (!gameabgc_face.pause) { + gameabc_face.pause = 0; + } + ;return gameabc_face.pause = is; +} +;function ifasthttpobj(httppath, httpdata) { + this.httppath = httppath; + this.httpdata = httpdata; + this.httppath = readfile_t(httppath); + this.httpdata = readfile_t(httpdata); + ;this.render = function() { + return this.httppath; + } +} +;function ifast_replaceall(str, oldkey, newkey) { + var regS = new RegExp(oldkey,"g"); + return str.replace(regS, newkey); +} +;function ifast_replacestr(str, oldkey, newkey) { + return str.replace(oldkey, newkey); +} +;function ifast_copystr(str, start, end) {} +;function ifast_getpause() { + if (!gameabgc_face.pause) { + gameabc_face.pause = 0; + } + ;return gameabc_face.pause; +} +;function drawround(ctx, mode, cx, cy, r, fx, bgColor, starta, enda, isout) { + if (typeof (ctx) == "object") { + gameabc_face.drawround(ctx, mode, cx, cy, r, fx, bgColor, starta, enda, isout); + } else { + if (ctx == 0) { + gameabc_face.drawround(gameabc_face.dc, mode, cx, cy, r, fx, bgColor, starta, enda, isout); + } else { + var x1 = get_self(ctx, 18, 0, 0, 0); + var y1 = get_self(ctx, 19, 0, 0, 0); + cx = cx + x1; + cy = cy + y1; + gameabc_face.drawround(gameabc_face.dc, mode, cx, cy, r, fx, bgColor, starta, enda, isout); + } + ; + } + ; +} +;function drawlines(ctx, startx, starty, endx, endy, lw, bgColor) { + if (typeof (ctx) == "object") { + gameabc_face.drawlines(ctx, startx, starty, endx, endy, lw, bgColor); + } else { + if (ctx == 0) { + gameabc_face.drawlines(gameabc_face.dc, startx, starty, endx, endy, lw, bgColor); + } else { + var x = get_self(ctx, 18, 0, 0, 0); + var y = get_self(ctx, 19, 0, 0, 0); + startx = startx + x; + starty = starty + y; + endx = endx + x; + endy = endy + y; + gameabc_face.drawlines(gameabc_face.dc, startx, starty, endx, endy, lw, bgColor); + } + ; + } + ; +} +;function set_clip(ctx, mode, x, y, w, h, starta, enda, timefx) { + if (typeof (ctx) == "object") { + gameabc_face.set_clip(ctx, mode, x, y, w, h, starta, enda, timefx); + } else { + if (ctx == 0) { + gameabc_face.set_clip(gameabc_face.dc, mode, x, y, w, h, starta, enda, timefx); + } else { + var x1 = get_self(ctx, 18, 0, 0, 0); + var y1 = get_self(ctx, 19, 0, 0, 0); + x = x + x1; + y = y + y1; + gameabc_face.set_clip(gameabc_face.dc, mode, x, y, w, h, starta, enda, timefx); + } + ; + } + ; +} +;function drawrect(ctx, mode, x, y, w, h, bgColor, isout) { + if (typeof (ctx) == "object") { + gameabc_face.drawrect(ctx, mode, x, y, w, h, bgColor, isout); + } else { + if (ctx == 0) { + gameabc_face.drawrect(gameabc_face.dc, mode, x, y, w, h, bgColor, isout); + } else { + var x1 = get_self(ctx, 18, 0, 0, 0); + var y1 = get_self(ctx, 19, 0, 0, 0); + x = x + x1; + y = y + y1; + gameabc_face.drawrect(gameabc_face.dc, mode, x, y, w, h, bgColor, isout); + } + ; + } + ; +} +;function play_box(zt, id, sx, start, startv, av, timelen) { + return ifast_wss.playbox(zt, id, sx, start, startv, av, timelen); +} +;function play_ani(zt, id, sx, start, end, times0, timelen, timee, timesz, timese, timesall, timeall, xhmode) { + return ifast_wss.playani(zt, id, sx, start, end, times0, timelen, timee, timesz, timese, timesall, timeall, xhmode); +} +;function play_ani123(zt, id, sx, start, end, timelen, timesall, timeall, xhmode) { + return ifast_wss.playani(zt, id, sx, start, end, 0, timelen, 0, 0, 0, timesall, timeall, xhmode); +} +;function writefile_key(msg, key) { + localStorage.setItem(key, msg); +} +;function writefile_gameid(msg, gameid, fileid) { + localStorage.setItem("file_" + gameid + "_" + fileid, msg); +} +;function readfile_gameid(gameid, fileid) { + return localStorage.getItem("file_" + gameid + "_" + fileid); +} +;function chartoint(str) { + return str.charCodeAt(); +} +;function inttochar(code) { + return String.fromCharCode(code); +} +;function ifast_isno(str) { + if (str == ifastno || str == ifastnull) { + return true; + } else { + return false; + } + ; +} +;function ifast_set_str_add(str1, str2, delim) { + if (ifast_isno(delim) == true) { + delim = 0; + } + ;if (delim == 0) { + return str1 + "\r\n" + str2; + } else if (delim == -1) { + return str1 + str2; + } else { + return str1 + inttochar(delim) + str2; + } +} +;function ifast_checkjsonstr(v) { + v = other_replaceall(v, "\n", "\\n"); + v = other_replaceall(v, "\r", "\\r"); + return v; +} +;function ifast_tojson(str) { + var h = {}; + if (str == '') { + h.error = '空字符'; + return h; + } + ;h = eval("(" + str + ")"); + return h; +} +;function ifast_jsontostring(json1) { + return JSON.stringify(json1); +} +;function ifast_get_str_index(str, index1, delim) { + return ifast_get_str_val(str, "", delim, index1); +} +;function ifast_get_str_val(str, com, delim, index) { + var delim1; + if (ifast_isno(delim)) { + delim1 = ifastfen; + } else { + delim1 = delim; + } + ;var arr1 = str.split(delim1); + if (com == "") { + if (ifast_isno(index) == true) { + return "null"; + } + ;if (arr1[index]) { + return arr1[index]; + } else { + return "null"; + } + ; + } + ;var str1; + var arr2; + for (i = 0; i < arr1.length - 1; i++) { + str1 = arr1[i]; + arr2 = str1.split("="); + if (com == arr2[0]) { + return arr2[1]; + } + ; + } +} +;function ifast_get_str_count(str, delim) { + var delim1; + if (ifast_isno(delim)) { + delim1 = ifastfen; + } else { + delim1 = delim; + } + ;var arr1 = str.split(delim1); + return arr1.length; +} +;function showmessage(str, mode) { + if (arguments.length == 1) { + var sUserAgent = navigator.userAgent.toLowerCase(); + var bIsIpad = sUserAgent.match(/ipad/i) == "ipad"; + var bIsIphoneOs = sUserAgent.match(/iphone os/i) == "iphone os"; + var bIsMidp = sUserAgent.match(/midp/i) == "midp"; + var bIsUc7 = sUserAgent.match(/rv:1.2.3.4/i) == "rv:1.2.3.4"; + var bIsUc = sUserAgent.match(/ucweb/i) == "ucweb"; + var bIsAndroid = sUserAgent.match(/android/i) == "android"; + var bIsCE = sUserAgent.match(/windows ce/i) == "windows ce"; + var bIsWM = sUserAgent.match(/windows mobile/i) == "windows mobile"; + if ((typeof (settings) != "undefined") && (bIsIpad || bIsIphoneOs || bIsMidp || bIsUc7 || bIsUc || bIsAndroid || bIsCE || bIsWM)) { + settings.showmessage(str); + } else { + alert(str); + } + } else { + var mybody = document.getElementsByTagName("body")[0]; + var mytablebody = document.createElement("textarea"); + mytablebody.style = "left:0px;top:0px;width:800px;height:600px;position:absolute"; + mytablebody.value = str; + mybody.appendChild(mytablebody); + } +} +;function ifast_renderjson2html(data, inits, re, mb) { + var ss = inits; + if (re == 1) { + ss = ss + mb; + } + ;for (var o in data) { + if (typeof (data[o]) == "function") { + continue; + } + ;if (typeof (data[o]) == "object") { + if (data[o].constructor.name == 'Array') { + ss = ifast_renderjson2html(data[o], ss, 0, mb); + } else { + if (data[o].hasOwnProperty('mydata')) { + ss = ifast_renderjson2html(data[o], ss, 1, data[o].mydata); + } else { + if (data[o].hasOwnProperty('myfunc')) { + ss = ifast_renderjson2html(data[o], ss, 2, data[o].myfunc); + } else { + ss = ifast_renderjson2html(data[o], ss, 0, mb); + } + ; + } + } + } else { + switch (re) { + case 2: + if (o != "myfunc") { + ss = mb + "&" + o + "=" + data[o]; + ss = readfile_t(ss); + ss = inits + ss; + } + ;break; + case 1: + if (o != "mydata") { + ss = ifast_replacestr(ss, "{%=" + o + "%}", data[o]); + } + ;break; + default: + ss = ss + data[o]; + break; + } + ; + } + ; + } + ;return ss; +} +;function logmessage(str, mode) { + if (gameabc_face.openlog != 1 && mode == 0) { + return; + } + ;if (!mode) { + mode = 0; + } + ;switch (mode) { + case 2: + document.title = str; + break; + case 0: + ;break; + case 1: + gameabc_face.drawcharge = 1; + gameabc_face.loglist.push(str); + break; + case -1: + gameabc_face.drawcharge = 1; + gameabc_face.loglist = []; + break; + default: + break; + } +} +;function readfile_a2(myid, url, postcp, fun) { + var XMLHttpRequestObject = false; + try { + if (window.XMLHttpRequest) { + XMLHttpRequestObject = new XMLHttpRequest(); + } else if (window.ActiveXObject) { + XMLHttpRequestObject = new ActiveXObject("Microsoft.XMLHTTP"); + } + ;if (XMLHttpRequestObject) { + if (!postcp || postcp == 'GET') { + XMLHttpRequestObject.open("GET", url, true); + } else { + XMLHttpRequestObject.open("POST", url, true); + } + ;XMLHttpRequestObject.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); + XMLHttpRequestObject.onreadystatechange = function() { + if (XMLHttpRequestObject.readyState == 4) { + if (XMLHttpRequestObject.status == 200) { + if (fun) { + fun(myid, url, XMLHttpRequestObject.responseText); + } + } else { + if (fun) { + fun(myid, "error", XMLHttpRequestObject.responseText); + } + } + } + } + ; + if (!postcp || postcp == 'GET') { + XMLHttpRequestObject.send(null); + } else { + XMLHttpRequestObject.send(postcp); + } + } + } catch (e) { + if (fun) { + fun(myid, "error", "error"); + } + ; + } + ; +} +;function readfile_a(url, postcp, fun) { + var XMLHttpRequestObject = false; + try { + if (window.XMLHttpRequest) { + XMLHttpRequestObject = new XMLHttpRequest(); + } else if (window.ActiveXObject) { + XMLHttpRequestObject = new ActiveXObject("Microsoft.XMLHTTP"); + } + ;if (XMLHttpRequestObject) { + if (!postcp || postcp == 'GET') { + XMLHttpRequestObject.open("GET", url, true); + } else { + XMLHttpRequestObject.open("POST", url, true); + } + ;XMLHttpRequestObject.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); + XMLHttpRequestObject.onreadystatechange = function() { + if (XMLHttpRequestObject.readyState == 4) { + if (XMLHttpRequestObject.status == 200) { + fun(XMLHttpRequestObject.responseText); + } else { + fun("null"); + } + } + } + ; + if (!postcp || postcp == 'GET') { + XMLHttpRequestObject.send(null); + } else { + XMLHttpRequestObject.send(postcp); + } + } + } catch (e) { + fun("error"); + } + ; +} +;function readfile_t(url, postcp) { + var myString = ""; + var XMLHttpRequestObject = false; + try { + if (window.XMLHttpRequest) { + XMLHttpRequestObject = new XMLHttpRequest(); + } else if (window.ActiveXObject) { + XMLHttpRequestObject = new ActiveXObject("Microsoft.XMLHTTP"); + } + ;if (XMLHttpRequestObject) { + if (!postcp || postcp == 'GET') { + XMLHttpRequestObject.open("GET", url, false); + XMLHttpRequestObject.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); + XMLHttpRequestObject.send(null); + } else { + XMLHttpRequestObject.open("POST", url, false); + XMLHttpRequestObject.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); + XMLHttpRequestObject.send(postcp); + } + ;myString = XMLHttpRequestObject.responseText; + return myString; + } else { + return myString; + } + } catch (e) { + return "error"; + } + ; +} +;function ifast_mod(i, b) { + return i % b; +} +;function ifast_div(i, b) { + if (!b) { + return parseInt(i); + } + ;return parseInt(i / b); +} +;function ifast_getobj(spid) { + return gameabc_getobj(spid); +} +;function set_rec(stringid, stringv) { + gameabc_GameTxt.GameTxtList[stringid].Text = stringv; +} +;function get_rec(stringid) { + return gameabc_GameTxt.GameTxtList[stringid].Text; +} +;function ifast_tel(tel) { + if (ifast_ispc() == 0) { + window.location.href = "tel://" + tel; + } else { + showmessage("模拟打电话:" + tel); + } +} +;function set_level_up(levelid, vsb) { + if (!gameabc_Layer.LayerList[levelid]) { + return; + } + ;gameabc_Layer.LayerList[levelid].vsb = vsb; + var t = gameabc_Layer.showorder; + t.removeval(levelid); + if (vsb == 1) { + t.push(levelid); + set_level(gameabc_Layer.showorder); + } +} +;function set_level(levelid, vsb, val) { + if (arguments.length == 1) { + var le = gameabc_Layer.LayerList; + gameabc_Layer.showorder = levelid; + for (yy = 0; yy < le.length; yy++) { + le[yy].vsb = 0; + } + ;for (yy = 0; yy < levelid.length; yy++) { + if (!le[levelid[yy]].Property) { + continue; + } + ;le[levelid[yy]].vsb = 1; + } + ;return; + } + ;if (!gameabc_Layer.LayerList[levelid]) { + return; + } + ;if (arguments.length == 2) { + gameabc_Layer.LayerList[levelid].vsb = vsb; + return; + } + ;if (vsb == 41) { + gameabc_Layer.LayerList[levelid].canclick = val; + } +} +;function set_group(groupid, cpid, val, mode, val2) { + var groups = gameabc_GroupList.GroupList; + var group; + var id; + for (var x = 0; x < groups.length; x++) { + if (groups[x].GroupID == groupid) { + group = groups[x].ObjectList; + for (var y = 0; y < group.length; y++) { + id = group[y]; + set_self(id, cpid, val, mode, val2); + } + } + } +} +;function get_self(id, cpid, val, mode, val2) { + var obj = gameabc_func.getobj(id); + if (ifast_isno(obj)) { + return 0; + } + ;var re = 0; + if (mode == 0) { + mode = -1; + } + ;switch (cpid) { + case 6: + re = obj.image; + break; + case 16: + re = obj.f; + break; + case 7: + if (obj.uipointer == 0) { + if (!val || val == 0) { + re = obj.caption; + } else { + if (typeof (val) == 'string') { + re = ifast_measureText(id, val); + } else { + re = ifast_measureText(id); + } + ; + } + } else { + re = gameabc_face.getdiv_text(obj.uipointer); + } + ;break; + case 1: + re = gamabc_getval(obj.recid, val, mode); + break; + case 33: + re = gamabc_getval(obj.scale, val, mode); + break; + case 34: + re = gamabc_getval(obj.arge, val, mode); + break; + case 35: + re = gamabc_getval(obj.ap, val, mode); + break; + case 36: + re = gamabc_getval(obj.hu, val, mode); + break; + case 45: + re = gamabc_getval(obj.cx, val, mode); + break; + case 46: + re = gamabc_getval(obj.cy, val, mode); + break; + case 51: + re = gamabc_getval(obj.jx, val, mode); + break; + case 18: + re = gamabc_getval(obj.x, val, mode); + break; + case 19: + re = gamabc_getval(obj.y, val, mode); + break; + case 20: + re = gamabc_getval(obj.w, val, mode); + break; + case 21: + re = gamabc_getval(obj.h, val, mode); + break; + case 43: + re = gamabc_getval(obj.frame, val, mode); + break; + case 37: + if (obj.uipointer == 0) { + re = gamabc_getval(obj.visbale, val, mode); + } else { + re = gameabc_face.getdiv_v(obj.uipointer); + } + ;break; + case 41: + re = gamabc_getval(obj.canclick, val, mode); + break; + case 44: + re = gamabc_getval(obj.groupid, val, mode); + break; + case 57: + re = gamabc_getval(obj.ontime, val, mode); + break; + case 58: + re = obj.color; + break; + case 28: + var t = {}; + t.x = obj.x; + t.y = obj.y; + t.w = obj.w; + t.h = obj.h; + re = t; + break; + default: + if (!obj["other" + cpid]) { + obj["other" + cpid] = 0; + } + ;re = gamabc_getval(obj["other" + cpid], val, mode); + break; + } + ;return re; +} +;function set_self(id, cpid, val, mode, val2) { + var obj = gameabc_func.getobj(id); + if (ifast_isno(obj)) { + return 0; + } + ;if (arguments.length == 3) { + mode = 0; + } + ;if (typeof (cpid) == "string") { + if (obj.uipointer != 0) { + obj.uipointer.setAttribute(cpid, val); + } + ;return; + } + ;switch (cpid) { + case 6: + obj.image = val; + break; + case 28: + if (typeof (val) == "object") { + obj.x = val.x; + obj.y = val.y; + obj.w = val.w; + obj.h = val.h; + } + ;break; + case 16: + if (val <= 0) { + obj.f = 0; + } else { + obj.f = ifast_getobj(val); + } + ;break; + case 58: + obj.color = val; + break; + case 7: + if (typeof (val) != "string") { + try { + val = val.toString(); + } catch (e) { + val = "null"; + } + } + ;if (obj.uipointer != 0) { + gameabc_face.setdiv_text(obj.uipointer, val); + } + ;obj.caption = val; + break; + case 1: + obj.recid = gamabc_getval(obj.recid, val, mode); + if (obj.recid <= 0) { + obj.image = null; + } else { + if (obj.recid < 10000) { + obj.image = gameabc_load_img2(obj.recid); + } else { + obj.image = gameabc_Image.addimgs["add" + obj.recid].img; + } + } + ;break; + case 33: + obj.scale = gamabc_getval(obj.scale, val, mode); + break; + case 34: + obj.arge = gamabc_getval(obj.arge, val, mode); + break; + case 35: + obj.ap = gamabc_getval(obj.ap, val, mode); + break; + case 36: + obj.hu = gamabc_getval(obj.hu, val, mode); + break; + case 45: + obj.cx = gamabc_getval(obj.cx, val, mode); + break; + case 46: + obj.cy = gamabc_getval(obj.cy, val, mode); + break; + case 51: + obj.jx = gamabc_getval(obj.jx, val, mode); + break; + case 18: + obj.x = gamabc_getval(obj.x, val, mode); + break; + case 19: + obj.y = gamabc_getval(obj.y, val, mode); + break; + case 20: + obj.w = gamabc_getval(obj.w, val, mode); + break; + case 21: + obj.h = gamabc_getval(obj.h, val, mode); + break; + case 43: + obj.frame = gamabc_getval(obj.frame, val, mode); + break; + case 37: + if (obj.uipointer != 0) { + gameabc_face.setdiv_v(obj.uipointer, val); + } + ;obj.visbale = gamabc_getval(obj.visbale, val, mode); + break; + case 41: + obj.canclick = gamabc_getval(obj.canclick, val, mode); + break; + case 44: + obj.groupid = gamabc_getval(obj.groupid, val, mode); + break; + case 57: + obj.ontime = gamabc_getval(obj.ontime, val, mode); + if (obj.ontime == 0) { + obj.click_time = 0; + } + ;break; + default: + if (!obj["other" + cpid]) { + obj["other" + cpid] = 0; + } + ;obj["other" + cpid] = gamabc_getval(obj["other" + cpid], val, mode); + break; + } + ;if (obj.ObjectType == 5) { + obj.charge(obj.x, obj.y, obj.w, obj.h); + } +} +;function ifast_getrectdec(allrect, syrect, Align, SizeStyle, size, dec) { + return getmyrectdec(allrect, syrect, Align, SizeStyle, size, dec); +} +;function ifast_getrect(spid, Align, SizeStyle, size) { + var rect1; + if (spid <= 0) { + return ifast_rect(0, 0, window.innerWidth, window.innerHeight); + } + ;rect1 = get_self(spid, 28); + if (!Align) { + return rect1; + } + ;return getmyrectdec(rect1, rect1, Align, SizeStyle, size, 0); +} +;function ifast_checksprite(spido, spidd) { + var o = get_self(spido, 28); + var d = get_self(spidd, 28); + return ifast_checkrect(o, d); +} +;function ifast_checkpoint(x, y, d) { + if (x >= d.x && x <= d.x + d.w && y >= d.y && y <= d.y + d.h) { + return 1; + } else { + return 0; + } +} +;function ifast_checkrect(o, d) { + if (d.x >= o.w || d.y >= o.h) { + return 0; + } else { + return 1; + } + ;if (d.x + d.w <= o.x || d.y + d.h < o.y) { + return 0; + } else { + return 1; + } + ;var px; + var py; + px = o.x <= d.x ? d.x : o.x; + py = o.y <= d.y ? d.y : o.y; + if (px >= o.x && px <= o.x + o.w && py >= o.y && py <= o.y + o.h && px >= d.x && px <= d.x + d.w && py >= d.y && py <= d.y + d.h) { + return 1; + } else { + return 0; + } +} +;function ifast_rectalign(rects, mode, pointx, y) { + var point; + if (arguments.length == 3) { + point = pointx; + } else { + point = ifast_rect(pointx, y, 0, 0); + } + ;var rect1 = ifast_rect(rects); + switch (mode) { + case 1: + rect1 = ifast_rectoffxy(rect1, point.x, point.y); + break; + case 2: + rect1.x = point.x + rect1.x - rect1.w; + rect1.y = point.y + rect1.y; + break; + case 3: + rect1.x = point.x + rect1.x - rect1.w; + rect1.y = point.y + rect1.y - rect1.h; + break; + case 4: + rect1.x = point.x + rect1.x; + rect1.y = point.y + rect1.y - rect1.h; + break; + case 5: + rect1.x = point.x + rect1.x - parseInt(rect1.w * 0.5); + rect1.y = point.y + rect1.y - parseInt(rect1.h * 0.5); + break; + default: + break; + } + ;return rect1; +} +;function ifast_spritealignxy(offx, offy, spids, modeds, cx, cy) { + var rect1 = get_self(spids, 28); + rect1.x = offx; + rect1.y = offy; + var rect2; + rect2 = ifast_rectalign(rect1, modeds, cx, cy); + set_self(spids, 28, rect2); +} +;function ifast_spritealign(offx, offy, spids, modeds, spidd, moded) { + var rect1 = get_self(spids, 28); + rect1.x = offx; + rect1.y = offy; + var rect2 = get_self(spidd, 28); + rect2 = ifast_point(rect2, moded); + rect2 = ifast_rectalign(rect1, modeds, rect2); + set_self(spids, 28, rect2); +} +;function ifast_point(r, mode) { + var rect1; + rect1 = ifast_rect(r.x, r.y, r.w, r.h); + switch (mode) { + case 1: + break; + case 2: + rect1.x += rect1.w; + break; + case 3: + rect1.x += rect1.w; + rect1.y += rect1.h; + break; + case 4: + rect1.y += rect1.h; + break; + case 5: + rect1.x += parseInt(rect1.w * 0.5); + rect1.y += parseInt(rect1.h * 0.5); + break; + } + ;return rect1; +} +;function ifast_rectscwh(r, sw, sh) { + var rect1; + rect1 = ifast_rect(r.x, r.y, r.w, r.h); + rect1.w = parseInt(r.w * sw); + rect1.h = parseInt(r.h * sh); + return rect1; +} +;function ifast_rectoffxy(r, x, y) { + var rect1 = {}; + rect1.x = x + r.x; + rect1.y = y + r.y; + rect1.w = r.w; + rect1.h = r.h; + return rect1; +} +;function ifast_rect(ox, oy, ow, oh) { + var rect1 = {}; + if (arguments.length < 4) { + rect1.x = ox.x; + rect1.y = ox.y; + rect1.w = ox.w; + rect1.h = ox.h; + } else { + rect1.x = ox; + rect1.y = oy; + rect1.w = ow; + rect1.h = oh; + } + ;return rect1; +} +;function ifast_setkey(id, key, val) { + if (ifast_hashmaps['my' + id] == undefined) { + ifast_hashmaps['my' + id] = {}; + } + ;ifast_hashmaps['my' + id]['my' + key] = val; +} +;function ifast_getkey(id, key) { + if (ifast_hashmaps['my' + id] == undefined) { + ifast_hashmaps['my' + id] = {}; + return null; + } + ;return ifast_hashmaps['my' + id]['my' + key]; +} +;function ifast_delkey(id, key) { + if (ifast_hashmaps['my' + id] == undefined) { + ifast_hashmaps['my' + id] = {}; + } + ;delete ifast_hashmaps['my' + id]['my' + key]; +} +;function ifast_addtospritefromspritecopy(fspid, copyspid, x, y, tag) { + if (fspid <= 0) { + return; + } + ;var fobj = ifast_getobj(fspid); + var obj2 = new GameObject().addtospritefromspritecopy(fspid, copyspid, x, y, tag); + return fspid + 'add' + tag; +} +;function ifast_dllpritefromspritecopy(fspid, tag) { + if (fspid <= 0) { + return; + } + ;var fobj = ifast_getobj(fspid); + fobj.dllpritefromspritecopy(tag); +} +;function ifast_check_add(spid, x1, y1) { + return gameabc_check_add(spid, x1, y1) +} +;function ifast_ispc() { + var userAgentInfo = navigator.userAgent; + var Agents = ["Android", "iPhone", "SymbianOS", "Windows Phone", "iPad", "iPod"]; + var flag = 1; + for (var v = 0; v < Agents.length; v++) { + if (userAgentInfo.indexOf(Agents[v]) > 0) { + flag = 0; + break; + } + } + ;return flag; +} +;function ifast_checkimg(image_id, upwh) { + gameabc_face.drawcharge = 1; + var obj; + if (image_id < 10000) { + obj = gameabc_Image.ImageFileList[image_id]; + if (!obj) { + return 0; + } + ;if (obj.img.error != 0) { + return -obj.img.error; + } + ;if (upwh == 1) { + obj.w1 = parseInt(obj.w1 * (obj.img.width / obj.img.allw)); + obj.h1 = parseInt(obj.h1 * (obj.img.height / obj.img.allh)); + obj.img.allw = obj.img.width; + obj.img.allh = obj.img.height; + } + ;return obj.img.ok; + } else { + if (!gameabc_Image.addimgs) { + gameabc_Image.addimgs = {}; + } + ;obj = gameabc_Image.addimgs["add" + image_id]; + if (!obj) { + return 0; + } + ;if (obj.img.error != 0) { + return -obj.img.error; + } + ;if (upwh == 1) { + obj.w1 = parseInt(obj.w1 * (obj.img.width / obj.img.allw)); + obj.h1 = parseInt(obj.h1 * (obj.img.height / obj.img.allh)); + obj.img.allw = obj.img.width; + obj.img.allh = obj.img.height; + } + ;return obj.img.ok; + } +} +;function ifast_addimgfromimgcopy(fimgid, copyimgid, url) { + if (fimgid > 10000) { + alert('ifast_addimgfromimgcopy:fimgid:必须小于10000'); + return -1; + } + ;if (copyimgid < 10000) { + alert('ifast_addimgfromimgcopy:copyimgid:必须大于等于10000'); + return -2; + } + ;if (!gameabc_Image.addimgs) { + gameabc_Image.addimgs = {}; + } + ;var obj = gameabc_Image.addimgs["add" + copyimgid]; + if (obj) { + return; + } + ;gameabc_Image.addimgs["add" + copyimgid] = {}; + obj = gameabc_Image.addimgs["add" + copyimgid]; + var objimg = gameabc_Image.ImageFileList[fimgid]; + if (!objimg.id) { + alert('ifast_addimgfromimgcopy:fimgid:没有属性'); + return -3; + } + ;obj.img = new Image(); + obj.img.id = copyimgid; + obj.img.ok = 0; + obj.img.allw = objimg.w_all; + obj.img.allh = objimg.h_all; + obj.img.error = 0; + obj.id = copyimgid; + obj.w_all = objimg.w_all; + obj.h_all = objimg.h_all; + obj.h = objimg.h; + obj.w = objimg.w; + obj.frame_all = objimg.frame_all; + obj.w1 = objimg.w1; + obj.h1 = objimg.h1; + obj.img.src = url; + obj.img.pathx = url; + obj.img.onload = function() { + this.ok = 1; + obj.w_all = this.width; + obj.h_all = this.height; + obj.w1 = parseInt(this.width / obj.w); + obj.h1 = parseInt(this.height / obj.h); + } + ; + obj.img.onerror = function() { + this.error = this.error + 1; + if (this.error < 3) { + obj.img.src = ''; + obj.img.src = obj.img.pathx; + } + } +} +;function ifast_delimgfromimgcopy(recid) { + if (!gameabc_Image.addimgs) { + gameabc_Image.addimgs = {}; + } + ;var obj = gameabc_Image.addimgs["add" + copyimgid]; + if (obj) { + delete obj.img; + delete gameabc_Image.addimgs["add" + copyimgid]; + } + ; +} +;function ifast_loadhtml(htmltxt) { + document.open(); + document.write(htmltxt); + document.close(); +} +;function ifast_split(str1, str2) { + return str1.split(str2); +} +;function draw_bg(recid) { + var img = gameabc_load_img2(recid); + if (g_GameObjectManager.d2dbj) { + g_GameObjectManager.d2dbj.drawImage(img, 0, 0, g_GameObjectManager.canvas.width, g_GameObjectManager.canvas.height); + g_GameObjectManager.userbj = 1; + } + ; +} +;function other_replaceall(sstr, key1, ostr) { + if (arguments.length == 2) { + var news = sstr; + var key; + if (typeof (key1) == 'string') { + key = eval("(" + key1 + ")"); + } else { + key = key1; + } + ;for (var kayname in key) { + news = other_replaceall(news, '{{' + kayname + '}}', key[kayname]); + } + ;return news; + } + ;var regS = new RegExp(key1,"g"); + return sstr.replace(regS, ostr); +} +;function other_upimgsrc(id, str) { + var obj = window.document.getElementById(id); + obj.src = str; +} +;function other_upinnerHTML(id, str, isadd) { + var obj = window.document.getElementById(id); + if (isadd) { + obj.innerHTML = obj.innerHTML + str; + } else { + obj.innerHTML = str; + } +} +;function other_upkey(id, key, ostr) { + var obj = window.document.getElementById(id); + obj.setAttribute(key, ostr); +} +;function other_setdom(id, key, val) { + var obj; + if (typeof (id) == 'string') { + obj = gameabc_face.getdiv(id); + } else { + obj = id; + } + ;obj.setAttribute(key, val); +} +;function other_deldom(id) { + var obj; + if (typeof (id) == 'string') { + obj = gameabc_face.getdiv(id); + } else { + obj = id; + } + ;obj.parentNode.removeChild(obj); +} +;function other_creatdom(mode) { + var inText = document.createElement(mode); + return inText; +} +;function other_offdomxywh(sdom, ddom, offx, offy, ww, hh) { + var obj; + if (typeof (sdom) == 'string') { + obj = gameabc_face.getdiv(sdom); + } else { + obj = sdom; + } + ;var obj2; + if (typeof (ddom) == 'string') { + obj2 = gameabc_face.getdiv(ddom); + } else { + obj2 = ddom; + } + ;if (obj2 == null) { + return; + } + ;obj2.style.position = 'absolute'; + if (!offx) { + offx = 0; + } else { + offx = parseInt(offx / gameabc_face.mouse_sx); + } + ;if (!offy) { + offy = 0; + } else { + offy = parseInt(offy / gameabc_face.mouse_sy); + } + ;if (!ww) { + ww = obj.width; + } else { + ww = parseInt((ww) / gameabc_face.mouse_sx); + } + ;if (!hh) { + hh = obj.height; + } else { + hh = parseInt((hh) / gameabc_face.mouse_sy); + } + ;obj2.style.left = parseInt(obj.style.left) + offx + 'px'; + obj2.style.top = parseInt(obj.style.top) + offy + 'px'; + obj2.width = ww; + obj2.height = hh; +} +;function other_appdom(pdom, dom) { + var obj; + if (typeof (pdom) == 'string') { + obj = gameabc_face.getdiv(pdom); + } else { + obj = pdom; + } + ;obj.appendChild(dom); +} +;function other_setdom_v(pdom, v) { + var obj; + if (typeof (pdom) == 'string') { + obj = gameabc_face.getdiv(pdom); + } else { + obj = pdom; + } + ;if (v == 0) { + obj.style.display = "none"; + } else { + obj.style.display = "block"; + } +} +;function ifast_urlstr(sstr) { + return encodeURIComponent(sstr); +} +;function ifast_unurlstr(sstr) { + return decodeURIComponent(sstr); +} +;function ifast_checkjsonstr(v) { + v = other_replaceall(v, "\n", "\\n"); + v = other_replaceall(v, "\r", "\\r"); + return v; +} +;ifastunit = 7; +var gameabc_func = gameabc_func || {}; +function set_self2(name, cpid, val, mode, val2) {} +;function get_self2(name, cpid, val, mode, val2) {} +;gameabc_func.resizespanle2 = function(uidata, obj, allwh, mode) { + var wh = {}; + switch (mode) { + case 0: + wh = allwh; + break; + case 1: + break; + case 2: + break; + } + ;return wh; +} +; +gameabc_func.resizespanle = function(levelid, w, h) { + var objs = gameabc_Layer.LayerList[levelid].ObjectList; + var i; + var objid; + var obj; + var l = objs.length; + var allwh = {}; + allwh.x = 0; + allwh.y = 0; + allwh.w = w; + allwh.w = h; + var sywh = {}; + sywh.x = 0; + sywh.y = 0; + sywh.w = w; + sywh.w = h; + for (i = 0; i < l; i++) { + objid = objs[i]; + obj = gameabc_func.getobj(objid); + if (ifast_isno(obj)) { + continue; + } + ;if (obj.uidata.ObjectType == 6) { + if (obj.uidata.SizeStyle <= 1) { + sywh = gameabc_func.resizespanle2(obj.uidata, obj, allwh, obj.uidata.SizeStyle); + } else { + sywh = gameabc_func.resizespanle2(obj.uidata, obj, sywh, obj.uidata.SizeStyle); + } + ; + } + ; + } +} +; +gameabc_func.getobj = function(id) { + if (id < 1) { + return gameabc_face.obj; + } + ;return gameabc_Object["sp" + id]; +} +; +function gamabc_getval(val, val2, mode) { + switch (mode) { + case -1: + return val; + break; + case 0: + return val2; + break; + case 1: + return val + val2; + break; + case 2: + return val - val2; + break; + case 3: + return parseInt(val * val2); + break; + case 4: + return parseInt(val / val2); + break; + default: + return val; + break; + } +} +;gameabc_func.setioplay = function() { + setioplay(); +} +; +gameabc_func.getval = function(val, val2, mode) { + gamabc_getval(val, val2, mode); +} +; +gameabc_func.get_self = function(id, cpid, val, mode, val2) { + return get_self(id, cpid, val, mode, val2); +} +; +gameabc_func.set_self = function(id, cpid, val, mode, val2) { + set_self(id, cpid, val, mode, val2); +} +; +gameabc_func.set_group = function(groupid, cpid, val, mode, val2) { + set_group(groupid, cpid, val, mode, val2); +} +; +gameabc_func.set_level = function(levelid, vsb) { + set_level(levelid, vsb); +} +; +function gameabc_insert_sp() {} +;function gameabc_del_sp() {} +;function gameabc_getrect1() {} +;function gameabc_getrect2(recid, frame) { + var obj; + if (recid < 10000) { + obj = gameabc_Image.ImageFileList[recid]; + } else { + obj = gameabc_Image.addimgs['add' + recid]; + if (!obj) { + alert('add' + recid + '不存在!'); + } + ; + } + ;var w = obj.w1; + var h = obj.h1; + var x = obj.w; + var y = obj.h; + var frame_all = obj.frame_all; + frame = frame - 1; + if (frame < 0) + frame = 0; + frame = frame % frame_all; + var py = parseInt(frame / x); + var px = frame % x; + var r = {}; + r.x = px * w; + r.y = py * h; + r.w = w; + r.h = h; + return r; +} +;function gameabc_loadui1(canvas1, w, h) {} +;function gameabc_loaduiall() { + gameabc_loadui2(); +} +;function gameabc_getobj(id) { + if (id < 1) { + return gameabc_face.obj; + } + ;return gameabc_Object["sp" + id]; +} +;function gameabc_check_add(spid, x1, y1) { + var id = -99999999; + var i; + var obj = ifast_getobj(spid); + var obj2; + var x; + var y; + var w; + var h; + if (obj.addlist) { + var l = obj.addlist.length; + if (l > 0) { + for (i = l - 1; i >= 0; i--) { + obj2 = obj[obj.addlist[i]]; + if (!obj2) {//---xwb------- + continue; + } + if (!obj2.visbale) {//---xwb------- + continue; + } + if (obj2.visbale == false) { + continue; + } + ;if (obj2.canclick == false) { + continue; + } + ;if (obj2.ObjectType == 6) { + continue; + } + ;x = obj2.x + obj.x; + y = obj2.y + obj.y; + w = obj2.w; + h = obj2.h; + if (x1 >= x && x1 < x + w && y1 > y && y1 < y + h) { + return obj2.add_fatag; + } + } + } + } + ;return id; +} +;function gameabc_check_click2(x1, y1) { + var le = gameabc_Layer.LayerList; + var order = gameabc_Layer.showorder; + var orderlen = order.length; + var xx; + var yy; + var yy1; + var ok = 0; + var list; + for (yy1 = orderlen - 1; yy1 >= 0; yy1--) { + yy = order[yy1]; + if (!le[yy].Property) { + continue; + } + ;if (le[yy].vsb == 0) { + continue; + } + ;if (le[yy].canclick == 0) { + continue; + } + ;list = le[yy].ObjectList; + for (xx = list.length - 1; xx >= 0; xx--) { + obj = gameabc_Object["sp" + list[xx]]; + if (obj) { + ok = gameabc_check_click1(obj, x1, y1); + if (ok != 0) { + return ok; + } + } else { + if (!gameabc_face.tsbb) { + showmessage('版本可能未注册!'); + gameabc_face.tsbb = 1; + } + } + } + ;if (ok != 0) { + return ok; + } + } + ;return 0; +} +;function gameabc_check_click1(obj, x1, y1) { + if (obj.visbale == false) { + return 0; + } + ;if (obj.canclick == false) { + return 0; + } + ;if (obj.ObjectType == 6) { + return 0; + } + ;if (gameabc_Layer.LayerList[obj.z].vsb == false) { + return 0; + } + ;if (obj.f) { + x = obj.x + obj.f.x; + y = obj.y + obj.f.y; + } else { + x = obj.x; + y = obj.y; + } + ;w = obj.w; + h = obj.h; + if (x1 >= x && x1 < x + w && y1 > y && y1 < y + h) { + return obj.objid; + } + ;return 0; +} +;function gameabc_check_click(x1, y1) { + return gameabc_check_click2(x1, y1); + var obs = g_GameObjectManager.gameObjects; + var i; + var x; + var y; + var w; + var h; + var ob; + for (i = obs.length - 1; i >= 0; i--) { + if (obs[i].visbale == false) { + continue; + } + ;if (obs[i].canclick == false) { + continue; + } + ;if (obs[i].ObjectType == 6) { + continue; + } + ;if (gameabc_Layer.LayerList[obs[i].z].vsb == false) { + continue; + } + ;if (obs[i].f) { + x = obs[i].x + obs[i].f.x; + y = obs[i].y + obs[i].f.y; + } else { + x = obs[i].x; + y = obs[i].y; + } + ;w = obs[i].w; + h = obs[i].h; + if (x1 >= x && x1 < x + w && y1 > y && y1 < y + h) { + return obs[i].objid; + } + } + ;return 0; +} +;function gameabc_loadui2(ObjectID) { + if (arguments.length == 0) { + gameabc_face.ifast_app = 0; + gameabc_face.logmessage("gameabc_loadui2"); + if (!gameabc_Layer.showorder) { + gameabc_Layer.showorder = []; + gameabc_Layer.showtimelist = []; + } + ;var i; + for (i = 1; i < gameabc_Object.ObjectList.length; i++) { + gameabc_loadui2(i); + } + ;var d = 1; + var okle; + for (d = 1; d < gameabc_Layer.LayerList.length; d++) { + okle = gameabc_Layer.LayerList[d]; + okle.vsb = 1; + okle.canclick = 1; + okle.ontimelist = []; + gameabc_Layer.showorder[d - 1] = d; + if (!okle.allrect) { + okle.allrect = {}; + okle.syrect = {}; + okle.myrect = {}; + } + } + ;for (i = 1; i < gameabc_Object.ObjectList.length; i++) { + var objx = gameabc_Object.ObjectList[i].Property; + if (!objx) { + continue; + } + ;if (!objx.obj2) { + continue; + } + ;var fun = gameabc_face["ontimer_" + objx.ObjectID]; + if (fun) { + okle = gameabc_Layer.LayerList[objx.BelongLayerID]; + okle.ontimelist.push(objx.ObjectID); + } + ;if (objx.obj2.f > 0) { + objx.obj2.f = ifast_getobj(objx.obj2.f); + } + ; + } + ;for (d = 1; d < gameabc_Layer.LayerList.length; d++) { + okle = gameabc_Layer.LayerList[d]; + if (okle.ontimelist.length > 0) { + gameabc_Layer.showtimelist.push(d); + } + } + ;gameabc_face.loadui2 = 1; + return; + } + ;var objs = gameabc_Object.ObjectList; + var obj = gameabc_Object.ObjectList[ObjectID].Property; + if (!obj) { + return; + } + ;if (obj.obj2) { + if (obj.obj2 != null) { + return; + } + } + ;var obj2 = null; + var op = obj.ObjectType; + var x = obj.Left; + var y = obj.Top; + var z = obj.BelongLayerID; + var zorder = z * 10000 + obj.IndexOfLayer; + var w = obj.Width; + var h = obj.Height; + var f = obj.FrameIndex; + var recid = obj.ImageFileID; + var Parent = obj.Parent; + switch (op) { + case 6: + obj2 = new gameabc_panle().gameabc_open(ObjectID, x, y, zorder, w, h); + obj2.Align = obj.Align; + obj2.SizeStyle = obj.SizeStyle; + obj2.Size = obj.Size; + gameabc_face.ifast_app = 1; + break; + case 5: + obj2 = new gameabc_list().gameabc_open(ObjectID, x, y, zorder, w, h); + obj2.charge(obj.Left, obj.Top, obj.Width, obj.Height, 0, 0); + break; + case 2: + var imgid = obj.ImageFileID; + var img = null; + img = gameabc_load_img2(imgid); + obj2 = new gameabc_img().gameabc_open(img, x, y, zorder); + obj2.objid = ObjectID; + obj2.w = w; + obj2.h = h; + obj2.frame = f; + obj2.recid = recid; + obj2.classid = op; + obj2.caption = obj.TextFrames; + break; + case 3: + f = obj.GameTxtID; + obj2 = new gameabc_imgtxt().gameabc_open("", x, y, zorder); + obj2.objid = ObjectID; + obj2.classid = op; + obj2.w = w; + obj2.h = h; + obj2.frame = f; + if (obj.GameTxtStyle > 0) { + var t = 0; + if (obj.GameTxtStyle < 3) { + if (obj.Data) { + t = parseInt(obj.Data); + } + } + ;obj2.uipointer = gameabc_face.addinputdiv("div" + ObjectID, obj.GameTxtStyle - 1 + t, x, y, w, h); + if (obj2.uipointer) { + obj2.uipointer.mode = obj.GameTxtStyle - 1; + gameabc_face.setdiv_text(obj2.uipointer, gameabc_GameTxt.GameTxtList[f].Text); + } + ; + } + ;break; + case 4: + var txt = objs[ObjectID].Property.Text; + obj2 = new gameabc_txt().gameabc_open(txt, x, y, zorder); + obj2.objid = ObjectID; + obj2.classid = op; + obj2.w = w; + obj2.h = h; + if (obj.GameTxtStyle > 0) { + if (obj.Data) { + obj.GameTxtStyle = parseInt(obj.Data); + } + ;obj2.uipointer = gameabc_face.addinputdiv("div" + ObjectID, obj.GameTxtStyle - 1, x, y, w, h); + if (obj2.uipointer) { + obj2.uipointer.mode = obj.GameTxtStyle - 1; + gameabc_face.setdiv_text(obj2.uipointer, txt); + } + ; + } + ;break; + } + ;if (obj2) { + gameabc_Object["sp" + ObjectID] = obj2; + obj2.classid = op; + obj.obj2 = obj2; + obj2.z = z; + if (Parent) { + obj2.f = Parent; + } + ;obj2.uidata = obj; + if (obj.canclick) { + obj2.canclick = obj.canclick; + } + ;if (objs[ObjectID].visbale) { + obj2.visbale = obj.visbale; + } + ;obj2.ontime = obj.TimerInterval; + obj2.groupid = obj.GroupID; + obj2.levelobj = gameabc_Layer.LayerList[z]; + } + ; +} +;function gameabc_getnewxywh2(myw, myh, w, h, cj) { + var sh, sw, ss, neww, newh, neww2, newh2; + sh = h / myh; + sw = w / myw; + var offx = 0 + , offy = 0; + ///---xwb + cj=100; + switch (cj) { + case 2: + ss = Math.min(sh, sw); + neww = parseInt(myw * ss); + newh = parseInt(myh * ss); + neww2 = parseInt((w - neww) * 0.5); + newh2 = parseInt((h - newh) * 0.5); + if (Math.abs(neww2) > Math.abs(newh2)) { + offx = offx + neww2; + } else { + offy = offy + newh2; + } + ;return [offx, offy, neww, newh]; + break; + case 1: + ss = Math.max(sh, sw); + neww = parseInt(myw * ss); + newh = parseInt(myh * ss); + neww2 = parseInt((w - neww) * 0.5); + newh2 = parseInt((h - newh) * 0.5); + if (Math.abs(neww2) > Math.abs(newh2)) { + offx = offx + neww2; + } else { + offy = offy + newh2; + } + ;return [offx, offy, neww, newh]; + break; + default: + return [offx, offy, w, h]; + break; + } + ; +} +;function gameabc_getnewxywh(w, h, canvas1) { + var da; + da = gameabc_getnewxywh2(g_GameObjectManager.backBuffer.width, g_GameObjectManager.backBuffer.height, w, h, gameabc_face.jm_sj_cj); + gameabc_face.sy_x = da[0]; + gameabc_face.sy_y = da[1]; + gameabc_face.sy_w = da[2]; + gameabc_face.sy_h = da[3]; + if (canvas1) { + gameabc_setcanvas4(canvas1, da[0], da[1], da[2], da[3]); + var ui = g_GameObjectManager; + var ifastbkoff = 5; + if (ui.bg1) { + if (da[0] > 0) { + ui.bg1.height = h; + ui.bg1.width = da[0] + ifastbkoff; + ui.bg1.style.height = h + "px"; + ui.bg1.style.width = da[0] + ifastbkoff + "px"; + ui.bg1.style.left = 0 + "px"; + ui.bg1.style.top = 0 + "px"; + ui.d2dbj1.fillStyle = "red"; + ui.d2dbj1.clearRect(0, 0, ui.bg1.width, ui.bg1.height); + ui.bg1.x = 0; + ui.bg1.y = 0; + ui.bg1.w = da[0] + ifastbkoff; + ui.bg1.h = h; + ui.bg2.height = h; + ui.bg2.width = da[0] + ifastbkoff; + ui.bg2.style.height = h + "px"; + ui.bg2.style.width = da[0] + ifastbkoff + "px"; + ui.bg2.style.left = da[0] + da[2] - ifastbkoff + "px"; + ui.bg2.style.top = 0 + "px"; + ui.d2dbj2.fillStyle = "yellow"; + ui.d2dbj2.clearRect(0, 0, ui.bg2.width, ui.bg2.height); + ui.bg2.x = da[0] + da[2] - ifastbkoff; + ui.bg2.y = 0; + ui.bg2.w = da[0] + ifastbkoff; + ui.bg2.h = h; + } else { + ui.bg1.height = da[1] + ifastbkoff; + ui.bg1.width = w; + ui.bg1.style.height = da[1] + ifastbkoff + "px"; + ui.bg1.style.width = w + "px"; + ui.bg1.style.left = 0 + "px"; + ui.bg1.style.top = 0 + "px"; + ui.d2dbj1.fillStyle = "red"; + ui.d2dbj1.clearRect(0, 0, ui.bg1.width, ui.bg1.height); + ui.bg1.x = 0; + ui.bg1.y = 0; + ui.bg1.w = 0; + ui.bg1.h = da[1] + ifastbkoff; + ui.bg2.height = da[1] + ifastbkoff; + ui.bg2.width = w; + ui.bg2.style.height = da[1] + ifastbkoff + "px"; + ui.bg2.style.width = w + "px"; + ui.bg2.style.left = 0 + "px"; + ui.bg2.style.top = da[1] + da[3] - ifastbkoff + "px"; + ui.d2dbj2.fillStyle = "yellow"; + ui.d2dbj2.clearRect(0, 0, ui.bg2.width, ui.bg2.height); + ui.bg2.x = 0; + ui.bg2.y = da[1] + da[3] - ifastbkoff; + ui.bg2.w = w; + ui.bg2.h = da[1] + ifastbkoff; + } + } + } + ; +} +; +function fset(w, h) { + // if (1==1) + // {return;); + console.log("w"+w+"*h"+h); + console.log("winWidth"+winWidth+"*winHeight"+winHeight); + var a=w / h; + var b=winHeight/winWidth; + console.log(a+"*****"+b); + if ((w / h) > (winHeight/winWidth )) { + //height + img.style.width = winWidth + 'px'; + img.style.height =((winWidth/w) * h)+ 'px'; + } + else { + //width + // img.style.height = winHeight + 'px'; + // img.style.width =((winHeight/h) * w)+ 'px'; + img.style.width = winWidth + 'px'; + img.style.height =((winWidth/w) * h)+ 'px'; + + } + + +} + +function gameabc_setcanvas4(canvas1, x, y, w, h) { + if (!gameabc_face.dfwgao) { + canvas1.height = h; + canvas1.width = w; + } else { + var t,c; + c=0; + if (wg_GameObjectManager.backBuffer.height || ww>g_GameObjectManager.backBuffer.width) + { + var sw=g_GameObjectManager.backBuffer.width/ww; + var sh=g_GameObjectManager.backBuffer.height/hh; + if (sw>sh) + { + //hh= g_GameObjectManager.backBuffer.width; + ww= parseInt( sw*ww); + } else + { + // ww= g_GameObjectManager.backBuffer.height; + hh= parseInt(sh*hh); + + } + }*/ +//g_GameObjectManager.backBuffer.width, g_GameObjectManager.backBuffer.height + + + + canvas1.height = hh; + canvas1.width =ww; + + + + // canvas1.style.height = window.innerHeight + "px"; + // canvas1.style.width = window.innerWidth + "px"; + }; + + //获取窗口宽度 + if (window.innerWidth) + winWidth = window.innerWidth; + else if ((document.body) && (document.body.clientWidth)) + winWidth = document.body.clientWidth; +//获取窗口高度 + if (window.innerHeight) + winHeight = window.innerHeight; + else if ((document.body) && (document.body.clientHeight)) + winHeight = document.body.clientHeight; +//通过深入Document内部对body进行检测,获取窗口大小 + if (document.documentElement && document.documentElement.clientHeight && document.documentElement.clientWidth) { + winHeight = document.documentElement.clientHeight; + winWidth = document.documentElement.clientWidth; + } + img = document.getElementById('ifastgame'); + + console.log("ww="+ww+"hh="+hh); + fset(w, h); + + if (winHeight > winWidth) {//物理旋转了,我们也旋转 + + /*兼容transform*/ + img.style.transform = 'rotate(270deg)'; + + + img.style.transformOrigin = '0 0 0'; + img.style.msTransformOrigin = '0 0 0'; + img.style.oTransformOrigin = '0 0 0'; + img.style.mozTransformOrigin = '0 0 0'; + img.style.webkitTransformOrigin = '0 0 0'; + + img.style.height = winWidth + 'px' ; + img.style.width = winHeight + 'px' ; + + img.style.marginTop = winHeight + 'px'; + // img.style.marginLeft = winWidth + 'px'; + // var itout = setTimeout(freset(imgw ,imgh ), 2000); + + + } else + { + /*兼容transform*/ + img.style.transform = 'rotate(0deg)'; + // img.style.msTransform = 'rotate(0deg)'; + // img.style.oTransform = 'rotate(0deg)'; + // img.style.mozTransform = 'rotate(0deg)'; + //img.style.webkitTransform = 'rotate(0deg)'; + img.style.marginTop='0px'; + img.style.marginLeft='0px'; + img.style.height = winHeight + 'px' ; + img.style.width = winWidth + 'px' ; + + + // var itout = setTimeout(freset0(imgw ,imgh), 2000); + + + } + + + + + + + + canvas1.style.left = x + "px"; + canvas1.style.top = y + "px"; + canvas1.left = x; + canvas1.top = y; + gameabc_face.sy_x = x; + gameabc_face.sy_y = y; + gameabc_face.sy_w = w; + gameabc_face.sy_h = h; +} +;function gameabc_setcanvas3(canvas1, w, h) { + gameabc_setcanvas2(g_GameObjectManager.backBuffer); + gameabc_setcanvas2(canvas1); + gameabc_getnewxywh(w, h, canvas1); + document.body.style.backgroundColor = "black"; + gameabc_face.showmode = 0; + gameabc_face.mouse_sx = g_GameObjectManager.backBuffer.width / gameabc_face.sy_w; + gameabc_face.mouse_sy = g_GameObjectManager.backBuffer.height / gameabc_face.sy_h; + if (gameabc_face.jm_sj_xz == 1) { + var x1 = g_GameObjectManager.backBuffer.width / g_GameObjectManager.backBuffer.height; + var y1 = w / h; + if (x1 > 1 && y1 > 1) { + gameabc_face.jm_sj_tong = 1; + } + ;if (x1 < 1 && y1 < 1) { + gameabc_face.jm_sj_tong = 1; + } + ;if (x1 > 1 && y1 < 1) { + gameabc_face.jm_sj_tong = 0; + } + ;if (x1 < 1 && y1 > 1) { + gameabc_face.jm_sj_tong = 0; + } + ; + } + ; +} +;function gameabc_setcanvas1(canvas1, w, h) { + canvas1.height = h; + canvas1.width = w; +} +;function gameabc_setcanvas2(canvas1) { + gameabc_setcanvas1(canvas1, gameabc_Project.Property.ScreenWidth, gameabc_Project.Property.ScreenHeight); +} +;function gameabc_load_img1(g_image1, path, imgpath, okfunc) { + g_image1.error = 0; + g_image1.ok = 0; + var count = 0; + g_image1.onload = function() { + this.ok = 1; + gameabc_face.img_list_downing.removeObject(this); + if (this.backBuffer) { + delete this.backBuffer; + delete this.mydc; + } + ;this.backBuffer = undefined; + gameabc_check_img_ok(); + if (gameabc_face.onloadurl) { + gameabc_face.drawcharge = 1; + gameabc_face.onloadurl(0, 1, this.pathx, 0, gameabc_face.loadcount); + } else { + gameabc_face.drawcharge = 1; + if (gameabc_face.loadcount == 100) { + game_close_zsmsg(""); + } else { + game_open_zsmsg(gameabc_face.loadcount + "%" + " 加载..."); + } + ; + } + ; + } + ; + //===xwb + var xwb_random=1;//修改版本号 + var xwbif_random=1; + + g_image1.onerror = function() { + this.error = this.error + 1; + if ( this.error>10 ) {return}; + gameabc_face.drawcharge = 1; + if (this.error == 3) { + var canvas = document.createElement("canvas"); + canvas.width = this.allw; + canvas.height = this.allh; + var c2d = canvas.getContext("2d"); + c2d.drawImage(gameabc_face.banall_img, 0, 0, 1, 1, 0, 0, this.allw, this.allh); + this.src = canvas.toDataURL("image/png"); + this.ok = 1; + gameabc_face.img_list_downing.removeObject(this); + if (this.backBuffer) { + delete this.backBuffer; + delete this.mydc; + } + ;this.backBuffer = undefined; + canvas = null; + } else { + if (xwbif_random==1) + { + this.src = this.pathx +"?v="+ xwb_random; + } else + { + this.src = this.pathx + "?kk=" + ifast_random(gameabc_face.randombase) + 10; + } + + return; + } + ;gameabc_check_img_ok(); + if (gameabc_face.onloadurl) { + gameabc_face.drawcharge = 1; + gameabc_face.onloadurl(0, 1, this.pathx, 1, gameabc_face.loadcount); + } else { + gameabc_face.drawcharge = 1; + if (gameabc_face.loadcount == 100) { + game_close_zsmsg(""); + } else { + game_open_zsmsg(gameabc_face.loadcount + "%" + " 加载..."); + } + ; + } + }; + if (xwbif_random==1) + { + g_image1.src_pre = path + "/" + imgpath + "?v=" + xwb_random; + } else + { + g_image1.src_pre = path + "/" + imgpath + "?kk=" + ifast_random(gameabc_face.randombase) + 10; + } + gameabc_face.img_list_pre.push(g_image1); + g_image1.pathx = path + "/" + imgpath; +} +;function gameabc_check_img_ok(image_id) { + if (image_id > 0) { + if (!gameabc_Image.ImageFileList[image_id].img) { + return 0; + } + ;return gameabc_Image.ImageFileList[image_id].img.ok; + } else { + var i; + var y = 0; + var t = 0; + for (i = 1; i < gameabc_Image.ImageFileList.length; i++) { + if (!gameabc_Image.ImageFileList[i].img) { + continue; + } + ;t++; + if (gameabc_Image.ImageFileList[i].img.ok == 1) { + y++; + } + } + ;if (y >= t) { + gameabc_face.loadcount = 100; + return 100; + } else { + gameabc_face.loadcount = parseInt((y / t) * 100); + return gameabc_face.loadcount; + } + } +} +;function gameabc_load_img_ok(image_id) { + gameabc_Image.ImageFileList[image_id].img.ok = 1; +} +;function gameabc_load_img3(image_id, okfunc) { + var objimg = gameabc_Image.ImageFileList[image_id]; + game_abc_imgpath = gameabc_face.path; + if (objimg.img == undefined) { + objimg.img = new Image(); + objimg.img.id = image_id; + objimg.img.ok = 0; + objimg.img.allw = objimg.w_all; + objimg.img.allh = objimg.h_all; + gameabc_load_img1(objimg.img, game_abc_imgpath, objimg.bmp, okfunc) + } + ;return objimg.img; +} +;function gameabc_load_img_add(image_id, url, okfunc) { + game_abc_imgpath = gameabc_face.path; + var objimg = gameabc_Image.ImageFileList[image_id]; + if (objimg.img == undefined) { + objimg.img = new Image(); + objimg.img.id = image_id; + objimg.img.ok = 0; + objimg.img.allw = objimg.w_all; + objimg.img.allh = objimg.h_all; + gameabc_load_img1(objimg.img, game_abc_imgpath, objimg.bmp, okfunc) + } + ;return objimg.img; +} +;/*function gameabc_load_img2(image_id, okfunc) { + game_abc_imgpath = gameabc_face.path; + var objimg = gameabc_Image.ImageFileList[image_id]; + if (objimg.img == undefined) { + objimg.img = new Image(); + objimg.img.id = image_id; + objimg.img.ok = 0; + objimg.img.allw = objimg.w_all; + objimg.img.allh = objimg.h_all; + gameabc_load_img1(objimg.img, game_abc_imgpath, objimg.bmp, okfunc) + } + ;return objimg.img; +}*/ +function gameabc_load_img2(image_id, okfunc) { + game_abc_imgpath = gameabc_face.path; + var objimg = gameabc_Image.ImageFileList[image_id]; + + + if (objimg.bmp == undefined) + { + alert("加载"+image_id+"号精灵失败,改资源已被删除,请删除对应资源的精灵ID或重新导入该资源" ); + //return 0; + } + + if (objimg.img == undefined) { + objimg.img = new Image(); + objimg.img.id = image_id; + objimg.img.ok = 0; + objimg.img.allw = objimg.w_all; + objimg.img.allh = objimg.h_all; + gameabc_load_img1(objimg.img, game_abc_imgpath, objimg.bmp, okfunc) + } + ;return objimg.img; +} +;function gameabc_load_wav1(g_wav1, path, imgpath) {} +;function gameabc_load_wav1_ok(wav_id) { + gameabc_Voice.VoiceFileList[1].wav1.ok = 1; +} +;function gameabc_load_wav2(wav_id, okfunc) { + return gameabc_Image.ImageFileList[image_id].img; +} +;ifastunit = 8; +var ifast_wss = ifast_wss || {}; +ifast_wss.list = new Array(); +ifast_wss.listani = new Array(); +ifast_wss.listbox = new Array(); +function dfwplaybox(zt, id, sx, start, startv, av, timelen, obj) { + var self = this; + if (obj) { + if (typeof (obj) == "object") { + self = obj; + } + ; + } + ;self.myid = id * 1000000 + sx; + self.zt = zt; + self.id = id; + self.sx = sx; + self.start = start; + self.startv = startv; + self.av = av; + if (timelen) { + self.timelen = timelen; + } else { + self.timelen = 0; + } + ;self.aniopentime = gameabc_face.nowttime; + self.aniusetime = 0; + self.aniusetimeone = 0; + self.aniusecs = 0; + self.nowttime = gameabc_face.nowttime; + self.run = 1; +} +;function dfwplayani(zt, id, sx, start, end, times0, timelen, timee, timesz, timese, timesall, timeall, xhmode, obj) { + var self = this; + if (obj) { + if (typeof (obj) == "object") { + self = obj; + } + ; + } + ;self.myid = id * 1000000 + sx; + self.zt = zt; + self.id = id; + self.sx = sx; + self.start = start; + self.end = end; + self.times0 = times0; + self.timelen = timelen; + self.timee = timee; + if (timesz) { + self.timesz = timesz; + } else { + self.timesz = 0; + } + ;if (timese) { + self.timese = timese; + } else { + self.timese = 0; + } + ;if (timesall) { + self.timesall = timesall; + } else { + self.timesall = 0; + } + ;if (timeall) { + self.timeall = timeall; + } else { + self.timeall = 0; + } + ;if (xhmode) { + self.xhmode = xhmode; + } else { + self.xhmode = 0; + } + ;self.aniopentime = gameabc_face.nowttime; + self.aniusetime = 0; + self.aniusetimeone = 0; + self.aniusecs = 0; + self.nowttime = gameabc_face.nowttime; + self.run = 1; +} +;ifast_wss.copyid = function(str) { + var i, k; + for (var i = 0; i < str.length; i++) { + if (str[i] == "i") { + k = i; + break; + } + ; + } + ;return parseInt(str.substr(0, k)); +} +; +ifast_wss.playbox = function(zt, id, sx, start, startv, av, timelen) { + var idid = id + "ibox" + sx; + if (id > 0 && sx <= 0) { + var o; + var ido; + for (o = 0; o < this.listbox.length; o++) { + idid = this.listbox[o]; + ido = this.copyid(idid); + if (ido == id) { + this.listbox[idid].zt = 0; + } + } + ;return; + } + ;if (id <= 0 && sx <= 0) { + var o; + for (o = 0; o < this.listbox.length; o++) { + idid = this.listbox[o]; + this.listbox[idid].zt = 0; + } + ;return; + } + ;if (this.listbox[idid] == undefined || this.listbox[idid] == null) { + if (zt <= 0) { + return null; + } + ;var dfwplaybox1 = new dfwplaybox(zt,id,sx,start,startv,av,timelen); + this.listbox[idid] = dfwplaybox1; + this.listbox.push(idid); + return dfwplaybox1; + } else { + if (zt <= 0) { + if (this.listbox.length < 40) { + this.listbox[idid].zt = zt; + } else { + this.listbox[idid] = null; + delete this.listbox[idid]; + this.listbox.removeObject(idid); + } + ; + } else { + var self = this.listbox[idid]; + dfwplaybox(zt, id, sx, start, startv, av, timelen, self); + } + ; + } + ; +} +; +ifast_wss.playani = function(zt, id, sx, start, end, times0, timelen, timee, timesz, timese, timesall, timeall, xhmode) { + if (timelen <= 0 && zt > 0) { + logmessage("playani--timelen参数不能为0"); + return; + } + ;var idid = id + "iani" + sx; + if (id > 0 && sx <= 0) { + var o; + var ido; + for (o = 0; o < this.listani.length; o++) { + idid = this.listani[o]; + ido = this.copyid(idid); + if (ido == id) { + this.listani[idid].zt = 0; + } + } + ;return; + } + ;if (id <= 0 && sx <= 0) { + var o; + for (o = 0; o < this.listani.length; o++) { + idid = this.listani[o]; + this.listani[idid].zt = 0; + } + ;return; + } + ;if (this.listani[idid] == undefined || this.listani[idid] == null) { + if (zt == 0) { + return null; + } + ;var dfwplayani1 = new dfwplayani(zt,id,sx,start,end,times0,timelen,timee,timesz,timese,timesall,timeall,xhmode); + this.listani[idid] = dfwplayani1; + this.listani.push(idid); + return dfwplayani1; + } else { + if (zt <= 0) { + if (this.listani.length < 40) { + this.listani[idid].zt = zt; + } else { + this.listani[idid] = null; + delete this.listani[idid]; + this.listani.removeObject(idid); + } + } else { + var self = this.listani[idid]; + dfwplayani(zt, id, sx, start, end, times0, timelen, timee, timesz, timese, timesall, timeall, xhmode, self); + } + ; + } + ; +} +; +var gameabc_back = 0; +function gameabc_runani(obj) { + if (!obj) { + var i; + var b = ifast_wss.listani; + for (x in b) { + if (typeof (b[x]) == "object") { + gameabc_face.drawcharge = 1; + gameabc_runani(b[x]); + } + ; + } + ;return; + } + ;if (obj.zt <= 0) { + return; + } + ;var t = gameabc_face.nowttime - obj.aniopentime; + var t2 = obj.times0 + obj.timelen + obj.timee; + if ((t <= obj.timeall || obj.timeall == 0) && (obj.timesall == 0 || obj.aniusecs < obj.timesall)) { + var cs; + var cstime; + var u; + if (t < obj.timesz) { + return; + } + ;t = t - obj.timesz; + cs = ifast_div(t, t2); + { + if (obj.aniusecs < cs) { + obj.aniusecs = cs; + if (gameabc_face.ani_doend) { + if (ifast_mod(obj.aniusecs, 2) == 0) { + set_self(obj.id, obj.sx, obj.start, 0, 0); + } else { + set_self(obj.id, obj.sx, obj.end, 0, 0); + } + ;gameabc_face.ani_doend(obj.id, obj.sx, obj.aniusecs, 0); + } + ;return; + } + } + ;cstime = ifast_mod(t, t2) - obj.times0; + switch (obj.xhmode) { + case 2: + u = ifast_random(obj.end - obj.start) + obj.start; + set_self(obj.id, obj.sx, parseInt(u), 0, 0); + break; + case 0: + u = (obj.end - obj.start) * (cstime / obj.timelen) + obj.start; + set_self(obj.id, obj.sx, parseInt(u), 0, 0); + break; + case 1: + if (ifast_mod(obj.aniusecs, 2) == 0) { + u = (obj.end - obj.start) * (cstime / obj.timelen) + obj.start; + } else { + u = obj.end - (obj.end - obj.start) * (cstime / obj.timelen); + } + ;set_self(obj.id, obj.sx, parseInt(u), 0, 0); + break; + default: + break; + } + ; + } else { + if (obj.run == 1) { + obj.run = 0; + if (gameabc_face.ani_doend) { + gameabc_face.ani_doend(obj.id, obj.sx, obj.aniusecs, 1); + } + } + } +} +;function gameabc_runbox(obj) { + if (!obj) { + var i; + var b = ifast_wss.listbox; + for (x in b) { + if (typeof (b[x]) == "object") { + gameabc_face.drawcharge = 1; + gameabc_runbox(b[x]); + } + ; + } + ;return; + } + ;if (obj.zt <= 0) { + return; + } + ;var t = gameabc_face.nowttime - obj.aniopentime; + if (t < obj.timelen || obj.timelen == 0) { + t = t / 1000; + var v2 = (obj.startv + obj.av * t / 2) * t; + var u = parseInt(obj.start + v2); + set_self(obj.id, obj.sx, u, 0, 0); + } else { + if (obj.run == 1) { + if (gameabc_face.box_doend) { + gameabc_face.box_doend(obj.id, obj.sx, obj.timelen); + } + ;obj.run = 0; + } + } + ; +} +;function gameabc_toclient(mode, obj, ctx) { + if (mode == 1) { + ctx.translate(obj.x, obj.y); + ctx.translate(obj.w / 2 + obj.cx, obj.h / 2 + obj.cy); + } else { + ctx.translate(-obj.w / 2 - obj.cx, -obj.h / 2 - obj.cy); + ctx.translate(-obj.x, -obj.y); + } +} +;function gameabc_save(obj, ctx) { + if (obj.arge != 0 || obj.ap != 255 || obj.hu != 0 || obj.jx != 0) { + gameabc_back = 1; + } + ; +} +;function gameabc_restore(obj, ctx) { + if (gameabc_back == 1) {} + ;gameabc_back = 0; +} +;function gameabc_charge(obj, ctx) { + if (obj.arge != 0) { + gameabc_toclient(1, obj, ctx); + ctx.rotate(obj.arge * Math.PI / 180); + gameabc_toclient(0, obj, ctx); + } + ;if (obj.ap != 255) { + if (obj.ap <= 0) { + ctx.globalAlpha = 0; + } else { + if (obj.ap >= 255) { + ctx.globalAlpha = 1; + } else { + ctx.globalAlpha = obj.ap / 255; + } + ; + } + ; + } + ;if (obj.hu != 0) {} + ;if (obj.scale != 100) { + var t = obj.scale / 100; + gameabc_toclient(1, obj, ctx); + ctx.scale(t, t); + gameabc_toclient(0, obj, ctx); + } + ;switch (obj.jx) { + case 1: + gameabc_toclient(1, obj, ctx); + ctx.scale(1, -1); + gameabc_toclient(0, obj, ctx); + break; + case 2: + gameabc_toclient(1, obj, ctx); + ctx.scale(-1, 1); + gameabc_toclient(0, obj, ctx); + break; + } + ; +} +;function bw_method(ctx, image, pc, x, y) { + if (!pc) { + pc = 3; + } + ;ctx.save(); + var block, block, white, blue, alpha, len, imageData, average; + len = image.width * image.height; + ctx.drawImage(image, x, y); + imageData = ctx.getImageData(x, y, image.width, image.height); + for (var i = 0; i < len * 4; i += 4) { + block = imageData.data[i]; + white = imageData.data[i + 1]; + blue = imageData.data[i + 2]; + alpha = imageData.data[i + 3]; + average = Math.floor((block + white + blue) / pc); + imageData.data[i] = average; + imageData.data[i + 1] = average; + imageData.data[i + 2] = average; + } + ;ctx.putImageData(imageData, x, y); + ctx.restore(); +} +;function ifast_input() { + inputdiv = document.createElement("div"); + inputdiv.setAttribute("id", "inputdiv"); + inText = document.createElement("input"); + inText.setAttribute("type", "text"); + inText.style.width = "50px"; + inDiv.appendChild(inText); +} +;function ifast_ws(id) { + this.tcpid = id; + this.father = ifast_wss.list; + this.isopen = 0; + this.isdiscon = 0; +} +;ifast_ws.prototype.onopen = function(msg) { + if (ifast_wss.list[this.tcpid] != undefined) { + ifast_wss.list[this.tcpid].isopen = 1; + } + ;if (gameabc_face.tcpconnected) { + gameabc_face.tcpconnected(this.tcpid, msg); + } + ; +} +; +ifast_ws.prototype.onmessage = function(msg) { + if (gameabc_face.tcpmessage) + gameabc_face.tcpmessage(this.tcpid, msg.data); +} +; +ifast_ws.prototype.onclose = function() { + if (ifast_wss.list[this.tcpid] != undefined) { + ifast_wss.list[this.tcpid].isopen = 0; + ifast_wss.list[this.tcpid].isdiscon = 1; + } + ;if (gameabc_face.tcpdisconnected) + gameabc_face.tcpdisconnected(this.tcpid); +} +; +ifast_ws.prototype.onerror = function(msg) { + if (ifast_wss.list[this.tcpid] != undefined) { + ifast_wss.list[this.tcpid].isopen = 0; + ifast_wss.list[this.tcpid].isdiscon = 1; + } + ;if (gameabc_face.tcperror) + gameabc_face.tcperror(this.tcpid, msg.Data); +} +; +ifast_wss.open = function(tcpid, weburl) { + if (this.list[tcpid] == undefined) { + var ifast_ws1 = new ifast_ws(tcpid); + this.list[tcpid] = ifast_ws; + if (weburl.substring(0, 2) != "ws") { + weburl = "ws://" + weburl; + } + ;this.list[tcpid].tcp = new WebSocket(weburl); + this.list[tcpid].tcp.onopen = ifast_ws1.onopen; + this.list[tcpid].tcp.onclose = ifast_ws1.onclose; + this.list[tcpid].tcp.onmessage = ifast_ws1.onmessage; + this.list[tcpid].tcp.onerror = ifast_ws1.onerror; + this.list[tcpid].tcp.tcpid = tcpid; + this.list[tcpid].tcp.father = ifast_wss.list; + this.list[tcpid].tcp.isopen = 0; + this.list[tcpid].tcp.isdiscon = 0; + } + ;return this.list[tcpid]; +} +; +ifast_wss.close = function(tcpid) { + if (this.list[tcpid] != undefined) { + this.list[tcpid].tcp.close(); + } +} +; +ifast_wss.send = function(tcpid, msg) { + if (this.list[tcpid] != undefined) { + this.list[tcpid].tcp.send(msg); + } +} +; +var ifast_wav = ifast_wav || {}; +ifast_wav.list = new Array(); +function wavload() { + this.loop = this.audios[id].isloop == 1; + this.play(); +} +;ifast_wav.getend = function(id, isloop1) { + var a = 0; + var audio = this.getAudio(id, isloop1); + if (audio != null) { + a = audio.ended; + } + ;return a; +} +; +ifast_wav.end = function(id, isloop1) { + var audio = this.getAudio(id, isloop1); + if (audio != null) { + this.audios[id].src = ""; + } +} +; +ifast_wav.start = function(id, isloop1) { + var audio = this.getAudio(id, isloop1); + if (audio != null) { + this.audios[id].src = gameabc_face.wavpath + "/" + id; + } + ; +} +; +ifast_wav.ready = function(id, isloop1) { + var a = 0; + var audio = this.getAudio(id, isloop1); + if (audio != null) { + a = audio.readyState; + } + ;return a; +} +; +ifast_wav.loadall = function(files) { + var strs = new Array(); + strs = files.split(";"); + var i; + if (strs.length <= 0) { + return; + } + ;for (i = 0; i < strs.length; i++) { + ifast_wav.getAudio(strs[i]); + } +} +; +ifast_wav.getAudio = function(id, isloop1) { + if (this.audios == undefined) + this.audios = {}; + if (this.audios[id] == undefined) { + this.audios[id] = new Audio(); + this.audios[id].ok = 0; + this.audios[id].ok = 0; + this.audios[id].addEventListener("canplaythrough", function() { + this.ok = 1; + }, false); + this.audios[id].src_pre = gameabc_face.wavpath + "/" + id; + this.audios[id].src = gameabc_face.wavpath + "/" + id; + } + ;return this.audios[id]; +} +; +ifast_wav.playwav = function(id, isloop1) { + audio = this.getAudio(id, isloop1); + if (audio != null) { + if (isloop1 < 0) { + audio.pause(); + return; + } + ;if (isloop1 == 1) { + audio.loop = "loop"; + } else { + audio.loop = ""; + } + ;if (audio.ok == 1) { + audio.currentTime = 0; + audio.autoplay = "true"; + audio.play(); + } else { + audio.autoplay = "true"; + audio.play(); + } + ;if (audio.loop == true) { + audio.addEventListener('ended', function() { + this.currentTime = 0; + this.autoplay = "true"; + this.play(); + }, false); + } + } + ; +} +; +function gameabc() { + this.gameabc_open = function(image1, x, y, z) { + this.startupGameObject(x, y, z); + this.image = image1; + return this; + } + ; + this.gameabc_close = function() { + this.shutdownGameObject(); + } + ; +} +;gameabc.prototype = new VisualGameObject; +function gameabc_img() { + this.gameabc_open = function(image, x, y, z) { + this.startupGameObject(x, y, z); + this.image = image; + return this; + } + ; + this.gameabc_close = function() { + this.shutdownGameObject(); + } + ; + this.draw = function(dt, context, xScroll, yScroll) { + if (this.image == null) { + return; + } + ;if (this.image.ok == 0) { + return; + } + { + if (dfwusercavans != 1) { + this.drawimage = this.image; + } else { + this.drawimage = gameabc_face.createcanvas(this.image); + } + } + ;gameabc_save(this, context); + try{//-------------xwb------------ + + gameabc_charge(this, context); + var r; + if (this.uidata.FrameStyle == 0) { + if (this.uidata.L9 == 0) { + r = gameabc_getrect2(this.recid, this.frame); + context.drawImage(this.drawimage, r.x, r.y, r.w, r.h, this.x - xScroll, this.y - yScroll, this.w, this.h); + } else { + r = gameabc_getrect2(this.recid, 1); + yScroll = 0; + xScroll = 0; + context.drawImage(this.drawimage, 0, 0, this.uidata.L9, this.uidata.T9, this.x - xScroll, this.y - yScroll, this.uidata.L9, this.uidata.T9); + context.drawImage(this.drawimage, this.uidata.L9, 0, r.w - this.uidata.L9 - this.uidata.R9, this.uidata.T9, this.x + this.uidata.L9 - xScroll, this.y - yScroll, this.w - this.uidata.L9 - this.uidata.R9, this.uidata.T9); + context.drawImage(this.drawimage, r.w - this.uidata.R9, 0, this.uidata.R9, this.uidata.T9, this.x + this.w - this.uidata.R9 - xScroll, this.y - yScroll, this.uidata.R9, this.uidata.T9); + context.drawImage(this.drawimage, 0, r.h - this.uidata.B9, this.uidata.L9, this.uidata.B9, this.x - xScroll, this.y + this.h - this.uidata.B9 - yScroll, this.uidata.L9, this.uidata.B9); + context.drawImage(this.drawimage, this.uidata.L9, r.h - this.uidata.B9, r.w - this.uidata.L9 - this.uidata.R9, this.uidata.B9, this.x + this.uidata.L9 - xScroll, this.y + this.h - this.uidata.B9 - yScroll, this.w - this.uidata.L9 - this.uidata.R9, this.uidata.B9); + context.drawImage(this.drawimage, r.w - this.uidata.R9, r.h - this.uidata.B9, this.uidata.R9, this.uidata.B9, this.x + this.w - this.uidata.R9 - xScroll, this.y + this.h - this.uidata.B9 - yScroll, this.uidata.R9, this.uidata.B9); + context.drawImage(this.drawimage, 0, this.uidata.T9, this.uidata.L9, r.h - this.uidata.B9 - this.uidata.T9, this.x - xScroll, this.y + this.uidata.T9 - yScroll, this.uidata.L9, this.h - this.uidata.B9 - this.uidata.T9); + context.drawImage(this.drawimage, this.uidata.L9, this.uidata.T9, r.w - this.uidata.L9 - this.uidata.R9, r.h - this.uidata.B9 - this.uidata.T9, this.x + this.uidata.L9 - xScroll, this.y + this.uidata.T9 - yScroll, this.w - this.uidata.L9 - this.uidata.R9, this.h - this.uidata.B9 - this.uidata.T9); + context.drawImage(this.drawimage, r.w - this.uidata.R9, this.uidata.T9, this.uidata.R9, r.h - this.uidata.B9 - this.uidata.T9, this.x + this.w - this.uidata.R9 - xScroll, this.y + this.uidata.T9 - yScroll, this.uidata.R9, this.h - this.uidata.B9 - this.uidata.T9); + } + } else { + var len1 = this.caption.length; + var dolen = 0; + var doframe; + var r_tempw = this.w / len1; + for (dolen = 0; dolen < len1; dolen++) { + doframe = this.caption[dolen].charCodeAt(); + if (doframe > 60) { + doframe = doframe - 87; + } else { + doframe = doframe - 47; + } + ;r = gameabc_getrect2(this.recid, doframe); + context.drawImage(this.drawimage, r.x, r.y, r.w, r.h, this.x + dolen * r_tempw - xScroll, this.y - yScroll, r_tempw, this.h); + } + } + ;if (this.color != 0) { + gameabc_face.zz2d.clearRect(0, 0, 1, 1); + gameabc_face.zz2d.fillStyle = this.color; + gameabc_face.zz2d.fillRect(0, 0, 1, 1); + context.drawImage(gameabc_face.zz_canvas, 0, 0, 1, 1, this.x, this.y, this.w, this.h); + } + }catch(e){ + + } + ;gameabc_restore(this, context); + } + ; +} +;gameabc_img.prototype = new VisualGameObject; +function gameabc_imgtxt() { + this.gameabc_open = function(txt, x, y, z, hsize, wsize) { + this.startupGameObject(x, y, z); + this.caption = txt; + this.h = hsize; + if (wsize) + this.w = wsize; + return this; + } + ; + this.gameabc_close = function() { + this.shutdownGameObject(); + } + ; + this.draw = function(dt, context, xScroll, yScroll) { + if (this.uidata.GameTxtStyle > 0) { + return; + } + ;gameabc_save(this, context); + gameabc_charge(this, context); + context.textBaseline = "top"; + context.fillStyle = gameabc_GameTxt.GameTxtList[this.frame].Color; + context.font = 'lighter ' + this.h + 'px bold Arial'; + this.caption = gameabc_GameTxt.GameTxtList[this.frame].Text; + if (this.uidata.GameTxtStyle == 0) { + gameabc_drawtext = this.caption; + } else { + gameabc_drawtext = gameabc_password.substring(0, this.caption.length + 1); + } + ;if (this.w > 0) { + context.fillText(gameabc_drawtext, this.x - xScroll, this.y - yScroll, this.w); + } else { + context.fillText(gameabc_drawtext, this.x - xScroll, this.y - yScroll); + } + ;gameabc_restore(this, context); + } +} +;gameabc_imgtxt.prototype = new VisualGameObject; +function draw2(obj, context, ctx) { + context.textBaseline = "top"; + var h = obj.h * iui.ratio; + context.font = 'lighter ' + h + 'px bold Arial'; + var w = context.measureText(obj.caption).width; + context.clearRect(0, 0, w, h); + if (obj.uidata.BackColorA != 0) { + context.fillStyle = obj.uidata.BackColor; + context.fillRect(0, 0, w, h); + } + ;context.fillStyle = obj.uidata.FontColor; + context.fillText(obj.caption, 0, 0); + ctx.drawImage(iui.test, 0, 0, w, h, obj.x, obj.y, w / iui.ratio, obj.h); +} +;function gameabc_txt() { + this.gameabc_open = function(txt, x, y, z, hsize, wsize) { + this.startupGameObject(x, y, z); + this.caption = txt; + this.h = hsize; + if (wsize) + this.w = wsize; + return this; + } + ; + this.gameabc_close = function() { + this.shutdownGameObject(); + } + ; + this.draw = function(dt, context, xScroll, yScroll) { + if (this.uidata.GameTxtStyle > 0) { + return; + } + ;context.textBaseline = "top"; + if (this.uidata.BackColorA != 0) { + context.fillStyle = this.uidata.BackColor; + context.fillRect(this.x, this.y, this.w, this.h); + } + ;context.fillStyle = this.uidata.FontColor; + context.font = 'lighter ' + this.h + 'px bold Arial'; + if (this.caption.indexOf("\n") > 0) { + var strs = new Array(); + strs = this.caption.split("\n"); + if (this.uidata.BackColorA != 0) { + context.fillStyle = this.uidata.BackColor; + context.fillRect(this.x, this.y, this.w, this.h * strs.length); + } + ;for (var i = 0; i < strs.length; i++) { + context.fillText(strs[i], this.x - xScroll, this.y - yScroll + this.h * i); + } + ;return; + } + ;context.fillText(this.caption, this.x - xScroll, this.y - yScroll); + } +} +;gameabc_txt.prototype = new VisualGameObject; +function Div(exp1, exp2) { + var n1 = Math.round(exp1); + var n2 = Math.round(exp2); + var rslt = n1 / n2; + if (rslt >= 0) { + rslt = Math.floor(rslt); + } else { + rslt = Math.ceil(rslt); + } + ;return rslt; +} +;function gameabc_list() { + this.gameabc_open = function(ObjectID, x, y, z, hsize, wsize) { + this.startupGameObject(x, y, z); + this.h = hsize; + if (wsize) + this.w = wsize; + this.ObjectType = 5; + this.objid = ObjectID; + this.offx = 0; + this.offy = 0; + return this; + } + ; + this.setoff = function(offx1, offy1) { + this.offx = offx1; + this.offy = offy1; + } + ; + this.charge = function(x1, y1, w1, h1, offx1, offy1) { + if (x1 == undefined) { + this.charge(this.x, this.y, this.w, this.h, 0, 0); + return; + } + ;var obj = gameabc_Object.ObjectList[this.objid].Property; + this.x = x1; + this.y = y1; + this.w = w1; + this.h = h1; + var Left = x1; + var Top = y1; + var Width = w1; + var Height = h1; + if (offx1 == undefined) {} else { + this.offx = offx1; + this.offy = offy1; + } + ;this.Thick = obj.Thick; + this.ChildEdg = obj.ChildEdg; + this.ChildWidth = obj.ChildWidth; + this.ChildHeight = obj.ChildHeight; + this.ChildThick = obj.ChildThick; + this.ChildOrdStyle = obj.ChildOrdStyle; + if (this.ChildOrdStyle == 0) { + this.cell_width = this.ChildWidth; + this.cell_height = this.ChildHeight; + } + if (this.ChildOrdStyle == 1) { + this.cell_width = Width + (-this.Thick - this.ChildEdg) * 2; + this.cell_height = this.ChildHeight; + } + if (this.ChildOrdStyle == 2) { + this.cell_width = this.ChildWidth; + this.cell_height = Height + (-this.Thick - this.ChildEdg) * 2; + } + ;this.red_w = Width - (this.Thick * 2) - (this.ChildEdg * 2); + this.red_h = Height - (this.Thick * 2) - (this.ChildEdg * 2); + this.red_num_w = this.Div(this.red_w, this.cell_width); + this.red_num_h = this.Div(this.red_h, this.cell_height); + this.ys_x = Left + this.Thick + this.ChildEdg; + this.ys_y = Top + this.Thick + this.ChildEdg; + } + ; + this.gameabc_close = function() { + this.shutdownGameObject(); + } + ; + this.draw = function(dt, context, xScroll, yScroll) { + + var Left = this.x; + var Top = this.y; + var Width = this.w; + var Height = this.h; + context.fillStyle = "blue"; + context.fillRect(this.x, this.y, this.w, this.h); + context.fillStyle = "white"; + context.fillRect(Left + this.Thick, Top + this.Thick, Width - this.Thick * 2, Height - this.Thick * 2); + context.fillStyle = "red"; + for (var i = 0; i < this.red_num_w; i++) { + for (var j = 0; j < this.red_num_h; j++) { + this.x0 = i * this.cell_width + this.offx; + this.y0 = j * this.cell_height + this.offy; + context.fillRect(this.ys_x + this.x0, this.ys_y + this.y0, this.cell_width, this.cell_height); + } + } + ;context.fillStyle = "blue"; + for (var i = 0; i < this.red_num_w; i++) { + for (var j = 0; j < this.red_num_h; j++) { + this.x0 = i * this.cell_width + this.offx; + this.y0 = j * this.cell_height + this.offy; + context.fillRect(this.ys_x + this.ChildThick + this.x0, this.ys_y + this.ChildThick + this.y0, this.cell_width - (this.ChildThick * 2), this.cell_height - (this.ChildThick * 2)); + } + } + ;var num = 0; + for (var i = 0; i < this.red_num_h; i++) { + for (var j = 0; j < this.red_num_w; j++) { + num++; + } + } + ;context.stroke(); + } +} +;gameabc_list.prototype = new VisualGameObject; +gameabc_list.prototype.Div = function(exp1, exp2) { + var n1 = Math.round(exp1); + var n2 = Math.round(exp2); + var rslt = n1 / n2; + if (rslt >= 0) { + rslt = Math.floor(rslt); + } else { + rslt = Math.ceil(rslt); + } + ;return rslt; +} +; +function getlength(str) { + var realLength = 0; + len = str.length; + charCode = -1; + for (var i = 0; i < len; i++) { + charCode = str.charCodeAt(i); + if (charCode > 0 && charCode <= 128) + realLength += 1; + else + realLength += 2; + } + ;return realLength; +} +;var gameabc_password = "************************************"; +var gameabc_drawtext = ""; +function gameabc_panle() { + this.gameabc_open = function(ObjectID, x, y, z, wsize, hsize) { + this.startupGameObject(x, y, z); + this.h = hsize; + if (wsize) + this.w = wsize; + this.ObjectType = 6; + this.objid = ObjectID; + this.offx = 0; + this.offy = 0; + return this; + } + ; + this.gameabc_close = function() { + this.shutdownGameObject(); + } + ; + this.draw = function(dt, context, xScroll, yScroll) { + return; + context.lineWidth = 1; + context.strokeStyle = ifast_jb; + context.strokeRect(this.x, this.y, this.w, this.h); + } + ; +} +;gameabc_panle.prototype = new VisualGameObject; + + + + + diff --git a/client/js/vendor/jquery-2.1.1.min.js b/client/js/vendor/jquery-2.1.1.min.js new file mode 100644 index 0000000..9ed2acc --- /dev/null +++ b/client/js/vendor/jquery-2.1.1.min.js @@ -0,0 +1,4 @@ +/*! jQuery v2.1.1 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */ +!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l=a.document,m="2.1.1",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return n.each(this,a,b)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(n.isPlainObject(d)||(e=n.isArray(d)))?(e?(e=!1,f=c&&n.isArray(c)?c:[]):f=c&&n.isPlainObject(c)?c:{},g[b]=n.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){return!n.isArray(a)&&a-parseFloat(a)>=0},isPlainObject:function(a){return"object"!==n.type(a)||a.nodeType||n.isWindow(a)?!1:a.constructor&&!j.call(a.constructor.prototype,"isPrototypeOf")?!1:!0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=n.trim(a),a&&(1===a.indexOf("use strict")?(b=l.createElement("script"),b.text=a,l.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=s(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:g.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=s(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(c=a[b],b=a,a=c),n.isFunction(a)?(e=d.call(arguments,2),f=function(){return a.apply(b||this,e.concat(d.call(arguments)))},f.guid=a.guid=a.guid||n.guid++,f):void 0},now:Date.now,support:k}),n.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+-new Date,v=a.document,w=0,x=0,y=gb(),z=gb(),A=gb(),B=function(a,b){return a===b&&(l=!0),0},C="undefined",D=1<<31,E={}.hasOwnProperty,F=[],G=F.pop,H=F.push,I=F.push,J=F.slice,K=F.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},L="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",N="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=N.replace("w","w#"),P="\\["+M+"*("+N+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+O+"))|)"+M+"*\\]",Q=":("+N+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+P+")*)|.*)\\)|)",R=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),S=new RegExp("^"+M+"*,"+M+"*"),T=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),V=new RegExp(Q),W=new RegExp("^"+O+"$"),X={ID:new RegExp("^#("+N+")"),CLASS:new RegExp("^\\.("+N+")"),TAG:new RegExp("^("+N.replace("w","w*")+")"),ATTR:new RegExp("^"+P),PSEUDO:new RegExp("^"+Q),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+L+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ab=/[+~]/,bb=/'|\\/g,cb=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),db=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)};try{I.apply(F=J.call(v.childNodes),v.childNodes),F[v.childNodes.length].nodeType}catch(eb){I={apply:F.length?function(a,b){H.apply(a,J.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fb(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],!a||"string"!=typeof a)return d;if(1!==(k=b.nodeType)&&9!==k)return[];if(p&&!e){if(f=_.exec(a))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return I.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName&&b.getElementsByClassName)return I.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=9===k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(bb,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+qb(o[l]);w=ab.test(a)&&ob(b.parentNode)||b,x=o.join(",")}if(x)try{return I.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function gb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function hb(a){return a[u]=!0,a}function ib(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function jb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function kb(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||D)-(~a.sourceIndex||D);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function lb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function mb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function nb(a){return hb(function(b){return b=+b,hb(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function ob(a){return a&&typeof a.getElementsByTagName!==C&&a}c=fb.support={},f=fb.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fb.setDocument=function(a){var b,e=a?a.ownerDocument||a:v,g=e.defaultView;return e!==n&&9===e.nodeType&&e.documentElement?(n=e,o=e.documentElement,p=!f(e),g&&g!==g.top&&(g.addEventListener?g.addEventListener("unload",function(){m()},!1):g.attachEvent&&g.attachEvent("onunload",function(){m()})),c.attributes=ib(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ib(function(a){return a.appendChild(e.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(e.getElementsByClassName)&&ib(function(a){return a.innerHTML="
",a.firstChild.className="i",2===a.getElementsByClassName("i").length}),c.getById=ib(function(a){return o.appendChild(a).id=u,!e.getElementsByName||!e.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if(typeof b.getElementById!==C&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){var c=typeof a.getAttributeNode!==C&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==C?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return typeof b.getElementsByClassName!==C&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(e.querySelectorAll))&&(ib(function(a){a.innerHTML="",a.querySelectorAll("[msallowclip^='']").length&&q.push("[*^$]="+M+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+M+"*(?:value|"+L+")"),a.querySelectorAll(":checked").length||q.push(":checked")}),ib(function(a){var b=e.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+M+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ib(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",Q)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===e||a.ownerDocument===v&&t(v,a)?-1:b===e||b.ownerDocument===v&&t(v,b)?1:k?K.call(k,a)-K.call(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,f=a.parentNode,g=b.parentNode,h=[a],i=[b];if(!f||!g)return a===e?-1:b===e?1:f?-1:g?1:k?K.call(k,a)-K.call(k,b):0;if(f===g)return kb(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?kb(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},e):n},fb.matches=function(a,b){return fb(a,null,null,b)},fb.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fb(b,n,null,[a]).length>0},fb.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fb.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&E.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fb.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fb.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fb.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fb.selectors={cacheLength:50,createPseudo:hb,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(cb,db),a[3]=(a[3]||a[4]||a[5]||"").replace(cb,db),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fb.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fb.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(cb,db).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+M+")"+a+"("+M+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||typeof a.getAttribute!==C&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fb.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fb.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?hb(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=K.call(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:hb(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?hb(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:hb(function(a){return function(b){return fb(a,b).length>0}}),contains:hb(function(a){return function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:hb(function(a){return W.test(a||"")||fb.error("unsupported lang: "+a),a=a.replace(cb,db).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:nb(function(){return[0]}),last:nb(function(a,b){return[b-1]}),eq:nb(function(a,b,c){return[0>c?c+b:c]}),even:nb(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:nb(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:nb(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:nb(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function rb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function sb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function tb(a,b,c){for(var d=0,e=b.length;e>d;d++)fb(a,b[d],c);return c}function ub(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function vb(a,b,c,d,e,f){return d&&!d[u]&&(d=vb(d)),e&&!e[u]&&(e=vb(e,f)),hb(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||tb(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ub(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ub(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?K.call(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ub(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):I.apply(g,r)})}function wb(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=rb(function(a){return a===b},h,!0),l=rb(function(a){return K.call(b,a)>-1},h,!0),m=[function(a,c,d){return!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d))}];f>i;i++)if(c=d.relative[a[i].type])m=[rb(sb(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return vb(i>1&&sb(m),i>1&&qb(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&wb(a.slice(i,e)),f>e&&wb(a=a.slice(e)),f>e&&qb(a))}m.push(c)}return sb(m)}function xb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=G.call(i));s=ub(s)}I.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&fb.uniqueSort(i)}return k&&(w=v,j=t),r};return c?hb(f):f}return h=fb.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wb(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xb(e,d)),f.selector=a}return f},i=fb.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(cb,db),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(cb,db),ab.test(j[0].type)&&ob(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qb(j),!a)return I.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,ab.test(a)&&ob(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ib(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ib(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||jb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ib(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||jb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ib(function(a){return null==a.getAttribute("disabled")})||jb(L,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fb}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=n.expr.match.needsContext,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^.[^:#\[\.,]*$/;function x(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(w.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return g.call(b,a)>=0!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;c>b;b++)if(n.contains(e[b],this))return!0}));for(b=0;c>b;b++)n.find(a,e[b],d);return d=this.pushStack(c>1?n.unique(d):d),d.selector=this.selector?this.selector+" "+a:a,d},filter:function(a){return this.pushStack(x(this,a||[],!1))},not:function(a){return this.pushStack(x(this,a||[],!0))},is:function(a){return!!x(this,"string"==typeof a&&u.test(a)?n(a):a||[],!1).length}});var y,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=n.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||y).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:l,!0)),v.test(c[1])&&n.isPlainObject(b))for(c in b)n.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}return d=l.getElementById(c[2]),d&&d.parentNode&&(this.length=1,this[0]=d),this.context=l,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof y.ready?y.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};A.prototype=n.fn,y=n(l);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};n.extend({dir:function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),n.fn.extend({has:function(a){var b=n(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(n.contains(this,b[a]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=u.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.unique(f):f)},index:function(a){return a?"string"==typeof a?g.call(n(a),this[0]):g.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.unique(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){while((a=a[b])&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return n.dir(a,"parentNode")},parentsUntil:function(a,b,c){return n.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return n.dir(a,"nextSibling")},prevAll:function(a){return n.dir(a,"previousSibling")},nextUntil:function(a,b,c){return n.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return n.dir(a,"previousSibling",c)},siblings:function(a){return n.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return n.sibling(a.firstChild)},contents:function(a){return a.contentDocument||n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(C[a]||n.unique(e),B.test(a)&&e.reverse()),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return n.each(a.match(E)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):n.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(b=a.memory&&l,c=!0,g=e||0,e=0,f=h.length,d=!0;h&&f>g;g++)if(h[g].apply(l[0],l[1])===!1&&a.stopOnFalse){b=!1;break}d=!1,h&&(i?i.length&&j(i.shift()):b?h=[]:k.disable())},k={add:function(){if(h){var c=h.length;!function g(b){n.each(b,function(b,c){var d=n.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&g(c)})}(arguments),d?f=h.length:b&&(e=c,j(b))}return this},remove:function(){return h&&n.each(arguments,function(a,b){var c;while((c=n.inArray(b,h,c))>-1)h.splice(c,1),d&&(f>=c&&f--,g>=c&&g--)}),this},has:function(a){return a?n.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],f=0,this},disable:function(){return h=i=b=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,b||k.disable(),this},locked:function(){return!i},fireWith:function(a,b){return!h||c&&!i||(b=b||[],b=[a,b.slice?b.slice():b],d?i.push(b):j(b)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!c}};return k},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&n.isFunction(a.promise)?e:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(H.resolveWith(l,[n]),n.fn.triggerHandler&&(n(l).triggerHandler("ready"),n(l).off("ready"))))}});function I(){l.removeEventListener("DOMContentLoaded",I,!1),a.removeEventListener("load",I,!1),n.ready()}n.ready.promise=function(b){return H||(H=n.Deferred(),"complete"===l.readyState?setTimeout(n.ready):(l.addEventListener("DOMContentLoaded",I,!1),a.addEventListener("load",I,!1))),H.promise(b)},n.ready.promise();var J=n.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)n.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f};n.acceptData=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function K(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=n.expando+Math.random()}K.uid=1,K.accepts=n.acceptData,K.prototype={key:function(a){if(!K.accepts(a))return 0;var b={},c=a[this.expando];if(!c){c=K.uid++;try{b[this.expando]={value:c},Object.defineProperties(a,b)}catch(d){b[this.expando]=c,n.extend(a,b)}}return this.cache[c]||(this.cache[c]={}),c},set:function(a,b,c){var d,e=this.key(a),f=this.cache[e];if("string"==typeof b)f[b]=c;else if(n.isEmptyObject(f))n.extend(this.cache[e],b);else for(d in b)f[d]=b[d];return f},get:function(a,b){var c=this.cache[this.key(a)];return void 0===b?c:c[b]},access:function(a,b,c){var d;return void 0===b||b&&"string"==typeof b&&void 0===c?(d=this.get(a,b),void 0!==d?d:this.get(a,n.camelCase(b))):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d,e,f=this.key(a),g=this.cache[f];if(void 0===b)this.cache[f]={};else{n.isArray(b)?d=b.concat(b.map(n.camelCase)):(e=n.camelCase(b),b in g?d=[b,e]:(d=e,d=d in g?[d]:d.match(E)||[])),c=d.length;while(c--)delete g[d[c]]}},hasData:function(a){return!n.isEmptyObject(this.cache[a[this.expando]]||{})},discard:function(a){a[this.expando]&&delete this.cache[a[this.expando]]}};var L=new K,M=new K,N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(O,"-$1").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}M.set(a,b,c)}else c=void 0;return c}n.extend({hasData:function(a){return M.hasData(a)||L.hasData(a)},data:function(a,b,c){return M.access(a,b,c)},removeData:function(a,b){M.remove(a,b) +},_data:function(a,b,c){return L.access(a,b,c)},_removeData:function(a,b){L.remove(a,b)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=M.get(f),1===f.nodeType&&!L.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));L.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){M.set(this,a)}):J(this,function(b){var c,d=n.camelCase(a);if(f&&void 0===b){if(c=M.get(f,a),void 0!==c)return c;if(c=M.get(f,d),void 0!==c)return c;if(c=P(f,d,void 0),void 0!==c)return c}else this.each(function(){var c=M.get(this,d);M.set(this,d,b),-1!==a.indexOf("-")&&void 0!==c&&M.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){M.remove(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=L.get(a,b),c&&(!d||n.isArray(c)?d=L.access(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return L.get(a,c)||L.access(a,c,{empty:n.Callbacks("once memory").add(function(){L.remove(a,[b+"queue",c])})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthx",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var U="undefined";k.focusinBubbles="onfocusin"in a;var V=/^key/,W=/^(?:mouse|pointer|contextmenu)|click/,X=/^(?:focusinfocus|focusoutblur)$/,Y=/^([^.]*)(?:\.(.+)|)$/;function Z(){return!0}function $(){return!1}function _(){try{return l.activeElement}catch(a){}}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.get(a);if(r){c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=n.guid++),(i=r.events)||(i=r.events={}),(g=r.handle)||(g=r.handle=function(b){return typeof n!==U&&n.event.triggered!==b.type?n.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(E)||[""],j=b.length;while(j--)h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o&&(l=n.event.special[o]||{},o=(e?l.delegateType:l.bindType)||o,l=n.event.special[o]||{},k=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},f),(m=i[o])||(m=i[o]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,p,g)!==!1||a.addEventListener&&a.addEventListener(o,g,!1)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),n.event.global[o]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.hasData(a)&&L.get(a);if(r&&(i=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=i[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&q!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete i[o])}else for(o in i)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(i)&&(delete r.handle,L.remove(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,m,o,p=[d||l],q=j.call(b,"type")?b.type:b,r=j.call(b,"namespace")?b.namespace.split("."):[];if(g=h=d=d||l,3!==d.nodeType&&8!==d.nodeType&&!X.test(q+n.event.triggered)&&(q.indexOf(".")>=0&&(r=q.split("."),q=r.shift(),r.sort()),k=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=r.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:n.makeArray(c,[b]),o=n.event.special[q]||{},e||!o.trigger||o.trigger.apply(d,c)!==!1)){if(!e&&!o.noBubble&&!n.isWindow(d)){for(i=o.delegateType||q,X.test(i+q)||(g=g.parentNode);g;g=g.parentNode)p.push(g),h=g;h===(d.ownerDocument||l)&&p.push(h.defaultView||h.parentWindow||a)}f=0;while((g=p[f++])&&!b.isPropagationStopped())b.type=f>1?i:o.bindType||q,m=(L.get(g,"events")||{})[b.type]&&L.get(g,"handle"),m&&m.apply(g,c),m=k&&g[k],m&&m.apply&&n.acceptData(g)&&(b.result=m.apply(g,c),b.result===!1&&b.preventDefault());return b.type=q,e||b.isDefaultPrevented()||o._default&&o._default.apply(p.pop(),c)!==!1||!n.acceptData(d)||k&&n.isFunction(d[q])&&!n.isWindow(d)&&(h=d[k],h&&(d[k]=null),n.event.triggered=q,d[q](),n.event.triggered=void 0,h&&(d[k]=h)),b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(L.get(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(g.namespace))&&(a.handleObj=g,a.data=g.data,e=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(a.result=e)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!==this;i=i.parentNode||this)if(i.disabled!==!0||"click"!==a.type){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>=0:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h]*)\/>/gi,bb=/<([\w:]+)/,cb=/<|&#?\w+;/,db=/<(?:script|style|link)/i,eb=/checked\s*(?:[^=]|=\s*.checked.)/i,fb=/^$|\/(?:java|ecma)script/i,gb=/^true\/(.*)/,hb=/^\s*\s*$/g,ib={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};ib.optgroup=ib.option,ib.tbody=ib.tfoot=ib.colgroup=ib.caption=ib.thead,ib.th=ib.td;function jb(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function kb(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function lb(a){var b=gb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function mb(a,b){for(var c=0,d=a.length;d>c;c++)L.set(a[c],"globalEval",!b||L.get(b[c],"globalEval"))}function nb(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(L.hasData(a)&&(f=L.access(a),g=L.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)n.event.add(b,e,j[e][c])}M.hasData(a)&&(h=M.access(a),i=n.extend({},h),M.set(b,i))}}function ob(a,b){var c=a.getElementsByTagName?a.getElementsByTagName(b||"*"):a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&n.nodeName(a,b)?n.merge([a],c):c}function pb(a,b){var c=b.nodeName.toLowerCase();"input"===c&&T.test(a.type)?b.checked=a.checked:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}n.extend({clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=n.contains(a.ownerDocument,a);if(!(k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(g=ob(h),f=ob(a),d=0,e=f.length;e>d;d++)pb(f[d],g[d]);if(b)if(c)for(f=f||ob(a),g=g||ob(h),d=0,e=f.length;e>d;d++)nb(f[d],g[d]);else nb(a,h);return g=ob(h,"script"),g.length>0&&mb(g,!i&&ob(a,"script")),h},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k=b.createDocumentFragment(),l=[],m=0,o=a.length;o>m;m++)if(e=a[m],e||0===e)if("object"===n.type(e))n.merge(l,e.nodeType?[e]:e);else if(cb.test(e)){f=f||k.appendChild(b.createElement("div")),g=(bb.exec(e)||["",""])[1].toLowerCase(),h=ib[g]||ib._default,f.innerHTML=h[1]+e.replace(ab,"<$1>")+h[2],j=h[0];while(j--)f=f.lastChild;n.merge(l,f.childNodes),f=k.firstChild,f.textContent=""}else l.push(b.createTextNode(e));k.textContent="",m=0;while(e=l[m++])if((!d||-1===n.inArray(e,d))&&(i=n.contains(e.ownerDocument,e),f=ob(k.appendChild(e),"script"),i&&mb(f),c)){j=0;while(e=f[j++])fb.test(e.type||"")&&c.push(e)}return k},cleanData:function(a){for(var b,c,d,e,f=n.event.special,g=0;void 0!==(c=a[g]);g++){if(n.acceptData(c)&&(e=c[L.expando],e&&(b=L.cache[e]))){if(b.events)for(d in b.events)f[d]?n.event.remove(c,d):n.removeEvent(c,d,b.handle);L.cache[e]&&delete L.cache[e]}delete M.cache[c[M.expando]]}}}),n.fn.extend({text:function(a){return J(this,function(a){return void 0===a?n.text(this):this.empty().each(function(){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&(this.textContent=a)})},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=jb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=jb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?n.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||n.cleanData(ob(c)),c.parentNode&&(b&&n.contains(c.ownerDocument,c)&&mb(ob(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(n.cleanData(ob(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return J(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!db.test(a)&&!ib[(bb.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(ab,"<$1>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(ob(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,n.cleanData(ob(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,m=this,o=l-1,p=a[0],q=n.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&eb.test(p))return this.each(function(c){var d=m.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(c=n.buildFragment(a,this[0].ownerDocument,!1,this),d=c.firstChild,1===c.childNodes.length&&(c=d),d)){for(f=n.map(ob(c,"script"),kb),g=f.length;l>j;j++)h=c,j!==o&&(h=n.clone(h,!0,!0),g&&n.merge(f,ob(h,"script"))),b.call(this[j],h,j);if(g)for(i=f[f.length-1].ownerDocument,n.map(f,lb),j=0;g>j;j++)h=f[j],fb.test(h.type||"")&&!L.access(h,"globalEval")&&n.contains(i,h)&&(h.src?n._evalUrl&&n._evalUrl(h.src):n.globalEval(h.textContent.replace(hb,"")))}return this}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=[],e=n(a),g=e.length-1,h=0;g>=h;h++)c=h===g?this:this.clone(!0),n(e[h])[b](c),f.apply(d,c.get());return this.pushStack(d)}});var qb,rb={};function sb(b,c){var d,e=n(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:n.css(e[0],"display");return e.detach(),f}function tb(a){var b=l,c=rb[a];return c||(c=sb(a,b),"none"!==c&&c||(qb=(qb||n("