munch
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 

762 行
22 KiB

  1. let world = null;
  2. let currentRoom = null;
  3. let currentDialog = null;
  4. let currentFoe = null;
  5. let dirButtons = [];
  6. let actionButtons = [];
  7. let mode = "explore";
  8. let actions = [];
  9. let time = 9*60*60;
  10. let date = 1;
  11. let newline = " ";
  12. let player = new Player();
  13. let playerAttacks = [];
  14. let struggles = [];
  15. let killingBlow = null;
  16. let deaths = [];
  17. let respawnRoom;
  18. let MIDNIGHT = 0;
  19. let MORNING = 21600;
  20. let NOON = 43200;
  21. let EVENING = 64800;
  22. function join(things) {
  23. if (things.length == 1) {
  24. return things[0].description("a");
  25. } else if (things.length == 2) {
  26. return things[0].description("a") + " and " + things[1].description("a");
  27. } else {
  28. let line = "";
  29. line = things.slice(0,-1).reduce((line, prey) => line + prey.description("a") + ", ", line);
  30. line += " and " + things[things.length-1].description("a");
  31. return line;
  32. }
  33. }
  34. function pickRandom(list) {
  35. return list[Math.floor(Math.random() * list.length)];
  36. }
  37. function pick(list, attacker, defender) {
  38. if (list.length == 0)
  39. return null;
  40. else {
  41. let sum = list.reduce((sum, choice) => choice.weight == undefined ? sum + 1 : sum + choice.weight(attacker, defender), 0);
  42. let target = Math.random() * sum;
  43. for (let i = 0; i < list.length; i++) {
  44. sum -= list[i].weight == undefined ? 1 : list[i].weight(attacker, defender);
  45. if (sum <= target) {
  46. return list[i];
  47. }
  48. }
  49. return list[list.length-1];
  50. }
  51. }
  52. function filterValid(options, attacker, defender) {
  53. let filtered = options.filter(option => option.conditions == undefined || option.conditions.reduce((result, test) => result && test(attacker, defender), true));
  54. return filtered.filter(option => option.requirements == undefined || option.requirements.reduce((result, test) => result && test(attacker, defender), true));
  55. }
  56. function filterPriority(options) {
  57. let max = options.reduce((max, option) => option.priority > max ? option.priority : max, -1000);
  58. return options.filter(option => option.priority == max);
  59. }
  60. function round(number, digits) {
  61. return Math.round(number * Math.pow(10,digits)) / Math.pow(10,digits);
  62. }
  63. function updateExploreCompass() {
  64. for (let i = 0; i < dirButtons.length; i++) {
  65. let button = dirButtons[i];
  66. button.classList.remove("active-button");
  67. button.classList.remove("inactive-button");
  68. button.classList.remove("disabled-button");
  69. if (currentRoom.exits[i] == null) {
  70. button.disabled = true;
  71. button.classList.add("inactive-button");
  72. button.innerHTML = "";
  73. } else {
  74. if (currentRoom.exits[i].conditions.reduce((result, test) => result && test(player.prefs), true)) {
  75. button.disabled = false;
  76. button.classList.add("active-button");
  77. button.innerHTML = currentRoom.exits[i].name;
  78. } else {
  79. button.disabled = true;
  80. button.classList.add("disabled-button");
  81. button.innerHTML = currentRoom.exits[i].name;
  82. }
  83. }
  84. }
  85. }
  86. function updateExploreActions() {
  87. for (let i = 0; i < actionButtons.length; i++) {
  88. if (i < actions.length) {
  89. actionButtons[i].disabled = false;
  90. actionButtons[i].innerHTML = actions[i].name;
  91. actionButtons[i].classList.remove("inactive-button");
  92. actionButtons[i].classList.add("active-button");
  93. }
  94. else {
  95. actionButtons[i].disabled = true;
  96. actionButtons[i].innerHTML = "";
  97. actionButtons[i].classList.remove("active-button");
  98. actionButtons[i].classList.add("inactive-button");
  99. }
  100. }
  101. }
  102. function updateExplore() {
  103. updateExploreCompass();
  104. updateExploreActions();
  105. }
  106. function updateEaten() {
  107. let list = document.getElementById("eaten");
  108. while(list.firstChild) {
  109. list.removeChild(list.firstChild);
  110. }
  111. if (player.health > 0)
  112. struggles = filterValid(currentFoe.struggles, currentFoe, player);
  113. else
  114. struggles = [submit(currentFoe)];
  115. for (let i = 0; i < struggles.length; i++) {
  116. let li = document.createElement("li");
  117. let button = document.createElement("button");
  118. button.classList.add("eaten-button");
  119. button.innerHTML = struggles[i].name;
  120. button.addEventListener("click", function() { struggleClicked(i); } );
  121. button.addEventListener("mouseover", function() { struggleHovered(i); } );
  122. button.addEventListener("mouseout", function() { document.getElementById("eaten-desc").innerHTML = ""; } );
  123. li.appendChild(button);
  124. list.appendChild(li);
  125. }
  126. }
  127. function updateCombat() {
  128. let list = document.getElementById("combat");
  129. while(list.firstChild) {
  130. list.removeChild(list.firstChild);
  131. }
  132. if (player.health > 0)
  133. if (currentFoe.playerAttacks == undefined)
  134. playerAttacks = filterValid(player.attacks, player, currentFoe);
  135. else
  136. playerAttacks = filterValid(currentFoe.playerAttacks.map(attack => attack(player)), player, currentFoe);
  137. else
  138. playerAttacks = [pass(player)];
  139. if (playerAttacks.length == 0)
  140. playerAttacks = [player.backupAttack];
  141. for (let i = 0; i < playerAttacks.length; i++) {
  142. let li = document.createElement("li");
  143. let button = document.createElement("button");
  144. button.classList.add("combat-button");
  145. button.innerHTML = playerAttacks[i].name;
  146. button.addEventListener("click", function() { attackClicked(i); } );
  147. button.addEventListener("mouseover", function() { attackHovered(i); } );
  148. button.addEventListener("mouseout", function() { document.getElementById("combat-desc").innerHTML = ""; } );
  149. li.appendChild(button);
  150. list.appendChild(li);
  151. }
  152. document.getElementById("stat-foe-name").innerHTML = "Name: " + currentFoe.name;
  153. document.getElementById("stat-foe-health").innerHTML = "Health: " + currentFoe.health + "/" + currentFoe.maxHealth;
  154. document.getElementById("stat-foe-stamina").innerHTML = "Stamina: " + currentFoe.stamina + "/" + currentFoe.maxStamina;
  155. document.getElementById("stat-foe-str").innerHTML = "Str: " + currentFoe.str;
  156. document.getElementById("stat-foe-dex").innerHTML = "Dex: " + currentFoe.dex;
  157. document.getElementById("stat-foe-con").innerHTML = "Con: " + currentFoe.con;
  158. }
  159. function updateDialog() {
  160. let list = document.getElementById("dialog");
  161. while(list.firstChild) {
  162. list.removeChild(list.firstChild);
  163. }
  164. for (let i = 0; i < currentDialog.choices.length; i++) {
  165. let activated = currentDialog.choices[i].node.requirements == undefined || currentDialog.choices[i].node.requirements.reduce((result, test) => result && test(player, currentFoe), true);
  166. let li = document.createElement("li");
  167. let button = document.createElement("button");
  168. button.classList.add("dialog-button");
  169. button.innerHTML = currentDialog.choices[i].text;
  170. button.addEventListener("click", function() { dialogClicked(i); });
  171. if (!activated) {
  172. button.classList.add("disabled-button");
  173. button.disabled = true;
  174. }
  175. li.appendChild(button);
  176. list.appendChild(li);
  177. }
  178. }
  179. function updateDisplay() {
  180. document.querySelectorAll(".selector").forEach(function (x) {
  181. x.style.display = "none";
  182. });
  183. switch(mode) {
  184. case "explore":
  185. document.getElementById("selector-explore").style.display = "flex";
  186. updateExplore();
  187. break;
  188. case "combat":
  189. document.getElementById("selector-combat").style.display = "flex";
  190. updateCombat();
  191. break;
  192. case "dialog":
  193. document.getElementById("selector-dialog").style.display = "flex";
  194. updateDialog();
  195. break;
  196. case "eaten":
  197. document.getElementById("selector-eaten").style.display = "flex";
  198. updateEaten();
  199. break;
  200. }
  201. document.getElementById("time").innerHTML = "Time: " + renderTime(time);
  202. document.getElementById("date").innerHTML = "Day " + date;
  203. document.getElementById("stat-name").innerHTML = "Name: " + player.name;
  204. document.getElementById("stat-health").innerHTML = "Health: " + round(player.health,0) + "/" + round(player.maxHealth,0);
  205. document.getElementById("stat-cash").innerHTML = "Cash: $" + round(player.cash,0);
  206. document.getElementById("stat-stamina").innerHTML = "Stamina: " + round(player.stamina,0) + "/" + round(player.maxStamina,0);
  207. document.getElementById("stat-foe-str").innerHTML = "Str: " + player.str;
  208. document.getElementById("stat-foe-dex").innerHTML = "Dex: " + player.dex;
  209. document.getElementById("stat-foe-con").innerHTML = "Con: " + player.con;
  210. document.getElementById("stat-fullness").innerHTML = "Fullness: " + round(player.fullness(),0);
  211. if (player.prefs.scat) {
  212. document.getElementById("stat-bowels").innerHTML = "Bowels: " + round(player.bowels.fullness,0);
  213. } else {
  214. document.getElementById("stat-bowels").innerHTML = "";
  215. }
  216. }
  217. function advanceTimeTo(newTime) {
  218. advanceTime((86400 + newTime - time) % 86400);
  219. }
  220. function advanceTime(amount) {
  221. time = (time + amount);
  222. date += Math.floor(time / 86400);
  223. time = time % 86400;
  224. player.restoreHealth(amount);
  225. player.restoreStamina(amount);
  226. update(player.stomach.digest(amount));
  227. update(player.butt.digest(amount));
  228. }
  229. function renderTime(time) {
  230. let suffix = (time < 43200) ? "AM" : "PM";
  231. let hour = Math.floor((time % 43200) / 3600);
  232. if (hour == 0)
  233. hour = 12;
  234. let minute = Math.floor(time / 60) % 60;
  235. if (minute < 9)
  236. minute = "0" + minute;
  237. return hour + ":" + minute + " " + suffix;
  238. }
  239. function move(direction) {
  240. let target = currentRoom.exits[direction];
  241. if (target == null) {
  242. alert("Tried to move to an empty room!");
  243. return;
  244. }
  245. moveTo(target,currentRoom.exitDescs[direction]);
  246. }
  247. function moveToByName(roomName, desc="You go places lol", loading=false) {
  248. moveTo(world[roomName], desc, loading);
  249. }
  250. function moveTo(room,desc="You go places lol", loading=false) {
  251. actions = [];
  252. currentRoom = room;
  253. if (!loading)
  254. advanceTime(30);
  255. currentRoom.objects.forEach(function (object) {
  256. object.actions.forEach(function (action) {
  257. if (action.conditions == undefined || action.conditions.reduce((result, cond) => result && cond(player.prefs), true))
  258. actions.push(action);
  259. });
  260. });
  261. update([desc,newline]);
  262. currentRoom.visit();
  263. }
  264. window.addEventListener('load', function(event) {
  265. document.getElementById("start-button").addEventListener("click", start, false);
  266. });
  267. function start() {
  268. applySettings(generateSettings());
  269. transformVorePrefs(player.prefs);
  270. document.getElementById("create").style.display = "none";
  271. document.getElementById("game").style.display = "block";
  272. document.getElementById("stat-button-status").addEventListener("click", status, false);
  273. loadActions();
  274. loadCompass();
  275. loadDialog();
  276. world = createWorld();
  277. currentRoom = world["Bedroom"];
  278. respawnRoom = currentRoom;
  279. moveTo(currentRoom,"");
  280. updateDisplay();
  281. }
  282. // copied from Stroll LUL
  283. function generateSettings() {
  284. let form = document.forms.namedItem("character-form");
  285. let settings = {};
  286. for (let i=0; i<form.length; i++) {
  287. let value = form[i].value == "" ? form[i].placeholder : form[i].value;
  288. if (form[i].type == "text")
  289. if (form[i].value == "")
  290. settings[form[i].name] = form[i].placeholder;
  291. else
  292. settings[form[i].name] = value;
  293. else if (form[i].type == "number")
  294. settings[form[i].name] = parseFloat(value);
  295. else if (form[i].type == "checkbox") {
  296. settings[form[i].name] = form[i].checked;
  297. } else if (form[i].type == "radio") {
  298. let name = form[i].name;
  299. if (form[i].checked)
  300. settings[name] = form[i].value;
  301. } else if (form[i].type == "select-one") {
  302. settings[form[i].name] = form[i][form[i].selectedIndex].value;
  303. }
  304. }
  305. return settings;
  306. }
  307. function applySettings(settings) {
  308. player.name = settings.name;
  309. player.species = settings.species;
  310. for (let key in settings) {
  311. if (settings.hasOwnProperty(key)) {
  312. if (key.match(/prefs/)) {
  313. let tokens = key.split("-");
  314. let pref = player.prefs;
  315. pref = tokens.slice(1,-1).reduce(function(pref, key) {
  316. if (pref[key] == undefined)
  317. pref[key] = {};
  318. return pref[key];
  319. }, pref);
  320. pref[tokens.slice(-1)[0]] = settings[key];
  321. }
  322. }
  323. }
  324. }
  325. // turn things like "1" into a number
  326. function transformVorePrefs(prefs) {
  327. for (let key in prefs.vore) {
  328. if (prefs.vore.hasOwnProperty(key)) {
  329. switch(prefs.vore[key]) {
  330. case "0": prefs.vore[key] = 0; break;
  331. case "1": prefs.vore[key] = 0.5; break;
  332. case "2": prefs.vore[key] = 1; break;
  333. case "3": prefs.vore[key] = 2; break;
  334. }
  335. }
  336. }
  337. return prefs;
  338. }
  339. function saveSettings() {
  340. window.localStorage.setItem("settings", JSON.stringify(generateSettings()));
  341. }
  342. function retrieveSettings() {
  343. return JSON.parse(window.localStorage.getItem("settings"));
  344. }
  345. function clearScreen() {
  346. let log = document.getElementById("log");
  347. let child = log.firstChild;
  348. while (child != null) {
  349. log.removeChild(child);
  350. child = log.firstChild;
  351. }
  352. }
  353. function update(lines=[]) {
  354. let log = document.getElementById("log");
  355. for (let i=0; i<lines.length; i++) {
  356. let div = document.createElement("div");
  357. div.innerHTML = lines[i];
  358. log.appendChild(div);
  359. }
  360. log.scrollTop = log.scrollHeight;
  361. updateDisplay();
  362. }
  363. function changeMode(newMode) {
  364. mode = newMode;
  365. let body = document.querySelector("body");
  366. document.getElementById("foe-stats").style.display = "none";
  367. body.className = "";
  368. switch(mode) {
  369. case "explore":
  370. case "dialog":
  371. body.classList.add("explore");
  372. break;
  373. case "combat":
  374. body.classList.add("combat");
  375. document.getElementById("foe-stats").style.display = "block";
  376. break;
  377. case "eaten":
  378. body.classList.add("eaten");
  379. document.getElementById("foe-stats").style.display = "block";
  380. break;
  381. }
  382. updateDisplay();
  383. }
  384. function respawn(respawnRoom) {
  385. if (killingBlow.gameover == undefined) {
  386. if (player.prefs.prey) {
  387. deaths.push("Digested by " + currentFoe.description("a") + " at " + renderTime(time) + " on day " + date);
  388. } else {
  389. deaths.push("Defeated by " + currentFoe.description("a") + " at " + renderTime(time) + " on day " + date);
  390. }
  391. } else {
  392. deaths.push(killingBlow.gameover() + " at " + renderTime(time) + " on day " + date);
  393. }
  394. moveTo(respawnRoom,"You drift through space and time...");
  395. player.clear();
  396. player.stomach.contents = [];
  397. player.butt.contents = [];
  398. player.bowels.contents = [];
  399. player.bowels.fullness = 0;
  400. advanceTime(Math.floor(86400 / 2 * (Math.random() * 0.5 - 0.25 + 1)));
  401. changeMode("explore");
  402. player.health = 100;
  403. update(["You wake back up in your bed."]);
  404. }
  405. function startCombat(opponent) {
  406. currentFoe = opponent;
  407. changeMode("combat");
  408. update(opponent.startCombat(player));
  409. }
  410. function attackClicked(index) {
  411. update(playerAttacks[index].attack(currentFoe).concat([newline]));
  412. if (currentFoe.health <= 0) {
  413. currentFoe.defeated();
  414. } else if (mode == "combat") {
  415. let attack = pick(filterPriority(filterValid(currentFoe.attacks, currentFoe, player)), currentFoe, player);
  416. if (attack == null) {
  417. attack = currentFoe.backupAttack;
  418. }
  419. update(attack.attackPlayer(player).concat([newline]));
  420. if (player.health <= -100) {
  421. killingBlow = attack;
  422. update(["You die..."]);
  423. respawn(respawnRoom);
  424. } else if (player.health <= 0) {
  425. update(["You're too weak to do anything..."]);
  426. if (player.prefs.prey) {
  427. // nada
  428. } else {
  429. killingBlow = attack;
  430. update(["You die..."]);
  431. respawn(respawnRoom);
  432. }
  433. }
  434. }
  435. }
  436. function attackHovered(index) {
  437. document.getElementById("combat-desc").innerHTML = playerAttacks[index].desc;
  438. }
  439. function struggleClicked(index) {
  440. let struggle = struggles[index];
  441. let result = struggle.struggle(player);
  442. update(result.lines.concat([newline]));
  443. if (result.escape == "stay") {
  444. changeMode("combat");
  445. } else if (result.escape == "escape") {
  446. changeMode("explore");
  447. } else {
  448. let digest = pick(filterValid(currentFoe.digests, currentFoe, player), currentFoe, player);
  449. if (digest == null) {
  450. digest = currentFoe.backupDigest;
  451. }
  452. update(digest.digest(player).concat([newline]));
  453. if (player.health <= -100) {
  454. killingBlow = digest;
  455. update(currentFoe.finishDigest().concat([newline]));
  456. respawn(respawnRoom);
  457. }
  458. }
  459. }
  460. function struggleHovered(index) {
  461. document.getElementById("eaten-desc").innerHTML = currentFoe.struggles[index].desc;
  462. }
  463. function startDialog(dialog) {
  464. currentDialog = dialog;
  465. changeMode("dialog");
  466. update(currentDialog.text.concat([newline]));
  467. currentDialog.visit();
  468. updateDisplay();
  469. }
  470. function dialogClicked(index) {
  471. currentDialog = currentDialog.choices[index].node;
  472. update(currentDialog.text.concat([newline]));
  473. currentDialog.visit();
  474. if (currentDialog.choices.length == 0 && mode == "dialog") {
  475. changeMode("explore");
  476. updateDisplay();
  477. }
  478. }
  479. function loadDialog() {
  480. dialogButtons = Array.from( document.querySelectorAll(".dialog-button"));
  481. for (let i = 0; i < dialogButtons.length; i++) {
  482. dialogButtons[i].addEventListener("click", function() { dialogClicked(i); });
  483. }
  484. }
  485. function actionClicked(index) {
  486. actions[index].action();
  487. }
  488. function loadActions() {
  489. actionButtons = Array.from( document.querySelectorAll(".action-button"));
  490. for (let i = 0; i < actionButtons.length; i++) {
  491. actionButtons[i].addEventListener("click", function() { actionClicked(i); });
  492. }
  493. }
  494. function loadCompass() {
  495. dirButtons[NORTH_WEST] = document.getElementById("compass-north-west");
  496. dirButtons[NORTH_WEST].addEventListener("click", function() {
  497. move(NORTH_WEST);
  498. });
  499. dirButtons[NORTH] = document.getElementById("compass-north");
  500. dirButtons[NORTH].addEventListener("click", function() {
  501. move(NORTH);
  502. });
  503. dirButtons[NORTH_EAST] = document.getElementById("compass-north-east");
  504. dirButtons[NORTH_EAST].addEventListener("click", function() {
  505. move(NORTH_EAST);
  506. });
  507. dirButtons[WEST] = document.getElementById("compass-west");
  508. dirButtons[WEST].addEventListener("click", function() {
  509. move(WEST);
  510. });
  511. dirButtons[EAST] = document.getElementById("compass-east");
  512. dirButtons[EAST].addEventListener("click", function() {
  513. move(EAST);
  514. });
  515. dirButtons[SOUTH_WEST] = document.getElementById("compass-south-west");
  516. dirButtons[SOUTH_WEST].addEventListener("click", function() {
  517. move(SOUTH_WEST);
  518. });
  519. dirButtons[SOUTH] = document.getElementById("compass-south");
  520. dirButtons[SOUTH].addEventListener("click", function() {
  521. move(SOUTH);
  522. });
  523. dirButtons[SOUTH_EAST] = document.getElementById("compass-south-east");
  524. dirButtons[SOUTH_EAST].addEventListener("click", function() {
  525. move(SOUTH_EAST);
  526. });
  527. document.getElementById("compass-look").addEventListener("click", look, false);
  528. }
  529. function look() {
  530. update([currentRoom.description]);
  531. }
  532. function status() {
  533. let lines = [];
  534. lines.push("You are a " + player.species);
  535. lines.push(newline);
  536. if (player.stomach.contents.length > 0) {
  537. lines.push("Your stomach bulges with prey.");
  538. player.stomach.contents.map(function(prey) {
  539. let state = "";
  540. let healthRatio = prey.health / prey.maxHealth;
  541. if (healthRatio > 0.75) {
  542. state = "is thrashing in your gut";
  543. } else if (healthRatio > 0.5) {
  544. state = "is squirming in your belly";
  545. } else if (healthRatio > 0.25) {
  546. state = "is pressing out at your stomach walls";
  547. } else if (healthRatio > 0) {
  548. state = "is weakly squirming";
  549. } else {
  550. state = "has stopped moving";
  551. }
  552. lines.push(prey.description("A") + " " + state);
  553. });
  554. lines.push(newline);
  555. }
  556. if (player.butt.contents.length > 0) {
  557. lines.push("Your bowels churn with prey.");
  558. player.butt.contents.map(function(prey) {
  559. let state = "";
  560. let healthRatio = prey.health / prey.maxHealth;
  561. if (healthRatio > 0.75) {
  562. state = "is writhing in your bowels";
  563. } else if (healthRatio > 0.5) {
  564. state = "is struggling against your intestines";
  565. } else if (healthRatio > 0.25) {
  566. state = "is bulging out of your lower belly";
  567. } else if (healthRatio > 0) {
  568. state = "is squirming weakly, slipping deeper and deeper";
  569. } else {
  570. state = "has succumbed to your bowels";
  571. }
  572. lines.push(prey.description("A") + " " + state);
  573. });
  574. lines.push(newline);
  575. }
  576. update(lines);
  577. }
  578. let toSave = ["str","dex","con","name","species","health","stamina"];
  579. function saveGame() {
  580. let save = {};
  581. save.player = JSON.stringify(player, function(key, value) {
  582. if (toSave.includes(key) || key == "") {
  583. return value;
  584. } else {
  585. return undefined;
  586. }
  587. });
  588. save.prefs = JSON.stringify(player.prefs);
  589. save.position = currentRoom.name;
  590. save.date = date;
  591. save.time = time;
  592. save.deaths = deaths;
  593. let stringified = JSON.stringify(save);
  594. window.localStorage.setItem("save", stringified);
  595. }
  596. function loadGame() {
  597. changeMode("explore");
  598. let save = JSON.parse(window.localStorage.getItem("save"));
  599. let playerSave = JSON.parse(save.player);
  600. for (let key in playerSave) {
  601. if (playerSave.hasOwnProperty(key)) {
  602. player[key] = playerSave[key];
  603. }
  604. }
  605. player.prefs = JSON.parse(save.prefs);
  606. deaths = save.deaths;
  607. date = save.date;
  608. time = save.time;
  609. clearScreen();
  610. moveToByName(save.position, "");
  611. }
  612. // wow polyfills
  613. if (![].includes) {
  614. Array.prototype.includes = function(searchElement /*, fromIndex*/ ) {
  615. 'use strict';
  616. var O = Object(this);
  617. var len = parseInt(O.length) || 0;
  618. if (len === 0) {
  619. return false;
  620. }
  621. var n = parseInt(arguments[1]) || 0;
  622. var k;
  623. if (n >= 0) {
  624. k = n;
  625. } else {
  626. k = len + n;
  627. if (k < 0) {k = 0;}
  628. }
  629. var currentElement;
  630. while (k < len) {
  631. currentElement = O[k];
  632. if (searchElement === currentElement ||
  633. (searchElement !== searchElement && currentElement !== currentElement)) {
  634. return true;
  635. }
  636. k++;
  637. }
  638. return false;
  639. };
  640. }