a munch adventure
Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.
 
 
 
 

1239 wiersze
46 KiB

  1. (() => {
  2. function checkSuspicion(add = 0) {
  3. const old = getStat("suspicion");
  4. if (add >= 0) {
  5. add *= state.info.awareness.value;
  6. }
  7. changeStat("suspicion", add);
  8. if (getStat("suspicion") >= 100) {
  9. print(["Geta spots you!", "You're snatched up and tossed into the fox's bowl of cereal."]);
  10. goToRoom("in-bowl");
  11. return false;
  12. } else if (getStat("suspicion") >= 75 && old < 75) {
  13. print(["The fox is very suspicious. You're going to get caught if you keep this up..."]);
  14. }
  15. return true;
  16. }
  17. function randomBodyPart() {
  18. const choices = Object.entries(state.player.limbs).filter(([name, status]) => {
  19. return status;
  20. }).map(([name, status]) => name);
  21. return choices[Math.floor(Math.random() * choices.length)];
  22. }
  23. function limbsLost() {
  24. return Object.entries(state.player.limbs).filter(([name, status]) => {
  25. return !status;
  26. }).length;
  27. }
  28. function synonym(word) {
  29. const choices = {
  30. "slippery": ["slippery", "slimy", "slick", "glistening"],
  31. "chews": ["chews", "crunches"],
  32. "crushes": ["crushes", "pulverizes", "shatters", "smashes"]
  33. }
  34. return choices[word][Math.floor(Math.random() * choices[word].length)];
  35. }
  36. function statLerp(stat, change, duration) {
  37. // pretty sure this'll be a random id...
  38. const id = new Date().getTime() + Math.random();
  39. const iterations = duration / 1000 * 60;
  40. startTimer({
  41. id: id,
  42. func: () => {
  43. changeStat(stat, change / iterations);
  44. return true;
  45. },
  46. delay: 1000 / 60,
  47. loop: true,
  48. classes: [
  49. ]
  50. });
  51. startTimer({
  52. id: id + "-stopper",
  53. func: () => {
  54. stopTimer(id);
  55. return false;
  56. },
  57. delay: duration,
  58. loop: false,
  59. classes: [
  60. ]
  61. });
  62. }
  63. const limbs = {
  64. head: "head",
  65. leftArm: "left arm",
  66. rightArm: "right arm",
  67. leftLeg: "left leg",
  68. rightLeg: "right leg"
  69. };
  70. stories.push({
  71. "id": "geta-unaware",
  72. "info": {
  73. "name": "Geta's Breakfast",
  74. "desc": "Try to sneak past a fox after a catastrophic shrinking incident.",
  75. "tags": [
  76. "prey",
  77. "fatal",
  78. "oral-vore",
  79. "hard-vore",
  80. "hard-digestion",
  81. "macro-micro"
  82. ]
  83. },
  84. "intro": {
  85. "start": "pepper-grinder",
  86. "setup": () => {
  87. state.info.awareness = {
  88. id: "awareness",
  89. name: "Geta's Awareness",
  90. type: "counter",
  91. value: 1,
  92. get render() {
  93. if (this.value < 1) {
  94. return "Distracted";
  95. } else if (this.value == 1) {
  96. return "Normal"
  97. } else {
  98. return "Alert"
  99. }
  100. }
  101. }
  102. state.geta = {};
  103. state.player.stats.health = { name: "Health", type: "meter", value: 100, min: 0, max: 100, color: "rgb(255,55,55)" };
  104. state.player.stats.suspicion = { name: "Suspicion", type: "meter", value: 0, min: 0, max: 100, color: "rgb(100,100,100)" };
  105. state.player.stats.mawPos = { "name": "Struggle", "type": "meter", "value": 0.5, "min": 0, "max": 1, "color": "rgb(0,255,0)", hidden: true }
  106. state.info.time.value = 60 * 60 * 7 + 60 * 17;
  107. state.player.limbs = {};
  108. state.player.limbs.head = true;
  109. state.player.limbs.leftArm = true;
  110. state.player.limbs.rightArm = true;
  111. state.player.limbs.leftLeg = true;
  112. state.player.limbs.rightLeg = true;
  113. startTimer({
  114. id: "clock",
  115. func: () => {
  116. state.info.time.value += 1;
  117. state.info.time.value %= 86000;
  118. return true;
  119. },
  120. delay: 1000,
  121. loop: true,
  122. classes: [
  123. ]
  124. });
  125. startTimer({
  126. id: "suspicion-decay",
  127. func: () => {
  128. checkSuspicion(-0.1);
  129. return true;
  130. },
  131. delay: 100,
  132. loop: true,
  133. classes: [
  134. "free"
  135. ]
  136. });
  137. startTimer({
  138. id: "timeout",
  139. func: () => {
  140. if (state.info.time.value == 60 * 60 * 7 + 60 * 19) {
  141. print(["The fox is almost done with his breakfast..."]);
  142. }
  143. if (state.info.time.value >= 60 * 60 * 7 + 60 * 20) {
  144. print(["Time's up! In you go."]);
  145. goToRoom("maw");
  146. return false;
  147. }
  148. return true;
  149. },
  150. delay: 1000,
  151. loop: true,
  152. classes: [
  153. "free"
  154. ]
  155. });
  156. startTimer({
  157. id: "geta-action",
  158. func: () => {
  159. const random = Math.random();
  160. if (random < 0.7) {
  161. print(["Geta slurps up a spoonful of cereal."]);
  162. return Math.random() * 3000 + 3000
  163. } else if (random < 0.9) {
  164. state.info.awareness.value = 0.1;
  165. print(["The fox yawns and stretches."]);
  166. startTimer({
  167. id: "yawn-end",
  168. func: () => {
  169. print(["Geta finishes his stretch"]);
  170. state.info.awareness.value = 1;
  171. return true;
  172. },
  173. delay: 5000,
  174. loop: false,
  175. classes: [
  176. "free"
  177. ]
  178. });
  179. return Math.random() * 3000 + 5000
  180. } else {
  181. state.info.awareness.value = 2;
  182. print(["Geta narrows his eyes and looks around the table. Something seems off to him..."]);
  183. startTimer({
  184. id: "squint-end",
  185. func: () => {
  186. print(["He goes back to his breakfast."]);
  187. state.info.awareness.value = 1;
  188. return true;
  189. },
  190. delay: 5000,
  191. loop: false,
  192. classes: [
  193. "free"
  194. ]
  195. });
  196. return Math.random() * 1000 + 6000
  197. }
  198. },
  199. delay: 5000,
  200. loop: true,
  201. classes: [
  202. "free"
  203. ]
  204. });
  205. },
  206. "intro": () => {
  207. print(["Game started", newline, "Exposition goes here later."]);
  208. }
  209. },
  210. "sounds": [
  211. "loop/stomach.ogg",
  212. "sfx/absorb.ogg",
  213. "sfx/digest.ogg",
  214. "sfx/swallow.ogg"
  215. ],
  216. "preload": [
  217. ],
  218. "refresh": () => {
  219. setBackgroundColor(50 - state.player.stats.health.value / 2, 0, 0);
  220. },
  221. "world": {
  222. "pepper-grinder": {
  223. "id": "pepper-grinder",
  224. "name": "Pepper Grinder",
  225. "desc": "You're hiding behind a pepper grinder",
  226. "move": (room) => {
  227. print(["You dart over to the pepper grinder, which looms over you like a greatwood."]);
  228. },
  229. "enter": (room) => {
  230. },
  231. "exit": (room) => {
  232. },
  233. "actions": [
  234. {
  235. name: "Tap",
  236. desc: "Bang on the pepper shaker",
  237. execute: (room) => {
  238. print(["You thump the pepper shaker, making a dull thud."]);
  239. const safe = checkSuspicion(25);
  240. if (safe && getStat("suspicion") > 50) {
  241. print(["Geta leans in to have a closer look. He's going to catch you if you don't move!"]);
  242. startTimer({
  243. id: "pepper-investigate",
  244. func: () => {
  245. if (state.player.location == "pepper-grinder") {
  246. print(["He catches you.", newline, "You're tossed into the fox's jaws."]);
  247. goToRoom("maw");
  248. } else {
  249. print(["You evaded the fox."]);
  250. }
  251. },
  252. delay: 3000,
  253. loop: false,
  254. classes: [
  255. "free"
  256. ]
  257. });
  258. }
  259. },
  260. show: [
  261. ],
  262. conditions: [
  263. ]
  264. },
  265. {
  266. name: "Wait",
  267. desc: "Wait for the fox to finish his breakfast. Surely you'll be able to escape after that...right?",
  268. execute: (room) => {
  269. state.info.time.value = 60 * 60 * 7 + 60 * 20;
  270. },
  271. show: [
  272. ],
  273. conditions: [
  274. ]
  275. },
  276. ],
  277. "exits": {
  278. "up": {
  279. "target": "bowl",
  280. "desc": "Walk up to the cereal bowl",
  281. "show": [
  282. ],
  283. "conditions": [
  284. ],
  285. "hooks": [
  286. (room, exit) => {
  287. return checkSuspicion(10);
  288. }
  289. ]
  290. },
  291. "left": {
  292. "target": "table",
  293. "desc": "Run out into the open",
  294. "show": [
  295. ],
  296. "conditions": [
  297. ],
  298. "hooks": [
  299. ]
  300. },
  301. },
  302. "hooks": [
  303. ],
  304. "data": {
  305. "stats": {
  306. }
  307. }
  308. },
  309. "bowl": {
  310. "id": "bowl",
  311. "name": "Behind the Bowl",
  312. "desc": "You're crouched behind Geta's bowl of cereal",
  313. "move": (room) => {
  314. print(["You scurry up to the looming bowl, staying low and out of Geta's sight."]);
  315. },
  316. "enter": (room) => {
  317. },
  318. "exit": (room) => {
  319. },
  320. "actions": [
  321. ],
  322. "exits": {
  323. "ascend": {
  324. "target": "in-bowl",
  325. "desc": "Climb into Geta's cereal",
  326. "show": [
  327. ],
  328. "conditions": [
  329. ],
  330. "hooks": [
  331. ]
  332. },
  333. "down": {
  334. "target": "pepper-grinder",
  335. "desc": "Run back behind the pepper grinder",
  336. "show": [
  337. ],
  338. "conditions": [
  339. ],
  340. "hooks": [
  341. (room, exit) => {
  342. return checkSuspicion(15);
  343. }
  344. ]
  345. },
  346. },
  347. "hooks": [
  348. ],
  349. "data": {
  350. "stats": {
  351. }
  352. }
  353. },
  354. "table": {
  355. "id": "table",
  356. "name": "Table",
  357. "desc": "You're out in the open!",
  358. "move": (room) => {
  359. },
  360. "enter": (room) => {
  361. startTimer({
  362. id: "table-suspicion",
  363. func: () => {
  364. checkSuspicion(1.5);
  365. return true;
  366. },
  367. delay: 100,
  368. loop: true,
  369. classes: [
  370. "free"
  371. ]
  372. });
  373. },
  374. "exit": (room) => {
  375. stopTimer("table-suspicion");
  376. },
  377. "actions": [
  378. ],
  379. "exits": {
  380. "right": {
  381. "target": "pepper-grinder",
  382. "desc": "Run back to cover",
  383. "show": [
  384. ],
  385. "conditions": [
  386. ],
  387. "hooks": [
  388. ]
  389. },
  390. },
  391. "hooks": [
  392. ],
  393. "data": {
  394. "stats": {
  395. }
  396. }
  397. },
  398. "in-bowl": {
  399. "id": "in-bowl",
  400. "name": "Bowl",
  401. "desc": "You're in the cereal bowl...",
  402. "move": (room) => {
  403. print(["Why did you do that?"]);
  404. },
  405. "enter": (room) => {
  406. state.player.stats.suspicion.hidden = true;
  407. stopClassTimers("free");
  408. startTimer({
  409. id: "geta-eat",
  410. func: () => {
  411. if (Math.random() < 0.6) {
  412. print(["Geta scoops up a spoonful of cereal; you narrowly avoid being caught."]);
  413. return true;
  414. } else {
  415. print(["Geta scoops you up and slurps you into his maw."]);
  416. goToRoom("maw");
  417. return false;
  418. }
  419. },
  420. delay: 3000,
  421. loop: true,
  422. classes: [
  423. "free"
  424. ]
  425. });
  426. },
  427. "exit": (room) => {
  428. },
  429. "actions": [
  430. ],
  431. "exits": {
  432. "ascend": {
  433. "target": "bowl",
  434. "desc": "Try to climb back out!",
  435. "show": [
  436. ],
  437. "conditions": [
  438. ],
  439. "hooks": [
  440. (room, exit) => {
  441. print([
  442. "You grab at the rim of the bowl and try to pull yourself out. Alas, your struggles are for naught; Geta easily scoops you up in his spoon and, a heartbeat later, slurps you into his sloppy jaws. You didn't stand a chance."
  443. ]);
  444. goToRoom("maw");
  445. return false;
  446. }
  447. ]
  448. },
  449. },
  450. "hooks": [
  451. ],
  452. "data": {
  453. "stats": {
  454. }
  455. }
  456. },
  457. "maw": {
  458. "id": "maw",
  459. "name": "Geta's Maw",
  460. "desc": "You've been slurped up into the fox's jaws",
  461. "move": (room) => {
  462. },
  463. "enter": (room) => {
  464. state.player.stats.suspicion.hidden = true;
  465. stopClassTimers("free");
  466. state.player.stats.mawPos.hidden = false;
  467. state.geta.slurps = 0;
  468. state.geta.chews = 0;
  469. state.geta.swallowsLeft = 3 + Math.floor(Math.random() * 3);
  470. state.geta.mawMovement = 1;
  471. print(["You slip into Geta's maw. He'll swallow you like the snack you are if you slip too far back, but crawl too far forward, and you'll meet his fangs..."])
  472. startTimer({
  473. id: "maw-random-movement",
  474. func: () => {
  475. const time = new Date().getTime();
  476. const movementFactor = (state.geta.mawMovement + limbsLost());
  477. const fastPart = Math.sin(time / 200) / 1600 / 3;
  478. const slowPart = Math.sin(time / 1000) / 1600;
  479. changeStat("mawPos", movementFactor * (fastPart + slowPart));
  480. if (getStat("mawPos") <= 0.02) {
  481. print(["You slip too far back. Geta doesn't even have to try to swallow you like the food you are; you're lost from the world, buried in his hot, tight throat."]);
  482. goToRoom("throat");
  483. return false;
  484. } else if (getStat("mawPos") >= 0.98) {
  485. print(["Geta's jaws close like a falling guillotine's blade. You're crushed like an insect. A sharp gulp drags you down to the fox's guts."]);
  486. playSfx("sfx/swallow.ogg");
  487. changeStat("health", -90);
  488. goToRoom("stomach");
  489. return false;
  490. }
  491. return true;
  492. },
  493. delay: 1000 / 60,
  494. loop: true,
  495. classes: [
  496. "maw-struggle"
  497. ]
  498. });
  499. startTimer({
  500. id: "maw-struggle",
  501. func: () => {
  502. if (state.geta.swallowsLeft <= 0) {
  503. print(["Geta picks up his bowl of cereal and drinks it down, swallowing you in the process."]);
  504. state.geta.swallowsLeft = -1;
  505. goToRoom("throat");
  506. return false;
  507. }
  508. let choice;
  509. if (Math.random() < 0.2) {
  510. const choices = [
  511. "slosh",
  512. "tilt-back",
  513. "shove",
  514. ];
  515. choice = choices[Math.floor(Math.random() * choices.length)];
  516. } else if (Math.random() > state.geta.slurps / 3) {
  517. choice = "slurp";
  518. } else if (state.geta.chews - Math.floor(Math.random() * 3) < state.geta.slurps) {
  519. choice = "chew";
  520. } else {
  521. choice = "swallow";
  522. }
  523. if (choice == "swallow") {
  524. if (getStat("mawPos") < 0.15) {
  525. print(["You're too far back. The fox swallows a mouthful of cereal, taking you with it."]);
  526. goToRoom("throat");
  527. return false;
  528. } else {
  529. printRandom([
  530. ["A light swallow drags a lump of chewed-up cereal into Geta's depths."],
  531. ["Geta swallows, dragging you closer to your demise."],
  532. ["Your captor's throat ripples as he gulps down his breakfast."]
  533. ]);
  534. statLerp("mawPos", -0.25, 500);
  535. state.geta.slurps = 0;
  536. state.geta.chews = 0;
  537. state.geta.swallowsLeft -= 1;
  538. return Math.random() * 1500 + 1500;
  539. }
  540. } else if (choice == "slurp") {
  541. statLerp("mawPos", -0.1, 250);
  542. printRandom([
  543. ["A spoonful of cereal slips into the fox's " + synonym("slippery") + " maw."],
  544. ["Geta slurps up some more of his breakfast."],
  545. ["You're shoved back a bit as Geta slurps up more cereal."]
  546. ]);
  547. state.geta.slurps += 1;
  548. return Math.random() * 1000 + 2500;
  549. } else if (choice == "chew") {
  550. if (getStat("mawPos") > 0.85) {
  551. const limb = randomBodyPart();
  552. state.player.limbs[limb] = false;
  553. const limbName = limbs[limb];
  554. if (limb == "head") {
  555. print(["Geta's jaws crush down on your head. You die."]);
  556. changeStat("health", -100);
  557. goToRoom("stomach");
  558. } else {
  559. print(["You scream in pain as your " + limbName + " is shattered by the fox's jaws"]);
  560. changeStat("health", -40);
  561. return true;
  562. }
  563. } else {
  564. printRandom([
  565. ["Cruel fangs crush down on the food around you."],
  566. ["Geta chews on his breakfast."],
  567. ["The fox's fangs close with a crackle-crunch of cereal."]
  568. ]);
  569. statLerp("mawPos", Math.random() / 10 - 0.05, 250);
  570. state.geta.chews += 1;
  571. return Math.random() * 500 + 1300;
  572. }
  573. } else if (choice == "slosh") {
  574. print(["Geta's tongue sloshes from side to side, throwing you around his maw like a ship in a storm."]);
  575. state.geta.mawMovement = 3;
  576. startTimer({
  577. id: "maw-slosh-end",
  578. func: () => {
  579. state.geta.mawMovement = 1;
  580. print(["The sloshing ends."]);
  581. return true;
  582. },
  583. delay: 4000,
  584. loop: false,
  585. classes: [
  586. "maw-struggle"
  587. ]
  588. });
  589. return Math.random() * 1500 + 4500;
  590. } else if (choice == "tilt-back") {
  591. print(["Geta tilts his head back, sending rivults of slobber flowing down into that yawning gullet."]);
  592. state.geta.mawMovement = 0.2;
  593. statLerp("mawPos", -1, 4000);
  594. startTimer({
  595. id: "maw-tilt-text",
  596. func: () => {
  597. state.geta.mawMovement = 1;
  598. print(["The fox's muzzle tilts back down as he SWALLOWS hard."]);
  599. statLerp("mawPos", -0.3, 500);
  600. state.geta.swallowsLeft -= 1;
  601. state.geta.slurps = 0;
  602. state.geta.chews = 0;
  603. return true;
  604. },
  605. delay: 4000,
  606. loop: false,
  607. classes: [
  608. ]
  609. });
  610. return 5000 + Math.random() * 1000;
  611. } else if (choice == "shove") {
  612. print(["Geta's tongue lurches forward, shoving you towards the front of his maw!"]);
  613. statLerp("mawPos", 0.2, 500);
  614. return 2000 + Math.random() * 1000;
  615. }
  616. },
  617. delay: 0,
  618. loop: true,
  619. classes: [
  620. "maw-struggle"
  621. ]
  622. });
  623. startTimer({
  624. id: "maw-taunts",
  625. func: () => {
  626. printRandom([
  627. ["\"Did you really think I wouldn't notice you?\""],
  628. ["\"You're going to feel good dying in my guts.\""],
  629. ["\"I could just crush you...but where's the fun in that?\""]
  630. ]);
  631. return Math.random() * 5000 + 5000;
  632. },
  633. delay: 5000,
  634. loop: true,
  635. classes: [
  636. "maw-struggle"
  637. ]
  638. });
  639. },
  640. "exit": (room) => {
  641. },
  642. "actions": [
  643. {
  644. name: "Struggle",
  645. desc: "Pull yourself away from the fox's throat! Just don't go too far forward...",
  646. execute: (room) => {
  647. print(["You drag yourself forward"]);
  648. statLerp("mawPos", 0.15 + Math.random() * 0.05, 250);
  649. },
  650. show: [
  651. ],
  652. conditions: [
  653. ]
  654. },
  655. {
  656. name: "Slip Back",
  657. desc: "Slide back towards Geta's gullet",
  658. execute: (room) => {
  659. if (Math.random() < 0.9) {
  660. print(["You let yourself slip back."]);
  661. statLerp("mawPos", -0.2 - Math.random() * 0.1, 250);
  662. } else {
  663. print(["You lose your grip, sliding back quite far!"]);
  664. statLerp("mawPos", -0.3 - Math.random() * 0.15, 250);
  665. }
  666. },
  667. show: [
  668. ],
  669. conditions: [
  670. ]
  671. },
  672. {
  673. name: "Dive In",
  674. desc: "Throw yourself towards the fox's throat",
  675. execute: (room) => {
  676. print(["Resigned to your fate, you toss yourself into Geta's throat. He seems surprised by your eagerness to submit, but swallows you all the same."]);
  677. goToRoom("throat");
  678. },
  679. show: [
  680. ],
  681. conditions: [
  682. ]
  683. },
  684. ],
  685. "exits": {
  686. },
  687. "hooks": [
  688. ],
  689. "data": {
  690. "stats": {
  691. }
  692. }
  693. },
  694. "throat": {
  695. "id": "throat",
  696. "name": "Geta's Gullet",
  697. "desc": "GULP!",
  698. "move": (room) => {
  699. },
  700. "enter": (room) => {
  701. playSfx("sfx/swallow.ogg");
  702. state.player.stats.mawPos.hidden = true;
  703. stopClassTimers("maw-struggle");
  704. startTimer({
  705. id: "throat-swallow",
  706. func: () => {
  707. print(["You slush down into Geta's stomach"]);
  708. goToRoom("stomach");
  709. return true;
  710. },
  711. delay: 7000,
  712. loop: false,
  713. classes: [
  714. ]
  715. });
  716. },
  717. "exit": (room) => {
  718. },
  719. "actions": [
  720. {
  721. name: "Struggle",
  722. desc: "Try to climb back out!",
  723. execute: (room) => {
  724. print(["Nope"]);
  725. },
  726. show: [
  727. ],
  728. conditions: [
  729. ]
  730. },
  731. {
  732. name: "Give up",
  733. desc: "Dive down into Geta's stomach",
  734. execute: (room) => {
  735. print(["You submit to your predator."]);
  736. goToRoom("stomach");
  737. stopTimer("throat-swallow");
  738. },
  739. show: [
  740. ],
  741. conditions: [
  742. ]
  743. },
  744. ],
  745. "exits": {
  746. },
  747. "hooks": [
  748. ],
  749. "data": {
  750. "stats": {
  751. }
  752. }
  753. },
  754. "stomach": {
  755. "id": "stomach",
  756. "name": "Geta's Stomach",
  757. "desc": "Glorp",
  758. "move": (room) => {
  759. },
  760. "enter": (room) => {
  761. playLoop("loop/stomach.ogg");
  762. stopClassTimers("maw-struggle");
  763. state.geta.digestionStage = 0;
  764. state.geta.acidStrength = 1;
  765. startTimer({
  766. id: "digest-stages",
  767. func: () => {
  768. if (100 - state.geta.digestionStage * 25 - 25> getStat("health")) {
  769. state.geta.digestionStage = Math.floor((100 - getStat("health")) / 25);
  770. console.log(state.geta.digestionStage);
  771. switch (state.geta.digestionStage) {
  772. case 1:
  773. print(["Your skin begins to tingle."]);
  774. break;
  775. case 2:
  776. print(["The stinging acids work their way into your tender body."]);
  777. break;
  778. case 3:
  779. print(["You're starting to fall apart..."]);
  780. break;
  781. default:
  782. break;
  783. }
  784. }
  785. return true;
  786. },
  787. delay: 1000,
  788. loop: true,
  789. classes: [
  790. "digestion"
  791. ]
  792. });
  793. startTimer({
  794. id: "digest-random",
  795. func: () => {
  796. const choices = [
  797. () => {
  798. const crushed = randomBodyPart();
  799. const name = limbs[crushed];
  800. if (name == "head") {
  801. print(["A powerful fold of muscle grips your head, crushing it like a grape and killing you instantly."]);
  802. changeStat("health", -100);
  803. return false;
  804. } else {
  805. print(["Geta's stomach grips your " + name + " and crushes it with a horrific CRACK"]);
  806. changeStat("health", -40);
  807. return true;
  808. }
  809. },
  810. () => {
  811. printRandom([["Geta squeezes in on his gut with both hands, sloshing you around in the sickly stew of cereal, milk, and enzymatic slime."],
  812. ["Your organic prison snarls and churns, soaking you in fresh acids and hastening your wretched demise."]]);
  813. statLerp("health", -10, 2000);
  814. return true;
  815. },
  816. () => {
  817. if (state.geta.swallowsLeft == 0) {
  818. print(["A deep series of *glurks* rattles your bones."]);
  819. startTimer({
  820. id: "stomach-milk",
  821. func: () => {
  822. print(["A torrent of cold milk pours into the fox's stomach."]);
  823. return false;
  824. },
  825. delay: 3000,
  826. loop: false,
  827. classes: [
  828. "digestion"
  829. ]
  830. });
  831. } else if (state.geta.swallowsLeft > 0) {
  832. print(["Muffled chewing comes from far above. A moment later, you hear a wet *gluk*"]);
  833. startTimer({
  834. id: "stomach-cereal",
  835. func: () => {
  836. print(["A slimy heap of well-chewed corn flakes splatters down around you."]);
  837. return false;
  838. },
  839. delay: 4000,
  840. loop: false,
  841. classes: [
  842. ]
  843. });
  844. } else if (state.geta.swallowsLeft < 0) {
  845. print(["You hear a few light swallows."]);
  846. startTimer({
  847. id: "stomach-coffee",
  848. func: () => {
  849. print(["Gouts of hot, bitter coffee pour into the fox's guts."]);
  850. return false;
  851. },
  852. delay: 3000,
  853. loop: false,
  854. classes: [
  855. ]
  856. });
  857. }
  858. return true;
  859. },
  860. () => {
  861. print(["\"You were barely worth eating,\" murmurs the fox. \"So small. So weak.\""]);
  862. return true;
  863. }
  864. ];
  865. if (choices[Math.floor(Math.random() * choices.length)]()) {
  866. return Math.random() * 3000 + 3500;
  867. } else {
  868. return false;
  869. }
  870. },
  871. delay: 5000,
  872. loop: true,
  873. classes: [
  874. "digestion"
  875. ]
  876. });
  877. startTimer({
  878. id: "digest",
  879. func: () => {
  880. changeStat("health", -0.3 * state.geta.acidStrength);
  881. if (getStat("health") <= 0) {
  882. print(["You're digested before too long."]);
  883. goToRoom("digested");
  884. return false;
  885. }
  886. return true;
  887. },
  888. delay: 100,
  889. loop: true,
  890. classes: [
  891. "digestion"
  892. ]
  893. });
  894. },
  895. "exit": (room) => {
  896. },
  897. "actions": [
  898. {
  899. name: "Squirm",
  900. desc: "Rub at the walls of the fox's churning stomach",
  901. execute: (room) => {
  902. printRandom([
  903. ["You punch and kick at the walls"],
  904. ["A powerful churn grabs hold of you, stifling any attempts at struggling"],
  905. ["Your little thumps and kicks do little to faze your captor"]
  906. ]);
  907. },
  908. show: [
  909. ],
  910. conditions: [
  911. ]
  912. },
  913. {
  914. name: "Beg",
  915. desc: "Plead for your life",
  916. execute: (room) => {
  917. printRandom([
  918. [
  919. "\"PLEASE!\" you scream, thumping on the walls of the vulpine's gut. \"Let me out!\"",
  920. ]
  921. ])
  922. if (Math.random() < 0.7) {
  923. print(["Your pleas fall on deaf ears."]);
  924. } else {
  925. printRandom([
  926. ["\"Shhhh,\" growls Geta, \"you're going to die in me. Stop whimpering.\""],
  927. ["A long moment passes. \"Poor thing,\" says your captor."]
  928. ])
  929. }
  930. },
  931. show: [
  932. ],
  933. conditions: [
  934. ]
  935. },
  936. {
  937. name: "Scream",
  938. desc: "IT HURTS",
  939. execute: (room) => {
  940. printRandom([
  941. [
  942. "\"Oh god, oh god, oh god,\" you wail...quivering and quaking as you're digested alive. \"GETA!\""
  943. ],
  944. [
  945. "A blood-curdling scream bellows from your burning lungs."
  946. ],
  947. [
  948. "You let out a hideous wail as the fox digests you alive."
  949. ]
  950. ]);
  951. if (Math.random() < 0.5) {
  952. print(["Geta doesn't notice."]);
  953. } else {
  954. print(["A booming chuckle rocks your body."]);
  955. printRandom([
  956. ["\"I hope you're suffering in there.\""],
  957. ["\"Pathetic little snack.\""],
  958. ["\"Ready to die?\""]
  959. ]);
  960. }
  961. },
  962. show: [
  963. ],
  964. conditions: [
  965. ]
  966. },
  967. ],
  968. "exits": {
  969. },
  970. "hooks": [
  971. ],
  972. "data": {
  973. "stats": {
  974. }
  975. }
  976. },
  977. "digested": {
  978. "id": "digested",
  979. "name": "Geta's Stomach",
  980. "desc": "You're just mush now",
  981. "move": (room) => {
  982. },
  983. "enter": (room) => {
  984. stopClassTimers("digestion");
  985. stopTimer("clock");
  986. state.player.flags.digestTime = state.info.time.value;
  987. startTimer({
  988. id: "absorb-clock",
  989. func: () => {
  990. state.info.time.value += 1;
  991. state.info.time.value %= 86000;
  992. if (state.info.time.value - state.player.flags.digestTime > 5 * 60) {
  993. print(["Your molten remains drain into the fox's depths..."]);
  994. goToRoom("absorbed");
  995. return false;
  996. }
  997. return true;
  998. },
  999. delay: 1000 / 15,
  1000. loop: true,
  1001. classes: [
  1002. ]
  1003. });
  1004. playSfx("sfx/digest.ogg");
  1005. },
  1006. "exit": (room) => {
  1007. },
  1008. "actions": [
  1009. {
  1010. name: "Gurgle",
  1011. desc: "Glorp",
  1012. execute: (room) => {
  1013. printRandom([
  1014. ["Grrrrgle"],
  1015. ["Glorp"],
  1016. ["Glrrrrrrnnnnnn..."],
  1017. ["Gwoooooorgle"]
  1018. ]);
  1019. },
  1020. show: [
  1021. ],
  1022. conditions: [
  1023. ]
  1024. },
  1025. ],
  1026. "exits": {
  1027. },
  1028. "hooks": [
  1029. ],
  1030. "data": {
  1031. "stats": {
  1032. }
  1033. }
  1034. },
  1035. "absorbed": {
  1036. "id": "absorbed",
  1037. "name": "Geta's Fat",
  1038. "desc": "You're gone.",
  1039. "move": (room) => {
  1040. },
  1041. "enter": (room) => {
  1042. playSfx("sfx/absorb.ogg");
  1043. },
  1044. "exit": (room) => {
  1045. },
  1046. "actions": [
  1047. ],
  1048. "exits": {
  1049. },
  1050. "hooks": [
  1051. ],
  1052. "data": {
  1053. "stats": {
  1054. }
  1055. }
  1056. },
  1057. }
  1058. });
  1059. })();