Advertisement
Guest User

Untitled

a guest
May 23rd, 2019
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 22.88 KB | None | 0 0
  1. javascript: (function() {
  2. const TIMER_SECONDS = 10000;
  3. const INCOMING_IFRAMEID = 'iframe_incoming';
  4. const MAIN_FRAMEID = 'iframe_main';
  5. const SCAVENGE_FRAMEID = 'iframe_scavenge';
  6.  
  7. const SCREEN_URLS = {
  8. INCOMING: 'incoming',
  9. PLACE: 'place',
  10. MAIN: 'main',
  11. SCAVENGE: 'scavenge'
  12. };
  13.  
  14. document.body.innerHTML += `
  15. <style>
  16. iframe {
  17. width: 400px;
  18. display: inline-block;
  19. float: left;
  20. height: 375px;
  21. }
  22. body {
  23. margin-top: 50px;
  24. }
  25. tr.shadedBG {
  26. border-top: 5px solid #8e4a33;
  27. display: inline-block;
  28. }
  29. .one-box {
  30. display: inline-block;
  31. width: 400px;
  32. background: white;
  33. vertical-align: top;
  34. margin: 10px;
  35. border: 1px solid brown;
  36. }
  37. .one-box * {
  38. box-sizing: border-box;
  39. }
  40. .one-box .one-box__title{
  41. line-height: 20px;
  42. font-weight: bold;
  43. padding: 5px;
  44. text-align: center;
  45. font-size: 1.4em;
  46. }
  47. .one-box .one-box__button {display: inline-block;
  48. width: calc(100% - 10px);
  49. line-height: 20px;
  50. font-size: 16px;
  51. cursor: pointer;
  52. background: lightblue;
  53. padding: 5px;
  54. text-align: center;
  55. }
  56. .one-box .one-box__content {
  57. display: block;
  58. max-height: 0;
  59. overflow:hidden;
  60. }
  61. .one-box.open .one-box__content {
  62. display: block;
  63. max-height: 1000px;
  64. margin-top: 10px;
  65. padding: 10px;
  66. padding-top: 0px;
  67. border: 1px solid black;
  68. text-align: left;
  69. }
  70.  
  71. .one-box.open .one-box__button {
  72. background: lightgray;
  73. }
  74. .one-box .one-box__action {
  75. margin: 3px;
  76. border-radius: 5px;
  77. border: 1px solid black;
  78. padding: 5px;
  79. display: inline-block;
  80. }
  81. .one-box label {
  82. display:inline-block;
  83. color:#444;
  84. font-weight: bold;
  85. font-size: 0.75em;
  86. font-size: 10px;
  87. text-align:left;
  88. display:inline-block;
  89. width: 100%;
  90. }
  91. .one-box .input-box{
  92. display: inline-block;
  93. width: 50%;
  94. float: left;
  95. padding-right: 10px;
  96. margin-bottom: 10px;
  97. }
  98. .one-box input {
  99. display:inline-block;
  100. width: 100%;
  101. }
  102. hr {
  103. clear: both;
  104. }
  105. .two-buttons{
  106. width: 100%;
  107. }
  108. .two-buttons div+div {
  109. background: blue;
  110. color: white;
  111. border: 1px solid darkblue;
  112. cursor:pointer;
  113. }
  114. .two-buttons div+div:hover {
  115. box-shadow: 0px 2px 3px rgba(20,20,20,0.13);
  116. }
  117. </style>`;
  118. function applyRetry(callbackFunction, attempts = 10) {
  119. var succeeded = false;
  120. var incr = 0;
  121. var intervalTick = setInterval(() => {
  122. if (succeeded != true && incr < attempts) {
  123. try {
  124. incr++;
  125. succeeded = true;
  126. callbackFunction();
  127. } catch (e) {
  128. succeeded = false;
  129. }
  130. } else {
  131. removeInterval();
  132. }
  133. }, 2000);
  134.  
  135. function removeInterval() {
  136. clearInterval(intervalTick);
  137. }
  138. }
  139.  
  140. function getRandomArbitrary(min, max) {
  141. return Math.random() * (max - min) + min;
  142. }
  143.  
  144. function setLaunchTimeout(arrivalTime, iframeId) {
  145. applyRetry(() => {
  146. var commandDuration = _GET_('.relative_time', iframeId).dataset.duration;
  147. _GET_(
  148. 'body',
  149. iframeId
  150. ).innerHTML += `<style>#command-data-form:not([name="units"]) {
  151. position: fixed;
  152. z-index: 1000000;
  153. width: 100%;
  154. background: #f7f1df;
  155. top: 0;
  156. left: 0;
  157. right: 0;
  158. padding: 15px;
  159. }</style>`;
  160. var snapshotDate = new Date();
  161.  
  162. var arrivalTimeJS = new Date(
  163. `${arrivalTime.month}-${arrivalTime.day}-${snapshotDate.getFullYear()}`
  164. );
  165.  
  166. console.warn(iframeId, arrivalTimeJS.toString(), snapshotDate.toString());
  167. arrivalTimeJS.setHours(+arrivalTime.hour);
  168. arrivalTimeJS.setMinutes(+arrivalTime.minute);
  169. arrivalTimeJS.setSeconds(+arrivalTime.second);
  170.  
  171. var diffMs = arrivalTimeJS - snapshotDate - commandDuration * 1000;
  172. console.warn('SLT', arrivalTime, iframeId);
  173. console.warn(iframeId + ' lanseaza in ' + diffMs + ' secunde');
  174. if (diffMs > -1) {
  175. setTimeout(() => {
  176. simulateClick(_GET_('#troop_confirm_go', iframeId));
  177. }, diffMs);
  178. } else simulateClick(_GET_('#troop_confirm_go', iframeId));
  179. });
  180. }
  181.  
  182. function SEND_EACH_INPUT() {
  183. parseInputs().forEach((pairOfVillages, index) => {
  184. setTimeout(() => {
  185. ATTACK_A_TO_B(pairOfVillages);
  186. }, index * 700);
  187. });
  188. }
  189.  
  190. function checkDistance(origin, target) {
  191. var originCoords = {
  192. x: origin.split('|')[0],
  193. y: origin.split('|')[1]
  194. };
  195. var targetCoords = {
  196. x: target.split('|')[0],
  197. y: target.split('|')[1]
  198. };
  199.  
  200. var xDist = Math.abs(originCoords.x - targetCoords.x);
  201. var yDist = Math.abs(originCoords.y - targetCoords.y);
  202.  
  203. return Math.sqrt(xDist * xDist + yDist * yDist);
  204. }
  205. var acTime = new Date();
  206. $menu = $(
  207. `<div class="" style="background:rgba(100,100,100,0.2);padding:15px;"></div>`
  208. ).html(
  209. `<div class="order-time">
  210. <div class="input-box"> <label>Zi</label><input data-role="day" type="text" value="${acTime.getDate()}"></div>
  211. <div class="input-box"> <label>Luna</label><input data-role="month" type="text" value="${acTime.getMonth()+1}"></div>
  212. <hr/>
  213. <div class="input-box"> <label>Ora</label><input data-role="hour" type="text"></div>
  214. <div class="input-box"> <label>Minut</label><input data-role="minute" type="text"></div>
  215. <div class="input-box"> <label>Secunda</label><input data-role="second" type="text"></div>
  216. </div>
  217. <hr/>
  218. <div class="input-box"> <label>Tinta (XXX|YYY):</label><input id="input-target"></div>
  219. <div class="input-box"> <label>RANGE MINIM:</label><input id="input-minim"></div>
  220. <div class="input-box"> <label>RANGE MAXIM:</label><input id="input-maxim"></div>
  221. <div class="input-box"> <label>Include Nobili in full:</label><input id="input-nobili" type="checkbox"></div>
  222.  
  223. <hr/>`
  224. );
  225.  
  226. $menuVillages = $(
  227. `<div class="" style="background:rgba(100,100,100,0.2);padding:15px;"></div>`
  228. ).html(
  229. `<div class="order-time-villages">
  230. <div class="input-box"> <label>Zi</label><input data-role="day" type="text" value="${acTime.getDate()}"></div>
  231. <div class="input-box"> <label>Luna</label><input data-role="month" type="text" value="${acTime.getMonth()+1}"></div>
  232. <hr/>
  233. <div class="input-box"> <label>Ora</label><input data-role="hour" type="text"></div>
  234. <div class="input-box"> <label>Minut</label><input data-role="minute" type="text"></div>
  235. <div class="input-box"> <label>Secunda</label><input data-role="second" type="text"></div>
  236. </div>
  237. <hr/>
  238. <div class="input-box"> <label>Tinta (XXX|YYY):</label><input id="input-villages-target"></div>
  239. <div class="input-box"> <label>Sate origine:</label><input id="input-villages-origins" placeholder="XXX|YYY ZZZ|WWW AAA|BBB"></div>
  240. <div class="input-box"> <label>Include Nobili in full:</label><input id="input-villages-nobili" type="checkbox"></div>
  241.  
  242. <hr/>`
  243. );
  244.  
  245. $framesWrapper = $("<div id='framesWrapper'></div>");
  246.  
  247. $boxesWrapper = $(
  248. "<div id='boxesWrapper' style='padding:20px;padding-bottom:0;text-align:center'></div>"
  249. );
  250.  
  251. $start = $('<div>Lanseaza</div>');
  252. $startFakeRange = $('<div>Go Fake</div>').addClass('one-box__action');
  253. $startFullRange = $('<div>GO FULL</div>').addClass('one-box__action');
  254. var $attacksWrapper = $("<div class='two-buttons'></div>")
  255. .append($startFakeRange)
  256. .append($startFullRange);
  257.  
  258. $startFakeVillages = $('<div>Go Fake</div>').addClass('one-box__action');
  259. $startFullVillages = $('<div>GO FULL</div>').addClass('one-box__action');
  260. var $attacksWrapperVillages = $("<div class='two-buttons'></div>")
  261. .append($startFakeVillages)
  262. .append($startFullVillages);
  263.  
  264. $startFakeVillages.click(SEND_FAKE_VILLAGES);
  265. $startFullVillages.click(SEND_FULL_VILLAGES);
  266.  
  267. $openScavenge = $('<div class="one-box__action">Deschide curatare</div>');
  268. $startScavenge = $('<div>Porneste curatare</div>').addClass('one-box__action');
  269.  
  270. $start.click(SEND_EACH_INPUT);
  271.  
  272. $startFakeRange.click(SEND_FAKE_RANGE);
  273. $startFullRange.click(SEND_FULL_RANGE);
  274.  
  275. $openScavenge.click(openScavenge);
  276. $startScavenge.click(startScavengeTimer);
  277.  
  278. var $attackListBox = renderBox('Atacuri cu lista', $menuVillages, $attacksWrapperVillages);
  279. $boxesWrapper.prepend($attackListBox);
  280.  
  281. var $fakeBox = renderBox('Fake in interval', $menu, $attacksWrapper);
  282. $boxesWrapper.prepend($fakeBox);
  283.  
  284. var $scavengeBox = renderBox('Script curatare', $openScavenge, $startScavenge);
  285. $boxesWrapper.prepend($scavengeBox);
  286.  
  287. $('body').prepend($framesWrapper);
  288. $('body').prepend($boxesWrapper);
  289.  
  290. function SEND_FAKE_RANGE() {
  291. const results = [];
  292. time = {};
  293. $('.order-time input').each(function() {
  294. time[$(this).data('role')] = $(this).val() || 0;
  295. });
  296.  
  297. var target = $('#input-target').val();
  298. var minim = $('#input-minim').val();
  299. var maxim = $('#input-maxim').val();
  300.  
  301. $('.quickedit-label').each(function() {
  302. var name = $(this)
  303. .text()
  304. .trim();
  305. var coords = name.match(/\(.*\|.*\)/)[0].substr(1, 7);
  306. if (
  307. checkDistance(coords, target) <= maxim &&
  308. checkDistance(coords, target) >= minim
  309. ) {
  310. results.push(coords);
  311. }
  312. });
  313. console.warn(results);
  314.  
  315. results.forEach(function(myCoords, currentIndex) {
  316. setTimeout(() => {
  317. ATTACK_A_TO_B({
  318. origin: myCoords,
  319. target: target,
  320. time: time,
  321. type: 'FAKE'
  322. });
  323. }, (Math.floor(Math.random() * 5000) + 3000) * currentIndex);
  324. });
  325. }
  326.  
  327. function SEND_FULL_RANGE() {
  328. const results = [];
  329. time = {};
  330. $('.order-time input').each(function() {
  331. time[$(this).data('role')] = $(this).val() || 0;
  332. });
  333.  
  334. var target = $('#input-target').val();
  335. var minim = $('#input-minim').val();
  336. var maxim = $('#input-maxim').val();
  337. localStorage.setItem('sendSnobs', $("#input-nobili")[0].checked);
  338.  
  339. $('.quickedit-label').each(function() {
  340. var name = $(this)
  341. .text()
  342. .trim();
  343. var coords = name.match(/\(.*\|.*\)/)[0].substr(1, 7);
  344. if (
  345. checkDistance(coords, target) <= maxim &&
  346. checkDistance(coords, target) >= minim
  347. ) {
  348. results.push(coords);
  349. }
  350. });
  351. console.warn(results);
  352.  
  353. results.forEach(function(myCoords, currentIndex) {
  354. setTimeout(() => {
  355. ATTACK_A_TO_B({
  356. origin: myCoords,
  357. target: target,
  358. time: time,
  359. type: 'FULL'
  360. });
  361. }, (Math.floor(Math.random() * 5000) + 3000) * currentIndex);
  362. });
  363. }
  364.  
  365. /// VLG
  366.  
  367. function SEND_FAKE_VILLAGES() {
  368. time = {};
  369. $('.order-time-villages input').each(function() {
  370. time[$(this).data('role')] = $(this).val() || 0;
  371. });
  372.  
  373. var target = $('#input-villages-target').val();
  374. var origins = $('#input-villages-origins').val();
  375.  
  376. var results = origins.split(' ').map(a => a.trim());
  377.  
  378. results.forEach(function(myCoords, currentIndex) {
  379. setTimeout(() => {
  380. if(myCoords.length && myCoords.length === 7)
  381. ATTACK_A_TO_B({
  382. origin: myCoords,
  383. target: target,
  384. time: time,
  385. type: 'FAKE'
  386. });
  387. }, (Math.floor(Math.random() * 5000) + 3000) * currentIndex);
  388. });
  389. }
  390.  
  391. function SEND_FULL_VILLAGES() {
  392. time = {};
  393. $('.order-time-villages input').each(function() {
  394. time[$(this).data('role')] = $(this).val() || 0;
  395. });
  396.  
  397. var target = $('#input-villages-target').val();
  398. var origins = $('#input-villages-origins').val();
  399. localStorage.setItem('sendSnobs', $("#input-villages-nobili")[0].checked);
  400.  
  401. var results = origins.split(' ').map(a => a.trim());
  402.  
  403. results.forEach(function(myCoords, currentIndex) {
  404. setTimeout(() => {
  405. if(myCoords.length && myCoords.length === 7)
  406. ATTACK_A_TO_B({
  407. origin: myCoords,
  408. target: target,
  409. time: time,
  410. type: 'FULL'
  411. });
  412. }, (Math.floor(Math.random() * 5000) + 3000) * currentIndex);
  413. });
  414. }
  415.  
  416. ///
  417. function newTargetRow() {
  418. var _div = document.createElement('div');
  419. _div.className = 'one-order';
  420.  
  421. var _i1 = document.createElement('input');
  422. var _i2 = document.createElement('input');
  423.  
  424. var _time = document.createElement('div');
  425. _time.className = 'order-time';
  426. _time.innerHTML = `
  427. <div class="input-box"> <label>Zi</label><input data-role="day" type="text"></div>
  428. <div class="input-box"> <label>Luna</label><input data-role="month" type="text"></div>
  429. <hr/>
  430. <div class="input-box"> <label>Ora</label><input data-role="hour" type="text"></div>
  431. <div class="input-box"> <label>Minut</label><input data-role="minute" type="text"></div>
  432. <div class="input-box"> <label>Secunda</label><input data-role="second" type="text"></div>`;
  433.  
  434. var _se = document.createElement('select');
  435. _se.innerHTML =
  436. '<option value="FAKE">FAKE</option><option value="FULL">FULL</option><option value="HELP">HELP</option>';
  437.  
  438. _div.appendChild(_i1);
  439. _div.appendChild(_i2);
  440. _div.appendChild(_se);
  441. _div.appendChild(_time);
  442. document.getElementById('orders').appendChild(_div);
  443. }
  444.  
  445. function getVillageID(villageCoords) {
  446. var result;
  447. if (villageCoords) {
  448. $('.quickedit-label').each(function() {
  449. if (
  450. $(this)
  451. .text()
  452. .includes(villageCoords)
  453. ) {
  454. result = $(this)
  455. .parent()
  456. .attr('href')
  457. .split('=')[1]
  458. .split('&')[0];
  459. }
  460. });
  461. return result;
  462. }
  463. return window.game_data.village.id;
  464. }
  465.  
  466. function getScreenURL(screen, villageId) {
  467. var URL = window.location.href;
  468.  
  469. switch (screen) {
  470. case 'place':
  471. URL = `/game.php?village=${villageId}&screen=place`;
  472.  
  473. break;
  474. case 'incoming':
  475. URL = `/game.php?village=${villageId}&screen=overview_villages&mode=incomings&subtype=attacks`;
  476.  
  477. break;
  478. case 'scavenge':
  479. URL = `/game.php?village=${villageId}&screen=place&mode=scavenge`;
  480.  
  481. break;
  482. }
  483.  
  484. return URL;
  485. }
  486.  
  487. function getIframe(iframeId, villageId, screen = SCREEN_URLS.PLACE) {
  488. return (
  489. '<iframe src="' +
  490. getScreenURL(screen, villageId) +
  491. '" name="' +
  492. iframeId +
  493. '" width="400" height="375"></iframe>'
  494. );
  495. }
  496.  
  497. var simulateClick = function(elem) {
  498. var evt = new MouseEvent('click', {
  499. bubbles: true,
  500. cancelable: true,
  501. view: window
  502. });
  503. var canceled = !elem.dispatchEvent(evt);
  504. };
  505.  
  506. var simulateKeyboardEvent = function(elem, event) {
  507. var evt = new KeyboardEvent(event, {
  508. bubbles: true,
  509. cancelable: true,
  510. view: window
  511. });
  512. var canceled = !elem.dispatchEvent(evt);
  513. };
  514.  
  515. function _GET_(selector, iframeId) {
  516. window.frames;
  517. var fr = window.frames[iframeId];
  518. return fr.document.querySelector(selector);
  519. }
  520.  
  521. function trimBrackets(string) {
  522. return string.substr(1, string.length - 2);
  523. }
  524.  
  525. function fillTroops(troopsType = 'FAKE', iframeId) {
  526. const fake_const = {
  527. spy: 60,
  528. catapult: 25,
  529. ram: 15
  530. };
  531.  
  532. applyRetry(() => {
  533. switch (troopsType) {
  534. case 'FAKE':
  535. var totalSpy = trimBrackets(
  536. _GET_('.units-entry-all[data-unit="spy"]', iframeId).innerText
  537. );
  538. var totalRam = trimBrackets(
  539. _GET_('.units-entry-all[data-unit="ram"]', iframeId).innerText
  540. );
  541. var totalCatapult = trimBrackets(
  542. _GET_('.units-entry-all[data-unit="catapult"]', iframeId).innerText
  543. );
  544.  
  545. const spyFinal =
  546. totalSpy >= fake_const.spy ? fake_const.spy : totalSpy;
  547. const ramFinal =
  548. totalRam >= fake_const.ram ? fake_const.ram : totalRam;
  549. const catapultFinal =
  550. totalCatapult >= fake_const.catapult
  551. ? fake_const.catapult
  552. : totalCatapult;
  553.  
  554. _GET_('#unit_input_spy', iframeId).value = spyFinal;
  555. _GET_('#unit_input_ram', iframeId).value = ramFinal;
  556. _GET_('#unit_input_catapult', iframeId).value = catapultFinal;
  557.  
  558. var totalPopulation = spyFinal * 2 + ramFinal * 5 + catapultFinal * 8;
  559.  
  560. if (totalPopulation >= 120 && ramFinal + catapultFinal > 0) {
  561. simulateClick(_GET_('#target_attack', iframeId));
  562. }
  563.  
  564. break;
  565. case 'FULL':
  566. simulateClick(_GET_('#selectAllUnits', iframeId));
  567.  
  568. if (!localStorage.getItem('sendSnobs')) {
  569. _GET_('#unit_input_snob', iframeId).value = 0;
  570. }
  571.  
  572. simulateClick(_GET_('#target_attack', iframeId));
  573. break;
  574.  
  575. case 'HELP':
  576. simulateClick(_GET_('#selectAllUnits', iframeId));
  577.  
  578. simulateClick(_GET_('#target_support', iframeId));
  579. break;
  580. }
  581. });
  582. }
  583.  
  584. function startAttack(commandObject, iframeId) {
  585. applyRetry(() => {
  586. _targetInput = _GET_('[placeholder="123|456"]', iframeId);
  587. _targetInput.value = commandObject.target;
  588.  
  589. fillTroops(commandObject.type, iframeId);
  590.  
  591. setTimeout(() => {
  592. setLaunchTimeout(commandObject.time, iframeId);
  593. }, TIMER_SECONDS);
  594. });
  595. }
  596.  
  597. function ATTACK_A_TO_B(commandObject) {
  598. console.warn('ATOB', commandObject);
  599.  
  600. const villageId = getVillageID(commandObject.origin);
  601. const IFRAME_ID = 'iframe_' + villageId;
  602.  
  603. const IFRAME_HTML = getIframe(IFRAME_ID, villageId);
  604.  
  605. $('#framesWrapper').append($('<div>' + IFRAME_HTML + '</div>'));
  606.  
  607. setTimeout(() => startAttack(commandObject, IFRAME_ID), TIMER_SECONDS);
  608. }
  609.  
  610. function openIncoming() {
  611. const villageId = getVillageID();
  612. var ticking = true;
  613.  
  614. const IFRAME_HTML = getIframe(
  615. INCOMING_IFRAMEID,
  616. villageId,
  617. SCREEN_URLS.INCOMING
  618. );
  619.  
  620. setTimeout(recursiveStart, 60000 + Math.floor(Math.random() * 30000));
  621.  
  622. function recursiveStart() {
  623. document.querySelector(
  624. `iframe[name="${INCOMING_IFRAMEID}"]`
  625. ).src = getScreenURL(SCREEN_URLS.INCOMING, villageId);
  626.  
  627. if (ticking)
  628. setTimeout(recursiveStart, 60000 + Math.floor(Math.random() * 30000));
  629. }
  630.  
  631. $('#framesWrapper').append($('<div>' + IFRAME_HTML + '</div>'));
  632. }
  633.  
  634. function openMain() {
  635. const villageId = getVillageID();
  636. var ticking = true;
  637.  
  638. const IFRAME_HTML = getIframe(MAIN_FRAMEID, villageId, SCREEN_URLS.MAIN);
  639.  
  640. setTimeout(recursiveStart, 60000 + Math.floor(Math.random() * 30000));
  641.  
  642. function recursiveStart() {
  643. document.querySelector(
  644. `iframe[name="${MAIN_FRAMEID}"]`
  645. ).src = getScreenURL(SCREEN_URLS.MAIN, villageId);
  646.  
  647. if (ticking)
  648. setTimeout(recursiveStart, 60000 + Math.floor(Math.random() * 30000));
  649. }
  650.  
  651. $('#framesWrapper').append($('<div>' + IFRAME_HTML + '</div>'));
  652. }
  653.  
  654. function openScavenge() {
  655. const villageId = getVillageID();
  656. var ticking = false;
  657.  
  658. const IFRAME_HTML = getIframe(
  659. SCAVENGE_FRAMEID,
  660. villageId,
  661. SCREEN_URLS.SCAVENGE
  662. );
  663.  
  664. // setTimeout(recursiveStart, 60000 + Math.floor(Math.random() * 30000));
  665.  
  666. $('#framesWrapper').append($('<div>' + IFRAME_HTML + '</div>'));
  667. }
  668.  
  669. function renderBox(boxTitle, boxContent, boxAction) {
  670. var $box = $('<div></div>').addClass('one-box');
  671. var $boxTitle = $('<div></div>')
  672. .addClass('one-box__title')
  673. .text(boxTitle);
  674. var $boxToggle = $('<div></div>')
  675. .addClass('one-box__button')
  676. .text('Toggle')
  677. .click(function() {
  678. $(this)
  679. .parent()
  680. .toggleClass('open');
  681. });
  682. var $boxAction = $('<div></div>').html($(boxAction));
  683. var $boxContent = $('<div></div>')
  684. .addClass('one-box__content')
  685. .append($(boxContent))
  686. .append($boxAction);
  687.  
  688. $box.append($boxTitle);
  689. $box.append($boxToggle);
  690. $box.append($boxContent);
  691.  
  692. return $box;
  693. }
  694.  
  695. function getRandomArbitrary(min, max) {
  696. return Math.random() * (max - min) + min;
  697. }
  698.  
  699. const SCAVENGE_MULTIPLIERS = [
  700. [1],
  701. [0.2858, 0.7142],
  702. [0.125, 0.25, 0.625],
  703. [0.0769, 0.1153, 0.2307, 0.5769]
  704. ];
  705. var units = {};
  706.  
  707. _$ = selector =>
  708. typeof selector == 'string'
  709. ? $(_GET_(selector, SCAVENGE_FRAMEID))
  710. : $(_GET_(selector.selector, SCAVENGE_FRAMEID));
  711.  
  712. function fillScavengeForm(index) {
  713. function fillScavengeUnit(unitName, unitAmmount) {
  714. var $field = _GET_('[name="' + unitName + '"]', SCAVENGE_FRAMEID);
  715. simulateKeyboardEvent($field, 'keydown');
  716. $field.value = unitAmmount;
  717. simulateKeyboardEvent($field, 'keyup');
  718. }
  719.  
  720. Object.keys(units).forEach(key => {
  721. fillScavengeUnit(key, units[key][index]);
  722. });
  723. }
  724.  
  725. function clickButton(i) {
  726. simulateClick(
  727. _GET_(
  728. `.scavenge-option:nth-of-type(${i +
  729. 1}) a.btn.btn-default.free_send_button`,
  730. SCAVENGE_FRAMEID
  731. )
  732. );
  733. }
  734.  
  735. function initScript() {
  736. var totalUnlocked = 3 - _$('a.btn.btn-default.unlock-button').length;
  737. var unlockedAllLast = {
  738. '_1': [1],
  739. '_2': [1, 0],
  740. '_3': [1, 0, 0]
  741. }
  742.  
  743. var currentMultipliers = SCAVENGE_MULTIPLIERS[totalUnlocked];
  744. if (+trimBrackets(
  745. _GET_([`.units-entry-all[data-unit=spear]`], SCAVENGE_FRAMEID)
  746. .innerText
  747. ) < 100) currentMultipliers = unlockedAllLast[`_${totalUnlocked}`];
  748. window.game_data.units.forEach(function(name) {
  749. window.game_data.units;
  750. try {
  751. var total = +trimBrackets(
  752. _GET_([`.units-entry-all[data-unit=${name}]`], SCAVENGE_FRAMEID)
  753. .innerText
  754. );
  755. units[name] = currentMultipliers.map(m => Math.floor(m * total));
  756. } catch (e) {}
  757. });
  758.  
  759. currentMultipliers.forEach((e, i) => {
  760. setTimeout(() => {
  761. fillScavengeForm(i);
  762. clickButton(totalUnlocked - i);
  763. }, (i + 1) * 1500 + getRandomArbitrary(600, 959));
  764. });
  765.  
  766. setTimeout(startScavengeTimer, getRandomArbitrary(1900, 2100));
  767. }
  768.  
  769. function startScavengeTimer() {
  770. var milliseconds = 0;
  771.  
  772. if (_$('.return-countdown').length) {
  773. function toMS(text) {
  774. const timer = text.split(':')
  775. .map(nr => parseInt(nr));
  776. var hours = timer[0];
  777. var minutes = timer[1] + 1;
  778. var seconds = timer[2];
  779.  
  780. return (hours * 3600 + minutes * 60 + seconds) * 1000;
  781. }
  782. const msArray = [];
  783.  
  784. _$('.return-countdown').each(function(t){
  785. msArray.push(toMS(this.innerText))
  786. });
  787.  
  788. milliseconds = Math.max(...msArray) || 1000;
  789. }
  790.  
  791. var today = new Date();
  792. var launch = new Date(today.getTime() + milliseconds);
  793. console.warn('Next one at ', launch.getHours(), ':', launch.getMinutes());
  794. setTimeout(initScript, milliseconds);
  795. }
  796. })();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement