diff --git a/game/03-JavaScript/ingame.js b/game/03-JavaScript/ingame.js index 96bcd76e78649781f1de35f34861759cacdeb825..460a7246d31bd13fa6b7a3dffd2ac225f379c1e6 100644 --- a/game/03-JavaScript/ingame.js +++ b/game/03-JavaScript/ingame.js @@ -1931,3 +1931,30 @@ function beastMaleChance(override){ return 50; } window.beastMaleChance = beastMaleChance; + +/** + * Event listener for the 'beforeunload' event. Will prompt a dialog box asking the player if he wants to leave. + * + * @param {object} event 'beforeunload' event + * @returns {void} + */ +function onBrowserTabClose(event) { + event.preventDefault(); + event.returnValue = 'Are you sure you want to leave?'; // the string here isn't important, it's mostly not considered by the browser. +} + +/** + * Enable or disable the confirm dialog based on V.options.confirmDialogUponTabClose value evaluating to true or not + * + * @returns {void} + */ +function toggleConfirmDialogUponTabClose(){ + if (V.options.confirmDialogUponTabClose === true) { + window.addEventListener('beforeunload', onBrowserTabClose); + } + else if (V.options.confirmDialogUponTabClose === false) { + window.removeEventListener('beforeunload', onBrowserTabClose); + } +} + +window.toggleConfirmDialogUponTabClose = toggleConfirmDialogUponTabClose; diff --git a/game/04-Variables/variables-passageHeader.twee b/game/04-Variables/variables-passageHeader.twee index 37aebc8f9f238e58636cfe6d7b35ac3643df6d61..9bffc36b694a804cd4755f230219951f63022a0a 100644 --- a/game/04-Variables/variables-passageHeader.twee +++ b/game/04-Variables/variables-passageHeader.twee @@ -44,6 +44,7 @@ <<run syncFavourites()>> <<run initCustomLenses()>> /* push custom eyelenses inside setup.colours.eyes; on every load/refresh it needs to be done. */ <<run syncDebugAddedEvents()>> + <<run toggleConfirmDialogUponTabClose()>> /* enable/disable confirm dialog when user tries to close browser tab. based on V.options.confirmDialogUponTabClose */ <</if>> /* Variables that you need to check on every passage */ diff --git a/game/04-Variables/variables-start2.twee b/game/04-Variables/variables-start2.twee index 81a3d57fdebcd001d4e4d8622079a403f741ac0f..f413fcff0b187d55c2a8b042df1fd68502e5f473 100644 --- a/game/04-Variables/variables-start2.twee +++ b/game/04-Variables/variables-start2.twee @@ -356,4 +356,11 @@ <<applyFeatsBoost>> <</if>> + <<if $ironmanmode is true>> + <<set $options.confirmDialogUponTabClose to true>> + <<else>> + <<set $options.confirmDialogUponTabClose to false>> + <</if>> + <<run toggleConfirmDialogUponTabClose()>> + <</widget>> diff --git a/game/04-Variables/variables-versionUpdate.twee b/game/04-Variables/variables-versionUpdate.twee index d6bef3e47faa45441f56abb756db74ba89f64a98..59335288cddb57910a2745e9cb89a99aca7862f9 100644 --- a/game/04-Variables/variables-versionUpdate.twee +++ b/game/04-Variables/variables-versionUpdate.twee @@ -4518,4 +4518,13 @@ <<if $speech_attitude is undefined>> <<set $speech_attitude to "neutral">> <</if>> + + <!-- V0.4.1.7 Set V.options.confirmDialogUponTabClose for the new confirm dialog box prompting when user closes/refresh tab --> + <<if $options.confirmDialogUponTabClose is undefined>> + <<if $ironmanmode is true>> + <<set $options.confirmDialogUponTabClose to true>> + <<else>> + <<set $options.confirmDialogUponTabClose to false>> + <</if>> + <</if>> <</widget>> diff --git a/game/base-system/overlays/options.twee b/game/base-system/overlays/options.twee index 5fae5a70d5fd57c2359655fd729a9437c52b27df..e7177f9c4163d06a80a7051743e53c64d3e46762 100644 --- a/game/base-system/overlays/options.twee +++ b/game/base-system/overlays/options.twee @@ -488,6 +488,12 @@ IMPORTANT: .prependTo("#idbToggle"))>> Enable indexedDB </label> </div> + <div class="settingsToggle"> + <label onclick="setTimeout(() => {toggleConfirmDialogUponTabClose();}, 100)"> + <<checkbox "$options.confirmDialogUponTabClose" false true autocheck>> + Prompt confirmation dialog upon closing tab + </label> + </div> <div style="clear:both;">/*Keep at end of toggles*/</div> </div> <br>