wsmud_funny_mobile

wsmud_funny 的手机适用版

  1. // ==UserScript==
  2. // @name wsmud_funny_mobile
  3. // @namespace suqing
  4. // @version 0.1.1
  5. // @author sq
  6. // @match http://*.wsmud.com/*
  7. // @homepage https://gf.qytechs.cn/zh-CN/scripts/382076
  8. // @description wsmud_funny 的手机适用版
  9. // @run-at document-start
  10. // @require http://code.jquery.com/jquery-3.3.1.min.js
  11. // @grant unsafeWindow
  12. // @grant GM_addStyle
  13. // @grant GM_setValue
  14. // @grant GM_deleteValue
  15. // @grant GM_getValue
  16. // @grant GM_setClipboard
  17. // ==/UserScript==
  18.  
  19. (function() {
  20. 'use strict';
  21. let funny = {
  22. version: GM_info.script.version,
  23. data: {},
  24. role: {},
  25. data_skill_limit: 0,
  26. data_login: 0,
  27. data_id: "12345678910",
  28. data_jy: 0,
  29. data_qn: 0,
  30. state: "data.state",
  31. data_autokill_xy: true,
  32. layout_left: true,
  33. };
  34. unsafeWindow.funny = funny;
  35. let fn = {
  36. send: function(message) {
  37. if (typeof message === "string") {
  38. sendmessage(message);
  39. } else if (message instanceof Array) {
  40. action(message);
  41. async function action(message) {
  42. for (const m of message) (typeof m === "number") ? (await fn.sleep(m)) : sendmessage(m);
  43. }
  44. }
  45. function sendmessage(message) {
  46. $("#sendmessage").attr("cmd") ? $("#sendmessage").attr("cmd", message) : $(".container").append($(`<span id="sendmessage" cmd="${message}"><span>`));
  47. $("#sendmessage").click();
  48. }
  49. },
  50. sleep: function(ms) {
  51. return new Promise(resolve => setTimeout(resolve, ms));
  52. },
  53. scroll: function(name) {
  54. if (name === undefined) return;
  55. let a = $(name)[0].scrollTop,
  56. b = $(name)[0].scrollHeight,
  57. h = Math.ceil($(name).height()); // 向上取整
  58. // console.log(`fn.scroll => a=${a} b=${b} h=${h}`);
  59. if (a < b - h) {
  60. let add = (b - h < 120) ? 1 : Math.ceil((b - h) / 120);
  61. $(name)[0].scrollTop = a + add;
  62. setTimeout(`fn.scroll("${name}")`, 1000/120);
  63. }
  64. },
  65. deepCopy: function (object) {
  66. let result = {};
  67. for (const key in object) {
  68. result[key] = typeof object[key] === "object" ? fn.deepCopy(object[key]) : object[key];
  69. }
  70. return result;
  71. },
  72. getTime: function() {
  73. let date = new Date();
  74. let h = parseInt(date.getHours());
  75. let m = parseInt(date.getMinutes());
  76. h = h < 10 ? `0${h}` : `${h}`;
  77. m = m < 10 ? `0${m}` : `${m}`;
  78. return `${h}:${m}`;
  79. },
  80. };
  81. unsafeWindow.fn = fn;
  82. let listener = {
  83. onmessage: function(message) {
  84. let data = message.data;
  85. if (/{(.*)}/.test(data)) data = (new Function(`return ${data};`))();
  86. if (typeof data === "string") {
  87. listener.extends.text.forEach(fn => fn(message));
  88. return;
  89. } else if (typeof data === "object") {
  90. switch (data.type) {
  91. case "roles":
  92. funny.data.roles = data;
  93. break;
  94. case "login":
  95. funny.data.id = data.id;
  96. break;
  97. case "dialog":
  98. listener.extends.dialog.forEach(fn => fn(data));
  99. break;
  100. case "msg":
  101. funny.onmessage_fn.apply(this, arguments);
  102. return;
  103. case "room":
  104. listener.extends.room.forEach(fn => fn(message, data));
  105. return;
  106. case "exits":
  107. break;
  108. case "item":
  109. break;
  110. case "items":
  111. break;
  112. case "itemadd":
  113. listener.extends.itemadd.forEach(fn => fn(data));
  114. break;
  115. case "itemremove":
  116. break;
  117. case "actions":
  118. break;
  119. case "addAction":
  120. break;
  121. case "state":
  122. funny.state = data.state;
  123. listener.extends.state.forEach(fn => fn(message, data));
  124. return;
  125. case "perform":
  126. break;
  127. case "status":
  128. break;
  129. case "combat":
  130. break;
  131. case "dispfm":
  132. break;
  133. case "sc":
  134. break;
  135. case "time":
  136. break;
  137. case "disobj":
  138. break;
  139. default:
  140. console.log(data);
  141. break;
  142. }
  143. }
  144. funny.onmessage_fn.apply(this, arguments);
  145. },
  146. sendmessage: function(message) {
  147. funny.webSocket.send(message);
  148. },
  149. extends: {
  150. text: [],
  151. dialog: [],
  152. msg: [],
  153. room: [],
  154. state: [],
  155. itemadd: [],
  156. },
  157. addListener: function(type, fn) {
  158. listener.extends[type].push(fn);
  159. },
  160. };
  161. unsafeWindow.listener = listener;
  162. listener.addListener("text", function(message) {
  163. let data = message.data;
  164. if (/重新连线|欢迎登陆/.test(data)) {
  165. funny.data_login += 1;
  166. $(".content-message pre").append(`${data}\n`);
  167. if (funny.data_login === 1) {
  168. $(".content-message pre").append(`wsmud_funny_mobile ${funny.version} 苏轻祝您游戏愉快!\n`);
  169. getScore();
  170. }
  171. async function getScore() {
  172. $("[command=score]").click();
  173. await fn.sleep(100);
  174. $("[for=1]").click();
  175. await fn.sleep(100);
  176. $("[for=0]").click();
  177. await fn.sleep(100);
  178. $("[command=skills]").click();
  179. await fn.sleep(100);
  180. $("[command=pack]").click();
  181. await fn.sleep(100);
  182. $("[command=tasks]").click();
  183. await fn.sleep(100);
  184. $("[command=showcombat]").click(); // 点击动作
  185. await fn.sleep(100);
  186. $("[command=showtool]").click(); // 点击菜单
  187. await fn.sleep(1000);
  188. $(".dialog-close").click();
  189. };
  190. } else if (/你获得了(.*)点经验,(.*)点潜能/.test(data)) {
  191. funny.onmessage_fn.apply(this, arguments);
  192. let a = data.match(/你获得了(.*)点经验,(.*)点潜能/);
  193. funny.data_jy += parseInt(a[1]);
  194. funny.data_qn += parseInt(a[2]);
  195. $(".remove_data_jyqn").remove();
  196. $(".content-message pre").append(
  197. $(`<span class="remove_data_jyqn"></span>`)
  198. .append(`合计 => 经验:${funny.data_jy} 潜能:${funny.data_qn}\n`)
  199. );
  200. } else if (/你轻声吟道/.test(data)) {
  201. } else if (/看起来(.*)想杀死你/.test(data)) {
  202. let a = data.match(/看起来(.*)想杀死你!/);
  203. $(".content-message pre").append(`<hir>${a[1]} => 开始攻击你!<hir>\n`);
  204. } else if (/你对著(.*)喝道/.test(data)) {
  205. let a = data.match(/你对著(.*)喝道/);
  206. $(".content-message pre").append(`<hir>你 => 开始攻击${a[1]}!<hir>\n`);
  207. } else if (/你扑向(.*)/.test(data)) {
  208. let a = data.match(/你扑向(.*)!/);
  209. $(".content-message pre").append(`<hir>你 => 开始攻击${a[1]}!<hir>\n`);
  210. } else if (/造成(.*)点/.test(data)) {
  211. let a = data.split(/.*造成<wht>|.*造成<hir>|<\/wht>点|<\/hir>点/);
  212. let b = a[2].split(/伤害|\(|</);
  213. if (b[0] === "暴击") {
  214. $(".content-message pre").append(`${b[2]}受到<hir>${a[1]}</hir>点<hir>${b[0]}</hir>伤害!\n`);
  215. } else {
  216. $(".content-message pre").append(`${b[2]}受到<wht>${a[1]}</wht>点伤害!\n`);
  217. }
  218. } else if (/你的最大内力增加了/.test(data)) {
  219. funny.onmessage_fn.apply(this, arguments);
  220. let a = data.match(/你的最大内力增加了(.*)点。/);
  221. let n = parseInt(a[1]),
  222. max = parseInt(funny.role.max_mp),
  223. limit = parseInt(funny.role.limit_mp);
  224. let time = (limit - max) / (n * 6); // X分钟 => X小时X分钟
  225. let timeString = time < 60 ? `${parseInt(time)}分钟` : `${parseInt(time / 60)}小时${parseInt(time % 60)}分钟`;
  226. $(".remove_dzsj").remove();
  227. $(".content-message pre").append(`<span class="remove_dzsj">当前内力: ${max}\n上限内力: ${limit}\n需要时间: ${timeString}\n</span>`);
  228. } else if (/无数花瓣夹杂着寒气/.test(data)) {
  229. let a = data.match(/无数花瓣夹杂着寒气将(.*)围起/);
  230. $(".content-message pre").append(`<him>「太上忘情」 => ${a[1]}(无法躲闪)</him>\n`);
  231. } else if (/数息后只留下一堆玄色石头/.test(data)) {
  232. let a = data.match(/只见(.*)发出一阵白光/);
  233. $(".content-message pre").append(`你分解了 => ${a[1]}\n`);
  234. } else {
  235. funny.onmessage_fn.apply(this, arguments);
  236. }
  237. fn.scroll(".content-message");
  238. });
  239.  
  240. // tasks
  241. listener.addListener("dialog", function(data) {
  242. if (data.dialog === "tasks" && data.items) {
  243. let fb, qa, wd1, wd2, wd3, sm1, sm2, ym1, ym2, yb1, yb2;
  244. data.items.forEach(item => {
  245. if (item.state === 2) fn.send(`taskover ${item.id}`); // 自动完成
  246. if (item.id === "signin") {
  247. let a = item.desc.match(/师门任务:(.*),副本:<(.*)>(.*)\/20<(.*)>/);
  248. let b = item.desc.match(/(.*)武道塔(.*),进度(.*)\/(.*)<(.*)>,<(.*)>(.*)首席请安。<(.*)>/);
  249. (parseInt(a[3]) < 20) ? fb = `<hig>${a[3]}</hig>` : fb = a[3];
  250. (parseInt(b[3]) < parseInt(b[4])) ? wd1 = `<hig>${b[3]}</hig>` : wd1 = b[3];
  251. wd2 = b[4];
  252. /可以重置/.test(b[2]) ? wd3 = "<hig>可以重置</hig>" : wd3 = "已经重置";
  253. /已经/.test(b[7]) ? qa = "已经请安" : qa = "<hig>尚未请安</hig>";
  254. } else if (item.id === "sm") {
  255. let a = item.desc.match(/目前完成(.*)\/20个,共连续完成(.*)个。/);
  256. (parseInt(a[1]) < 20) ? sm1 = `<hig>${a[1]}</hig>` : sm1 = a[1];
  257. sm2 = a[2];
  258. } else if (item.id === "yamen") {
  259. let a = item.desc.match(/目前完成(.*)\/20个,共连续完成(.*)个。/);
  260. (parseInt(a[1]) < 20) ? ym1 = `<hig>${a[1]}</hig>` : ym1 = a[1];
  261. ym2 = a[2];
  262. } else if (item.id === "yunbiao") {
  263. let a = item.desc.match(/本周完成(.*)\/20个,共连续完成(.*)个。/);
  264. (parseInt(a[1]) < 20) ? yb1 = `<hig>${a[1]}</hig>` : yb1 = a[1];
  265. yb2 = a[2];
  266. }
  267. });
  268. let html = `门派请安 => ${qa}\n武道之塔 => ${wd1}/${wd2} ${wd3}\n`;
  269. html += `日常副本 => ${fb}/20\n师门任务 => ${sm1}/20 ${sm2}连\n`;
  270. html += `衙门追捕 => ${ym1}/20 ${ym2}连\n每周运镖 => ${yb1}/20 ${yb2}连\n`;
  271. $(".remove_tasks").remove();
  272. $(".content-message pre").append($(`<span class="remove_tasks"><span>`).html(html));
  273. fn.scroll(".content-message");
  274. }
  275. });
  276.  
  277. // score
  278. listener.addListener("dialog", function(data) {
  279. if (data.dialog === "score") {
  280. for (const key in data) funny.role[key] = data[key];
  281. }
  282. });
  283.  
  284. // skills
  285. listener.addListener("dialog", function(data) {
  286. if (data.dialog === "skills") {
  287. funny.skills = data.items || funny.skills || [];
  288. if (data.items) {
  289. funny.data_skill_limit = parseInt(data.limit);
  290. } else if (data.id && data.exp) {
  291. if (data.level) {
  292. for (const skill of funny.skills) {
  293. if (skill.id === data.id) {
  294. skill.level = data.level;
  295. break;
  296. }
  297. }
  298. }
  299. let name = "", k = 0, level = 0;
  300. let djsx = funny.data_skill_limit; // 上限
  301. let xxxl = parseInt(funny.role.study_per); // 学习效率
  302. let lxxl = parseInt(funny.role.lianxi_per); // 练习效率
  303. let xtwx = parseInt(funny.role.int); // 先天悟性
  304. let htwx = parseInt(funny.role.int_add); // 后天悟性
  305. if (funny.skills) {
  306. for (const skill of funny.skills) {
  307. if (skill.id === data.id) {
  308. name = skill.name;
  309. level = parseInt(skill.level);
  310. if (/<wht>.*/.test(name)) k = 1; // 白
  311. if (/<hig>.*/.test(name)) k = 2;
  312. if (/<hic>.*/.test(name)) k = 3;
  313. if (/<hiy>.*/.test(name)) k = 4;
  314. if (/<hiz>.*/.test(name)) k = 5;
  315. if (/<hio>.*/.test(name)) k = 6; // 橙
  316. if (/<hir>.*/.test(name)) k = 7; // 红
  317. break;
  318. }
  319. }
  320. }
  321. let qianneng = (djsx * djsx - level * level) * 2.5 * k;
  322. if (funny.state === "你正在练习技能") {
  323. let time = qianneng / (xtwx + htwx) / (1 + lxxl / 100 - xtwx / 100) / 12;
  324. let timeString = time < 60 ? `${parseInt(time)}分钟` : `${parseInt(time / 60)}小时${parseInt(time % 60)}分钟`;
  325. $(".remove_lx").remove();
  326. // 练习每一跳的消耗公式=(先天悟性+后天悟性)×(1+练习效率%-先天悟性%)
  327. $(".content-message pre").append(`练习${name}消耗了${parseInt(qianneng / time / 12)}点潜能。\n`);
  328. $(".content-message pre").append(`<span class="remove_lx">角色悟性: ${xtwx}+${htwx}\n练习效率: ${lxxl}%\n等级上限: ${djsx}级\n需要潜能: ${qianneng}\n需要时间: ${timeString}\n</span>`);
  329. fn.scroll(".content-message");
  330. } else if (funny.state === "你正在读书") {
  331. // 学习每一跳的消耗公式=(先天悟性+后天悟性)×(1+学习效率%-先天悟性%)×3
  332. let cost = (xtwx + htwx) * (1 + xxxl / 100 - xtwx / 100) * 3;
  333. $(".content-message pre").append(`学习${name}消耗了${parseInt(cost)}点潜能。\n`);
  334. if (funny.data.id === "j9h729c52bc") {
  335. let time = qianneng / cost / 12;
  336. let timeString = time < 60 ? `${parseInt(time)}分钟` : `${parseInt(time / 60)}小时${parseInt(time % 60)}分钟`;
  337. $(".content-message pre").append(`练满时间 => ${timeString}\n`);
  338. }
  339. fn.scroll(".content-message");
  340. }
  341. }
  342. }
  343. });
  344. // pack
  345. listener.addListener("dialog", function(data) {
  346. if (data.dialog === "pack") {
  347.  
  348. if (data.can_use == 1 && /养精丹|朱果|潜灵果/.test(data.name)) {
  349. let count = data.count > 10 ? 10 : data.count;
  350. let cmd = [];
  351. for (let i = 0; i < count; i ++) {
  352. cmd.push(`use ${data.id}`);
  353. cmd.push(500);
  354. }
  355. $(".content-message pre").append(
  356. $(`<div class="item-commands"></div>`).append(
  357. $(`<span>快捷使用${count}次 => ${data.name}</span>`).click(() => {
  358. fn.send(cmd);
  359. }),
  360. ),
  361. );
  362. }
  363.  
  364. if (data.name) {
  365. if (/<hig>大宋(.*)<\/hig>|<hig>蒙古(.*)<\/hig>|<hig>笠子帽<\/hig>/.test(data.name)) {
  366. fn.send(`fenjie ${data.id}`);
  367. }
  368. }
  369. }
  370. });
  371.  
  372. listener.addListener("room", function(message, data) {
  373. if (/cmd cmd=/.test(data.desc)) {
  374. data.desc = data.desc.replace("<hig>椅子</hig>", "椅子");
  375. let a = data.desc.match(/<cmd cmd='([^']+)'>([^<]+)<\/cmd>/g);
  376. a.forEach(desc => data.desc = `<hic>${desc}</hic> ${data.desc}`);
  377. let mask = fn.deepCopy(message);
  378. mask.data = JSON.stringify(data);
  379. funny.onmessage_fn.apply(this, [mask]);
  380. } else {
  381. funny.onmessage_fn.apply(this, [message]);
  382. }
  383. });
  384. listener.addListener("state", function(message, data) {
  385. if (data.desc && data.desc.length > 0) {
  386. data.desc = [];
  387. let mask = fn.deepCopy(message);
  388. mask.data = JSON.stringify(data);
  389. funny.onmessage_fn.apply(this, [mask]);
  390. } else {
  391. funny.onmessage_fn.apply(this, [message]);
  392. }
  393. });
  394.  
  395. listener.addListener("itemadd", function(data) {
  396. if (/蒙古兵|十夫长|百夫长|千夫长|万夫长/.test(data.name)) {
  397. if (data.id) fn.send(`kill ${data.id}`);
  398. }
  399. });
  400.  
  401.  
  402.  
  403. if (WebSocket) {
  404. unsafeWindow.WebSocket = function(url) {
  405. funny.webSocket = new WebSocket(url);
  406. };
  407. unsafeWindow.WebSocket.prototype = {
  408. get url() {
  409. return funny.webSocket.url;
  410. },
  411. get protocol() {
  412. return funny.webSocket.protocol;
  413. },
  414. get readyState() {
  415. return funny.webSocket.readyState;
  416. },
  417. get bufferedAmount() {
  418. return funny.webSocket.bufferedAmount;
  419. },
  420. get extensions() {
  421. return funny.webSocket.extensions;
  422. },
  423. get binaryType() {
  424. return funny.webSocket.binaryType;
  425. },
  426. set binaryType(type) {
  427. funny.webSocket.binaryType = type;
  428. },
  429. get onerror() {
  430. return funny.webSocket.onerror;
  431. },
  432. set onerror(fn) {
  433. funny.webSocket.onerror = fn;
  434. },
  435. get onopen() {
  436. return funny.webSocket.onopen;
  437. },
  438. set onopen(fn) {
  439. funny.webSocket.onopen = fn;
  440. },
  441. get onclose() {
  442. return funny.webSocket.onclose;
  443. },
  444. set onclose(fn) {
  445. funny.webSocket.onclose = fn;
  446. },
  447. close: function () {
  448. funny.webSocket.close();
  449. },
  450. get onmessage() {
  451. return funny.webSocket.onmessage;
  452. },
  453. set onmessage(fn) {
  454. funny.onmessage_fn = fn;
  455. funny.webSocket.onmessage = listener.onmessage;
  456. },
  457. send: function (message) {
  458. listener.sendmessage(message);
  459. },
  460. };
  461. };
  462.  
  463. $(document).ready(function() {
  464. GM_addStyle(`.room_desc{overflow:hidden;white-space:nowrap;}`);
  465. GM_addStyle(`.content-bottom{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;}`);
  466. });
  467. })();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址