… | |
… | |
34 | |
34 | |
35 | Array.prototype.contains = function (e){ |
35 | Array.prototype.contains = function (e){ |
36 | return this.indexOf(e) >= 0 && this.indexOf(e)<this.length; |
36 | return this.indexOf(e) >= 0 && this.indexOf(e)<this.length; |
37 | } |
37 | } |
38 | |
38 | |
39 | var canvas = null; |
|
|
40 | var canvasID = 'main'; |
|
|
41 | var ctx = null; |
39 | var ctx = null; |
42 | var stage = null; |
40 | var stage = null; |
43 | var Messages = []; |
|
|
44 | var output = null; |
41 | var output = null; |
45 | var commandline = null; |
42 | var commandline = null; |
46 | |
43 | |
47 | var channels = {length: 0,list: []}; |
44 | var channels = {length: 0,list: []}; |
48 | |
45 | |
49 | var clickable = []; |
46 | var dx=0; |
|
|
47 | var dy=0; |
50 | |
48 | |
51 | var extmap = true; |
|
|
52 | var Map = []; |
49 | var Map = null; |
53 | var oldMapName = ""; |
|
|
54 | var drawInventory = false; |
|
|
55 | |
50 | |
56 | messageBox = window.alert; |
51 | messageBox = window.alert; |
57 | |
52 | |
58 | alert = function (s){ |
53 | alert = function (s){ |
59 | writeToScreen(s); |
54 | writeToScreen(s); |
… | |
… | |
61 | |
56 | |
62 | var floorItems = []; |
57 | var floorItems = []; |
63 | var myItems = []; |
58 | var myItems = []; |
64 | var mySpells = []; |
59 | var mySpells = []; |
65 | var myStats = []; |
60 | var myStats = []; |
66 | |
|
|
67 | |
|
|
68 | var skillNames = []; |
61 | var skillNames = []; |
69 | |
62 | |
70 | var skipKeyTest = false; |
63 | var skipKeyTest = false; |
71 | |
64 | |
72 | var keys = { |
65 | var keys = { |
… | |
… | |
96 | }; |
89 | }; |
97 | var expTableFacenum = -1; |
90 | var expTableFacenum = -1; |
98 | |
91 | |
99 | var isRunning = false; |
92 | var isRunning = false; |
100 | var isFiring = false; |
93 | var isFiring = false; |
|
|
94 | |
101 | mapsize = {width: 0,height:0}; |
95 | mapsize = {width: 0,height:0}; |
|
|
96 | |
|
|
97 | var currentWindow=null; |
|
|
98 | var currentWindowOffset = {x:0,y:0}; |
|
|
99 | var currentWindowResize = false; |
|
|
100 | |
|
|
101 | var xMapWindow = null; |
|
|
102 | var xFloorWindow = null; |
|
|
103 | var xPlayerWindow = null; |
|
|
104 | var pattern = null; |
|
|
105 | var patternImage = null; |
|
|
106 | var isMainCalled = false; |
|
|
107 | var xInfoWindow = null; |
|
|
108 | var xBarsWindow = null; |
|
|
109 | var xCommmandWindow = null; |
|
|
110 | var xChatBoxWindow = null; |
|
|
111 | |
|
|
112 | var wsUri = "ws://testserver.deliantra.net:13327/ws"; |
|
|
113 | //var wsUri = "ws://localhost:13327/ws"; |
102 | |
114 | |
103 | function appendToBody(e){ |
115 | function appendToBody(e){ |
104 | document.getElementsByTagName("body")[0].appendChild(e); |
116 | document.getElementsByTagName("body")[0].appendChild(e); |
105 | } |
117 | } |
106 | |
118 | |
… | |
… | |
141 | skipKeyTest = false; |
153 | skipKeyTest = false; |
142 | }) |
154 | }) |
143 | return div; |
155 | return div; |
144 | |
156 | |
145 | } |
157 | } |
146 | |
|
|
147 | var xMapWindow = null; |
|
|
148 | var xFloorWindow = null; |
|
|
149 | var xPlayerWindow = null; |
|
|
150 | var pattern = null; |
|
|
151 | var patternImage = null; |
|
|
152 | var isMainCalled = false; |
|
|
153 | var xInfoWindow = null; |
|
|
154 | var xBarsWindow = null; |
|
|
155 | var xCommmandWindow = null; |
|
|
156 | var xChatBoxWindow = null; |
|
|
157 | |
|
|
158 | var wsUri = "ws://testserver.deliantra.net:13327/ws"; |
|
|
159 | //var wsUri = "ws://localhost:13327/ws"; |
|
|
160 | |
|
|
161 | function createWebSocket(){ |
|
|
162 | var websocket = new WebSocket(wsUri); |
|
|
163 | websocket.onopen = function(evt) { onOpen(evt) }; |
|
|
164 | websocket.onclose = function(evt) { onClose(evt) }; |
|
|
165 | websocket.onmessage = function(evt) { onMessage(evt) }; |
|
|
166 | websocket.onerror = function(evt) { onError(evt) }; |
|
|
167 | return websocket; |
|
|
168 | } |
|
|
169 | |
|
|
170 | |
|
|
171 | |
158 | |
172 | function createLoginWindow(){ |
159 | function createLoginWindow(){ |
173 | var div = createWindow("login",260,180,stage.stageWidth/2-250/2,stage.stageHeight/2-250/2).contents;; |
160 | var div = createWindow("login",260,180,stage.stageWidth/2-250/2,stage.stageHeight/2-250/2).contents;; |
174 | var login = document.createElement("input"); |
161 | var login = document.createElement("input"); |
175 | login.type = "text"; |
162 | login.type = "text"; |
… | |
… | |
325 | for (var i = 0;i<255;++i){ |
312 | for (var i = 0;i<255;++i){ |
326 | keys.states[i]=0; |
313 | keys.states[i]=0; |
327 | }; |
314 | }; |
328 | |
315 | |
329 | if (isMainCalled==true){ |
316 | if (isMainCalled==true){ |
330 | isMainCalled = true; |
|
|
331 | return; |
317 | return; |
332 | } |
318 | } |
|
|
319 | isMainCalled = true; |
333 | |
320 | |
334 | window.WebSocket = window.WebSocket || window.MozWebSocket; |
321 | window.WebSocket = window.WebSocket || window.MozWebSocket; |
335 | |
322 | |
336 | if (window.WebSocket){ |
323 | if (window.WebSocket){ |
337 | |
324 | |
… | |
… | |
438 | |
425 | |
439 | |
426 | |
440 | } |
427 | } |
441 | }; |
428 | }; |
442 | |
429 | |
443 | var currentWindow=null; |
|
|
444 | var currentWindowOffset = {x:0,y:0}; |
|
|
445 | var currentWindowResize = false; |
|
|
446 | |
430 | |
447 | function showPlayerTab (e,tn){ |
431 | function showPlayerTab (e,tn){ |
448 | |
432 | |
449 | xPlayerWindow.show(true); |
433 | xPlayerWindow.show(true); |
450 | var tabName = tn ? tn : (this.value).split(" ")[0].toLowerCase(); |
434 | var tabName = tn ? tn : (this.value).split(" ")[0].toLowerCase(); |
… | |
… | |
542 | var resNames = ['CS_STAT_RES_PHYS','CS_STAT_RES_MAG','CS_STAT_RES_FIRE','CS_STAT_RES_ELEC','CS_STAT_RES_COLD','CS_STAT_RES_CONF','CS_STAT_RES_ACID', |
526 | var resNames = ['CS_STAT_RES_PHYS','CS_STAT_RES_MAG','CS_STAT_RES_FIRE','CS_STAT_RES_ELEC','CS_STAT_RES_COLD','CS_STAT_RES_CONF','CS_STAT_RES_ACID', |
543 | 'CS_STAT_RES_DRAIN','CS_STAT_RES_GHOSTHIT','CS_STAT_RES_POISON','CS_STAT_RES_SLOW','CS_STAT_RES_PARA','CS_STAT_TURN_UNDEAD','CS_STAT_RES_FEAR', |
527 | 'CS_STAT_RES_DRAIN','CS_STAT_RES_GHOSTHIT','CS_STAT_RES_POISON','CS_STAT_RES_SLOW','CS_STAT_RES_PARA','CS_STAT_TURN_UNDEAD','CS_STAT_RES_FEAR', |
544 | 'CS_STAT_RES_DEPLETE', 'CS_STAT_RES_DEATH', 'CS_STAT_RES_HOLYWORD','CS_STAT_RES_BLIND']; |
528 | 'CS_STAT_RES_DEPLETE', 'CS_STAT_RES_DEATH', 'CS_STAT_RES_HOLYWORD','CS_STAT_RES_BLIND']; |
545 | |
529 | |
546 | content.appendChild(tableLeft = $_("table")); |
530 | content.appendChild(tableLeft = $_("table")); |
547 | tableLeft.style.width="45%"; |
531 | tableLeft.style.width="40%"; |
548 | tableLeft.style.float = "left"; |
532 | tableLeft.style.float = "left"; |
549 | content.appendChild(tableRight = $_("table")); |
533 | content.appendChild(tableRight = $_("table")); |
550 | tableRight.style.width="45%"; |
534 | tableRight.style.width="40%"; |
551 | tableRight.style.float = "right"; |
535 | tableRight.style.float = "right"; |
552 | |
536 | |
553 | for (i=CS_STAT_RESIST_START;i<CS_STAT_RESIST_END;++i){ |
537 | for (i=CS_STAT_RESIST_START;i<CS_STAT_RESIST_END;++i){ |
554 | var table = i%2==0 ? tableLeft : tableRight; |
538 | var table = i%2==0 ? tableLeft : tableRight; |
555 | |
539 | |
… | |
… | |
569 | |
553 | |
570 | |
554 | |
571 | |
555 | |
572 | } |
556 | } |
573 | |
557 | |
574 | /* |
558 | function getItemById(itmid){ |
|
|
559 | var itm = findItem(myItems,itmid); |
|
|
560 | if (itm){ |
|
|
561 | return itm; |
|
|
562 | } |
|
|
563 | itm = findItem(floorItems,itmid); |
|
|
564 | if (itm){ |
|
|
565 | return itm; |
|
|
566 | } |
|
|
567 | for (var s in containers){ |
|
|
568 | if (typeof(containers[s]) == typeof({}) ){ |
|
|
569 | itm = findItem(containers[s],itmid); |
|
|
570 | if (itm){ |
|
|
571 | return itm; |
|
|
572 | } |
575 | |
573 | |
576 | |
574 | } |
577 | CS_STAT_SKILLINFO = 140, |
575 | } |
578 | CS_NUM_SKILLS = 50, |
576 | } |
579 | SF_FIREON = 0x01, |
|
|
580 | SF_RUNON = 0x02, |
|
|
581 | NDI_BLACK = 0, |
|
|
582 | NDI_WHITE = 1, |
|
|
583 | NDI_NAVY = 2, |
|
|
584 | NDI_RED = 3, |
|
|
585 | NDI_ORANGE = 4, |
|
|
586 | NDI_BLUE = 5, |
|
|
587 | NDI_DK_ORANGE = 6, |
|
|
588 | NDI_GREEN = 7, |
|
|
589 | NDI_LT_GREEN = 8, |
|
|
590 | NDI_GREY = 9, |
|
|
591 | NDI_BROWN = 10, |
|
|
592 | NDI_GOLD = 11, |
|
|
593 | NDI_TAN = 12, |
|
|
594 | NDI_MAX_COLOR = 12, |
|
|
595 | NDI_COLOR_MASK = 0x1f, |
|
|
596 | NDI_REPLY = 0x20, |
|
|
597 | NDI_NOCRATE = 0x40, |
|
|
598 | NDI_CLEAR = 0x80, |
|
|
599 | a_none = 0, |
|
|
600 | a_readied = 1, |
|
|
601 | a_wielded = 2, |
|
|
602 | a_worn = 3, |
|
|
603 | a_active = 4, |
|
|
604 | a_applied = 5, |
|
|
605 | F_APPLIED = 0x000F, |
|
|
606 | F_LOCATION = 0x00F0, |
|
|
607 | F_UNPAID = 0x0200, |
|
|
608 | F_MAGIC = 0x0400, |
|
|
609 | F_CURSED = 0x0800, |
|
|
610 | F_DAMNED = 0x1000, |
|
|
611 | F_OPEN = 0x2000, |
|
|
612 | F_NOPICK = 0x4000, |
|
|
613 | F_LOCKED = 0x8000, |
|
|
614 | CF_FACE_NONE = 0, |
|
|
615 | CF_FACE_BITMAP = 1, |
|
|
616 | CF_FACE_XPM = 2, |
|
|
617 | CF_FACE_PNG = 3, |
|
|
618 | CF_FACE_CACHE = 0x10, |
|
|
619 | FACE_FLOOR = 0x80, |
|
|
620 | FACE_COLOR_MASK = 0xf, |
|
|
621 | UPD_LOCATION = 0x01, |
|
|
622 | UPD_FLAGS = 0x02, |
|
|
623 | UPD_WEIGHT = 0x04, |
|
|
624 | UPD_FACE = 0x08, |
|
|
625 | UPD_NAME = 0x10, |
|
|
626 | UPD_ANIM = 0x20, |
|
|
627 | UPD_ANIMSPEED = 0x40, |
|
|
628 | UPD_NROF = 0x80, |
|
|
629 | UPD_SP_MANA = 0x01, |
|
|
630 | UPD_SP_GRACE = 0x02, |
|
|
631 | UPD_SP_LEVEL = 0x04, |
|
|
632 | SOUND_NORMAL = 0, |
|
|
633 | SOUND_SPELL = 1, |
|
|
634 | |
|
|
635 | PICKUP_NOTHING = 0x00000000, |
|
|
636 | |
|
|
637 | PICKUP_DEBUG = 0x10000000, |
|
|
638 | PICKUP_INHIBIT = 0x20000000, |
|
|
639 | PICKUP_STOP = 0x40000000, |
|
|
640 | PICKUP_NEWMODE = 0x80000000, |
|
|
641 | |
|
|
642 | PICKUP_RATIO = 0x0000000F, |
|
|
643 | |
|
|
644 | PICKUP_FOOD = 0x00000010, |
|
|
645 | PICKUP_DRINK = 0x00000020, |
|
|
646 | PICKUP_VALUABLES = 0x00000040, |
|
|
647 | PICKUP_BOW = 0x00000080, |
|
|
648 | |
|
|
649 | PICKUP_ARROW = 0x00000100, |
|
|
650 | PICKUP_HELMET = 0x00000200, |
|
|
651 | PICKUP_SHIELD = 0x00000400, |
|
|
652 | PICKUP_ARMOUR = 0x00000800, |
|
|
653 | |
|
|
654 | PICKUP_BOOTS = 0x00001000, |
|
|
655 | PICKUP_GLOVES = 0x00002000, |
|
|
656 | PICKUP_CLOAK = 0x00004000, |
|
|
657 | PICKUP_KEY = 0x00008000, |
|
|
658 | |
|
|
659 | PICKUP_MISSILEWEAPON = 0x00010000, |
|
|
660 | PICKUP_ALLWEAPON = 0x00020000, |
|
|
661 | PICKUP_MAGICAL = 0x00040000, |
|
|
662 | PICKUP_POTION = 0x00080000, |
|
|
663 | |
|
|
664 | PICKUP_SPELLBOOK = 0x00100000, |
|
|
665 | PICKUP_SKILLSCROLL = 0x00200000, |
|
|
666 | PICKUP_READABLES = 0x00400000, |
|
|
667 | PICKUP_MAGIC_DEVICE = 0x00800000, |
|
|
668 | |
|
|
669 | PICKUP_NOT_CURSED = 0x01000000, |
|
|
670 | |
|
|
671 | PICKUP_JEWELS = 0x02000000, |
|
|
672 | PICKUP_FLESH = 0x04000000; |
|
|
673 | */ |
|
|
674 | |
|
|
675 | function updateItemsList(){ |
577 | function updateItemsList(){ |
676 | var content = xPlayerWindow.getElementsByClassName("player_widnow_content")[0]; |
578 | var content = xPlayerWindow.getElementsByClassName("player_widnow_content")[0]; |
677 | |
579 | |
678 | |
580 | |
679 | content.innerHTML = ""; |
581 | content.innerHTML = ""; |
… | |
… | |
812 | }; |
714 | }; |
813 | xwindow.contents = xwindow.getElementsByClassName("content")[0]; |
715 | xwindow.contents = xwindow.getElementsByClassName("content")[0]; |
814 | xwindow.contents.parent = xwindow; |
716 | xwindow.contents.parent = xwindow; |
815 | xwindow.close = function (){document.getElementsByTagName("body")[0].removeChild(xwindow);}; |
717 | xwindow.close = function (){document.getElementsByTagName("body")[0].removeChild(xwindow);}; |
816 | appendToBody(xwindow); |
718 | appendToBody(xwindow); |
817 | |
|
|
818 | |
|
|
819 | return xwindow; |
719 | return xwindow; |
820 | } |
720 | } |
|
|
721 | |
821 | function onMouseUp (e){ |
722 | function onMouseUp (e){ |
822 | |
723 | |
823 | if (currentWindow!=null){ |
724 | if (currentWindow!=null){ |
824 | currentWindow = null; |
725 | currentWindow = null; |
825 | currentWindowResize = false; |
726 | currentWindowResize = false; |
… | |
… | |
870 | } |
771 | } |
871 | } |
772 | } |
872 | |
773 | |
873 | function channels_addMessage(channelId,o){ |
774 | function channels_addMessage(channelId,o){ |
874 | var ta = channels_get_chat_box("channel_" + channelId); |
775 | var ta = channels_get_chat_box("channel_" + channelId); |
|
|
776 | if (ta == null) |
|
|
777 | return; |
875 | ta.value = ta.value + JSON.stringify(o);; |
778 | ta.value = ta.value + JSON.stringify(o);; |
876 | channels[channelId].newMessages = true; |
779 | channels[channelId].newMessages = true; |
877 | } |
780 | } |
878 | |
781 | |
879 | |
782 | |
… | |
… | |
915 | var e = list[i]; |
818 | var e = list[i]; |
916 | if (e.id != pid)e.style.display = "none";else e.style.display = "block"; |
819 | if (e.id != pid)e.style.display = "none";else e.style.display = "block"; |
917 | }; |
820 | }; |
918 | } |
821 | } |
919 | |
822 | |
|
|
823 | |
|
|
824 | /** |
|
|
825 | * SOCKET EVENTS |
|
|
826 | */ |
920 | function onOpen(evt) |
827 | function onOpen(evt) |
921 | { |
828 | { |
922 | writeToScreen("CONNECTED"); |
829 | writeToScreen("CONNECTED"); |
923 | doSend('version {"clientver":"0.001","client":"deliantra html5 client","osver":"linux","protver":1}'); |
830 | doSend('version {"clientver":"0.001","client":"deliantra html5 client","osver":"linux","protver":1}'); |
924 | } |
831 | } |
925 | |
832 | |
926 | function onClose(evt) |
833 | function onClose(evt) |
927 | { |
834 | { |
928 | writeToScreen("DISCONNECTED"); |
835 | writeToScreen("DISCONNECTED"); |
929 | } |
836 | } |
|
|
837 | function onError(evt) |
|
|
838 | { |
|
|
839 | writeToScreen("ERROR!"); |
|
|
840 | } |
|
|
841 | |
|
|
842 | function onMessage2(data) |
|
|
843 | { |
|
|
844 | var patt=/[0-9a-z_]*[^0-9a-z_]/i; |
|
|
845 | var feed = "" + data.match(patt); |
|
|
846 | feed = feed.substr (0,feed.length -1); |
|
|
847 | if (feed=="nul"){ |
|
|
848 | if (data=="newmap"){ |
|
|
849 | feed="newmap"; |
|
|
850 | }else{ |
|
|
851 | return; |
|
|
852 | } |
|
|
853 | } |
|
|
854 | if ((window['feed_' + feed])&&(typeof(window['feed_' + feed])=="function")){ |
|
|
855 | var retVal = window['feed_' + feed](data,bytes2arr(data),data); |
|
|
856 | if (!retVal){ |
|
|
857 | } |
|
|
858 | }else{ |
|
|
859 | //unhandled feed |
|
|
860 | } |
|
|
861 | } |
|
|
862 | |
|
|
863 | function onMessage(evt) |
|
|
864 | { |
|
|
865 | var data = evt.data; |
|
|
866 | |
|
|
867 | if (data instanceof Blob){ |
|
|
868 | var r = new FileReader (); |
|
|
869 | r.readAsBinaryString (data); |
|
|
870 | r.onloadend = function(progress) { |
|
|
871 | onMessage2 (r.result); |
|
|
872 | }; |
|
|
873 | }else{ |
|
|
874 | onMessage2 (data); |
|
|
875 | } |
|
|
876 | } |
930 | |
877 | |
931 | var exti = { |
878 | var exti = { |
932 | nextId : 100, |
879 | nextId : 100, |
933 | getNextId : function (){ |
880 | getNextId : function (){ |
934 | return this.nextId++; |
881 | return this.nextId++; |
935 | } |
882 | } |
936 | }; |
883 | }; |
937 | |
884 | |
938 | function getItemById(itmid){ |
|
|
939 | var itm = findItem(myItems,itmid); |
|
|
940 | if (itm){ |
|
|
941 | return itm; |
|
|
942 | } |
|
|
943 | itm = findItem(floorItems,itmid); |
|
|
944 | if (itm){ |
|
|
945 | return itm; |
|
|
946 | } |
|
|
947 | for (var s in containers){ |
|
|
948 | if (typeof(containers[s]) == typeof({}) ){ |
|
|
949 | itm = findItem(containers[s],itmid); |
|
|
950 | if (itm){ |
|
|
951 | return itm; |
|
|
952 | } |
|
|
953 | |
885 | |
954 | } |
886 | /** |
955 | } |
887 | * HANDLE FEEDS FROM SERVER |
956 | } |
888 | */ |
957 | |
|
|
958 | function feed_upditem (data,dataAsArray){ |
889 | function feed_upditem (data,dataAsArray){ |
959 | var buff=new Buffer(dataAsArray); |
890 | var buff=new Buffer(dataAsArray); |
960 | buff.position = "upditem ".length; |
891 | buff.position = "upditem ".length; |
961 | var flags = buff.readUint8(); |
892 | var flags = buff.readUint8(); |
962 | var tag = buff.readUint32(); |
893 | var tag = buff.readUint32(); |
… | |
… | |
1090 | } |
1021 | } |
1091 | return false; |
1022 | return false; |
1092 | } |
1023 | } |
1093 | |
1024 | |
1094 | |
1025 | |
1095 | function onKeyDown (keyCode){ |
|
|
1096 | switch(keyCode){ |
|
|
1097 | case 38: |
|
|
1098 | if (keys.ctrl&&!isRunning){ |
|
|
1099 | isRunning = true; |
|
|
1100 | doSend("command run 1"); |
|
|
1101 | //doSend("command north") |
|
|
1102 | } |
|
|
1103 | else |
|
|
1104 | if (!isFiring&&keys.shift){ |
|
|
1105 | doSend("command fire 1"); |
|
|
1106 | isFiring = true; |
|
|
1107 | }else |
|
|
1108 | doSend("command north"); |
|
|
1109 | break; |
|
|
1110 | case 40: |
|
|
1111 | if (keys.ctrl&&!isRunning){ |
|
|
1112 | isRunning = true; |
|
|
1113 | doSend("command run 5" ); |
|
|
1114 | //doSend("command souh") |
|
|
1115 | } |
|
|
1116 | else |
|
|
1117 | if (!isFiring&&keys.shift){ |
|
|
1118 | doSend("command fire 5" ); |
|
|
1119 | isFiring = true; |
|
|
1120 | }else |
|
|
1121 | doSend("command south"); |
|
|
1122 | break; |
|
|
1123 | case 37: |
|
|
1124 | if (keys.ctrl&&!isRunning){ |
|
|
1125 | isRunning = true; |
|
|
1126 | doSend("command run 7" ); |
|
|
1127 | // doSend("command west") |
|
|
1128 | } |
|
|
1129 | else |
|
|
1130 | if (!isFiring&&keys.shift){ |
|
|
1131 | doSend("command fire 7"); |
|
|
1132 | isFiring = true; |
|
|
1133 | }else |
|
|
1134 | doSend("command west"); |
|
|
1135 | break; |
|
|
1136 | case 39: |
|
|
1137 | if (keys.ctrl&&!isRunning){ |
|
|
1138 | isRunning = true; |
|
|
1139 | doSend("command run 3" ); |
|
|
1140 | //doSend("command west") |
|
|
1141 | }else |
|
|
1142 | if (!isFiring&&keys.shift){ |
|
|
1143 | doSend("command fire 3"); |
|
|
1144 | isFiring = true; |
|
|
1145 | }else |
|
|
1146 | doSend("command east"); |
|
|
1147 | break; |
|
|
1148 | case 49: |
|
|
1149 | case 9: |
|
|
1150 | xPlayerWindow.show(!xPlayerWindow.visible() ); |
|
|
1151 | break; |
|
|
1152 | case 67: |
|
|
1153 | skipKeyTest = true; |
|
|
1154 | xCommmandWindow.show(true); |
|
|
1155 | |
|
|
1156 | break; |
|
|
1157 | |
|
|
1158 | case 32: |
|
|
1159 | doSend("command apply"); |
|
|
1160 | break; |
|
|
1161 | case 188: |
|
|
1162 | doSend("command get"); |
|
|
1163 | break; |
|
|
1164 | case 16: |
|
|
1165 | keys.shift = 1; |
|
|
1166 | break; |
|
|
1167 | case 18: |
|
|
1168 | keys.alt = 1; |
|
|
1169 | break; |
|
|
1170 | case 17: |
|
|
1171 | keys.ctrl = 1; |
|
|
1172 | break; |
|
|
1173 | case 113: |
|
|
1174 | showPlayerTab({},"statistics"); |
|
|
1175 | break; |
|
|
1176 | case 114: |
|
|
1177 | showPlayerTab({},"skills"); |
|
|
1178 | break; |
|
|
1179 | |
|
|
1180 | case 115: |
|
|
1181 | showPlayerTab({},"spellbook"); |
|
|
1182 | break; |
|
|
1183 | |
|
|
1184 | case 116: |
|
|
1185 | showPlayerTab({},"inventory"); |
|
|
1186 | break; |
|
|
1187 | default: |
|
|
1188 | //messageBox(keyCode); |
|
|
1189 | break; |
|
|
1190 | } |
|
|
1191 | } |
|
|
1192 | |
|
|
1193 | function onKeyUp(keyCode){ |
|
|
1194 | switch(keyCode){ |
|
|
1195 | case 38: |
|
|
1196 | if (isRunning&&!keys.ctrl){ |
|
|
1197 | doSend("command run_stop"); |
|
|
1198 | isRunning = false; |
|
|
1199 | } |
|
|
1200 | if (isFiring&&!keys.shift){ |
|
|
1201 | doSend("command fire_stop"); |
|
|
1202 | isFiring = false; |
|
|
1203 | } |
|
|
1204 | break; |
|
|
1205 | case 40: |
|
|
1206 | if (isFiring&&!keys.shift){ |
|
|
1207 | doSend("command fire_stop"); |
|
|
1208 | isFiring = false; |
|
|
1209 | } |
|
|
1210 | if (isRunning&&!keys.ctrl){ |
|
|
1211 | doSend("command run_stop"); |
|
|
1212 | isRunning = false; |
|
|
1213 | } |
|
|
1214 | break; |
|
|
1215 | case 37: |
|
|
1216 | if (isFiring&&!keys.shift){ |
|
|
1217 | doSend("command fire_stop"); |
|
|
1218 | isFiring = false; |
|
|
1219 | } |
|
|
1220 | if (isRunning&&!keys.ctrl){ |
|
|
1221 | doSend("command run_stop"); |
|
|
1222 | isRunning = false; |
|
|
1223 | } |
|
|
1224 | break; |
|
|
1225 | case 39: |
|
|
1226 | if (isFiring&&!keys.shift){ |
|
|
1227 | doSend("command fire_stop"); |
|
|
1228 | isFiring = false; |
|
|
1229 | } |
|
|
1230 | if (isRunning&&!keys.ctrl){ |
|
|
1231 | doSend("command run_stop"); |
|
|
1232 | isRunning = false; |
|
|
1233 | } |
|
|
1234 | break; |
|
|
1235 | case 49: |
|
|
1236 | break; |
|
|
1237 | case 16: |
|
|
1238 | keys.shift = 0; |
|
|
1239 | if (isFiring&&!keys.shift){ |
|
|
1240 | doSend("command fire_stop"); |
|
|
1241 | isFiring= false; |
|
|
1242 | } |
|
|
1243 | break; |
|
|
1244 | case 18: |
|
|
1245 | keys.alt = 0; |
|
|
1246 | break; |
|
|
1247 | case 17: |
|
|
1248 | keys.ctrl = 0; |
|
|
1249 | if (isRunning&&!keys.ctrl){ |
|
|
1250 | doSend("command run_stop"); |
|
|
1251 | isRunning = false; |
|
|
1252 | } |
|
|
1253 | break; |
|
|
1254 | default: |
|
|
1255 | //messageBox(e.keyCode); |
|
|
1256 | break; |
|
|
1257 | } |
|
|
1258 | |
|
|
1259 | } |
|
|
1260 | function feed_version (data,dataAsArray){ |
1026 | function feed_version (data,dataAsArray){ |
1261 | var smapsize = Math.floor(xMapWindow.width()/64); |
1027 | var smapsize = Math.floor(xMapWindow.width()/64); |
1262 | mapsize.width = mapsize.height = parseInt(smapsize); |
1028 | mapsize.width = mapsize.height = parseInt(smapsize); |
1263 | smapsize = smapsize +"x" + smapsize; |
1029 | smapsize = smapsize +"x" + smapsize; |
1264 | map_clear(); |
1030 | map_clear(); |
… | |
… | |
1305 | |
1071 | |
1306 | function feed_setup (data,dataAsArray){ |
1072 | function feed_setup (data,dataAsArray){ |
1307 | doSend('exti ["http_faceurl", ' + exti.getNextId() +']'); |
1073 | doSend('exti ["http_faceurl", ' + exti.getNextId() +']'); |
1308 | } |
1074 | } |
1309 | |
1075 | |
1310 | //'', |
|
|
1311 | //'requestinfo spell_paths', |
|
|
1312 | |
|
|
1313 | |
|
|
1314 | function face2tile (){ |
|
|
1315 | |
|
|
1316 | } |
|
|
1317 | |
|
|
1318 | function clear_cell (cell){ |
1076 | function clear_cell (cell){ |
1319 | cell.darkness = 256; |
1077 | cell.darkness = 256; |
1320 | cell.flags = 0; |
1078 | cell.flags = 0; |
1321 | cell.player =0; |
1079 | cell.player =0; |
1322 | cell.tiles = []; |
1080 | cell.tiles = []; |
1323 | |
|
|
1324 | |
|
|
1325 | return cell; |
1081 | return cell; |
1326 | } |
1082 | } |
1327 | |
1083 | |
1328 | function MapCell(){ |
1084 | function MapCell(){ |
1329 | this.previousCell = null; |
1085 | this.previousCell = null; |
… | |
… | |
1573 | ctx.fillStyle = "#000"; |
1329 | ctx.fillStyle = "#000"; |
1574 | ctx.fillRect(0,0,canvas.width,canvas.height); |
1330 | ctx.fillRect(0,0,canvas.width,canvas.height); |
1575 | |
1331 | |
1576 | for (var i = 0;i<mapsize.height;++i){ |
1332 | for (var i = 0;i<mapsize.height;++i){ |
1577 | var cell = map_get_cell_ex(0,i); |
1333 | var cell = map_get_cell_ex(0,i); |
|
|
1334 | var y = i<<6; |
|
|
1335 | var x = 0; |
1578 | for (var j=0;j<mapsize.width;++j){ |
1336 | for (var j=0;j<mapsize.width;++j){ |
1579 | var x = j<<6; |
1337 | x+=64; |
1580 | var y = i<<6; |
1338 | |
1581 | var cellx = cell.data; |
1339 | var cellx = cell.data; |
1582 | for (var z=0;z<=2;++z){ |
1340 | for (var z=0;z<=2;++z){ |
1583 | if (!cellx.tiles[z]) |
1341 | if (!cellx.tiles[z]) |
1584 | continue; |
1342 | continue; |
1585 | var img = tilesInfo.getImgByFaceNum(cellx.tiles[z]); |
1343 | var img = tilesInfo.getImgByFaceNum(cellx.tiles[z]); |
1586 | if (img){ |
1344 | if (img){ |
1587 | ctx.drawImage(img,x,y); |
1345 | ctx.drawImage(img,x,y); |
1588 | }else{ |
1346 | }else{ |
1589 | |
1347 | Faces.request(cellx.tiles[z],"map"); |
1590 | } |
1348 | } |
1591 | } |
1349 | } |
1592 | if ((typeof(cellx.stat_hp) == typeof(1))&&cellx.stat_hp>0){ |
1350 | if ((typeof(cellx.stat_hp) == typeof(1))&&cellx.stat_hp>0){ |
1593 | ctx.fillStyle = "#f00"; |
1351 | ctx.fillStyle = "#f00"; |
1594 | ctx.fillRect(x,y,((255-cellx.stat_hp)/255)*64,8); |
1352 | ctx.fillRect(x,y,((255-cellx.stat_hp)/255)*64,8); |
… | |
… | |
2027 | } |
1785 | } |
2028 | updateItemsList(); |
1786 | updateItemsList(); |
2029 | return false; |
1787 | return false; |
2030 | } |
1788 | } |
2031 | |
1789 | |
2032 | var expTable = [0,1000,3000,7000,15000,31000,63000,98500,145000,210000,290000,400000,530000,695000,895000,1100000,1400000,1750000,2150000,2650000,3200000,3850000,4650000,5500000,6500000,7650000,8800000,10000000,11500000,13500000,15500000,18000000,20500000,23500000,26500000,30000000,34000000,38500000,43000000,48500000,54000000,60500000,67500000,75000000,83000000,91500000,100000000,110000000,120000000,130000000,145000000,160000000,175000000,190000000,210000000,230000000,250000000,275000000,300000000,325000000,350000000,380000000,410000000,445000000,480000000,520000000,560000000,605000000,655000000,705000000,755000000,810000000,870000000,930000000,990000000,1050000000,1100000000,1200000000,1250000000,1350000000,1450000000,1550000000,1650000000,1800000000,1900000000,2000000000,2150000000,2300000000,2450000000,2600000000,2750000000,2900000000,3100000000,3300000000,3500000000,3750000000,4050000000,4350000000,4750000000,5250000000,5850000000,6650000000,7650000000,9000000000,10500000000,13500000000,17000000000,23000000000,32000000000,47000000000,73000000000,120000000000,215000000000,430000000000,935000000000]; |
1790 | var expTable = []; |
2033 | var spellPaths = []; |
1791 | var spellPaths = []; |
|
|
1792 | |
|
|
1793 | |
|
|
1794 | function FaceInfo (){ |
|
|
1795 | this.name = ""; |
|
|
1796 | this.num = -1; |
|
|
1797 | this.type = 0; |
|
|
1798 | this.isLoaded = false; |
|
|
1799 | this.isLoading = false; |
|
|
1800 | this.isPending = false; |
|
|
1801 | this.isRequested = false; |
|
|
1802 | this.requestedBy = ""; |
|
|
1803 | this.resource = null; |
|
|
1804 | this.json = "{}"; |
|
|
1805 | } |
|
|
1806 | |
|
|
1807 | FaceInfo.prototype.request = function (rby){ |
|
|
1808 | this.isRequested = true; |
|
|
1809 | this.requestedBy = rby; |
|
|
1810 | if ((this.name=="")) |
|
|
1811 | return this; |
|
|
1812 | |
|
|
1813 | if ((!this.isPending) && (!this.isLoading)){ |
|
|
1814 | |
|
|
1815 | |
|
|
1816 | this.load(); |
|
|
1817 | } |
|
|
1818 | |
|
|
1819 | return this; |
|
|
1820 | }; |
|
|
1821 | |
|
|
1822 | FaceInfo.prototype.setName = function (name){ |
|
|
1823 | this.name = name; |
|
|
1824 | return this; |
|
|
1825 | }; |
|
|
1826 | |
|
|
1827 | FaceInfo.prototype.setType = function (type){ |
|
|
1828 | this.type = parseInt(type); |
|
|
1829 | return this; |
|
|
1830 | }; |
|
|
1831 | |
|
|
1832 | FaceInfo.prototype.load = function (){ |
|
|
1833 | this.isPending = true; |
|
|
1834 | Faces.load (this); |
|
|
1835 | |
|
|
1836 | } |
|
|
1837 | FaceInfo.prototype.onload = function (){ |
|
|
1838 | this.isPending = false; |
|
|
1839 | this.isLoading = false; |
|
|
1840 | |
|
|
1841 | Faces.onload(this); |
|
|
1842 | } |
|
|
1843 | FaceInfo.prototype.loadStart = function (){ |
|
|
1844 | |
|
|
1845 | this.isPending = false; |
|
|
1846 | this.isLoading = true; |
|
|
1847 | if (this.requestedBy == "map"){//map tile |
|
|
1848 | var img = this.resource = $_("img"); |
|
|
1849 | img.faceInfo = this; |
|
|
1850 | img.addEventListener("load",function (){ img.faceInfo.onload(); }); |
|
|
1851 | img.src = baseURL+ "" + this.name; |
|
|
1852 | |
|
|
1853 | }else{ //json but maybe other types |
|
|
1854 | var req = new XMLHttpRequest(); |
|
|
1855 | req.open('GET', baseURL+""+this.name, false); |
|
|
1856 | req.send(null); |
|
|
1857 | if(req.status == 200){ |
|
|
1858 | this.json = req.responseText; |
|
|
1859 | this.resource = JSON.parse(this.json); |
|
|
1860 | } |
|
|
1861 | this.onload(); |
|
|
1862 | } |
|
|
1863 | } |
|
|
1864 | |
|
|
1865 | var Faces = { |
|
|
1866 | byNum:[], |
|
|
1867 | |
|
|
1868 | nDownloads: 0, |
|
|
1869 | pending : [], |
|
|
1870 | |
|
|
1871 | add : function (id,name){ |
|
|
1872 | var faceInfo = new FaceInfo; |
|
|
1873 | faceInfo.num = id; |
|
|
1874 | this.byNum[id] = faceInfo; |
|
|
1875 | return faceInfo; |
|
|
1876 | }, |
|
|
1877 | getByNum : function (id,createIfNotExist){ |
|
|
1878 | if (createIfNotExist) |
|
|
1879 | return Faces.byNum[id] ? Faces.byNum[id] : Faces.add(id); |
|
|
1880 | return Faces.byNum[id] ? Faces.byNum[id] : null; |
|
|
1881 | }, |
|
|
1882 | request : function (id,by){ |
|
|
1883 | return this.getByNum(id,true).request(by); |
|
|
1884 | }, |
|
|
1885 | |
|
|
1886 | load : function (faceInfo){ |
|
|
1887 | if (this.nDownloads<this.MAXDOWNLOADS){ |
|
|
1888 | this.nDownloads++ |
|
|
1889 | faceInfo.loadStart(); |
|
|
1890 | }else{ |
|
|
1891 | this.pending.push (faceInfo); |
|
|
1892 | } |
|
|
1893 | }, |
|
|
1894 | onload : function (faceInfo){ |
|
|
1895 | alert(this.nDownloads); |
|
|
1896 | this.nDownloads--; |
|
|
1897 | |
|
|
1898 | if ((this.nDownloads<this.MAXDOWNLOADS) && (this.pending.length>0)){ |
|
|
1899 | var faceInfo = this.pending.pop(); |
|
|
1900 | faceInfo.load(); |
|
|
1901 | } |
|
|
1902 | }, |
|
|
1903 | |
|
|
1904 | FT_FACE : 0 * 2 + 0, // faces (images) |
|
|
1905 | FT_MUSIC : 1 * 2 + 1, // background music |
|
|
1906 | FT_SOUND : 2 * 2 + 1, // effects |
|
|
1907 | FT_RSRC : 3 * 2 + 0, // generic data files |
|
|
1908 | |
|
|
1909 | MAXDOWNLOADS : 5 |
|
|
1910 | } |
|
|
1911 | |
2034 | |
1912 | |
2035 | function feed_fx (data,dataAsArray){ |
1913 | function feed_fx (data,dataAsArray){ |
2036 | |
1914 | |
2037 | var buff = new Buffer(dataAsArray); |
1915 | var buff = new Buffer(dataAsArray); |
2038 | buff.position = 3; |
1916 | buff.position = 3; |
2039 | var ignore = true; |
1917 | var out=""; |
|
|
1918 | var type = 0; |
|
|
1919 | var nameX = ""; |
|
|
1920 | var len; |
|
|
1921 | |
2040 | while (buff.position<buff.length){ |
1922 | while (buff.position<buff.length){ |
|
|
1923 | nameX = ""; |
2041 | var id = buff.unpack_w(); |
1924 | var id = buff.unpack_w(); |
|
|
1925 | |
|
|
1926 | if (id == 0){ |
|
|
1927 | buff.readUint8(); |
|
|
1928 | type = buff.unpack_w(); |
|
|
1929 | continue; |
|
|
1930 | } |
2042 | var len = buff.readUint8(); |
1931 | len = buff.readUint8(); |
2043 | var nameX = ""; |
1932 | |
2044 | for (var i = 0;i<len;++i){ |
1933 | for (var i = 0;i<len;++i){ |
2045 | var c = parseInt(buff.readUint8()); |
1934 | var c = parseInt(buff.readUint8()); |
2046 | var out=""; |
1935 | out = ""; |
2047 | out+="0123456789abcdef"[c&0xf]; |
1936 | out+="0123456789abcdef"[c&0xf]; |
2048 | out= "0123456789abcdef"[c>>4]+out; |
1937 | out= "0123456789abcdef"[c>>4]+out; |
2049 | nameX+=out; |
1938 | nameX+=out; |
2050 | } |
1939 | } |
2051 | var img = $_("img"); |
1940 | var faceInfo = Faces.getByNum(id,true); |
2052 | |
1941 | |
2053 | var e; |
1942 | faceInfo.setType (type).setName (nameX); |
2054 | if (tilesInfo.getImgByFaceNum(id)){ |
|
|
2055 | |
1943 | |
2056 | }else{ |
1944 | if (faceInfo.isRequested){ |
2057 | if (nameX.length>3){ |
1945 | faceInfo.load(); |
2058 | if (nameX == "5d7a9b7f65deb9e99ce0dd74560eb0"){ |
|
|
2059 | var req = new XMLHttpRequest(); |
|
|
2060 | req.open('GET', baseURL+""+nameX, false); |
|
|
2061 | req.send(null); |
|
|
2062 | if(req.status == 200) |
|
|
2063 | skillNames = JSON.parse(req.responseText); |
|
|
2064 | }else if (nameX =="6c65c81502952fd958a6f794a0d34c"){ |
|
|
2065 | var req = new XMLHttpRequest(); |
|
|
2066 | req.open('GET', baseURL+""+nameX, false); |
|
|
2067 | req.send(null); |
|
|
2068 | if(req.status == 200) |
|
|
2069 | spellPaths = JSON.parse(req.responseText); |
|
|
2070 | }else if (nameX=="f66e1bc0a5662e59be0253a84ee06c"){ |
|
|
2071 | var req = new XMLHttpRequest(); |
|
|
2072 | req.open('GET', baseURL+""+nameX, false); |
|
|
2073 | req.send(null); |
|
|
2074 | if(req.status == 200) |
|
|
2075 | expTable = JSON.parse(req.responseText); |
|
|
2076 | }else{ |
|
|
2077 | tilesInfo.listLoading.push (e={name:nameX,id:id,img:img,src:baseURL+""+nameX}); |
|
|
2078 | e.img.parent = e; |
|
|
2079 | e.img.onload = function (){tilesInfo.markAsLoaded(this.parent);} |
|
|
2080 | if (!tilesInfo.isLoading){ |
|
|
2081 | |
|
|
2082 | tilesInfo.isLoading = true; |
|
|
2083 | e.img.src = e.src; |
|
|
2084 | //alert("loading: " + e.src); |
|
|
2085 | } |
|
|
2086 | } |
|
|
2087 | }else{ |
|
|
2088 | //alert ("face num " + id + " has name len :" + len + " !!!!"); |
|
|
2089 | //prompt("",dataAsArray); |
|
|
2090 | } |
|
|
2091 | } |
1946 | } |
2092 | } |
1947 | } |
2093 | |
1948 | |
2094 | return false; |
1949 | return false; |
2095 | } |
1950 | } |
|
|
1951 | |
2096 | |
1952 | |
2097 | |
1953 | |
2098 | function feed_newmap (data,dataAsArray){ |
1954 | function feed_newmap (data,dataAsArray){ |
2099 | //messageBox("newmap"); |
1955 | //messageBox("newmap"); |
2100 | map_clear(); |
1956 | map_clear(); |
… | |
… | |
2122 | |
1978 | |
2123 | function feed_anim (data,dataAsArray){ |
1979 | function feed_anim (data,dataAsArray){ |
2124 | return false; |
1980 | return false; |
2125 | } |
1981 | } |
2126 | |
1982 | |
|
|
1983 | function feed_stats (data,dataAsArray){ |
|
|
1984 | var buff = new Buffer(dataAsArray); |
|
|
1985 | buff.position = "stats".length + 1; |
|
|
1986 | while (buff.position < buff.length){ |
|
|
1987 | var stat = buff.readUint8(); |
|
|
1988 | var value; |
|
|
1989 | if (stat_32bit.contains(stat)){ |
|
|
1990 | value = buff.readUint32(); |
|
|
1991 | }else if (stat == CS_STAT_SPEED||stat==CS_STAT_WEAP_SP){ |
|
|
1992 | value = (1/FLOAT_MULTF) * buff.readUint32(); |
|
|
1993 | }else if (stat==CS_STAT_RANGE||stat==CS_STAT_TITLE){ |
|
|
1994 | var len = buff.readUint8(); |
|
|
1995 | value = buff.readString(len); |
|
|
1996 | }else if (stat == CS_STAT_EXP64){ |
|
|
1997 | var hi = buff.readUint32(); |
|
|
1998 | var lo = buff.readUint32(); |
|
|
1999 | value = hi * Math.pow(2,32) + lo; |
|
|
2000 | }else if (stat>=CS_STAT_SKILLINFO && stat < CS_STAT_SKILLINFO + CS_NUM_SKILLS){ |
|
|
2001 | var lvl = buff.readUint8(); |
|
|
2002 | var hi = buff.readUint32(); |
|
|
2003 | var lo = buff.readUint32(); |
|
|
2004 | value = [lvl,hi * Math.pow(2,32) + lo]; |
|
|
2005 | }else{ |
|
|
2006 | value = buff.readUint16(); |
|
|
2007 | if (value > 60000){ |
|
|
2008 | value -= 65536; |
|
|
2009 | } |
|
|
2010 | } |
|
|
2011 | myStats [stat] = value; |
|
|
2012 | //stats_update (stat); |
|
|
2013 | } |
|
|
2014 | |
|
|
2015 | return true; |
|
|
2016 | } |
|
|
2017 | |
|
|
2018 | function feed_player (data,dataAsArray){ |
|
|
2019 | var buff = new Buffer(dataAsArray); |
|
|
2020 | buff.position ="player ".length; |
|
|
2021 | //my ($tag, $weight, $face, $name) = unpack "NNN C/a", $data; |
|
|
2022 | player.tag = buff.readUint32(); |
|
|
2023 | player.weight = buff.readUint32(); |
|
|
2024 | player.face = buff.readUint32(); |
|
|
2025 | var len = buff.readUint8(); |
|
|
2026 | player.name = buff.readString(len); |
|
|
2027 | return false; |
|
|
2028 | } |
|
|
2029 | |
|
|
2030 | function feed_drawinfo (data,dataAsArray){ |
|
|
2031 | return false; |
|
|
2032 | } |
|
|
2033 | |
|
|
2034 | |
|
|
2035 | |
|
|
2036 | var tilesInfo = { |
|
|
2037 | getImgByFaceNum:function (id){ |
|
|
2038 | var fi = Faces.getByNum(id,true); |
|
|
2039 | return fi.resource; |
|
|
2040 | } |
|
|
2041 | } |
|
|
2042 | |
|
|
2043 | |
|
|
2044 | function need_facenum (num){ |
|
|
2045 | |
|
|
2046 | } |
|
|
2047 | |
|
|
2048 | |
|
|
2049 | function feed_map_scroll (data,dataAsArray,base64data){ |
|
|
2050 | |
|
|
2051 | data = data.split(/ /); |
|
|
2052 | data.shift(); |
|
|
2053 | dx += parseInt(data.shift()); |
|
|
2054 | dy += parseInt(data.shift()); |
|
|
2055 | |
|
|
2056 | |
|
|
2057 | } |
|
|
2058 | |
|
|
2059 | function $_(p){ |
|
|
2060 | if (document.getElementById(p)!=null){ |
|
|
2061 | return document.getElementById(p); |
|
|
2062 | }else{ |
|
|
2063 | var ret = document.createElement(p); |
|
|
2064 | unselectable(ret); |
|
|
2065 | return ret; |
|
|
2066 | } |
|
|
2067 | } |
|
|
2068 | var tiles = []; |
|
|
2069 | |
|
|
2070 | |
|
|
2071 | function processExtObj (o){ |
|
|
2072 | switch (o[0]){ |
|
|
2073 | case "channel_info": |
|
|
2074 | channels[o[1].id] = o[1]; |
|
|
2075 | channels.list.push (channels[o[1].id]); |
|
|
2076 | channels[o[1].id].index =channels.length; |
|
|
2077 | channels.length+=1; |
|
|
2078 | return true; |
|
|
2079 | default: |
|
|
2080 | return false; |
|
|
2081 | break; |
|
|
2082 | } |
|
|
2083 | } |
|
|
2084 | |
|
|
2085 | |
|
|
2086 | function doSend(message) |
|
|
2087 | { |
|
|
2088 | writeToScreen("SENT: " + message); |
|
|
2089 | websocket.send( |
|
|
2090 | String.fromCharCode (message.length >> 8) |
|
|
2091 | + String.fromCharCode (message.length & 255) |
|
|
2092 | + message |
|
|
2093 | ); |
|
|
2094 | } |
|
|
2095 | |
|
|
2096 | |
|
|
2097 | /** |
|
|
2098 | * Key up/down handlers |
|
|
2099 | */ |
|
|
2100 | |
|
|
2101 | function onKeyDown (keyCode){ |
|
|
2102 | switch(keyCode){ |
|
|
2103 | case 38: |
|
|
2104 | if (keys.ctrl&&!isRunning){ |
|
|
2105 | isRunning = true; |
|
|
2106 | doSend("command run 1"); |
|
|
2107 | //doSend("command north") |
|
|
2108 | } |
|
|
2109 | else |
|
|
2110 | if (!isFiring&&keys.shift){ |
|
|
2111 | doSend("command fire 1"); |
|
|
2112 | isFiring = true; |
|
|
2113 | }else |
|
|
2114 | doSend("command north"); |
|
|
2115 | break; |
|
|
2116 | case 40: |
|
|
2117 | if (keys.ctrl&&!isRunning){ |
|
|
2118 | isRunning = true; |
|
|
2119 | doSend("command run 5" ); |
|
|
2120 | //doSend("command souh") |
|
|
2121 | } |
|
|
2122 | else |
|
|
2123 | if (!isFiring&&keys.shift){ |
|
|
2124 | doSend("command fire 5" ); |
|
|
2125 | isFiring = true; |
|
|
2126 | }else |
|
|
2127 | doSend("command south"); |
|
|
2128 | break; |
|
|
2129 | case 37: |
|
|
2130 | if (keys.ctrl&&!isRunning){ |
|
|
2131 | isRunning = true; |
|
|
2132 | doSend("command run 7" ); |
|
|
2133 | // doSend("command west") |
|
|
2134 | } |
|
|
2135 | else |
|
|
2136 | if (!isFiring&&keys.shift){ |
|
|
2137 | doSend("command fire 7"); |
|
|
2138 | isFiring = true; |
|
|
2139 | }else |
|
|
2140 | doSend("command west"); |
|
|
2141 | break; |
|
|
2142 | case 39: |
|
|
2143 | if (keys.ctrl&&!isRunning){ |
|
|
2144 | isRunning = true; |
|
|
2145 | doSend("command run 3" ); |
|
|
2146 | //doSend("command west") |
|
|
2147 | }else |
|
|
2148 | if (!isFiring&&keys.shift){ |
|
|
2149 | doSend("command fire 3"); |
|
|
2150 | isFiring = true; |
|
|
2151 | }else |
|
|
2152 | doSend("command east"); |
|
|
2153 | break; |
|
|
2154 | case 49: |
|
|
2155 | case 9: |
|
|
2156 | xPlayerWindow.show(!xPlayerWindow.visible() ); |
|
|
2157 | break; |
|
|
2158 | case 67: |
|
|
2159 | skipKeyTest = true; |
|
|
2160 | xCommmandWindow.show(true); |
|
|
2161 | |
|
|
2162 | break; |
|
|
2163 | |
|
|
2164 | case 32: |
|
|
2165 | doSend("command apply"); |
|
|
2166 | break; |
|
|
2167 | case 188: |
|
|
2168 | doSend("command get"); |
|
|
2169 | break; |
|
|
2170 | case 16: |
|
|
2171 | keys.shift = 1; |
|
|
2172 | break; |
|
|
2173 | case 18: |
|
|
2174 | keys.alt = 1; |
|
|
2175 | break; |
|
|
2176 | case 17: |
|
|
2177 | keys.ctrl = 1; |
|
|
2178 | break; |
|
|
2179 | case 113: |
|
|
2180 | showPlayerTab({},"statistics"); |
|
|
2181 | break; |
|
|
2182 | case 114: |
|
|
2183 | showPlayerTab({},"skills"); |
|
|
2184 | break; |
|
|
2185 | |
|
|
2186 | case 115: |
|
|
2187 | showPlayerTab({},"spellbook"); |
|
|
2188 | break; |
|
|
2189 | |
|
|
2190 | case 116: |
|
|
2191 | showPlayerTab({},"inventory"); |
|
|
2192 | break; |
|
|
2193 | default: |
|
|
2194 | //messageBox(keyCode); |
|
|
2195 | break; |
|
|
2196 | } |
|
|
2197 | } |
|
|
2198 | |
|
|
2199 | function onKeyUp(keyCode){ |
|
|
2200 | switch(keyCode){ |
|
|
2201 | case 38: |
|
|
2202 | if (isRunning&&!keys.ctrl){ |
|
|
2203 | doSend("command run_stop"); |
|
|
2204 | isRunning = false; |
|
|
2205 | } |
|
|
2206 | if (isFiring&&!keys.shift){ |
|
|
2207 | doSend("command fire_stop"); |
|
|
2208 | isFiring = false; |
|
|
2209 | } |
|
|
2210 | break; |
|
|
2211 | case 40: |
|
|
2212 | if (isFiring&&!keys.shift){ |
|
|
2213 | doSend("command fire_stop"); |
|
|
2214 | isFiring = false; |
|
|
2215 | } |
|
|
2216 | if (isRunning&&!keys.ctrl){ |
|
|
2217 | doSend("command run_stop"); |
|
|
2218 | isRunning = false; |
|
|
2219 | } |
|
|
2220 | break; |
|
|
2221 | case 37: |
|
|
2222 | if (isFiring&&!keys.shift){ |
|
|
2223 | doSend("command fire_stop"); |
|
|
2224 | isFiring = false; |
|
|
2225 | } |
|
|
2226 | if (isRunning&&!keys.ctrl){ |
|
|
2227 | doSend("command run_stop"); |
|
|
2228 | isRunning = false; |
|
|
2229 | } |
|
|
2230 | break; |
|
|
2231 | case 39: |
|
|
2232 | if (isFiring&&!keys.shift){ |
|
|
2233 | doSend("command fire_stop"); |
|
|
2234 | isFiring = false; |
|
|
2235 | } |
|
|
2236 | if (isRunning&&!keys.ctrl){ |
|
|
2237 | doSend("command run_stop"); |
|
|
2238 | isRunning = false; |
|
|
2239 | } |
|
|
2240 | break; |
|
|
2241 | case 49: |
|
|
2242 | break; |
|
|
2243 | case 16: |
|
|
2244 | keys.shift = 0; |
|
|
2245 | if (isFiring&&!keys.shift){ |
|
|
2246 | doSend("command fire_stop"); |
|
|
2247 | isFiring= false; |
|
|
2248 | } |
|
|
2249 | break; |
|
|
2250 | case 18: |
|
|
2251 | keys.alt = 0; |
|
|
2252 | break; |
|
|
2253 | case 17: |
|
|
2254 | keys.ctrl = 0; |
|
|
2255 | if (isRunning&&!keys.ctrl){ |
|
|
2256 | doSend("command run_stop"); |
|
|
2257 | isRunning = false; |
|
|
2258 | } |
|
|
2259 | break; |
|
|
2260 | default: |
|
|
2261 | //messageBox(e.keyCode); |
|
|
2262 | break; |
|
|
2263 | } |
|
|
2264 | |
|
|
2265 | } |
|
|
2266 | |
2127 | /* |
2267 | /* |
|
|
2268 | * UTILS |
|
|
2269 | */ |
|
|
2270 | |
|
|
2271 | function decode_base64toArray(s) { |
|
|
2272 | var e={},i,k,v=[],r=[],w=String.fromCharCode; |
|
|
2273 | var n=[[65,91],[97,123],[48,58],[43,44],[47,48]]; |
|
|
2274 | |
|
|
2275 | for(z in n){for(i=n[z][0];i<n[z][1];i++){v.push(w(i));}} |
|
|
2276 | for(i=0;i<64;i++){e[v[i]]=i;} |
|
|
2277 | |
|
|
2278 | for(i=0;i<s.length;i+=72){ |
|
|
2279 | var b=0,c,x,l=0,o=s.substring(i,i+72); |
|
|
2280 | for(x=0;x<o.length;x++){ |
|
|
2281 | c=e[o.charAt(x)];b=(b<<6)+c;l+=6; |
|
|
2282 | while(l>=8){r.push((b>>>(l-=8))%256);} |
|
|
2283 | } |
|
|
2284 | } |
|
|
2285 | return r; |
|
|
2286 | } |
|
|
2287 | |
|
|
2288 | function writeToScreen(message) |
|
|
2289 | { |
|
|
2290 | var d = new Date(); |
|
|
2291 | //Messages.push(new Message(200,(d.getHours() + ":" + d.getMinutes() + ":" + d.getSeconds() ) + ":" + message)); |
|
|
2292 | output.value = d.getHours() + ":" + d.getMinutes() + ":" + d.getSeconds() + ":" + message + "\n" + output.value; |
|
|
2293 | } |
|
|
2294 | |
|
|
2295 | function arr2bytes(arr){ |
|
|
2296 | var s = ""; |
|
|
2297 | for (var i=0;i<arr.length;++i){ |
|
|
2298 | s+=String.fromCharCode(arr[i]); |
|
|
2299 | } |
|
|
2300 | return s; |
|
|
2301 | } |
|
|
2302 | function bytes2arr(s){ |
|
|
2303 | var arr = []; |
|
|
2304 | for (var i=0;i<s.length;++i){ |
|
|
2305 | arr.push(s.charCodeAt(i)); |
|
|
2306 | } |
|
|
2307 | return arr; |
|
|
2308 | } |
|
|
2309 | |
|
|
2310 | function imgFromString (s){ |
|
|
2311 | var img = $_('img'); |
|
|
2312 | img.src = s; |
|
|
2313 | return img; |
|
|
2314 | } |
|
|
2315 | |
|
|
2316 | /* |
2128 | CONSTANTS |
2317 | CONSTANTS |
2129 | */ |
2318 | */ |
2130 | |
2319 | |
2131 | var TICK = 0.120, |
2320 | var TICK = 0.120, |
2132 | CS_QUERY_YESNO = 0x1, |
2321 | CS_QUERY_YESNO = 0x1, |
2133 | CS_QUERY_SINGLECHAR = 0x2, |
2322 | CS_QUERY_SINGLECHAR = 0x2, |
… | |
… | |
2285 | PICKUP_FLESH = 0x04000000; |
2474 | PICKUP_FLESH = 0x04000000; |
2286 | |
2475 | |
2287 | var stat_32bit = [CS_STAT_WEIGHT_LIM,CS_STAT_SPELL_ATTUNE,CS_STAT_SPELL_REPEL,CS_STAT_SPELL_DENY,CS_STAT_EXP]; |
2476 | var stat_32bit = [CS_STAT_WEIGHT_LIM,CS_STAT_SPELL_ATTUNE,CS_STAT_SPELL_REPEL,CS_STAT_SPELL_DENY,CS_STAT_EXP]; |
2288 | |
2477 | |
2289 | |
2478 | |
2290 | function feed_stats (data,dataAsArray){ |
|
|
2291 | var buff = new Buffer(dataAsArray); |
|
|
2292 | buff.position = "stats".length + 1; |
|
|
2293 | while (buff.position < buff.length){ |
|
|
2294 | var stat = buff.readUint8(); |
|
|
2295 | var value; |
|
|
2296 | if (stat_32bit.contains(stat)){ |
|
|
2297 | value = buff.readUint32(); |
|
|
2298 | }else if (stat == CS_STAT_SPEED||stat==CS_STAT_WEAP_SP){ |
|
|
2299 | value = (1/FLOAT_MULTF) * buff.readUint32(); |
|
|
2300 | }else if (stat==CS_STAT_RANGE||stat==CS_STAT_TITLE){ |
|
|
2301 | var len = buff.readUint8(); |
|
|
2302 | value = buff.readString(len); |
|
|
2303 | }else if (stat == CS_STAT_EXP64){ |
|
|
2304 | var hi = buff.readUint32(); |
|
|
2305 | var lo = buff.readUint32(); |
|
|
2306 | value = hi * Math.pow(2,32) + lo; |
|
|
2307 | }else if (stat>=CS_STAT_SKILLINFO && stat < CS_STAT_SKILLINFO + CS_NUM_SKILLS){ |
|
|
2308 | var lvl = buff.readUint8(); |
|
|
2309 | var hi = buff.readUint32(); |
|
|
2310 | var lo = buff.readUint32(); |
|
|
2311 | value = [lvl,hi * Math.pow(2,32) + lo]; |
|
|
2312 | }else{ |
|
|
2313 | value = buff.readUint16(); |
|
|
2314 | if (value > 60000){ |
|
|
2315 | value -= 65536; |
|
|
2316 | } |
|
|
2317 | } |
|
|
2318 | myStats [stat] = value; |
|
|
2319 | //stats_update (stat); |
|
|
2320 | } |
|
|
2321 | |
|
|
2322 | return true; |
|
|
2323 | } |
|
|
2324 | |
|
|
2325 | function feed_player (data,dataAsArray){ |
|
|
2326 | var buff = new Buffer(dataAsArray); |
|
|
2327 | buff.position ="player ".length; |
|
|
2328 | //my ($tag, $weight, $face, $name) = unpack "NNN C/a", $data; |
|
|
2329 | player.tag = buff.readUint32(); |
|
|
2330 | player.weight = buff.readUint32(); |
|
|
2331 | player.face = buff.readUint32(); |
|
|
2332 | var len = buff.readUint8(); |
|
|
2333 | player.name = buff.readString(len); |
|
|
2334 | return false; |
|
|
2335 | } |
|
|
2336 | |
|
|
2337 | function feed_drawinfo (data,dataAsArray){ |
|
|
2338 | return false; |
|
|
2339 | } |
|
|
2340 | |
|
|
2341 | |
|
|
2342 | |
|
|
2343 | var tilesInfo = { |
|
|
2344 | listLoading:[], |
|
|
2345 | listLoaded:[], |
|
|
2346 | |
|
|
2347 | isLoading: false, |
|
|
2348 | getImgByFaceNum:function (id){ |
|
|
2349 | for (var i=0;i<this.listLoaded.length;++i){ |
|
|
2350 | if (this.listLoaded[i].id==id){ |
|
|
2351 | return this.listLoaded[i].img; |
|
|
2352 | } |
|
|
2353 | } |
|
|
2354 | return null; |
|
|
2355 | }, |
|
|
2356 | isImgLoading : function (id){ |
|
|
2357 | for (var i=0;i<this.listLoading.length;++i){ |
|
|
2358 | if (this.listLoading[i].id==id){ |
|
|
2359 | return true; |
|
|
2360 | } |
|
|
2361 | } |
|
|
2362 | return false; |
|
|
2363 | }, |
|
|
2364 | markAsLoaded : function (e){ |
|
|
2365 | var i; |
|
|
2366 | for (i=0;i<this.listLoading.length;++i){ |
|
|
2367 | if (this.listLoading[i].id == e.id){ |
|
|
2368 | this.listLoading.splice(i,1); |
|
|
2369 | break; |
|
|
2370 | } |
|
|
2371 | } |
|
|
2372 | |
|
|
2373 | this.listLoaded.push (e); |
|
|
2374 | this.isLoading = false; |
|
|
2375 | while ((this.listLoading.length>0)&&(this.isLoading==false)){ |
|
|
2376 | |
|
|
2377 | var e2 = this.listLoading.pop(); |
|
|
2378 | if (e2.src.length > baseURL.length + 1){ |
|
|
2379 | this.isLoading = true; |
|
|
2380 | e2.img.src = e2.src; |
|
|
2381 | //alert("loading " + e2.src); |
|
|
2382 | e2.onload = e.onload; |
|
|
2383 | } |
|
|
2384 | } |
|
|
2385 | } |
|
|
2386 | } |
|
|
2387 | |
|
|
2388 | var baseURL = ""; |
|
|
2389 | DrawLater = { |
|
|
2390 | list : [] |
|
|
2391 | }; |
|
|
2392 | |
|
|
2393 | |
|
|
2394 | function imgFromString (s){ |
|
|
2395 | var img = $_('img'); |
|
|
2396 | img.src = s; |
|
|
2397 | return img; |
|
|
2398 | } |
|
|
2399 | |
|
|
2400 | function need_facenum (num){ |
|
|
2401 | var img; |
|
|
2402 | |
|
|
2403 | if (tilesInfo.getImgByFaceNum(num)!=null){ |
|
|
2404 | return; |
|
|
2405 | } |
|
|
2406 | |
|
|
2407 | /*if ( img = localStorage.getItem("face_" + num)){ |
|
|
2408 | |
|
|
2409 | tilesInfo.listLoaded.push({num:num,data: {img:imgFromString(img)}}); |
|
|
2410 | return; |
|
|
2411 | }*/ |
|
|
2412 | } |
|
|
2413 | var dx = 0; |
|
|
2414 | var dy = 0; |
|
|
2415 | |
|
|
2416 | function feed_map_scroll (data,dataAsArray,base64data){ |
|
|
2417 | |
|
|
2418 | data = data.split(/ /); |
|
|
2419 | data.shift(); |
|
|
2420 | dx += parseInt(data.shift()); |
|
|
2421 | dy += parseInt(data.shift()); |
|
|
2422 | |
|
|
2423 | |
|
|
2424 | } |
|
|
2425 | |
|
|
2426 | |
|
|
2427 | function feed_ix (data,dataAsArray,base64data){ |
|
|
2428 | |
|
|
2429 | } |
|
|
2430 | |
|
|
2431 | function arr2bytes(arr){ |
|
|
2432 | var s = ""; |
|
|
2433 | for (var i=0;i<arr.length;++i){ |
|
|
2434 | s+=String.fromCharCode(arr[i]); |
|
|
2435 | } |
|
|
2436 | return s; |
|
|
2437 | } |
|
|
2438 | function bytes2arr(s){ |
|
|
2439 | var arr = []; |
|
|
2440 | for (var i=0;i<s.length;++i){ |
|
|
2441 | arr.push(s.charCodeAt(i)); |
|
|
2442 | } |
|
|
2443 | return arr; |
|
|
2444 | } |
|
|
2445 | function $_(p){ |
|
|
2446 | if (document.getElementById(p)!=null){ |
|
|
2447 | return document.getElementById(p); |
|
|
2448 | }else{ |
|
|
2449 | var ret = document.createElement(p); |
|
|
2450 | unselectable(ret); |
|
|
2451 | return ret; |
|
|
2452 | } |
|
|
2453 | } |
|
|
2454 | var tiles = []; |
|
|
2455 | |
|
|
2456 | function onMessage2(data) |
|
|
2457 | { |
|
|
2458 | var patt=/[0-9a-z_]*[^0-9a-z_]/i; |
|
|
2459 | var feed = "" + data.match(patt); |
|
|
2460 | feed = feed.substr (0,feed.length -1); |
|
|
2461 | if (feed=="nul"){ |
|
|
2462 | if (data=="newmap"){ |
|
|
2463 | feed="newmap"; |
|
|
2464 | }else{ |
|
|
2465 | return; |
|
|
2466 | } |
|
|
2467 | } |
|
|
2468 | if ((window['feed_' + feed])&&(typeof(window['feed_' + feed])=="function")){ |
|
|
2469 | var retVal = window['feed_' + feed](data,bytes2arr(data),data); |
|
|
2470 | if (!retVal){ |
|
|
2471 | //writeToScreen("[" + feed + "] " + data ); |
|
|
2472 | //writeToScreen(dataAsArray); |
|
|
2473 | } |
|
|
2474 | }else{ |
|
|
2475 | //alert('unhandled "feed_' + feed + '"'); |
|
|
2476 | } |
|
|
2477 | } |
|
|
2478 | |
|
|
2479 | function onMessage(evt) |
|
|
2480 | { |
|
|
2481 | var data = evt.data; |
|
|
2482 | |
|
|
2483 | if (data instanceof Blob){ |
|
|
2484 | var r = new FileReader (); |
|
|
2485 | r.readAsBinaryString (data); |
|
|
2486 | r.onloadend = function(progress) { |
|
|
2487 | onMessage2 (r.result); |
|
|
2488 | }; |
|
|
2489 | }else{ |
|
|
2490 | onMessage2 (data); |
|
|
2491 | } |
|
|
2492 | } |
|
|
2493 | |
|
|
2494 | function decode_base64toArray(s) { |
|
|
2495 | var e={},i,k,v=[],r=[],w=String.fromCharCode; |
|
|
2496 | var n=[[65,91],[97,123],[48,58],[43,44],[47,48]]; |
|
|
2497 | |
|
|
2498 | for(z in n){for(i=n[z][0];i<n[z][1];i++){v.push(w(i));}} |
|
|
2499 | for(i=0;i<64;i++){e[v[i]]=i;} |
|
|
2500 | |
|
|
2501 | for(i=0;i<s.length;i+=72){ |
|
|
2502 | var b=0,c,x,l=0,o=s.substring(i,i+72); |
|
|
2503 | for(x=0;x<o.length;x++){ |
|
|
2504 | c=e[o.charAt(x)];b=(b<<6)+c;l+=6; |
|
|
2505 | while(l>=8){r.push((b>>>(l-=8))%256);} |
|
|
2506 | } |
|
|
2507 | } |
|
|
2508 | return r; |
|
|
2509 | } |
|
|
2510 | |
|
|
2511 | |
|
|
2512 | |
|
|
2513 | function processExtObj (o){ |
|
|
2514 | switch (o[0]){ |
|
|
2515 | case "channel_info": |
|
|
2516 | channels[o[1].id] = o[1]; |
|
|
2517 | channels.list.push (channels[o[1].id]); |
|
|
2518 | channels[o[1].id].index =channels.length; |
|
|
2519 | channels.length+=1; |
|
|
2520 | return true; |
|
|
2521 | default: |
|
|
2522 | return false; |
|
|
2523 | break; |
|
|
2524 | } |
|
|
2525 | } |
|
|
2526 | |
|
|
2527 | function onError(evt) |
|
|
2528 | { |
|
|
2529 | writeToScreen("ERROR!"); |
|
|
2530 | } |
|
|
2531 | |
|
|
2532 | function doSend(message) |
|
|
2533 | { |
|
|
2534 | writeToScreen("SENT: " + message); |
|
|
2535 | websocket.send( |
|
|
2536 | String.fromCharCode (message.length >> 8) |
|
|
2537 | + String.fromCharCode (message.length & 255) |
|
|
2538 | + message |
|
|
2539 | ); |
|
|
2540 | } |
|
|
2541 | |
|
|
2542 | function writeToScreen(message) |
|
|
2543 | { |
|
|
2544 | var d = new Date(); |
|
|
2545 | //Messages.push(new Message(200,(d.getHours() + ":" + d.getMinutes() + ":" + d.getSeconds() ) + ":" + message)); |
|
|
2546 | output.value = d.getHours() + ":" + d.getMinutes() + ":" + d.getSeconds() + ":" + message + "\n" + output.value; |
|
|
2547 | } |
|
|
2548 | |
|
|
2549 | function fillFromTemplate(e){ |
|
|
2550 | document.getElementById("text").value = e.value; |
|
|
2551 | } |
|
|
2552 | |
|
|
2553 | isMainScriptLoaded = true; |
2479 | isMainScriptLoaded = true; |
2554 | |
2480 | |
2555 | |
|
|
2556 | //+ Jonas Raoni Soares Silva |
|
|
2557 | //@ http://jsfromhell.com/geral/utf-8 [rev. #1] |
|
|
2558 | |
|
|
2559 | UTF8 = { |
|
|
2560 | encode: function(s){ |
|
|
2561 | for(var c, i = -1, l = (s = s.split("")).length, o = String.fromCharCode; ++i < l; |
|
|
2562 | s[i] = (c = s[i].charCodeAt(0)) >= 127 ? o(0xc0 | (c >>> 6)) + o(0x80 | (c & 0x3f)) : s[i] |
|
|
2563 | ); |
|
|
2564 | return s.join(""); |
|
|
2565 | }, |
|
|
2566 | decode: function(s){ |
|
|
2567 | for(var a, b, i = -1, l = (s = s.split("")).length, o = String.fromCharCode, c = "charCodeAt"; ++i < l; |
|
|
2568 | ((a = s[i][c](0)) & 0x80) && |
|
|
2569 | (s[i] = (a & 0xfc) == 0xc0 && ((b = s[i + 1][c](0)) & 0xc0) == 0x80 ? |
|
|
2570 | o(((a & 0x03) << 6) + (b & 0x3f)) : o(128), s[++i] = "") |
|
|
2571 | ); |
|
|
2572 | return s.join(""); |
|
|
2573 | } |
|
|
2574 | }; |
|
|