| @@ -42,7 +42,10 @@ | |||||
| get disgusting() { return pickRandom(["disgusting", "abhorrent", "rank", "horrific", "nauseating", "sickening", "wretched"]) }, | get disgusting() { return pickRandom(["disgusting", "abhorrent", "rank", "horrific", "nauseating", "sickening", "wretched"]) }, | ||||
| get foul() { return pickRandom(["foul", "rank", "gross"]) }, | get foul() { return pickRandom(["foul", "rank", "gross"]) }, | ||||
| get fatal() { return pickRandom(["fatal", "deadly"]) }, | get fatal() { return pickRandom(["fatal", "deadly"]) }, | ||||
| get painful() { return pickRandom(["painful", "agonizing", "unbearable"]) } | |||||
| get painful() { return pickRandom(["painful", "agonizing", "unbearable"]) }, | |||||
| get wet() { return pickRandom(["wet", "damp", "soaking-wet", "drenched", "soaked"]) }, | |||||
| get hot() { return pickRandom(["hot", "sweltering"]) }, | |||||
| get choking() { return pickRandom(["choking", "suffocating", "unbreathable", "thick", "asphyxiating"]) } | |||||
| } | } | ||||
| function statLerp(stat, change, duration) { | function statLerp(stat, change, duration) { | ||||
| @@ -998,6 +1001,7 @@ | |||||
| func: () => { | func: () => { | ||||
| const choice = Math.random(); | const choice = Math.random(); | ||||
| const bonus = state.player.flags.throatSurrender ? 3 : 1 | |||||
| if (choice < 0.7) { | if (choice < 0.7) { | ||||
| print(["Geta's throat pumps you deeper"]); | print(["Geta's throat pumps you deeper"]); | ||||
| @@ -1006,12 +1010,12 @@ | |||||
| "sfx/gulp-2.ogg", | "sfx/gulp-2.ogg", | ||||
| "sfx/gulp-3.ogg" | "sfx/gulp-3.ogg" | ||||
| ])); | ])); | ||||
| statLerp("throatPos", 0.1, 1250); | |||||
| statLerp("throatPos", bonus*0.1, 1250); | |||||
| return Math.random() * 2000 + 2000; | return Math.random() * 2000 + 2000; | ||||
| } else if (choice < 0.85) { | } else if (choice < 0.85) { | ||||
| if (getStat("throatPos") < 0.4) { | if (getStat("throatPos") < 0.4) { | ||||
| print(["A finger presses in on you from the outside. Your captor is enjoying himself...but at least it slows your descent a little."]); | print(["A finger presses in on you from the outside. Your captor is enjoying himself...but at least it slows your descent a little."]); | ||||
| statLerp("throatPos", 0.05, 2000); | |||||
| statLerp("throatPos", bonus*0.05, 2000); | |||||
| return Math.random() * 4000 + 2000; | return Math.random() * 4000 + 2000; | ||||
| } else { | } else { | ||||
| return Math.random() * 200 + 200; | return Math.random() * 200 + 200; | ||||
| @@ -1020,7 +1024,7 @@ | |||||
| } else { | } else { | ||||
| print(["A crushing swallow grips your body and crams you down deep."]); | print(["A crushing swallow grips your body and crams you down deep."]); | ||||
| playSfx("sfx/big-gulp.ogg"); | playSfx("sfx/big-gulp.ogg"); | ||||
| statLerp("throatPos", 0.3, 1500); | |||||
| statLerp("throatPos", bonus*0.3, 1500); | |||||
| return Math.random() * 2000 + 2000; | return Math.random() * 2000 + 2000; | ||||
| } | } | ||||
| @@ -1264,12 +1268,49 @@ | |||||
| ["A powerful churn grabs hold of you, stifling any attempts at struggling"], | ["A powerful churn grabs hold of you, stifling any attempts at struggling"], | ||||
| ["Your little thumps and kicks do little to faze your captor"] | ["Your little thumps and kicks do little to faze your captor"] | ||||
| ]); | ]); | ||||
| if (Math.random() < 0.05) { | |||||
| print(["Geta slaps his stomach, slamming your head and throwing you back."]); | |||||
| state.player.flags.stunned = true; | |||||
| stopTimer("stomach-stun"); | |||||
| startTimer({ | |||||
| id: "stomach-stun", | |||||
| func: () => { | |||||
| state.player.flags.stunned = false; | |||||
| return false; | |||||
| }, | |||||
| delay: 3000, | |||||
| loop: false, | |||||
| classes: [ | |||||
| "digestion" | |||||
| ] | |||||
| }); | |||||
| } else { | |||||
| state.player.flags.stunned = true; | |||||
| stopTimer("stomach-stun"); | |||||
| startTimer({ | |||||
| id: "stomach-stun", | |||||
| func: () => { | |||||
| state.player.flags.stunned = false; | |||||
| return false; | |||||
| }, | |||||
| delay: 2000, | |||||
| loop: false, | |||||
| classes: [ | |||||
| "digestion" | |||||
| ] | |||||
| }); | |||||
| } | |||||
| }, | }, | ||||
| show: [ | show: [ | ||||
| ], | ], | ||||
| conditions: [ | conditions: [ | ||||
| (room) => { | |||||
| return !state.player.flags.stunned; | |||||
| } | |||||
| ] | ] | ||||
| }, | }, | ||||
| { | { | ||||
| @@ -1287,15 +1328,33 @@ | |||||
| } else { | } else { | ||||
| printRandom([ | printRandom([ | ||||
| ["\"Shhhh,\" growls Geta, \"you're going to die in me. Stop whimpering.\""], | ["\"Shhhh,\" growls Geta, \"you're going to die in me. Stop whimpering.\""], | ||||
| ["A long moment passes. \"Poor thing,\" says your captor."] | |||||
| ["A long moment passes. \"Poor thing,\" says your captor. \"Shouldn't have gotten so nosy, hmm?\""], | |||||
| ["<i>\"No.\"</i>"], | |||||
| ["\"You're going to die in there — and I'm going to enjoy it.\""] | |||||
| ]) | ]) | ||||
| } | } | ||||
| state.player.flags.stunned = true; | |||||
| stopTimer("stomach-stun"); | |||||
| startTimer({ | |||||
| id: "stomach-stun", | |||||
| func: () => { | |||||
| state.player.flags.stunned = false; | |||||
| return false; | |||||
| }, | |||||
| delay: 1000, | |||||
| loop: false, | |||||
| classes: [ | |||||
| "digestion" | |||||
| ] | |||||
| }); | |||||
| }, | }, | ||||
| show: [ | show: [ | ||||
| ], | ], | ||||
| conditions: [ | conditions: [ | ||||
| (room) => { | |||||
| return !state.player.flags.stunned; | |||||
| } | |||||
| ] | ] | ||||
| }, | }, | ||||
| { | { | ||||
| @@ -1314,22 +1373,43 @@ | |||||
| ] | ] | ||||
| ]); | ]); | ||||
| if (Math.random() < 0.5) { | |||||
| if (Math.random() < 0.6) { | |||||
| print(["Geta doesn't notice."]); | print(["Geta doesn't notice."]); | ||||
| } else { | } else { | ||||
| print(["A booming chuckle rocks your body."]); | print(["A booming chuckle rocks your body."]); | ||||
| printRandom([ | printRandom([ | ||||
| ["\"I hope you're suffering in there.\""], | ["\"I hope you're suffering in there.\""], | ||||
| ["\"Pathetic little snack.\""], | ["\"Pathetic little snack.\""], | ||||
| ["\"Ready to die?\""] | |||||
| ["\"Ready to die?\""], | |||||
| ["\"Don't suffocate too soon — I want you to <i>burn</i>.\""], | |||||
| ["\"You get what you deserve.\""], | |||||
| ["\"So weak.\""], | |||||
| ["\"Enjoy your death.\""] | |||||
| ]); | ]); | ||||
| } | } | ||||
| state.player.flags.stunned = true; | |||||
| stopTimer("stomach-stun"); | |||||
| startTimer({ | |||||
| id: "stomach-stun", | |||||
| func: () => { | |||||
| state.player.flags.stunned = false; | |||||
| return false; | |||||
| }, | |||||
| delay: 1500, | |||||
| loop: false, | |||||
| classes: [ | |||||
| "digestion" | |||||
| ] | |||||
| }); | |||||
| }, | }, | ||||
| show: [ | show: [ | ||||
| ], | ], | ||||
| conditions: [ | conditions: [ | ||||
| (room) => { | |||||
| return !state.player.flags.stunned; | |||||
| } | |||||
| ] | ] | ||||
| }, | }, | ||||
| ], | ], | ||||
| @@ -1396,16 +1476,24 @@ | |||||
| func: () => { | func: () => { | ||||
| const result = pickRandom([ | const result = pickRandom([ | ||||
| () => { | () => { | ||||
| print(["The fox kneads on his flattening belly"]); | |||||
| print(["A " + word.foul + " belch pours from Geta's maw."]); | |||||
| statLerp("absorption", 0.05, 1000); | |||||
| }, | |||||
| () => { | |||||
| print(["Powerful muscle grinds down your softening remains."]); | |||||
| statLerp("absorption", 0.1, 1000); | statLerp("absorption", 0.1, 1000); | ||||
| }, | }, | ||||
| () => { | () => { | ||||
| print(["A crass belch pours from Geta's maw"]); | |||||
| statLerp("absorption", 0.05, 1000); | |||||
| print(["The fox kneads on his flattening belly."]); | |||||
| statLerp("absorption", 0.1, 1000); | |||||
| }, | }, | ||||
| () => { | () => { | ||||
| print(["Geta's guts writhe and squeeze, soaking up your digested body and crushing your acid-pitted bones"]); | |||||
| print(["Geta's guts writhe and squeeze, soaking up your digested body and crushing your acid-pitted bones."]); | |||||
| statLerp("absorption", 0.2, 1000); | statLerp("absorption", 0.2, 1000); | ||||
| }, | |||||
| () => { | |||||
| print(["A brutal clench shreds your melting flesh, sealing your fox-fuel fate in seconds."]); | |||||
| statLerp("absorption", 1, 2000); | |||||
| } | } | ||||
| ])(); | ])(); | ||||
| @@ -1469,7 +1557,7 @@ | |||||
| stopTimer("clock"); | stopTimer("clock"); | ||||
| stopClassTimers("absorption"); | stopClassTimers("absorption"); | ||||
| state.player.stats.absorption.hidden = true; | state.player.stats.absorption.hidden = true; | ||||
| print(["Your erasure is completed with a dull, slimy gurgle. Geta has destroyed you."]); | |||||
| print(["Your erasure is completed with a deep, drawn-out gurgle; with flesh stripped from bone and life utterly extinguished, there is room left no doubt: Geta has destroyed you. Perhaps your meager contribution to his body will be remembered...but you won't even take long to burn off."]); | |||||
| }, | }, | ||||
| "exit": (room) => { | "exit": (room) => { | ||||