UNPKG

decixion

Version:

Engine for simple text/decision-based games.

8 lines 7.81 kB
/** * Decixion Engine * * Version: 0.5.0 * MIT License * Copyright (c) 2020 Edgar Alexander Franco */ var decixion={VERSION:"0.5.0",IS_MODULE:!1,_game:null,_players:{},_state:{},_rangeMin:0,_rangeMax:100,_currentSection:null,_countdown:0,_countdownInterval:null,_sounds:{},_textEl:null,_countdownEl:null,_selectEl:null,_buttonEl:null,init:function(n){decixion._game=n,decixion._initPlayers(n),decixion._initState(n),decixion._initKeys(n),decixion._initSounds(n),decixion._initGame(n),decixion.select()},setRangeMin:function(n){decixion._rangeMin=n},setRangeMax:function(n){decixion._rangeMax=n},text:function(){return decixion._currentSection.text},countdown:function(){return decixion._countdown},options:function(){var n,e=[],i=decixion._currentSection.options,o=i.length;for(n=0;n<o;n++)e.push(i[n].text);return e},get:function(n,e){return e?decixion._players[e]?decixion._getObjectChain(decixion._players[e],n):void 0:decixion._getObjectChain(decixion._state,n)},set:function(n,e,i){return i?(decixion._players[i]||(decixion._players[i]={}),decixion._setObjectChain(decixion._players[i],n,e)):decixion._setObjectChain(decixion._state,n,e),e},increase:function(n,e,i,o){o=o||decixion._rangeMax;var t=decixion.get(n,i)+e;return o<t&&(t=o),decixion.set(n,t,i),t},decrease:function(n,e,i,o){o=o||decixion._rangeMin;var t=decixion.get(n,i)-e;return t<o&&(t=o),decixion.set(n,t,i),t},select:function(n){var e=decixion._game;if(!decixion._currentSection)return decixion._goToSection(e.entrySection),!0;var i=decixion._currentSection;if(!i.options)return!1;n<0?n=0:n>=i.options.length&&(n=i.options.length-1);var o=i.options[n];return!!o.section&&(decixion._clearCountdownInterval(),decixion._goToSection(o.section),!0)},call:function(n,e){var i=e||{};return decixion._getObjectChain(decixion._game.functions,n)(decixion,i)},each:function(n,e){if(Array.isArray(n)){var i,o=n.length;for(i=0;i<o&&!1!==e(i,n[i]);i++);}else{var t;for(t in n)if(!1===e(t,n[t]))break}},bindkeys:function(){decixion.IS_MODULE||(decixion.unbindkeys(),window.addEventListener("keyup",decixion._onKeyUp,!1))},unbindkeys:function(){decixion.IS_MODULE||window.removeEventListener("keyup",decixion._onKeyUp,!1)},bindtext:function(n){decixion._textEl=n,decixion._textEl.innerText=decixion.text()},unbindtext:function(){decixion._textEl=null},bindcountdown:function(n){decixion._countdownEl=n,0<decixion._countdown?decixion._countdownEl.innerText=decixion.countdown():decixion._countdownEl.innerText=""},unbindcountdown:function(){decixion._countdownEl=null},bindselect:function(n){decixion.unbindselect();var e=decixion._currentSection;decixion._selectEl=n,e&&e.options&&decixion._updateSelectElOptions(e.options),decixion._selectEl.addEventListener("change",decixion._onSelectElChange,!1)},unbindselect:function(){decixion._selectEl&&decixion._selectEl.removeEventListener("change",decixion._onSelectElChange,!1),decixion._selectEl=null},bindbutton:function(n){decixion.unbindbutton(),decixion._buttonEl=n,decixion._buttonEl.addEventListener("click",decixion._onButtonElClick,!1)},unbindbutton:function(){decixion._buttonEl&&decixion._buttonEl.removeEventListener("click",decixion._onButtonElClick,!1),decixion._buttonEl=null},_initPlayers:function(n){"object"==typeof n.players&&decixion._setRecursiveValues(decixion._players,n.players)},_initState:function(n){"object"==typeof n.state&&decixion._setRecursiveValues(decixion._state,n.state)},_initKeys:function(n){!1!==n.bindKeys&&decixion.bindkeys()},_initSounds:function(n){if("object"==typeof n.sounds&&!decixion.IS_MODULE){var e=new Audio,d=e.canPlayType("audio/mp3"),u=e.canPlayType("audio/ogg");decixion.each(n.sounds,function(n,e){Array.isArray(e)||(e=[e]);var i="",o="";if(decixion.each(e,function(n,e){-1!==e.indexOf(".mp3")&&(i=e),-1!==e.indexOf(".ogg")&&(o=e)}),""!=i||""!=o){var t=null;if("probably"==d&&""!=i?t=i:"probably"==u&&""!=o?t=o:"maybe"==d&&""!=i?t=i:"maybe"==u&&""!=o||""!=o?t=o:""!=i&&(t=i),t){decixion._sounds[n]={loaded:!1};var c=new Audio(t);c.setAttribute("data-dcx-sound-name",n),c.oncanplay=decixion._onSoundCanPlay,c.oncanplaythrough=decixion._onSoundCanPlay,c.load(),decixion._sounds[n].audio=c}}})}},_initGame:function(n){"function"==typeof n.init&&n.init(decixion)},_getObjectChain:function(n,e){var i,o=e.split("."),t=o.length;for(i=0;i<t;i++){if(void 0===n[o[i]])return;n=n[o[i]]}return n},_setObjectChain:function(n,e,i){var o,t=e.split("."),c=t.length,d=c-1;for(o=0;o<c;o++)o==d?n[t[o]]=i:("object"!=typeof n[t[o]]&&(n[t[o]]={}),n=n[t[o]]);return i},_setRecursiveValues:function(n,e){var i,o,t,c,d=Array.isArray(e);for(i in e)o=e[i],(t=Array.isArray(o))||"object"==typeof o?(c=t?[]:{},decixion._setRecursiveValues(c,o),d?n.push(c):n[i]=c):d?n.push(o):n[i]=o},_goToSection:function(n){var e=decixion._game;decixion._currentSection=decixion._getObjectChain(e.sections,decixion._evaluateGameValue(n));var i=decixion._currentSection;if(i.countdown){var o=i.countdown.section;decixion._countdown=i.countdown.time,decixion._countdownEl&&(decixion._countdownEl.innerText=decixion._countdown),decixion._countdownInterval=setInterval(function(){0==decixion._countdown?(clearInterval(decixion._countdownInterval),decixion._countdownInterval=null,decixion._countdownEl&&(decixion._countdownEl.innerText=""),decixion._goToSection(o),decixion._updateEls()):(decixion._countdown--,decixion._countdownEl&&(decixion._countdownEl.innerText=decixion._countdown))},1e3)}if(i.set&&decixion._evaluateStateValue(i.set,function(n){decixion.set(n.name,decixion._evaluateGameValue(n.value),n.player)}),i.increase&&decixion._evaluateStateValue(i.increase,function(n){decixion.increase(n.name,decixion._evaluateGameValue(n.value),n.player)}),i.decrease&&decixion._evaluateStateValue(i.decrease,function(n){decixion.decrease(n.name,decixion._evaluateGameValue(n.value),n.player)}),i.enter&&decixion._evaluateGameValue(i.enter),i.sound){var t={},c=i.sound;Array.isArray(c)||(c=[c]),decixion.each(c,function(n,e){var i=decixion._evaluateGameValue(e);decixion.IS_MODULE||i&&void 0===t[i]&&void 0!==decixion._sounds[i]&&decixion._sounds[i].loaded&&(decixion._sounds[i].audio.paused||(decixion._sounds[i].audio.pause(),decixion._sounds[i].audio.currentTime=0),decixion._sounds[i].audio.play(),t[i]=!0)})}decixion._updateEls()},_updateEls:function(){decixion._textEl&&(decixion._textEl.innerText=decixion.text());var n=decixion._currentSection;decixion._selectEl&&(n.options?decixion._updateSelectElOptions(n.options):decixion._updateSelectElOptions([]))},_updateSelectElOptions:function(n){if(!decixion._selectEl)return null;var e,i,o=decixion._selectEl.length;for(e=o-1;0<=e;e--)decixion._selectEl.remove(e);for(o=n.length,e=0;e<o;e++)(i=document.createElement("option")).text=n[e].text,i.value=e,decixion._selectEl.appendChild(i);return decixion._selectEl},_evaluateStateValue:function(n,i){Array.isArray(n)||(n=[n]),decixion.each(n,function(n,e){i(e)})},_evaluateGameValue:function(n){if("function"==typeof n)return n(decixion);if(n.call){var e=n.args?n.args:{};return decixion.call(n.call,e)}return n},_clearCountdownInterval:function(){decixion._countdownInterval&&(clearInterval(decixion._countdownInterval),decixion._countdownInterval=null,decixion._countdown=0,decixion._countdownEl&&(decixion._countdownEl.innerText=""))},_onKeyUp:function(n){void 0!==["0","1","2","3","4","5","6","7","8","9"][n.key]?decixion.select(n.key-1):"Enter"==n.key&&decixion.select(0)},_onSoundCanPlay:function(n){var e=this.getAttribute("data-dcx-sound-name");decixion._sounds[e].loaded=!0},_onSelectElChange:function(n){decixion._selectEl&&decixion.select(decixion._selectEl.selectedIndex)},_onButtonElClick:function(n){decixion._selectEl&&decixion.select(decixion._selectEl.selectedIndex)}},dcx=decixion;decixion.IS_MODULE="undefined"!=typeof module,decixion.IS_MODULE&&(module.exports=decixion);