Client_CustomTerminal.cs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. function clientCmdCt_startControl(%name, %sx, %sy) {
  2. echo("startControl " @ %name);
  3. $ct_oldText[%name] = "";
  4. $ct_sx[%name] = %sx;
  5. $ct_sy[%name] = %sy;
  6. $ct_controlActive[%name] = 1;
  7. }
  8. function clientCmdCt_stopControl(%name) {
  9. echo("stopControl " @ %name);
  10. $ct_oldText[%name] = "";
  11. $ct_sx[%name] = "";
  12. $ct_sy[%name] = "";
  13. $ct_controlActive[%name] = "";
  14. }
  15. $ct_hexVals[0] = 0; $ct_hexVals[1] = 1; $ct_hexVals[2] = 2; $ct_hexVals[3] = 3; $ct_hexVals[4] = 4; $ct_hexVals[5] = 5; $ct_hexVals[6] = 6; $ct_hexVals[7] = 7; $ct_hexVals[8] = 8; $ct_hexVals[9] = 9; $ct_hexVals[10] = A; $ct_hexVals[11] = B; $ct_hexVals[12] = C; $ct_hexVals[13] = D; $ct_hexVals[14] = E; $ct_hexVals[15] = F;
  16. function ct_toHex2(%v) {
  17. if(%v<0 || %v>255) { echo("ct_toHex2 - invalid value " @ %v); return; }
  18. return $ct_hexVals[mFloor(%v/16)] @ $ct_hexVals[%v % 16];
  19. }
  20. function ct_encodeUpdateData(%x, %y, %str) {
  21. %data = ct_toHex2(%x) @ ct_toHex2(%y) @ ct_toHex2(strLen(%str)) @ %str;
  22. }
  23. function ct_encodeUpdateDataIdx(%name, %i, %str) {
  24. %sx = $ct_sx[%name];
  25. %x = %i % %sx;
  26. %y = mFloor(%i / %sx);
  27. return ct_encodeUpdateData(%x, %y, %str);
  28. }
  29. function ct_mMax(%a, %b) {
  30. return %a>%b ? %a : %b;
  31. }
  32. function ct_sendUpdate(%name, %data) {
  33. if(!$ct_controlActive[%name]) { echo("ct_sendUpdate - control is not active for " @ %name); return; }
  34. commandToServer('ct_updateScreen', %name, %data);
  35. }
  36. function ct_sendString(%name, %x, %y, %str) {
  37. if(!$ct_controlActive[%name]) { echo("ct_sendString - control is not active for " @ %name); return; }
  38. %data = ct_encodeUpdateData(%x, %y, %str);
  39. ct_sendUpdate(%name, %data);
  40. }
  41. // nice algorithm but fuckin' slow once the screen fills up, probably have to do something else, or maybe this in lua
  42. function ct_sendDiff(%name, %newText) {
  43. if(!$ct_controlActive[%name]) { echo("ct_sendDiff - control is not active for " @ %name); return; }
  44. %oldText = $ct_oldText[%name];
  45. %len = ct_mMax(strLen(%newText), strLen(%oldText));
  46. %data = ""; %dataLen = 0;
  47. %runStr = ""; %runStart = "";
  48. for(%i=0; %i<%len; %i++) {
  49. %cn = getSubStr(%newText, %i, 1);
  50. %co = getSubStr(%oldText, %i, 1);
  51. if(%cn !$= %co) {
  52. %runStr = %runStr @ (%cn$="" ? " " : %cn);
  53. if(%runStart $= "") %runStart = %i;
  54. }
  55. if((%cn $= %co || %runLen >= 249) && %runLen > 0) {
  56. %newData = ct_encodeUpdateDataIdx(%name, %runStart, %runStr);
  57. %runStr = ""; %runStart = "";
  58. %newLen = strLen(%newData);
  59. if(%newLen + %dataLen > 255) {
  60. ct_sendUpdate(%name, %data);
  61. %data = "";
  62. %dataLen = 0;
  63. }
  64. %data = %data @ %newData;
  65. %dataLen += %newLen;
  66. }
  67. }
  68. if(%runStart !$= "") {
  69. %newData = ct_encodeUpdateDataIdx(%name, %runStart, %runStr);
  70. %runStr = ""; %runStart = "";
  71. %newLen = strLen(%newData);
  72. if(%newLen + %dataLen > 255) {
  73. ct_sendUpdate(%name, %data);
  74. %data = "";
  75. %dataLen = 0;
  76. }
  77. %data = %data @ %newData;
  78. %dataLen += %newLen;
  79. }
  80. if(%dataLen > 0) {
  81. ct_sendUpdate(%name, %data);
  82. %data = "";
  83. %dataLen = 0;
  84. }
  85. $ct_oldText[%name] = %newText;
  86. }
  87. // Testing
  88. function clientCmdCt_inputKey(%name, %idx, %key, %state) {
  89. //echo("inputKey " @ %name SPC %idx SPC %key SPC %state);
  90. if(%state) {
  91. $ct_testStr = $ct_testStr @ %key;
  92. if(strLen($ct_testStr) >= $ct_sx[%name] * $ct_sy[%name]) {
  93. $ct_testStr = %key;
  94. }
  95. ct_sendDiff(%name, $ct_testStr);
  96. }
  97. }