a munch adventure
Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.
 
 
 
 

432 lines
14 KiB

  1. stories.push({
  2. id: "fen-snack",
  3. name: "Fen's Food",
  4. tags: [
  5. "Player Prey",
  6. "Digestion"
  7. ],
  8. sounds: [
  9. "sfx/digested-test.ogg",
  10. "sfx/stomach-to-intestines.ogg",
  11. "sfx/intestines-to-stomach.ogg",
  12. "sfx/intestines-to-bowels.ogg",
  13. "sfx/bowels-to-intestines.ogg",
  14. "sfx/stomach-to-intestines-fail.ogg",
  15. "sfx/intestines-to-stomach-forced.ogg",
  16. "sfx/stomach-churn.ogg",
  17. "sfx/intestines-churn-stay.ogg",
  18. "sfx/bowels-churn-safe.ogg",
  19. "sfx/bowels-churn-danger.ogg",
  20. "loop/fen-stomach.ogg",
  21. "loop/fen-intestines.ogg",
  22. "loop/fen-bowels.ogg"
  23. ],
  24. preload: [
  25. "sfx/stomach-churn.ogg",
  26. "loop/fen-stomach.ogg"
  27. ],
  28. intro: {
  29. start: "stomach",
  30. setup: state => {
  31. state.info.time = 86400 - 60 * 25 - 25;
  32. state.player.stats.health = {name: "Health", type: "meter", value: 100, max: 100, color: "rgb(255,0,0)"};
  33. state.player.stats.stamina = {name: "Stamina", type: "meter", value: 100, max: 100, color: "rgb(100,255,0)"};
  34. startTimer({
  35. id: "digestion",
  36. func: state => {
  37. const location = state.player.location;
  38. let bonus = state.player.flags.submission ? 10 : 1;
  39. if (location.startsWith("stomach")) {
  40. state.player.stats.health.value -= 1;
  41. }
  42. if (location.startsWith("intestines")) {
  43. state.player.stats.health.value -= 0.75;
  44. }
  45. if (location.startsWith("bowels")) {
  46. state.player.stats.health.value -= 0.5;
  47. }
  48. if (state.player.stats.health.value <= 0) {
  49. state.player.stats.health.value = 0;
  50. if (location.startsWith("stomach")) {
  51. goToRoom("digested-stomach", state);
  52. }
  53. if (location.startsWith("intestines")) {
  54. goToRoom("digested-intestines", state);
  55. }
  56. if (location.startsWith("bowels")) {
  57. goToRoom("digested-bowels", state);
  58. }
  59. return false;
  60. }
  61. return 1000 / bonus;
  62. },
  63. delay: 1000,
  64. loop: true,
  65. classes: [
  66. "alive"
  67. ]
  68. }, state);
  69. startTimer({
  70. id: "stamina-regen",
  71. func: state => {
  72. state.player.stats.stamina.value += 1;
  73. if (state.player.stats.stamina.value > 100) {
  74. state.player.stats.stamina.value = 100;
  75. }
  76. return true;
  77. },
  78. delay: 500,
  79. loop: true,
  80. classes: [
  81. "alive"
  82. ]
  83. }, state);
  84. startTimer({
  85. id: "clock",
  86. func: state => {
  87. state.info.time += 1;
  88. state.info.time %= 86400;
  89. return true;
  90. },
  91. delay: 1000,
  92. loop: true,
  93. classes: [
  94. ]
  95. }, state);
  96. },
  97. intro: state => {
  98. print(["Hot, slimy walls ripple and squeeze, the stomach of your captor stewing you in a churning stew of chyme and acid. The blue crux made a late-night meal out of you with ease. You've only been trapped under the Fen's pelt for a few minutes...and it doesn't seem like you'll last much longer than that, either."]);
  99. playSfx("sfx/stomach-churn.ogg");
  100. }
  101. },
  102. refresh: state => {
  103. setBackgroundColor(50 - state.player.stats.health.value/2, 0, 0)
  104. },
  105. world: {
  106. stomach: {
  107. id: "stomach",
  108. name: "Stomach",
  109. desc: "A hot, wet, steamy prison.",
  110. move: (room, state) => {
  111. print(["You slide into Fen's humid stomach."]);
  112. },
  113. enter: (room, state) => {
  114. playLoop("loop/fen-stomach.ogg");
  115. startTimer({
  116. id: "stomach-churns",
  117. func: state => {
  118. if (Math.random() > 0.6) {
  119. state.player.stats.stamina.value -= 25;
  120. state.player.stats.stamina.value = Math.max(0, state.player.stats.stamina.value);
  121. print(["The crux's stomach clenches around you, smothering you in the beast's slimy embrace."]);
  122. playSfx("sfx/stomach-churn.ogg");
  123. }
  124. return true;
  125. },
  126. delay: 10000,
  127. loop: true,
  128. room: "stomach",
  129. classes: [
  130. "alive"
  131. ]
  132. }, state);
  133. },
  134. exit: (room, state) => {
  135. stopLoop("loop/fen-stomach.ogg");
  136. stopRoomTimers("stomach", state);
  137. },
  138. hooks: [
  139. ],
  140. actions: [
  141. {
  142. name: "Rub",
  143. desc: "Knead on the muscular folds that surround your tasty little body",
  144. execute: (room, state) => {
  145. state.player.stats.stamina.value -= 15;
  146. state.player.stats.stamina.value = Math.max(0, state.player.stats.stamina.value);
  147. print(["You rub all over your prison's walls. Fen's stomach gurgles in response."]);
  148. }
  149. },
  150. {
  151. name: "Submit",
  152. desc: "Let Fen digest you",
  153. execute: (room, state) => {
  154. state.player.flags.submission = true;
  155. print(["You slump back in the crux's stomach, allowing its powerful fluids to break you down..."]);
  156. },
  157. show: [
  158. (room, state) => {
  159. return !state.player.flags.submission;
  160. }
  161. ]
  162. }
  163. ],
  164. exits: {
  165. "down": {
  166. "target": "intestines",
  167. "desc": "Push yourself deeper into the crux",
  168. move: (room, state) => {
  169. print(["You manage to push yourself down through the valve at the base of the crux's fetid stomach."]);
  170. playSfx("sfx/stomach-to-intestines.ogg");
  171. },
  172. hooks: [
  173. (room, exit, state) => {
  174. let stamina = state.player.stats.stamina.value;
  175. let escape;
  176. if (Math.random() > stamina/100) {
  177. stamina -= 50;
  178. print(["Fen's stomach clenches and ripples, smothering your face in wet flesh and keeping you nice and trapped."]);
  179. playSfx("sfx/stomach-to-intestines-fail.ogg");
  180. escape = false;
  181. } else {
  182. stamina -= 25;
  183. escape = true;
  184. }
  185. stamina = Math.max(stamina, 0)
  186. state.player.stats.stamina.value = stamina;
  187. return escape;
  188. }
  189. ],
  190. conditions: [
  191. (room, state) => {
  192. return !state.player.flags.submission;
  193. }
  194. ]
  195. }
  196. }
  197. },
  198. intestines: {
  199. id: "intestines",
  200. name: "Intestines",
  201. desc: "Labyrinthine guts, winding on and on...",
  202. move: (room, state) => {
  203. print(["Your squirming body glides into the crux's tight, snaking guts."]);
  204. },
  205. enter: (room, state) => {
  206. playLoop("loop/fen-intestines.ogg");
  207. startTimer({
  208. id: "intestines-churns",
  209. func: state => {
  210. if (Math.random() > 0.6) {
  211. if (state.player.stats.stamina.value > 50) {
  212. state.player.stats.stamina.value -= 25;
  213. state.player.stats.stamina.value = Math.max(0, state.player.stats.stamina.value);
  214. print(["Your prison's walls ripple and grind, shoving you against the valve leading to the crux's boiling stomach - but you manage to resist the powerful pull."]);
  215. playSfx("sfx/intestines-churn-stay.ogg");
  216. } else {
  217. print(["Too exhausted to resist, your slimy body is crammed into the crux's churning stomach by a powerful wave of peristalsis."]);
  218. playSfx("sfx/intestines-to-stomach-forced.ogg");
  219. goToRoom("stomach", state);
  220. }
  221. }
  222. return true;
  223. },
  224. delay: 10000,
  225. loop: true,
  226. room: "intestines",
  227. classes: [
  228. "alive"
  229. ]
  230. }, state);
  231. },
  232. exit: (room, state) => {
  233. stopLoop("loop/fen-intestines.ogg");
  234. stopRoomTimers("intestines", state);
  235. },
  236. exits: {
  237. "up": {
  238. target: "stomach",
  239. desc: "Writhe back into Fen's roiling stomach",
  240. move: (room, state) => {
  241. print(["You push yourself back into the crux's fatal stomach."]);
  242. playSfx("sfx/intestines-to-stomach.ogg");
  243. },
  244. conditions: [
  245. (room, state) => {
  246. return !state.player.flags.submission;
  247. }
  248. ]
  249. },
  250. "down": {
  251. target: "bowels",
  252. desc: "Push yourself even deeper into your predator's body",
  253. move: (room, state) => {
  254. print(["You wriggle into the beast's bowels."]);
  255. playSfx("sfx/intestines-to-bowels.ogg");
  256. },
  257. conditions: [
  258. (room, state) => {
  259. return !state.player.flags.submission;
  260. }
  261. ]
  262. }
  263. },
  264. hooks: [
  265. ],
  266. actions: [
  267. {
  268. name: "Rub",
  269. desc: "Knead on the muscular folds that surround your tasty little body",
  270. execute: (room, state) => {
  271. state.player.stats.stamina.value -= 20;
  272. state.player.stats.stamina.value = Math.max(0, state.player.stats.stamina.value);
  273. print(["You rub all over your prison's walls. Fen's guts barely move."]);
  274. }
  275. },
  276. {
  277. name: "Submit",
  278. desc: "Let Fen digest you",
  279. execute: (room, state) => {
  280. state.player.flags.submission = true;
  281. print(["You slump back in the crux's intestines, letting the winding, worryingly-tight guts take you in..."]);
  282. },
  283. show: [
  284. (room, state) => {
  285. return !state.player.flags.submission;
  286. }
  287. ]
  288. }
  289. ]
  290. },
  291. bowels: {
  292. id: "bowels",
  293. name: "Bowels",
  294. desc: "Cavernous bowels, rippling and squeezing over your bare skin",
  295. move: (room, state) => {
  296. print(["You enter the beast's humid bowels, taking shallow, stifled breaths of the musky air."]);
  297. },
  298. enter: (room, state) => {
  299. playLoop("loop/fen-bowels.ogg");
  300. startTimer({
  301. id: "bowels-churns",
  302. func: state => {
  303. if (Math.random() > 0.6) {
  304. if (state.player.stats.stamina.value > 50) {
  305. state.player.stats.stamina.value -= 25;
  306. state.player.stats.stamina.value = Math.max(0, state.player.stats.stamina.value);
  307. print(["Fen's bowels clench and churn, grinding you into their musky walls."]);
  308. playSfx("sfx/bowels-churn-safe.ogg");
  309. } else {
  310. state.player.stats.health.value /= 4;
  311. print(["Drained of stamina, you can do little to resist as Fen's bowels grind you away."]);
  312. playSfx("sfx/bowels-churn-danger.ogg");
  313. }
  314. }
  315. return true;
  316. },
  317. delay: 10000,
  318. loop: true,
  319. room: "bowels",
  320. classes: [
  321. "alive"
  322. ]
  323. }, state);
  324. },
  325. exit: (room, state) => {
  326. stopLoop("loop/fen-bowels.ogg");
  327. stopRoomTimers("bowels", state);
  328. },
  329. exits: {
  330. "up": {
  331. target: "intestines",
  332. desc: "Squirm up higher",
  333. move: (room, state) => {
  334. print(["You squirm out from Fen's bowels, working your way back into his cramped guts."]);
  335. playSfx("sfx/bowels-to-intestines.ogg");
  336. },
  337. conditions: [
  338. (room, state) => {
  339. return !state.player.flags.submission;
  340. }
  341. ]
  342. }
  343. },
  344. hooks: [
  345. ],
  346. actions: [
  347. {
  348. name: "Rub",
  349. desc: "Knead on the muscular folds that surround your tasty little body",
  350. execute: (room, state) => {
  351. state.player.stats.stamina.value -= 50;
  352. state.player.stats.stamina.value = Math.max(0, state.player.stats.stamina.value);
  353. print(["You rub all over your prison's walls. Fen's bowels clench in on you as he rurrs with pleasure."]);
  354. }
  355. },
  356. {
  357. name: "Submit",
  358. desc: "Let Fen digest you",
  359. execute: (room, state) => {
  360. state.player.flags.submission = true;
  361. print(["You slump back in the crux's bowels, yielding to their immense pressure..."]);
  362. },
  363. show: [
  364. (room, state) => {
  365. return !state.player.flags.submission;
  366. }
  367. ]
  368. }
  369. ]
  370. },
  371. "digested-stomach": {
  372. id: "digested-stomach",
  373. name: "Fen's Hips",
  374. desc: "You look good on him, at least~",
  375. enter: (room, state) => {
  376. playLoop("loop/fen-intestines.ogg");
  377. playSfx("sfx/digested-test.ogg");
  378. stopClassTimers("alive", state);
  379. print(["You slump down in the acidic pit, curling up as it begins to churn you down to chyme. Fen's stomach snarls and bubbles for the next few minutes...and then you're gone~",newline,"Nothing's left but a bit of padding on your predator's hips..."]);
  380. }
  381. },
  382. "digested-intestines": {
  383. id: "digested-intestines",
  384. name: "Fen's Belly",
  385. desc: "Just a little addition to the crux's belly - one that won't last for long.",
  386. enter: (room, state) => {
  387. playLoop("loop/fen-intestines.ogg");
  388. playSfx("sfx/digested-test.ogg");
  389. stopClassTimers("alive", state);
  390. print(["Fen's intestines clench and squeeze, melting you down into slop and soaking you up like a sponge.",newline,"Nothing's left but a bit of padding on your predator's hips..."]);
  391. }
  392. },
  393. "digested-bowels": {
  394. id: "digested-bowels",
  395. name: "Fen's Ass",
  396. desc: "A little extra heft on the predator's posterior.",
  397. enter: (room, state) => {
  398. playLoop("loop/fen-intestines.ogg");
  399. playSfx("sfx/digested-test.ogg");
  400. stopClassTimers("alive", state);
  401. print(["A powerful ripple of muscle pins you in a vice-grip of flesh - and within seconds, you're part of Fen's bowels.",newline,"Nothing's left but a bit of padding on your predator's hips..."]);
  402. }
  403. }
  404. }
  405. });